androidstb遥控器适配(代码片段)

Kevin张俊杰 Kevin张俊杰     2022-11-30     499

关键词:

文章目录

一、常用命令介绍

在目前的机顶盒市场中,海思和Amlogic(之前还有Mstar)是主流的芯片方案。因此,在这几种芯片上适配红外和蓝牙遥控器也就成为了机顶盒厂家的常见工作,本篇文章简单介绍下遥控器的适配方式。

使用getevent -l可以查看该机顶盒上适配的遥控器及对应的event,然后再随便按个按键,串口输出如下:

130|root@Hi3798MV300:/ # getevent -l 
add device 1: /dev/input/event3
 name:     "YYYKQ"
could not get driver version for /dev/input/mouse2, Not a typewriter
could not get driver version for /dev/input/mouse1, Not a typewriter
add device 2: /dev/input/event2
 name:     "qwerty"
could not get driver version for /dev/input/mouse0, Not a typewriter
add device 3: /dev/input/event1
 name:     "Hi mouse"
add device 4: /dev/input/event0
 name:     "Hi keyboard"
could not get driver version for /dev/input/mice, Not a typewriter
/dev/input/event3: EV_MSC       MSC_SCAN             00070051            
/dev/input/event3: EV_KEY       KEY_DOWN             DOWN                
/dev/input/event3: EV_SYN       SYN_REPORT           00000000            
/dev/input/event3: EV_MSC       MSC_SCAN             00070051            
/dev/input/event3: EV_KEY       KEY_DOWN             UP                  
/dev/input/event3: EV_SYN       SYN_REPORT           00000000

以上内容表示适配了四套遥控器,名称分别为YYYKQqwertyHi mouseHi keyboard,目前使用的遥控器为YYYKQ遥控器。下面的六行内容意思为:前三行代表Usage ID为0x51的按键被按下,后面的三行代表Usage ID为0x51的按键弹起。

使用dumpsys input可以查看每套遥控器对应的kl文件,串口输出如下:

130|root@Hi3798MV300:/ # dumpsys input

INPUT MANAGER (dumpsys input)

Event Hub State:
 BuiltInKeyboardId: -2
 Devices:
   -1: Virtual
     Classes: 0x40000023
     Path: <virtual>
     Descriptor: a718a782d34bc767f4689c232d64d527998ea7fd
     Location: 
     ControllerNumber: 0
     UniqueId: <virtual>
     Identifier: bus=0x0000, vendor=0x0000, product=0x0000, version=0x0000
     KeyLayoutFile: /system/usr/keylayout/Generic.kl
     KeyCharacterMapFile: /system/usr/keychars/Virtual.kcm
     ConfigurationFile: 
     HaveKeyboardLayoutOverlay: false
   1: qwerty
     Classes: 0x00000014
     Path: /dev/input/event2
     Descriptor: 0a920d0216027e6e2f378f49650573230b560922
     Location: 
     ControllerNumber: 0
     UniqueId: 
     Identifier: bus=0x0000, vendor=0x0000, product=0x0000, version=0x0100
     KeyLayoutFile: 
     KeyCharacterMapFile: 
     ConfigurationFile: /system/usr/idc/qwerty.idc
     HaveKeyboardLayoutOverlay: false
   2: Hi mouse
     Classes: 0x00000008
     Path: /dev/input/event1
     Descriptor: ddfb717d907e8defcc82f81ba273111db984c56a
     Location: 
     ControllerNumber: 0
     UniqueId: 
     Identifier: bus=0x0000, vendor=0x0001, product=0x0002, version=0x0100
     KeyLayoutFile: 
     KeyCharacterMapFile: 
     ConfigurationFile: 
     HaveKeyboardLayoutOverlay: false
   3: Hi keyboard
     Classes: 0x00000063
     Path: /dev/input/event0
     Descriptor: 485d69228e24f5e46da1598745890b214130dbc4
     Location: 
     ControllerNumber: 1
     UniqueId: 
     Identifier: bus=0x0000, vendor=0x0001, product=0x0001, version=0x0100
     KeyLayoutFile: /system/usr/keylayout/Vendor_0001_Product_0001.kl
     KeyCharacterMapFile: /system/usr/keychars/Generic.kcm
     ConfigurationFile: 
     HaveKeyboardLayoutOverlay: false
   5: YYYKQ
     Classes: 0x8000016b
     Path: /dev/input/event3
     Descriptor: aef83b05c01603404d15b0155c07acee382a4de5
     Location: 
     ControllerNumber: 2
     UniqueId: 
     Identifier: bus=0x0005, vendor=0x0416, product=0x0300, version=0x0000
     KeyLayoutFile: /system/usr/keylayout/Vendor_0416_Product_0300.kl
     KeyCharacterMapFile: /system/usr/keychars/Generic.kcm
     ConfigurationFile: 
     HaveKeyboardLayoutOverlay: false

由上面的输出内容可知,YYYKQ对应的kl文件为/system/usr/keylayout/Vendor_0416_Product_0300.kl

除了上面两个命令,还有一些遥控器方面常用命令,如禁用/启用遥控器命令如下:

芯片禁用红外遥控器启动红外遥控器
Amlogic905Lremotecfg./system/bin/remotecfg.sh
Hi3798MVxxstop ir_userstart ir_user
Mstar9380busybox devmem 0x1f007b00 16 0x0000busybox devmem 0x1f007b00 16 0x01bf

二、红外遥控器适配

按下遥控器的一个按键后,系统中的处理逻辑为:物理键值——>Linux键值——>按键名称——>Android键值

2.1 海思红外遥控器适配

可以先用android_ir_user -D命令查看一下机顶盒适配的所有红外码值,然后按下某个具体按键,如2014格式的上键,串口输出如下:

Received key: 0xb9461420,linux_keycode =0x67,103,1, UP, protocol: .

该内容的意义如下:
1>1420为遥控器头码
3>46为遥控器物理键值
4>b9为校验值
5>0x67转换为实际值就是103,代表该按键对应的Linux键值

device/hisilicon/bigfish/system/ir_user/key_pars/key.xml中寻找0xb9461420,可以查到该键值对应的按键名称,如下:

<key value="0xb9461420" name="KEY_UP"         />      <!--key up-->

以上内容表示0xb9461420对应的是上键。

然后在device/hisilicon/bigfish/system/ir_user/key_pars/linux_key.h中,可以查看该按键对应的Linux键值,如下:

 "KEY_UP",			103     ,

以上内容表示的是上键对应的Linux键值是103。

接下来就是要寻找对应的kl文件,如上述的dumpsys input命令输出的内容中,Vendor_0001_Product_0001.kl就是红外遥控器对应的kl文件,在代码中具体的文件为:device/hisilicon/bigfish/prebuilts/Vendor_0001_Product_0001.kl,上键对应的内容如下:

 key 103   DPAD_UP

按如上步骤,红外遥控器底层键值就已经适配完成。接下来就要适配上层Android键值,上层键值的实现主要在framework代码中实现,具体为以下文件。
frameworks/base/core/java/android/view/KeyEvent.java中,内容如下:

 public static final int KEYCODE_DPAD_UP         = 19;

frameworks/native/include/input/KeycodeLabels.h中,内容如下:

 "DPAD_UP", 19 ,

frameworks/base/core/res/res/values/attrs.xml中,内容如下:

<enum name="KEYCODE_DPAD_UP" value="19" />

frameworks/native/include/android/keycodes.h中,内容如下:

AKEYCODE_DPAD_UP         = 19,

海思上适配红外遥控器的流程到此结束。

2.2 Amlogic红外遥控器适配

Amlogic红外遥控器的适配流程整体上与海思相似,不同的是海思上是key.xml,Amlogic上是remote*.conf。并且海思上的key.xml里可以对应多套红外遥控器键值,而一个remote*.conf只能对应一套红外键值,并且代码里有多个remote*.conf,需要在device/amlogic/p201_iptv/p201_iptv.mk中查看对应的remote*.conf,如下:

   ifeq ($(strip $(CHINA_MOBILE_ENABLE)),true)
	PRODUCT_COPY_FILES += \\
		$(LOCAL_PATH)/remote_chinamobile.conf:system/etc/remote.conf \\
		$(LOCAL_PATH)/remote_chinamobile1.conf:system/etc/remote1.conf \\
		$(LOCAL_PATH)/remote_chinamobile2.conf:system/etc/remote2.conf
else ifeq ($(strip $(CHINA_TELECOM_ENABLE)),true)
	ifeq ($(strip $(BUILD_SH_TELECOM_APKS)),true)
		PRODUCT_COPY_FILES += \\
			$(LOCAL_PATH)/remote_chinatelecom_sh.conf:system/etc/remote.conf 
	else
		PRODUCT_COPY_FILES += \\
			$(LOCAL_PATH)/remote_chinatelecom.conf:system/etc/remote.conf
	endif

	PRODUCT_COPY_FILES += \\
		$(LOCAL_PATH)/remote_chinatelecom1.conf:system/etc/remote1.conf
else ifeq ($(strip $(CHINA_UNICOM_ENABLE)),true)
	PRODUCT_COPY_FILES += \\
		$(LOCAL_PATH)/remote_chinaunicom.conf:system/etc/remote.conf \\
		$(LOCAL_PATH)/remote1.conf:system/etc/remote1.conf
else ifeq ($(strip $(BUILD_SD_MOBILE_APKS)),true)
	PRODUCT_COPY_FILES +=	\\
		$(LOCAL_PATH)/remote_chinamobile2.conf:system/etc/remote2.conf
else
	PRODUCT_COPY_FILES += \\
		$(LOCAL_PATH)/remote.conf:system/etc/remote.conf \\
		$(LOCAL_PATH)/remote1.conf:system/etc/remote1.conf
endif

Amlogic上没有android_ir_user脚本,所以不能执行android_ir_user命令,要看某一按键的物理键值,可以按某一按键,然后使用dmesg命令来看,关键内容如下:

   <6>[  827.604760@0] remote: press ircode = 0x46,
   <6>[  827.604787@0] remote: scancode = 0x0067,maptable = 1,code:0xb9461420

以上内容表示该按键的物理键值是0x46,遥控器头码是1420,b9为校验值,0x67转换为实际值就是103,代表该按键对应的Linux键值。remote*.conf文件的内容如下:

  factory_code = 0x14200001           //遥控器码值类型,如该例子代表该文件是2014码值类型的
  work_mode = 0                               //工作模式设置,1为硬件,0位软件,一般默认选择0
  repeat_enable = 1                           //是否支持按下一直连发键
  repeat_delay = 400                         //按下按键到第一个连发键到时间间隔,单位为ms
  repeat_peroid = 120                        //两个连发键之间的时间间隔,单位为ms
  release_delay = 80                          // 释放按键时间间隔,单位为 ms
  debug_enable = 1                           //是否打开驱动调试打印
  factory_infcode = 2                         //可简单为添加的第几套码值,从0开始,依次增加
  key_begin
      0x46 103
  key_end

以上就是Amlogic的红外遥控器适配与海思存在差异的地方,其余均与海思一致,不再赘述。

2.3 Mstar红外遥控器适配

Mstar红外遥控器适配与海思相似,一个键值配置文件可以对应多套码值,具体文件为device/mstar/ponkan/preinstall32/irkey.cfg。如2014码值格式的上键对应的内容如下:

  0x0246, KEY_UP ,

三、蓝牙遥控器适配

3.1 蓝牙键值

不同芯片平台对蓝牙键值的适配方式是一样的,有差异的是hid-input.c文件的位置,具体如下:
1>海思:device/hisilicon/bigfish/sdk/source/kernel/linux-3.18.y.patch/drivers/hid/hid-input.c
2>Amlogic:common/drivers/hid/hid-input.c
3>Mstar:vendor/mstar/kernel/drivers/hid/hid-input.c

先看一张蓝牙遥控器的码值表,如下:

上面的键值表中第二列表示物理键值,第三列表示蓝牙键,第四列代表上层Android键值。该表中不涉及按键的Linux键值,也就是说明某个按键的Linux键值是可以任意定义的(虽然可以任意定义,但不建议这样做,接下来会详细说明)。

上表的第三列中蓝牙键值有不同的备注,07代表的普通蓝牙键值,0c代表多媒体键值,这两种类型键值的适配方式也不同,具体如下:

07类型键值的适配,就以上键为例,由之前章节得知该键对应的Linux键值为103,所以上键对应的蓝牙键值在hid_keyboard数组中对应的值就是103。其位置由蓝牙键值0x52决定,0x52转换为十进制为82,所以其位置就是hid_keyboard[82]。综合起来也就是hid_keyboard[82]位置的值为103,如下:

   static const unsigned char hid_keyboard[256] = 
	  0,  0,  0,  0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38,
	  50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44,  2,  3,
	  4,  5,  6,  7,  8,  9, 10, 11, 28,  1, 14, 15, 57, 12, 13, 26,
	  27, 43, 43, 39, 40, 41, 51, 52, 53, 58, 59, 60, 61, 62, 63, 64,
	  65, 66, 67, 68, 87, 88, 99, 70,119,110,102,104,111,107,109,106,
	  105,108,103, 69, 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71,
	  72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190,
	  191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113,
	  115,114,unk,unk,unk,121,unk, 89, 93,124, 92, 94, 95,unk,unk,unk,
	  122,123, 90, 91, 85,unk,unk,unk,unk,unk,unk,unk,111,unk,unk,unk,
	  unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
	  unk,unk,unk,unk,unk,unk,179,180,unk,unk,unk,unk,240,unk,unk,unk,
	  unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,250,unk,unk,unk,
	  unk,unk,unk,unk,unk,unk,unk,unk,111,unk,unk,unk,unk,unk,unk,unk,
	  29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113,
	  150,158,159,128,136,177,178,176,142,152,173,140,unk,unk,unk,unk
;

如果某个0c类型键值在适配过程中,发现kl文件与hid_keyboard数组中的值不对应,建议修改kl文件。

0c类型键值的适配,以设置为例,在HID_UP_CONSUMER中对应的代码为:

  case 0x0eb: map_key_clear(KEY_SETUP);  break;

case后面的值为为对应的蓝牙键值,map_key_clear内的值为对应的按键名称。

3.2 kl

要明确蓝牙键值对应哪个kl文件,仍可用上面提及的dumpsys input,如frameworks/base/data/keyboards/Vendor_0416_Product_0300.kl

kl文件中的配置,与红外适配时相同,不再赘述。

3.3 Android键值

映射到上层Android键值的部分,也与红外就键值适配时相同,涉及以下几个文件:
frameworks/base/core/java/android/view/KeyEvent.java
frameworks/base/core/res/res/values/attrs.xml
frameworks/native/include/android/keycodes.h
frameworks/native/include/input/KeycodeLabels.h

至此,Android TV上适配遥控器键值已全部完成。

textgit遥控器(代码片段)

查看详情

python三星电视遥控器python脚本(代码片段)

查看详情

sh不再在遥控器上删除本地品牌(代码片段)

查看详情

利用python+tkinter做一个简单的智能电视遥控器(代码片段)

要通过python实现遥控器功能分两步:第一步:开发图形化界面第二步:使PC端给电视发送相应指令现在就开始第一步操作实现遥控器功能,python2输入以下代码注意:python3需要将代码中的fromTkinterimport*           替... 查看详情

esp8266+红外模块制作万能网路遥控器(代码片段)

ESP8266+红外模块制作万能网路遥控器通过红外模块模拟遥控发射指令接入blinker平台,通过手机可以远程控制。前提是先读取出你要操控设备遥控的发射码出来。参考《Arduino红外接收码获取程序》手机APP:点灯blinker在APP应用里面... 查看详情

命令模式(代码片段)

...式:将方法的请求者跟方法的实现者进行分开,常见的例子:遥控器(命令发送者Invoker)通过按钮(具体的命令Command)来操作电视机(Receiver命令接收者或者说是命令实现者)*这样做的话,方法的请求者(遥控器)跟实现者(电视机)就分开了,解... 查看详情

esp8266+433模块结合制作网路遥控器示例(代码片段)

ESP8266+433模块结合制作网路遥控器示例所需库:rcswitch库可在ArduinoIDE里面下载到,LinkedList库:https://github.com/ivanseidel/LinkedList程序代码/*NodeMcu或esp-01/01s控制1路继电器,集成blinker平台,用手机app控制1路继电器开关,添加一路物理... 查看详情

树梅派硬件编程_红外遥控器(代码片段)

红外遥控器红外遥控原理用户码或数据码中的每一个位可以是位‘1’,也可以是位‘0’。区分‘0’和‘1’是利用脉冲的时间间隔来区分,这种编码方式称为脉冲位置调制方式,英文简写PPM。红外接收头的型号有很... 查看详情

phpphpadsense帐户监控器(代码片段)

查看详情

inavflight之rc遥控msp协议(代码片段)

iNavFlight之RC遥控MSP协议1.RC摇杆MSP协议2.地面站配置&MSP遥控器2.1iNav地面站-配置2.2iNav地面站-MSP遥控器3.RC摇杆总体逻辑框架3.1摇杆信息获取3.2摇杆信息处理3.3摇杆处理初始化4.RC摇杆代码设计框架4.1场景分析4.2模块化抽象5.MSP摇... 查看详情

红外遥控学习,万能遥控解决方案(代码片段)

红外遥控学习,万能遥控解决方案1.原理2.思路3.红外遥控接收3.1初始化定时器3.2定时器输入捕获3.3获取数据3.4红外接收测试3.5测试过程4.发送程序4.1初始化定时器和定时器的通道4.1发送函数1.原理目前电视机、空调等家电大部... 查看详情

玩玩flutter的拖拽——实现一款万能遥控器(代码片段)

...写过的一篇博客:玩玩Android的拖拽——实现一款万能遥控器,就想着用Flutter来复刻一下。顺便练习一下Flutter里的拖拽Widget。先给大家看看最终的实现效果以及与Android版的对比(个人觉得还原度很高,甚至Flutter... 查看详情

飞控遥控器原型(代码片段)

最近打算折腾飞控,找了找资料和淘宝,发现一个飞控遥控器都要500起步,实在莫名奇妙,研究了下,没啥新奇,就自己做吧看看效果,只是原型,还要做PCB,目前尺寸还是很占空间的。遥控器:1个arduinoUNO+2个旋转电位器开关+1... 查看详情

和12岁小同志搞创客开发:如何驱动红外遥控器?(代码片段)

目录1、红外遥控器通信原理2、NEC协议3、实践机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧。项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html 红外遥控器是我们常用的一种遥控设... 查看详情

和12岁小同志搞创客开发:如何驱动红外遥控器?(代码片段)

目录1、红外遥控器通信原理2、NEC协议3、实践机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧。项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html 红外遥控器是我们常用的一种遥控设... 查看详情

38.死锁(代码片段)

...上的共享资源 需求:  有2个人要看电视,狗蛋有遥控器,张三有电池。只有电池和遥控器都有了才能看电视 代码如下:classDeadLockextendsThreadpublicDeadLock(Strin 查看详情

基于点灯blinker——esp8266红外遥控空调(代码片段)

...如需制作万能的遥控参照《ESP8266+红外模块制作万能网路遥控器》注意btn-mode 查看详情

apm飞控学习笔记之-rc_channel遥控器数据获取-cxm(代码片段)

前言这一篇分析APM的遥控器数据获取ArduCopter\\Copter.cpp中rc_loop遥控器线程constAP_Scheduler::TaskCopter::scheduler_tasks[]=SCHED_TASK(rc_loop,100,130),SCHED_TASK(throttle_loop,50,75),SCHED_TASK(update_GPS,50,200),void 查看详情