linux 驱动 --- 内核自带的按键驱动(使用 input 子系统)
Linux 内核中有关于 compatible 为 gpio-keys 的驱动,该驱动位于内核源码的 drivers/input/keyboard/gpio_keys.c 文件中,是一个通用的 GPIO 按键驱动,基于 Linux 的 input 子系统实现,能够兼容几乎所有平台的按键处理流程。以下是关于 gpio-keys 驱动的详细介绍:
一、驱动特点
- 通用性:gpio-keys 驱动通过设备树配置按键,利用数据结构实现驱动的通用性,使得开发者在目标平台上实现按键驱动时,几乎不需要自己编写任何代码。
- 基于中断:该驱动对于按键的处理是基于中断的,当按键状态发生变化时,会触发中断,然后驱动通过 input 子系统将按键事件上报到应用层,供应用程序解析使用。
- 去抖处理: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
三、驱动实现原理
- 注册平台驱动:gpio-keys 驱动以
platform_driver的身份注册到系统中,因此需要定义platform_driver结构。 - probe 函数:在 probe 阶段,驱动会获取设备树属性,初始化 input 设备,设置 GPIO 并注册。此外,驱动还会遍历设备树中的按键子节点,为每个按键初始化相应的数据结构,并设置中断处理函数。
- 中断处理:当按键状态发生变化时,会触发中断。在中断服务函数中,驱动首先会判断是否需要消抖处理。如果需要消抖,则启用定时器上报按键事件;如果不需要消抖,则直接上报按键事件。

浙公网安备 33010602011771号