4.5.15. GPIO IRQ 测试
4.5.15.1. 测试原理
GPIO IRQ(中断)功能允许系统在 GPIO 引脚状态发生变化(如电平翻转)时立即触发中断处理程序,以快速响应外部事件。典型应用场景包括:
按键输入检测。
外部信号触发(如电平上升沿/下降沿)。
外设状态反馈检测(如传感器触发)。
4.5.15.2. 测试准备工作
确认硬件连接
查阅原理图,找到 GPIO 引脚,如图黄框所示:

设备树配置
在设备树中添加 gpio_keys_hobot 节点,并配置属性:
/dts-v1/; #include "x5.dtsi" #include "x5-memory.dtsi" #include "pinmux-func.dtsi" #include "pinmux-gpio.dtsi" #include <dt-bindings/input/linux-event-codes.h> #include <autoconf.h> / { #address-cells = <2>; #size-cells = <2>; gpio-keys { compatible = "gpio-keys"; autorepeat; pinctrl-names = "default"; pinctrl-0 = <&aon_gpio_2>; key-power { debounce-interval = <100>; gpios = <&aon_gpio_porta 2 GPIO_ACTIVE_LOW>; label = "GPIO Key Power"; linux,code = <KEY_WAKEUP>; wakeup-source; }; }; gpio_keys_hobot { compatible = "hobot,gpio_key"; debounce-interval = <200>; gpios = <&ls_gpio0_porta 12 GPIO_ACTIVE_LOW>; pinctrl-names = "default"; }; gua_audio_rpc_wrapper:audio-rpc-wrapper { compatible = "gua,audio-rpc-wrapper"; rpmsg-enable; status = "okay"; };
调试工具准备
cat /proc/interrupts:查看中断触发次数;
dmesg:查看驱动日志和 GPIO 电平变化;
杜邦线:用于短接 GPIO 和 GND 测试中断触发。
4.5.15.3. 测试方法
加载驱动
将编译生成的 gpio_key_drv.ko 上传到板端 /userdata 目录下,该模块用于测试 GPIO IRQ 功能,详细用法可参考文档: GPIO调试指南 中的 IRQ 功能使用章节。
执行命令加载模块:
root@buildroot:/userdata/gpio_irq_test# insmod gpio_key_drv.ko
正常打印如下:
[64581.388130] gpio_key_init: init
[64581.391774] gpio_key_probe: probe start
确认模块已加载:
lsmod
输出中应包含:
gpio_key_drv 16384 0
使用驱动测试
使用杜邦线将目标 GPIO 与 GND 相连,观察中断触发。 查看中断计数是否变化:
watch -n 1 "cat /proc/interrupts | grep gpio_keys_hobot"
示例输出:
Every 1.0s: cat /proc/interrupts | grep gpio_keys_hobot buildroot: Thu Jan 1 18:34:38 1970
77: 528 0 0 0 0 0 0 0 gpio-dwapb 12 Edge gpio_keys_hobot
查看电平变化日志:
dmesg | tail
示例输出:
[ 217.715873] gpio_key: IRQ GPIO 391 value=0
[ 218.152797] gpio_key: IRQ GPIO 391 value=1
4.5.15.4. 测试指标
驱动安装后,通过 /proc/interrupts 和 dmesg 日志监控 GPIO 中断触发情况,确保如下要求:
驱动能够稳定运行 48 小时,无内核崩溃、死锁或系统重启等异常。
/proc/interrupts 中相关中断计数正常递增;
dmesg 中能实时打印 GPIO 电平变化日志;
日志中无 fail、error、timeout 等异常关键字:
dmesg | grep -iE 'error|fail|timeout'
4.5.15.5. 测试结果
检查异常关键字:
dmesg | grep -iE 'error|fail|timeout'
输出为空,表示运行正常,无异常报错。
查看中断次数:
cat /proc/interrupts | grep gpio_keys_hobot
示例输出:
77: 28 0 0 0 0 0 0 0 gpio-dwapb 12 Edge gpio_keys_hobot
中断号 77 计数不断增加,说明中断响应正常。
查看 GPIO 电平变化:
dmesg | tail
部分输出:
[ 217.715873] gpio_key: IRQ GPIO 391 value=0
[ 218.152797] gpio_key: IRQ GPIO 391 value=1
[ 219.355553] gpio_key: IRQ GPIO 391 value=0
[ 220.439865] gpio_key: IRQ GPIO 391 value=1
...
日志连续打印电平变化,说明中断触发及时、响应准确。