Linux对内核功能进行了一些归类,分别是内核子系统(Core subsystems)、人机接口(Human interfaces)、网络接口(Networking interfaces)、存储接口(Storage interfaces)、以及其他子系统(Other subsystems)。本文主要讲输入子系统,其他的不做过多介绍,后续或许会对涉及的相关内容进行分析、学习,敬请关注。 输入子系统(Input subsystem)属于Linux的内核子系统的一部分,在Linux文档中的被归类为子系统的人机接口(Human interfaces)模块。 人机接口设备(Human Interface Devices,即HID))就是用于人类用户与计算机进行交互的硬件设备,常见的可操作设备例如:鼠标、按键、遥控杆、键盘、触控屏等等都属于人机接口设备,包括后续的USB、蓝牙大部都遵循USB-IF(一个非营利的USB协议实施组织-https://www.usb.org/) HID协议标准。
人机接口-输入子系统(Human interfaces -> Input subsystem)是Linux内核中用于支持所有输入设备的驱动程序集合。这些驱动程序大部分位于drivers/input 目录下,但也有相当数量的驱动存放在 drivers/hid(人机接口设备)和 drivers/platform(平台相关设备)目录中。 输入子系统的核心是input内核模块,该模块必须在其他任何输入模块之前加载——它充当着两组模块之间的通信桥梁。 HID子系统位于更底层,负责硬件协议的解码。它的任务是把不同厂商、不同设备的私有数据格式,“翻译”成内核能理解的、标准化的输入事件。 Input子系统位于HID之上,负责接收并分发这些标准化的事件。它为所有输入设备(不仅是HID,还包括PS/2、触摸屏等)提供了一个统一的上层接口。人机接口设备(HID)在Linux中不仅仅指我们日常使用的键鼠等硬件,更对应着一个成熟、高效的内核HID子系统。该子系统通过标准化协议,极大简化了输入设备的驱动支持,使得绝大多数标准设备能够“即插即用”,是嵌入式Linux系统中实现用户交互的基石技术。顾名思义,它主要包含了“人”与“机”之间的“接口”。简单来说,就是人对设备进行一些操作,人机接口模块将人的操作进行逐层反馈(人操作->硬件层->内核层->应用层),最终应用层接收并处理这些操作,从而达到操作人预期的结果。
框架结构参考见下图,Linux系统中“输入子系统”的工作原理,就像一个从手指按键到电脑反应的“传送带”。最上面是数据结构(struct input_event),记录事件的时间、类型(如按键或移动)、事件代码和数值,确保信息标准化。用户层应用程序程序右侧有对应的代码示例:程序打开设备文件(如/dev/input/eventX),循环读取事件,然后根据类型打印“按键按下”或“鼠标移动”等。
核心是流程层:从用户层开始,经过事件处理器(Event Handlers)缓冲数据,到输入核心(Input Core)协调一切,再到驱动层(如HID处理USB键盘,平台驱动管GPIO按钮),最后连接硬件接口(USB、I²C、ADC、GPIO)和设备(键盘、鼠标、按钮)。整体上,框图像一张“地图”,可以快速理解Linux怎么处理按键和触摸等HID外设。
外设->中断/通信->驱动->input core->Event Handler->分发到APP文件:include/uapi/linux/input.h- 输入设备(input_dev)驱动示例
文件:drivers/input/keyboard/adc-keys.c
- 查看输入事件类型
文件:include/uapi/linux/input-event-codes.h
按键code:
其他驱动通过platform总线方式搭配注册input event 设备驱动来上达到报硬件数据的需求!!!
gpio-keys
gpio dev->gpio drv->input dev->input drv
I2C_bus_type
i2c dev->i2c drv->input dev->input drv
等各种其他platform方式上报input事件大致实现原理也是一样
- 查看input设备相关符号链接 ls /dev/input/by-path/ -l-查看所有input设备详细信息 cat /proc/bus/input/devices- 读取屏幕信息 hexdump /dev/input/event2 通过同一套内核子系统输入子系统框架,驱动和应用层的开发得到了极大的简化,一套应用层API接口即可操作种类繁多的人机接口设备(HID)。1.直接从设备文件读取 /dev/input/event*2.tslib、libinput库简介访问读取(方便开发)
- 输入事件(struct input_event)cat /proc/bus/input/devices 发现一个可测试的设备
/proc/bus/input/devices:查看已连接的输入设备列表。evtest:一个强大的命令行工具,可以直接从输入设备读取并显示原始事件,是调试HID设备输入问题的利器。hidraw:提供了一个原始的HID数据接口,用于高级调试或与设备进行双向通信。
hexdump /dev/input/event0