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

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

遥控器键值适配

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

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

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

猜你喜欢

转载自blog.csdn.net/weixin_47368640/article/details/129026336