参考官方教程: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 + number
GPIO 小组编号计算公式: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 = 24
pin = 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 LOW
gpio-56 ( |sysfs ) out hi
gpio-57 ( |sysfs ) out lo
gpio-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-pins
pin 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-pins
pin 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/value
cat /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)