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

在线预览结束,喜欢就下载吧,查找使用更方便

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

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

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

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

linux内核input子系统解析华清远见刘洪涛Android、Xwindows、qt等众多应用对于linux系统中键盘、鼠标、触摸屏等输入设备的支持都通过、或越来越倾向于标准的input输入子系统。因为input子系统已经完成了字符驱动的文件操作接口,所以编写驱动的核心工作是完成input系统留出的接口,工作量不大。但如果你想更灵活的应用它,就需要好好的分析下input子系统了。一、input输入子系统框架下图是input输入子系统框架,输入子系统由输入子系统核心层(InputCore),驱动层和事件处理层(EventHandler)三部份组成。一个输入事件,如鼠标移动,键盘按键按下,joystick的移动等等通过inputdriver->Inputcore->Eventhandler->userspace到达用户空间传给应用程序。注意:keyboard.c不会在/dev/input下产生节点,而是作为ttyn终端(不包括串口终端)的输入。二、Inputdriver编写要点1、分配、注册、注销input设备structinput_dev*input_allocate_device(void)intinput_register_device(structinput_dev*dev)voidinput_unregister_device(structinput_dev*dev)2、设置input设备支持的事件类型、事件码、事件值的范围、input_id等信息参见usb键盘驱动:usbkbd.cusb_to_input_id(dev,&input_dev->id);//设置bustype、vendo、product等input_dev->evbit[0]=BIT(EV_KEY)|BIT(EV_LED)|BIT(EV_REP);//支持的事件类型input_dev->ledbit[0]=BIT(LED_NUML)|BIT(LED_CAPSL)|BIT(LED_SCROLLL)|BIT(LED_COMPOSE)|BIT(LED_KANA);//EV_LED事件支持的事件码for(i=0;i<255;i++)1set_bit(usb_kbd_keycode[i],input_dev->keybit);//EV_KEY事件支持的事件码include/linux/input.h中定义了支持的类型(下面列出的是2.6.22内核的情况)#defineEV_SYN0x00#defineEV_KEY0x01#defineEV_REL0x02#defineEV_ABS0x03#defineEV_MSC0x04#defineEV_SW0x05#defineEV_LED0x11#defineEV_SND0x12#defineEV_REP0x14#defineEV_FF0x15#defineEV_PWR0x16#defineEV_FF_STATUS0x17#defineEV_MAX0x1f一个设备可以支持一个或多个事件类型。每个事件类型下面还需要设置具体的触发事件码。比如:EV_KEY事件,需要定义其支持哪些按键事件码。3、如果需要,设置input设备的打开、关闭、写入数据时的处理方法参见usb键盘驱动:usbkbd.cinput_dev->open=usb_kbd_open;input_dev->close=usb_kbd_close;input_dev->event=usb_kbd_event;4、在发生输入事件时,向子系统报告事件用于报告EV_KEY、EV_REL、EV_ABS等事件的函数有:voidinput_report_key(structinput_dev*dev,unsignedintcode,intvalue)voidinput_report_rel(structinput_dev*dev,unsignedintcode,intvalue)voidinput_report_abs(structinput_dev*dev,unsignedintcode,intvalue)如果你觉得麻烦,你也可以只记住1个函数(因为上述函数都是通过它实现的)voidinput_event(structinput_dev*dev,unsignedinttype,unsignedintcode,intvalue)三、EventHandler层解析1、Input输入子系统数据结构关系图22、input_handler结构体以evdev.c中的evdev_handler为例:staticstructinput_handlerevdev_handler={.event=evdev_event,//向系统报告input事件,系统通过read方法读取3.connect=e