Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15531386
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: 嵌入式

2009-07-21 20:00:15

linux2.6 input subsystem中部分相关结构体的分析
   最近在做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)注册后,会将该链表添加到系统维护的一个链表中去,从而系统可以管理这个设备

阅读(3033) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~