gpio-keys 按键驱动

本教程讲解如何在 Linux-5.4(全志 T113 等 SoC)中使用 gpio-keys 做普通按键输入。 分为两种模式:

  1. GPIO 中断模式(gpio-keys,推荐)
  2. 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