本章简单介绍RK2108的 CPU、DSP 和 SRAM 的频率电压表配置
CPU频率电压表:
RT_WEAK const struct dvfs_table dvfs_core_table[] =
{
{
.freq = 297000000,
.volt = 800000,
},
{
.freq = 396000000,
.volt = 900000,
},
{ /* sentinel */ },
};
SRAM频率:
RT_WEAK const struct dvfs_table dvfs_shrm_table[] =
{
{
.freq = 297000000,
.volt = 800000,
},
{
.freq = 396000000,
.volt = 850000,
},
{ /* sentinel */ },
};
DSP频率
RT_WEAK const struct dvfs_table dvfs_dsp_table[] =
{
{
.freq = 49500000,
.volt = 800000,
},
{
.freq = 99000000,
.volt = 800000,
},
{
.freq = 198000000,
.volt = 800000,
},
{
.freq = 297000000,
.volt = 800000,
},
{
.freq = 396000000,
.volt = 800000,
},
{ /* sentinel */ },
};
/* DVFS配置 */
struct rk_dvfs_desc dvfs_data[] =
{
{
.clk_id = SCLK_SHRM, /* SRAM的ID, 表示这组配置属于SRAM */
.pwr_id = PWR_ID_CORE,
.tbl_idx = 0, /* 初始频率电压表索引,即297MHZ,0.8V */
.table = &dvfs_shrm_table[0], /* 指向上面的频率电压表 */
.tbl_cnt = HAL_ARRAY_SIZE(dvfs_shrm_table), /* 电压表大小 */
},
{
.clk_id = HCLK_M4, /* CPU的ID, 表示这组配置属于CPU */
.pwr_id = PWR_ID_CORE,
.tbl_idx = 0, /* 初始频率电压表索引,即297MHZ,0.8V */
.table = &dvfs_core_table[0], /* 指向上面的频率电压表 */
.tbl_cnt = HAL_ARRAY_SIZE(dvfs_core_table), /* 电压表大小 */
},
{
.clk_id = ACLK_DSP, /* DSP的ID, 表示这组配置属于DSP */
.pwr_id = PWR_ID_CORE,
.tbl_idx = 0, /* 初始频率电压表索引,即49.5MHZ,0.8V */
.table = &dvfs_dsp_table[0], /* 指向上面的频率电压表 */
.tbl_cnt = HAL_ARRAY_SIZE(dvfs_dsp_table), /* 电压表大小 */
}
};
/* 运行和休眠模式配置 */
static struct pm_mode_dvfs pm_mode_data[] =
{
{
.clk_id = HCLK_M4, /* 表示这组配置属于CPU */
.run_tbl_idx = { 1, 0, 0 }, /* 三种运行模式所对应的频率电压表索引 */
.sleep_tbl_idx = 0, /* 休眠模式所对应的频率电压表索引 */
},
{
.clk_id = SCLK_SHRM, /* 表示这组配置属于SRAM */
.run_tbl_idx = { 1, 0, 0 }, /* 三种运行模式所对应的频率电压表索引 */
.sleep_tbl_idx = 0, /* 休眠模式所对应的频率电压表索引 */
},
{
.clk_id = ACLK_DSP, /* 表示这组配置属于DSP */
.run_tbl_idx = { 2, 1, 0 }, /* 三种运行模式所对应的频率电压表索引 */
.sleep_tbl_idx = 0, /* 休眠模式所对应的频率电压表索引 */
},
};
注意上面的配置中,有一个 run_tbl_idx 有三个对应索引值,其分别对应了我们支持的三种运行模式:PM_RUN_MODE_HIGH、PM_RUN_MODE_NORMAL 和 PM_RUN_MODE_LOW。 应用程序通过 rt_pm_request(mode) 来设置当前模式,按上面的配置,如果我们要设置最高频率运行,可以通过如下代码实现:
rt_pm_request(PM_RUN_MODE_HIGH); // 请求最高频率模式
/* 在这个区间,CPU、DSP和SRAM都运行在最高频率,对应上面配置,具体如下:
* CPU: 297MHZ, 0.8V
* SRAM: 297MHZ, 0.8V
* DSP: 198MHZ, 0.8V
*/
rt_pm_release(PM_RUN_MODE_HIGH); // 释放最高频率模式
所以,如果我们碰到性能问题,并且运行模式已经设成 PM_RUN_MODE_HIGH,如果怀疑瓶颈在 CPU,要提高 CPU 频率,有两种修改方法:
/* 方法一:直接提高 PM_RUN_MODE_HIGH 所对应档位的频率电压 */
static const struct dvfs_table dvfs_core_table[] =
{
{
.freq = 297000000,
.volt = 800000,
},
{
.freq = 480000000,
.volt = 900000,
},
};
/* 方法二:增加新档位,并修改 PM_RUN_MODE_HIGH 对应的索引 */
static const struct dvfs_table dvfs_core_table[] =
{
{
.freq = 297000000,
.volt = 800000,
},
{
.freq = 396000000,
.volt = 900000,
},
{
.freq = 480000000,
.volt = 950000,
},
};
static struct pm_mode_dvfs pm_mode_data[] =
{
{
.clk_id = HCLK_M4, /* 表示这组配置属于CPU */
.run_tbl_idx = { 2, 1, 0 }, /* 三种运行模式所对应的频率电压表索引 */
.sleep_tbl_idx = 0, /* 休眠模式所对应的频率电压表索引 */
},
};
修改 DSP 和 SRAM 频率的方法也一样,这里就不细述了。同时,如果怀疑变频对性能有影响,也可以只留一组频率电压表,这时候相当于把变频关掉了,例如:
static const struct dvfs_table dvfs_core_table[] =
{
{
.freq = 480000000,
.volt = 900000,
},
};
DVFS 驱动在设置频率电压的时候,会考虑到芯片的内部限制,对频率做下取整,对电压做上取整,下面是一组配置值和实际值的例子:
/* 下面的限制只是一个虚构的例子,不同芯片的限制不同 */
static const struct dvfs_table dvfs_core_table[] =
{
{
.freq = 310000000, /* 当前芯片内部分频器无法分出310MHZ,实际频率被改成297MHZ */
.volt = 910000, /* 当前芯片内部调压器粒度是50MV,实际频率被改成0.95V */
},
};