Amlogic android TV 遥控器按键新增流程:
最近拿到 Amlogic android TV 960 方案,新增了一套自定义的遥控器按键功能,整理分享给需要的小伙伴参考;对于Amlogic 962/972方案都是大同小异。
Android 增加按键分为两大部分,一是linux层,二是android层,两个部分分别有按键映射文件。先把遥控器的 scancode 对应到 linux层定义的键值上,此处是键值对的形式;再是把linux层键值对应到Android的键值上;其余要做的就是几个文件上键值的定义。下面列出对应的文件:
一. linux层需要添加按键定义的文件:
common\include\uapi\linux\input.h
bionic\libc\kernel\uapi\linux\input.hcommon\arch\arm\boot\dts\include\dt-bindings\input\input.h --> common\include\dt-bindings\input\input.h(这两个文件其实是link的关系,修改一个,另一个会自动添加)
以上三个文件中添加 linux层按键定义,如 #define KEY_MTC_FAC_NEC_WB_SET_START 690
common\arch\arm64\boot\dts\amlogic\mesontxl.dtsi---》
对于此文件中增加遥控器按键scancode对应的linux层键值对,
在已有的map里增加新的key,也可以自己新增一个 IR map举例如下:
REMOTE_KEY(0xB0, KEY_MTC_FAC_NEC_WB_SET_START)
具体代码部分参考:
在这里可以新增map,要注意map数组的大小:
custom_maps:custom_maps {
mapnum = <7>;
map0 = <&map_0>;
map1 = <&map_1>;
map2 = <&map_2>;
map3 = <&map_3>;
map4 = <&map_4>;
map5 = <&map_5>;
map6 = <&map_6>;
map_0: map_0{
mapname = "amlogic-remote-1";
customcode = <0xfb04>;
release_delay = <80>;
size = <44>; /*keymap size*/
keymap = <REMOTE_KEY(0x01, KEY_1)
REMOTE_KEY(0x02, KEY_2)
REMOTE_KEY(0x03, KEY_3)
我是在原有的map里增加按键:
map_3: map_3{ //shen@20210317 add for MTC WB IR KEY
mapname = "amlogic-remote-4";
customcode = <0xdd22>;
release_delay = <80>;
size = <121>; /*keymap size*/
keymap = <REMOTE_KEY(0x3C, KEY_MTC_FAC_NEC_WB_DATA_60)
REMOTE_KEY(0x3D, KEY_MTC_FAC_NEC_WB_DATA_61)
REMOTE_KEY(0x3E, KEY_MTC_FAC_NEC_WB_DATA_62)
REMOTE_KEY(0x3F, KEY_MTC_FAC_NEC_WB_DATA_63)
REMOTE_KEY(0x40, KEY_MTC_FAC_NEC_WB_DATA_64)
REMOTE_KEY(0x41, KEY_MTC_FAC_NEC_WB_DATA_65)
REMOTE_KEY(0x42, KEY_MTC_FAC_NEC_WB_DATA_66)
REMOTE_KEY(0x43, KEY_MTC_FAC_NEC_WB_DATA_67)
REMOTE_KEY(0x44, KEY_MTC_FAC_NEC_WB_DATA_68)
中间还有好多键值对映射,就不全列出来了
REMOTE_KEY(0xB0, KEY_MTC_FAC_NEC_WB_SET_START)
在Linux还有一点要注意:默认的input.h里按键定义个数是 0x2ff,如果自定义的按键个数大于这个数,记得要改哦
/* We avoid low common keys in module aliases so they don't get huge. */
#define KEY_MIN_INTERESTING KEY_MUTE
#define KEY_MAX 0x3ff
#define KEY_CNT (KEY_MAX+1)另外在这里 common\include\linux\mod_devicetable.h 也定义各种key的最大个数,也要一并改到位
/* #define INPUT_DEVICE_ID_KEY_MAX 0x2ff */
#define INPUT_DEVICE_ID_KEY_MAX 0x3ff /* shen@20210323 modify */以上就是linux层要改动的部分
二. Android 层修改的文件:
frameworks\native\include\android\keycodes.h
增加定义 AKEYCODE_MTC_FAC_NEC_WB_SET_START = 5001, frameworks\native\include\input\InputEventLabels.h
增加定义 DEFINE_KEYCODE(MTC_FAC_NEC_WB_SET_START),frameworks\base\core\java\android\view\KeyEvent.java
增加定义 public static final int KEYCODE_MTC_FAC_NEC_WB_SET_START = 5001;frameworks\base\core\res\res\values\attrs.xml
增加 <enum name="KEYCODE_MTC_FAC_NEC_WB_SET_START" value="5001" />system\core\toolbox\getevent.h---》这个文件很关键,这里是把linux的按键get到android层的定义增加
增加定义 LABEL(KEY_MTC_FAC_NEC_WB_SET_START),
以上文件都是Android层关于按键key的定义
device\amlogic\p34a9\files\Vendor_0001_Product_0001.kl ---》这里就是linux层到Android的映射键值对
增加映射 key 690 MTC_FAC_NEC_WB_SET_START
到这里就把 遥控器 scancode REMOTE_KEY(0xB0, KEY_MTC_FAC_NEC_WB_SET_START)---》KEY_MTC_FAC_NEC_WB_SET_START 690---》 690 MTC_FAC_NEC_WB_SET_START 映射到了android层的 MTC_FAC_NEC_WB_SET_START 了
到这里所有自定义遥控按键增加完毕,接下来就是在Framework/base下对新增按键的处理了,这里对其不再讲述了,关于framework/base下按键的处理流程,请小伙伴们自行搜索下
另外在调试的过程中用到如下命令,用于查看输入设备及输入的键值
getevent -l/getevent -v 查看遥控器对应的设备 /dev/input/event3
dumpsys input ,可以根据所连接的遥控器的名称找到遥控器对应的kl文件。
input keycode 5001----》在Android层调试按键功能用到,发送的是Android定义的按键。