按键或者触摸屏输入设备是最常用不过的设备,那么如果一个按键信息是如何从内核传递到android的呢,首先我们得先清楚Linux的input子系统框架,下面是我在公司自己写的一篇文档,现在先粘帖过来
Linux之Input子系统分析
目前Android、QT等众多应用对于linux系统中键盘、鼠标、触摸屏等输入设备的支持都通过标准的input输入子系统。因为input子系统已经完成了字符驱动的文件操作接口,所以编写驱动的核心工作是完成input系统留出的接口,工作量相对小很多,下面我们将从input输入子系统框架以及基于3202中的触摸屏代码为实例进行分析。
一、input输入子系统框架
下图是input输入子系统框架,输入子系统由输入子系统核心层(input core),驱动层和事件处理层(Event Handler)三部分组成。一个输入事件,比如滑动触摸屏都是通过input driver -> input core -> event handler -> user space 到达用户空间传给应用程序。
Input输入子系统框架

二、Input driver编写要点
1. 分配、注册、注销input设备
参见触摸屏驱动ctp_it7250.c
struct input_dev *input_allocate_device(void)
int input_register_device(struct input_dev *dev)
void input_unregister_device(struct input_dev *dev)
2. 设置input设备支持的事件类型、事件码、事件值的范围等信息
参见触摸屏驱动ctp_it7250.c
__set_bit(EV_ABS, Ctp_it7250->input_dev->evbit);
__set_bit(ABS_X, Ctp_it7250->input_dev->absbit);
__set_bit(ABS_Y, Ctp_it7250->input_dev->absbit);
__set_bit(EV_SYN, Ctp_it7250->input_dev->evbit);
__set_bit(EV_KEY, Ctp_it7250->input_dev->evbit);
__set_bit(BTN_TOUCH, Ctp_it7250->input_dev->keybit);
Include/linux/input.h中定义了支持的类型
#define EV_SYN 0x00
#define EV_KEY 0x01
#define EV_REL 0x02
#define EV_ABS 0x03
#define EV_MSC 0x04
#define EV_SW 0x05
#define EV_LED 0x11
#define EV_SND 0x12
#define EV_REP 0x14
#define EV_FF 0x15
#define EV_PWR 0x16
#define EV_FF_STATUS 0x17
#define EV_MAX 0x1f
#define EV_CNT (EV_MAX+1)
一个设备可

本文详细剖析了Android系统中input输入子系统的框架,从驱动层的设备注册、事件报告到Event Handler层的数据处理,再到用户空间的读取操作。通过讲解如何从内核将按键或触摸屏事件传递给应用程序,展示了input事件从input driver -> input core -> event handler -> user space 的完整流程。
最低0.47元/天 解锁文章
1123

被折叠的 条评论
为什么被折叠?



