You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态加载设备树覆盖层时GPIO扩展器中断失效问题求助

树莓派动态加载TCA9539 GPIO扩展器设备树覆盖层时中断失效的问题与解决

问题描述

我在树莓派上搭载了TI TCA9539 GPIO扩展器,编写的设备树覆盖层如下:

// Raspberry Pi device tree overlay for TCA9539 GPIO Expander

/dts-v1/;
/plugin/;

/{
        compatible = "brcm,bcm2835";

        fragment@0 {
                target = <&i2cbus>;
                __overlay__ {
                        #address-cells = <1>;
                        #size-cells = <0>;
                        status = "okay";

                        exp1: gpio-extender@74 {
                                #address-cells = <1>;
                                compatible = "ti,tca9539";
                                reg = <0x74>;
                                interrupt-parent = <&gpio>; /* Use Pi GPIO as interrupt parent */
                                interrupts = <25 2>;        /* Use GPIO25 as interrupt pin, 2=IRQ_TYPE_EDGE_FALLING */
                                interrupt-names = "gpio-expander";
                                gpio-controller;
                                #gpio-cells = <2>;
                                interrupt-controller;
                                #interrupt-cells = <2>;
                        };
                };
        };

        frag100: fragment@100 {
                target = <&i2c_arm>;
                i2cbus: __overlay__ {
                        status = "okay";
                };
        };
};

将该覆盖层添加至/boot/firmware/config.txt启动加载时,功能完全正常:

  • 可通过gpiomon监控GPIO边沿事件
  • /proc/interrupts中存在对应中断条目:
40:          0          0          0          0  pinctrl-bcm2835  25 Edge      1-0074

但移除config.txt中的配置,改用sudo dtoverlay tca9539动态加载后,中断功能失效:

  • gpioinfo仍能识别到gpiochip2下的16个扩展GPIO
  • 运行gpiomon时报错:
gpiomon: error waiting for events: No such device
  • /proc/interrupts中无对应中断条目

解决方法

1. 提前配置中断引脚的输入模式

动态加载覆盖层时,树莓派的GPIO25可能未被设置为中断所需的输入模式(带上下拉),可手动提前配置:

gpio -g mode 25 down  # 根据硬件需求选择down(下拉)或up(上拉)

也可以在设备树覆盖层中添加引脚配置片段,实现加载时自动配置:

fragment@1 {
        target = <&gpio>;
        __overlay__ {
                gpio25_pin: gpio25-pin {
                        brcm,pins = <25>;
                        brcm,function = <0>;  // 0=输入模式
                        brcm,pull = <1>;      // 1=下拉,2=上拉,0=无上下拉
                };
        };
};

2. 修正设备树的I2C目标引用

动态加载时,&i2cbus的别名引用可能存在解析延迟,可直接将fragment@0的目标改为&i2c_arm,去掉间接映射的frag100片段:
修改后的核心片段:

fragment@0 {
        target = <&i2c_arm>;  // 直接指向i2c_arm节点
        __overlay__ {
                #address-cells = <1>;
                #size-cells = <0>;
                status = "okay";

                exp1: gpio-extender@74 {
                        // 原有配置保持不变
                };
        };
};
// 移除原有的frag100片段

3. 手动重新绑定I2C驱动

动态加载覆盖层后,强制重新绑定TCA9539的I2C驱动,触发中断注册:

echo "1-0074" > /sys/bus/i2c/drivers/tca9539/unbind
echo "1-0074" > /sys/bus/i2c/drivers/tca9539/bind

4. 查看内核日志定位问题

动态加载后通过内核日志排查中断注册失败的具体原因:

dmesg | grep -i tca9539
dmesg | grep -i interrupt

根据日志提示调整配置,比如中断引脚被占用、设备树属性错误等。

内容的提问来源于stack exchange,提问作者mattmunee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 13:22:13