Rockchip RK3588 kernel dts解析之系统休眠配置rockchip_suspend

文章目录

  • Rockchip RK3588 kernel dts解析之系统休眠配置rockchip_suspend
    • DTS 节点
    • 休眠的配置说明
    • 唤醒配置
    • 打印信息
    • logic电源休眠不关的配置方法
    • 休眠后GPIO不断电的配置
    • 配置GPIO0外的其他GPIO作为唤醒源

带有 trust 的 SoC 平台,系统待机(system suspend)的工作都在 trust 中完成。因为各个平台的 trust 对于系统待机实现各不相同,所以 不同平台之间的待机配置选项/方法没有任何关联性和参考性,本文档仅适用于 RK3588 平台
系统待机流程一般会有如下操作:关闭 power domain、模块 IP、时钟、PLL、ddr 进入自刷新、系统总线切到低速时钟(24M 或 32K)、vdd_arm /vdd_log断电、配置唤醒源等。为了满足不同产品对待机模式的需求,目前都是通过 DTS 节点把相关配置在开机阶段传递给 trust。

DTS 节点

arch/arm64/boot/dts/rockchip/rk3588s.dtsi
rockchip_suspend: rockchip-suspend {compatible = "rockchip,pm-rk3588";status = "disabled";// 休眠log开关配置,0:关闭打印, 1:打开打印rockchip,sleep-debug-en = <0>;// 休眠配置rockchip,sleep-mode-config = <(0| RKPM_SLP_ARMOFF_LOGOFF| RKPM_SLP_PMU_PMUALIVE_32K| RKPM_SLP_PMU_DIS_OSC| RKPM_SLP_32K_EXT)>;// 唤醒源配置rockchip,wakeup-config = <(0| RKPM_GPIO_WKUP_EN)>;
};

rockchip_suspend节点EVB参考板子是在arch/arm64/boot/dts/rockchip/rk3588-evb.dtsi中打开

&rockchip_suspend {status = "okay";// 休眠log开关配置,0:关闭打印, 1:打开打印rockchip,sleep-debug-en = <1>;
};

休眠的配置说明

配置项:

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

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

./include/dt-bindings/suspend/rockchip-rk3588.h
// 断电vdd_arm,需要硬件电路设计上能支持
#define RKPM_SLP_ARMOFF             BIT(1)
// 断电vdd_arm,且DDR控制器断电,需要硬件电路设计上能支持
#define RKPM_SLP_ARMOFF_DDRPD       BIT(2)
// 断电vdd_arm和vdd_log,需要硬件电路设计上能支持
#define RKPM_SLP_ARMOFF_LOGOFF      BIT(3)
// 断电vdd_arm和vdd_log,且PMU1电源域断电,需要硬件电路设计上能支持
#define RKPM_SLP_ARMOFF_PMUOFF      BIT(4)// 休眠时使用32K时钟源作为系统时钟
#define RKPM_SLP_PMU_PMUALIVE_32K   BIT(9)
// 关闭24M晶振,最低功耗模式时可使能,需要配合RKPM_SLP_PMU_PMUALIVE_32K使用
#define RKPM_SLP_PMU_DIS_OSC        BIT(10)
// 休眠时的32K时钟源是否选用外部的32K钟源,不配该选项则默认选用内部32K时钟源,需要配合RKPM_SLP_PMU_PMUALIVE_32K使用
#define RKPM_SLP_32K_EXT            BIT(24)

注意事项:

  • 需要根据具体产品对唤醒源的需求进行相关配置,比如usb唤醒,那休眠时就不能将usb的电源和时钟关闭,所以不能配置RKPM_SLP_ARMOFF_LOGOFF、RKPM_SLP_PMU_DIS_OSC、RKPM_SLP_PMU_PMUALIVE_32K等选项。

唤醒配置

配置项:

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

配置源:

// 支持所有的中断唤醒(经过GIC管理的休眠可唤醒中断),一般由cpu0运行休眠流程,需要时只配RKPM_CPU0_WKUP_EN即可
#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_CPU4_WKUP_EN       BIT(4)
#define RKPM_CPU5_WKUP_EN       BIT(5)
#define RKPM_CPU6_WKUP_EN       BIT(6)
#define RKPM_CPU7_WKUP_EN       BIT(7)
// GPIO0唤醒
#define RKPM_GPIO_WKUP_EN       BIT(8)
// SDMMC唤醒
#define RKPM_SDMMC_WKUP_EN      BIT(9)
// SDIO唤醒
#define RKPM_SDIO_WKUP_EN       BIT(10)
// USB DEV 唤醒
#define RKPM_USB_WKUP_EN        BIT(11)
// UART0唤醒
#define RKPM_UART0_WKUP_EN      BIT(12)
// VAD唤醒
#define RKPM_VAD_WKUP_EN        BIT(13)
// RK TIMER 唤醒
#define RKPM_TIMER_WKUP_EN      BIT(14)
// 支持所有的中断唤醒(不经过GIC管理),不推荐使用
#define RKPM_SYSINT_WKUP_EN     BIT(15)
// PMU内部timer唤醒(默认1s),用于测试和debug
#define RKPM_TIME_OUT_WKUP_EN   BIT(16)

唤醒源注意事项:

  • RKPM_GPIO_WKUP_EN(首选):

    GPIO0~4 中仅支持 GPIO0 这组 pin 脚作为唤醒源,该模式下 GPIO0 上的 pin 脚中断信号被直接送往 PMU 状态机,不经过 GIC。在硬件设计上,建议用户把需要的唤醒源尽量都放到 GPIO0 这组 pin 脚上。

  • RKPM_CPU0_WKUP_EN(次选):

    支持所有在 kernel 阶段用 enable_irq_wake()注册到 GIC 的可唤醒中断,适用的唤醒中断源数量比 RKPM_GPIO_WKUP_EN更多。但这种方式相当于把唤醒源的管理权分散交给了 kernel 各个模块,待机时系统有可能被不期望的中断唤醒。

  • RKPM_TIMEOUT_WAKEUP_EN:

    PMU 内部的 timer 唤醒,默认 1s 超时产生中断,一般仅用于开发阶段测试休眠唤醒使用。

打印信息

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

配置项:

 rockchip,sleep-debug-en = <...>;
  • 0:休眠时不会打印log, 1:休眠时会打印log。

RK3588 系统待机打印:

//休眠所用trust bl31版本及commit信息
INFO:    BL31: v2.3():v2.3-264-g378cb8595:derrick.huang//休眠模式配置及休眠次数打印
INFO:    enter: cfg=0x5000604, sleeptimes:1//休眠模式打印
INFO:    armoff_ddrpd
INFO:    pmu_pmualive_32k
INFO:    pmu_dis_osc
INFO:    32k ext
INFO:    pmu debug//休眠gpio中断配置状态打印
INFO:    GPIO0_INTEN: 0xffff 0xffff 0xff7f 0xefff 0x0 0xc81e142d
INFO:    GPIO1_INTEN: 0xffff 0xffff 0xffff 0xffff 0x0 0xe82863
INFO:    GPIO2_INTEN: 0xffff 0xffff 0xffff 0xffff 0x0 0xffefcef7
INFO:    GPIO3_INTEN: 0xffff 0xffff 0xeffe 0xffff 0x0 0xf0044483
INFO:    GPIO4_INTEN: 0xffff 0xffff 0xffff 0xffff 0x0 0xe0dc2003//休眠关键寄存器信息打印
INFO:    PMU1_PWR_CON(0x1) PMU1_CRU_PWR_CON(0x23) PMU1_WAKEUP_INT_CON(0x100)
PMU2_BUS_IDLE_ST(0x27fffff 0x0) PMU2_BUS_IDLE_ACK(0x27fffff 0x0) PMU2_PWR_GATE_ST(0x67ffffff 0x0)
PMU2_BUS_IDLE_CON(0x0 0xfd80 0xf007) PMU2_BIU_AUTO_CON(0xffff 0xffff 0x7)
PMU2_PWR_GATE_CON(0x0 0x9000 0x3)
PMU2_VOL_GATE_CON(0x7 0x0 0x3)
PMU2_QCHANNEL_PWR_CON(0x0) PMU2_QCHANNEL_STATUS(0xfe0007f)
PMU1_DDR_PWR_CON(0x747 0x747 0x747 0x747)
PMU1_DDR_PWR_SFTCON(0x900 0x900 0x900 0x900)
PMU1_PLLPD_CON(0xffff 0x3)
PMU2_DSU_PWR_CON(0x3)
PMU2_CORE_PWR_CON0(0x1 0x1)
PMU2_CORE_AUTO_PWR_CON0(0x0 0x0)
PMU2_CLUSTER_IDLE_CON(0x75)
INFO:    PMU0_PWR_CON(0x0) PMU0_WAKEUP_INT_CON(0x0)
PMU0_DDR_RET_CON(0x0 0x0)
PMU1_GRF_SOC_CON2(0x7777) PMU0_GRF_OS_REGS9(0xd8394dc7)

RK3588 系统唤醒打印:

// 唤醒流程步骤打印
012376543edcba2// 唤醒源
INFO:      gpio0_a7
INFO:    wake up status: 0x100
INFO:    the wake up information:
INFO:    GPIO0 interrupt wakeup
INFO:    GPIO0: 0x80

logic电源休眠不关的配置方法

  1. 确认logic是有哪个电源域控制,可以通过硬件原理图查看,RK3588的单pmic的默认设计对应的软件配置如下:
vdd_log_s0: DCDC_REG3 {regulator-always-on;regulator-boot-on;regulator-min-microvolt = <675000>;regulator-max-microvolt = <750000>;regulator-ramp-delay = <12500>;regulator-name = "vdd_log_s0";regulator-state-mem {regulator-off-in-suspend;  //这里表示休眠的时候这路电源要关闭,如果休眠要打开可以改为regulator-on-in-suspendregulator-suspend-microvolt = <750000>;};};

改为

vdd_log_s0: DCDC_REG3 {regulator-always-on;regulator-boot-on;regulator-min-microvolt = <675000>;regulator-max-microvolt = <750000>;regulator-ramp-delay = <12500>;regulator-name = "vdd_log_s0";regulator-state-mem {regulator-on-in-suspend;  //这里表示休眠的时候这路电源要关闭,如果休眠要打开可以改为regulator-on-in-suspendregulator-suspend-microvolt = <750000>; //休眠后的电压};};
  1. 修改rockchip_suspend节点中的rockchip,wakeup-config的配置
&rockchip_suspend {status = "okay";// 休眠log开关配置,0:关闭打印, 1:打开打印rockchip,sleep-debug-en = <1>;rockchip,sleep-mode-config = <(0| RKPM_SLP_ARMOFF_DDRPD   //改为这个配置表示logic不断电| RKPM_SLP_PMU_PMUALIVE_32K| RKPM_SLP_PMU_DIS_OSC| RKPM_SLP_32K_EXT)>;
};

休眠后GPIO不断电的配置

RK3588的默认配置是休眠后除了GPIO0这组GPIO外其他的GPIO都是会断电的,如果需要其他GPIO不断电,需要按如下进行配置

  1. 上面配置logic不断电
  2. 给gpio供电的那路电源休眠的时候不要断电

配置GPIO0外的其他GPIO作为唤醒源

  1. 按上面方法配置logic不断电
  2. 按上面方法配置这路gpio休眠的时候不要断电
  3. rockchip_suspend中配置RKPM_CPU0_WKUP_EN
&rockchip_suspend {status = "okay";// 休眠log开关配置,0:关闭打印, 1:打开打印rockchip,sleep-debug-en = <1>;rockchip,sleep-mode-config = <(0| RKPM_SLP_ARMOFF_DDRPD   //改为这个配置表示logic不断电| RKPM_SLP_PMU_PMUALIVE_32K| RKPM_SLP_PMU_DIS_OSC| RKPM_SLP_32K_EXT)>;// 唤醒源配置rockchip,wakeup-config = <(0| RKPM_GPIO_WKUP_EN| RKPM_CPU0_WKUP_EN)>;
};

Rockchip RK3588 kernel dts解析之系统休眠配置rockchip_suspend相关推荐

  1. Rockchip RK3588 kernel dts解析之音频模块

    Rockchip RK3588 kernel dts解析之音频模块 RK3588 EVB板子使用的是外接声卡ES8388 DTS配置参考:rk3588-evb1-lp4.dtsi 系统声音配置: es ...

  2. Rockchip RK3588 kernel dts解析之MMC

    Rockchip RK3588 kernel dts解析之MMC RK3588的MMC分为3中模式: SDMMC SDIO SDHCI 下面针对每种模式的DTS配置进行说明 SDMMC SDMMC用于 ...

  3. Rockchip RK3588 kernel dts解析之PCIe

    Rockchip RK3588 kernel dts解析之PCIe 文章目录 Rockchip RK3588 kernel dts解析之PCIe RK3588控制器 RK3588 PHY 使用限制 D ...

  4. Rockchip RK3588 kernel dts解析之电源模块

    Rockchip RK3588 kernel dts解析之电源模块 文章目录 Rockchip RK3588 kernel dts解析之电源模块 RK3588搭配的电源方案有2种 注意单PIMC核双P ...

  5. Rockchip RK3588 kernel dts解析之Camera

    Rockchip RK3588 kernel dts解析之Camera 文章目录 Rockchip RK3588 kernel dts解析之Camera RK3588的Camera相关资源介绍 MIP ...

  6. Rockchip RK3588 kernel dts解析之USB模块

    Rockchip RK3588 kernel dts解析之USB模块 文章目录 Rockchip RK3588 kernel dts解析之USB模块 RK3588 USB DTS 配置 USB 芯片级 ...

  7. Rockchip RK3588 kernel dts解析之GPIO Pinctrl

    Rockchip RK3588 kernel dts解析之GPIO Pinctrl 文章目录 Rockchip RK3588 kernel dts解析之GPIO Pinctrl GPIO的命令规则 I ...

  8. Rockchip RK3588 kernel dts解析之WIFI/BT

    Rockchip RK3588 kernel dts解析之WIFI/BT RK3588 EVB的WIFI/BT使用的是外挂双模模块,其中根据WIFI的数据通信接口不同可以分为PCIE和SDIO两种,下 ...

  9. Rockchip RK3588 Android+Linux双系统方案的实现

    Rockchip RK3588 Android+Linux双系统方案的实现 文章目录 Rockchip RK3588 Android+Linux双系统方案的实现 概述 硬件环境 软件环境 要求 代码修 ...

  10. Rockchip RK3588如何创建新一个新板级DTS

    Rockchip RK3588如何创建新一个新板级DTS 文章目录 Rockchip RK3588如何创建新一个新板级DTS 基于SDK已有的DTS选择一个适合的基础参考DTS RK3588 SDK发 ...

最新文章

  1. android 获取 第三方应用,​android PackageManager的使用如何获取第三方应用程序(包)的信息,求大神指点...
  2. thinkphp mysql权限管理_TP thinkphp 权限管理 权限认证 功能
  3. java param add_Java中的Map paramMap
  4. [Abp 源码分析]异常处理
  5. 如何打造组织级敏捷,你想知道的都在这里!
  6. 一个列中多行求和_excel表格制作,Excel表格的基本操作,包含制作一个表格10方面的知识(1)...
  7. 字符设备驱动基础篇1——简单的驱动源码分析
  8. 设计网页字体css,CSS教程 :网页字体及字体大小的设计
  9. ACE ADMIN 大全
  10. 7-6 分支结构——大小写字母判断 (15 分)
  11. 微信小程序配置实现中英文国际化语言切换
  12. PCL显示点云-ICP(PCL1.9.1)
  13. 生活中的统计概率思维
  14. java多线程------锁
  15. Flask开发微电影网站(六)
  16. Qt文档阅读笔记-DTLS client解析
  17. 初一计算机课怎么上,如何上好初中信息技术课
  18. 一文解读解读柏拉图给DAO成员空投1.5亿美金的意义
  19. 多思计组实验实验五、程序计数器实验
  20. 字符流问答小程序解题过程及拓展

热门文章

  1. linux如何使用ntfs格式的优盘
  2. 计算机搜不到word了,电脑word找不到路径
  3. android写轮眼,打造iOS般流畅的安卓 神器写轮眼使用教程
  4. 【随笔】第一批走进大学的“00后”群体——纪念2015级西安交大少年班
  5. linux进入rescue,进入Linux rescue模式后有几种方法引导系统
  6. 任务栏的图标变成白色
  7. windows10关闭java自动更新
  8. Unity5入门及进阶项目实战 星际迷航-肖师军-专题视频课程
  9. Time Limit Exceeded的原因及避免方法
  10. 洛谷P2184——贪婪大陆