当前位置: 首页 > news >正文

电源管理入门-10 OPP介绍

之前的文章设置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 */9000001275000792000122500052800011750003960001025000198000950000>;fsl,soc-operating-points=</* KHz uV */90000011750007920001175000528000117500039600011750001980001175000>;

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中信息找到对应的信息:

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

这里struct dev_pm_opp如下:

struct dev_pm_opp{struct list_headnode;bool available;unsigned long rate;unsigned long u_volt;struct device_opp *dev_opp;struct rcu_headhead;};

node:用于链表管理此设备下的opp。available:用于判断此opp使能可以使用。rate:频率,单位Hzu_volt:电压。dev_opp:struct device_opp类型指针,指向此opp所属的设备。

3. 触发使用

例如输入命令:

echo700000>/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;returndev_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,然后内核启动的时候走各种平台设备初始化就会去寻找加载,然后变成链表结构体。在使用的时候:用户通过设备节点或者中断产生或者内核进程触发就可以运行。

“啥都懂一点,啥都不精通,

干啥都能干,干啥啥不是,

专业入门劝退,堪称程序员杂家”。

欢迎各位自己有博客公众号的留言:申请转载,多谢!

后续会继续更新,纯干货分析,欢迎分享给朋友,欢迎点赞、收藏、在看、划线和评论交流以!

公众号:“那路谈OS与SoC嵌入式软件”,欢迎关注!

个人文章汇总:https://thatway1989.github.io

http://www.jsqmd.com/news/574145/

相关文章:

  • 万象视界灵坛保姆级教程:Bright-Pixel UI下上传图片+输入神谕标签全流程
  • SlimerJS API深度探索:phantom、webpage、system模块详解
  • OpenClaw+gemma-3-12b-it:跨平台文件同步自动化方案
  • Phi-4-mini-reasoning vLLM服务加固:限流熔断、输入清洗、输出长度约束配置
  • 6、项目初具雏形。重点是:我没有写一行代码,全是复制黏贴。AI太可怕了。果然前端要死。
  • 如何配置Paho.MQTT.Golang客户端选项:完整参数解析指南
  • 电源管理入门-11Regulator驱动
  • cv_resnet101_face-detection_cvpr22papermogface真实应用:社区门禁抓拍图自动人数统计
  • Qwen2.5-72B-GPTQ-Int4实战案例:中小企业低成本部署72B参数大模型
  • 双AI驱动:利用快马平台智能生成openclaw自适应抓取策略代码
  • vLLM-v0.17.1入门指南:vLLM Profiler性能分析工具使用方法
  • Graphormer保姆级教程:tail -f日志实时分析与常见报错解决方案
  • nli-distilroberta-base实际项目:新闻摘要与原文蕴含关系自动评估
  • Java函数计算性能瓶颈诊断手册(JVM层+平台层双视角深度拆解)
  • Wan2.2-I2V-A14B私有部署:支持Kubernetes集群部署的Helm Chart说明
  • Phi-4-mini-reasoning实操手册:输入格式规范、温度调优、截断处理技巧
  • OpenClaw+Kimi-VL-A3B-Thinking:学术论文图表自动解析与摘要生成
  • Janus-Pro-7B实操手册:批量处理百张教育习题图并导出结构化答案JSON
  • Graphic Walker快速开始:如何在React应用中轻松嵌入数据可视化组件
  • Java协议解析性能瓶颈:3个99%开发者忽略的字节序、编码、粘包问题及5步定位法
  • Phi-4-mini-reasoning Chainlit协作模式:多人同时访问与会话隔离实现
  • OpenClaw配置优化:Qwen3-14B长上下文任务的内存管理技巧
  • intv_ai_mk11低成本GPU方案:24GB显存实现Llama中型模型商用级性能
  • Qwen2.5-14B-Instruct开源大模型:Pixel Script Temple在无障碍剧本生成中的实践
  • intv_ai_mk11免配置环境:独立venv隔离依赖,避免系统Python版本冲突
  • Pixel Epic效果实测:不同逻辑发散概率下技术路线图描述准确率对比
  • PHP代码加密实战:SG14/SG15/SG16性能与安全深度对比
  • Phi-3-mini-4k-instruct-gguf入门指南:从模型原理到Web界面交互的全链路理解
  • MusePublic圣光艺苑惊艳生成:AI解构《创世纪》天顶画并重构为星空漩涡
  • Java Pod启动慢、健康检查超时?Istio initContainer与readinessProbe协同配置失效真相揭秘