gpio-keys 按键驱动
本教程讲解如何在 Linux-5.4(全志 T113 等 SoC)中使用 gpio-keys 做普通按键输入。 分为两种模式:
- GPIO 中断模式(gpio-keys,推荐)
- GPIO 轮询模式(gpio-keys-polled)
一、GPIO 中断模式(推荐)
使用 GPIO 外部中断触发,延迟低,支持休眠唤醒。
1. 内核配置(interrupt-key)
内核 menuconfig 路径:
Device Drivers
└─ Input device support
└─ Keyboards
└─ GPIO Button
需要确保以下内核选项为 y:
CONFIG_KEYBOARD_GPIO=y
2. 设备树配置(interrupt-key)
Linux-5.4 的 gpio-keys 不需要 interrupts = <>,仅需 gpios 即可触发中断。
gpio-keys {
compatible = "gpio-keys";
status = "okay";
key_pe0 {
label = "key_pe0";
gpios = <&pio 4 0 GPIO_ACTIVE_LOW>;
linux,code = <143>;
debounce-interval = <10>;
wakeup-source;
};
key_pe1 {
label = "key_pe1";
gpios = <&pio 4 1 GPIO_ACTIVE_LOW>;
linux,code = <2>;
debounce-interval = <10>;
wakeup-source;
};
key_pe8 {
label = "key_pe8";
gpios = <&pio 4 8 GPIO_ACTIVE_LOW>;
linux,code = <3>;
debounce-interval = <10>;
wakeup-source;
};
key_pe9 {
label = "key_pe9";
gpios = <&pio 4 9 GPIO_ACTIVE_LOW>;
linux,code = <4>;
debounce-interval = <10>;
wakeup-source;
};
};
字段说明:
| 字段 | 说明 |
|---|---|
| gpios | GPIO pin |
| linux,code | input 键值 |
| debounce-interval | 消抖(us) |
| wakeup-source | 可作为系统唤醒源 |
3. 测试方法
3.1 查看是否识别为输入设备
cat /proc/bus/input/devices
3.2 查看事件
hexdump /dev/input/event3
按下按键时会有十六进制数据打印。
二、GPIO 轮询模式(gpio-keys-polled)
硬件 GPIO 不能产生中断时使用。
1. 内核配置(poll-key)
menuconfig:
Device Drivers
└─ Input device support
└─ Keyboards
└─ Polled GPIO buttons
对应内核配置:
CONFIG_KEYBOARD_GPIO_POLLED=y
2. 设备树配置(poll-key)
gpio-keys {
compatible = "gpio-keys-polled";
poll-interval = <20>;
status = "okay";
key_pe1 {
label = "poll-key-pe1";
gpios = <&pio 4 1 GPIO_ACTIVE_LOW>;
linux,code = <113>;
debounce-interval = <10>;
wakeup-source;
};
};
字段说明:
| 字段 | 说明 |
|---|---|
| compatible="gpio-keys-polled" | 轮询驱动 |
| poll-interval | 轮询周期(ms) |
3. 测试方法
查看设备:
cat /proc/bus/input/devices
查看事件:
hexdump /dev/input/event3