linux系统中,input输入子系统驱动主要可以分为:设备驱动层、input core层和input handler事件处理层。
设备驱动层提供具体用户设备驱动,由struct input-dev 结构表示,input_register_device来注册。
input handler事件处理层 主要和用户空间交互
input core 层负责管理系统中的input dev设备和inputhander事件处理,并起到承上启下作用,负责输入设备驱动和input handler之间信息传输
input子系统结构如图:
主要分为两部分:设备驱动层的注册、handler的注册,在注册的过程中会有handle的创建以及它的作用,会说明设备驱动与handler是如何匹配的
设备驱动层的注册
注册一个input设备主要是对input_register_device的分析
1、 input_dev结构
struct input_dev {
const char *name; /*设备名*/
struct input_id id; /*id号,用于匹配事件处理层handler*/
unsigned longevbit[BITS_TO_LONGS(EV_CNT)]; /*用于记录支持的事件类型的位图*/
unsigned longkeybit[BITS_TO_LONGS(KEY_CNT)]; /*记录支持的按键值的位图*/
unsigned longrelbit[BITS_TO_LONGS(REL_CNT)]; /*记录支持的相对坐标的位图 */
unsigned longabsbit[BITS_TO_LONGS(ABS_CNT)]; /*记录支持的绝对坐标的位图 */
unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];
unsigned longledbit[BITS_TO_LONGS(LED_CNT)]; /*led */
unsigned longsndbit[BITS_TO_LONGS(SND_CNT)]; /*beep*/
unsigned int keycodemax; /*支持的按键值的个数*/
unsigned int keycodesize; /*每个键值的字节数 */
void *keycode; /*存储按键值的数组首地址*/
int (*setkeycode)(structinput_dev *dev, const struct input_keymap_entry *ke,
unsigned int *old_keycode); /* 修改键值的函数,可选 */
int (*getkeycode)(structinput_dev *dev,
struct input_keymap_entry *ke); /* 获取扫描码的键值,可选 */
unsigned int repeat_key;