为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

