Input 子系统框架图:
Xinput设备驱动层:
将所有设备抽象成xmes、xkbd设备,上层程序(如Qt)就可以像操作普通字符设备一样操作它们。
Xinput核心处理层:
从物理设备取得输入事件,然后通过消息队列通知给xinput设备驱动层,唤醒上层应用。
物理设备层:
设备的驱动程序需要驱动工程师自己编写。通过专用的结构体传递鼠标、键盘事件给xinput子系统。
xinput 模块加载时会通过环境变量 KEYBOARD 和 MOUSE 获取当前需要关注的 input
设备名称,并注册 xinput 设备驱动、建立 xinput 设备,最终创建 xinput 最重要的 xinput_scan 线程。
xinput_scan 线程创建之后会尝试打开 xinput 模块加载时已设置的需关注的 input 设备。
若打开成功,则记录下其文件描述符 fd,作为当前需要关注的 input 设备之一。
xinput_scan 线程使用了多路 I/O 复用的 select 函数,将已打开的 input 设备文件描述符、系统热插拔设备“/dev/hotplug”文件描述符归入同一个描述符集,监听描述符集中所有描述符的状态。
矩阵键盘调试过程记录:
要想顺利将中断中的数据传到上层,要设置好以下几点————
1、环境变量三处设置
keypad要想成功上报数据,Qt相关的环境变量里就要加上xkbd。
2、select函数要在驱动的ioctl中实现。(关于select可以详看这篇文章:SylixOS字符设备驱动开发(十二) | 南京养鸡二厂)
3、实测keypad.ko要在xinput.ko之前注册。在之后注册,系统起来后没有调用到open()。
4、报上去的是对应的ASCII码,大写英文要通过大写锁定或者shift组合键完成。Press、Release操作都要将键值发送出去。
touch驱动数据流向: