预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共33页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Linux设备模型之input子系统详解(2011-10-1708:56)标签:模型设备Linuxinput分类:设备驱动------------------------------------------本文系本站原创,欢迎转载!转载请注明出处:http://ericxiao.cublog.cn/------------------------------------------一:前言在键盘驱动代码分析的笔记中,接触到了input子系统.键盘驱动,键盘驱动将检测到的所有按键都上报给了input子系统。Input子系统是所有I/O设备驱动的中间层,为上层提供了一个统一的界面。例如,在终端系统中,我们不需要去管有多少个键盘,多少个鼠标。它只要从input子系统中去取对应的事件(按键,鼠标移位等)就可以了。今天就对input子系统做一个详尽的分析.下面的代码是基于linuxkernel2.6.25.分析的代码主要位于kernel2.6.25/drivers/input下面.二:使用input子系统的例子在内核自带的文档Documentation/input/input-programming.txt中。有一个使用input子系统的例子,并附带相应的说明。以此为例分析如下:#include<linux/input.h>#include<linux/module.h>#include<linux/init.h>#include<asm/irq.h>#include<asm/io.h>staticvoidbutton_interrupt(intirq,void*dummy,structpt_regs*fp){input_report_key(&button_dev,BTN_1,inb(BUTTON_PORT)&1);input_sync(&button_dev);}staticint__initbutton_init(void){if(request_irq(BUTTON_IRQ,button_interrupt,0,"button",NULL)){printk(KERN_ERR"button.c:Can'tallocateirq%d\n",button_irq);return-EBUSY;}button_dev.evbit[0]=BIT(EV_KEY);button_dev.keybit[LONG(BTN_0)]=BIT(BTN_0);input_register_device(&button_dev);}staticvoid__exitbutton_exit(void){input_unregister_device(&button_dev);free_irq(BUTTON_IRQ,button_interrupt);}module_init(button_init);module_exit(button_exit);这个示例module代码还是比较简单,在初始化函数里注册了一个中断处理例程。然后注册了一个inputdevice.在中断处理程序里,将接收到的按键上报给input子系统。文档的作者在之后的分析里又对这个module作了优化。主要是在注册中断处理的时序上。在修改过后的代码里,为inputdevice定义了open函数,在open的时候再去注册中断处理例程。具体的信息请自行参考这篇文档。在资料缺乏的情况下,kernel自带的文档就是剖析kernel相关知识的最好资料.文档的作者还分析了几个api函数。列举如下:1):set_bit(EV_KEY,button_dev.evbit);set_bit(BTN_0,button_dev.keybit);分别用来设置设备所产生的事件以及上报的按键值。Structiput_dev中有两个成员,一个是evbit.一个是keybit.分别用表示设备所支持的动作和按键类型。2):input_register_device(&button_dev);用来注册一个inputdevice.3):input_report_key()用于给上层上报一个按键动作4):input_sync()用来告诉上层,本次的事件已经完成了.5):NBITS(x)-returnsthelengthofabitfieldarrayinlongsforxbitsLONG(x)-returnstheindexinthearrayinlongsforbitxBIT(x)-returnstheindexinalongforbitx这几个宏在input子系统中经常用到。上面的英文解释已经很清楚了。三:input设备注册分析.Input设备注册的接口为:input_register_device()。代码如下:intinput_