Linux 5.10内核MCP23008设备irq类型不匹配问题求助
解决MCP23008在Jetson Xavier NX上的中断匹配问题
问题根源分析
报错irq: type mismatch, failed to map hwirq-24 for gpio@c2f0000!核心原因是:中断触发类型与父中断控制器(gpio_aon)的支持类型不匹配,同时设备树的中断配置参数存在不合理之处。
具体修复步骤
1. 修正中断触发类型参数
MCP23008的INT引脚为开漏输出,默认低电平有效。原配置中interrupts = <28 3>的3代表IRQ_TYPE_EDGE_BOTH(双边沿触发),与硬件特性冲突,需改为以下两种合法类型之一:
- 低电平触发:
interrupts = <28 2>(2对应内核定义的IRQ_TYPE_LEVEL_LOW) - 下降沿触发:
interrupts = <28 1>(1对应内核定义的IRQ_TYPE_EDGE_FALLING)
2. 改用规范的中断父节点引用
避免使用数值<0xd>,直接用设备树标准别名&gpio_aon引用父中断控制器,避免不同内核版本下数值别名的兼容性问题:
interrupt-parent = <&gpio_aon>;
3. 添加驱动识别的中断极性属性
在设备树节点中添加microchip,irq-active-low属性,明确告知MCP23008驱动INT引脚为低电平有效,让驱动正确配置芯片内部中断逻辑:
my_input_gpios: gpio@20 { compatible = "microchip,mcp23008"; gpio-controller; #gpio-cells = <2>; reg = <0x20>; interrupt-parent = <&gpio_aon>; interrupts = <28 2>; microchip,irq-active-low; status = "okay"; };
4. 验证父GPIO控制器的中断支持
- 查找gpio_aon对应的芯片编号:
cat /sys/class/gpio/gpiochip*/label | grep aon - 检查该芯片支持的中断触发类型:
cat /sys/class/gpio/gpiochipXXX/edge(将XXX替换为查到的芯片编号)
确保选择的触发类型(如low或falling)在输出的支持列表中
验证方法
重新编译设备树并烧录到Jetson Xavier NX,加载pinctrl-mcp23s08模块后,通过dmesg确认无中断映射报错,再用libgpiod工具测试GPIO事件监听:
gpiodetect # 确认MCP23008的gpiochip被系统识别 gpiomon --num-events=1 gpiochipX Y # X为MCP23008的chip编号,Y为要监听的引脚
内容的提问来源于stack exchange,提问作者riz94107
相关产品推荐
相关产品推荐

