1.input_dev 说明:输入子系统(input subsystem)的驱动层的核心结构。 头文件:include/linux/input.h 成员说明: void *private; //不清楚。 char *name; //设备名字,如键盘名字。 char *phys; //设备文件节点名,如input/kbd0。 char *uniq; //全球唯一的ID号。 struct input_id id; //后文作详细介绍。 unsigned long evbit[NBITS(EV_MAX);] //该设备驱动所能支持的事件。 //EV_SYN 同步事件 //EV_KEY 键盘事件 //EV_REL 相对坐标事件,用于鼠标 //EV_ABS 绝对坐标事件,用于摇杆 //EV_MSC 其他事件 //EV_LED LED灯事件 //EV_SND 声音事件 //EV_REP 重复按键事件 //EV_FF 受力事件 //EV_PWR 电源事件 //EV_FF_STATUS 受力状态事件 unsigned long keybit[NBITS(KEY_MAX)]; //键值存放表 unsigned long relbit[NBITS(REL_MAX)]; //用于存放相对坐标值等 unsigned long absbit[NBITS(ABS_MAX)]; //用于存放绝对坐标值等 unsigned long mscbit[NBITS(MSC_MAX)]; //存放其他事件类型 unsigned long ledbit[NBITS(LED_MAX)]; //存放表示各种状态的LED值 unsigned long sndbit[NBITS(SND_MAX)]; //存放各种事件的声音 unsigned long ffbit[NBITS(FF_MAX)]; //存放受力设备的属性 int ff_effects_max; //显然与受力效果有关,具体作用还不大清楚。 unsigned int keycodemax; unsigned int keycodesize; void * keycode; //这三个不是很清楚,有点模糊理解。 unsigned int repeat_key; //存放重复按键时的键值 struct timer_list timer; //定时器 struct pm_dev *pm_dev; //考虑到有些设备可能有电源管理 struct pt_regs *regs; //不清楚 int state; //显然是表示一个状态,但不清楚具体是谁的状态 int sync; //具体用于什么也不大清楚 int abs[ABS_MAX + 1]; //显然是与绝对坐标有关的,但具体的作用不清楚。 int rep[REP_MAX + 1]; //存放重复按键时的延时,系统依靠这个延时时间来判断重复按键 //rep[0]表示开始要重复按键时的延时时间,即第1个键与第2个键(开始重复按键)之间的延时 //rep[1]此后重复按键之前的延时时间,直到按键抬起 //通俗解释就是,假如我按了一个“a”,并且一直按着,那么在显示出来的第一个a与第二个a之间的时间延时为rep[0],而此后的相邻两个a之间的延时为rep[1]
unsigned long key[NBITS(KEY_MAX)]; unsigned long led[NBITS(LED_MAX)]; unsigned long snd[NBITS(SND_MAX)]; //不知道有什么用 int absmax[ABS_MAX + 1]; int absmin[ABS_MAX + 1]; int absfuzz[ABS_MAX + 1]; int absflat[ABS_MAX + 1]; //显然与绝对坐标值有关,但不知道具体作用
int (*open)(struct input_dev *dev); void (*close)(struct input_dev *dev); int (*accept)(struct input_dev *dev, struct file *file); int (*flush)(struct input_dev *dev, struct file *file); int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value); int (*upload_effect)(struct input_dev *dev, struct ff_effect *effect); int (*erase_effect)(struct input_dev *dev, int effect_id); //底层与硬件相关的一组操作,若有具体定义,则会在input core层被调用,具体看input.c。
struct input_handle *grab; //该结构会在后文做具体介绍,这个指针用于占用输入设备用,如键盘 struct list_head h_list; struct list_head node; //h_list链表用于与input_handler相联系 //node链表:设备向输入子系统(input subsystem)注册后,会将该链表添加到系统维护的一个链表中去,从而系统可以管理这个设备
2. input_handler 说明:事件处理层(event handler)的核心结构。 头文件:include/linux/input.h 成员说明: void *private; //不清楚有什么用 void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value) struct input_handle * (*connect)(struct input_handler *handler, struct input_dev *dev, struct input_device_id *id); void (*disconnect)(struct input_handle *handle); //event handler层与input core层之间一组接口 struct file_operation *fops; //给应用程序所调用的一组接口 int minor; //不清楚有什么用 char *name; //input_handler的名字 struct input_device_id *id_table; struct input_device_id *blacklist; //该结构体是对input_id结构体的扩展,从表面上看blacklist为被系统列为黑名单的输入设备列表 struct list_head h_list; struct list_head node; //h_list链表用于与input_dev相联系 //node链表:事件处理程序向输入子系统(input subsystem)注册后,会将该链表添加到系统维护的一个链表中去,从而系统可以管理这类事件 3. input_handle 说明:是一个用于关联驱动层input_dev和事件处理层input_handler的中间结构。 头文件:include/linux/input.h 成员说明: void *private; //不知道什么作用 int open; //不知道具体作用 char *name; //input_handle的名字 struct input_dev *dev; struct input_handler *handler; //这两个就不解释了,前面都有具体介绍 struct list_head d_node; struct list_head h_node; //d_node链表用于input_dev链,h_node链表用于input_handler链,有了input_handle,就把相关dev和handler联系起来,相互能容易找到。
4. input_id 说明:输入设备的一些属性。 头文件:include/linux/input.h 成员说明: __u16 bustype; //总线类型,如BUS_PCI、BUS_USB等 __u16 vendor; //设备生产商 __u16 product; //产品名字 __u16 version; //版本号 5. input_event 说明:应用程序可通过此结构体获取输入设备事件信息,也就是说,比如在写键盘测试程序时,我们可用这个结构体,再结合ioctl系统调用来获取来自键盘的信息。 头文件:include/linux/input.h 成员说明: struct timeval time; //time是一个时间戳(timestamp),储存着事件发生时的时间记录 __u16 type; //事件的类型,如EV_KEY,则表示输入事件为键盘事件 __u16 code; //事件的代码,如果为KEY_1,则表示键盘输入为“1” __s32 value; //用于键盘时,value为0表示按键松开,value为1表示按键按下,value为2表示重复按键 (wind20) |