驱动开发硬核特训 · Day 15:电源管理核心知识与实战解析
在嵌入式系统中,电源管理(Power Management)并不是“可选项”,而是实际部署中影响系统稳定性、功耗、安全性的重要一环。今天我们将以 Linux 电源管理框架 为基础,从理论结构、内核架构,再到典型驱动实战(如 regulator、suspend/resume、runtime PM)进行完整讲解。
一、为什么必须关注电源管理?
我们先从几个实际场景开始思考:
- 一个音频芯片如果一直上电,会导致电池过快耗尽;
- 需要在系统空闲时自动关闭 LCD 背光;
- 启动时必须先启用 PMIC(电源芯片)供电,再初始化 CPU 核心;
- Linux 设备需要支持 suspend to RAM、runtime suspend 等节能机制;
- 某些电源域必须和外设生命周期保持同步,提前上电、延后断电;
这些需求背后,其实都依赖于 Linux 的电源管理子系统。
二、Linux 电源管理框架概览
Linux 电源管理包含多个层次,我们可以从高到低划分为以下几类:
电源管理类别 | 对应机制 |
---|---|
系统电源管理(System PM) | suspend / hibernate |
运行时电源管理(Runtime PM) | 自动 suspend/resume |
设备电源管理(Device PM) | regulator、clk、gpio 控制等 |
SoC 电源域管理 | PM Domain(power domain)支持 |
它们之间是逐层调用、逐层配合的关系:
系统进入 suspend└── 内核调度设备进入 suspend└── 驱动实现 -> suspend() 回调└── 控制 regulator / clk / GPIO / power-domain
三、核心机制详解
3.1 设备电源控制:Regulator 框架
Regulator 是 Linux 电源管理最核心的子系统之一,用于控制 PMIC 提供的电压通道(如 BUCKx、LDOx)。
使用场景
- CPU 电源需要通过 regulator 提供稳定电压
- 驱动希望通过
devm_regulator_get()
获取指定供电通道 - 电压可以动态调节(通过 OPP 机制)以适配不同性能场景
示例代码
// 在 probe 中获取电源
struct regulator *vdd_supply;
vdd_supply = devm_regulator_get(&pdev->dev, "vdd");// 上电
regulator_enable(vdd_supply);// 下电
regulator_disable(vdd_supply);
3.2 runtime PM 与 autosuspend
Runtime PM 支持“设备空闲时自动挂起”,比如 USB 摄像头、I2C 外设等。
关键 API
pm_runtime_enable(&dev->dev);
开启 runtime 管理pm_runtime_get_sync()
保证设备上电pm_runtime_put_sync()
释放引用,设备可自动 suspend- 可配合
autosuspend_delay
实现自动挂起
3.3 System Suspend / Resume
当系统整体进入睡眠,内核将调用所有驱动的 suspend()
/ resume()
回调,驱动必须正确实现。
常见写法
static int xyz_suspend(struct device *dev)
{// 关闭设备电源,保存上下文return 0;
}static int xyz_resume(struct device *dev)
{// 恢复设备,重新上电return 0;
}static const struct dev_pm_ops xyz_pm_ops = {.suspend = xyz_suspend,.resume = xyz_resume,
};static struct platform_driver xyz_driver = {.driver = {.name = "xyz",.pm = &xyz_pm_ops,},
};
四、实战:从设备树到驱动的电源联动
4.1 设备树描述 regulator
buck2: regulator@2 {compatible = "regulator-fixed";regulator-name = "vdd_cpu";regulator-min-microvolt = <900000>;regulator-max-microvolt = <900000>;
};cpu0: cpu@0 {device_type = "cpu";compatible = "arm,cortex-a53";cpu-supply = <&buck2>;
};
cpu-supply
使用 phandle 引用了buck2
,内核通过of_parse_phandle()
获取 regulator 设备。
4.2 驱动中访问供电信息
struct regulator *vdd;
vdd = devm_regulator_get(&pdev->dev, "vdd"); // 由设备树 cpu-supply 解析
regulator_enable(vdd);
若没有设备树,也可手动绑定 regulator
regulator_set_voltage(vdd, 900000, 900000);
五、电源域(Power Domain)机制
复杂 SoC(如 i.MX8MP)中,多个模块共用电源域,必须通过 PM Domain 统一管理开关电源。
5.1 设备树定义电源域
gpu: gpu@... {...power-domains = <&gpu_power_domain>;
};
5.2 驱动中注册与使用
dev_pm_domain_attach(&pdev->dev, true);
Linux 会根据 power-domains
自动判断何时上电、何时断电。
六、调试与验证方法
6.1 查看 regulator 列表
cat /sys/kernel/debug/regulator/regulator_summary
6.2 查看 runtime PM 状态
cat /sys/devices/.../power/runtime_status
cat /sys/devices/.../power/autosuspend_delay_ms
6.3 测试 suspend/resume 流程
echo mem > /sys/power/state # 触发 suspend
内核会自动调用设备驱动中的 suspend 回调。
七、常见问题与解答
Q1:设备 suspend 时崩溃?
A:可能驱动未正确关闭电源资源,或调用了已经 suspend 的外围设备接口。
Q2:regulator 获取失败?
A:检查设备树是否定义了正确的 xxx-supply 属性,regulator 是否注册成功。
Q3:如何实现设备空闲自动下电?
A:使用 runtime PM + autosuspend,即:
pm_runtime_set_autosuspend_delay(dev, 1000);
pm_runtime_use_autosuspend(dev);
八、总结与启发
电源管理不仅是一个子系统,而是“系统级驱动整合能力”的体现。驱动编写者必须具备以下能力:
- 熟练掌握 regulator、runtime PM、系统 suspend 接口;
- 清楚设备树中的 regulator 和 phandle 如何影响驱动行为;
- 理解电源域和设备生命周期之间的联动;
- 能够定位 suspend/resume 中断电或资源冲突的异常。
📺 视频教程请关注 B 站:“嵌入式 Jerry”
内容同步更新,实战演示更清晰!
如需继续输出 Day 16 博文内容,也可以告诉我主题,我们继续高强度特训。
相关文章:
驱动开发硬核特训 · Day 15:电源管理核心知识与实战解析
在嵌入式系统中,电源管理(Power Management)并不是“可选项”,而是实际部署中影响系统稳定性、功耗、安全性的重要一环。今天我们将以 Linux 电源管理框架 为基础,从理论结构、内核架构,再到典型驱动实战&a…...
如何使用人工智能大模型,免费快速写工作计划?
如何使用人工智能大模型,免费快速写工作计划? 具体视频教程https://edu.csdn.net/learn/40406/666579...
延长(暂停)Windows更新
延长(暂停)Windows更新 因为不关闭更新有时候就会出现驱动或者软硬件不兼容,导致蓝屏出现。 注:为什么选择延长更新而不是用软件暂停更新,因为使用软件暂停更新会出现一下问题,比如微软商店打不开等等 键…...
QT实现串口透传的功能
在一些产品的开发的时候,需要将一个串口的数据发送给另外一个串口进行转发。 具体的代码如下: #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::Ma…...
分布类相关的可视化图像
目录 一、直方图(Histogram) 1.定义 2.特点 3.局限性 4.类型 5.应用场景 6.使用Python实现 二、密度图(Density Plot) 1.定义 2.特点 3.局限性 4.类型 5.应用场景 6.使用Python实现 三、箱线图(Box Plo…...
【android bluetooth 框架分析 02】【Module详解 12】【 BidiQueue、BidiQueueEnd、Queue介绍】
1. BidiQueue 和 BidiQueueEnd 蓝牙协议栈里面有很多 BidiQueue ,本节就专门来梳理这块内容。 2. BidiQueue 介绍 BidiQueue,是 Host 与 Controller 层通信的中枢之一, acl_queue_、sco_queue_、iso_queue_ 都是 BidiQueue 类型。让我们一起看一下这个…...
c++通讯录管理系统
通讯录是一个可以记录亲人,好友的信息工具。 功能包括: 1,添加联系人:向通讯录添加新人,包括(姓名,性别年龄,联系电话,家庭住址) 2,显示联系人…...
React 打包
路由懒加载 原本的加载方式 #使用lazy()函数声明的路由页面 使用Suspense组件进行加载 使用CDN优化...
day1 python训练营
变量与输出 print(1,2,3,sep\n,endsep用来区分两个变量,end会紧跟最后一个变量) print(1,2,3,sepaaa,endsep用来区分两个变量,3后面不会再输出aaa) 格式化字符串 变量名值 print(f"变量名{变量名}") 变量的基础运算 ,-*,/ 注意*不要忘写。比如2j就不…...
C语言状态字与库函数详解:概念辨析与应用实践
C语言状态字与库函数详解:概念辨析与应用实践 一、状态字与库函数的核心概念区分 在C语言系统编程中,"状态字"和"库函数"是两个经常被混淆但本质完全不同的概念,理解它们的区别是掌握系统编程的基础。 1. 状态字&…...
软件测试笔记(测试的概念、测试和开发模型介绍、BUG介绍)
软件测试笔记 认识测试 软件测试是啥? 说白了,就是检查软件的功能和效果是不是用户真正想要的东西。比如用户说“我要一个能自动算账的软件”,测试就是看这个软件到底能不能准确算账、有没有漏掉功能。 软件测试定义:软件测试就…...
Python多进程同步全解析:从竞争条件到锁、信号量的实战应用
1. 进程同步的必要性 在多进程编程中,当多个进程需要访问共享资源时,会出现竞争条件问题。例如火车票售卖系统中,如果多个售票窗口同时读取和修改剩余票数,可能导致数据不一致。 1.1 竞争条件示例 from multiprocessing import…...
Vue3 + TypeScript,关于item[key]的报错处理方法
处理方法1:// ts-ignore 注释忽略报错 处理方法2:item 设置为 any 类型...
Spring源码中关于抽象方法且是个空实现这样设计的思考
Spring源码抽象方法且空实现设计思想 在Spring源码中onRefresh()就是一个抽象方法且空实现,而refreshBeanFactory()方法就是一个抽象方法。 那么Spring源码中onRefresh方法定义了一个抽象方法且是个空实现,为什么这样设置,好处是什么。为…...
Pandas数据可视化
在当今这个数据驱动的时代,数据可视化已经成为数据分析不可或缺的一部分。通过图形化的方式展示数据,我们能够更直观地理解数据的分布、趋势和关系,从而做出更加精准的决策。Pandas,作为Python中最为流行的数据处理库,…...
string类(详解)
【本节目标】 1. 为什么要学习string类 2. 标准库中的string类 3. string类的模拟实现 4. 扩展阅读 1. 为什么学习string类? 1.1 C语言中的字符串 C 语言中,字符串是以 \0 结尾的一些字符的集合,为了操作方便, C 标准库中提供…...
零基础上手Python数据分析 (19):Matplotlib 高级图表定制 - 精雕细琢,让你的图表脱颖而出!
写在前面 —— 超越默认样式,掌握 Matplotlib 精细控制,打造专业级可视化图表 上一篇博客,我们学习了 Matplotlib 的基础绘图功能,掌握了如何绘制常见的折线图、柱状图、散点图和饼图,并进行了基本的图表元素定制,例如添加标题、标签、图例等。 这些基础技能已经能让我…...
【上位机——MFC】MFC入门
MFC库中相关类简介 CObject MFC类库中绝大部分类的父类,提供了MFC类库中一些基本的机制。 对运行时类信息的支持。对动态创建的支持。对序列化的支持。 CWinApp 应用程序类,封装了应用程序、线程等信息。 CDocument 文档类,管理数据 F…...
ASP.NET Core 最小 API:极简开发,高效构建(下)
在上篇文章 ASP.NET Core 最小 API:极简开发,高效构建(上) 中我们添加了 API 代码并且测试,本篇继续补充相关内容。 一、使用 MapGroup API 示例应用代码每次设置终结点时都会重复 todoitems URL 前缀。 API 通常具有…...
【leetcode100】一和零
1、题目描述 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。 示例 1: 输入:…...
代码随想录算法训练营第五十三天 | 105.有向图的完全可达性 106.岛屿的周长
105.有向图的完全可达性 题目链接:101. 孤岛的总面积 文章讲解:代码随想录 视频讲解:图论:岛屿问题再出新花样 | 深搜优先搜索 | 卡码网:101.孤岛总面积_哔哩哔哩_bilibili 思路: 1.确认递归函数&…...
在 Debian 10.x 安装和配置 Samba
1. 更新系统 sudo apt update sudo apt upgrade -y2. 安装 Samba sudo apt install samba -y3. 配置 Samba 备份默认配置文件 sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak编辑配置文件 sudo nano /etc/samba/smb.conf示例配置(共享目录) …...
Python中的短路运算
近期在学习python的过程中遇到此问题,遂总结记录 在”and“逻辑判定布尔类型时: 若判定对象均为True,则输出最后一个判别为True的对象 若判定对象的数据类型中有布尔类型,且最终结果为False,则输出布尔类型False 若判定对象的…...
Java8-遍历list取出两个字段重新组成list集合
在Java 8中,可以使用Stream API遍历List并提取两个字段重新组合成新的List。 以下是几种常见方法: 方法1:使用自定义类 定义一个包含目标字段的类:public class FieldHolder {private final String field1;private final int field2;public FieldHolder(String field1, i…...
【C++ 程序设计】实战:C++ 实践练习题(31~40)
目录 31. 数列:s 1 + 2 + 3 + … + n 32. 数列:s 1 - 2 - 3 - … - n 33. 数列:s 1 + 2 - 3 + … - n 34. 数列:s 1 - 2 + 3 - … &#…...
【笔记】SpringBoot实现图片上传和获取图片接口
上传图片接口 接口接收图片文件和布尔类型的是否生成缩略图参数。 生成保存图片文件的文件夹,文件夹的命名为上传图片的日期“根目录\file\cover\202504”,如果文件夹已存在则不生成。接下来拼接文件名,生成30位的随机数拼接到原文件名防止文件名相同的…...
Linux 下依赖库的问题
假设你在 某用户 user_name 下安装了一个 rquests库。 然后你在命令行使用 python3 -c (...)验证。发现没有任何问题。 然后你使用python3 xxx.py 发现执行验证也没有问题。 这个时候你信心慢慢的写了一个C的代码在代码中system调用这个.py文件。 然…...
STM32 HAL 水位传感器驱动程序
工作原理是输出模拟量电压值,只需要使用stm32adc读取电压再转换一下即可 本代码中,水位传感器连接在PA0,可通过宏定义快速设置电压区间和水位之间的关系 water_level.c /***************************************************************…...
DeepSeek R1 7b,Langchain 实现 RAG 知识库 | LLMs
DeepSeek R1 7b,Langchain 实现 RAG 知识库 | LLMs DeepSeek R1 7b,Langchain 实现 RAG 知识库DeepSeek R1Chat via ConsoleChat via Browser LangchainFAQs GitHub https://github.com/hailiang-wang/ollama-get-started DeepSeek R1 7b,La…...
【C语言】char unsigned char signed char
在C语言中,char 和 unsigned char 虽然都是1字节(通常8位)的数据类型,但它们在符号处理、数值范围和用途上有显著区别。以下是详细对比: 1. 核心区别 特性charunsigned char符号性可能是signed或unsigned(由编译器决定)明确无符号(仅非负数)数值范围通常 -128 到 1270…...
硬件电路(24)-NE555振荡电路
一、概述 NE555 是一款能产生高精度定时脉冲的双极性集成电路。内部包括阈值比较器、触发比较器、RS触发 器、输出电路等四部分电路构成。它可通过外接少量的阻容器件,组成定时触发电路、脉宽调制电路、音 频振荡器等等电路。广泛应用于玩具、信号交通、自动化控制等…...
Transformer系列(二):自注意力机制框架
自注意力机制框架 一、K-Q-V的自注意力机制二、位置表征1. 通过学习嵌入来进行位置表征2. 通过直接改变 α \alpha α来进行位置表征 三、逐元素非线性变换四、未来掩码(future mask)五、总结 上篇博客:NLP中放弃使用循环神经网络架构讲解了循环神经网络…...
安全技术和防火墙
传输层4.7层防火墙 传输层(4)四层防火墙:ip地址 mac地址 协议 端口号来控制数据流量 应用层防火(7)墙/代理服务器: ip地址 mac地址 协议 端口号来控制数据流量 真实传输的数据(把前面的ip地址…...
深度可分离卷积与普通卷积的区别及原理
1. 普通卷积 普通卷积使用一个滤波器在输入特征图的所有通道上滑动,同时对所有通道进行加权求和,生成一个输出通道。如果有多个滤波器,则生成多个输出通道。假设上一层的特征图有 n 个通道,每个通道是一个二维的图像(…...
STM32时钟树
1、认识时钟树 H:high 高 L:low 低 S:speed 速度 I:internal 内部 E:external 外部 HSE就是高速外部时钟源 HSI就是告诉内部时钟源 外部时钟一般需要接一个时钟源,也就是晶振,这个需要外接&…...
致迈协创C1pro考勤系统简介
1.应用背景 该套件的“数据映射引擎”技术,完成了OA系统与考勤机硬件设备的无缝联接。V5具有良好交互特性和B/S的程序架构,使得客户管理层和HR相关管理人员通过V5能实时查询统计人员的考勤情况,从而及时有效的完成人员考勤的监控与管理&#…...
pivot_root:原理、用途及最简单 Demo
什么是 pivot_root pivot_root 是 Linux 系统中的一个系统调用(和对应的命令行工具),用于更改进程的根文件系统。与 chroot 类似,pivot_root 将一个指定目录设置为进程的新根目录(/),但它比 ch…...
【小沐杂货铺】基于Three.JS绘制卫星轨迹Satellite(GIS 、WebGL、vue、react,提供全部源代码)
🍺三维数字地球系列相关文章如下🍺:1【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第一期2【小沐学GIS】基于C绘制三维数字地球Earth(OpenGL、glfw、glut)第二期3【小沐学GIS】…...
MySQL -数据类型
博客主页:【夜泉_ly】 本文专栏:【暂无】 欢迎点赞👍收藏⭐关注❤️ 目录 前言数值类型intbitfloat 字符串charvarcharenum set 日期和时间类型 前言 在之前的操作篇, 我们用到的大多是DDL(数据定义语言)。 在建表时,…...
数据通信学习笔记之OSPF的邻居角色
邻居与邻接 OSPF 使用 Hello 报文发现和建立邻居关系 在以太网链路上,缺省时,OSPF 采用组播的形式发送 Hello 报文 (目的地址 224.0.0.5) OSPF Hello 报文中包含了路由器的 RouterID、邻居列表等信息。 邻居状态: 邻居:2-way 邻…...
2025第十六届蓝桥杯python B组满分题解(详细)
目录 前言 A: 攻击次数 解题思路: 代码: B: 最长字符串 解题思路: 代码: C: LQ图形 解题思路: 代码: D: 最多次数 解题思路: 代码: E: A * B Problem 解题思路&…...
计算机组成原理笔记(十七)——4.2定点加减运算
定点数的加减运算包括原码、补码和反码3种带符号数的加减运算,其中补码加减运算实现起来最方便。 4.2.1原码加减运算 原码加减运算详解 原码是计算机中表示数值的基本方式之一,其特点为最高位为符号位(0表正,1表负)…...
javase 学习
一、Java 三大版本 javaSE 标准版 (桌面程序; 控制台开发) javaME 嵌入式开发(手机、小家电)基本不用,已经淘汰了 javaEE E业级发开(web端、 服务器开发) 二、Jdk ,jre jvm 三…...
成品检验工程师心得总结
岗位:成品检验助理工程师 成品检验工程师——————>OQC工程师 何为成品? 简单来说,就是已经完成了产品的开发,测试,满足客户所有需求开发的产品。 成品检验工程师对应的是哪一个角色? 客户&…...
操作系统:进程是一个非常重要的抽象概念
在操作系统中,进程是一个非常重要的抽象概念,它是程序在计算机上的执行实例,是系统进行资源分配和调度的基本单位。 一、进程的定义 从动态角度来说,进程是程序的一次执行过程。例如,当你在计算机上打开一个文本编辑…...
QML 字符串格式化
在 QML 中,处理字符串格式化有多种方法,以下是常用的字符串格式化函数和技巧: 1. 基本字符串连接 qml var str "Hello, " "QML!"; // 简单连接 var name "Alice"; var greeting Hello, ${name}; // 模…...
堆排序的C++相关实现
大根堆的实现 #include <iostream> #include <vector> using namespace std;// 调整堆,确保以i根节点的子树满足大根堆 void heapify(vector<int>& vec, int n , int i) {int largest i;int left 2 * i 1;int right 2 * i 2;if (left &…...
c++类与对象(一)
前言: 什么是面向对象编程?什么是类与对象?为啥要搞类与对象啊?凭什么c能支持面向对象编程啊? 每次学东西前问自己几个问题会挺爽的,因为你越是懵逼,你就越想知道答案是什么。希望我的这几篇文章…...
(二)mac中Grafana监控Linux上的MySQL(Mysqld_exporter)
框架:GrafanaPrometheusMysqld_exporter 一、监控查看端安装 Grafana安装-CSDN博客 普罗米修斯Prometheus监控安装(mac)-CSDN博客 1.启动Grafana服务 brew services start grafana 打开浏览器输入http://localhost:3000进入grafana登录…...
认知升级:把握人工智能教育化转型的历史机遇
认知升级:把握人工智能教育化转型的历史机遇 ----灌南县第四中学 孟祥帅 2025年4月17日至19日,我有幸参加了教育部主办的“全国人工智能校长局长专题培训班”。此次大会以“人工智能赋能教育现代化”为主题,汇聚了全国各地的教育局局长、校…...