arm-linux pinctrl 和 gpio 子系统

pinctrl

pinctrl 是为了解决传统的配置 pin 的方式就是直接操作相应的寄存器,但是这种配置

方式比较繁琐、而且容易出问题
pinctrl 子系统主要工作内容如下:
①、获取设备树中 pin 信息。
②、根据获取到的 pin 信息来设置 pin 的复用功能
③、根据获取到的 pin 信息来设置 pin 的电气特性,比如上 / 下拉、速度、驱动能力等。
对于我们使用者来讲,只需要在设备树里面设置好某个 pin 的相关属性即可,其他的初始
化工作均由 pinctrl 子系统来完成, pinctrl 子系统源码目录为 drivers/pinctrl
找到一个叫做 iomuxc 的节点
iomuxc : iomuxc@020e0000 { compatible = "fsl,imx6ul-iomuxc" ; reg = < 0x020e0000 0x4000 >;};
& iomuxc向 iomuxc 节点追加数据
&iomuxc {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_hog_1>;
imx6ul-evk {
pinctrl_hog_1: hoggrp-1 {
fsl,pins = <
MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059
MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT 0x17059
MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x17059
MX6UL_PAD_GPIO1_IO00__ANATOP_OTG1_ID 0x13058
>;
};
..
pinctrl_flexcan1: flexcan1grp{
fsl,pins = <
MX6UL_PAD_UART3_RTS_B__FLEXCAN1_RX 0x1b020
MX6UL_PAD_UART3_CTS_B__FLEXCAN1_TX 0x1b020
>;
};
..
pinctrl_wdog: wdoggrp {
fsl,pins = <
MX6UL_PAD_LCD_RESET__WDOG1_WDOG_ANY 0x30b0
>;
};
};
};
pinctrl_hog_1 子节点就是和热插拔有关的 PIN 集合
pinctrl_flexcan1 子节点是 flexcan1 这个外设所使用的 PIN
pinctrl_wdog 子节点是 wdog 外设所 使用的 PIN
结合起来就是
示例代码 45.1.2.3 完整的 iomuxc 节点
 iomuxc: iomuxc@020e0000 {
compatible = "fsl,imx6ul-iomuxc";
 reg = <0x020e0000 0x4000>;
 pinctrl-names = "default";
pinctrl-0 = <&pinctrl_hog_1>;
imx6ul-evk {
pinctrl_hog_1: hoggrp-1 {
fsl,pins = <
MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059
MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT 0x17059
MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x17059
MX6UL_PAD_GPIO1_IO00__ANATOP_OTG1_ID 0x13058
>;
..
};
};
;
首先来看一下 MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 ,这是一个宏定义,定义在文件
arch/arm/boot/dts/imx6ul-pinfunc.h 中, imx6ull.dtsi 会引用 imx6ull-pinfunc.h 这个头文件
gpio 子系统
子系统顾名思义,就是用于初始化 GPIO 并且提供相应的 API 函数,比如设置 GPIO
为输入输出,读取 GPIO 的值等。 gpio 子系统的主要目的就是方便驱动开发者使用 gpio ,驱动
开发者在设备树中添加 gpio 相关信息,然后就可以在驱动程序中使用 gpio 子系统提供的 API
函数来操作 GPIO Linux 内核向驱动开发者屏蔽掉了 GPIO 的设置过程,极大的方便了驱动开
发者使用 GPIO
1 pinctrl_led : ledgrp {
2 fsl , pins = <
3 MX6UL_PAD_GPIO1_IO03__GPIO1_IO03 0x10B0 /* LED0 */
4 >;
5 };
1 gpioled {
2 #address - cells = < 1 >;
3 #size - cells = < 1 >;
4 compatible = "atkalpha-gpioled" ;
5 pinctrl - names = "default" ;
6 pinctrl - 0 = <& pinctrl_led >;
7 led - gpio = <& gpio1 3 GPIO_ACTIVE_LOW >;
8 status = "okay" ;
9 } ;
6 行, pinctrl-0 属性设置 LED 灯所使用的 PIN 对应的 pinctrl 节点。
7 行, led-gpio 属性指定了 LED 灯所使用的 GPIO ,在这里就是 GPIO1 IO03 ,低电平
有效。稍后编写驱动程序的时候会获取 led-gpio 属性的内容来得到 GPIO 编号,因为 gpio 子系
统的 API 操作函数需要 GPIO 编号。

猜你喜欢

转载自blog.csdn.net/L1153413073/article/details/125511373