linux 驱动 --- 内核自带的按键驱动(使用 input 子系统)

Linux 内核中有关于 compatible 为 gpio-keys 的驱动,该驱动位于内核源码的 drivers/input/keyboard/gpio_keys.c 文件中,是一个通用的 GPIO 按键驱动,基于 Linux 的 input 子系统实现,能够兼容几乎所有平台的按键处理流程。以下是关于 gpio-keys 驱动的详细介绍:

一、驱动特点

  1. 通用性:gpio-keys 驱动通过设备树配置按键,利用数据结构实现驱动的通用性,使得开发者在目标平台上实现按键驱动时,几乎不需要自己编写任何代码。
  2. 基于中断:该驱动对于按键的处理是基于中断的,当按键状态发生变化时,会触发中断,然后驱动通过 input 子系统将按键事件上报到应用层,供应用程序解析使用。
  3. 去抖处理:gpio-keys 驱动支持按键去抖功能,可以通过设备树配置去抖间隔,以避免按键抖动导致的误触发。

二、设备树配置

    gpio-keys {
        compatible = "gpio-keys";
        autorepeat;
        pinctrl-names = "default";
        pinctrl-0 = <&key0>, <&key1>, <&key2>;

        key_0 {
            label = "KEY 0";
            linux,code = <KEY_0>;
            gpios = <&gpio2 RK_PB2 GPIO_ACTIVE_LOW>;
       debounce-interval = <5>; }; key_1 { label
= "KEY 1"; linux,code = <KEY_1>; gpios = <&gpio2 RK_PB7 GPIO_ACTIVE_LOW>;
       debounce-interval = <5>; }; key_2 { label
= "KEY 2"; linux,code = <KEY_2>; gpios = <&gpio2 RK_PC0 GPIO_ACTIVE_LOW>;
       debounce-interval = <5>; }; };

KEY_0定义在内核代码 include\uapi\linux\input-event-codes.h

三、驱动实现原理

  1. 注册平台驱动:gpio-keys 驱动以 platform_driver 的身份注册到系统中,因此需要定义 platform_driver 结构。
  2. probe 函数:在 probe 阶段,驱动会获取设备树属性,初始化 input 设备,设置 GPIO 并注册。此外,驱动还会遍历设备树中的按键子节点,为每个按键初始化相应的数据结构,并设置中断处理函数。
  3. 中断处理:当按键状态发生变化时,会触发中断。在中断服务函数中,驱动首先会判断是否需要消抖处理。如果需要消抖,则启用定时器上报按键事件;如果不需要消抖,则直接上报按键事件。

 

posted @ 2025-06-13 10:56  流水灯  阅读(210)  评论(0)    收藏  举报