zlsh00 2011-12-26
Linux 系统提供了input子系统,按键、触摸屏、键盘、鼠标等输入都可以利用input接口函数来实现设备驱动,因此,12.1~12.2节的按键和触摸屏设备驱动都可以作为input设备驱动而实现。
在Linux 内核中,input设备用input_dev 结构 体描述,使用input子系统实现输入设备驱动的时候,驱动的核心工作是向系统报告按键、触摸屏、键盘、鼠标等输入事件(event,通过input_event结构 体描述),不再需要关心文件操作接口,因为input子系统已经完成了文件操作接口。驱动报告的事件经过InputCore和 Eventhandler最终到达用户空间。
通过input子系统,具体的输入设备驱动只需要完成如下工作。
l 在模块加载函数中告知input子系统它可以报告的事件。
设备驱动通过set_bit()告诉input子系统它支持哪些事件,如下所示:
set_bit(EV_KEY, button_dev.evbit); l 在模块加载函数中注册输入设备。
注册输入设备的函数为:
int input_register_device(struct input_dev
*dev);
l 在键被按下/抬起、触摸屏被触摸/抬起/移动、鼠标被移动/单击/抬起时通过input_ report_xxx()报告发生的事件及对应的键值/坐标等状态。主要的事件类型包括EV_KEY(按键事件)、EV_REL(相对值,如光标移动,报告的是相对最后一次位置的偏移)和EV_ABS(绝对值,如触摸屏和操纵杆,它们工作在绝对坐标系统)。
用于报告EV_KEY、EV_REL和EV_ABS事件的函数分别为:
void input_report_key(struct input_dev
*dev,unsignedintcode,intvalue);
voidinput_report_rel(structinput_dev
*dev,unsignedintcode,intvalue);
voidinput_report_abs(structinput_dev
*dev,unsignedintcode,intvalue);
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);
代码清单12.28给出了一个最简单的使用input接口实现按键设备驱动的范例,它在中断服务程序中向系统报告按键及同步事件。代码清单12.28 最简单的input设备驱动
1 /*在按键中断中报告事件*/
2staticvoidbutton_interrupt(intirq,void*dummy,structpt_regs*fp)
3{
4input_report_key(&button_dev,BTN_1,inb(BUTTON_PORT)&1);
5input_sync(&button_dev);
6}
7
8staticint__initbutton_init(void)
9{
10/*申请中断*/
11if(request_irq(BUTTON_IRQ,button_interrupt,0,"button",NULL))
12{
13printk(KERN_ERR"button.c:Can'tallocateirq%d",button_irq);
14return-EBUSY;
15}
16
17button_dev.evbit[0]=BIT(EV_KEY);//支持EV_KEY事件
18button_dev.keybit[LONG(BTN_0)]=BIT(BTN_0);
19
20input_register_device(&button_dev);//注册input设备
21}
22
23staticvoid__exitbutton_exit(void)
24{
25input_unregister_device(&button_dev);//注销input设备
26free_irq(BUTTON_IRQ,button_interrupt);//释放中断
27 }本篇文章来源于:开发学院 http://edu.codepub.com 原文链接:http://edu.codepub.com/2010/0701/23935.php
<table id="table" class="table table-striped table-bordered table-hover table-nowrap" width="100%&qu