从脚开始!RK平台 pinctrl 机制与 GPIO/RMIO 查找和使用全攻略

前言

在嵌入式开发中,引脚复用和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内核