跳到主要内容

Rockchip RT-Thread Power Manager

文件标识:RK-KF-YF-104

发布版本:V1.1.1

日期:2021-04-29

文件密级:□绝密 □秘密 □内部资料 ■公开

免责声明

本文档按“现状”提供,瑞芯微电子股份有限公司(“本公司”,下同)不对本文档的任何陈述、信息和内容的准确性、可靠性、完整性、适销性、特定目的性和非侵权性提供任何明示或暗示的声明或保证。本文档仅作为使用指导的参考。

由于产品版本升级或其他原因,本文档将可能在未经任何通知的情况下,不定期进行更新或修改。

商标声明

“Rockchip”、“瑞芯微”、“瑞芯”均为本公司的注册商标,归本公司所有。

本文档可能提及的其他所有注册商标或商标,由其各自拥有者所有。

版权所有 © 2021 瑞芯微电子股份有限公司

超越合理使用范畴,非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传播。

瑞芯微电子股份有限公司

Rockchip Electronics Co., Ltd.

地址: 福建省福州市铜盘路软件园A区18号

网址: www.rock-chips.com

客户服务电话: +86-4007-700-590

客户服务传真: +86-591-83951833

客户服务邮箱: fae@rock-chips.com


前言

概述

本文提供基于RT Thread平台功耗控制说明。

产品版本

芯片名称内核版本
本公司采用RT Thread系统的芯片

读者对象

本文档(本指南)主要适用于以下工程师:

技术支持工程师 软件开发工程师

修订记录

版本号作者修改日期修改说明
V1.0.0谢修鑫2020-03-04初始版本
V1.0.1谢修鑫2020-05-27修正格式
V1.1.0许盛飞2020-05-28更新低功耗相关说明
V1.1.1黄莹2021-04-29修改格式

目录

[TOC]


RT-Thread Power Manager 功能支持

  • 支持Clock Gating
  • 支持Power Gating
  • 支持DVFS 动态调频调压

功耗管理方法

基本概念

Clock Gating: 控制CLOCK开关

Power Gating: SOC内部会划分不同的Power Domain,每个Power Domain的供电可以通过SOC内部的控制进行开关,开关操作即Power Gating

DVFS-动态调频调压: 芯片运行一定频率需要对应电压支持,如:运行频率、电压为400M-0.9V,600M-0.95V两组,软件上支持频率从400M切换到600M,对应的电压从0.9V切换到0.95V

动态功耗: 动态功耗和运行电压、运行频率相关,控制方法为DVFS、Clock Gating

静态功耗: 静态功耗和电压、温度相关,控制方法为Power Gating

Clock Gating

一个模块不需要工作时,需要关闭对应的CLOCK;接口如下:

rt_err_t clk_enable(struct clk_gate *gate, int on)

涉及参考文档为:CLK/Rockchip_Developer_Guide_RTOS_Clock_CN.md

Power Gating

一个模块不需要工作时,第一步需要先关闭对应的CLOCK,然后再关闭对应的Power Domain;由于关闭Power Gating的耗时比Clock Gating的耗时长,所以一般在长时间不使用的情况下才进行Power Gating操作;接口如下:

rt_err_t pd_power(struct pd *power, int on)

涉及参考文档为:CLK/Rockchip_Developer_Guide_RTOS_Clock_CN.md

DVFS 控制

涉及参考文档为:Rockchip_Developer_Guide_RT-Thread_DVFS_CN.md

RT-Thread PM MODE控制

RT Thread基于PM MODE机制控制不同场景下的功耗需求,具体实现参数RT-Thread官方文档。实现上面通过和DVFS机制协同实现。

RT-Thread PM MODE 基本概念

系统在pm_cfg.h 中定义了run modes、sleep modes 两类模式,用户也可以根据需求进行扩展。

enum
{
/* run modes */
PM_RUN_MODE_HIGH = 0,
PM_RUN_MODE_NORMAL,
PM_RUN_MODE_LOW,

/* sleep modes */
PM_SLEEP_MODE_SLEEP,
PM_SLEEP_MODE_TIMER,
PM_SLEEP_MODE_SHUTDOWN,
};

RT-Thread PM MODE 使用

  1. 通过下面两个函数申请和释放一个模式:

    void rt_pm_request(rt_ubase_t mode)

    void rt_pm_release(rt_ubase_t mode)

    参数mode: 对应上面的PM_RUN_MODE_HIGH、PM_RUN_MODE_NORMAL、PM_RUN_MODE_LOW、PM_SLEEP_MODE_SLEEP等模式。

  2. 通过命令控制

通过命令: msh >pm_dump查看系统所在状态。

msh >pm_dump
| Power Management Mode | Counter | Timer |
+-----------------------+---------+-------+
| Running High Mode | 0 | 0 |
| Running Normal Mode | 1 | 0 |
| Running Low Mode | 0 | 0 |
| Sleep Mode | 1 | 0 |
| Timer Mode | 0 | 0 |
| Shutdown Mode | 1 | 0 |
+-----------------------+---------+-------+
pm current mode: Running Normal Mode

通过命令:msh >pm_request 1申请进入1的模式(PM_RUN_MODE_NORMAL)

通过命令:msh >pm_release 1释放1的模式(PM_RUN_MODE_NORMAL)。

初始化配置-Power Management Mode 对应的 DVFS

const static struct dvfs_table dvfs_core_table[] =
{
{
.freq = 297000000,
.volt = 800000,
},
{
.freq = 396000000,
.volt = 900000,
},
};

const static struct dvfs_table dvfs_shrm_table[] =
{
{
.freq = 297000000,
.volt = 800000,
},
{
.freq = 396000000,
.volt = 850000,
},
};

struct rk_dvfs_desc dvfs_data[] =
{
{
.clk_id = SCLK_SHRM,
.pwr_id = PWR_ID_CORE,
.tbl_idx = 1,
.table = &dvfs_shrm_table[0],
.tbl_cnt = HAL_ARRAY_SIZE(dvfs_shrm_table),
},
{
.clk_id = HCLK_M4,
.pwr_id = PWR_ID_CORE,
.tbl_idx = 1,
.table = &dvfs_core_table[0],
.tbl_cnt = HAL_ARRAY_SIZE(dvfs_core_table),
},
};

该代码段为配置DVFS table,参考:Rockchip_Developer_Guide_RT-Thread_DVFS_CN.md

初始化配置-Power Management Mode

static struct pm_mode_dvfs pm_mode_data[] =
{
{
.clk_id = HCLK_M4,
.run_tbl_idx = {1, 1, 0},
.sleep_tbl_idx = 0,
},
{
.clk_id = SCLK_SHRM,
.run_tbl_idx = {1, 1, 0},
.sleep_tbl_idx = 0,
},
};

通过struct pm_mode_dvfs结构管理每一个clk(clk_id指定)在各个PM MODE下的运行频率,指定方式为 :

1.run_tbl_idx = 0

这里的1,1,0指定PM_RUN_MODE_HIGH、PM_RUN_MODE_NORMAL、PM_RUN_MODE_LOW三种运行模式对应的频率为DVFS table (以core为例) 的dvfs_core_table[1]、dvfs_core_table[1]、dvfs_core_table[0]。

2.sleep_tbl_idx = 0 表示SLEEP 模式对应的频率电压为dvfs_data[0]定义。

3.系统通过下面函数初始化

void rkpm_register_dvfs_info(struct pm_mode_dvfs *dvfs, int cnt, void (*pm_func)(uint32_t))`

参数dvfs: 即上面 pm_mode_data[]首地址

参数pm_func: 用于不同芯片对于功耗的个性控制,暂时没有使用。

Runtime Power 控制

对于在运行状态的系统,系统会根据各个模块的状态进行相关功耗控制,所以各个模块的驱动中需要通过下面两个函数申请、释放自己的运行状态。

void pm_runtime_request(ePM_RUNTIME_ID runTimeId)

void pm_runtime_release(ePM_RUNTIME_ID runTimeId)

低功耗(Sleep Mode)设计及实现

主要操作

低功耗的主要操作如下:

  1. 配置休眠模式
  2. 判断是否需要将系统休眠时钟切换到32K
  3. 可选择配置GPIO, TIMER, TIMEOUT中断作为休眠时唤醒系统的信号源

具体实现

  1. 配置休眠模式,根据进入休眠时PD_DSP, PD_AUDIO的状态,决定休眠时,是否关闭对应的PD,VD及系统休眠时钟是否切换到32k,在下面的函数中实现对应的操作。
static void SOC_SleepModeInit(struct PMU_REG *pPmu)
  1. 配置唤醒信号源,使能的唤醒源产生的中断能在系统休眠时唤醒系统。支持GPIO,TIMER,TIMEOUT等唤醒源的使能配置,默认使能GPIO,TIMER唤醒源, TIMEOUT主要用于开发时调试验证使用。

更改默认唤醒源,如disable GPIO中断唤醒功能,只需要将下面的函数中value变量对应的唤醒源宏去掉。

static void SOC_WakeupSourceConfig(struct PMU_REG *pPmu)