动态加载设备树覆盖层时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
相关产品推荐
相关产品推荐

