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

本文详细介绍了红外和蓝牙遥控器的键值适配过程,包括获取遥控器的scancode码、用户码、配置remote和kl文件,以及蓝牙遥控器的HID键码值Usage ID的适配。通过修改hid-input.c、input.h以及kl文件,实现遥控器按键功能的正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

遥控器键值适配

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

<think>好的,用户想了解HID键值定义使用方法。首先,我需要回顾一下HID(Human Interface Device)的基本概念。HID是USB标准中的一部分,用于定义人机交互设备,如键盘、鼠标、游戏手柄等。键值在这里指的是这些设备发送给计算机的按键代码。 根据用户提供的引用内容,特别是引用[3],里面提到了HID的用法页(Usage Page),比如键盘、LED、按钮等,每个用法页有不同的前缀。比如HID_UP_KEYBOARD对应0x00070000,而HID_UP_CONSUMER对应0x000c0000。这些用法页加上具体的Usage ID组成完整的键值。例如,键盘上的A键可能是在HID_UP_KEYBOARD用法页下的0x00070004。 然后,用户提供的引用[2]中有一个例子,case 0x188: map_key_clear(KEY_LXL); break;,这里的0x188应该是具体的Usage ID,需要结合用法页来解析。例如,如果用法页是HID_UP_CONSUMER(0x000c0000),那么完整的键值就是0x000c0188,但代码中可能只取后16位作为Usage ID,即0x0188,这时候需要映射到Linux内核中的KEY_LXL。 接下来,键值的转换流程可能涉及从HID设备上报的原始值到内核输入子系统的事件码的转换。引用[1]提到Kernel态中HID到Input的转换,说明内核中有相应的转换逻辑,比如在驱动代码中将HID的Usage ID映射为标准的KEY_*事件码。引用[5]中的代码片段展示了如何处理按键的上报,包括检查新按下的键释放的键,并通过input_report_key函数上报事件。 关于使用方法,用户可能需要了解如何自定义键值。引用[4]提到在四个文件中定义键值,可能涉及修改内核的HID驱动或配置文件,比如在hotkey.properties中配置热键。这部分需要具体的内核编程知识,比如修改HID驱动中的映射表,或者使用用户空间的配置工具。 另外,用户可能对如何调试验证键值映射感兴趣。比如使用getevent工具查看原始事件,然后通过内核的转换后,使用evtest或其他工具查看最终生成的事件码。引用[3]中的例子显示通过getevent -l获取的VOD按键为000c006b,其中前四位000c对应HID_UP_CONSUMER用法页,后面的006b是具体的Usage ID。 需要注意的是,不同设备可能有不同的HID描述符,这会影响键值的解析方式。例如,蓝牙遥控器红外遥控器适配可能不同,引用[4]提到红外蓝牙遥控器适配步骤可能涉及不同的配置文件内核模块。 总结起来,回答需要涵盖HID键值的基本结构、用法页Usage ID的关系、内核中的转换流程、自定义键值的方法以及调试工具的使用。同时,结合用户提供的引用内容,具体说明如何在内核代码中进行键值映射,以及配置文件的位置作用。</think>### HID键值定义与使用方法 #### 一、HID键值定义 1. **基础结构** HID键值由**用法页(Usage Page)****用法ID(Usage ID)**组成,格式为32位十六进制数。例如: - 键盘按键的用法页为$0x00070000$(`HID_UP_KEYBOARD`),A键对应用法ID$0x0004$[^3] - 多媒体按键的用法页为$0x000c0000$(`HID_UP_CONSUMER`),音量键可能对应$0x00E9$ 2. **内核映射规则** 在Linux内核中,HID键值通过`hid-input.c`等驱动文件映射到标准输入事件码。例如: ```c case 0x188: map_key_clear(KEY_LXL); break; // 将HID键值0x188映射为KEY_LXL[^2] ``` 3. **键值组成示例** - 蓝牙遥控器上报原始键值$0x000c006b$时,前四位$000c$表示`HID_UP_CONSUMER`,后四位$006b$为具体功能键[^3] #### 二、键值使用流程 1. **数据上报路径** `HID设备 -> 内核驱动 -> 输入子系统 -> 用户空间` 内核态完成HID键值到标准键值的转换[^1] 2. **关键代码逻辑** ```c if (usb_kbd_keycode[kbd->new[i]]) input_report_key(kbd->dev, usb_kbd_keycode[kbd->new[i]], 1); // 上报按键事件[^5] ``` 3. **自定义键值方法** - 修改内核驱动文件(如`hid-xxx.c`)中的映射表 - 在`hotkey.properties`中配置热键,路径为`/system/etc/hotkey.properties`[^4] #### 三、调试与验证 1. **工具链** - `getevent -l`:查看原始HID事件(如显示`000c006b`) - `dumpsys input`:查看输入事件处理状态 - `evtest`:验证最终生成的输入事件 2. **典型问题排查** 若按键无响应,需检查: - HID描述符是否正确定义用法页/ID - 内核映射表中是否存在对应条目 - 用户空间是否拦截了该输入事件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值