2020-02-29
关键字:
海思平台的遥控器适配过程还算是比较简单的,就是要稍微费上一些时间而已。
遥控器的适配流程大致可以分成两个步骤:
1、按键事件从遥控器传递到内核
2、按键事件从内核传递到普通应用
1、从遥控器到内核
首先我们要知道你要适配的遥控器的每一个按键的键码,即你按下某个按键后海思平台能识别到的键码值。
直接在串口敲以下命令运行相关程序:
android_ir_user -D
android_ir_user 是预置在 /system/bin 下的一个遥控输入与解析的程序。
该程序在运行起来以后逐个按下遥控器上的按键,并记录下相应键码值,视你的遥控器按键数量,这一步会相对比较消耗时间:
然后将这些值填入 key.xml 文件:
device/hisilicon/bigfish/system/ir_user/key_pars/key.xml
第二步是打开 linux_key.h 文件:
device/hisilicon/bigfish/system/ir_user/key_pars/linux_key.h
在文件中的 Linux_KeyCode_Ary 数组中添加你要新增的按键信息:
const linux_keycode_ary Linux_KeyCode_Ary[512]
这一步中数组第一个元素必须要与 key.xml 中的 name 完全一致。如此一来,当按下某个遥控器按键以后,系统就会将这个按键值识别成你所设置的那个数字数值。
第三步则是找到你系统中所用的那个 kl 文件,并将要增加的按键的信息填写进去:
device/hisilicon/bigfish/prebuilts/
这个 kl 文件可能会有多套,具体使用的是哪一套要以你自己的项目为准,一般供开发人员使用的 kl 文件都保存于以上所示的目录内,可以参考这个目录下的 Android.mk 来确定。
一般来讲,海思平台会使用两套 kl 文件,它们们于开发板文件系统的以下位置:
system/usr/keylayout/Generic.kl
system/usr/keylayout/Vendor_0001_Product_0001.kl
在相应的 kl 文件中合适的位置新增你的信息,要注意关键信息的唯一性:
同时要注意这里的按键信息是没有前缀 " KEY_ " 的。并且中间的数字值也要与 linux_key.h 中的一致。另外,这一块的信息中间的数字要填十进制形式的。
至此,我们就实现了一套新的遥控器按键的事件从遥控器到系统内核的适配了。
2、从内核到普通应用
这一部分说简单也简单,说麻烦也挺麻烦,看你的要求有多高了。
首先来操作 KeycodeLabels.h 文件:
frameworks/native/include/input/KeycodeLabels.h
在 KEYCODES 数组中新增你要适配的按键信息:
static const KeycodeLabel KEYCODES[]
这里的字符串信息要与前面 kl 文件中的完全一致,但数字值却可以不同了。
这一步实现了以后你的遥控器按键事件就能到 Android 的框架层了。以 SMARG_GROOM 按键为例,当用户按下这一按键时,在Android框架层可以接收到值为 261 的 keycode 值。
一般来说,适配到这里就差不多了,已经可以在 APK 中监听到按键事件了。但是有一个不足的就是在应用开发中无法像传统按键那样以 KeyEvent.KEYCODE_0 、 KeyEvent.KEYCODE_DPAD_CENTER 这种类型来编写代码。
如果要实现这种需求,则还需要再进一步配置:
首先打开 KeyEvent.java:
frameworks/base/core/java/android/view/KeyEvent.java
在合适的位置增加如下所示的按键值信息:
这里的数字值必须要与前面 KeycodeLables.h 中的一致。
同时再在 populateKeycodeSymbolicNames 中按如下形式添加你的按键信息:
然后打开 attrs.xml 文件:
frameworks/base/core/res/res/values/attrs.xml
按如下形式添加按键信息:
至此,就可以实现在应用开发中通过 KeyEvent.SMART_GROOM 的形式来监听按键事件了。
最后,附上一份海思官方的适配遥控器按键的文档,这份文档所记录的步骤更详细,但主要的步骤按笔者上面的描述就够了。
链接:https://pan.baidu.com/s/1UMjFD4C9JsMkuvu46-d-vQ
提取码:re80