如何在Yocto Mickledore镜像中启用GPIO sysfs接口以兼容现有应用
如何在Yocto Mickledore镜像中启用GPIO sysfs接口以兼容现有应用
别担心,你完全不用修改现有应用就能解决这个问题!Yocto Mickledore对应的内核版本确实默认禁用了GPIO sysfs接口,但我们可以通过调整内核配置和Yocto构建选项重新启用它,让你的老应用继续正常工作。下面是具体的操作步骤:
1. 启用内核的GPIO sysfs配置选项
GPIO sysfs接口虽然被标记为废弃,但内核仍然保留了这个功能,只是默认没开启。我们需要开启CONFIG_GPIO_SYSFS这个内核配置项:
- 如果有自定义内核配置文件:比如你项目里的
defconfig或者内核配置片段文件,直接在里面添加一行:CONFIG_GPIO_SYSFS=y - 如果没有自定义配置:可以创建一个单独的内核配置片段文件。比如新建
gpio-sysfs-enable.cfg,内容就是上面那行配置。然后在你的机器配置文件(比如conf/machine/your-machine.conf)或者自定义配方里添加:
记得把这个KERNEL_CONFIG_FRAGMENTS += "file://gpio-sysfs-enable.cfg".cfg文件放到你自定义layer的对应路径下,比如meta-yourlayer/recipes-kernel/linux/files/。
2. 确保模块自动加载(可选)
如果CONFIG_GPIO_SYSFS被编译成了模块(即配置值是m而不是y),那我们需要让系统启动时自动加载这个模块:
- 创建一个模块加载配置文件
gpio-sysfs.conf,内容只有一行:gpio-sysfs - 把这个文件放到你自定义layer的
recipes-core/modules-load/files/目录下(如果目录不存在就新建)。 - 新建一个配方文件
modules-load-gpio-sysfs.bb,内容如下:SUMMARY = "Auto-load GPIO sysfs module on boot" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" SRC_URI = "file://gpio-sysfs.conf" S = "${WORKDIR}" do_install() { install -d ${D}${sysconfdir}/modules-load.d install -m 0644 ${WORKDIR}/gpio-sysfs.conf ${D}${sysconfdir}/modules-load.d/ } FILES_${PN} = "${sysconfdir}/modules-load.d/" - 最后在你的镜像配方里添加这个包,比如:
IMAGE_INSTALL:append = " modules-load-gpio-sysfs"
3. 验证配置是否生效
构建完新的Yocto镜像并烧录到设备后,启动系统:
- 先检查
/sys/class/gpio/目录是否存在; - 尝试执行
echo <你的GPIO编号> > /sys/class/gpio/export,如果没有报错,且能看到/sys/class/gpio/gpio<编号>目录,就说明sysfs接口已经正常工作了,你的应用应该能像之前一样使用GPIO了。
小提示
虽然GPIO sysfs接口已经被官方标记为废弃,但这个方法可以帮你快速过渡,不用立即修改现有应用。不过长期来看,还是建议你逐步迁移到GPIO chardev接口,毕竟这是未来的主流方向。
备注:内容来源于stack exchange,提问作者tyleax
相关产品推荐
相关产品推荐

