1.Linux Input子系统简介
Input子系统是对输入设备的抽象。人机交互的输入设备复杂多样,包括鼠标、键盘、按键、触摸屏、摇杆、麦克风等,在linux设备模型下,这些设备都是字符设备。繁杂的设备给开发带来了巨大工作量,为了简化设备驱动开发,linux将这些设备共性抽象出来,建立了Input子系统。
Linux 下input设备上报数据采用type code value的形式。
设备驱动层(Input Driver)主要实现对硬件设备的读写访问,中断设置,并把硬件产生的事件按照核心层定义的规范提交给核心层。
核心层(Input Core)负责连接驱动层和事件处理层,为设备驱动层提供了规范和接口。设备驱动层只要关心如何驱动硬件并获得硬件数据(例如按键数据、触摸屏坐标数据),然后调用核心层提供的接口,核心层会自动把数据提交给事件处理层。设备驱动(input driver)和处理程序(handler)的注册需要通过核心层来完成,核心层接收来自驱动层的数据信息,并将数据信息选择对应的handler去处理
事件处理层(EventHandler)生成用户空间访问的接口(设备节点),并处理core层提交的数据并且缓存,等待用户空间读取,三者结构见下图:
2.Input 子系统数据
任何程序,核心都是数据的传递和控制,因此,如果想要弄清楚一个模块,必须把其主要结构体弄清楚,input 子系统所涉及的数据结构如下:
1.input_dev结构体
其中,input_dev是硬件驱动层,代表一个input设备,通过全局的input_dev_list链接在一起,在驱动设备注册的时候,通过input_register_devcie接口实现。上图省略了input_dev
一些比较重要字段,主要是此设备支持的type和code类型,现列出如下:
unsigned longevbit[BITS_TO_LONGS(EV_CNT)]; //事件支持的类型,是type,code,value中的type
unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];//按键 位图,是code值。
unsigned longrelbit[BITS_TO_LONGS(REL_CNT)]; //相对坐标,属于code值。
unsigned longabsbit[BITS_TO_LONGS(ABS_CNT)];//绝对坐标,其中触摸屏驱动使用的就是这个
unsigned longmscbit[BITS_TO_LONGS(MSC_CNT)];
unsigned longledbit[BITS_TO_LONGS(LED_CNT)];
unsigned longsndbit[BITS_TO_LONGS(SND_CNT)];
unsigned longffbit[BITS_TO_LONGS(FF_CNT)];</