1. 程式人生 > >linux操作GPIO通用sysfs方法

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