1.pinctrl 子系统重点是设置 PIN的复用和电气属性,如果 pinctrl 子系统将一个 PIN 复用为 GPIO。
pinctrl 子系统主要工作内容如下:
①、获取设备树中 pin 信息。
②、根据获取到的 pin 信息来设置 pin 的复用功能
③、根据获取到的 pin 信息来设置 pin 的电气特性,比如上/下拉、速度、驱动能力等。
对于我们使用者来讲,只需要在设备树里面设置好某个 pin 的相关属性即可,其他的初始
化工作均由 pinctrl 子系统来完成, pinctrl 子系统源码目录为 drivers/pinctrl。
2.
pinctrl_hog_1: hoggrp-1 {
fsl,pins = <
MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059 /* SD1 CD */
>;
};
MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x0090 0x031C 0x0000 0x5 0x0
根 据 其 reg 属 性 可 知 IOMUXC 外 设 寄 存 器 起 始 地 址 为 0x020e0000。
0x17059是配置寄存器的值,写入配置寄存器0x020e 031C。
0x5 是复用寄存器值,写入复用寄存器0x020e 0090。
0x0写入0x020e 0000。
3.设备树中添加 pinctrl 节点模板
我们已经对 pinctrl 有了比较深入的了解,接下来我们学习一下如何在设备树中添加某个外设 的 PIN 信息。关于 I.MX 系 列 SOC 的 pinctrl 设备树绑定信息可以参考文档
Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt。
这里我们虚拟一个名为“test”的设备,test 使用了 GPIO1_IO00 这个 PIN 的 GPIO 功能,pinctrl 节点添加过程如下:
3.1、创建对应的节点
同一个外设的 PIN 都放到一个节点里面,打开 imx6ull-alientek-emmc.dts,在 iomuxc 节点
中的“imx6ul-evk”子节点下添加“pinctrl_test”节点,注意!节点前缀一定要为“pinctrl_”。添
加完成以后如下所示:
test 设备 pinctrl 节点
/* 标签: 名字
使用标签的目的就是为了方便访问节点。
*/
pinctrl_test: testgrp {
/* 具体的 PIN 信息 */
};
3.2、添加“fsl,pins”属性
设备树是通过属性来保存信息的,因此我们需要添加一个属性,属性名字一定要为“fsl,pins”,
因为对于 I.MX 系列 SOC 而言,pinctrl 驱动程序是通过读取“fsl,pins”属性值来获取 PIN 的配
置信息,完成以后如下所示:
添加"fsl,pins"属性
pinctrl_test: testgrp {
fsl,pins = <
/* 设备所使用的 PIN 配置信息 */
>;
};
3.3、在“fsl,pins”属性中添加 PIN 配置信息
最后在“fsl,pins”属性中添加具体的 PIN 配置信息,完成以后如下所示:
示例代码 45.1.2.13 完整的 test 设备 pinctrl 子节点
pinctrl_test: testgrp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO00__GPIO1_IO00 config /*config 是具体设置值*/
>;
};
至此,我们已经在 imx6ull-alientek-emmc.dts 文件中添加好了 test 设备所使用的 PIN 配置信
息。
4.pinctrl驱动包括Pinctrl驱动和 GPIO驱动
Pinctrl驱动是主要驱动,提供IO的方法集,包括PINMUX、PINCONF 和 GPIO。
GPIO驱动是完成 gpiochip 的功能,包括 GPIO 和 IRQ
通常在 dts 配置中可以看到某个模块中对 pin 引脚的配置,如下所示
注:通常模块调用pinctrl-names pinctrl-0配置默认的IOMUX或者IOCONFIG,但不是所有的节点都可以加这两个属性,如果模块被driver_probe_device调用,它就可以加这两个属性。
pinctrl-names属性里定义了2种状态:default、sleep。
第0种状态用到的引脚在pinctrl-0中定义,它是state_0_node_a,位于Pincontroller节点中。
第1种状态用到的引脚在pinctrl-1中定义,它是state_1_node_a,位于pincontroller节点中。
当这个设备处于default状态时,pinctrl子系统会自动根据上述信息,把所用引脚复用为我们所配置的各种复用功能。
当这个设备处于sleep状态时,pinctrl子系统会自动根据上述信息把所用引脚配置为高电平。