參考官方教程:ROC-RK3588S-PC
一.基本知識:
1.GPIO引腳計算:
ROC-RK3588S-PC 有 5 組 GPIO bank:GPIO0~GPIO4,每組又以 A0~A7, B0~B7, C0~C7, D0~D7 作為編號區分,常用以下公式計算引腳:GPIO pin腳計算公式:pin = bank * 32 + numberGPIO 小組編號計算公式:number = group * 8 + X
下面演示GPIO1_D0 pin腳計算方法:bank = 1; //GPIO1_D0 => 1, bank ∈ [0,4]group = 3; //GPIO1_D0 => 3, group ∈ {(A=0), (B=1), (C=2), (D=3)}X = 0; //GPIO1_D0 => 0, X ∈ [0,7]number = group * 8 + X = 3 * 8 + 0 = 24pin = bank*32 + number= 1 * 32 + 24 = 56;
2.查看 pinmux-pins:
使用命令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): wireless-bluetooth gpio0:0 function wireless-bluetooth group bt-irq-gpio
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 0這一列表示引腳編號,gpio0-0這一列表示gpio組編號,后面MUX UNCLAIMED這一列表示數據選擇器的擁有者,GPIO UNCLAIMED這一列表示gpio的擁有者。其中 MUX UNCLAIMED 表示該引腳還沒有被節點使用pinctrl去進行控制,例如:節點 i2c7 被啟用,它擁有pinctrl-0屬性,對引腳pin 56功能作出出修改,復用為i2c ,則該引腳的信息會變為pin 56 (gpio1-24): fec90000.i2c (GPIO UNCLAIMED) function i2c7 group i2c7m0-xfer ,它被地址為0xfec90000、名字為i2c的節點使用pinctrl配置,pinctrl的值是i2cm0-xfer。GPIO UNCLAIMED表示還沒有注冊的gpio使用該引腳,我們用上述gpio_demo例子去注冊該引腳,引腳信息會變成pin 56 (gpio1-24): gpio_demo gpio1:56 function gpio group pin56_57_gpio ,它被名為gpio_demo的節點使用pinctrl配置,pinctrl的值是pin56_57_gpio,該引腳還被申請為gpio。
3.GPIO 調試接口:
Debugfs 文件系統目的是為開發人員提供更多內核數據,方便調試。 這里 GPIO 的調試也可以用 Debugfs 文件系統,獲得更多的內核信息。GPIO 在 Debugfs 文件系統中的接口為 /sys/kernel/debug/gpio,可以這樣讀取該接口的信息:console:/ $ cat sys/kernel/debug/gpio
gpiochip0: GPIOs 0-31, parent: platform/fd8a0000.gpio, gpio0:gpio-0 ( |bt_default_wake_host) in lo gpio-21 ( |bt_default_wake ) in lo gpio-22 ( |bt_default_reset ) out lo gpiochip1: GPIOs 32-63, parent: platform/fec20000.gpio, gpio1:gpio-34 ( |bt_default_rts ) in hi gpio-36 ( |hpd ) in lo gpio-43 ( |:power ) out hi gpio-44 ( |reset ) out hi gpio-52 ( |hp-det ) in hi ACTIVE LOWgpio-56 ( |sysfs ) out higpio-57 ( |sysfs ) out logpio-61 ( |hdmirx-det ) in hi ACTIVE LOW...
從讀取到的信息中可以知道,內核把 GPIO 當前的狀態都列出來了,以 GPIO1 組為例,gpio-56(GPIO1_D0) 輸出高電平 (out hi)。
二.步驟
1.ROC-RK3588S-PC開發板:
2.修改roc-rk3588s-pc.dtsi文件的第269行,將status屬性的值改成disabled(禁用spi1接口)
/home/wst/Linux_SDK/kernel/arch/arm64/boot/dts/rockchip/roc-rk3588s-pc.dtsi
line:269
spi1:disabled
3. ./build.sh重新編譯系統并重新燒寫系統
4.查看驗證
未修改設備樹前(4個GPIO為SPI接口):
cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pinspin 56 (gpio1-24): feb10000.spi (GPIO UNCLAIMED) function spi1 group spi1m2-pins
pin 57 (gpio1-25): feb10000.spi (GPIO UNCLAIMED) function spi1 group spi1m2-pins
pin 58 (gpio1-26): feb10000.spi (GPIO UNCLAIMED) function spi1 group spi1m2-pins
pin 59 (gpio1-27): feb10000.spi (GPIO UNCLAIMED) function spi1 group spi1m2-cs0修改后(4個GPIO為通用GPIO):
cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pinspin 56 (gpio1-24): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 57 (gpio1-25): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 58 (gpio1-26): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 59 (gpio1-27): (MUX UNCLAIMED) (GPIO UNCLAIMED)將56、57腳設成GPIO out
echo 56 > /sys/class/gpio/export
echo 57 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio56/direction
echo out > /sys/class/gpio/gpio57/direction
echo 0 > /sys/class/gpio/gpio56/valuecat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins
pin 56 (gpio1-24): (MUX UNCLAIMED) gpio1:56
pin 57 (gpio1-25): (MUX UNCLAIMED) gpio1:57
pin 58 (gpio1-26): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 59 (gpio1-27): (MUX UNCLAIMED) (GPIO UNCLAIMED)