Pinctrl概念:
![](https://i-blog.csdnimg.cn/blog_migrate/38847e1ac8ebd0e6930a466893b53844.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8aeea155f36861410f843258a8299ac7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9be08b3c3a9d5412c7d8133cfc7edffb.png)
GPIO子系统概念:
![](https://i-blog.csdnimg.cn/blog_migrate/cd18882c572e6ae28917a6a62e347269.png)
gpio-controller;
#gpio-cells = <2>;
GPIO_ACTIVE_HIGH : 高电平有效
GPIO_ACTIVE_LOW : 低电平有效
![](https://i-blog.csdnimg.cn/blog_migrate/092b4292aed56a3a3078c1664a1df72c.png)
总结:
在实际应用中,
imx6ull格式:
//client端:
@节点名字 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_自定义名字A>;
status = "okay";
};
//pincontroller服务端
pinctrl_自定义名字A: 自定义名字B {
fsl,pins = <
引脚复用宏定义 PAD(引脚)属性, // 引脚 A
引脚复用宏定义 PAD(引脚)属性; // 引脚 B
>;
};
Pinctrl client端:
在设备树里被定义为一个节点,在节点里声明要用哪些引脚并告诉驱动程序
- 包含了对应驱动程序的compatible属性值
- 包含了引脚被设置成的各种模式“default”、“sleep”等,下图中 default 模式也就是gpio模式
- 模式的选择“Pinctrl-0”,选择“pinctrl-names”中的第一种模式<&pinctrl_leds>取得了gpio子系统的设置(封装的寄存器的相关设置)
- (gpio子系统)gpios = <&gpio5 3 GPIO_ACTIVE_LOW>;有两个参数,表明用的引脚,且低电位有效,参数数量取决于GPIO Controlle:“gpio- cells = <2>”,此参数将传递给驱动程序中的probe函数用来记录引脚信息。
- status表明pinctrl是否有效的状态
(为什么gpios参数中要声明高低电平有效呢? 因为在驱动程序中设置引脚时传入的是逻辑值0或1来代表有效或不有效,但实际不同的板子引脚有效需要的物理实际值不同,有的是置1有效,有的置0有效。当在gpio子系统中设置有效参数后,驱动程序只要传入逻辑值1,子系统可以自动设置引脚为对应的物理值达成有效状态,对不同的开发板都是使用的。)
myled{
compatible = "100ask,leddrv";
pinctrl-names = "defualt";
pinctrl-0 = <&pinctrl_leds>;
gpios = <&gpio5 3 GPIO_ACTIVE_LOW>;
status = "okay";
};
Pinctrl 服务端:
设置引脚来完成功能复用或配置
1)表明了该gpio系统的名字和功能,以及引脚的复用情况,下图中是将 MX6ULL_PAD_SNVS_TAMPER3_复用为GPIO5_IO03
2) 0x000110A0代表对应寄存器的状态配置,包括了上下拉电阻,开漏推挽,输入输出方向等。
pinctrl_leds: ledgrp {
fsl,pins = <
MX6ULL_PAD_SNVS_TAMPER3__GPIO5_IO03 0x000110A0
>;
};
gpioctrl:
/*添加rgb_led节点*/
rgb_led{
#address-cells = <1>;
#size-cells = <1>;
compatible = "fire,rgb-led"; // 节点兼容性
/* pinctrl 子系统 */
pinctrl-names = "default"; // 引脚状态名称表
pinctrl-0 = <&pinctrl_rgb_led>; // 第 0 个状态使用的引脚
/* GPIO子系统 */
rgb_led_red = <&gpio1 4 GPIO_ACTIVE_LOW>; // 使用的引脚 。旧版
rgb_led_green-gpios = <&gpio4 20 GPIO_ACTIVE_LOW>; // 新版
rgb_led_blue-gpios = <&gpio4 19 GPIO_ACTIVE_LOW>; // 新版
status = "okay";
};
reg属性,一般用于描述设备地址空间资源信息,一般都是某个外设的寄存器地址范围信息。reg属性的格式为<address1 length1 address2 length2 ...>
在设备树中,GPIO组 就是一个 GPIO Controller。
GPIO组 的节点内容是由芯片厂商设置好的,一般在芯片厂商提供的设备树头文件 xxx.dtsi 中。如 IMX6UL 的就在 imx6ull.dtsi 文件中定义。
用户只需要做的是根据芯片厂商文档格式要求,在相应设备树节点中填写引脚信息。
两个用处:1、指定GPIO引脚信息
(为什么需要gpio子系统来指定呢?若不指定,用户就要从数据手册一个一个找寄存器看要用哪些寄存器、功能怎么设置,太繁琐)
2、给驱动程序提供API来访问IO口
参考: https://www.bilibili.com/read/cv13931424/from=search&spm_id_from=333.337.0.0 出处:bilibili
原文链接:https://blog.csdn.net/wwwlyj123321/article/details/122898506