[计算机]linux内核input子系统解析
linux input
linux input
lliinnuuxx内核iinnppuutt子系统解析
Android Xwindows qt linux
、 、 等众多应用对于 系统中键盘、鼠标、触摸屏等输入设备的支持都通过、或越
来越倾向于标准的input输入子系统。
因为input子系统已经完成了字符驱动的文件操作接口,所以编写驱动的核心工作是完成input系统留出的
接口,工作量不大。但如果你想更灵活的应用它,就需要好好的分析下input子系统了。
input
input
一、iinnppuutt输入子系统框架
下图是input输入子系统框架,输入子系统由输入子系统核心层( InputCore ),驱动层和事件处理层(Event
Handler)三部份组成。一个输入事件,如鼠标移动,键盘按键按下,joystick 的移动等等通过 inputdriver->
Inputcore->Eventhandler->userspace 到达用户空间传给应用程序。
注意:keyboard.c不会在/dev/input下产生节点,而是作为ttyn 终端(不包括串口终端)的输入。
Inputdriver
Inputdriver
二、IInnppuuttddrriivveerr编写要点
1 input
1 input
11、分配、注册、注销iinnppuutt设备
structinput_dev*input_allocate_device(void)
intinput_register_device(structinput_dev*dev)
voidinput_unregister_device(structinput_dev*dev)
2 input input_id
2 input input_id
22、设置iinnppuutt设备支持的事件类型、事件码、事件值的范围、iinnppuutt__iidd等信息
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_SYN 0x00
#defineEV_KEY 0x01
#defineEV_REL 0x02
#defineEV_ABS 0x03
#defineEV_MSC 0x04
#defineEV_SW 0x05
#defineEV_LED 0x11