# GPIO IRQ 测试 <span id="gpio-irq"/>

## 测试原理

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

- 按键输入检测。
- 外部信号触发（如电平上升沿/下降沿）。
- 外设状态反馈检测（如传感器触发）。

## 测试准备工作

1. 确认硬件连接

   - 查阅原理图，找到 GPIO 引脚，如图黄框所示：

   ![image-20240313201614942](./_static/_images/11-gpio_irq/gpio_irq.png)

2. 设备树配置

   - 在设备树中添加 gpio_keys_hobot 节点，并配置属性：

   ```sh
	/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 测试中断触发。

## 测试方法

### 加载驱动

将编译生成的 `gpio_key_drv.ko` 上传到板端 `/userdata` 目录下，该模块用于测试 GPIO IRQ 功能，详细用法可参考文档： [GPIO调试指南](../driver_develop_guide/10-GPIO_Debug_Guide_zh_CN.html#span-id-gpio-irq-use-gpio-irq) 中的 IRQ 功能使用章节。

执行命令加载模块：

```sh
root@buildroot:/userdata/gpio_irq_test# insmod gpio_key_drv.ko
```

正常打印如下：

```sh
[64581.388130] gpio_key_init: init
[64581.391774] gpio_key_probe: probe start
```

确认模块已加载：

```sh
lsmod
```

输出中应包含：

```sh
gpio_key_drv           16384  0
```

### 使用驱动测试

使用杜邦线将目标 GPIO 与 GND 相连，观察中断触发。
查看中断计数是否变化：

```sh
watch -n 1 "cat /proc/interrupts | grep gpio_keys_hobot"
```

示例输出：

```sh
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
```

查看电平变化日志：

```sh
dmesg | tail
```

示例输出：

```sh
[  217.715873] gpio_key: IRQ GPIO 391 value=0
[  218.152797] gpio_key: IRQ GPIO 391 value=1
```

## 测试指标

驱动安装后，通过 `/proc/interrupts` 和 `dmesg` 日志监控 GPIO 中断触发情况，确保如下要求：

- 驱动能够稳定运行 48 小时，无内核崩溃、死锁或系统重启等异常。
- /proc/interrupts 中相关中断计数正常递增；
- dmesg 中能实时打印 GPIO 电平变化日志；
- 日志中无 fail、error、timeout 等异常关键字：

  ```sh
  dmesg | grep -iE 'error|fail|timeout'
  ```

## 测试结果

- 检查异常关键字：

```sh
dmesg | grep -iE 'error|fail|timeout'
```

输出为空，表示运行正常，无异常报错。

- 查看中断次数：

```sh
cat /proc/interrupts | grep gpio_keys_hobot
```

示例输出：

```sh
 77:       28          0          0          0          0          0          0          0  gpio-dwapb  12 Edge      gpio_keys_hobot
```

中断号 77 计数不断增加，说明中断响应正常。

- 查看 GPIO 电平变化:

```sh
dmesg | tail
```

部分输出：

```sh
[  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
...
```

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