Linux的GPIO驅動框架層次及數據結構如下:最上層是用來向向用戶空間提供接口,用戶可以通過該接口方去控制GPIO
PIN腳。GPIO通用接口層主要是維護了一個GPIO PIN的數組gpio_desc[ARCH_NR_GPIOS],每註冊一個GPIO控制器,該控制器上所有的PIN都會添加到這個全局數組裏面,這樣就有了一個統一的GPIO管理接口。GPIO硬件抽象層主要是對GPIO控制器的描述,內核裏面用了一個gpio_chip的結構體來描述一個GPIO控制器,結構體裏面定義了GPIO操作的函數集。硬件部分跟具體的硬件平臺相關,都會提供特定的寄存器組來控制GPIO口。
要想通過/sys/class/gpio操作GPIO口,需要在編譯內核的時候打開CONFIG_GPIO_SYSFS標誌,系統起來之後就可以在/sys下面看到對應的目錄。以手上的項目爲例:
sh-3.2# ls /sys/class/gpio/
export gpiochip0 unexport
可以看到在/sys/class/gpio/目錄下面有兩個文件和一個目錄,目錄gpiochip0表示當前有註冊一個GPIO控制器,文件export是用來把某個GPIO PIN導出到用戶空間,而unexport起相反的作用。比如用以下命令把GPIO-35導出到用戶空間,
sh-3.2# echo 35 > export
sh-3.2# ls
export gpio35 gpiochip0 unexport
sh-3.2# ls gpio35/
active_low direction edge subsystem uevent value
在/sys/class/gpio目錄下多了個gpio35的目錄,該目錄裏面的文件就是用來對改GPIO PIN進行設置的,direction是用來設置GPIO的方向,GPIO設成output時可以通過value來設定high/low,當GPIO PIN被用來做中斷線時,可以利用edge設置中斷觸發的方式。
sh-3.2# cat gpio35/direction
in
sh-3.2# cat gpio35/value
1
sh-3.2# cat gpio35/edge
none
從上面的log看出,GPIO-35目前是input PIN,值爲1。