Orange Pi One中PC系列引脚gpio_to_irq返回-22问题求助
解决Orange Pi One非PA系列GPIO引脚gpio_to_irq返回-22的问题
问题分析
从你提供的信息来看,仅PA系列(GPIO0-21)能通过gpio_to_irq()获取有效中断号,PC3(GPIO67)等其他组引脚返回-22(EINVAL),且/sys/kernel/debug/gpio中PC3未标记IRQ,但用户空间可正常作为GPIO使用。核心原因是这些非PA引脚的中断映射未在设备树或内核驱动中正确配置,导致内核无法将GPIO编号映射到对应的硬件中断线。
解决步骤
1. 检查设备树引脚配置
Orange Pi One基于Allwinner H3芯片,需查看对应设备树文件(通常为sun8i-h3-orangepi-one.dts或其引用的dtsi文件)中PC3引脚的配置:
- 确认PC3节点是否包含中断相关属性,参考PA系列引脚的配置格式:
&pio { pc3_pin: pc3 { pins = "PC3"; function = "gpio_in"; interrupt-parent = <&pio>; interrupts = <GPC 3 IRQ_TYPE_EDGE_FALLING>; bias-pull-up; }; }; - 确保
interrupt-parent指向正确的GPIO中断控制器,interrupts属性格式符合Allwinner H3规范(组编号+引脚编号+触发类型)。
2. 验证内核中断控制器配置
- 检查内核是否开启Allwinner GPIO中断支持:
确保输出为zcat /proc/config.gz | grep CONFIG_SUNXI_IRQCONFIG_SUNXI_IRQ=y,若未开启需重新编译内核并启用该选项。 - 查看内核日志确认PC组GPIO中断初始化状态:
若未找到PC组中断注册的日志,说明内核未正确枚举该组的中断控制器。dmesg | grep -i "gpio.*pc"
3. 用户空间临时验证中断可用性
先在用户空间尝试配置中断,确认硬件本身支持:
# 若未导出GPIO67,先执行导出 echo 67 > /sys/class/gpio/export # 配置下降沿触发中断 echo "falling" > /sys/class/gpio/gpio67/edge # 检查配置是否成功 cat /sys/class/gpio/gpio67/edge
如果配置成功,说明硬件支持中断,问题出在内核驱动的映射逻辑;若失败,需先解决设备树或内核配置问题。
4. 驱动中直接使用硬件中断号(临时绕过方法)
若知道PC3对应的硬件中断号,可直接跳过gpio_to_irq()调用:
- 通过
cat /proc/interrupts查找PC组对应的中断号,Allwinner H3中PC组的中断起始编号通常为64(PA组0-31,PB组32-63,PC组64-95),因此PC3的硬件中断号可尝试64+3=67(需以实际输出为准)。 - 修改驱动代码:
// 替换gpio_to_irq调用,直接使用硬件中断号 int gpio_irq = 67; // 根据/proc/interrupts结果调整 ret = request_irq(gpio_irq, sample_irq, IRQF_TRIGGER_FALLING, "flow_sensor", 0);
5. 重新编译设备树/内核
- 若修改了设备树,编译后替换到SD卡的
/boot/dtbs/目录下对应文件; - 若修改了内核配置,重新编译内核并替换镜像文件,重启后验证。
额外注意事项
- 确认PC3引脚未被其他设备占用(从
debug/gpio输出看,当前仅被你的驱动占用,无冲突); - 优先使用
devm_gpio_request_one()等内核资源管理API,避免手动资源泄漏;
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

