PC/104(Ubuntu16.04)GPIO10、17突然无法工作报I/O错误如何解决
问题原因
内核日志输出的invalid GPIO 10、invalid GPIO 17错误,明确说明当前系统无法识别这两个GPIO编号,可能的原因如下:
- 硬件异常:你的dmesg日志中已经存在ehci-pci端口复位错误、pcan硬件打开失败的底层硬件报错,说明PC/104主板的硬件可能出现接触不良、sch311x GPIO控制器损坏等问题,导致驱动无法识别到硬件控制器,进而无法识别对应的GPIO编号。
- 驱动加载异常:gpio_sch311x驱动虽然执行了加载命令,但实际并未正确匹配到硬件,导致该控制器对应的GPIO编号范围未被系统注册,10、17两个编号不在系统可用GPIO范围内。
- GPIO编号被占用:10、17两个GPIO编号已经被其他内核模块或系统服务预占用,无法再被用户态通过sysfs导出。
解决步骤
1. 排查驱动加载状态
- 执行
lsmod | grep gpio_sch311x确认驱动是否正常加载,若无输出,重新加载驱动并查看加载日志:
若加载过程出现硬件相关报错,优先排查硬件问题。sudo modprobe -r gpio_sch311x sudo modprobe gpio_sch311x dmesg | tail - 确认可用GPIO范围:执行以下命令查看sch311x控制器对应的GPIO编号范围,确认10、17是否在可用范围内:
如果确认10、17不在可用范围内,就是控制器未被正确识别或者GPIO编号发生了偏移。# 找到sch311x对应的gpiochip节点 cat /sys/class/gpio/gpiochip*/label # 替换X为上一步查到的sch311x对应gpiochip的编号,查看起始编号 cat /sys/class/gpio/gpiochipX/base # 查看该控制器支持的GPIO数量 cat /sys/class/gpio/gpiochipX/ngpio
2. 排查硬件故障
- 先对整个PC/104设备断电重启,检查GPIO引脚的物理连接是否松动,排查是否有硬件损坏、进水、引脚短路等情况。
- 重启后若dmesg中的ehci-pci、pcan相关报错依然存在,基本可以确定是主板硬件故障,需要更换或者维修硬件。
3. 修复执行脚本
如果确认是GPIO编号发生偏移,找到正确的编号后替换脚本中的10、17即可,也可以在脚本中增加异常校验逻辑,避免导出失败后继续执行后续命令:
#!/bin/bash for gpio_id in 10 17; do if ! echo ${gpio_id} > /sys/class/gpio/export; then echo "GPIO ${gpio_id} 导出失败,退出执行" exit 1 fi echo out > /sys/class/gpio/gpio${gpio_id}/direction done
内容的提问来源于stack exchange,提问作者echo_sg
相关产品推荐
相关产品推荐

