基本信息
硬件平台: RK3568
系统: Android 11
SDK版本:android-11.0-mid (官方提供)
参考资料:Rockchip_RK3568_Hardware_Design_Guide_V1.2_20211107_CN.pdf
任务背景: 因调试LCD屏需要进入休眠同时需要鼠标唤醒,源码提供的不支持鼠标唤醒。
一、默认休眠与唤醒配置
1、配置关键点
休眠配置:rockchip_suspend: rockchip-suspend{}
唤醒配置:rockchip,wakeup-config{}
关键电原 vdd_logic {}
2、关键配置文件:rk3568.dtsi
rockchip_suspend: rockchip-suspend {
compatible = "rockchip,pm-rk3568";
status = "disabled";
rockchip,sleep-debug-en = <1>;
rockchip,sleep-mode-config = <
(0
| RKPM_SLP_ARMOFF_LOGOFF
| RKPM_SLP_CENTER_OFF
| RKPM_SLP_HW_PLLS_OFF
| RKPM_SLP_PMUALIVE_32K
| RKPM_SLP_OSC_DIS
| RKPM_SLP_PMIC_LP
| RKPM_SLP_32K_PVTM
)
>;
rockchip,wakeup-config = <
(0
| RKPM_GPIO_WKUP_EN
)
>;
};
三:重点修改:
文件 rk3568.dtsi修改
rockchip_suspend: rockchip-suspend {
compatible = "rockchip,pm-rk3568";
status = "disabled";
rockchip,sleep-debug-en = <1>;
rockchip,sleep-mode-config = <
(0
| RKPM_SLP_CENTER_OFF
| RKPM_SLP_HW_PLLS_OFF
)
>;
rockchip,wakeup-config = <
(0
| RKPM_CPU0_WKUP_EN
| RKPM_GPIO_WKUP_EN /*GPIO唤醒*/
| RKPM_PWM0_WKUP_EN /*PWM唤醒*/
| RKPM_USB_WKUP_EN /* USB唤醒*/
)
>;
};
文件 rk3568-evb.dtsi
同时 vdd_logic 不能断电,需要修改如下:
regulators {
vdd_logic: DCDC_REG1 {
regulator-always-on;
regulator-boot-on;
regulator-min-microvolt = <500000>;
regulator-max-microvolt = <1350000>;
regulator-init-microvolt = <900000>;
regulator-ramp-delay = <6001>;
regulator-initial-mode = <0x2>;
regulator-name = "vdd_logic";
regulator-state-mem {
//regulator-off-in-suspend;
regulator-on-in-suspend; /*修改为 on ,休眠不断电*/
};
};
四、简要说明
休眠唤醒功能宏定义文件:include/dt-bindings/suspend/rockchip-rk3568.h
其中定义唤醒源,休眠电源控制如下:
#define RKPM_SLP_WFI BIT(0)
#define RKPM_SLP_ARMOFF BIT(1)
#define RKPM_SLP_CENTER_OFF BIT(2)
#define RKPM_SLP_ARMOFF_LOGOFF BIT(3)
#define RKPM_SLP_FROM_UBOOT BIT(4)
#define RKPM_SLP_PMIC_LP BIT(5)
#define RKPM_SLP_HW_PLLS_OFF BIT(6)
#define RKPM_SLP_PMUALIVE_32K BIT(7)
#define RKPM_SLP_OSC_DIS BIT(8)
#define RKPM_SLP_32K_EXT BIT(9)
#define RKPM_SLP_32K_PVTM BIT(10)
/* the wake up source */
#define RKPM_CPU0_WKUP_EN BIT(0)
#define RKPM_CPU1_WKUP_EN BIT(1)
#define RKPM_CPU2_WKUP_EN BIT(2)
#define RKPM_CPU3_WKUP_EN BIT(3)
#define RKPM_GPIO_WKUP_EN BIT(4)
#define RKPM_UART0_WKUP_EN BIT(5)
#define RKPM_SDMMC0_WKUP_EN BIT(6)
#define RKPM_SDMMC1_WKUP_EN BIT(7)
#define RKPM_SDMMC2_WKUP_EN BIT(8)
#define RKPM_USB_WKUP_EN BIT(9)
#define RKPM_PCIE_WKUP_EN BIT(10)
#define RKPM_VAD_WKUP_EN BIT(11)
#define RKPM_TIMER_WKUP_EN BIT(12)
#define RKPM_PWM0_WKUP_EN BIT(13)
#define RKPM_TIMEOUT_WKUP_EN BIT(14)
#define RKPM_SFT_WKUP_EN BIT(15)
#define RKPM_USB_LINESTATE_WKUP_EN BIT(16)
#define RKPM_SLP_LDO1_ON BIT(0)
#define RKPM_SLP_LDO2_ON BIT(1)
#define RKPM_SLP_LDO3_ON BIT(2)
#define RKPM_SLP_LDO4_ON BIT(3)
#define RKPM_SLP_LDO5_ON BIT(4)
#define RKPM_SLP_LDO6_ON BIT(5)
#define RKPM_SLP_LDO7_ON BIT(6)
#define RKPM_SLP_LDO8_ON BIT(7)
#define RKPM_SLP_LDO9_ON BIT(8)
因为需要USB唤醒,所以USB相关的电源是必须供电的,同时相关时钟必须供电,根据电路,USB模块是不能掉电的。如图:
所以在休眠配置项中
| RKPM_SLP_ARMOFF_LOGOFF
| RKPM_SLP_CENTER_OFF
| RKPM_SLP_HW_PLLS_OFF
| RKPM_SLP_PMUALIVE_32K
| RKPM_SLP_OSC_DIS
| RKPM_SLP_PMIC_LP
| RKPM_SLP_32K_PVTM
不能配置RKPM_SLP_ARMOFF_LOGOFF、RKPM_SLP_PMU_DIS_OSC、RKPM_SLP_PMU_PMUALIVE_32K项,否则无法唤醒。
因需要USB唤醒,所以唤醒源中添加
| RKPM_CPU0_WKUP_EN
| RKPM_GPIO_WKUP_EN /*GPIO唤醒*/
| RKPM_PWM0_WKUP_EN /*PWM唤醒*/
| RKPM_USB_WKUP_EN /* USB唤醒*/
因中断源一般在cpu0上,需要支持唤醒,GPIO支持按键唤醒,当然按键是接在GPIO上,最重要的是USB唤醒源,需要添加。
注手册上一段说明:
RK3568芯片在待机时,可以选择将工作时钟源切换到PMU_PVTM模块提供的时钟或外部输入的
32.768KHz时钟,关掉OSC振荡电路,可得到更优的芯片待机功耗,此时只支持PMUIO1和PMUIO2电源域里的IO中断唤醒,如果需求的唤醒源和24MHz时钟有关,那么24MHz时钟不能关掉。
PVTM(Process-Voltage-Temperature Monitor)模块集成的时钟振荡环,可产生时钟,这个时钟频
率由时钟振荡环电路的延迟单元决定,产生的时钟可供芯片待机的时钟源;使用外部输入的
32.768KHz时钟当RK3568芯片休眠时钟时,可得到最优的芯片待机功耗,此时PVTM模块也可以关掉