记录RTK平台上适配红外&蓝牙遥控器,以便以后查看。

红外遥控器

遥控器流程图

物理按键的定义是在ir_table.config
如:
NEC编码: 1
RCA编码: 8
0xE31CC738 :scancode
KEY_POWER : keycode

其中三个头文件分别对解析 scancode 进行了转换,路径如下:

  1. kernel\system\lib\develop\ir_bin_create\input-event-custom-codes.h
  2. kernel\linux\linux-4.14\include\uapi\linux\input-event-custom-codes.h
  3. kernel\linux\linux-4.14\include\uapi\linux\input-event-codes.h

由上述编译文件进行编译,生成对应的ir_table.bin

编译方法:

./ir_bin_create generate  ir_table.config ir_table.bin

验证是否成功编译到.bin文件

./ir_bin_create print ir_table.bin

ir_table.bin ——> bootcode

在bootcode中,由 uboot\arch\arm\cpu\armv7\rtd285o\bootparam.c 的 get_factory_ir_table_from_factory()函数来读取 ir_table.bin的地址将其传给kernel

在串口使用cat /proc/cmdline命令可以看到地址

bootcode ——> kernel

在kernel中 odin2k\kernel\linux\linux-4.14\drivers\rtk_kdriver\ir\ir_table\ir_table_user.c 会去拿这个传过来的地址

static int __init venus_ir_input_table_addr_parse(char *options)
{   unsigned long ir_table_phy_address = 0;if(options == NULL)return 0;  if (sscanf(options, "%lx", &ir_table_phy_address) != 1)return 0;g_ir_boot_memory_address = ir_table_phy_address;IR_INFO("g_ir_boot_memory_address == %lx\n", g_ir_boot_memory_address);return 0;
}early_param("ir_table", venus_ir_input_table_addr_parse);

之后在 kernel\linux\linux-4.14\drivers\rtk_kdriver\ir\irrc_core.c 文件中

  1. 判断协议是否正确,并解析出 scancode
static int examine_ir_avail(uint32_t *which, uint32_t *regValue, uint32_t *irrp2Value, int *dataRepeat)
  1. 根据 scancode 去找keycode
 static int repeat_key_handle(uint32_t which, uint32_t regValue, uint32_t irrp2Value, int dataRepeat)
{......keycode = venus_ir_scancode_to_keycode(regValue);......
}
  1. 在 kernel\linux\linux-4.14\drivers\rtk_kdriver\ir\ir_input.c 上报keycode键值
void venus_ir_input_report_key(uint32_t repkey)
{......input_report_key(data->input_dev, data->prev_keycode, 0);input_sync(data->input_dev);......
}

kernel——>key映射
这里就说的是linux到Android的映射按键值,这其中有有两个地方需要添加映射分别是.xml和.kl文件,其中xml是自定义的映射

# Power / Mute
key 116   POWER
key 113   VOLUME_MUTE# Numbers
key 2     1
key 3     2
key 4     3
key 5     4
key 6     5
key 7     6
key 8     7
key 9     8
key 10    9
key 11    0
key 551   TV_NUMBER_ENTRY

上述.kl文件中 key 8 7 其中8就是kernel上传上来的值,而7这个标签是映射要继续上传到 fromworks 层由KeyEvent.java来定义其的键值

自定义的全局按键xml映射的映射路径 ir_table.config——>xxxx.xml——>RtkKeyInterceptService.apk

<key scancode="729" label="KEYCODE_APP_LIST" keycode="2013"/>
<key scancode="166" label="KEYCODE_APP_LIST" keycode="2013"/>
<key scancode="712" label="KEYCODE_BLUETOOTH" keycode="2014"/>
<key scancode="708" label="KEYCODE_COLOR_TEMP" keycode="2015"/>
<key scancode="717" label="KEYCODE_CSM_DISPLAY_OFF" keycode="2016"/>
<key scancode="716" label="KEYCODE_CSM_DISPLAY_ON" keycode="2017"/>
<key scancode="724" label="KEYCODE_FACTORY_HOTKEY_OFF" keycode="2018"/>
<key scancode="725" label="KEYCODE_FACTORY_HOTKEY_ON" keycode="2019"/>
<key scancode="718" label="KEYCODE_LIGHT_SENSOR_OFF" keycode="2020"/>
<key scancode="719" label="KEYCODE_LIGHT_SENSOR_ON" keycode="2021"/>

上述.xml文件中 scancode 的值是kernel上传上来的值,映射的是label 其keycode是其上报给 RtkKeyInterceptService.apk 的键值

因此, RtkKeyInterceptService.apk 的接受的keycode由两处获得,分别是 .kl 文件和 xml 文件

key映射——>fromworks

当按键传到 fromworks 我们只需要更改 KeyEvent.java 来完成最后的按键定义,之后就是到 PhoneWindowManager.java 来实现按键功能实现拦截或继续传递。

fromworks——>app

从 PhoneWindowManager.java 之后所有未拦截的按键都将传递到 RtkKeyInterceptService.java ,这里大部分都是发送实现功能的广播,然后可以在这里来选择是否继续向下传递。

RtkKeyInterceptService.apk 中的拦截和继续上报
//return 1代表拦截,不会再发键值去android
//return 0 代表会把值传回给驱动,然后驱动再次上报给 android

蓝牙遥控器

拿到一个蓝牙遥控器后,TV先连接蓝牙遥控之后使用命令 getevent

console:/ # getevent
add device 1: /dev/input/event2name:     "RC890"
add device 2: /dev/input/event1name:     "rtk_keypad"
add device 3: /dev/input/event0name:     "IR_tcl_rca"/dev/input/event2: 0004 0004 000c0223
/dev/input/event2: 0000 0000 00000000
/dev/input/event2: 0001 00ac 00000001
/dev/input/event2: 0000 0000 00000000
/dev/input/event2: 0004 0004 000c0223
/dev/input/event2: 0000 0000 00000000
/dev/input/event2: 0001 00ac 00000000
/dev/input/event2: 0000 0000 00000000

RC890蓝牙遥控器的设备号,其所对应的kl文件是RC890.kl ,该次按键上报的值是 0xac

在 /branches/RTK_2851M_TCL/kernel/linux/linux-4.14/drivers/hid/hid-input.c 修改上报蓝牙按键

case 0x055: map_key_clear(0x1f5);        break; /* Menu Setting */
case 0x053: map_key_clear(KEY_SMARTZONE);       break; /* Menu Smart */
case 0x049: map_key_clear(KEY_SOURCE);      break; /* Menu Source */
case 0x050: map_key_clear(KEY_MENU);        break; /* Menu */
case 0x052: map_key_clear(KEY_VRKEYBOARD);      break; /* Menu VRKEYBOARD*/
case 0x0b7: map_key_clear(KEY_APPS_LIST);       break; /* Menu Youtube*/
case 0x058: map_key_clear(KEY_TCL_USB);     break; /* Menu TCL_USB*/
case 0x0a6: map_key_clear(KEY_MIC_DETECT);      break; /* Menu MIC_DETECT*/

定义路径:
kernel/linux/linux-4.14/include/uapi/linux/input-event-codes.h
kernel/linux/linux-4.14/include/uapi/linux/input-event-custom-codes.h

A&Q

  1. 如何获取遥控器的scancode?
    在串口输入如下命令,[irrp=XXXXXXXX] 即为 scancode

    echo 8 > /proc/sys/kernel/printk
    echo 1 > /sys/venus_ir/ir_decode_debug
    
  2. 如何查看上报的keycode?
    在串口输入 getevent 并按下遥控按键 【数字7】 可以看到如下输出

    console:/ # getevent
    add device 1: /dev/input/event1name:     "rtk_keypad"
    add device 2: /dev/input/event0name:     "IR_tcl_rca"/dev/input/event0: 0001 0008 00000001
    /dev/input/event0: 0000 0000 00000000
    /dev/input/event0: 0001 0008 00000000
    /dev/input/event0: 0000 0000 00000000
    

    以上008即为上报的keycode(注意是16进制)
    同时还可以看到使用的设备号为 IR_tcl_rca (遥控器)、rtk_keypad(按键板)

  3. 如何查看遥控器使用哪个kl映射文件?
    使用 dumpsys input 命令查看

  4. 如何用串口输入按键?
    使用 input keyevent 20 在KeyEvent.java中查阅相关的键值

  5. 如何添加特殊的遥控器头码?
    kernel\android\android-10\vendor\realtek\common\ATV\frameworks\native\ExtTv\src\service\ExtFactoryManager.cpp
    在上述路径单独添加

  6. 如何开启遥控器kernel打印?

     echo 8 > /proc/sys/kernel/printk;echo 1 > /sys/venus_ir/ir_decode_debug
    
  7. 如何用串口切换协议?

    echo 8 > /sys/venus_ir/ir_protocol  【RCA协议】
    echo 1 > /sys/venus_ir/ir_protocol  【NEC协议】
    
  8. Debug 如何取消头码匹配?
    取消头码匹配,在boot下输入命令 irda_filter disable
    开启头码匹配,在boot下输入命令 irda_filter enable

  9. 如何查看ini遥控器配置?
    在串口中输入 cat /tmp/factory/bin_panel/000BootParam.h

  10. 在配置文件ini中修改IR进行头码匹配

        [IRFilter]IR_Filter="00000fff,00000f00,0,0";  #IR_Filter="00000fff,00000f00,0,0-0000ffff,0000c738,0,0";[IR]#tcl_kt1752(NEC),tcl_rca(RCA)...IR_CONFIG="tcl_rca(RCA)";
    

    IR_Filter是遥控器的按键匹配码
    如,00000fff 和00000f00之间的是 ‘位&’关系。相当于scancode只保留后三位f00作为头码
    如果 scancode 和头码相匹配则按键上报,否则拦截
    注:可以采用 - 的方式添加多个头码

  11. Debug验证方法:

    1. 先编译出ir_table.bin文件
    2. 进入boot模式,命令 facro list 查看文档目录
    3. 删除ir_table.bin文件命令 facro delete tmp/factory_ro/ir_table.bin
    4. 保存命令 facro save
    5. 进入rescue模式(不要插U盘) 命令 go r
    6. 之后分别执行命令 cd tmp/factory cp /mmnt/udisk/xxx/ir_tabl.bin
    7. 保存退出 factory save reboot

【笔记分享】Android TV 红外蓝牙遥控器添加相关推荐

  1. Android系统适配蓝牙遥控器键值Hi3798MV100

    最近有个项目机顶盒要适配蓝牙遥控器,我们原来的盒子是红外的遥控器. 从某宝买回来几款通用的遥控器,最简单的一款用cat /proc/bus/input/devices 命令查看name是BESCO K ...

  2. 电视红外/蓝牙遥控器键值定义和适配

    电视遥控器适配和常见问题 遥控器键值适配 遥控器键值适配 一般来说,遥控器分蓝牙遥控器和红外遥控器.红外遥控器是指遥控器通过红外发射器把信号进行发射,接收设备则通过红外接收器进行信号接收:蓝牙遥控器是 ...

  3. android 蓝牙 遥控 电脑,Android系统适配蓝牙遥控器键值

    1,先确定走(/system/usr/keylayoutandroid系统中在/framework/base/data/keyboards)哪一个kl文件,可以通过指令getevent-l是那个eve ...

  4. android TV盒子开发遥控器按键的监听

    代码如下: public class MainActivity extends Activity {private String TAG="key";@Overrideprotec ...

  5. Android系统适配蓝牙遥控器键值

    1,先确定走(/system/usr/keylayoutandroid系统中在/framework/base/data/keyboards)哪一个kl文件,可以通过指令getevent-l是那个eve ...

  6. Android TV 开发有关PopupWindow的KeyListener(手机也能用)

    转载请标明原地址:Android TV 开发有关PopupWindow的KeyListener(手机也能用)_高磊的专栏-CSDN博客 现在这个公司主要是做智能电视视频方面.有硬件电视盒子,APP开发 ...

  7. [笔记分享] [遥控器]Android红外及蓝牙遥控器适配流程

    在海思.Amlogic.Mstar平台上适配蓝牙或者红外遥控器,可以按照以下的步骤进行排查和修改. 1.前置工作 1.1 getevent -l 无论是蓝牙遥控器还是红外遥控器,都需要确定其使用的kl ...

  8. Android 蓝牙遥控器的连接

    项目是TV端的,产品要求不经过设置界面,开机进入引导页,自动搜索蓝牙遥控器并且建立连接. 刚开始接手的时候以为会很快完成,无非就是调用API吗?可是事实不是这样,前后花了一些时间,才解决. 好了,当时 ...

  9. Android 11.0 12.0蓝牙遥控器确认键弹不出输入法的解决方法

    1.概述 在android11.0 12.0设备定制化开发时,遥控器是使用红外遥控器,也有使用蓝牙遥控器的,所以出现的问题不一定相同,今天遇到个问题就是蓝牙遥控器在输入数据时弹不出输入法的问题 首选排 ...

  10. Android TV TIF源码阅读笔记

                                   Android TV TIF源码阅读笔记 1.SystemSever.java if (mPackageManager.hasSystem ...

最新文章

  1. Vue视频教程系列第三十七节-子路由地配置
  2. [html] 制作一个不规则形状有哪些方法可以实现?
  3. 两相流计算中,如何用Tecplot提取水相断面平均物理量?
  4. 学习之法 —— 如何阅读代码、如何编写代码
  5. GDUFE ACM-1096
  6. SSH终端仿真器:ZOC 8 for Mac
  7. Conda集成arcpy2.7
  8. springboot宿舍管理系统
  9. 超硬核!数据结构学霸笔记,考试面试吹牛就靠它
  10. VisionPro实现测量工件内圆尺寸
  11. 什么是Web2.0(图解Web2.0)
  12. IDEA如何设置author头注解
  13. CodeLite 16.0可以编译通过,但是在编辑器界面会显示找不到标准库头文件
  14. 在excel中如何筛选重复数据_EXCEL如何快速筛选重复数据,并将结果快速复制到其他单元格...
  15. 创客教育的起源和内涵的基本理念
  16. 详解DNS服务、DNS解析、DNS劫持和污染
  17. html钢琴块游戏源码,好玩的钢琴块游戏
  18. 高数 | 【一元函数积分学】换元法和分部积分法 使用条件与细节问题
  19. echarts图片的打印问题
  20. 约瑟夫生者死者小游戏

热门文章

  1. Civil 3D API二次开发学习指南
  2. python代写学生作业_data留学生作业代做、代写Python程序设计作业、代做Python实验作业...
  3. 计算机界十位顶级人物!
  4. html怎么把网址设为首页,怎样让网站设为首页和加入收藏
  5. 费用型采购订单后台配置
  6. 《Robot Framework自动化测试修炼宝典》道长
  7. mvn help:system下载包失败解决
  8. java发送lrc文件格式_java中用正則表達式解析LRC文件
  9. 衣带渐宽终不悔,为伊消得人憔悴--DbHelper增强版
  10. 我教你写Makefile,你给我介绍Girlfriends.