一、前言
在嵌入式中,GPIO作為一個常用的信息輸入輸出手段經(jīng)常被用在各種場合,那么今天本文就來簡單地說一下嵌入式linux中的GPIO子系統(tǒng)。本文為筆者的理解,如果錯漏還望指出
二、GPIO子系統(tǒng)介紹
在嵌入式linux中,GPIO 和 引腳 通常聯(lián)系在一起。但是在嵌入式linux系統(tǒng)的代碼結(jié)構(gòu)中,他們的關(guān)系遠比我們想象的復(fù)雜。
2.1 pinctrl
在嵌入式linux中,用 pin control subsystem 來對一款芯片的引腳進行管理,我們經(jīng)常在設(shè)備樹中看到 pinctrl 這樣的節(jié)點,其實就是 引腳控制子系統(tǒng) 驅(qū)動的設(shè)備樹節(jié)點。該子系統(tǒng)的幫助各個驅(qū)動設(shè)備管理引腳,包括 引腳功能復(fù)用(pin multiplexing) 、引腳配置(pin configuration)(如輸出電平及上下拉電阻) 等。所以其他的設(shè)備驅(qū)動在調(diào)用 pin control subsystem 提供的接口來對本驅(qū)動所需要的引腳進行相關(guān)功能的配置。
各個設(shè)備如果需要復(fù)用引腳,則在設(shè)備樹的 pinctrl 對各個設(shè)備的引腳進行配置,將這些配置作為 pinctrl 的子節(jié)點,然后設(shè)備驅(qū)動在自己的設(shè)備樹節(jié)點中引腳這些配置節(jié)點
一般 ARM soc 的數(shù)據(jù)手冊會把 pin controller 的內(nèi)容放入 GPIO controller 的章節(jié)中,各個設(shè)備可以通過自己節(jié)點的屬性來指向 pinctrl 的某個子節(jié)點,也就是 pin configuration 來獲取相應(yīng)的引腳配置
2.1 GPIO子系統(tǒng)
GPIO子系統(tǒng) 相對于 pin control subsystem 來說是更加上層的子系統(tǒng),它將 引腳 配置為 GPIO 并且控制其輸入輸出,所以從這方面來看,GPIO 和 引腳 在系統(tǒng)軟件層面并不是一個概念
三、GPIO子系統(tǒng)使用
3.1 應(yīng)用使用方法
應(yīng)用層的使用放到相對簡單,可以直接通過 sysfs 來操作 GPIO口
- 使用命令
echo num > /sys/class/gpio/export導(dǎo)出 GPIO口,其中 num 是 GPIO口 的編號 - 導(dǎo)出后會生成節(jié)點 /sys/class/gpio/gpioN
- 通過讀寫(比如使用 echo 或 cat 等工具)生成的節(jié)點來獲取 GPIO口 的信息及狀態(tài)
3.2 驅(qū)動使用方法
3.2.1 獲取設(shè)備樹信息
獲取 GPIO口 信息的設(shè)備樹接口 在of_gpio.h,這里不做詳細講解,讀者們可以直接通過接口函數(shù)的命名來熟悉使用方法
另外,關(guān)于 GPIO口 設(shè)備樹節(jié)點的屬性命名方式是一般為 name-gpios , 其中 name 通常用于指該 GPIO口在設(shè)備里的具體用途。比如用于復(fù)位,則屬性可以命名為 reset-gpios,舉例在設(shè)備樹中表示為 reset-gpios = <&gpio1 15 1>。在驅(qū)動中使用 of_get_named_gpi函數(shù) 返回值來得到對應(yīng)的 GPIO號
3.2.2 接口說明
int gpio_request(unsigned gpio, const char *label)
- 作用:申請GPIO
- 參數(shù)分析:
- unsigned gpio:gpio端口號
- const char *label:給該gpio端口起的名字
- 返回值:
- 成功返回0
- 失敗返回負數(shù)的錯誤碼
int gpio_direction_output(unsigned gpio, int value)
- 作用:GPIO的初始化為輸出,并設(shè)置輸出電平:
- 參數(shù)分析:
- unsigned gpio:gpio端口號
- int value:輸出值
int gpio_direction_input(unsigned gpio)
- 作用:初始化為輸入
- 參數(shù)分析:
- unsigned gpio:gpio端口號
void gpio_set_value(unsigned gpio, int value)
- 作用:GPIO的輸出電平設(shè)置:
- 參數(shù)分析:
- unsigned gpio:gpio端口號
- int value:輸出值
int gpio_get_value(unsigned gpio)
- 作用:得到GPIO的電平
- 參數(shù)分析:
- unsigned gpio:gpio端口號
void gpio_free(unsigned gpio)
- 作用:釋放GPIO
- 參數(shù)分析:
- unsigned gpio:gpio端口號
int gpio_to_irq(unsigned gpio)
- 作用:申請GPIO口中斷,返回的值即中斷編號可以傳給request_irq()和free_irq()
- 參數(shù)分析:
- unsigned gpio:gpio端口號
int gpio_export(unsigned gpio, bool direction_may_change)
內(nèi)核可以對已經(jīng)被gpio_request()申請的gpio端口的導(dǎo)出進行明確的管理,
- 參數(shù)分析:
- unsigned gpio:gpio端口號
- direction_may_change:表示用戶程序是否允許修改gpio的方向,假如可以則參數(shù)direction_may_change為真
void gpio_unexport(unsigned gpio)
- 作用:撤銷GPIO的導(dǎo)出
- 參數(shù)分析:
- unsigned gpio:gpio端口號
四、參考鏈接
應(yīng)用層使用GPIO:https://blog.csdn.net/mirkerson/article/details/8464290
gpio_direction_output 和 gpio_set_value之間的使用關(guān)系https://blog.csdn.net/zhaoqi2617/article/details/53082813