GPIO 子系统和Pinctrl 子系统
首先介绍Pinctrl
之前都是直接操作寄存器,这里相当于通过Pinctrl 进行了一层封装,将引脚的复用和设置都通过Pinctrl 来操作,主要是给GPIO I2C 系统使用的,可以理解为之前的IOMUX 复用控制器
Pinctrl 可以分为Pin ctroller 和Client device
Pin Controller 只是一个概念和命名,实际上可能并没有,这里需要和GPIO Controller 进行却别,Pin Controller 用来设置引脚工作在GPIO 或者是I2C 的模式下,而GPIO Controller 是用来设置输入还是输出的
Client device 就是使用的设备,例如UART 就是串口的设备
一般pinctrl 是在 arch/arm/boot/dts 路劲下面
pinctrl-names = “active”, “sleep”;
pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on &sdc2_cd_on>;
pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off &sdc2_cd_off>;
代码中如何引用pinctrl
这个是透明的,我们的驱动基本是不用管的,当设备切换状态的时候,对应的pinctrl 就会被调用
比如 platform-device 和plateform-driver的枚举过程中
比如系统休眠的时候也会去设置设备sleep的状态对应的引脚,不需要我们自己去调用代码
GPIO 子系统