您的位置:首页 > 运维架构 > Linux

[转]linux2.6input子系统中部分相关结构体的分析

2008-04-25 14:44 507 查看
最近在做linux2.6的键盘驱动程序的工作,接触到了input subsystem这一概念,现把我对其中相关结构体的理解写出来。如果我的理解有错误,希望大家指正,谢谢!
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表示重复按键
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: