0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

电源管理入门-什么是OPP?怎么用?

yzcdx 来源:OS与AUTOSAR研究 2023-11-16 16:49 次阅读

之前的文章设置clock的时候多次提到了(Operating Performance Point)OPP,例如DEVFreq、CPUFreq等,在现代SoC上存在有Power Domain,也可以以Power Domain为单位进行OPP的电压频率定义。

1. 什么是OPP,怎么用?

在SoC内,某些domain可以运行在较低的频率和电压下,而其他domain可以运行在较高的频率和电压下,某个domain所支持的<频率,电压>对的集合被称为Operating Performance Point,缩写OPP。

在DTS中配置后自动有OPP框架驱动加载使用,例如CPU的OPP,从设备树文件arch/arm/boot/dts/imx6ull.dtsi中找到

cpu0: cpu@0 {
        compatible = "arm,cortex-a7";
        device_type = "cpu";
        reg = <0>;
        clock-latency = <61036>; /* two CLK32 periods */
        operating-points = <
                /* kHz        uV */
                900000        1275000
                792000        1225000
                528000        1175000
                396000        1025000
                198000        950000
        >;
        fsl,soc-operating-points = <
                /* KHz        uV */
                900000        1175000
                792000        1175000
                528000        1175000
                396000        1175000
                198000        1175000
        >;

2. 系统初始化加载OPP信息

DT_MACHINE_START

--》imx6ul_init_late

--》imx6ul_opp_init

--》_of_add_opp_table_v1(dev);

--》_opp_add_v1

--》_opp_add

_of_add_opp_table_v1中会根据DTS中信息找到对应的信息:

950b5a58-8456-11ee-939d-92fbcf53809c.png

_opp_add_v1中会把DTS中信息提取出来,存入struct dev_pm_opp *new_opp;

952e31c2-8456-11ee-939d-92fbcf53809c.png

这里struct dev_pm_opp如下:

struct dev_pm_opp {
struct list_head node;

bool available;
unsigned long rate;
unsigned long u_volt;

struct device_opp *dev_opp;
struct rcu_head head;
};

node:用于链表管理此设备下的opp。

available:用于判断此opp使能可以使用。

rate:频率,单位Hz

u_volt:电压。

dev_opp:struct device_opp类型指针,指向此opp所属的设备。

3. 触发使用

例如输入命令:

echo 700000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed

__cpufreq_driver_target->__target_index->cpufreq_driver->target_index

static int set_target(struct cpufreq_policy *policy, unsigned int index)
{
        struct private_data *priv = policy->driver_data;

        return dev_pm_opp_set_rate(priv->cpu_dev,
            policy->freq_table[index].frequency * 1000);
}

dev_pm_opp_set_rate()函数在drivers/base/power/opp/core.c中定义

        opp_table = _find_opp_table(dev);
        
        clk = opp_table->clk;
        freq = clk_round_rate(clk, target_freq);
        if ((long)freq <= 0)
                freq = target_freq;

        old_freq = clk_get_rate(clk);
        
  ret = _generic_set_opp_clk_only(dev, clk, old_freq, freq);

clk_set_rate进行频率设置。

4. API介绍

dev_pm_opp_add :( WARNING: Do not use this function in interrupt context.)

向指定的设备添加一个频率/电压(opp table)组合,频率和电压的单位分别是Hz和uV。

dev_pm_opp_remove:

remove an opp from opp table.

dev_pm_opp_get:

increment the reference count of opp.

dev_pm_opp_enable:

用于使能指定的OPP,调用dev_pm_opp_add添加进去的OPP,默认是enable的。

dev_pm_opp_disable:

虽然设备支持某些OPP,但driver有可能觉得比较危险,不想使用,则可以调用dev_pm_opp_disable接口,禁止该OPP。

dev_pm_opp_get_voltage:

获得电压。

dev_pm_opp_get_freq:

获得频率。

dev_pm_opp_set_regulators:

进行voltage scaling

dev_pm_opp_put_regulators:

free the resources acquired by the OPP core

dev_pm_opp_set_rate:

This routine configures the device for the OPP with the lowest frequency greater than or equal to the target frequency.

dev_pm_opp_get_opp_count:

获取opp table opps numbers

dev_pm_opp_of_add_table :

解析并初始化一个设备的opp table。

OPP的查询接口包括:

dev_pm_opp_find_freq_floor,查询小于或者等于指定freq的OPP,在返回OPP的同时,从freq指针中返回实际的freq值;

dev_pm_opp_find_freq_ceil,查询大于或者等于指定freq的OPP,在返回OPP的同时,从freq指针中返回实际的freq值;

dev_pm_opp_find_freq_exact,精确查找指定freq的OPP,同时通过available变量,可以控制是否查找处于disable状态的OPP。上面两个查找接口,是不查找处于disable状态的OPP的。

后记:

Linux驱动的套路其实就是DTS里面有个compatible,然后内核启动的时候走各种平台设备初始化就会去寻找加载,然后变成链表结构体。在使用的时候:用户通过设备节点或者中断产生或者内核进程触发就可以运行。







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 电源管理
    +关注

    关注

    112

    文章

    6015

    浏览量

    141107
  • DTS
    DTS
    +关注

    关注

    1

    文章

    48

    浏览量

    16005
  • 触发器
    +关注

    关注

    14

    文章

    1681

    浏览量

    60406

原文标题:电源管理入门-10 OPP介绍

文章出处:【微信号:OS与AUTOSAR研究,微信公众号:OS与AUTOSAR研究】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    电源管理入门-关机重启基础知识详解

    当我们接触电源管理的时候,最简单的流程就是关机重启,但是仔细分析其涉及的所有源代码就会发现,关机重启虽然简单
    发表于 09-19 11:41 1491次阅读
    <b class='flag-5'>电源</b><b class='flag-5'>管理入门</b>-关机重启基础知识详解

    电源管理入门-Regulator驱动是什么?Regulator的作用是什么?

    Regulator是Linux系统中电源管理的基础设施之一,用于稳压电源管理,是各种驱动子系统中设置 电压的标准接口。
    的头像 发表于 11-16 16:51 3241次阅读
    <b class='flag-5'>电源</b><b class='flag-5'>管理入门</b>-Regulator驱动是什么?Regulator的作用是什么?

    电源管理入门:Thermal热管理

    管理指的是在电子设备或系统中通过各种方式控制其温度来保证其正常工作或延长寿命的过程。其中包括散热设计、温度监测、温度控制等方面。热管理的重要性越来越凸显,尤其在高性能计算、人工智能等领域的应用中更为重要。
    的头像 发表于 11-29 10:09 1260次阅读
    <b class='flag-5'>电源</b><b class='flag-5'>管理入门</b>:Thermal热<b class='flag-5'>管理</b>

    电源管理入门:驱动Runtime PM管理

    Runtime PM管理也就是设备驱动里面的电源管理,即设备驱动结构体里面的struct dev_pm_ops,只控制设备自己的电源。这样可以在设备不需要工作的时候可以进入到低功耗状态
    的头像 发表于 11-29 10:13 762次阅读
    <b class='flag-5'>电源</b><b class='flag-5'>管理入门</b>:驱动Runtime PM<b class='flag-5'>管理</b>

    电源管理入门:Power supply子系统

    对于便携设备来说,电源管理更加的重要,因为电池电量有限,容易电量焦虑。除了省电管理外,还需要对电池进行监控管理和充放电管理,这样保护好电池和
    的头像 发表于 11-29 10:15 1570次阅读
    <b class='flag-5'>电源</b><b class='flag-5'>管理入门</b>:Power supply子系统

    电源管理入门:Power Domain管理

    SoC中通常有很多IP,按逻辑可以把几个相关功能的IP划为一个电源域。一个电源域内的IP,通常按相同的方式由同一个硬件模块PMIC供电,电压一样并且电源管理例如休眠唤醒一致。
    的头像 发表于 11-29 10:16 1292次阅读
    <b class='flag-5'>电源</b><b class='flag-5'>管理入门</b>:Power Domain<b class='flag-5'>管理</b>

    电源管理入门-芯片设计中的电源管理介绍

    SCP直接控制SoC的电源和时钟,而AP通过硬件和软件接口协同管理
    的头像 发表于 12-06 09:16 879次阅读
    <b class='flag-5'>电源</b><b class='flag-5'>管理入门</b>-芯片设计中的<b class='flag-5'>电源</b><b class='flag-5'>管理</b>介绍

    电源管理入门:Hypervisor中的电源管理

    很多时候听说Hypervisor,但是对底层软件技术不了解的人感觉挺神秘。本篇文章简单介绍下Hypervisor的基本概念,另外介绍下电源管理在Hypervisor之上多OS间怎么应用。
    的头像 发表于 12-06 09:27 759次阅读
    <b class='flag-5'>电源</b><b class='flag-5'>管理入门</b>:Hypervisor中的<b class='flag-5'>电源</b><b class='flag-5'>管理</b>

    基于labview的opp蓝牙发送

    OPP蓝牙的OBEX对象推送模式(OPP),显示“推” 到蓝牙设备(如手机)的文件的部分实现labview2009以上版本打开:
    发表于 12-13 16:38

    AM335x中的OPP是什么意思?

    经常看到OPP50 OPP100.没找到具体的英文全称
    发表于 06-21 16:04

    防火墙原理入门

    防火墙原理入门 防火墙能增强机构内部网络的安全性。防火墙系统决定了哪些内部服务可以被外界访问;外界的哪些人可以访问内部的服务以及哪
    发表于 08-01 10:21 944次阅读
    防火墙原<b class='flag-5'>理入门</b>

    数字信号处理入门指南

    数字信号处理入门指南什么是DSP? 数字信号处理器(DSP)采集已被数字化的现实世界的声音、音频、视频、温度、压力或位置等信号,并从数学的角度对其进
    发表于 09-15 08:55 1270次阅读
    数字信号处<b class='flag-5'>理入门</b>指南

    单片机原理及应用ppt入门课程

    微机原理入门课程ppt,比较简单,适合新手。。
    发表于 01-12 17:52 0次下载

    《收音机修理入门》【王光迅编著%2C黑龙江科学技术出版社】pdf

    收音机修理入门
    发表于 01-29 10:38 0次下载

    电源管理入门-7 DevFreq

    复杂SoC由多个子模块协同工作组成,在运行中并非SoC中的所有模块都需要始终保持最高性能。为方便起见,将SoC中的子模块分组为域,从而允许某些域以较低的电压和频率运行
    的头像 发表于 10-16 17:06 709次阅读
    <b class='flag-5'>电源</b><b class='flag-5'>管理入门</b>-7 DevFreq