查詢 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

 

 



文字內容 或 影像內容 部份參考、引用自網路,如有侵權,請告知。

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 silverwind1982 的頭像
    silverwind1982

    拾人牙慧

    silverwind1982 發表在 痞客邦 留言(0) 人氣()