文章目录
前言
在嵌入式开发中,引脚复用和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内核