RK3308 系统待机配置指南
:::info 文档信息
发布版本:1.1 · 页数:8 · 语言:中文
原始文档:Rockchip_RK3308_Developer_Guide_System_Suspend_CN.pdf
:::
章节大纲
- RK3308 系统待机配置指南(P1)
- 系统待机(P4)
- 驱动文件(P4)
- DTS 节点(P4)
- DTS 配置(P5)
- 常规配置(P5)
- 电源配置(P5)
- 唤醒配置(P6)
- debug 配置(P7)
- reboot 复位配置(P7)
- 打印信息(P8)
- 系统待机(P4)
在线预览
若预览无法显示,请直接下载 PDF 后用本地阅读器打开。
1. 系统待机
凡是带有 trust 的 SoC 平台,系统待机(system suspend)的工作都在 trust 中完成。因为各个平台的 trust对于系统待机实现各不相同,所以不同平台之间的待机配置选项/方法没有任何关联性和参考性,本文档仅适用于 RK3308 平台。
系统待机流程一般会有如下操作:关闭 power domain、模块 IP、时钟、PLL、ddr 进入自刷新、系统总线切到低速时钟(24M 或 32K)、vdd_arm 断电、配置唤醒源等。为了满足不同产品对待机模式的需求,目前都是通过 DTS 节点把相关配置在开机阶段传递给 trust。
1.1 驱动文件
./drivers/soc/rockchip/rockchip_pm_config.c
./drivers/firmware/rockchip_sip.c
./include/dt-bindings/suspend/rockchip-rk3308.h
1.2 DTS 节点
rockchip_suspend: rockchip-suspend {
compatible = "rockchip,pm-rk3308";
status = "okay";
// 常规配置
rockchip,sleep-mode-config = <
(0
| RKPM_PMU_HW_PLLS_PD
| RKPM_DBG_FSM_SOUT
)
>;
// 唤醒源配置
rockchip,wakeup-config = <
(0
| RKPM_GPIO0_WAKEUP_EN
)
>;
// 电源配置
rockchip,pwm-regulator-config = <
(0
| RKPM_xxx
)
>;
// reboot复位配置
rockchip,apios-suspend = <
(0
| RKPM_xxx
)
>;
};
2. DTS 配置
目前已支持的配置选项都定义在:
./include/dt-bindings/suspend/rockchip-rk3308.h
2.1 常规配置
rockchip,sleep-mode-config = <...>;
// 断电vdd_arm,需要硬件电路设计上能支持
#define RKPM_ARMOFF BIT(0)
// 关闭vad模块,不需要VAD唤醒时可关闭
#define RKPM_VADOFF BIT(1)
// 默认必选
#define RKPM_PMU_HW_PLLS_PD BIT(3)
// 关闭24M晶振,最低功耗模式时可使能,需要配合选中下面的xxx_32K时钟源配置
#define RKPM_PMU_DIS_OSC BIT(4)
// 使用PMU内部的32K时钟源作为系统时钟(相比外部32K时钟,推荐此方法)
#define RKPM_PMU_PMUALIVE_32K BIT(5)
// 使用外部32K晶振作为系统时钟,不推荐
#define RKPM_PMU_EXT_32K BIT(6)
// 默认不选
#define RKPM_DDR_SREF_HARDWARE BIT(7)
// 默认不选
#define RKPM_DDR_EXIT_SRPD_IDLE BIT(8)
// RKPM_ARMOFF的情况下关闭PDM的clk时钟
#define RKPM_PDM_CLK_OFF BIT(9)
// 待机时pwm-regulator设置和maskrom一样的电压(否则会使用更低的电压,目前仅宽温芯片需要选择此项)
#define RKPM_PWM_VOLTAGE_DEFAULT BIT(10)
目前 RK3308 支持的待机模式可分为 2 类:
VAD 类产品:待机时需要支持 VAD 唤醒源,不会关闭 VAD/ACODEC/PDM 等相关模块 IP 和时钟,需保持 24M 晶振和相关 PLL 正常工作。目前待机时 trust 会先检测 VAD 相关模式是否在kernel 阶段已经关闭,如果没有关闭则默认是 VAD 类产品,待机时切到支持 VAD 唤醒的低功耗模式。非 VAD 类产品:待机时没有需要维持工作的模块 IP,所有的模块和时钟几乎都可以关闭,是一种最低功耗的模式。这种模式下,系统时钟可以切到 32K 或者 24M。
2.2 电源配置
rockchip,pwm-regulator-config = <...>;
// 使用pwm-regulator
#define RKPM_PWM_REGULATOR BIT(2)
电源注意点:
根据外部硬件电路设计确定是否使用了 pwm-regulator。
2.3 唤醒配置
rockchip,wakeup-config = <...>;
// 支持所有的中断唤醒(不经过GIC管理),不推荐使用
#define RKPM_ARM_PRE_WAKEUP_EN BIT(11)
// 支持所有的中断唤醒(经过GIC管理的休眠可唤醒中断)
#define RKPM_ARM_GIC_WAKEUP_EN BIT(12)
// SDMMC唤醒
#define RKPM_SDMMC_WAKEUP_EN BIT(13)
#define RKPM_SDMMC_GRF_IRQ_WAKEUP_EN BIT(14)
// RK TIMER唤醒
#define RKPM_TIMER_WAKEUP_EN BIT(15)
// USB唤醒
#define RKPM_USBDEV_WAKEUP_EN BIT(16)
// PMU内部timer唤醒(默认5s),一般用于测试休眠唤醒使用
#define RKPM_TIMEOUT_WAKEUP_EN BIT(17)
// GPIO0唤醒
#define RKPM_GPIO0_WAKEUP_EN BIT(18)
// VAD唤醒
#define RKPM_VAD_WAKEUP_EN BIT(19)
唤醒源注意点:
RKPM_GPIO0_WAKEUP_EN(首选):
GPIO0~3 中仅支持 GPIO0 这组 pin 脚作为唤醒源,该模式下 GPIO0 上的 pin 脚中断信号被直接送往 PMU 状态机,不经过 GIC。在硬件设计上,建议用户把需要的唤醒源尽量都放到 GPIO0 这组pin 脚上。
RKPM_ARM_GIC_WAKEUP_EN(次选):
支持所有在 kernel 阶段用 enable_irq_wake()注册到 GIC 的可唤醒中断,适用的唤醒中断源数量比RKPM_GPIO0_WAKEUP_EN 更多。但这种方式相当于把唤醒源的管理权分散交给了 kernel 各个模块,待机时系统有可能被不期望的中断唤醒。
RKPM_TIMEOUT_WAKEUP_EN:
PMU 内部的 timer 唤醒,默认 5s 超时产生中断,一般仅用于开发阶段测试休眠唤醒使用。
2.4 debug 配置
rockchip,sleep-mode-config = <...>;
// 忽略
#define RKPM_DBG_INT_TIMER_TEST BIT(22)
#define RKPM_DBG_WOARKAROUND BIT(23)
#define RKPM_DBG_VAD_INT_OFF BIT(24)
// 休眠时常开所有的clk
#define RKPM_DBG_CLK_UNGATE BIT(25)
// 忽略
#define RKPM_DBG_CLKOUT BIT(26)
// PMU状态机信号输出
#define RKPM_DBG_FSM_SOUT BIT(27)
// 忽略
#define RKPM_DBG_FSM_STATE BIT(28)
// DUMP某些寄存器:gpio/grf/sgrf...
#define RKPM_DBG_REG BIT(29)
// 忽略
#define RKPM_DBG_VERBOSE BIT(30)
#define RKPM_CONFIG_WAKEUP_END BIT(31)
debug 注意点:
RKPM_DBG_CLK_UNGATE:如果怀疑待机阶段某些 clk 被关闭而引起系统/模块唤醒异常,可使能该配置。RKPM_DBG_REG:如果怀疑待机阶段某些寄存器值被 trust 修改,可使能该配置。RKPM_DBG_FSM_SOUT:使能该配置后,待机时 PMU 状态机会通过 GPIO4_D5 一直输出特定波形信号,用于反馈当前 PMU 状态机内部状态,该功能仅在发生系统待机时 PMU 状态机本身死机的情况下有用处。
2.5 reboot 复位配置
rockchip,apios-suspend = <...>;
#define GLB1RST_IGNORE_PWM0 BIT(23)
#define GLB1RST_IGNORE_PWM1 BIT(24)
#define GLB1RST_IGNORE_PWM2 BIT(25)
#define GLB1RST_IGNORE_GPIO0 BIT(26)
#define GLB1RST_IGNORE_GPIO1 BIT(27)
#define GLB1RST_IGNORE_GPIO2 BIT(28)
#define GLB1RST_IGNORE_GPIO3 BIT(29)
reboot 复位注意点:
目前 RK3308 默认使用的是 first global sotfware reset,reboot 时所有模块 IP 都会被复位。如果需要保持某些 IP 不被复位,那么需要配置上面的选项,目前支持:pwm03/gpio03 不复位。
GPIO 不复位的需求示例:
某些硬件电路设计上会提供“power hold”电源控制引脚,需要在系统上电早期阶段由软件拉高/低保证系统电源工作正常,在 reboot 过程中“power hold”引脚也不能被复位,否则会出现系统下电的情况。
3. 打印信息
如下简要介绍系统待机和唤醒时的 trust 打印信息含义。为注释方便,如下对一些打印内容进行分行,不同的待机功耗模式同样也会带来不同的打印,所有打印信息内容以实际显示为主。
RK3308 系统待机打印:
// 具备当唤醒源的pin脚
GPIO0_INTEN: 00000041
GPIO4_INTEN: 00001000
// kernel配置信息打印
v1.3(release):005c64b, cnt=1, config=0x8040009:armoff-hwplldown-ddrsw-gating-
24M-sout-
// 休眠流程步骤打印:每个字符都代表trust里的一个休眠步骤
0123a4
// vad相关模块的使能状态,1:使能,0:关闭
Enabling: vad(1) acodec(1) pdm(0) i2s_2(1)
// 各个模块占用的PLL情况, "Enabling"表示系统正在使用的PLL(因为不一定所有PLL都会开着)
DDR: vpll0 | VOICE(sum): vpll0 | I2S: vpll0 | PWM: dpll | Enabling: apll dpll
vpll0 | CRU_MODE: 3955
// "Disabling"表示待机时会被关闭的PLL
PMU Disabling: apll dpll vpll1
// PMU寄存器值(忽略)。"24Mhz"表示当前的系统时钟,如果当前是32K情况,则打印也随之变化体现
PMU: pd-000e wake-000c core-0bfb lo-180d hi-000e if-4001 24Mhz
// 休眠流程步骤打印。注意:打印完“wfi”就表示系统已经完全待机下去了!
5bRc678wfi
RK3308 系统唤醒打印:
// 唤醒流程步骤打印
876ab543210
// 唤醒源
IRQ=89
PMU wakeup int: vad
VAD int=00000113
// 本次系统深度待机时长
Wfi total: 2.419s(this: 2.419s)