看 gpioinfo 输出关键行
line 96: unnamed unused output active-high
line 139: unnamed unused output active-high
line 140: unnamed unused output active-high
line 141: unnamed unused output active-high
✔从内核 GPIO 子系统视角:96、139、140、141,确实已经成功设置为 OUTPUT 输出模式,没有被别的内核驱动占用。
但是!!!内核 GPIO 子系统 ≠ SOC 硬件 MUX 多路选择器
gpioinfo只报告 GPIO 控制器内部寄存器状态,它读取不到全志 H618 芯片物理 MUX 复用寄存器! 这就是你现在的矛盾现象:
- gpioinfo:显示是
output输出,Pythonset_value()返回成功,没有报错; - 但 SOC 芯片硬件 MUX 还停留在别的外设功能,信号没有连通到外部 40Pin 排针金属引脚;
- 所以你万用表测板子物理 15 脚、22 脚,电平完全不动,一直 3.3V;
- wiring‑OP(wpi)库不看 gpioinfo,它直接 devmem 写 SOC 物理 MUX 寄存器,强制把引脚切为 GPIO 功能,硬件通路接通 → 屏幕就点亮。
通俗比喻
想象一个多路开关 (MUX):
- 开关有好几路:UART / SPI / PWM / GPIO。
- 当前开关拨在
PWM外设那一档。 libgpiod只是去拧 “GPIO 输出音量旋钮”(内核 GPIO 子系统设为 output),但是它没有动这个多路开关!开关还卡在 PWM 档位。
旋钮怎么调,外部输出端子(40pin 排针)都不会有反应。
- wiring‑OP 库,上来先把这个多路开关拨到 GPIO 档位(devmem 写 MUX 寄存器),然后再拧输出旋钮,外部引脚才有电平变化。
⚠️重点:
gpioinfo、gpio readall只能看见 “旋钮状态”,看不见 “多路开关 (MUX) 拨到哪一档”。这是全志 H618 平台 libgpiod 最大迷惑坑。
为什么会这样?
libgpiod 标准设计理念:假设设备树已经提前把 pinmux 配置完成,用户空间只操作 GPIO 高低电平。 OrangePi Zero3W 原厂设备树并没有把 PE11 (139)、PD0 (96) 默认配置成 GPIO,开机 MUX 默认是别的外设。
- wiring‑OP 不遵守这套内核设计,直接暴力写物理寄存器绕开设备树,所以能用。
- libgpiod 完全依赖设备树做好 pinmux,设备树没配,用户空间 Python 库没有 API 切换 MUX。
三条现实路径
路径 1:继续用 wiringOP wpi 版本(强烈推荐,你的硬件已经跑通)
不要折腾 libgpiod,直接在 wpi 代码上写业务,颜色扫描、单 / 双目切换全部已经调试完毕。
它底层 C 代码已经帮你做 devmem 写 MUX 这件脏活,不用你自己处理寄存器。
路径 2:运行时 Python 调用 devmem2 写 MUX 寄存器(之前给你的脚本)
局限性:
- 部分 orangepi 内核开启
devmem锁保护,直接写寄存器被拒绝; - 写错地址直接死机断电;
- 每次运行脚本都要重新设置,重启板子 MUX 恢复默认。
路径 3:编译设备树 overlay (dtbo),开机内核自动切 MUX(正规 libgpiod 方案)
写 dts overlay,开机阶段内核就把 PD0、PE11、PE12、PE13 全部设置为 GPIO。
缺点:操作系统 boot 分区,改错 dtbo 会板子开不了机,属于系统底层修改,不适合调试屏幕。
快速验证这个结论
跑那个极简测试脚本,同时万用表测板子物理排针 15、22 脚:
- 脚本里面执行
set_value(0),gpioinfo看 96/139 状态会跟着变output,但是万用表电压纹丝不动。
这就实锤:内核 GPIO 状态变了,但 SOC 硬件 MUX 开关没有切到 GPIO,外部引脚没有输出。
总结你现在现象
gpioinfo 显示 output ≠硬件引脚真正输出信号。 不是 GPIO 编号错,不是接线错,不是 SPI 问题,是 pinmux 多路复用没有切到 GPIO,libgpiod 用户空间没有接口做这件事。
就直接用已经可以点亮的 wiringOP 版本开发,不要死磕 libgpiod,这个是平台限制,不是你代码写的有 bug。
博客深入分析全志H618平台下wiringOP(wPi)能点亮屏幕而libgpiod失败的根本原因:前者通过devmem2直接操作SOC物理MUX寄存器切换引脚功能,后者完全依赖设备树预配置pinmux,若设备树未将PE11/PD0等引脚设为GPIO,则即使gpioinfo显示OUTPUT,硬件信号也无法到达40Pin排针。文中对比三种解决路径,强调平台级限制而非代码缺陷。
版本开可以成功点亮屏幕,libgpiod版本不能成功点亮屏幕&spm=1001.2101.3001.5002&articleId=169152376&d=1&t=3&u=993d2c4e94db48be837b4b7a5d5786f8)
1237

被折叠的 条评论
为什么被折叠?



