Android系统--输入系统(九)Reader线程_核心类及配置文件
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线程_核心类及配置文件的更多相关文章
- Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析
Android系统--输入系统(十)Reader线程_核心类及配置文件深入分析 0. 前言 个人认为该知识点阅读Android源代码会不仅容易走进死胡同,并且效果并不好,前脚看完后脚忘记,故进行总结, ...
- Android系统--输入系统(八)Reader线程_使用EventHub读取事件
Android系统--输入系统(八)Reader线程_使用EventHub读取事件 1. Reader线程工作流程 获得事件 size_t count = mEventHub->getEvent ...
- Android系统--输入系统(十一)Reader线程_简单处理
Android系统--输入系统(十一)Reader线程_简单处理 1. 引入 Reader线程主要负责三件事情 获得输入事件 简单处理 上传给Dispatch线程 InputReader.cpp vo ...
- 10.5 android输入系统_Reader线程_使用EventHub读取事件和核心类及配置文件_实验_分析
4. Reader线程_使用EventHub读取事件 使用inotify监测/dev/input下文件的创建和删除 使用epoll监测有无数据上报 细节: a.fd1 = inotify_init(& ...
- Android系统--输入系统(十二)Dispatch线程_总体框架
Android系统--输入系统(十二)Dispatch线程_总体框架 1. Dispatch线程框架 我们知道Dispatch线程是分发之意,那么便可以引入两个问题:1. 发什么;2. 发给谁.这两个 ...
- Android系统--输入系统(十七)Dispatcher线程_分发dispatch
Android系统--输入系统(十七)Dispatcher线程_分发dispatch 1. 回顾 InputRead线程从输入设备当中得到输入事件 对于读到输入事件稍作处理,比如紧急事件,来电时候按下 ...
- Android系统--输入系统(七)Reader_Dispatcher线程启动分析
Android系统--输入系统(七)Reader_Dispatcher线程启动分析 1. Reader/Dispatcher的引入 对于输入系统来说,将会创建两个线程: Reader线程(读取事件) ...
- Android系统--输入系统(十三)Dispatcher线程情景分析_Reader线程传递事件
Android系统--输入系统(十三)Dispatcher线程情景分析_Reader线程传递事件 1. 输入按键 我们知道Android系统的按键分为三类:(1)Global Key;(2)Syste ...
- Android系统--输入系统(十四)Dispatcher线程情景分析_dispatch前处理
Android系统--输入系统(十四)Dispatcher线程情景分析_dispatch前处理 1. 回顾 我们知道Android输入系统是Reader线程通过驱动程序得到上报的输入事件,还要经过处理 ...
随机推荐
- 某电商网站线上drbd+heartbeat+nfs配置
1.环境 nfs1.test.com 10.1.1.1 nfs2.test.com 10.1.1.2 2.drbd配置 安装drbd yum -y install gcc gcc-c++ make g ...
- 关于百度地图js api的getCurrentPosition定位不准确的解决方法
很久之前帮大叔解决了一个gps坐标转换为百度地图坐标的问题.今天大叔又给我讲百度地图定位不准.我查了一下api,用了官方给出的这样一组函数. //创建查询对象 var geolocation = ne ...
- 1935: [Shoi2007]Tree 园丁的烦恼
1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec Memory Limit: 357 MBSubmit: 648 Solved: 273[Submit][ ...
- Pydev for eclipse 安装及配置
1.安装JDK,eclipse 2.打开eclipse->help->install new software,点Add,名称输入:Pydev,更新链接为:http://pydev.org ...
- ASP.NET MVC 创建控制器类过程
MvcHandler.ProcessRequestInit()方法: 1.1获取控制器的名称string requiredString = this.RequestContext.RouteData. ...
- 存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现
如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有 ...
- Knockoutjs:Component and Custom Elements(翻译文章)
Knockoutjs 的Components 是一种自定义的组件,它以一种强大.简介的方式将你自己的ui代码组织成一种单独的.可重用的模块,自定义的组件(Component)有以下特点: 1.可以替代 ...
- 更改服务器的SID 加入域控制器提示SID重复
启动Windows2008.2012进入系统后,打开“CMD窗口”并进入到"C:\windows\system32\sysprep"目录后再输入“sysprep /generali ...
- ruby安装sass报错解决办法
ERROR: Could not find a valid gem 'sass' (>= 0), here is why: Unable to download data from http:/ ...
- flask mega-tutorial 1.0 documentation学习记录
本文主要是记录在[用户登录]一节中出现的问题: 报错位置是在 if g.user is not None and g.user.is_authenticated(): return redirect( ...