4.5.15. GPIO IRQ 测试

4.5.15.1. 测试原理

GPIO IRQ(中断)功能允许系统在 GPIO 引脚状态发生变化(如电平翻转)时立即触发中断处理程序,以快速响应外部事件。典型应用场景包括:

  • 按键输入检测。

  • 外部信号触发(如电平上升沿/下降沿)。

  • 外设状态反馈检测(如传感器触发)。

4.5.15.2. 测试准备工作

  1. 确认硬件连接

    • 查阅原理图,找到 GPIO 引脚,如图黄框所示:

    image-20240313201614942

  2. 设备树配置

    • 在设备树中添加 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";
     	};
    
  3. 调试工具准备

    • 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/interruptsdmesg 日志监控 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
...

日志连续打印电平变化,说明中断触发及时、响应准确。