记录RTK平台上适配红外&蓝牙遥控器,以便以后查看。
红外遥控器
遥控器流程图
物理按键的定义是在ir_table.config
如:
NEC编码: 1
RCA编码: 8
0xE31CC738 :scancode
KEY_POWER : keycode
其中三个头文件分别对解析 scancode 进行了转换,路径如下:
- kernel\system\lib\develop\ir_bin_create\input-event-custom-codes.h
- kernel\linux\linux-4.14\include\uapi\linux\input-event-custom-codes.h
- kernel\linux\linux-4.14\include\uapi\linux\input-event-codes.h
由上述编译文件进行编译,生成对应的ir_table.bin
编译方法:
./ir_bin_create generate ir_table.config ir_table.bin
验证是否成功编译到.bin文件
./ir_bin_create print ir_table.bin
ir_table.bin ——> bootcode
在bootcode中,由 uboot\arch\arm\cpu\armv7\rtd285o\bootparam.c 的 get_factory_ir_table_from_factory()函数来读取 ir_table.bin的地址将其传给kernel
在串口使用cat /proc/cmdline
命令可以看到地址
bootcode ——> kernel
在kernel中 odin2k\kernel\linux\linux-4.14\drivers\rtk_kdriver\ir\ir_table\ir_table_user.c 会去拿这个传过来的地址
static int __init venus_ir_input_table_addr_parse(char *options)
{
unsigned long ir_table_phy_address = 0;
if(options == NULL)
return 0;
if (sscanf(options, "%lx", &ir_table_phy_address) != 1)
return 0;
g_ir_boot_memory_address = ir_table_phy_address;
IR_INFO("g_ir_boot_memory_address == %lx\n", g_ir_boot_memory_address);
return 0;
}
early_param("ir_table", venus_ir_input_table_addr_parse);
之后在 kernel\linux\linux-4.14\drivers\rtk_kdriver\ir\irrc_core.c 文件中
- 判断协议是否正确,并解析出 scancode
static int examine_ir_avail(uint32_t *which, uint32_t *regValue, uint32_t