linux操作GPIO通用sysfs方法
查詢/sys/class/gpio目錄,如果沒有,則在編譯核心時,加入Device Drivers->GPIO Support->/sys/class/gpio/...(sysfs interface)。
linux2.6及以上的核心可以使用系統中的GPIOLIB模組在使用者空間提供的sysfs介面,實現應用層對GPIO的獨立控制。
Linux開發平臺實現了通用GPIO的驅動,使用者通過Shell命令或系統呼叫即能控制GPIO的輸出和讀取輸入值。其屬性檔案均在/sys/class/gpio目錄下,如:
#ls /sys/class/gpio/ export gpiochip0 gpiochip32 gpiochip64 gpiochip96 unexport
屬性檔案有export和unexport。其餘四個檔案為符號連結(gpiochip0,gpiochip32,gpiochip64,gpiochip96),指向管理對應裝置的目錄,以gpiochip0為例,此目錄下檔案有:
#ls /sys/class/gpio/gpiochip0
base label ngpio power subsystem uevent
以上檔案用途如表所示。
檔名 | 路徑 | 作用 |
export | /sys/class/gpio/export | 匯出GPIO |
unexport | /sys/class/gpio/unexport | 將匯出的GPIO從sysfs中清除 |
gpiochipN | /sys/class/gpio/gpiochipN/base | 裝置所管理的GPIO初始編號 |
/sys/class/gpio/gpiochipN/label | 裝置資訊 | |
/sys/class/gpio/gpiochipN/ngpio | 裝置所管理的GPIO總數 | |
/sys/class/gpio/gpiochipN/power | 裝置供電方面的相關資訊 | |
/sys/class/gpio/gpiochipN/subsystem | 符號連結,指向父目錄 | |
/sys/class/gpio/gpiochipN/uevent | 核心與udev(自動裝置發現程式)之間的通訊介面 |
向export檔案寫入需要操作的GPIO排列序號N,就可以匯出對應的GPIO裝置目錄:
操作命令如下:
#echo N > /sys/class/gpio/export
例如,匯出序號為68的GPIO的操作介面,在Shell下,可以用如下命令:
#echo 68 > /sys/class/gpio/export
通過以上操作後,在/sys/class/gpio目錄下生成gpioN目錄,通過讀寫該目錄下的屬性檔案就可以操作這個GPIO的輸入和輸出。以此類推可以匯出其它GPIO裝置目錄。如果GPIO已經被系統佔用,匯出時候會提示資源佔用。
以排列序號為68的GPIO為例,裝置目錄下有如下屬性檔案:
#ls /sys/class/gpio/gpio68/
active_low edge subsystem value direction power uevent
各個檔案用途如下表。
檔名 | 路徑 | 作用 |
active_low | /sys/class/gpio/gpioN/active_low | 具有讀寫屬性。用於決定value中的值是否翻轉。0不翻轉,1翻轉。 |
edge | /sys/class/gpio/gpioN/edge | 具有讀寫屬性。裝置GPIO中斷,或檢測中斷是否發生。 |
subsystem | /sys/class/gpio/gpioN/subsystem | 符號連結,指向父目錄。 |
value | /sys/class/gpio/gpioN/value | 具有讀寫屬性。GPIO的電平狀態設定或讀取。 |
direction | /sys/class/gpio/gpioN/direction | 具有讀寫屬性。用於檢視或設定GPIO輸入輸出 |
uevent | /sys/class/gpio/gpioN/uevent | 核心與udev(自動裝置發現程式)之間的通訊介面 |
GPIO基本操作
在應用層我們可以通過Shell命令操作GPIO。通過以下步驟,就可以控制GPIO輸入輸出。下面步驟是以GPIO的輸入輸出功能進行介紹。
1.輸入輸出設定
GPIO匯出後預設為輸入功能。向direction檔案寫入“in”字串,表示設定為輸入功能;向directon檔案寫入“out”字串,表示設定為輸出功能。讀direction檔案,會返回in/out字串,in表示當前GPIO作為輸入,out表示當前GPIO作為輸出。方向檢視和設定命令如下:
#cat /sys/class/gpio/gpioN/direction #檢視方向
#echo out > /sys/class/gpio/gpioN/direction #設定為輸出
#echo in > /sys/class/gpio/gpioN/direction #設定為輸入
未完..........
參考ZLG