Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1319794
  • 博文数量: 168
  • 博客积分: 2124
  • 博客等级: 大尉
  • 技术积分: 2590
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-16 23:51
文章分类

全部博文(168)

文章存档

2014年(6)

2013年(74)

2012年(71)

2011年(17)

分类: LINUX

2012-08-14 08:27:39

转自http://blog.csdn.net/zhenwenxian/article/details/6064234

Linux输入子系统

按键与触摸屏的设备驱动,在Linux系统中实现这类设备驱动的方法是利用input子系统。

Linux系统提供了input子系统,按键、触摸屏、键盘、鼠标等输入都可以利用input接口函数来实现设备驱动,按键和触摸屏设备驱动都可以作为input设备驱动而实现。

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

输入子系统支持的事件类型在文件 
kernel/include/linux/input.h 中定义:

 event 还定义了标准按键的编码等


 

 

通过input子系统,具体的输入设备驱动只需要完成如下工作。

在模块加载函数中告知input子系统它可以报告的事件。

设备驱动通过set_bit()告诉input子系统它支持哪些事件,如下所示:

set_bit(EV_KEY, button_dev.evbit);

在模块加载函数中注册输入设备。

注册输入设备的函数为:

int input_register_device(struct input_dev *dev);

在键被按下/抬起、触摸屏被触摸/抬起/移动、鼠标被移动/单击/抬起时通过input_ report_xxx()报告发生的事件及对应的键值/坐标等状态。

主要的事件类型包括EV_KEY(按键事件)、EV_REL(相对值,如光标移动,报告的是相对最后一次位置的偏移)和EV_ABS(绝对值,如触摸屏和操纵杆,它们工作在绝对坐标系统)。

用于报告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);

input_sync()用于事件同步,它告知事件的接收者驱动已经发出了一个完整的报告。

例如,在触摸屏设备驱动中,一次坐标及按下状态的整个报告过程如下:

input_report_abs(input_dev, ABS_X, x);  //X坐标

input_report_abs(input_dev, ABS_Y, y);   //Y坐标

input_report_abs(input_dev, ABS_PRESSURE, pres); //压力

input_sync(input_dev);  //同步

在模块卸载函数中注销输入设备。注销输入设备的函数为:

void input_unregister_device(struct input_dev *dev);

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