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

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

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

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

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

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

Androidlinux内核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.c usb_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++)set_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.c input_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输入子系统数据结构关系图 2、input_handler结构体 以evdev.c中的evdev_handler为例: staticstructinput_handlerevdev_handler={.event=evdev_event,//向系统报告inpu