Androidlinuxinput子系统介绍

上传人:鲁** 文档编号:512664011 上传时间:2022-08-20 格式:DOC 页数:8 大小:162KB
返回 下载 相关 举报
Androidlinuxinput子系统介绍_第1页
第1页 / 共8页
Androidlinuxinput子系统介绍_第2页
第2页 / 共8页
Androidlinuxinput子系统介绍_第3页
第3页 / 共8页
Androidlinuxinput子系统介绍_第4页
第4页 / 共8页
Androidlinuxinput子系统介绍_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《Androidlinuxinput子系统介绍》由会员分享,可在线阅读,更多相关《Androidlinuxinput子系统介绍(8页珍藏版)》请在金锄头文库上搜索。

1、wordAndroid linux内核input子系统解析Android、X windows、qt等众多应用对于linux系统中键盘、鼠标、触摸屏等输入设备的支持都通过、或越来越倾向于标准的input输入子系统。因为input子系统已经完成了字符驱动的文件操作接口,所以编写驱动的核心工作是完成input系统留出的接口,工作量不大。但如果你想更灵活的应用它,就需要好好的分析下input子系统了。一、input输入子系统框架如下图是input输入子系统框架,输入子系统由输入子系统核心层 Input Core ,驱动层和事件处理层Event Handler三部份组成。一个输入事件,如鼠标移动,键盘按

2、键按下,joysTIck的移动等等通过 input driver - Input core - Event handler - userspace 到达用户空间传给应用程序。注意:keyboard.c不会在/dev/input下产生节点,而是作为ttyn终端不包括串口终端的输入。二、Input driver编写要点1、分配、注册、注销input设备struct input_dev *input_allocate_device(void)int input_register_device(struct input_dev *dev)void input_unregister_device(str

3、uct input_dev *dev)2、设置input设备支持的事件类型、事件码、事件值的X围、input_id等信息usb_to_input_id(dev, &input_dev-id);/设置bustype、vendo、product等input_dev-evbit0 = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);/支持的事件类型input_dev-ledbit0 = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL) | BIT(LED_POSE) | BIT(LED_KANA);/ EV_LED事件

4、支持的事件码for (i = 0; i keybit); /EV_KEY事件支持的事件码include/linux/input.h中定义了支持的类型下面列出的是2.6.22内核的情况#define EV_SYN0x00#define EV_KEY0x01#define EV_REL0x02#define EV_ABS0x03#define EV_MSC0x04#define EV_SW0x05#define EV_LED0x11#define EV_SND0x12#define EV_REP0x14#define EV_FF 0x15#define EV_PWR0x16#define EV_F

5、F_STATUS0x17#define EV_MAX0x1f一个设备可以支持一个或多个事件类型。每个事件类型下面还需要设置具体的触发事件码。比如:EV_KEY事件,需要定义其支持哪些按键事件码。3、如果需要,设置input设备的打开、关闭、写入数据时的处理方法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等事件的函数有:void input_report_key(str

6、uct 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)如果你觉得麻烦,你也可以只记住1个函数因为上述函数都是通过它实现的void input_event(struct input_dev *dev, unsigned int type, unsigned in

7、t code, int value)三、Event Handler层解析1、Input输入子系统数据结构关系图2、input_handler结构体以evdev.c中的evdev_handler为例:static struct input_handler evdev_handler = .event = evdev_event, /向系统报告input事件,系统通过read方法读取.connect = evdev_connect, /和input_dev匹配后调用connect构建.disconnect = evdev_disconnect,.fops = &evdev_fops, /event

8、设备文件的操作方法.minor = EVDEV_MINOR_BASE, /次设备号基准值.name = evdev,.id_table = evdev_ids, /匹配规如此;3、input字符设备注册过程drivers/input/input.c中:static int _init input_init(void)int err;err = class_register(&input_class);err = register_chrdev(INPUT_MAJOR, input, &input_fops);input_fops定义:static const struct file_opera

9、tions input_fops = .owner = THIS_MODULE,.open = input_open_file,;Input_dev和input_handler匹配后调用input_handler的connect。以evdev_handler为例:static int evdev_connect(struct input_handler *handler, struct input_dev *dev,const struct input_device_id *id)struct evdev *evdev; struct class_device *cdev;dev_t devt

10、;int minor;int error;for (minor = 0; minor client_list);init_waitqueue_head(&evdev-wait); evdev-exist = 1;evdev-minor = minor;evdev-handle.dev = dev;evdev-handle.name = evdev-name;evdev-handle.handler = handler;evdev-handle.private = evdev;sprintf(evdev-name, event%d, minor);evdev_tableminor = evdev

11、;/记录evdev的位置,字符设备/dev/input/evnetx访问时根据次设备号与EVDEV_MINOR_BASE最终在evdev_open中找到对应的evdevdevt = MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + minor),cdev = class_device_create(&input_class, &dev-cdev, devt,dev-cdev.dev, evdev-name);/创建了event字符设备节点4、input字符设备的打开过程static int input_open_file(struct inode *inode, struct file *file)struct input_handler *handler = input_tableiminor(i

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号