日期:2014-05-16  浏览次数:20637 次

深层次分析linux2.6input子系统

在linux下,按键、触摸屏、鼠标等都可以利用input接口函数来实现设备驱动。

 

 

从上图可知:

输入子系统由三部分构成:

1 驱动

2 输入子系统

3 处理函数

其中2,3都是内核已经完成,我们要完成的就是1驱动

设备用input_dev结构体描述,使用input子系统实现输入设备驱动的时候,驱动的核心工作是向系统报告按键、触摸屏、键盘、鼠标等输入事件(event,通过input_event结构体描述),不再需要关心文件操作接口,因为input子系统已经完成了文件操作接口。驱动报告的事件经过InputCoreEventhandler最终到达用户空间。

Input_dev 结构中比较重要的域有:

Name:名字

Evbit:设备所支持的事件类型

Keybit:按键类型

注册输入设备的函数为:

int input_register_device(struct input_dev *dev)

注销输入设备的函数为:

void input_unregister_device(struct input_dev *dev)

设备所支持的事件类型有:

EV_RST Reset EV_KEY 按键

EV_REL 相对坐标EV_ABS绝对坐标

EV_MSC 其它EV_LED LED

EV_SND 声音EV_REP Repeat

EV_FF 力反馈

使用set_bit(EV_KEY, button_dev.evbit)告知结构体支持哪种设备类型

用于报告EV_KEYEV_RELEV_ABS事件的函数分别为:

void input_report_key(struct input_dev *dev,unsigned int code, int value)

void input_report_rel(struct input_dev *dev,unsigned int code, int value)

void input_report_abs(struct input_dev *dev,unsigned int code, int value)

code

事件的代码。如果事件的类型是EV_KEY,该代码code为设备键盘代码。代码值0~127为键盘上的按键代码,0x110~0x116为鼠标上按键代码,其中0x110(BTN_LEFT)