Firefly-RK3128

Firefly-RK3128采用Cortex-A7架构四核1.3GHz处理器,集成Mali-400MP2 GPU,拥有优秀的运算与图形处理能力;板载千兆以太网口、2.4GHz Wi-Fi和蓝牙4.0,展现出不俗的网络扩展和传输性能;同时可支持Android与Ubuntu双系统,并拥有丰富的硬件资源与扩展接口,所以它是一台扩展性特强的卡片电脑,但我们相信你的创意与灵感能给予它更完美的定义。

IR 使用

更新时间:2018-04-17 阅读:3932

红外遥控配置

Firefly-RK3128 开发板上使用红外收发传感器 IR (在 USB OTG 接口和音频接口之间)实现遥控功能。本文主要描述在开发板上如何配置红外遥控器。

其配置步骤可分为两个部分:

  1. 修改内核驱动:内核空间修改,Linux 和 Android 都要修改这部分的内容。

  2. 修改键值映射:用户空间修改(仅限 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>;};};

注:

  1. usercode:用户码,每个IR都有一个对应的用户码;

  2. 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 修改该文件重启后即可生效。