最近在做linux2.6的键盘驱动程序的工作,接触到了input subsystem这一概念,现把我对其中相关结构体的理解写出来。如果我的理解有错误,希望大家指正,谢谢!
说明:输入子系统(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)注册后,会将该链表添加到系统维护的一个链表中去,从而系统可以管理这个设备