一、android framework相关
1. 触摸屏的框架
-
简介:
系统启动后,android init程序将启动SystemServer,该程序又启动了WindowManagerService服务,该服务启动了InputManager,InpuManager中,启动了两个独立的线程:InputReader(通过Evhub获取kernel底层input事件,并转发给InputDispatcher)和InputDispatcher(接收来自InputReader传来的Input事件相关消息,并分发给各应用程序);
- WindowsManagerService:
android init进程启动了SystemServer(是启动android中的许多服务,并管理的一个服务)后,由SystemServer启动WindowsManagerService服务,在该服务中,通过如下启动了
mInputManager = new InputManagerService(context, mInputMonitor);
mInputManager.start();
- InputManager:
主要启动了InputReader线程:通过Evhub接收来自底层驱动的触屏事件,并传递给InputDispatcher;
InputDispatcher线程:接收来自InputReader的触屏事件,并处理后,分发给各应用程序;
status_t InputManager::start() {
status_t result = mDispatcherThread->run("InputDispatcher", PRIORITY_URGENT_DISPLAY);
....
....
result = mReaderThread->run("InputReader", PRIORITY_URGENT_DISPLAY);
....
return OK;
}
InputReader:
不停地通过EventHub的方法去获得input事件;
mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE);
- EventHub:
EventHub做的事情比较简单,就是从一个设备 device->fd(即为 /dev/input/event* )读数据,并且封装成InputReader需要的结构体。
size_t EventHub::getEvents(int timeoutMillis, RawEvent* buffer, size_t bufferSize) {
....
Device* device = mDevices.valueAt(deviceIndex);
if (eventItem.events & EPOLLIN) {
int32_t readSize = read(device->fd, readBuffer, // device->fd 即为 /dev/input/event* ;
sizeof(struct input_event) * capacity);
....
- InputDispatcher:
不断地通过InputListener来获得来自InputReader的Input事件,并将这些input事件按照一定格式分发给各应用程序;
2. android framework层相关文章
安卓4.1: input系统从frameworks到kernel (对应上图,很值得一看!!!)
二、linux驱动相关
- linux触摸屏驱动移植相关步骤:
(1)、在platform/kernel/arch/arm/mach-rk30/board-rk3066b-sdk.c 中添加I2C设备资源;
(2)、在kernel/drivers/input/touchscreen/ 目录下,修改添加触摸屏初始化驱动、probe函数等;
(3)、修改添加触摸屏配置文件 (idc文件,用来配置触摸屏的一些属性);
(4)、修改添加keylayout文件(kl文件,安卓层面的按键映射文件);
(5)、修改添加characterMap文件(kcm文件,安卓层面的字符映射文件); - 以下为linux触摸屏驱动移植比较好的参考文章:
android 电容屏(一):电容屏基本原理篇
android 电容屏(二):驱动调试之基本概念篇
android 电容屏(三):驱动调试之驱动程序分析篇
android 电容屏(四):驱动调试之驱动程序分析篇 -- FocalTech