Linux下gpioget读取高电平GPIO引脚始终返回0的问题排查
GPIO输入引脚始终读0的排查方向
针对你遇到的Ka-ro Electronics QSXP-M181 SOM GPIO组2_18引脚(物理41、内核50)万用表测高电平但软件读0的问题,可按以下方向排查:
确认引脚复用配置
部分SoC引脚默认复用为外设(如UART、SPI),即使gpioinfo显示未使用,实际硬件通路可能未切换到GPIO。可通过以下方式验证:- 查看SoC官方手册,确认物理引脚41的默认复用功能;
- 执行
cat /sys/kernel/debug/pinctrl/*/pins,搜索引脚41对应的条目,检查其mux setting是否为GPIO模式; - 若有
pinmux-utils工具,用pinmux list命令查看该引脚的当前复用状态。
校验GPIO电平有效配置
- 用
gpioinfo gpiochip1查看引脚18的完整flags,确认active-high是否正确,同时检查是否存在pull-down等可能导致电平采样异常的配置; - 执行
cat /sys/class/gpio/gpio50/active_low,若返回1,说明系统将高电平识别为低电平,需执行echo 0 > /sys/class/gpio/gpio50/active_low修正。
- 用
确认sysfs操作路径正确性
检查读取值时的路径是否为/sys/class/gpio/gpio50/value,避免因路径输入错误导致读取无效值;同时再次执行cat /sys/class/gpio/gpio50/direction确认引脚确实处于in模式。用chardev接口直接验证
虽然你提到chardev无法从命令行运行,可通过简单C程序直接操作GPIO字符设备,排除工具或sysfs层的问题:#include <fcntl.h> #include <unistd.h> #include <linux/gpio.h> #include <stdio.h> int main() { int fd = open("/dev/gpiochip1", O_RDONLY); if (fd < 0) { perror("open gpiochip1"); return 1; } struct gpiohandle_request req = {0}; req.lineoffsets[0] = 18; req.lines = 1; req.flags = GPIOHANDLE_REQUEST_INPUT; snprintf(req.consumer_label, sizeof(req.consumer_label), "gpio-test"); if (ioctl(fd, GPIO_GET_LINEHANDLE_IOCTL, &req) < 0) { perror("get line handle"); close(fd); return 1; } struct gpiohandle_data data = {0}; if (ioctl(req.fd, GPIOHANDLE_GET_LINE_VALUES_IOCTL, &data) < 0) { perror("read pin value"); close(req.fd); close(fd); return 1; } printf("Pin 18 value: %d\n", data.values[0]); close(req.fd); close(fd); return 0; }编译运行:
gcc gpio-test.c -o gpio-test && ./gpio-test,若输出仍为0,说明问题出在硬件或驱动层面;若输出为1,则需排查gpioget工具或sysfs配置的异常。排查硬件隐性故障
- 检查引脚是否存在虚焊、过孔接触不良等物理连接问题;
- 尝试用杜邦线将该引脚直接连接到板载3.3V电源(注意引脚耐压),再次读取值,验证GPIO采样通路是否正常。
检查内核驱动与版本
- 确认当前内核版本是否存在该GPIO控制器的已知bug,可查阅Ka-ro官方BSP的更新日志或社区反馈;
- 尝试更新内核到Ka-ro提供的最新稳定版本,修复可能存在的驱动采样问题。
内容的提问来源于stack exchange,提问作者Christopher Theriault
相关产品推荐
相关产品推荐

