PinCtrl和GPIO子系统
2025-11-25
11
0
纯个人理解:硬件管脚是复用的,使用PinCtrl子系统可以定义管脚使用的是那个功能。而GPIO子系统是当Pin的复用功能为普通的GPIO而非模块的Pin时,提供的一系统GPIO操作函数。
在imx6ull处理器中,使用iomuxc模块中的寄存器控制着Pin的功能复用。这些寄存器的设置可以通过厂商提供的设备树,然后在其对应的iomuxc模块中进行配置。
iomuxc分为三级:
- 第一级为根节点下的iomuxc,表示这是iomuxc
- 第二级为板卡模块,如imx6ul-evk
- 第三级为板卡下的指定的功能模块根据理件的连接,配置对应的Pin的复用。
如下imx6ul-evk板卡下的3个模块pinctrl_hog_1、pinctrl_flexcan1和pinctrl_wdog三者使用的Pin的复用配置设置。
&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
>;
};
};
};
这样在其设备树下直接引用它们的名字模块即可。
如iomuxc 节点的 imx6ul-evk 子节点下创建一个名为“pinctrl_led”的子节点,将 GPIO1_IO03 这个PIN复用为 GPIO1_IO03,电气属性值为 0X10B
pinctrl_led: ledgrp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO03__GPIO1_IO03 0x10B0 /* LED0 */
...
>;
};
gpio1节点信息描述了 GPIO1 控制器的所有信息,重点就是 GPIO1 外设寄存器基地址以及兼容属性。关于I.MX系列SOC的 GPIO控制器绑定信息请查看文档Documentation/devicetree/bindings/gpio/fsl-imx-gpio.txt。
/{
soc{
aips1: aips-bus@02000000{
spba-bus@02000000{
gpio1: gpio@0209c000 {
compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";
reg = <0x0209c000 0x4000>;//GPIO1 控制器的基地址就是 0X0209C000
interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
gpio-controller;
#gpio-cells = <2>;//gpio项有2个数字为一组
interrupt-controller;
#interrupt-cells = <2>;//表示一个有2个cell
};
};
};
};
};
然后在根节点下创建LED节点:
gpioled {
#address-cells = <1>;
#size-cells = <1>;
compatible = "atkalpha-gpioled";
//0表示默认的工作模式,可以有多种,如pinctrl-1,2,3...
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_led>; //表示使用的管脚配置位于pinctrl_led节点下
//gpioled.led_gpio = of_get_named_gpio(gpioled.nd, "led-gpio", 0);
led-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>;//gpio1节点信息
status = "okay";
};
多种工作模式的可以后面学习设备驱动时应该就清楚了。
ARM&Linux基础





