[笔记分享] [遥控器]Android蓝牙及红外遥控器键值适配

在海思、Amlogic、Mstar平台上适配蓝牙或者红外遥控器,可以按照以下的步骤进行排查和修改。

1.前置工作

1.1 getevent -l

无论是蓝牙遥控器还是红外遥控器,都需要确定其使用的kl (KeyLayoutFile)文件。在安卓shell 环境执行命令确认kl 文件:getevent -l (getevent -v),按遥控器方向按键下键和菜单键,观察串口是否有打印,如图1:

                                     图1

(如果不能获取到对应打印,则需要联系遥控器厂商咨询对应遥控器的HID键值码表,将特有的HID键值码补充到内核下input子系统中)

由上图可知哦,连接放入蓝牙遥控器对应/dev/input/event3。以下三行表示按键(HID键值码 0x0051)被按下

/dev/input/event3: EV_MSC       MSC_SCAN             00070051

/dev/input/event3: EV_KEY       KEY_UP               DOWN

/dev/input/event3: EV_SYN       SYN_REPORT           00000000

以下三行表示按键(HID键值码 0x0051)被释放

/dev/input/event3: EV_MSC       MSC_SCAN             00070051

/dev/input/event3: EV_KEY       KEY_UP               UP

/dev/input/event3: EV_SYN       SYN_REPORT           00000000
  • EV_SYN: 用作分隔事件的标记。 事件可以在时间或空间上分开,例如使用多点触控协议。
  • EV_KEY: 用于描述键盘,按钮或其他类似键的设备的状态更改。
  • EV_MSC: 用于描述不适合其他类型的杂项输入数据。

1.2 0x00070051十六进制的含义

其中0x0007表示HID键值码为键盘码区,0x0051 HID键值码对应的为第81个数(由于下图每行16个,也可以通过第6行第2列查找)。如图2框中,0x0051对应的值为108。如果对应的值恰巧为unk,则需要做适当改动。

海思代码路径:.../ kernel/linux-3.18.y/drivers/hid/hid-input.c

Amlogic代码路径:common/drivers/hid/hid-input.c

Mstar代码路径: vendor/mstar/kernel/tegra/drivers/hid/hid-input.c

                                                                    图2

已经确认0x0051HID键值码在内核下对应的值为108。

1.3 0x000c0040十六进制的含义

海思代码路径:…/kernel/linux-3.18.y/ hid.h

Amlogic代码路径:common/include/linux/hid.h

Mstar代码路径:vendor/mstar/kernel/tegra/include/linux/hid.h

根据图3,我们看到0x000c表示的是HID_UP_CONSUMER宏对应的范围。

                                         图3

海思代码路径:.../ kernel/linux-3.18.y/drivers/hid/hid-input.c

Amlogic代码路径:common/drivers/hid/hid-input.c

Mstar代码路径: vendor/mstar/kernel/tegra/drivers/hid/hid-input.c

根据图4,0x0040对应HID键值码对应HID_UP_CONSUMER宏下的KEY_MENU功能

                                                图4

海思代码路径:…/kernel/linux-3.18.y/include/uapi/linux/input.h

Amlogic代码路径:common/arch/arm/boot/dts/include/dt-bindings/input/input.h

Mstar代码路径:vendor/mstar/kernel/tegra/include/dt-bindings/input/input.h

可以看到map_key_clear的是KEY_MENU,对应Android层的键值为139

                                                                     图5

查看/system/usr/keylayout/Generic.kl,如图9所示,key 139对应MENU,与遥控器按键功能一致

                                                                      图6

1.4 dumpsys input

在安卓shell 环境下执行 dumpsys input ,可以根据所连接的遥控器的名称找到遥控器对应的kl文件。

                                              图7

这里所用到的Android层映射文件为/system/usr/keylayout/Generic.kl(各个项目使用的kl文件可能不一样,Generic.kl为默认的;.kl文件代码路径:/framework/base/data/keyboards;盒子路径:/system/usr/keylayout)。查看单板该路径下文件,找到108对应的键值,为DPAD_DOWN,如图4,与按键需要的功能一致。

                                        图8

如果hid-input.c中获取到的值为unk,从Generic.kl(项目具体使用的kl文件)下找到对应功能的值,填到hid-input.c中对应的位置。

1.5 Android 键值

Android应用层在onKeyUp,onKeyDown 中识别的就是keyCode。android 键值定义文件如下:

android5.1

frameworks\native\include\android\keycodes.h //android标准键值表

frameworks\native\include\input\InputEventLabels.h   //定义自定义的字符串

rameworks\base\core\java\android\view\KeyEvent.java//android需上报的键值

frameworks\base\core\res\res\values\attrs.xml //自定义键值与字符串关系

android4.4

/frameworks/native/include/input/KeycodeLabels.h //android标准键值表

frameworks\base\core\java\android\view\KeyEvent.java //android需要上报的键值

frameworks\base\core\res\res\values\attrs.xml

2. 蓝牙键值适配——以添加返回和设置键为例

2.1 单板连上蓝牙遥控器后,按返回键无反应,但是getevent有打印

根据遥控器厂商提供的HID键值表,0x0007对应键盘码区。

海思代码路径:.../ kernel/linux-3.18.y/drivers/hid/hid-input.c,0x0029就是第3行第10列,对应为1。

再查看蓝牙遥控器连接所用的.kl文件, Generic.kl,发现1对应的是ESCAPE

而能实现back功能对应的为158

所以,在修改键码前,按遥控器实现的功能为ESCAPE,而不是返回。为了减少内核代码的修改,我们不要将hid-input.c中的1修改为158,而是将 key 1 对应的ESCAPE改为BACK

当然,不会直接在Generic.kl文件中进行修改,可以将Generic.kl复制一份,并将文件名改为与遥控器VIDPID相对应的名字,例如电信BLE语音遥控器的VID,PID为060a,1000,所以将复制出来的kl文件改名为Vendor_060a_Product_1000.kl。遥控器连接后会自动根据其VID,PID加载对应的kl文件。

2.2 单板连上蓝牙遥控器后,按设置键无反应,且getevent无打印

根据遥控器厂商提供的HID键值表,0x0c对应的是HID_UP_CONSUMER区域

从…/kernel/linux-3.18.y/include/uapi/linux/input.h中查到,设置按键对应的key code为

在(代码路径:.../ kernel/linux-3.18.y/drivers/hid/hid-input.c)如下图框中添加代码

烧录内核代码后,再次从串口通过getevent获取操作设置键的打印,如果有打印,检查功能是否正常,如果无打印,请重新检查修改是否正确。

综上,蓝牙遥控器按键值适配简要流程如下:由getevent蓝牙按键打印确认是蓝牙键盘类型(0x7)还是自定义类型(0xC),根据不同的类型修改内核和kl文件。

3. 红外遥控器适配

Android IR实现原理可参考:https://blog.csdn.net/zhanxingshan007/article/details/81096124

按下遥控器的一个按键后,在系统中的逻辑过程:遥控器的物理键值——>Linux的标准键值——>自定义的字符串——>定义这个字符串——>android标准键值——>android键值上报——>所有上报表中键值判断是否为全局——>(上报成功)。

Amlogic平台执行remotecfg可以屏蔽红外遥控器,执行remotecfg.sh 可以打开红外遥控器。

红外遥控器与蓝牙遥控器的流程仅仅驱动内核层配置不一样,框架层的kl文件配置以及android应用层完全相同。而海思、Amlogic、Mstar的驱动层红外配置也不相同。

 

3.1 海思红外

device\hisilicon\bigfish\system\ir_user\key_pars/key.xml(物理键值àLinux键值对应字符串)

device/hisilicon/bigfish/system/ir_user/key_pars/linux_key.h

海思红外遥控器需要在device\hisilicon\bigfish\system\ir_user\key_pars\key.xml中配置,且可以配置多个不同的遥控器。

0xee115da0:5da0为遥控器头码,11为遥控器物理键值,ee为校验值。

3.2 Amlogic红外

device\amlogic\p201_iptv\remote.conf(物理键值àLinux键值)

common/arch/arm/boot/dts/include/dt-bindings/input/input.h

Amlogic红外遥控器需要在device\amlogic\p201_iptv\remote_*.conf中配置,每个remote_*.conf中只能配置一款遥控器, 最终需要在device\amlogic\p201_iptv \p201_iptv.mk中决定使用哪款遥控器配置。

3.3 Mstar红外

vendor/mstar/mi/MI_project/project/board/c2p/MSO9385-BGA-DDR4/ir_config.ini(物理键值àLinux键值对应字符串)

vendor/mstar/kernel/tegra/include/dt-bindings/input/input.h

Mstar红外遥控器需要在MI_project/project/board/c2p/xxx/ir_config.ini中配置,且可以配置多个不同的遥控器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章