重要定义:
1. scan code,key code
所谓scan code就是linux scan code,event 上报的那个值,不同硬件driver可能会有不同的scan code上报,与硬件息息相关;
所谓key code就是android framework和app能够认识的key code,一般也可以自定义,例如touch下沿中心可以定义一个特殊功能key,就可以定义为SPECIFICKEY,那么想要被正常的映射到anroid framework(例如PhoneWindowManager)里面,就需要你根据scan code值来映射对应的android keycode,需要自行定义一份.kl文件,例如在.kl文件中加入如下一行:
key 555 SPECIFICKEY VIRTUAL //
那么需要在./res/res/values/attrs.xml 中添加 <enum name="KEYCODE_SPECIFICKEY" value="555 " />,attrs.xml文件会被EventHub来加载解析,从而完成key的remap;那么就可以在android framework通过KEYCODE_SPECIFICKEY来对应scan code了;
2.virtual key
Touch设备经常会被用来实现虚拟按键功能,例如我们的设备display分辨率是1280*800;但是touch的高度可能是1750,那么多出来的这一块touch,就可以用来实现虚拟按键功能;
目前主流用两种实现虚拟按键的方法:
- 可以理解为硬件实现,touch的控制器通过寄存器设定直接实现虚拟按键功能。
- 通过软件实现,将特定位置(范围)的touch坐标映射成所定义key的key codes。这个一般是在touch的driver实现,在固定位置上报事件时候,上报key code。
当通过方法2实现虚拟按键的时候,通常会需要kernel导出(提供)一个名为virtualkeys.<devicename>映射文件,这个文件是以板级属性的形式存在,假设touch的driver上报该设备名称是touchfreely,那么这个虚拟按键的映射文件必定存在与/sys/board_properties/virtualkeys.touchfreely.
虚拟按键的按键映射文件描述了touch上的坐标和对应的key codes;另外,除了现在提到的按键映射文件,必定还相应的存在一个按键布局文件.kl文件用来将linux key codes 映射成android key codes和按键字符映射文件用来说明键盘的特定类型,一般会是SPECIAL_FUNCITON.
3. 语法
通常虚拟按键映射文件内容很简单,一般如下格式:0x01:256:360:1525:720:376
0x01: 版本信息,必须是0x01.
<Linux key code>: the linux key code of the virtual key,通常在touch driver(dts)中定义和使用;
<centerX>:virtual key的中心X坐标
<centorY>:virtual key的中心Y坐标
<width>:虚拟按键的宽度(以像素为单位)
<height>:虚拟按键的高度
4. 问题
目前发现一个问提,PhoneWindowManger可以快速的检测到虚拟按键的按下和松开(up/down),并可以通过key code来做出相应的操作。但是另外单独的开一个进程来模仿EventHub的行为,监听/dev/input/下面的设备输出情况,发现容易丢失up event;