输入设备都有共性:中断驱动 字符IO,基于分层的思想,Linux内核将这些设备的公有的部分提取出来,基于cdev提供接口,设计了输入子系统,所有使用输入子系统构建的设备都使用主设备号13,同时输入子系统也支持自动创建设备文件,这些文件采用阻塞的IO读写方式,被创建在"/dev/input/"下。如下图所示。内核中的输入子系统自底向上分为设备驱动层,输入核心层,事件处理层。由于每种输入的设备上报的事件都各有不同,所以为了应用层能够很好识别上报的事件,内核中也为应用层封装了标准的接口来描述一个事件,这些接口在"/include/upai/linux/input"中。
设备驱动层是具体硬件相关的实现,也是驱动开发中主要完成的部分,
输入核心层主要提供一些API供设备驱动层调用,通过这些API设备驱动层上报的数据就可以传递到事件处理层,
事件处理层负责创建设备文件以及将上报的事件传递到用户空间,
input的使用
input对象描述了一个输入设备,包括它可能上报的事件,这些事件使用位图来描述,内核提供的相应的工具帮助我们构建一个input对象,大家可以参考内核文档"Documentation/input/input-programming.txt",里面对于input子系统的使用有详细的描述。
/struct input_dev { 122 const char *name; 129 unsigned long evbit[BITS_TO_LONGS(EV_CNT)]; 130 unsigned long keybit[BITS_TO_LONGS(KEY_CNT)]; 131 unsigned long relbit[BITS_TO_LONGS(REL_CNT)]; 132 unsigned long absbit[BITS_TO_LONGS(ABS_CNT)]; 133 unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)]; 134 unsigned long ledbit[BITS_TO_LONGS(LED_CNT)]; 135 unsigned long sndbit[BITS_TO_LONGS(SND_CNT)]; 136 unsigned long ffbit[BITS_TO_LONGS(FF_CNT)]; 137 unsigned long swbit[BITS_TO_LONGS(SW_CNT)]; 155 162 unsigned long key[BITS_TO_LONGS(KEY_CNT)]; 163 unsigned long led[BITS_TO_LONGS(LED_CNT)]; 164 unsigned long snd[BITS_TO_LONGS(SND_CNT)]; 165 unsigned long sw[BITS_TO_LONGS(SW_CNT)]; 166 172 struct input_handle __rcu *grab; 179 180 struct device dev; 181 182 struct list_head h_list; 183 struct list_head node; 190 };
struct input_dev --122--
|