一、android framework相關(guān)
1. 觸摸屏的框架
-
簡(jiǎn)介:
系統(tǒng)啟動(dòng)后,android init程序?qū)?dòng)SystemServer,該程序又啟動(dòng)了WindowManagerService服務(wù),該服務(wù)啟動(dòng)了InputManager,InpuManager中,啟動(dòng)了兩個(gè)獨(dú)立的線程:InputReader(通過Evhub獲取kernel底層input事件,并轉(zhuǎn)發(fā)給InputDispatcher)和InputDispatcher(接收來自InputReader傳來的Input事件相關(guān)消息,并分發(fā)給各應(yīng)用程序);
- WindowsManagerService:
android init進(jìn)程啟動(dòng)了SystemServer(是啟動(dòng)android中的許多服務(wù),并管理的一個(gè)服務(wù))后,由SystemServer啟動(dòng)WindowsManagerService服務(wù),在該服務(wù)中,通過如下啟動(dòng)了
mInputManager = new InputManagerService(context, mInputMonitor);
mInputManager.start();
- InputManager:
主要啟動(dòng)了InputReader線程:通過Evhub接收來自底層驅(qū)動(dòng)的觸屏事件,并傳遞給InputDispatcher;
InputDispatcher線程:接收來自InputReader的觸屏事件,并處理后,分發(fā)給各應(yīng)用程序;
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做的事情比較簡(jiǎn)單,就是從一個(gè)設(shè)備 device->fd(即為 /dev/input/event* )讀數(shù)據(jù),并且封裝成InputReader需要的結(jié)構(gòu)體。
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事件按照一定格式分發(fā)給各應(yīng)用程序;
2. android framework層相關(guān)文章
安卓4.1: input系統(tǒng)從frameworks到kernel (對(duì)應(yīng)上圖,很值得一看?。。。?/strong>
二、linux驅(qū)動(dòng)相關(guān)
- linux觸摸屏驅(qū)動(dòng)移植相關(guān)步驟:
(1)、在platform/kernel/arch/arm/mach-rk30/board-rk3066b-sdk.c 中添加I2C設(shè)備資源;
(2)、在kernel/drivers/input/touchscreen/ 目錄下,修改添加觸摸屏初始化驅(qū)動(dòng)、probe函數(shù)等;
(3)、修改添加觸摸屏配置文件 (idc文件,用來配置觸摸屏的一些屬性);
(4)、修改添加keylayout文件(kl文件,安卓層面的按鍵映射文件);
(5)、修改添加characterMap文件(kcm文件,安卓層面的字符映射文件); - 以下為linux觸摸屏驅(qū)動(dòng)移植比較好的參考文章:
android 電容屏(一):電容屏基本原理篇
android 電容屏(二):驅(qū)動(dòng)調(diào)試之基本概念篇
android 電容屏(三):驅(qū)動(dòng)調(diào)試之驅(qū)動(dòng)程序分析篇
android 電容屏(四):驅(qū)動(dòng)調(diào)試之驅(qū)動(dòng)程序分析篇 -- FocalTech
