Android觸摸屏驅(qū)動(dòng)框架分析

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

  1. 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文件,安卓層面的字符映射文件);
  2. 以下為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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容