1. Linux输入子系统概述
在Linux内核中,输入子系统(Input Subsystem)负责处理所有输入设备的抽象和统一管理。无论是键盘、鼠标、触摸屏还是游戏手柄,最终都会通过输入子系统与用户空间交互。这个设计精妙的子系统已经存在了近20年,至今仍是Linux人机交互的核心基础设施。
我最早接触输入子系统是在2015年调试一款工业触摸屏时。当时发现设备能正常识别但无法上报坐标事件,经过三天排查才发现是input_register_device()调用时机不对。这段经历让我深刻认识到理解输入子系统内部机制的重要性。
输入子系统采用典型的三层架构:
- 设备驱动层:直接操作硬件,如读取GPIO状态、解析I2C数据等
- 核心层:实现input core,提供注册接口、事件处理等核心功能
- 事件层:将输入事件传递给用户空间,如/dev/input/eventX
2. 输入设备匹配机制详解
2.1 设备树匹配规则
现代Linux驱动普遍采用设备树(Device Tree)来描述硬件配置。对于输入设备,匹配过程始于设备树节点的compatible属性。例如一个I2C触摸屏的典型节点:
dts复制touchscreen@38 {
compatible = "edt,edt-ft5x06";
reg = <0x38>;
interrupt-parent = <&gpio>;
interrupts = <5 IRQ_TYPE_EDGE_FALLING>;
};
内核启动时,会遍历所有注册的input驱动,检查其of_match_table是否包含与设备树节点匹配的compatible字符串。以edt-ft5x06驱动为例:
c复制static const struct of_device_id edt_ft5x06_of_match[] = {
{ .compatible = "edt,edt-ft5x06" },
{}
};
关键点:设备树匹配优先级最高,即使驱动模块未加载,正确配置的设备树也能确保驱动被自动加载。
2.2 平台设备匹配方式
对于传统的平台设备(Platform Device),匹配主要依赖以下两种方式:
- 名称匹配:比较
