欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

安卓触摸屏驱动程序框架分析

最编程 2024-07-15 19:25:20
...

一、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驱动相关

  1. 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文件,安卓层面的字符映射文件);
  2. 以下为linux触摸屏驱动移植比较好的参考文章:
    android 电容屏(一):电容屏基本原理篇
    android 电容屏(二):驱动调试之基本概念篇
    android 电容屏(三):驱动调试之驱动程序分析篇
    android 电容屏(四):驱动调试之驱动程序分析篇 -- FocalTech

推荐阅读