IR 使用
更新时间:2018-04-17 阅读:3932
红外遥控配置
Firefly-RK3128 开发板上使用红外收发传感器 IR (在 USB OTG 接口和音频接口之间)实现遥控功能。本文主要描述在开发板上如何配置红外遥控器。
其配置步骤可分为两个部分:
修改内核驱动:内核空间修改,Linux 和 Android 都要修改这部分的内容。
修改键值映射:用户空间修改(仅限 Android 系统)。
内核驱动
在 Linux 内核中,IR 驱动仅支持 NEC 编码格式。以下是在内核中配置红外遥控的方法。
所涉及到的文件:
dts 配置文件:kernel/arch/arm/boot/dts/rk3128-fireprime.dts
驱动源文件: kernel/drivers/input/remotectl/rk_pwm_remotectl.c
添加 IR 及对应键值表
&remotectl { handle_cpu_id = <1>; ir_key1{rockchip,usercode = <0xff00>;rockchip,key_table = <0xeb KEY_POWER>, <0xa3 250>, <0xec KEY_MENU>, <0xfc KEY_UP>, <0xfd KEY_DOWN>, <0xf1 KEY_LEFT>, <0xe5 KEY_RIGHT>, <0xf8 KEY_REPLY>, <0xb7 KEY_HOME>, <0xfe KEY_BACK>, <0xa7 KEY_VOLUMEDOWN>, <0xf4 KEY_VOLUMEUP>;}; ir_key2{ rockchip,usercode = <0xff00>; rockchip,key_table =<0xf9 KEY_HOME>,<0xbf KEY_BACK>,<0xfb KEY_MENU>,<0xaa KEY_REPLY>,<0xb9 KEY_UP>,<0xe9 KEY_DOWN>,<0xb8 KEY_LEFT>,<0xea KEY_RIGHT>,<0xeb KEY_VOLUMEDOWN>,<0xef KEY_VOLUMEUP>,<0xf7 KEY_MUTE>,<0xe7 KEY_POWER>,<0xfc KEY_POWER>,<0xa9 KEY_VOLUMEDOWN>,<0xa8 KEY_VOLUMEDOWN>,<0xe0 KEY_VOLUMEDOWN>,<0xa5 KEY_VOLUMEDOWN>,<0xab183>,<0xb7388>,<0xf8184>,<0xaf185>,<0xed KEY_VOLUMEDOWN>,<0xee186>,<0xb3 KEY_VOLUMEDOWN>,<0xf1 KEY_VOLUMEDOWN>,<0xf2 KEY_VOLUMEDOWN>,<0xf3 KEY_SEARCH>,<0xb4 KEY_VOLUMEDOWN>,<0xbe KEY_SEARCH>;}; ir_key3{ rockchip,usercode = <0x1dcc>; rockchip,key_table =<0xee KEY_REPLY>,<0xf0 KEY_BACK>,<0xf8 KEY_UP>,<0xbb KEY_DOWN>,<0xef KEY_LEFT>,<0xed KEY_RIGHT>,<0xfc KEY_HOME>,<0xf1 KEY_VOLUMEUP>,<0xfd KEY_VOLUMEDOWN>,<0xb7 KEY_SEARCH>,<0xff KEY_POWER>,<0xf3 KEY_MUTE>,<0xbf KEY_MENU>,<0xf90x191>,<0xf50x192>,<0xb3388>,<0xbe KEY_1>,<0xba KEY_2>,<0xb2 KEY_3>,<0xbd KEY_4>,<0xf9 KEY_5>,<0xb1 KEY_6>,<0xfc KEY_7>,<0xf8 KEY_8>,<0xb0 KEY_9>,<0xb6 KEY_0>,<0xb5 KEY_BACKSPACE>;};};
注:
usercode:用户码,每个IR都有一个对应的用户码;
key_table:IR 按键的扫描码和按键代码映射表。
如何获取用户码和IR 键值
在 remotectl_do_something 函数中获取用户码和键值:
case RMC_USERCODE: {if ((RK_PWM_TIME_BIT1_MIN < ddata->period) &&(ddata->period < RK_PWM_TIME_BIT1_MAX)) ddata->scandata |= (0x01 << ddata->count); ddata->count++;if (ddata->count == 0x10) { DBG_CODE("USERCODE=0x%x\n", ddata->scandata);if (remotectl_keybd_num_lookup(ddata)) { ddata->state = RMC_GETDATA; ddata->scandata = 0; ddata->count = 0;} else {if (rk_remote_print_code){ ddata->state = RMC_GETDATA; ddata->scandata = 0; ddata->count = 0;} else ddata->state = RMC_PRELOAD;}}}
注:用户可以使用 DBG_CODE() 函数打印用户码。
向 remotectl_button 数组添加用户码和键值:
case RMC_GETDATA: {#ifdef CONFIG_FIREFLY_POWER_LEDmod_timer(&timer_led,jiffies + msecs_to_jiffies(50));remotectl_led_ctrl(0);#endif if(!get_state_remotectl() && (ddata->keycode != KEY_POWER)){ledtrig_ir_activity();}if ((RK_PWM_TIME_BIT1_MIN < ddata->period) &&(ddata->period < RK_PWM_TIME_BIT1_MAX)) ddata->scandata |= (0x01<<ddata->count); ddata->count++;if (ddata->count < 0x10)return; DBG_CODE("RMC_GETDATA=%x\n", (ddata->scandata>>8));if ((ddata->scandata&0x0ff) ==((~ddata->scandata >> 8) & 0x0ff)) {if (remotectl_keycode_lookup(ddata)) { ddata->press = 1; input_event(ddata->input, EV_KEY,ddata->keycode, 1); input_sync(ddata->input); ddata->state = RMC_SEQUENCE;} else { ddata->state = RMC_PRELOAD;}} else { ddata->state = RMC_PRELOAD;}}break;
注:用户可以使用 DBG_CODE() 函数打印键值。
将 IR 驱动编译进内核
检查内核配置,确保以下选项选上:
CONFIG_ROCKCHIP_REMOTECTL=y CONFIG_ROCKCHIP_REMOTECTL_PWM=y
否则,在 kernel 路径下使用 make menuconfig ,按照如下方法将 IR 驱动选中,并保存退出。
Device Drivers --->Input device support -----> [*] rkxx remotectl ------->[*] rkxx remoctrl pwm0 capture.
执行 make 命令即可将该驱动编进内核。
Android 键值映射
文件 /system/usr/keylayout/20050030_pwm.kl 用于将 Linux 层获取的键值映射到 Android 上对应的键值。用户可以添加或者修改该文件的内容以实现不同的键值映射。
该文件内容如下所示:
key 28 ENTER key 116 POWER WAKE key 158 BACK key 139 MfENU key 217 SEARCH key 232 DPAD_CENTER key 108 DPAD_DOWN key 103 DPAD_UP key 102 HOME key 105 DPAD_LEFT key 106 DPAD_RIGHT key 115 VOLUME_UP key 114 VOLUME_DOWN key 143 NOTIFICATION WAKE key 113 VOLUME_MUTE key 388 TV_KEYMOUSE_MODE_SWITCH key 400 TV_MEDIA_MULT_BACKWARD key 401 TV_MEDIA_MULT_FORWARD key 402 TV_MEDIA_PLAY_PAUSE key 64 TV_MEDIA_PLAY key 65 TV_MEDIA_PAUSE key 66 TV_MEDIA_STOP key 67 TV_MEDIA_REWIND key 68 TV_MEDIA_FAST_FORWARD key 87 TV_MEDIA_PREVIOUS key 88 TV_MEDIA_NEXT key 250 FIREFLY_RECENT
注:通过 adb 修改该文件重启后即可生效。