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

本文详细介绍了如何在MStar平台上添加遥控器键映射,并通过修改驱动来实现红外码与Linux层键映射的对应。包括自定义按键名、驱动修改、键映射文件配置等步骤。

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

 转自http://blog.sina.com.cn/s/blog_5f1ebb8f0101qn7b.html

Android键值中遥控器中的添加,http://blog.sina.com.cn/s/blog_5f1ebb8f0101qn7b.html下面是在mstar平台上的添加,做一个记录,以后方便找到,使用。

1,遥控按键键值映射标准化表示例:

自定义的按键名(中文) 自定义的按键名(英文) 红外码值(东芝码) linux层键值映射 android层按键名(KeyEvent.java) android层键值映射 是否广播以全局响应

以下是普通遥控键值
待机[短按] SKY_KEY_POWER 0CH 0x74 KEYCODE_POWER 26
1【*/@】 SKY_KEY_1 01H 0x2 KEYCODE_1 8  
交替 SKY_KEY_ALTERNATE 0BH 0x1d1 KEYCODE_ALTERNATE 226  

例:添加交替键值--ALTERNATE
2,修改驱动(kernel):
ps:修改在kernel中的驱动
1、kernel\2.6.35.11\drivers\media\IR\keymaps\rc-skyworth-tv.c
在static struct ir_scancode skyworth_tv[]表中添加:
{ 0x000B , KEY_FN_ESC }, //KEYCODE_ALTERNATE
    a、0x000B 为红外码值。
    b、KEY_FN_ESC 在kernel\2.6.35.11\include\linux\input.h中有定义:#define KEY_FN_ESC 0x1d1
        注意:不能往input.h中添加定义,一定是里面已有的定义才拿来用!
2、编译驱动:
在kernel\2.6.35.11目录下
$> cp  .config_amber3_SMP_android_emmc  .config

$> ./genlink.sh

$> make menuconfig

如果有改动,则Save and exit

$> make


修改kl文件Vendor_1918_Product_0001.kl 

添加:key 465      ALTERNATE

465对应于input.h中定义的linux键值0x1d1


 

1、\\172.20.32.73\harry\mstar\ics\device\skyworth\skywortha3\modules
rc-skyworth-tv.ko
mdrv-ir.ko
2、\\172.20.32.73\harry\mstar\ics\device\skyworth\skywortha3
*.kl  --对应kl文件是linux到Android的键值映射
*.idc
3、mk文件
PRODUCT_COPY_FILES := \
$(LOCAL_KERNEL):kernel \
device/skyworth/skywortha3/init.amber3.rc:root/init.amber3.rc

# IR/keymap kernel module
PRODUCT_COPY_FILES += \
device/skyworth/skywortha3/modules/mdrv-ir.ko:system/lib/modules/mdrv-ir.ko \
device/skyworth/skywortha3/modules/rc-skyworth-tv.ko:system/lib/modules/rc-skyworth-tv.ko
# Device idc/keylayout
PRODUCT_COPY_FILES += \
device/skyworth/skywortha3/Vendor_1918_Product_0001.kl:system/usr/keylayout/Vendor_1918_Product_0001.kl \
device/skyworth/skywortha3/Vendor_1918_Product_0002.kl:system/usr/keylayout/Vendor_1918_Product_0002.kl \
device/skyworth/skywortha3/Vendor_1918_Product_0003.kl:system/usr/keylayout/Vendor_1918_Product_0003.kl \
device/skyworth/skywortha3/Vendor_1918_Product_1918.idc:system/usr/idc/Vendor_1918_Product_1918.idc \
device/skyworth/skywortha3/Vendor_3697_Product_0003.idc:system/usr/idc/Vendor_3697_Product_0003.idc \
device/skyworth/skywortha3/Vendor_13ff_Product_0008.idc:system/usr/idc/Vendor_13ff_Product_0008.idc \
device/skyworth/skywortha3/Vendor_0e8f_Product_0035.kl:system/usr/keylayout/Vendor_0e8f_Product_0035.kl \
device/skyworth/skywortha3/Generic.kcm:system/usr/keychars/Generic.kcm
4、init.amber3.rc
    insmod /system/lib/modules/rc-skyworth-tv.ko
    insmod /system/lib/modules/mdrv-ir.ko
5、修改framework层 

KEYCODE_HOME_LONG 761
KEYCODE_BACK_LONG 762
KEYCODE_CENTER_LONG 763
KEYCODE_NEW_SHUTTLE_LEFT 764
KEYCODE_NEW_SHUTTLE_RIGHT 765

①frameworks\base\core\java\android\view\KeyEvent.java
=>修改keycode、name.append  ,定义键值
public static final int KEYCODE_ALTERNATE       = 226;
names.append(KEYCODE_ALTERNATE, "KEYCODE_ALTERNATE");
②frameworks\base\native\include\android\keycodes.h   andriod4.1路径:frameworks\native\include\android\keycodes.h  可以不加 ,定义键值
=>修改enum
AKEYCODE_ALTERNATE       = 226,
③frameworks\base\include\ui\KeycodeLabels.h    andriod4.1路径:frameworks\base\include\androidfw\KeycodeLabels.h
=>修改static const KeycodeLabel KEYCODES[]
{ "ALTERNATE", 226},
④external\webkit\Source\WebKit\android\plugins\ANPKeyCodes.h   可以不加
=>修改enum ANPKeyCodes 
kAlternate_ANPKeyCode          = 226,
⑤frameworks\base\core\res\res\values\attrs.xml
=>修改
标签中增加:
6、修改ics\frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.java
ps:这部分主要是对键值进行处理的地方
interceptKeyBeforeDispatching函数中,也可能在interceptKeyAfterDispatching函数中,或者dispatchUnhandledKey函数中看需求
if (down) {// handler mute,volume_up,volume_down,share before dispatch key to app.
            if (keyCode == KeyEvent.KEYCODE_SENSE_ALL//靠近键控板感应,247
                    || keyCode == KeyEvent.KEYCODE_SENSE_MENU//靠近键控板菜单键感应,248
                    || keyCode == KeyEvent.KEYCODE_SENSE_CENTER//靠近键控板确定键感应,249
                    || keyCode == KeyEvent.KEYCODE_SENSE_BACK//靠近键控板返回键感应,250
                    || keyCode == KeyEvent.KEYCODE_SENSE_VOLUME_UP//靠近键控板音量加感应,251
                    || keyCode == KeyEvent.KEYCODE_SENSE_VOLUME_DOWN//靠近键控板音量减感应,252
                    || keyCode == KeyEvent.KEYCODE_SENSE_CHANNEL_UP//靠近键控板频道加感应,253
                    || keyCode == KeyEvent.KEYCODE_SENSE_CHANNEL_DOWN//靠近键控板频道减感应,254
                    || keyCode == KeyEvent.KEYCODE_SENSE_LEAVE//离开键控板频道减感应,255
                 ……
) {//发广播,将键值广播出去,供service获取
                Intent intent = new Intent("com.android.sky.SendHotKey");
                intent.putExtra("specialKey", keyCode);
                    mContext.sendBroadcast(intent);
                Log.d(TAG, "sendBroadcast: com.android.sky.SendHotKey# key:"+keyCode);
            }
        }

<think>我们正在讨论的是在Android 14 TV Box上适配蓝牙遥控器按键。根据之前的讨论,我们知道适配的关键在于修改键值映射文件(kl文件)。在Android 14上,基本步骤应该类似,但需要注意一些路径和细节的变化。 步骤概述: 1. 获取蓝牙遥控器的按键扫描码(scancode)。 2. 创建或修改对应的kl文件,将扫描码映射到Android键码。 3. 验证映射并调试。 4. 永久生效(编译进固件或放入系统分区)。 详细步骤: ### 1. 获取按键扫描码 使用`adb shell getevent -l`命令来监听按键事件。连接蓝牙遥控器,然后按需要适配的按键,观察输出。 例如,按下音量减键,可能会看到类似这样的输出: ``` /dev/input/event3: EV_KEY KEY_VOLUMEDOWN DOWN /dev/input/event3: EV_KEY KEY_VOLUMEDOWN UP ``` 但有时候,蓝牙遥控器可能不会直接显示Android键码,而是显示扫描码(scancode),比如: ``` /dev/input/event3: EV_KEY KEY_0X0072 DOWN ``` 这里的`0X0072`就是扫描码(十六进制)。我们需要将其转换为十进制(0x0072 -> 114)用于kl文件。 ### 2. 创建或修改kl文件 在Android系统中,kl文件通常位于`/vendor/usr/keylayout/`或`/system/usr/keylayout/`。在Android 14上,推荐使用`/vendor/usr/keylayout/`。 首先,我们需要确定蓝牙遥控器的设备标识(VID和PID)。可以通过以下命令查看输入设备: ```shell adb shell getevent -p ``` 在输出中找到蓝牙遥控器的设备信息,例如: ``` add device 6: /dev/input/event3 bus: 0005 vendor: 0001 product: 0001 version: 0001 name: "Bluetooth Remote" ``` 这里,vendor是`0001`,product是`0001`。那么,对应的kl文件名通常是`Vendor_0001_Product_0001.kl`,或者简化为`Vendor_0001.kl`(如果该厂商的多个产品使用相同的映射)。 然后,我们创建或修改这个kl文件。例如,如果我们要将扫描码114(十六进制0x72)映射为`VOLUME_DOWN`,则在kl文件中添加: ``` key 114 VOLUME_DOWN ``` 操作步骤(通过ADB): ```shell adb root adb remount # 如果remount失败,可能需要先重启adbd为root,或者系统本身未开放remount # 如果无法remount,则需要在有root权限的情况下push文件 adb pull /vendor/usr/keylayout/Vendor_0001.kl . # 备份 # 修改该文件,添加映射 adb push Vendor_0001.kl /vendor/usr/keylayout/ adb reboot # 重启生效 ``` 注意:如果该文件不存在,可以直接创建。 ### 3. 验证与调试 - 重启后,使用`adb shell dumpsys input`命令查看输入设备的配置,确认你的kl文件是否被加载。 - 使用`adb shell getevent -l`再次测试按键,观察事件是否被正确转换。 如果按键没有反应,检查: - kl文件路径和文件名是否正确(大小写敏感)? - 扫描码转换是否正确(十六进制转十进制)? - 是否有多个kl文件匹配了同一个设备?系统会按优先级选择一个(通常更具体的文件名优先级更高,如`Vendor_XXXX_Product_XXXX.kl`优先于`Vendor_XXXX.kl`)。 ### 4. 永久生效 如果只是临时修改,通过adb push即可。但如果是产品固件,需要将kl文件编译进系统镜像。 在AOSP源码中,可以将kl文件放在设备对应的目录下,例如:`device/<manufacturer>/<device>/keylayouts/`,然后在device.mk中将其复制到目标目录: ```makefile PRODUCT_COPY_FILES += \ device/<manufacturer>/<device>/keylayouts/Vendor_0001.kl:$(TARGET_COPY_OUT_VENDOR)/usr/keylayout/Vendor_0001.kl ``` ### 关于Android 14的注意事项 - Android 14可能对输入设备的权限有更严格的要求,确保kl文件的权限正确(通常为644)。 - 如果使用SELinux,可能需要调整策略,确保系统服务可以读取该kl文件。但一般情况下,kl文件在`/vendor`分区,默认策略应该允许访问。 ### 多媒体按键的适配 对于多媒体按键(如播放/暂停),Android键码为`MEDIA_PLAY_PAUSE`。同样,获取扫描码后映射即可。例如: ``` key 165 MEDIA_PLAY_PAUSE ``` ### 常见问题 - **问题1:如何通过ADB命令实时监控蓝牙遥控器的按键事件?** 使用`adb shell getevent -l`命令。 - **问题2:kl文件和kcm文件的区别?** kl文件(Key Layout)将扫描码映射到Android键码,而kcm文件(Key Character Map)则用于将键码和修饰键状态(如Shift)映射到字符(用于键盘输入)。遥控器通常只需要kl文件。 - **问题3:蓝牙遥控器的VID/PID查看及与kl文件关联?** 通过`adb shell getevent -p`查看输入设备的vendor和product ID。kl文件名通常为`Vendor_<vid>.kl`或`Vendor_<vid>_Product_<pid>.kl`。 - **问题4:kl文件修改后不生效?** 检查文件名、路径、权限,以及是否被其他kl文件覆盖。重启设备。 - **问题5:多媒体按键映射?** 在kl文件中使用对应的Android多媒体键码,如`MEDIA_PLAY_PAUSE`,`MEDIA_NEXT`等。 ### 引用说明 在Android系统中,按键映射的过程是:物理键值 -> Linux标准键值(通过kl文件) -> Android标准键值(在系统中使用)[^1]。因此,正确配置kl文件是关键。 [^1]: 参考了rk3568 Android11/12适配蓝牙遥控器的基本步骤,尽管平台不同,但原理相同。</think>### Android 14 TV Box蓝牙遥控器按键适配指南 在Android 14系统中适配蓝牙遥控器按键,需重点关注**键值映射文件**和**输入设备识别**。以下是完整步骤: --- #### 1. **获取按键原始扫描码** 使用ADB抓取蓝牙遥控器原始事件: ```shell adb shell getevent -l ``` 按下待适配按键(如音量键),观察输出: ``` /dev/input/event5: EV_KEY KEY_0X72 DOWN # 扫描码0x72(十六进制) ``` **关键转换**:将十六进制扫描码转为十进制(0x72 → 114)用于映射文件[^1]。 --- #### 2. **创建键值映射文件(.kl文件)** 在Android 14中,kl文件路径为: ```shell /vendor/usr/keylayout/ # 主路径 /system_ext/usr/keylayout/ # 备选路径 ``` **操作步骤**: ```shell # 进入adb shell adb shell su mount -o remount,rw /vendor # 创建映射文件(文件名格式:Vendor_VID.kl) echo 'key 114 VOLUME_DOWN' > /vendor/usr/keylayout/Vendor_0074.kl chmod 644 /vendor/usr/keylayout/Vendor_0074.kl sync reboot ``` **映射规则示例**: ```plaintext key 115 VOLUME_UP key 116 POWER # 电源键 key 102 HOME # 主页键 key 28 ENTER # 确认键 key 158 BACK # 返回键 key 229 MEDIA_PLAY_PAUSE # 播放/暂停 ``` --- #### 3. **识别蓝牙遥控器VID/PID** 通过输入设备信息关联kl文件: ```shell adb shell dumpsys input ``` 查找输出中的蓝牙遥控器信息: ``` Device 5: Bluetooth Remote Identifier: vid=0001 pid=0001 ``` 此时系统会自动加载`Vendor_0001.kl`文件(VID=0001)[^1]。 --- #### 4. **调试与验证** - **实时监控按键事件**: ```shell adb shell getevent -l # 查看原始扫描码 adb shell input keyevent # 查看Android键码 ``` - **检查文件加载**: ```shell adb logcat | grep "KeyLayout" # 成功加载提示:Loaded key layout from /vendor/usr/keylayout/Vendor_0074.kl ``` --- #### 5. **永久生效方案** **A. 编译进固件**(需源码环境): 1. 将kl文件放入AOSP路径: ``` device/amlogic/<project>/keylayouts/Vendor_0074.kl ``` 2. 在`device.mk`中添加: ```makefile PRODUCT_COPY_FILES += \ device/amlogic/<project>/keylayouts/Vendor_0074.kl:$(TARGET_COPY_OUT_VENDOR)/usr/keylayout/Vendor_0074.kl ``` **B. 系统分区集成**(无源码): ```shell # 将kl文件打包进vendor分区 mkdir -p vendor/usr/keylayout/ cp Vendor_0074.kl vendor/usr/keylayout/ make snod # 重建system.img ``` --- #### 6. **特殊按键处理** | 按键类型 | Android键码 | 解决方案 | |----------------|-----------------------|------------------------------| | 语音键 | `VOICE_ASSIST` | 添加`key XX VOICE_ASSIST` | | 自定义功能键 | `F1`-`F12` | 映射为`key XX FUNCTION` | | 长按/短按区分 | 需修改框架层`KeyEvent` | 建议通过`InputReader`定制 | > **Android 14变化**:多媒体键需在`AndroidManifest.xml`声明`<action android:name="android.intent.action.MEDIA_BUTTON"/>`才能响应[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值