如何释放被占用的PA10 GPIO引脚以使用LIBGPIOD操控?
看起来你碰到了嵌入式开发里常见的GPIO被占用问题,别慌,咱们一步步排查解决:
第一步:确认PA10的占用详情
首先得搞清楚到底是谁在占用这个引脚。先通过gpioinfo确认它的基础信息:
gpioinfo gpiochip0
你会看到类似这样的输出(重点关注PA10那一行):
line 10: "PA10" "red" used input active-high
这里的line 10是它在gpiochip0中的编号,"red"是关联的设备标识。
接下来用内核debug节点查看具体占用者(需要root权限):
sudo cat /sys/kernel/debug/gpio
在输出里找到PA10对应的GPIO编号(通常和line编号一致,比如10),然后看claimed by字段,它会明确告诉你是内核驱动还是用户态进程在占用这个引脚。
你也可以用fuser快速定位使用/dev/gpiochip0的进程:
sudo fuser /dev/gpiochip0
这个命令会输出占用设备的进程PID,再用ps aux | grep <PID>就能看到具体是什么程序在占用。
第二步:根据占用类型释放引脚
情况1:用户态进程占用
如果是某个用户态程序(比如之前的测试脚本、后台服务)在占用,直接杀掉对应的进程即可:
sudo kill <PID>
杀掉后再跑一遍gpioinfo gpiochip0,PA10的状态应该就变成unused了,这时候你就能正常用gpioset操控它了。
情况2:内核驱动占用
如果是内核驱动绑定了这个引脚,就得针对性处理:
临时卸载驱动模块:从
/sys/kernel/debug/gpio里找到驱动名称(比如leds-gpio),然后卸载:sudo rmmod <driver_name>如果卸载失败提示有依赖,那就先卸载依赖的模块,或者重启开发板后再尝试。
永久修改设备树(适合开发场景):如果这个引脚是被设备树默认配置成了外设(比如LED、UART),你需要修改设备树文件,找到PA10对应的节点,添加或修改
status = "disabled";,然后重新编译设备树并烧录到开发板上。这样重启后引脚就不会被默认占用了。
备选临时方法:sysfs释放
如果以上方法都不行,你可以试试用sysfs接口临时释放(注意:这个方法对内核驱动占用的情况不一定生效):
先找到PA10对应的GPIO编号(比如10),然后执行:
sudo echo 10 > /sys/class/gpio/unexport
第三步:验证结果
最后再用gpioinfo gpiochip0确认PA10的状态是unused,然后测试你的gpioset命令:
gpioset --mode=wait gpiofind "PA10"=1
这时候应该就能正常执行,不会再报错了。
内容的提问来源于stack exchange,提问作者Gonn

