GPIO 是比較常用的資源,比如說控制 LED 燈亮滅,控制 LCD 上電,控制模塊的復位電路,做外設的中斷腳等等,這些都有對 GPIO 的操作和使用,所以說,GPIO 開發是驅動開發中必不可少的操作,而且也是最基礎的東西。我們在驅動開發過程中,有時候我們不能確定自己使用和申請的 gpio 是否對了,我們可以把它對應的數值給打印出來,通過對比對應的數值可以確定我們具體使用的是哪個數值,輸入以下命令: cat /d/pinctrl/pinctrl/pinmux-pins cat /sys/kernel/debug/gpio 在 Linux 系統中,GPIO 子系統大致分為三層,分別是 GPIO 硬件層,GPIO 硬件驅動層,抽象的驅動框架。 ![]() ![]() 應用層控制 GPIO 內核已經自帶了通用 GPIO 驅動,可以直接在用戶空間進行操作,iTOP-3399 開發板燒寫 Linux 系統,啟動后可以進入到/sys/class/gpio 目錄下進行查看 GPIO 的相關信息,如下圖所示: ![]() /sys/class/gpio/sys/class/gpio/export 用于通知系統需要導出控制的 GPIO 引腳編號/sys/class/gpio/unexport 用于通知系統取消導出。export 和 unexport,他們都是只寫的。 /sys/class/gpio/gpiochipX 目錄下保存系統中 GPIO 寄存器的信息,包括每個寄存器控制引腳的起始編號base,寄存器名稱,引腳總數。比如我們進入到 gpiochip128,如下圖所示: ![]() 導出一個引腳的步驟: 1 計算此引腳編號,引腳編號=控制寄存器的寄存器基數+控制引腳寄存器位數。在 rk3399 中,GPIO_number的計算方法為:n*32 + (K-A)*8 + x; 比如 GPIO1_B1 = 1 * 32 + (B-A)*8 + 1 = 32 + 8 + 1 = 41; GPIO1_B2 = 1 * 32 + (B-A)*8 + 2 = 32 + 8 + 2 = 42; GPIO0_A3= 0 * 32 + (A-A)*8 + 3 = 0 + 0 + 3 = 3 括號里面的 A、B、C、D 分別代表數值 0、1、2、3,在計算時候分別對應即可。 2 向/sys/class/gpio/export 寫入此編號,比如引腳編號是 3,在 shell 中可以通過以下命令實現,命令成功后生成/sys/class/gpio/gpio3 目錄,如果沒有出現相應的目錄,說明此引腳不可導出: echo 3 > /sys/class/gpio/export 如果在執行第一步的時候即 echo 3 > /sys/class/gpio/export 時出現了以下問題: sh: write error: Device or resource busy 出現這個問題的原因是你將要使用的這個 gpio 口之前已經申請過了,包括內核申請或者使用上述方法申請過。unexport:釋放相應的 GPIO,相應的節點會被刪掉,如下所示: echo 3 > /sys/class/gpio/unexport 3 direction 文件,定義輸入輸出方向,可以通過下面的命令定義為輸出,如下圖所示: ![]() 注意:direction 接受的參數:in(輸入), out(輸出), high, low。high/low 同時設置方向為輸出,并將 value設置為相應的 1(高電平)或 0(低電平)。 4 edge 文件可以監聽對應引腳的事件,需要把 direction 設置為輸入。參數可設置為”none”(無中斷觸發), “rising”(上升沿觸發), “falling”(下降沿觸發),“both”(上升、下降都沿觸發)。 5 active_low:此值可以反轉 value 中的值。 |