查詢 GPIO pin 的方向及值
在開發 linux 的過程中,總是會需要知道某些 gpio pin 當下的狀態,如方向(direction) 及 值(value)。
而查詢的方法已有一套固定的流程,如下:
1、將要查詢的 gpio pin 加到 export 的行列中,例如加入 gpio pin 39 的指令為:
# echo 39 > /sys/class/gpio/export
2-1、如果第 1 個步驟有執行成功,則可以執行以下指令來查詢 gpio pin 39 此時的方向及電壓值:
# cat /sys/class/gpio/gpio39/direction
in
# cat /sys/class/gpio/gpio39/value
1
2-2、如果第 1 個步驟沒有執行成功,kernel 拋出錯誤,例如:
# echo 21 > /sys/class/gpio/export
-sh: echo: write error: Device or resource busy
這表示此 GPIO 正被某個程式所占用(一般來說是被 driver 所佔用),因此沒辦法申請這個 GPIO 來使用。
解決這個問題的方法,可以找出是哪個 driver 在執行 gpio_request() 後,沒有做 gpio_free(),並視情況補上 gpio_free()。
如果要查詢系統當下有哪些 GPIO pin 已被佔用,可以執行以下指令:
# cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 0-31, parent: platform/fd8a0000.gpio, gpio0:
gpio-0 ( |bt_default_wake_host) in lo
gpio-4 ( |reset ) out lo ACTIVE LOW
gpio-21 ( |Reset_Pin ) out hi
gpiochip1: GPIOs 32-63, parent: platform/fec20000.gpio, gpio1:
gpio-41 ( |bt_default_wake ) in hi
gpio-42 ( |bt_default_reset ) out lo
gpio-52 ( |hp-det ) in hi ACTIVE LOW
gpio-61 ( |hdmirx-det ) in lo ACTIVE LOW
gpiochip2: GPIOs 64-95, parent: platform/fec30000.gpio, gpio2:
gpio-81 ( |vcc3v3-lvds-lcd0-n ) out hi
gpio-85 ( |vcc3v3-pcie30 ) out hi
gpiochip3: GPIOs 96-127, parent: platform/fec40000.gpio, gpio3:
gpio-102 ( |vcc3v3-lcd0-n ) out hi
gpio-106 ( |enable ) out hi
gpio-111 ( |snps,reset ) out hi ACTIVE LOW
gpio-113 ( |Reset_Pin ) out hi
gpio-121 ( |reset ) out hi
gpio-124 ( |vcc3v3-au5426 ) out hi
gpio-125 ( |sbu1-dc ) out lo
gpiochip4: GPIOs 128-159, parent: platform/fec50000.gpio, gpio4:
gpio-129 ( |vbus5v0-typec ) out lo
gpio-131 ( |spk-con ) out lo
gpio-132 ( |hp-con ) out lo
gpio-133 ( |gpio_wlan_pen ) out lo
gpio-137 ( |enable ) out hi
gpio-138 ( |enable ) out hi
gpio-146 ( |reset ) out hi ACTIVE LOW
gpio-148 ( |bt_default_rts ) in hi
gpio-152 ( |sbu2-dc ) out lo
gpio-153 ( |enable ) out hi
接著是如何將 GPIO pin 腳對映到 pin number。
舉例來說,在線路圖中, RK CPU 的 gpio pin 的表示方式為:
GPIO1_A0、GPIO1_A1、…、GPIO1_B0、GPIO1_B1、…、GPIO1_C0、GPIO1_C1、…
而這些 GPIO pin 的表示法,該如何對映到 pin number 呢?
GPIO pin 腳計算公式為:pin number = bank * 32 + number
GPIO 小組編號計算公式:number = group * 8 + X
例如:
GPIO0_C3 = 0 x 32 + (C - A) x 8 + 3 = 0 + (2 x 8) + 3 = 19
GPIO1_A3 = 1 x 32 + (A - A) x 8 + 3 = 32 + 0 + 3 = 35
GPIO3_C3 = 3 x 32 + (C - A) x 8 + 3 = 96 + (2 x 8) + 3 = 115
文字內容 或 影像內容 部份參考、引用自網路,如有侵權,請告知。