Android9.0 .kl and .kcm 文件使用

重要定义:

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 中添加 ,attrs.xml文件会被EventHub来加载解析,从而完成key的remap;那么就可以在android framework通过KEYCODE_SPECIFICKEY来对应scan code了;


2.virtual key

Touch设备经常会被用来实现虚拟按键功能,例如我们的设备display分辨率是1280*800;但是touch的高度可能是1750,那么多出来的这一块touch,就可以用来实现虚拟按键功能;

目前主流用两种实现虚拟按键的方法:

  1. 可以理解为硬件实现,touch的控制器通过寄存器设定直接实现虚拟按键功能。
  2. 通过软件实现,将特定位置(范围)的touch坐标映射成所定义key的key codes。这个一般是在touch的driver实现,在固定位置上报事件时候,上报key code。

当通过方法2实现虚拟按键的时候,通常会需要kernel导出(提供)一个名为virtualkeys.映射文件,这个文件是以板级属性的形式存在,假设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.

: the linux key code of the virtual key,通常在touch driver(dts)中定义和使用;

:virtual key的中心X坐标

:virtual key的中心Y坐标

:虚拟按键的宽度(以像素为单位)

:虚拟按键的高度


4. 问题

目前发现一个问提,PhoneWindowManger可以快速的检测到虚拟按键的按下和松开(up/down),并可以通过key code来做出相应的操作。但是另外单独的开一个进程来模仿EventHub的行为,监听/dev/input/下面的设备输出情况,发现容易丢失up event;

你可能感兴趣的:(基础)