电视遥控器适配和常见问题

  • 遥控器键值适配

遥控器键值适配

一般来说,遥控器分蓝牙遥控器和红外遥控器。红外遥控器是指遥控器通过红外发射器把信号进行发射,接收设备则通过红外接收器进行信号接收;蓝牙遥控器是指遥控器通过蓝牙方式进行交互,遥控器和被连接设备均支持蓝牙则可以进行蓝牙操作。
每个遥控器的每个按键都有独特的物理码,这是遥控器出厂时就已经具备的,而且不同的遥控器厂商也有单独的用户码。我们通过已知的条件,需要在SDK里做出相应的适配和映射。

  • 遥控器红外键值没定义
    1.第一步:要知道这个遥控器的按键对应的scancode码是什么?有两种方式可以知道这个scancode没定义的值是什么。一、使用命令dmesg -c;二、使用echo 8 > /proc/sys/kernel/printk;这两种方式都可以查询到遥控器某个按键没定义的物理码。以下我用音量键减没定义为例。
    通过使用dmesg -c查询如下:

    如上图所示,很明显可以看到音量键减没定义的物理码是154,这个是十进制的数值,需要转换为十六进制,转换之后为9A,这个值先保留记住,之后适配时需要用上。

    2.第二步:需要知道遥控器的用户码,每款遥控器都有独特的用户码,就好像每个人都有自己的身份证一样,用户码就是遥控器身份证。使用cat /sys/devices/virtual/remote/amremote/customcode命令进行查看遥控器用户码,在串口执行该命令后,按下遥控器的任意键,再次执行该命令就可以看到你使用这款遥控器的用户码了。

    3.第三步:进行定义。需要定义该用户码相关的remote配置文件,该文件是主要映射物理码和安卓键码的,是联系底层和上层的一个枢纽文件。知道了用户码和物理码即可开始配置remote配置文件,配置内容如下:

    // remote配置文件
    custom_name = test-remote-1
    custom_code = 0xc43b
    release_delay = 80
    key_begin0x9a    114   #VOLUME_DOWN
    key_end
    

    此时使用getevent命令,再按压音量键减,则会有相应的输出,如下:

    但此时音量键的功能还没能正常使用,需要把remote文件和kl文件关联起来。

    4.第四步:需要知道遥控器对应的kl是哪个,需要知道遥控器的pid和vid是什么?也可以知道目前遥控器使用的是哪个kl文件?从上面步骤可得知,目前遥控器使用的event是/dev/input/event1,可以使用getevent -v来得知/dev/input/event1对应的是哪个pid和vid,使用getevent -v得出结果如下:

    红色框住的就是pid和vid,我们可以通过pid和vid直接配置kl文件,放置文件到指定目录下。可以使用dumpsys input命令查询到目前/dev/input/event1对应的kl文件,如下:

    目前知道了kl文件,文件名字也和pid、vid对应,则无须新建,直接通过vi修改文件,把音量键减的逻辑添加进去,刚才在remote文件中定义0x9a对应的是114,所以在kl文件里面则是通过114这个id来做标识,在kl文件里面添加逻辑如下:

    key 114   VOLUME_DOWN
    

    此时音量键减功能已生效,肯定还有看官会很疑惑为什么音量键减功能就会生效了,其实关键就在VOLUME_DOWN这个值里,这个不是随便写的,是有底层文件与之相对应的。

    5.第五步:要查找KeyEvent.java文件相关定义,路径为frameworks/base/core/java/android/view/,查看到相关代码如下:

        /** Key code constant: Volume Down key.* Adjusts the speaker volume down. */public static final int KEYCODE_VOLUME_DOWN     = 25;
    

    数值25则是映射成最上层的安卓键值,可通过命令logcat -s WindowManager进行查询,按压音量键减,logcat -s WindowManager结果输出如下:

    按下和弹起则是一个轮回,可以看到输出结果就是25,和KeyEvent.java文件里面的值对应了起来。
    重点:一般定义的键值涉及三个文件(attrs.xml、keycodes.h、InputEventLabels.h),在这三个文件里都会得到音量键减的相关的一些逻辑,如下:

    //路径为:frameworks/base/core/res/res/values/attrs.xml
    <enum name="KEYCODE_VOLUME_DOWN" value="25" />
    
    //路径为:frameworks/native/include/android/keycodes.h
    /** Volume Down key.* Adjusts the speaker volume down. */
    AKEYCODE_VOLUME_DOWN     = 25,
    
    //路径为:frameworks/native/include/input/InputEventLabels.h
    DEFINE_KEYCODE(VOLUME_DOWN),
    

    之后需要自定义键值在该四个文件里进行定义即可。
    小知识:可在hotkey.properties文件下配置热键,一般预置在设备的/system/etc目录下。
    至此,红外遥控器的键值简单适配和定义讲诉完毕,下面讲蓝牙遥控器的键值适配和定义。

  • 遥控器蓝牙键值没定义
    1.第一步:通过蓝牙连接好蓝牙遥控器和设备。
    2.第二步:需要知道没定义遥控器的蓝牙HID键码值Usage ID,如果是自定义的Usage ID,一般需要遥控器厂商提供,一般是根据规范定义出来的。我以蓝牙遥控器#键为例,目前蓝牙遥控器#键没有效果,通过getevent命令也没有任何输出,通过查询可知#键的Usage ID为0x304,这个需要记住,下面适配需要用上。
    小知识:HID键码值不止Usage ID,还有Usage Page,Usage Page一般为0x07和0x0C两个数值,0x07代表已经定义好的键码,0x0C代表用户自定义的键码。
    3.第三步:适配HID键值,首先需要修改hid-input.c,这个文件先用Usage ID和input.h先关联起来,用户自定义的键值一般需要修改hid-input.c中hidinput_configure_usage方法,然后找到方法里的HID_UP_CONSUMER里面进行添加,代码添加如下:

    //common/drivers/hid/hid-input.c
    case 0x304: map_key_clear(KEY_POUND);       break;
    

    input.h文件也须添加相关代码,input.h里面对应的值,到时候getevent也会输出对应的值,添加代码如下:

    //common/include/uapi/linux/input.h
    #define KEY_POUND       0x2f1
    

    注意:在input.h里面也可知道定义的最大值不能超过0x2ff,不然溢出则定义失败。
    小知识:0x07的HID键码表如下:

     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,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,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
    };
    

    4.第四步:getevent有值并且知道值为0x2f1,需要转换为十进制为753,需要到对应kl文件里进行相关配置,通过getevent -v得知蓝牙遥控器的pid和vid,如下:

    所以通过pid和vid配置相关kl即可。使用dumpsys input知道目前使用的kl是默认的,如下:

    通过pid和vid配置kl,名称为Vendor_0508_Product_0110.kl,配置后和内容如下:

    ///system/usr/keylayout/Vendor_0508_Product_0110.kl
    key 753  POUND
    

    至此,蓝牙键值定义完成。

    由上,红外遥控器和蓝牙遥控器的键值定义和适配完成了,有疑问联系。

电视红外/蓝牙遥控器键值定义和适配相关推荐

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

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

  2. 安卓 蓝牙遥控器键值配对 kl文件

    场景:厂商送过来的蓝牙遥控器有可能linux上不对应,例如蓝牙的source 被识别为F1键,这时需要重新配置kl kl知识参考 https://www.jianshu.com/p/1b0ae800b ...

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

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

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

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

  5. android修改默认遥控器键值,android 中遥控器键值的添加和修改

    前言:TV 上遥控器键值怎么样对应到android的系统中,最近一个客户需要在我们的平台上修改,所以,我顺便做了一下总结,方便以后参考. 请转载的朋友一定加上出处,十分感谢~~ 第一步: init.r ...

  6. android红外遥控器按键键值,红外遥控实验键值设置

    while(1) { key=Remote_Scan(); if(key) { LCD_ShowNum(86,130,key,3,16);                //显示键值 LCD_Show ...

  7. android修改默认遥控器键值,RK3128平台android系统修改添加遥控器键值码值

    本帖最后由 微笑,一路向前 于 2017-1-4 15:34 编辑 最近帮客户定制RK3128平台的固件,涉及到定制新的遥控器,需要添加或修改遥控码值.RK3128平台Android系统修改遥控器码值 ...

  8. Android 智能TV电视系统遥控器键值添加

    Android键值中遥控器中的添加,下面是在mstar平台上的添加,做一个记录,以后方便找到,使用. 1,遥控按键键值映射标准化表示例: 自定义的按键名(中文) 自定义的按键名(英文) 红外码值(东芝 ...

  9. Unity中的输入事件总结与数字电视遥控器键值映射

    版权声明:欢迎批评指正,转载请务必注明原文链接:欢迎文章下公开讨论. https://blog.csdn.net/cordova/article/details/51036547 一.Unity的基本 ...

最新文章

  1. linux 查看 文档 不显示注释 命令
  2. shell 实现ip字符串与整形互转
  3. Spark(3)——通过本机文件导入到RDD
  4. MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结
  5. 华为GaussDB相比PostgreSQL做了哪些内核优化?
  6. ue4 时间轴是什么意思_UE4中Timeline的使用
  7. 熊猫DataFrame apply()示例
  8. python编程狮苹果系统_Python编程狮app下载-Python编程狮苹果版v1.0
  9. 应用安全-Web安全-SSRF攻防
  10. linux下sybase创建数据库,教小白搭建sybase数据库环境
  11. 路边的小花 2010/05/15@多摩川
  12. 淘宝天猫返利,是怎么一种运作模式?
  13. JS学习之路系列总结四象阵(此文犹如武林之中的易筋经,是你驰骋IT界的武功心法,学会JS五大阵法就学会了JS,博主建议先学三才阵)
  14. 标准柯西分布_柯西分布设独立随机变量X和Y都服从标准正态 – 手机爱问
  15. QBXT 2018春季DP图论班 2018.5.4 --- 树形DP
  16. Kubernetes(k8s)快速入门和环境部署
  17. java基础之package和import语句
  18. Npm依赖检查版本及升级
  19. 做网站域名_网站域名
  20. 所有外包项目威客网站列表

热门文章

  1. rtx4090和3090性能差距
  2. 【spinning up】代码详解目录
  3. java itextpdf 5 基础知识
  4. 开放性金融中的超流动性抵押链
  5. 一篇文章解决所有的 #如何下载安装xshell链接VMware虚拟机liunx系统(如SentOS,ubuntu等等)# 等问题
  6. python的Pmw库的安装
  7. Jquery .val 与 .value 区别
  8. Ajax+WCF+MySQL实现数据库部署并调用
  9. 马斯克都不懂的 GraphQL,API 网关又能对其如何理解?
  10. 记录一次线上Mysql数据库迁移方案制定与实施