一、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