RK3128 Android 7.1红外遥控全链路解析从DTS配置到uboot唤醒实现在嵌入式设备开发中红外遥控功能看似基础实则涉及从硬件到软件的多层协同。当我们需要实现红外遥控不仅能操作系统还要能从深度休眠唤醒甚至完全关机状态下开机时问题就变得复杂起来。本文将深入剖析RK3128平台在Android 7.1系统下的完整红外遥控实现链路特别聚焦电源管理和启动流程的关键配置。1. 红外遥控系统架构概览红外遥控在RK3128平台上的工作流程可以分为四个主要层次硬件层红外接收器与PWM通道的物理连接设备树配置层DTS中定义红外接收参数与键值映射内核驱动层处理红外信号解码与系统唤醒引导加载层uboot中实现关机状态下的开机检测这种分层设计使得每个环节都可以独立配置但又需要相互配合。当按下遥控器按键时信号会依次经过这些层次处理最终转化为系统可识别的输入事件或电源管理指令。2. DTS设备树关键配置解析设备树(DTS)是Linux内核用于描述硬件配置的数据结构在红外遥控实现中扮演着核心角色。我们需要关注三个关键部分2.1 PWM控制器与红外接收器绑定pwm3 { status okay; interrupts GIC_SPI 78 IRQ_TYPE_LEVEL_HIGH; compatible rockchip,remotectl-pwm; remote_pwm_id 3; handle_cpu_id 1; remote_support_psci 1; };这段配置将PWM3控制器与红外接收功能绑定其中remote_pwm_id指定使用的PWM通道号handle_cpu_id定义处理中断的CPU核心remote_support_psci启用低功耗状态下的唤醒支持2.2 遥控键值映射表配置ir_key2 { rockchip,usercode 0xfe01; rockchip,key_table 0xaa KEY_POWER, 0xbb KEY_MENU, 0xcc KEY_BACK, 0xdd KEY_HOME, 0xee KEY_VOLUMEUP, 0xff KEY_VOLUMEDOWN; };键值映射表定义了红外编码与Linux输入子系统键值的对应关系。其中usercode是遥控器的厂商识别码key_table将红外编码映射到标准键值(定义于input.h)2.3 调试技巧实时获取红外编码当需要适配新遥控器时可以通过以下命令实时查看红外编码adb shell echo 1 /sys/module/rockchip_pwm_remotectl/parameters/code_print cat /proc/kmsg这会输出类似如下的调试信息[ 123.456789] remotectl: user_code0xfe01, key_code0xaa3. Android输入子系统配置DTS配置完成后还需要在Android层建立Linux键值到Android功能的映射。这主要通过KL(Key Layout)文件实现。3.1 确定输入设备节点首先需要确认红外接收器对应的输入设备节点cat /proc/bus/input/devices输出示例I: Bus0019 Vendor0001 Product0001 Version0100 N: Namerockchip_pwm_remotectl P: Phys S: Sysfs/devices/platform/20050030.pwm/input/input2 U: Uniq H: Handlerskbd event2 B: PROP0 B: EV100013 B: KEY10800 400 0 0 0 0这里20050030.pwm就是我们需要配置的设备节点名。3.2 KL文件配置在device/rockchip/rkxxxx/目录下创建对应的KL文件如20050030_pwm.klkey 116 POWER key 158 BACK key 139 MENU key 102 HOME key 115 VOLUME_UP key 114 VOLUME_DOWN这个文件将Linux键值(如116)映射到Android功能标签(如POWER)。可以通过getevent -l命令验证映射是否生效。4. 电源管理与唤醒配置实现红外唤醒功能需要在内核电源管理子系统中进行特殊配置这是大多数问题的集中区域。4.1 休眠唤醒配置在DTS的rockchip_suspend节点中添加唤醒源配置rockchip_suspend { status okay; rockchip,wakeup-config (0 | RKPM_GPIO_WKUP_EN | RKPM_PWM3_WKUP_EN) ; };关键参数说明RKPM_GPIO_WKUP_EN启用GPIO唤醒功能RKPM_PWM3_WKUP_EN特别启用PWM3作为唤醒源4.2 深度休眠模式选择RK3128支持多种休眠模式不同模式对唤醒的支持程度不同休眠模式功耗唤醒延迟支持唤醒源待机模式中短有限内存自刷新低中多数外设深度休眠最低长特定GPIO/PWM在DTS中通过rockchip,sleep-mode-config配置rockchip,sleep-mode-config (0 | RKPM_SLP_ARMOFF | RKPM_SLP_PMU_PLLS_PWRDN) ;5. uboot中的红外开机实现当设备完全关机后需要通过修改uboot代码实现红外开机功能。这是整个链路中最容易被忽视的环节。5.1 修改pwm_remotectl.c在u-boot/board/rockchip/common/rkloader/pwm_remotectl.c中添加关机状态下的键值检测static struct rkxx_remote_key_table remote_key_table_bf[] { {0xff, KEY_POWER}, }; static struct rkxx_remotectl_button remotectl_button[] { { .usercode 0xfe01, .nbuttons 25, .key_table remote_key_table_fe01[0], }, { .usercode 0xbf00, .nbuttons 1, .key_table remote_key_table_bf[0], }, };5.2 电源管理初始化确保在uboot的板级初始化中正确设置了PWM唤醒源void board_init(void) { /* PWM红外唤醒初始化 */ pwm_remotectl_init(); /* 电源管理单元配置 */ pmu_set_wakeup_src(WAKEUP_SRC_PWM3); }6. 常见问题与调试技巧在实际项目中红外遥控功能可能会遇到各种异常情况。以下是几个典型问题及其解决方案6.1 遥控器能操作但无法唤醒可能原因休眠模式不支持PWM唤醒唤醒源未正确配置内核未保持PWM时钟解决方案检查DTS中的rockchip,wakeup-config是否包含PWM3确认休眠模式不是RKPM_SLP_PMU_PWRDN(会关闭太多外设)在驱动中添加调试打印确认是否收到中断6.2 关机后无法红外开机排查步骤确认uboot版本是否支持红外开机检查pwm_remotectl.c中的usercode是否正确测量红外接收器在关机状态下是否仍有供电6.3 键值映射错误当按键功能错乱时需要系统性地检查DTS中的key_table是否正确KL文件中的映射关系input.h中的键值定义是否一致可以通过以下命令查看原始输入事件getevent -l /dev/input/event2在RK3128平台上实现完整的红外遥控功能需要开发者对硬件特性、内核驱动和Android输入系统都有深入理解。特别是在低功耗场景下各个子系统的协同工作尤为重要。通过本文介绍的全链路配置方法应该能够解决大多数红外遥控相关的技术问题。