本文共 2919 字,大约阅读时间需要 9 分钟。
很多纯输入设备都是用的 input 子系统input 子系统 是 驱动里面一个非常重要的概念
该系统 基于 class (class 基于 bbd 总线设备驱动模型) bbd 利用了 sysfs kobject_uevent 等等 利用了 mdev udev该系统利用了 cdev 字符设备驱动模型该系统 利用了 内核链表该系统利用了 proc该系统利用了 环形队列数据结构
input 的匹配是 device 和 handler 的匹配 这里的device 和 handler 都是驱动的一部分 device 就是所说的 input 驱动 handler 就是 input core 之上的handler ,其提供cdev (cdev 提供 file_operations)bdd 中的匹配 是 device 和 driver 的匹配 这里的device 是 dts 中的信息 这里的 driver 是驱动的一部分,就是所说的 input 驱动
/proc/bus/input/input_init->input_proc_init 中创建的input.c:1269: entry = proc_create("devices", 0, proc_bus_input_dir,input.c:1274: entry = proc_create("handlers", 0, proc_bus_input_dir,/sys/class/input/ input_register_device 中的 device_add 中创建的 /dev/input/ handler->connect 中的 device_add 中 mdev 或者 udev 通过 kobject_uevent 创建的
input 子系统代码完全在kernel 源代码中.input 子系统完全运行在内核空间用户空间 /dev/input/eventX----------------内核空间 层1 handler // 通过 input_register_handler 注册的 handler 层2 core // 提供 input_register_handler 层3 device // 通过 input_register_device 注册的 device 层1 代码 所在位置 drivers/input/evdev.c drivers/input/joydev.c drivers/input/mousedev.c 其实层1 所在代码可以在kernel 中搜索 input_register_handler 来获得 这些文件都调用了 input_register_handler层2 代码 所在位置 drivers/input/input.c 其实还有 ff-core.c input-compat.c input-mt.c层3 代码所在位置 drivers/input/gameport drivers/input/keyboard 每个文件夹表示一类设备的input驱动的集合, 每个文件都调用了 input_register_device
core 提供 device 和 handler 的注册 匹配 ,提供 device 到 handler 的数据传输 在传输过程中可以 过滤 事件 ,分发 事件 , 阻断事件. device 调用 input_register_device 注册设备 并在合适的时候上报事件的源头,上报到 corehandler 调用 input_register_handler 注册 handler handler 用来处理 bdd 中 的设备的注册, cdev(用来提供file_operations) 的注册
driver_register 是为了和 dts 中的 device 匹配 创建一个 /sys/.../ device----------------------- 下面是 input 系统比 一般 bdd 特有的 input_register_device 中的 device_add 是为了 创建 /sys/class/input/ handler->connect 中的 device_add 是为了让系统帮助 添加一个 event 设备 在 /dev/input/ 下面添加一个设备 /sys 下没变化
有原生的 应用程序可以对 input 事件监听吗
hexdump /dev/input/event0getevent /dev/input/event0
上报的是事件事件就是 type code valuesync 也是一个事件,只不过这个事件,是为了让 input core 去 发送到 handler,让handler 去唤醒 应用程序定义在 include/uapi/linux/input.h174 ... 191 event type193 ... end event code一个设备可以选择一个或多个事件类型上报给输入子系统。事件类型 如下EV_SYN 0x00 同步事件EV_KEY 0x01 按键事件EV_REL 0x02 相对坐标(如:鼠标移动,报告相对最后一次位置的偏移)EV_ABS 0x03 绝对坐标(如:触摸屏或操作杆,报告绝对的坐标位置)EV_MSC 0x04 其它EV_SW 0x05 开关EV_LED 0x11 按键/设备灯EV_SND 0x12 声音/警报EV_REP 0x14 重复EV_FF 0x15 力反馈EV_PWR 0x16 电源EV_FF_STATUS 0x17 力反馈状态EV_MAX 0x1f 事件类型最大个数和提供位掩码支持
转载地址:http://qxigi.baihongyu.com/