1. 课程导论:GPIO按键驱动在嵌入式Linux中的地位,设备树与input子系统的作用,课程学习目标与前置知识

1.1 GPIO按键驱动:嵌入式交互的基石

在嵌入式Linux系统中,GPIO(通用输入输出)按键是最基础、最广泛的人机交互方式。从消费电子(智能音箱、机顶盒)到工业控制(手持终端、HMI面板),GPIO按键承担着唤醒系统、模式切换、功能确认等关键任务。一个稳定、低延迟、防抖的按键驱动,直接影响用户体验和系统可靠性。

核心地位体现:
  • 系统唤醒源:多数嵌入式设备的电源键、Home键通过GPIO中断唤醒休眠的SoC。
  • 用户态与内核态桥梁:按键事件通过input子系统上报给应用层,是典型的“硬件中断 → 内核驱动 → 用户空间”数据流。
  • 驱动开发入门范例:GPIO按键驱动涉及中断、定时器、设备树、input子系统等核心概念,是学习复杂驱动的理想起点。
行业数据:在主流嵌入式Linux BSP中,约70%的评估板默认启用gpio-keys驱动,其代码量仅约800行,却完整覆盖了中断处理、防抖、input事件上报等关键机制。

1.2 设备树:硬件描述的标准化语言

设备树(Device Tree)是一种描述硬件资源的数据结构,用于将板级硬件信息从Linux内核源码中解耦。在GPIO按键场景中,设备树负责声明按键的GPIO引脚、中断触发方式、按键编码(Key Code)等参数。

设备树在GPIO按键驱动中的角色 / (根节点) soc chosen gpio-keys gpio-controller key-power 属性示例:gpios = &gpio1 3 GPIO_ACTIVE_LOW; linux,code = <KEY_POWER>;
设备树关键属性与驱动对应关系
设备树属性 含义 驱动解析函数
gpios 指定GPIO控制器、引脚号、有效电平 of_get_named_gpio_flags()
linux,code 按键上报的Linux输入事件编码 of_property_read_u32()
interrupts 指定中断控制器、中断号、触发方式 of_irq_get()
debounce-interval 硬件防抖时间(毫秒) of_property_read_u32()

1.3 input子系统:统一输入事件的分发中心

Linux input子系统为所有输入设备(按键、触摸屏、鼠标、游戏杆)提供了统一的驱动框架和用户空间接口。GPIO按键驱动通过input子系统将按键事件(按下/释放)上报给系统,应用层通过/dev/input/eventX读取标准化的事件结构。

input子系统三层架构 硬件设备层 GPIO按键 / 触摸屏 / 鼠标 核心层 (Input Core) 事件分发 / 设备注册 事件处理层 evdev / joydev / mousedev 数据流:GPIO中断 → 驱动中断处理 → input_report_key() → 核心层 → evdev → /dev/input/eventX 用户空间应用 (read / poll / select)
关键API:GPIO按键驱动通过 input_allocate_device() 分配input设备,使用 input_set_capability() 设置按键类型,最后通过 input_register_device() 注册到核心层。事件上报使用 input_report_key() 和 input_sync()。

1.4 课程学习目标

通过本课程,你将掌握从硬件设备树描述到内核驱动实现、再到用户空间验证的完整GPIO按键驱动开发流程。

学习模块 具体目标 实践产出
设备树基础 理解设备树语法,掌握GPIO按键节点编写 编写完整的gpio-keys设备树节点
驱动框架 掌握platform驱动模型,理解probe/remove流程 实现按键驱动的probe函数
中断与防抖 掌握中断申请、底半部机制、定时器防抖 实现按键消抖与长按检测
input子系统 掌握input设备注册与事件上报 实现按键事件上报与同步
调试与验证 掌握devicetree overlay、evtest、sysfs调试 使用evtest验证按键事件

1.5 前置知识要求

重要提示:本课程面向有一定嵌入式Linux基础的开发者。如果以下前置知识存在短板,建议先补充相关基础。
  • C语言编程:熟练使用指针、结构体、回调函数、链表操作。
  • Linux内核基础:理解内核模块编译、加载/卸载流程,熟悉printk调试。
  • GPIO硬件基础:了解GPIO输入/输出模式、上拉/下拉电阻、电平触发与边沿触发。
  • 中断概念:理解中断上下文、顶半部/底半部、中断共享与嵌套。
  • 设备树基础:了解设备树语法、节点/属性、compatible匹配机制。
  • 开发环境:具备交叉编译工具链、内核源码树、目标板(如QEMU模拟的vexpress或真实ARM板)。
推荐学习路径:
  1. 阅读《Linux设备驱动程序》第三版第10章(中断处理)和第15章(输入子系统)。
  2. 熟悉内核源码 Documentation/devicetree/bindings/input/gpio-keys.txt。
  3. 在QEMU上搭建vexpress-a9开发环境,用于后续实验验证。

1.6 课程路线图

课程章节路线图 设备树节点 platform驱动 中断处理 防抖机制 input上报 最终目标:从零实现一个完整的gpio-keys驱动,支持防抖、长按、多按键、设备树匹配 并在目标板上使用evtest验证按键事件

本课程共30章,从设备树语法开始,逐步深入到驱动框架、中断处理、防抖算法、input子系统集成,最后通过实战项目完成一个完整的GPIO按键驱动。每一章都配有可运行的代码示例和实验步骤,确保理论与实践紧密结合。