跳到主要内容

RK3399 系统待机配置指南

:::info 文档信息

文档标识:RK-KF-YF-120 · 发布版本:V1.0.0 · 发布日期:2020-07-08 · 页数:8 · 语言:中文

原始文档:Rockchip_RK3399_Developer_Guide_System_Suspend_CN.pdf

:::

章节大纲​

  • RK3399 系统待机配置指南(P1)
    • 系统待机(P4)
      • 驱动文件(P4)
      • DTS 节点(P4)
    • DTS 配置(P5)
      • 常规配置(P5)
      • 电源配置(P5)
      • 唤醒配置(P6)
      • debug 配置(P6)
      • 关闭APIO配置(P7)
      • GPIO 控制电源(P7)
    • 打印信息(P7)

在线预览​

若预览无法显示,请直接下载 PDF 后用本地阅读器打开。


1. 系统待机​

凡是带有 trust 的 SoC 平台,系统待机(system suspend)的工作都在 trust 中完成。因为各个平台的 trust对于系统待机实现各不相同,所以不同平台之间的待机配置选项/方法没有任何关联性和参考性,本文档仅适用于 RK3399 平台。

系统待机流程一般会有如下操作:关闭 power domain、时钟、PLL、ddr 进入自刷新、系统总线切到低速时钟(24M 或 32K)、控制PMIC进入休眠模式、配置唤醒源等。为了满足不同产品对待机模式的需求,目前都是通过 DTS 节点把相关配置在开机阶段传递给 trust。

1.1 驱动文件​

./drivers/soc/rockchip/rockchip_pm_config.c
./drivers/firmware/rockchip_sip.c
./include/dt-bindings/suspend/rockchip-rk3399.h

1.2 DTS 节点​

rockchip_suspend: rockchip-suspend {
compatible = "rockchip,pm-rk3399";
status = "okay";

// 常规配置

rockchip,sleep-mode-config = <
(0
| RKPM_SLP_ARMPD
| RKPM_SLP_PERILPPD
| RKPM_SLP_DDR_RET
| RKPM_SLP_CENTER_PD
)
>;

// 唤醒源配置

rockchip,wakeup-config = <
(0
| RKPM_GPIO_WKUP_EN
)
>;

// 电源配置

rockchip,pwm-regulator-config = <
(0
| PWM2_REGULATOR_EN
)
>;

// 对应APIO断电

rockchip,apios-suspend = <
(0
| RKPM_APIOxxx
)
>;

// 休眠控制GPIO的电平,关断对应供电

rockchip,power-ctrl =
<&gpioX RK_PXX GPIO_ACTIVE_HIGH>;
};

2. DTS 配置​

目前已支持的配置选项都定义在:

./include/dt-bindings/suspend/rockchip-rk3399.h

2.1 常规配置​

rockchip,sleep-mode-config = <...>;

// 休眠CPU处在WFI状态,只有调试时用到

#define RKPM_SLP_WFI (1 << 0)
// 休眠 cpu_pd power down
#define RKPM_SLP_ARMPD (1 << 1)
// 休眠perilp_pd power down
#define RKPM_SLP_PERILPPD (1 << 2)

// 休眠ddr进入自刷新且处在retention状态

#define RKPM_SLP_DDR_RET (1 << 3)
// 休眠 PLL power down
#define RKPM_SLP_PLLPD (1 << 4)

// 休眠 OSC disable,系统时钟切到 32K

#define RKPM_SLP_OSC_DIS (1 << 5)
// 休眠 center_pd power down
#define RKPM_SLP_CENTER_PD (1 << 6)

// 休眠AP_OFF会被拉高,用于控制PMIC或者其他分立电源进入休眠态

#define RKPM_SLP_AP_PWROFF (1 << 7)

2.2 电源配置​

rockchip,pwm-regulator-config = <...>;
// 使用 pwm-regulator
#define PWM0_REGULATOR_EN (1 << 0)
#define PWM1_REGULATOR_EN (1 << 1)
#define PWM2_REGULATOR_EN (1 << 2)
#define PWM3A_REGULATOR_EN (1 << 3)
#define PWM3B_REGULATOR_EN (1 << 4)

电源注意点:

根据外部硬件电路设计确定是否使用 pwm-regulator,必须与硬件对应。

2.3 唤醒配置​

rockchip,wakeup-config = <...>;

// 支持所有的中断唤醒

#define RKPM_CLUSTER_L_WKUP_EN (1 << 0)

// 支持所有被指定到大核的中断唤醒

#define RKPM_CLUSTER_B_WKUPB_EN (1 << 1)

// 支持GPIO唤醒

#define RKPM_GPIO_WKUP_EN (1 << 2)

// 支持SDIO唤醒

#define RKPM_SDIO_WKUP_EN (1 << 3)
// 支持 SDMMC 唤醒
#define RKPM_SDMMC_WKUP_EN (1 << 4)
// 支持 TIMER 唤醒
#define RKPM_TIMER_WKUP_EN (1 << 6)

// 支持插拔USB唤醒

#define RKPM_USB_WKUP_EN (1 << 7)
// 支持 SOFTWARE 唤醒
#define RKPM_SFT_WKUP_EN (1 << 8)

// 支持WDT唤醒

#define RKPM_WDT_M0_WKUP_EN (1 << 9)

// 支持TIMEOUT唤醒,一般用于调试

#define RKPM_TIME_OUT_WKUP_EN (1 << 10)

// 支持PWM唤醒

#define RKPM_PWM_WKUP_EN (1 << 11)

// 支持PCIE唤醒

#define RKPM_PCIE_WKUP_EN (1 << 13)

// 支持USB协议唤醒

#define RKPM_USB_LINESTATE_WKUP_EN (1 << 14)

唤醒源注意点:

在 kernel 阶段没有 enable_irq_wake()注册到 GIC 的中断无法唤醒系统。

2.4 debug 配置​

rockchip,sleep-debug-en = <...>;

debug 注意点:

赋值1则打开debug功能,在休眠唤醒中会打印出ATF中休眠和唤醒的log。

2.5 关闭APIO配置​

rockchip,apios-suspend = <...>;
/* APIO 电压域 */
#define RKPM_APIO0_SUSPEND (1 << 0)
#define RKPM_APIO1_SUSPEND (1 << 1)
#define RKPM_APIO2_SUSPEND (1 << 2)
#define RKPM_APIO3_SUSPEND (1 << 3)
#define RKPM_APIO4_SUSPEND (1 << 4)
#define RKPM_APIO5_SUSPEND (1 << 5)

APIO配置注意点:

RK3399 GPIO所在的APIO分成,APIO1~APIO5,在硬件电路支持的情况下,APIO休眠可以单独断电。

2.6 GPIO 控制电源​

rockchip,power-ctrl = <...>

配置范例:

// 休眠将GPIO1_C1拉高,控制外部电源断电

rockchip,power-ctrl = <&gpio1 RK_PC1 GPIO_ACTIVE_HIGH>,

3. 打印信息​

如下简要介绍系统待机和唤醒时的 trust 打印信息含义。为注释方便,如下对一些打印内容进行分行,不同的待机功耗模式同样也会带来不同的打印,所有打印信息内容以实际显示为主。

RK3399 系统待机打印:

// 休眠模式

INFO: sleep mode config[0xde]:
INFO: AP_PWROFF
INFO: SLP_ARMPD
INFO: SLP_PLLPD
INFO: DDR_RET
INFO: SLP_CENTER_PD

// 支持的唤醒源

INFO: wakeup source config[0x804]:
INFO: GPIO interrupt can wakeup system
INFO: PWM interrupt can wakeup system

// 休眠需要控制的pwm regulator

INFO: PWM CONFIG[0x4]:
INFO: PWM: PWM2D_REGULATOR_EN

// 休眠需要控制的APIO

INFO: APIOS info[0x0]:
INFO: not config

// 通过GPIO控制的电源

INFO: GPIO POWER INFO:
INFO: GPIO1_C1
INFO: GPIO1_B6

// 休眠模式寄存器的值

INFO: PMU_MODE_CONG: 0x1466bf51

RK3399 系统唤醒打印:

// 唤醒打印

INFO: RK3399 the wake up information:
INFO: wake up status: 0x4
INFO: GPIO interrupt wakeup
INFO: GPIO0: 0x0
INFO: GPIO1: 0x200000
INFO: GPIO2: 0x0
INFO: GPIO3: 0x0
INFO: GPIO4: 0x0

// 唤醒源

GPIO interrupt wakeup

gpio1_c5中断唤醒系统