续接前文内容...
修改 irkey.c
文件: irkey.c
路径: apps\common\key\
该文件需根据实际选用的遥控器编码进行修改。因此,首先需要了解遥控器的编码参数,然后将相关参数写入 irkey.c 文件中。
① 获取遥控器DataCode与按键的对应关系
常见的遥控器发送的信号中包含 UserCode(用户码)和 DataCode(按键码)。UserCode 用于区分不同遥控器以防止串扰,DataCode 则对应不同的功能按键。

如何获取遥控器的 DataCode?方法有两种:向卖家索取,或自行检测。下图演示了使用 FNIRSI DSO-TC3 多功能示波器检测遥控器 DataCode 的过程。

我们以“模式(Mode)、播放、上一曲、下一曲”这4个按键为例进行检测,得出 DataCode 值(16进制)与按键的对照表。在 SDK 相关程序中,只用到 DataCode 的前2位数字。
表 DataCode与按键对照表
| # |
按键 |
UserCode |
DataCode |
DataCode 前2位 |
Irkey table bt_key_ir_table 中的元素 |
Irkey table bt_key_ir_table 的索引[x] |
| 1 |
模式 |
00FF |
4689 |
46 |
KEY_CHANGE_MODE |
[3] |
| 2 |
播放 |
00FF |
44BB |
44 |
KEY_MUSIC_PP |
[0] |
| 3 |
上一曲 |
00FF |
40BF |
40 |
KEY_MUSIC_PREV |
[2] |
| 4 |
下一曲 |
00FF |
43BC |
43 |
KEY_MUSIC_NEXT |
[1] |
需要说明的是,当前 SDK 中没有提供处理 UserCode 的相关代码,因此不具备对遥控器进行身份鉴别(防止串扰)的功能。理论上,任何与 SDK 支持的红外编码协议兼容的遥控器,只要能正确解码出 DataCode,都可以使用。
② 初始化 IRTabFF00 数组
在 irkey.c 文件中找到 const u8 IRTabFF00[]。这个 IRTabFF00 数组里的元素是由“NKEY_ + DataCode前2位”组成的,是针对某款遥控器做的预设。

现在,我们将图中原有的数组定义代码注释掉,然后重新编写这部分代码。新数组的元素需要被完全初始化——即数组元素从 NKEY_00 一直到 NKEY_5F。注意,“NKEY_”后面的数字是16进制,必须连续逐一递增,不能中断或跳跃。
为了方便后续修改,建议每个元素独占一行,如下所示(代码因篇幅未完整列出):
const u8 IRTabFF00[] = {
NKEY_00,
NKEY_01,
NKEY_02,
NKEY_03,
//......此处省略中间部分
NKEY_5E,
NKEY_5F,
};
③ 创建 IRTabFF00 与 DataCode 的映射关系表
为了清晰地进行映射关系替换,建议创建一个电子表格,包含以下列:“IRTabFF00、DataCode前2位、遥控器功能键、bt_key_ir_table中的元素、bt_key_irtable的索引[x]、IR+索引”。第一列“IRTabFF00”的内容从 NKEY_00 一直到 NKEY_5F。

接下来,根据前面得到的“表 DataCode与按键对照表”进行填充。例如,“模式”按键的“DataCode前2位”是“46”。在表格中找到“NKEY_46”这一行,将“模式”对应的元素 KEY_CHANGE_MODE 和索引号 [3] 填入表格。由此,我们可以推导出“IR+索引”这一列对应的值为 IR_03。
依此类推,我们得出 NKEY_40、NKEY_43、NKEY_44 分别对应 IR_02、IR_01、IR_00。这样就得到了“NKEY”与“IR”的最终对应关系。

最后,根据表格的映射关系,将 const u8 IRTabFF00[] 数组中的相应“NKEY”元素替换为“IR”元素。替换后的代码示例如下:
const u8 IRTabFF00[] = {
//......原代码略
NKEY_3F,
IR_02, //NKEY_40,
NKEY_41,
NKEY_42,
IR_01, //NKEY_43,
IR_00, //NKEY_44,
NKEY_45,
IR_03, //NKEY_46,
NKEY_47,
//......原代码略
NKEY_5F,
};
至此,针对 irkey.c 文件的修改就全部完成了。编译并烧录程序后,即可使用红外遥控器对设备进行控制。
由于音箱 PCB 板物理尺寸的限制,实体按键的数量往往受限,而遥控器的按键则不受此约束。通过上述方法,我们可以解锁 SDK 预设的更多功能按键,极大地丰富了产品的交互能力。关于 SDK 预设的所有功能按键定义,可以参考文件 apps\soundbox\include\key_event_deal.h。这类在特定芯片上进行底层开发和功能定制的经验,非常适合在 云栈社区 这类技术论坛与开发者们分享和讨论。