RK3568 Android12红外遥控唤醒失效?手把手教你排查DTS配置问题

RK3568 Android12红外遥控唤醒失效?深度解析DTS配置与硬件唤醒机制

红外遥控唤醒功能在智能家居、机顶盒等嵌入式设备中属于基础需求,但实际开发中常遇到待机后无法唤醒的问题。本文将基于RK3568平台和Android12系统,从硬件原理到DTS配置,系统性地分析红外遥控唤醒失效的排查思路和解决方案。

1. 问题现象与初步诊断

当RK3568设备进入待机状态后,红外遥控器无法唤醒设备,只能通过板载电源键唤醒。更棘手的是,即使用电源键唤醒后,红外遥控器仍然无法正常操作。这种双重故障现象通常指向电源管理和外设供电的深层问题。

通过以下命令可以快速验证问题现象:

# 检查红外遥控器是否有input事件上报 adb shell getevent -l # 查看PWM红外解码模块的键值打印 adb shell "echo 1 > /sys/module/rockchip_pwm_remotectl/parameters/code_print"

如果这两个命令在唤醒后都没有输出,基本可以确定PWM红外模块在唤醒过程中未能正常恢复工作。这种现象通常由以下原因导致:

  • 电源域配置错误:红外模块所属的电源域在休眠时被关闭
  • 时钟信号丢失:PWM工作时钟在唤醒后未恢复
  • 寄存器状态未保存:休眠时未正确保存/恢复硬件寄存器

2. RK3568电源管理架构解析

RK3568的电源管理系统由多个层次组成,理解这些层次对排查唤醒问题至关重要:

层级组件功能描述相关配置节点
ATF固件层ARM Trusted Firmware处理底层电源状态切换无直接配置
内核层Rockchip PM driver实现休眠/唤醒流程rockchip_suspend节点
驱动层各外设驱动设备特定的电源管理各设备节点
硬件层PMIC/Power Domain实际电源控制vdd_logic等节点

关键电源管理参数通过DTS配置,最终通过SMC调用传递给ATF执行。以下是典型的调用链:

DTS配置 → 内核解析 → SMC调用 → ATF执行 → 硬件生效

3. DTS关键配置详解

正确的DTS配置是解决红外唤醒问题的核心。以下是经过验证的有效配置:

&vdd_logic { regulator-state-mem { regulator-on-in-suspend; // 关键:休眠时保持供电 }; }; &rockchip_suspend { status = "okay"; rockchip,sleep-mode-config = < (0 | RKPM_SLP_CENTER_OFF | RKPM_SLP_HW_PLLS_OFF) >; rockchip,wakeup-config = < (0 | RKPM_PWM0_WKUP_EN | RKPM_CPU0_WKUP_EN) >; };

3.1 电源域配置

vdd_logic节点的配置确保红外模块所在的电源域在休眠期间不会断电:

  • regulator-on-in-suspend:强制保持该电源域在休眠时上电
  • 未设置此参数会导致红外模块完全掉电,无法响应唤醒信号

3.2 休眠模式配置

sleep-mode-config参数控制休眠时的硬件状态:

标志位功能对红外唤醒的影响
RKPM_SLP_CENTER_OFF关闭中心逻辑可能影响唤醒响应速度
RKPM_SLP_HW_PLLS_OFF关闭硬件PLL必须保留PWM时钟源

3.3 唤醒源配置

wakeup-config参数启用特定的唤醒源:

rockchip,wakeup-config = < (0 | RKPM_PWM0_WKUP_EN | RKPM_CPU0_WKUP_EN) >;
  • RKPM_PWM0_WKUP_EN:启用PWM0作为唤醒源(通常连接红外接收器)
  • RKPM_CPU0_WKUP_EN:允许CPU0处理唤醒事件

4. 常见配置错误与排查方法

在实际项目中,我们遇到过多种导致红外唤醒失效的错误配置:

4.1 错误配置示例

// 错误示例1:缺少regulator-on-in-suspend &vdd_logic { regulator-state-mem { // 缺少关键配置 }; }; // 错误示例2:过度关闭硬件资源 &rockchip_suspend { rockchip,sleep-mode-config = < (0 | RKPM_SLP_CENTER_OFF | RKPM_SLP_HW_PLLS_OFF | RKPM_SLP_PMUALIVE_32K) >; };

4.2 系统级排查流程

当遇到唤醒问题时,建议按照以下步骤排查:

  1. 检查电源状态

    adb shell cat /sys/kernel/debug/regulator/regulator_summary
  2. 验证唤醒源注册

    adb shell cat /sys/kernel/debug/wakeup_sources
  3. 检查时钟状态

    adb shell cat /sys/kernel/debug/clk/clk_summary | grep pwm
  4. 分析内核日志

    adb shell dmesg | grep -E 'suspend|resume|pwm'

5. 底层机制深度解析

红外唤醒功能最终通过ARM的SMC指令实现硬件控制。内核中的调用链如下:

// drivers/firmware/rockchip_sip.c int sip_smc_set_suspend_mode(u32 ctrl, u32 config1, u32 config2) { struct arm_smccc_res res; res = __invoke_sip_fn_smc(SIP_SUSPEND_MODE, ctrl, config1, config2); return res.a0; }

对应的汇编实现(arch/arm64/kernel/smccc-call.S):

ENTRY(__arm_smccc_smc) SMCCC smc ENDPROC(__arm_smccc_smc)

这个调用会陷入ATF(ARM Trusted Firmware),由安全固件实际执行电源状态切换。理解这一流程有助于定位更深层次的问题。