RK2108 频率电压表

   本章简单介绍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 */

    },

};

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 12,728评论 28 53
  • 人工智能是什么?什么是人工智能?人工智能是未来发展的必然趋势吗?以后人工智能技术真的能达到电影里机器人的智能水平吗...
    ZLLZ阅读 9,392评论 0 5
  • 首先介绍下自己的背景: 我11年左右入市到现在,也差不多有4年时间,看过一些关于股票投资的书籍,对于巴菲特等股神的...
    瞎投资阅读 11,050评论 3 8
  • ![Flask](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAW...
    极客学院Wiki阅读 12,140评论 0 3