文章目录
前言
在嵌入式开发中,引脚复用和GPIO配置是最基础也是最容易让人迷惑的部分。Rockchip(RK)平台的 pinctrl 机制和 RMIO(Remappable Multi-function I/O)为引脚复用带来了极大的灵活性。本文将结合RK3506实际案例,教你如何从硬件原理图出发,查找和配置你需要的引脚功能。
一、RK平台pinctrl介绍
1.1 关键词解析
pinctrl(Pin Control)是 Linux 设备树和驱动中用于引脚复用和配置的子系统。它负责把物理引脚配置为特定的功能(如 GPIO、UART、I2C、SPI、PWM 等)。
ROC-RK3506J-CC 支持一个 Rockchip Matrix IO(RM_IO),旨在让众多功能信号共享到有限的引脚接口。在同一矩阵内,任何函数信号可以通过软件配置映射到任何引脚接口,功能十分强大!
1.2 引脚号计算
GPIO pin脚计算公式:pin = bank * 32 + number
GPIO 小组编号计算公式:number = group * 8 + X
其实芯片引脚号并没有什么卵用,制板商通常会在核心板打乱针脚顺序,在扩展板又打乱一遍,所以你看到的扩展板引脚号通常与芯片号不匹配,但有一处肯定匹配?那就是sys/class/gpio/里的gpiochipxxx。
- gpiochip0 ->GPIO0_A0
- gpiochip32 ->GPIO1_A0
- gpiochip64 ->GPIO2_A0
- gpiochip96 ->GPIO3_A0
- gpiochip128 ->GPIO4_A0
能显示相关gpiochip是因为设备树实现定义+驱动注册到sys系统
。
gpio@ff940000 {
compatible = "rockchip,gpio-bank";
........
};
gpio1: gpio@ff870000 {
compatible = "rockchip,gpio-bank";
........
};
gpio2: gpio@ff1c0000 {
compatible = "rockchip,gpio-bank";
........
};
gpio3: gpio@ff1d0000 {
compatible = "rockchip,gpio-bank";
........
};
gpio4: gpio@ff1e0000 {
compatible = "rockchip,gpio-bank";
........
};
1.3 RK3506平台pinctrl文件结构
-
rk3506-pinctrl.dtsi:标准引脚复用配置
说明:该文件一般一个外设绑定一组引脚。 -
rk3506-pinctrl-rmio.dtsi:RMIO(可重映射多功能IO)配置
说明:该文件定义可复用引脚的功能,如上图rm_io22
RMIO组:(第22组复用引脚)
引脚:GPIO0_C6
可复用功能:UART、I2C、SPI、等巨多功能! -
dt-bindings/pinctrl/rockchip.h:引脚编号、功能码等定义
说明:除了可以使用<0 RK_PB7 1 &pcfg_pull_up>的方式定义引脚,还可以使用宏定义:<0 15 RK_FUNC_GPIO &pcfg_input_enable_pull_down>;
二、如何查找和使用GPIO
例一:User-LED
2.1 步骤一:确认引脚
说明:查询原理图得知,可控用户使用LED使用的针脚名称为:
B21/GPIO4_B3_z/USER_LED/1V8
即该引脚的IO名称为:GPIO4_B3,并使用最基础的GPIO
2.2 步骤二:查询pinctrl
说明:已经知道引脚的IO名称为:GPIO4_B3,我们可以在pinctrl文件中寻找
(4 RK_PB3)
关键字样,是否存在已经定义的引脚功能组。
- rk3506-pinctrl.dtsi:很遗憾,该组默认属于外设引脚组,user-led属于自定义
- rk3506-pinctrl-rmio.dtsi:很遗憾,该组默认属于复用引脚,GPIO4貌似均不属于复用引脚
因此该引脚属于自定义引脚组,在
rk3506-pinctrl.dtsi
添加user-led自定义的LED引脚组:
user_led: user-led {
rockchip,pins = <4 RK_PB3 RK_FUNC_GPIO &pcfg_pull_none>;
};
2.3 步骤三:设备树中运用
说明:在板级设备树中(tl-minievb-emmc.dts)定义
leds {
status = "okay";
compatible = "gpio-leds";
pinctrl-names = "default";
pinctrl-0 = <&user_led>;//使用自定义的pinctrl
user_led {
label = "user-led0";
gpios = <&gpio4 RK_PB3 GPIO_ACTIVE_HIGH>;
linux,default-trigger = "default-on";
default-state = "off";
};
};
例二:复用引脚功能
2.4 步骤一:确认物理引脚
假设你通过硬件引脚图知道外扩引脚 0 RK_PC2,你想知道它能否作为 UART3_TX 使用,还在只能作为普通引脚。
2.5 步骤二:查询pinctrl
说明:
-
rk3506-pinctrl.dtsi:该组若存在0 RK_PC2被定义为其他引脚组,则可能会出现功能重定义的危险。
一般要排除是否引脚被使用(RK_PC2被使用为SPI组),是否定义相关功能(已经存在UART3_TX)
- rk3506-pinctrl-rmio.dtsi:查询0 RK_PC2是否属于复用引脚,还是一个普通引脚。
根据图示,0 RK_PC2属于RMIO的18组,可以被作为UART3_TX。
2.6 步骤三:设备树中配置
在板级设备树中配置:
&pinctrl {
pinctrl-0 = <&rm_io18_uart3_tx &rm_io19_uart3_rx>;//rm_io19_uart3_rx是另外一个引脚
};
&uart3 {
status = “okay”;
pinctrl-names = “default”;
pinctrl-0 = <&rm_io18_uart2_tx &rm_io18_uart2_rx>;
};
总结
RK 平台的 pinctrl 和 RMIO 机制极大提升了引脚复用的灵活性。只要掌握了查找和配置方法,无论是 LED、串口还是其他外设,都能轻松搞定。本文能帮助快速上手 RK 平台的引脚配置!
参考资料:
Linux6.1内核