Android系统--输入系统(九)Reader线程_核心类及配置文件

1. Reader线程核心类--EventHub

1.1 Reader线程核心结构体
  • 实例化对象:mEventHub--表示多个输入设备,里面有数组mPendingEventItems存储多个设备


    struct epoll_event mPendingEventItems[EPOLL_MAX_EVENTS];
  • mDevice--vector,用来表示记录多个输入设备


    KeyedVector<int32_t, Device*> mDevices; //int32_t表示编号,Device*表示输入设备
1.2 取出输入设备
  • 编号

  • Device*

    • 设备描述符fd

    • 标志信息identify

      • name : String8

      • bus : uint16_t

      • vendor : uint16_t

      • product : uint16_t

      • version : uint16_t

    • 映射信息



    struct Device {

        Device* next;

        int fd; // may be -1 if device is virtual

        const int32_t id;

        const String8 path;

        const InputDeviceIdentifier identifier;

        uint32_t classes;

        uint8_t keyBitmask[(KEY_MAX + 1) / 8];

        uint8_t absBitmask[(ABS_MAX + 1) / 8];

        uint8_t relBitmask[(REL_MAX + 1) / 8];

        uint8_t swBitmask[(SW_MAX + 1) / 8];

        uint8_t ledBitmask[(LED_MAX + 1) / 8];

        uint8_t ffBitmask[(FF_MAX + 1) / 8];

        uint8_t propBitmask[(INPUT_PROP_MAX + 1) / 8];

        String8 configurationFile;

        PropertyMap* configuration;

        VirtualKeyMap* virtualKeyMap;

        KeyMap keyMap;

        sp<KeyCharacterMap> overlayKeyMap;

        sp<KeyCharacterMap> combinedKeyMap;

        bool ffEffectPlaying;

        int16_t ffEffectId; // initially -1

    };

1.3 打开配置文件
  • 根据编号和Device*找到该输入设备

  • 打开一个输入设备结构体时,需要构建一个device结构体

  • 根据标志信息打开三种配置文件

    • IDC:input device configuration

    • keylayout

    • KCM:key charactor map

2. 详解配置文件

2.1 引入

对于Android系统输入,分为Android输入系统和Linux内核两层,Linux内核提供输入设备驱动程序,主要负责上报输入事件。

输入事件
  • EV_KEY

  • code--KEY_1(2)

  • value

2.2 引入keylayout

Android系统中用AKEYCODE_1(8)来表示内核中KEY_1(2),其中必定涉及转化文件,即.kl文件(keylayout)

(1)转化的原因:为了使得内核的变化不影响系统层键值的改变。
(2)keylayout原则:

Key layout files are located by USB vendor, product (and optionally version) id or by input device name. The following paths are consulted in order: /system/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl /system/usr/keylayout/Vendor_XXXX_Product_XXXX.kl /system/usr/keylayout/DEVICE_NAME.kl /data/system/devices/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl /data/system/devices/keylayout/Vendor_XXXX_Product_XXXX.kl /data/system/devices/keylayout/DEVICE_NAME.kl /system/usr/keylayout/Generic.kl /data/system/devices/keylayout/Generic.kl
(3)kl文件格式

key 17 W 内核中的code值 Android:AKEYCODE_W
(4)keyout实验(基于Tiny4412)

在Tiny4412开发板操作

  • su

  • mkdir -p /data/system/devices/keylayout/

  • cp /system/usr/keylayout/Generic.kl /data/system/devices/keylayout/InputEmulatorFromLKQ.kl

  • 修改 /data/system/devices/keylayout/InputEmulatorFromLKQ.kl

  • 添加这2行:


    key 227 STAR //SATR代表Android中*键 key 228 POUND //POUND代表Android中#键
  • 修改权限:

    busybox chmod 777 /data/system/devices -R

  • 重启:reboot

  • insmod InputEmulator.ko

  • 打开开发板中浏览器,点击文本输入框

  • 发送*键


    sendevent /dev/input/event5 1 227 1 sendevent /dev/input/event5 1 227 0 sendevent /dev/input/event5 0 0 0
  • 发送#键


    sendevent /dev/input/event5 1 228 1 sendevent /dev/input/event5 1 228 0 sendevent /dev/input/event5 0 0 0
(5)实验现象:文本输入框出现 *# 字符
(6)实验结论:用来表示驱动上报的scancode对应哪一个android按键(AKEYCODE_x),它对应哪一个字符,由kcm文件决。
2.3 引入kcm

Android输入系统中,当确定Android keycode之后,需要转化为显示在文本框的字符,这其中的转化则.kcm文件

(1)kcm原则

Key character map files are located by USB vendor, product (and optionally version) id or by input device name. The following paths are consulted in order. /system/usr/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm /system/usr/keychars/Vendor_XXXX_Product_XXXX.kcm /system/usr/keychars/DEVICE_NAME.kcm /data/system/devices/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm /data/system/devices/keychars/Vendor_XXXX_Product_XXXX.kcm /data/system/devices/keychars/DEVICE_NAME.kcm /system/usr/keychars/Generic.kcm /data/system/devices/keychars/Generic.kcm /system/usr/keychars/Virtual.kcm /data/system/devices/keychars/Virtual.kcm
(2)kcm文件格式:

key B { label: 'B' # 印在按键上的文字
base: 'b' # 如果没有其他按键(shift, ctrl等)同时按下,此按键对应的字符是'b'
shift, capslock: 'B' } B 表示 Android AKEYCODE_B
(3)kcm实验:
  • mkdir -p /data/system/devices/keychars

  • cp /system/usr/keychars/Generic.kcm /data/system/devices/keychars/InputEmulatorFromLKQ.kcm

  • 修改:


key STAR { label: '*'
# base: '*'
base: '1' } key POUND { label: '#'
# base: '#'
base: '2' }
  • busybox chmod 777 /data/system/devices -R

  • 重启:reboot

  • insmod InputEmulator.ko

  • 发送*键, 得到1


    sendevent /dev/input/event5 1 227 1 sendevent /dev/input/event5 1 227 0 sendevent /dev/input/event5 0 0 0
  • 发送#键, 得到2


    sendevent /dev/input/event5 1 228 1 sendevent /dev/input/event5 1 228 0 sendevent /dev/input/event5 0 0 0
补充:
  • 也可以用组合键,也可实现


    sendevent /dev/input/event5 1 42 1 sendevent /dev/input/event5 1 9 1 sendevent /dev/input/event5 1 9 0 sendevent /dev/input/event5 1 42 0 sendevent /dev/input/event5 0 0 0 sendevent /dev/input/event5 1 42 1 sendevent /dev/input/event5 1 4 1 sendevent /dev/input/event5 1 4 0 sendevent /dev/input/event5 1 42 0 sendevent /dev/input/event5 0 0 0
(4)实验现象:文本输入框出现 12 字符
(5)实验结论:用来表示android按键(AKEYCODE_x)对应哪一个字符。同时按下其他按键后,对应哪个字符。

Android系统--输入系统(九)Reader线程_核心类及配置文件的更多相关文章

  1. Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析

    Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析 0. 前言 个人认为该知识点阅读Android源代码会不仅容易走进死胡同,并且效果并不好,前脚看完后脚忘记,故进行总结, ...

  2. Android系统--输入系统(八)Reader线程_使用EventHub读取事件

    Android系统--输入系统(八)Reader线程_使用EventHub读取事件 1. Reader线程工作流程 获得事件 size_t count = mEventHub->getEvent ...

  3. Android系统--输入系统(十一)Reader线程_简单处理

    Android系统--输入系统(十一)Reader线程_简单处理 1. 引入 Reader线程主要负责三件事情 获得输入事件 简单处理 上传给Dispatch线程 InputReader.cpp vo ...

  4. 10.5 android输入系统_Reader线程_使用EventHub读取事件和核心类及配置文件_实验_分析

    4. Reader线程_使用EventHub读取事件 使用inotify监测/dev/input下文件的创建和删除 使用epoll监测有无数据上报 细节: a.fd1 = inotify_init(& ...

  5. Android系统--输入系统(十二)Dispatch线程_总体框架

    Android系统--输入系统(十二)Dispatch线程_总体框架 1. Dispatch线程框架 我们知道Dispatch线程是分发之意,那么便可以引入两个问题:1. 发什么;2. 发给谁.这两个 ...

  6. Android系统--输入系统(十七)Dispatcher线程_分发dispatch

    Android系统--输入系统(十七)Dispatcher线程_分发dispatch 1. 回顾 InputRead线程从输入设备当中得到输入事件 对于读到输入事件稍作处理,比如紧急事件,来电时候按下 ...

  7. Android系统--输入系统(七)Reader_Dispatcher线程启动分析

    Android系统--输入系统(七)Reader_Dispatcher线程启动分析 1. Reader/Dispatcher的引入 对于输入系统来说,将会创建两个线程: Reader线程(读取事件) ...

  8. Android系统--输入系统(十三)Dispatcher线程情景分析_Reader线程传递事件

    Android系统--输入系统(十三)Dispatcher线程情景分析_Reader线程传递事件 1. 输入按键 我们知道Android系统的按键分为三类:(1)Global Key;(2)Syste ...

  9. Android系统--输入系统(十四)Dispatcher线程情景分析_dispatch前处理

    Android系统--输入系统(十四)Dispatcher线程情景分析_dispatch前处理 1. 回顾 我们知道Android输入系统是Reader线程通过驱动程序得到上报的输入事件,还要经过处理 ...

随机推荐

  1. Select的逻辑处理顺序(Transact-SQL)

    1. Select 语句基本写法 2. Select的逻辑处理顺序 SQL与其他编程语言不同的明显特征就是代码的处理顺序.在其他编程语言中,常见是按编写代码的先后顺序(从上之下)来处理.但在SQL中, ...

  2. wemall doraemon中Android app商城系统工具集合类,包含各种程序中用到的静态方法

    wemall doraemon中Android app商城系统工具集合类,包含各种程序中用到的静态方法,可用于其他商城或者系统的编程参考 package cn.zzu.edu.wemall.utils ...

  3. 大富豪APK安卓客户端的反编译修改和重新打包

    大富豪APK安卓客户端的反编译修改和重新打包 修改安装我们需要几个工具 DFH_3.4.X  (用于修改客户端) dnsPy        (用于修改.dll文件) 大富豪加解密.exe  ( 用于加 ...

  4. nodejs学习一

    总觉得一个前端,不懂得一点后端的服务,弱弱的没有存在感,所以利用现在好好 学学有关nodejs 首先是windows上进行nodejs的全局安装 32 位安装包下载地址 : https://nodej ...

  5. 一道面试题引发的pythonic

    一道测试工程师面试题(来自搜狗): 自己写了解法: # -*- coding: utf-8 -*- import re #从整体log中过滤出有用的部分,缩小搜索范围 def filter_log(t ...

  6. Archlinux 的U盘自动装载(一)udisks

    为什么要用 udisks + udevil 方式自动装载 U 盘? Gnome 和 KDE 下的很多文件管理器都有自己的U盘装载方案.但我的应用环境为: Archlinux,xorg,Openbox, ...

  7. SEO-站内优化规范

    类别 要求 实际工作要求 程 序 设 计 1.DIV+CSS布局 2.站内导航连接性良好 面包屑导航,翻页方式使用样式二,文章和产品上一页和下一页 3.图片的ALT属性 在编程时注意写 4.超级链接的 ...

  8. mybatis只能模糊查询英文不能查询中文

    解决方法:修改配置文件,最简单的完美修改方法,修改mysql的my.cnf文件中的字符集键值(注意配置的字段细节): 1.在[client]字段里加入default-character-set=utf ...

  9. Win10上编译CoreCLR的Windows和Linux版本

    一.编译环境 首先,不管是Windows还是Linux版本CoreCLR的编译,都是在Windows10上进行的. 二.CoreCLR for Windows 在Windows上做编译怎么能少得了Vi ...

  10. ZJOI2017 Day3 滚粗记

    私のZJOI Day3 2017-3-21 07:52:53 今天,考了人生当中的第一次省选(虽然只是普及组三等奖但仍然有幸能体会一下).据胡老师说,这就是来体验一下被大神虐--真的是这样,听课听不懂 ...