You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为i.MX8MP开发板在设备树中添加带标签的GPIO输入输出引脚

问题:i.MX8MP开发板GPIO配置:满足早启动配置、用户空间读写、自动带标签导出

背景

我有一块搭载i.MX8MP的开发板,正在用Yocto定制系统,内核版本5.10.72。

需求

要把一组引脚配置为普通IO,满足:

  • 尽可能早(内核/U-Boot阶段)设置输入/输出模式,输出引脚需指定高低电平
  • 板端软件可随时读取输入状态,按需设置输出电平
  • GPIO自动在/sys/class/gpio/以自定义标签映射,无需手动用GPIO编号导出

已尝试方案

gpio-export

试过把引脚加入hog组用gpio-export特性,能实现用户空间控制,但需要手动导出、设置方向且得用GPIO编号,不符合需求3。而且5.10内核已不支持该旧特性。另外输出引脚要等系统运行后才能设置,仅输入引脚默认是输入模式能满足启动时配置,只部分符合需求1。临时方案是用启动脚本导出并创建符号链接,但更想从设备树层面解决。

leds

了解到hog主要管闲置引脚,不是用于映射IO。试过把输出引脚配置为leds,能满足启动时配置、用户空间控制、自动带标签映射,但引脚被识别为leds,得通过brightness而非GPIO的value属性控制;输入引脚用gpio-keys的话是事件驱动,没法按需读取状态,所以输入引脚目前还是用hog+手动导出GPIO编号的方式。

理想设备树配置

期望的设备树结构如下:

/ {
  [...]
  gpio-custom {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_gpio_custom>;
    my-input {
      label = "my-input";
      gpios = <&gpio5 10 GPIO_ACTIVE_HIGH>;
      input;
    };
    my-output {
      label = "my-output";
      gpios = <&gpio5 11 GPIO_ACTIVE_LOW>;
      output-high;
    };
  };
  [...]
};
[...]
&iomuxc {
  pinctrl-names = "default";
  [...]
  pinctrl_gpio_custom: gpiocustomgrp {
    fsl,pins = <
        MX8MP_IOMUXC_ECSPI2_SCLK__GPIO5_IO10    0x19
        MX8MP_IOMUXC_ECSPI2_MOSI__GPIO5_IO11    0x19
    >;
  };
  [...]
};

尝试过添加compatible、gpio-controller等属性,调整分组,但始终没法同时满足三个需求。

注意事项

希望GPIO配置尽可能早完成,内核设备树修改后会同步到U-Boot设备树,需要兼容U-Boot 2021.04-lf_v2021.04+gf8002fcb58。


解决方案

要同时满足你的三个需求,需要结合GPIO hog特性和内核gpio-sysfs自动导出机制,关键是在设备树中正确配置hog节点并启用自动导出,具体步骤如下:

1. 修正后的设备树配置

给gpio-custom节点添加正确的兼容属性,同时为每个IO子节点配置hog参数和导出标记,最终设备树代码:

/ {
  [...]
  gpio-custom {
    compatible = "gpio-leds,gpio-keys";
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_gpio_custom>;
    status = "okay";

    my-input {
      label = "my-input";
      gpios = <&gpio5 10 GPIO_ACTIVE_HIGH>;
      gpio-hog;
      input;
      linux,default-trigger = "none";
      gpio-line-names = "my-input";
    };

    my-output {
      label = "my-output";
      gpios = <&gpio5 11 GPIO_ACTIVE_LOW>;
      gpio-hog;
      output-high;
      gpio-line-names = "my-output";
    };
  };
  [...]
};

[...]
&iomuxc {
  pinctrl-names = "default";
  [...]
  pinctrl_gpio_custom: gpiocustomgrp {
    fsl,pins = <
        MX8MP_IOMUXC_ECSPI2_SCLK__GPIO5_IO10    0x19
        MX8MP_IOMUXC_ECSPI2_MOSI__GPIO5_IO11    0x19
    >;
  };
  [...]
};

关键配置说明

  • compatible = "gpio-leds,gpio-keys":让内核识别该节点为可导出到sysfs的GPIO设备,同时兼容hog配置逻辑
  • gpio-hog:标记引脚为hog引脚,U-Boot和内核启动阶段会立即配置引脚方向与电平,满足早启动需求
  • gpio-line-names:指定sysfs中显示的自定义标签,内核会自动在/sys/class/gpio/下创建对应名称的符号链接,无需手动导出
  • linux,default-trigger = "none":对输入引脚禁用事件驱动,使其可通过/sys/class/gpio/my-input/value随时读取状态,满足按需读取需求

2. U-Boot兼容性适配

U-Boot 2021.04原生支持GPIO hog配置,只需确保U-Boot设备树中包含与内核一致的gpio-custom节点和pinctrl配置即可,i.MX8MP的GPIO5控制器默认已启用,无需额外修改。

3. 内核配置验证

确保内核已启用以下配置(Yocto可通过local.conf或内核defconfig设置):

CONFIG_GPIO_SYSFS=y
CONFIG_GPIO_HOG=y
CONFIG_GPIO_NXP=y

5.10.72内核默认通常已包含这些配置,建议确认后再编译。

4. 效果验证

系统启动后,可直接通过自定义标签操作GPIO:

  • 读取输入状态:cat /sys/class/gpio/my-input/value
  • 设置输出电平:echo 1 > /sys/class/gpio/my-output/value(结合GPIO_ACTIVE_LOW,实际输出低电平;echo 0则输出高电平)
    同时引脚在U-Boot阶段已完成配置,满足早启动要求。

内容的提问来源于stack exchange,提问作者il_mix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 11:24:10