GPIO是General Purpose I/O的縮寫,即通用輸入輸出端口,簡單來說就是MCU/CPU可控制的引腳, 這些引腳通常有多種功能,最基本的是高低電平輸入檢測和輸出,部分引腳還會與主控器的片上外設綁定, 如作為串口、I2C、網絡、電壓檢測的通訊引腳。
Linux提供了GPIO子系統驅動框架,使用該驅動框架即可靈活地控制板子上的GPIO。
2.1.?GPIO命名
Rockchip Pin的ID按照 控制器(bank)+端口(port)+索引序號(pin) 組成。
-
控制器和GPIO控制器數量?致
-
端口固定 A、B、C和D,每個端口僅有8個索引號,(a=0,b=1,c=2,d=3)
-
索引序號固定 0、1、2、3、4、5、6、7
rk3588具有5個GPIO控制器,每個控制器可以控制32個IO,作為GPIO功能時,端口?為由GPIO控制器寄存器配置。
GPIO1_C4表達的意思為第1組控制器,端口號為C,索引號為4。該引腳號的計算公式為32 x 1 + 2 x 8 + 4 = 52
部分板卡除了主控芯片原生IO,也有使用i2c擴展gpio,例如魯班貓5,使用兩顆XL9535芯片,每個擴展芯片可以擴展16路gpio,使用與原生gpio無異。
2.2.?使用GPIO sysfs接口控制IO
在Linux中,最常見的讀寫GPIO方式就是用GPIO sysfs interface, 是通過操作?/sys/class/gpio?目錄下的?export?、?unexport?、gpio{N}/direction,?gpio{N} /value?(用實際引腳號替代{N})等文件實現的,經常出現shell腳本里面。 在kernel 4.8開始,加入了libgpiod的支持;而原有基于sysfs的訪問方式,將被逐漸放棄。
引腳 | 控制器 | 端口號 | 索引號 | 計算結果 |
---|---|---|---|---|
GPIO1_C4 | 1 | C | 4 | 52 (32 x 1 + 8 x 2 + 4) |
GPIO3_B2 | 3 | B | 2 | 106 (32 x 3 + 8 x 1 + 2) |
GPIO0_D6 | 0 | D | 6 | 30 (32 x 0 + 8 x 3 + 6) |
123456789 10 11 12 13 14 15 16 17 18 | #以下所有操作均需要打開管理者權限使用 #使能引腳GPIO1_C4 echo 52 > /sys/class/gpio/export#設置引腳為輸入模式 echo in > /sys/class/gpio/gpio52/direction #讀取引腳的值 cat /sys/class/gpio/gpio52/value#設置引腳為輸出模式 echo out > /sys/class/gpio/gpio52/direction #設置引腳為低電平 echo 0 > /sys/class/gpio/gpio52/value #設置引腳為高電平 echo 1 > /sys/class/gpio/gpio52/value#復位引腳 echo 52 > /sys/class/gpio/unexport |
2.3.?使用libgpiod控制IO
libgpiod是一種字符設備接口,GPIO訪問控制是通過操作字符設備文件(比如?/dev/gpiodchip0?)實現的, 并通過libgpiod提供一些命令工具、c庫以及python封裝。
1 2 | #安裝gpiod 命令行工具 sudo apt install gpiod |
-
gpiod工具的使用方法與sysfs接口的不同,gpiod是以控制器為單位,然后再詳細到端口號和索引號,即gpiod使用兩個數據確定引腳
引腳 | 控制器 | 端口號 | 索引號 | gpiod的使用結果 |
---|---|---|---|---|
GPIO1_C4 | 1 | C | 4 | 1 20(8 x 2 + 4) |
GPIO3_B2 | 3 | B | 2 | 3 10(8 x 1 + 2) |
GPIO0_D6 | 0 | D | 6 | 0 30(8 x 3 + 6) |
常用的命令行如下,可使用?-h?查看命令相對應的使用說明(以GPIO1_C4為例)
命令 | 作用 | 使用舉例 | 說明 |
---|---|---|---|
gpiodetect | 列出所有的GPIO控制器 | gpiodetect(無參數) | 列出所有的GPIO控制器 |
gpioinfo | 列出gpio控制器的引腳情況 | gpioinfo 1 | 列出第一組控制器引腳組情況 |
gpioset | 設置gpio | gpioset 1 20=0 | 設置第一組控制器編號20引腳為低電平 |
gpioget | 獲取gpio引腳狀態 | gpioget 1 20 | 獲取第一組控制器編號20的引腳狀態 |
gpiomon | 監控gpio的狀態 | gpiomon 1 20 | 監控第一組控制器編號20的引腳狀態 |
重要
Rockchip Pin的ID按照 控制器(bank)+端口(port)+索引序號(pin) 組成。其中端口號和索引號會合并成一個數值傳入到gpiod里去 并不是所有的引腳都能夠使用libgpiod控制,例如led之類的一些已經被使用的引腳。當使用這些被定義的引腳就會出現,設備繁忙,進而無法使用
2.4.?FAQs
Q1:當使用GPIO時出現?gpioset:?error?setting?the?GPIO?line?values:?Device?or?resource?busy
?或者?-bash:?echo:?寫錯誤:?設備或資源忙
A1:說明GPIO被占用了,占用的原因可能是設備樹里把該引腳作為gpio或者其他復用功能被使用了。
Next??Previous