无需编写自定义驱动,能否自动导出并配置GPIO引脚为默认输出?
GPIO自动导出与配置方案
问题背景
我们拥有多个GPIO控制器,每个引脚仅承担单一功能,例如I2C扩展GPIO的设备树条目如下:
i2c_expander: pca9506@20 { compatible = "nxp,pca9505"; reg = <0x20>; gpio-controller; #gpio-cells = <2>; };
这类GPIO多作为二进制开关使用,当前切换开关需执行以下步骤:
- 导出GPIO设备
- 设置方向为输出
- 写入数值
由于前两步每次操作都要重复执行,十分繁琐。请问是否必须编写自定义内核驱动才能自动完成这两步?是否存在通用驱动可实现自动以输出方向导出指定GPIO引脚(如引脚4)?
解决方案
不需要编写自定义内核驱动,Linux内核本身提供了**GPIO Hogging(GPIO占用)**功能,可直接在设备树中配置,实现自动导出指定GPIO并设置方向、默认电平。
1. 设备树中配置GPIO Hog
在你的I2C扩展GPIO节点下添加hog子节点,以引脚4为例,配置为输出并默认低电平:
i2c_expander: pca9506@20 { compatible = "nxp,pca9505"; reg = <0x20>; gpio-controller; #gpio-cells = <2>; /* 配置引脚4为输出,默认低电平 */ gpio_hog_4: gpio-hog-4 { gpios = <4 GPIO_ACTIVE_HIGH>; output-low; line-name = "custom-switch-4"; }; };
gpios:指定要配置的GPIO引脚(这里是引脚4)和有效电平output-low:设置引脚为输出方向,默认输出低电平;若需要默认高电平则用output-highline-name:为该GPIO设置名称,方便在sysfs中识别
配置完成后,内核启动时会自动完成引脚的导出和方向设置,你直接在/sys/class/gpio/custom-switch-4/value文件中写入0或1即可控制开关,无需再执行导出和方向设置步骤。
2. 其他可选方案
如果需要更灵活的用户态控制,也可以使用gpio-leds通用驱动,将GPIO模拟为LED设备,同样能自动完成导出和方向配置:
custom_leds: leds { compatible = "gpio-leds"; switch-4 { gpios = <&i2c_expander 4 GPIO_ACTIVE_HIGH>; default-state = "off"; // 默认低电平 label = "custom-switch-4"; }; };
此时GPIO会被映射到/sys/class/leds/custom-switch-4/brightness,写入0或1即可控制电平,同样无需手动配置方向和导出。
内容的提问来源于stack exchange,提问作者Schottky
相关产品推荐
相关产品推荐

