您所在的位置:读书频道 > 操作系统 > Linux > 12.2.9 Linux输入子系统

12.2.9 Linux输入子系统

2008-03-10 13:26 宋宝华 编著 人民邮电出版社 字号:T | T
一键收藏,随时查看,分享好友!

《Linux设备驱动开发详解》本书全面而详细地讲解了Linux设备驱动开发中涉及的理论以及多种设备驱动的框架。第12章将分析5个典型的字符设备驱动,在这些驱动中,将灵活地运用到前面各章所讲解的内容。本文写的是Linux输入子系统。

AD:

12.2.9  Linux输入子系统

12.1及12.2.1~12.2.8节分别讲解按键与触摸屏的设备驱动,实际上,在Linux系统中,一种更值得推荐的实现这类设备驱动的方法是利用input子系统。

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, 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);

代码清单12.28给出了一个最简单的使用input接口实现按键设备驱动的范例,它在中断服务程序中向系统报告按键及同步事件。

代码清单12.28 最简单的input设备驱动

1  /*在按键中断中报告事件*/
2  static void button_interrupt(int irq, void *dummy, struct pt_regs *fp)
3  {
4    input_report_key(&button_dev, BTN_1, inb(BUTTON_PORT) &1);
5    input_sync(&button_dev);
6  }
7  
8  static int _ _init button_init(void)
9  {
10   /*申请中断*/
11   if (request_irq(BUTTON_IRQ, button_interrupt, 0, "button", NULL))
12   {
13     printk(KERN_ERR "button.c: Can't allocate irq %d\n", button_irq);
14     return  - EBUSY;
15   }
16 
17   button_dev.evbit[0] = BIT(EV_KEY);    //支持EV_KEY事件
18   button_dev.keybit[LONG(BTN_0)] = BIT(BTN_0);
19 
20   input_register_device(&button_dev);   //注册input设备
21 }
22 
23 static void _ _exit button_exit(void)
24 {
25   input_unregister_device(&button_dev);   //注销input设备
26   free_irq(BUTTON_IRQ, button_interrupt); //释放中断
27 } 

【责任编辑:董书 TEL:(010)68476606】

回书目   上一节   下一节

分享到:

关于Linux  设备  驱动  cdev  Linux设备驱动开发详解的更多文章

  1. Linux服务器配置全程实录
  2. 揭秘--优秀PPT这样制作

热点职位

更多>>

热点专题

更多>>

读书

J2EE开发全程实录
J2EE是目前企业级软件开发的首选平台。本书从架构的角度讲解了一个完整的J2EE系统的搭建。内容包括:正则表达式、JSP、Swing、XM

51CTO旗下网站

领先的IT技术网站 51CTO 中国首个CIO网站 CIOage 中国首家数字医疗网站 HC3i 51CTO学院