Linux 內核GPIO的學習

GPIO是嵌入式開發中最常見的接口,之前自己就有寫過小的GPIO驅動,提供ioctl接口給用戶空間操作。但直到最近才發現Linux自身就有完善的GPIO驅動框架,並且通過sysfs向用戶空間提供操作接口。

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。

發佈了23 篇原創文章 · 獲贊 14 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章