網(wǎng)站建設(shè)和網(wǎng)站推廣可以同一家做嗎網(wǎng)站優(yōu)化排名金蘋果系統(tǒng)
1. GPIO簡介?
GPIO,全稱 General-Purpose Input/Output(通用輸入輸出),是一種在計(jì)算機(jī)和嵌入式系統(tǒng)中常見的數(shù)字輸入輸出接口。它允許軟件控制硬件的數(shù)字輸入和輸出,例如開關(guān)、傳感器、LED燈等。GPIO通常由一個(gè)芯片或處理器上的引腳提供支持,通過編程可以配置這些引腳為輸入或輸出,并且可以通過相應(yīng)的軟件命令來讀取輸入狀態(tài)或控制輸出狀態(tài)。
2. GPIO引腳編號(hào)計(jì)算方法?
RK3588共 有 5 組 GPIO bank:GPIO0~GPIO4,每組又以 A0~A7, B0~B7, C0~C7, D0~D7 作為編號(hào)區(qū)分,常用以下公式計(jì)算引腳:
GPIO pin腳計(jì)算公式:pin = bank * 32 + numberGPIO 小組編號(hào)計(jì)算公式:number = group * 8 + X
例如: GPIO3_B5的計(jì)算方式 : 32?3 + 1?8 + 5 = 109 ---> 也就是說,GPIO3_B5對(duì)應(yīng)的是GPIO的編號(hào)是gpio-109。
3. 復(fù)用?
GPIO口除了通用輸入輸出功能外,還可能有其它復(fù)用功能
從原理圖中看出:以GPIO1_C0為例,就有如下幾個(gè)功能:
func0 | func1 | func2 | func3 |
---|---|---|---|
GPIO1_C0 | I2C3_SDA_M0 | UART3_RX_M0 | SPI4_MISO_M0 |
在系統(tǒng)DTS配置中GPIO1_C0默認(rèn)是I2C3_SDA_M0功能。如果我們想將GPIO1_C0復(fù)用為UART3_RX_M0功能,該怎么做呢?
- 首先打開uart3 節(jié)點(diǎn),將pinctrl配置為uart3m0_xfer。pinctrl配置是GPIO復(fù)用的最關(guān)鍵的配置,在這里就是將GPIO1_C0復(fù)用做了uart3功能。
&uart3 {pinctrl-names = "default";pinctrl-0 = <&uart3m0_xfer>;status = "okay";
};&pinctrl {uart3 {/omit-if-no-ref/uart3m0_xfer: uart3m0-xfer {rockchip,pins =/* uart3_rx_m0 */<1 RK_PC0 10 &pcfg_pull_up>, # 將GPIO1_C0復(fù)用為uart3_rx_m0 /* uart3_tx_m0 */<1 RK_PC1 10 &pcfg_pull_up>; # 將GPIO1_C1復(fù)用為uart3_tx_m0 };};
};
- 如果發(fā)現(xiàn)GPIO1_C0被復(fù)用為I2c3,則在dts中關(guān)閉它。
&i2c3 {status = "disabled";
};
這樣,我們就將GPIO1_C0復(fù)用為了UART3_RX_M0功能
4. GPIO調(diào)試方法?
4.1 讀取GPIO狀態(tài)信息?
Debugfs 文件系統(tǒng)目的是為開發(fā)人員提供更多內(nèi)核數(shù)據(jù),方便調(diào)試。 這里 GPIO 的調(diào)試也可以用 Debugfs 文件系統(tǒng),獲得更多的內(nèi)核信息。GPIO 在 Debugfs 文件系統(tǒng)中的接口為 /sys/kernel/debug/gpio,可以這樣讀取該接口的信息:
armsom@armsom:~$ sudo cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 0-31, parent: platform/fd8a0000.gpio, gpio0:gpio-15 ( |led_rgb_b ) out logpio-20 ( |reset ) out lo ACTIVE LOWgpio-21 ( |bt_default_wake_host) in higpiochip1: GPIOs 32-63, parent: platform/fec20000.gpio, gpio1:gpio-34 ( |bt_default_rts ) in higpio-36 ( |vcc3v3-pcie30 ) out logpio-40 ( |camera-pwdn-gpio ) out higpio-54 ( |hdmirx-det ) in lo ACTIVE LOWgpio-58 ( |vcc3v3-pcie2x1l0 ) out higpio-61 ( |headset_gpio ) in higpiochip2: GPIOs 64-95, parent: platform/fec30000.gpio, gpio2:gpio-78 ( |vbus5v0-typec ) out logpiochip3: GPIOs 96-127, parent: platform/fec40000.gpio, gpio3:gpio-101 ( |vcc-5v0-gpio-regulat) out higpio-102 ( |bt_default_reset ) out logpio-104 ( |reset ) out higpio-125 ( |bt-wake-gpio-regulat) out higpiochip4: GPIOs 128-159, parent: platform/fec50000.gpio, gpio4:gpio-130 ( |wifi-diable-gpio-reg) out higpio-134 ( |sbu1-dc ) out logpio-135 ( |sbu2-dc ) out logpio-136 ( |vcc5v0-host-regulato) out higpio-149 ( |led_rgb_r ) out logpiochip5: GPIOs 509-511, parent: platform/rk806-pinctrl.9.auto, rk806-gpio, can sleep:
從讀取到的信息中可以知道,內(nèi)核把 GPIO 當(dāng)前的狀態(tài)都列出來了,以 GPIO0組為例,gpio-15(GPIO0_B7) 對(duì)應(yīng)的dts節(jié)點(diǎn)是led_rgb_b,輸出低電平 (out lo)。
4.2 查看 pinmux-pins?
armsom@armsom:~$ sudo cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins
Pinmux settings per pin
Format: pin (name): mux_owner gpio_owner hog?
pin 0 (gpio0-0): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 1 (gpio0-1): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 2 (gpio0-2): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 3 (gpio0-3): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 4 (gpio0-4): fe2c0000.mmc (GPIO UNCLAIMED) function sdmmc group sdmmc-det
pin 5 (gpio0-5): feb20000.spi (GPIO UNCLAIMED) function spi2 group spi2m2-pins
pin 6 (gpio0-6): feb20000.spi (GPIO UNCLAIMED) function spi2 group spi2m2-pins
pin 7 (gpio0-7): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 8 (gpio0-8): 6-0051 (GPIO UNCLAIMED) function hym8563 group rtc-int
pin 9 (gpio0-9): feb20000.spi (GPIO UNCLAIMED) function spi2 group spi2m2-cs0
pin 10 (gpio0-10): wireless-wlan (GPIO UNCLAIMED) function wireless-wlan group wifi-host-wake-irq
pin 11 (gpio0-11): feb20000.spi (GPIO UNCLAIMED) function spi2 group spi2m2-pins
pin 12 (gpio0-12): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 13 (gpio0-13): fiq-debugger (GPIO UNCLAIMED) function uart2 group uart2m0-xfer
pin 14 (gpio0-14): fiq-debugger (GPIO UNCLAIMED) function uart2 group uart2m0-xfer
pin 15 (gpio0-15): leds gpio0:15 function leds group led-rgb-b
pin 16 (gpio0-16): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 17 (gpio0-17): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 18 (gpio0-18): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 19 (gpio0-19): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 20 (gpio0-20): sdio-pwrseq gpio0:20 function sdio-pwrseq group wifi-enable-h
pin 21 (gpio0-21): (MUX UNCLAIMED) gpio0:21
...
我們以pin 13 (gpio0-13): fiq-debugger (GPIO UNCLAIMED) function uart2 group uart2m0-xfer作為解析:
gpio0-13對(duì)應(yīng)的節(jié)點(diǎn)名是 fiq-debugger,此節(jié)點(diǎn)使用pinctrl配置復(fù)用為debug串口功能,pinctrl的值是uart2m0-xfer。
5. GPIO控制?
這里介紹一下在用戶空間基于sysfs控制gpio的方式: sysfs控制gpio的方式主要是基于內(nèi)核提供的gpio控制接口文件。也就是通過讀寫/sys/class/gpio目錄下的文件來控制對(duì)應(yīng)的gpio接口。
echo 109 > /sys/class/gpio/export # 申請導(dǎo)出相應(yīng)的gpio
echo out > /sys/class/gpio/gpio109/direction # 設(shè)置相應(yīng)gpio為輸出方向
echo 1 > /sys/class/gpio/gpio109/value # 設(shè)置輸出高電平
cat /sys/class/gpio/gpio109/value # 獲取gpio當(dāng)前狀態(tài)值,是高電平還是低電平
echo 109 > /sys/class/gpio/unexport # 釋放申請的gpio
注意:只有當(dāng)GPIO3_B5腳沒有被其它外設(shè)復(fù)用時(shí), 我們才可以通過export導(dǎo)出該引腳去使用