ARM&Linux基础
+ -

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";
};

多种工作模式的可以后面学习设备驱动时应该就清楚了。

0 篇笔记 写笔记

GPIO相关的OF函数
of_gpio_named_countof_gpio_named_count 返回任意定义的数组个数。gpios = <0 &gpio1 1 GPIO_ACTIVE_LOW 0 &gpio2 3 GPIO_ACTIVE_HIGH>gpios定......
PinCtrlGPIO子系统
纯个人理解:硬件管脚是复用的,使用PinCtrl子系统可以定义管脚使用的是那个功能。而GPIO子系统是当Pin的复用功能为普通的GPIO而非模块的Pin时,提供的一系统GPIO操作函数。在imx6ull处理器中,使用iomuxc模块中的寄存器控制着Pin的功能复用。这些寄存器的设置可以通过厂商提供......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!