找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2107

积分

0

好友

303

主题
发表于 昨天 13:37 | 查看: 7| 回复: 0

Regulator子系统介绍

1.1 什么是Regulator?

Regulator(稳压器)在嵌入式系统中扮演着关键角色,用于为SoC内部或外部模块提供稳定的电压或电流。

1.2 什么是regulator子系统?其核心作用是什么?

regulator子系统是Linux内核为板级或SoC中多路可控电源设计的统一电源管理框架。它的核心作用在于:

  • 为每一路可控电源(如Buck、LDO、DCDC等)提供标准化的软件抽象。
  • 实现多路电源的注册、统一管理和资源分配。
  • 让所有用电模块(例如CPU、摄像头、WiFi模块)通过一套统一的API进行电源的获取、使能、调压和释放等操作。
  • 实现软硬件解耦,极大地提高了驱动代码的可移植性与系统可靠性。

Regulator子系统框架

从整体架构来看,Regulator子系统主要由以下四个部分组成:

Linux Regulator子系统架构图

2.1 Machine(平台/板级描述)

在Regulator子系统中,Machine层负责对板级电源的硬件连接关系进行静态描述。

它的主要作用是明确:系统中有哪些regulator,它们之间如何级联,以及每一路电源在物理和安全层面上的约束条件。

在内核中,这些配置信息大多由设备树(Device Tree, DTS)提供,最终会被转换为 regulator_init_data 及相关数据结构。

1)Regulator的级联关系
在实际硬件电路中,regulator往往会构成一条电源链路:

  • 前级regulator(supply regulator):其输出作为其他regulator的输入。
  • 后级regulator(consumer regulator):其输入依赖于其他regulator。

这些依赖关系在Machine层被明确后,Regulator Core就可以自动处理上下游的enable/disable顺序、管理引用计数,并防止误关闭仍在被使用的电源。

2)Regulator的物理与策略约束
通过 struct regulation_constraints 结构体,Machine层对regulator的使用行为施加限制,主要包括:

  • 输出电压或电流的最大值/最小值。
  • 是否允许进行调压、限流、使能(enable)、禁用(disable)等操作。
  • 输入电压约束(当输入来自其他regulator时)。
  • 是否不允许关闭(always_on)。
  • 是否在系统启动时即处于开启状态(boot_on)。

2.2 Regulator Driver

Regulator Driver指的是具体稳压器设备的驱动,它直接对接PMIC(电源管理集成电路)或稳压芯片,是整个子系统中唯一需要操作硬件寄存器的部分。

一个典型的regulator driver主要包含以下内容:

1)struct regulator_desc —— 静态描述
struct regulator_desc 用于描述一个regulator的静态属性,包括:

  • regulator的名称。
  • 其供给(supply)regulator的名称。
  • 相关的中断号。
  • 关键的操作函数集 struct regulator_ops
  • 使用regmap时对应的寄存器地址、位掩码(bitmask)等信息。

2)struct regulator_config —— 运行期配置
struct regulator_config 用于描述regulator在运行时的配置信息,其特点通常是作为局部变量,不会被长期保存。主要包含:

  • struct regulator_init_data 指针(承载来自Machine层的信息)。
  • 设备指针 struct device *
  • enable GPIO等与具体板级相关的配置。

3)Regulator注册流程
Regulator Driver通过以下接口向Regulator Core注册设备:

  • regulator_register()
  • devm_regulator_register()

注册时需要同时传入 struct regulator_desc *(静态描述)和 struct regulator_config *(运行配置)。Regulator Core会据此分配并初始化一个核心数据结构:struct regulator_dev

2.3 Regulator Consumer

Regulator Consumer是电源的使用方,通常是各类设备驱动,如CPU、GPU或外设驱动。

Consumer侧通过 struct regulator 这一抽象来表示一个regulator设备,并通过统一的接口进行操作。常见的接口包括:

  • regulator_get() / regulator_put()
  • regulator_enable() / regulator_disable()
  • regulator_set_voltage() / regulator_get_voltage()

Consumer完全无需关心底层硬件的具体实现,所有请求都会交由Regulator Core统一处理和转发,这种设计正是Linux内核框架解耦优势的体现。

2.4 Regulator Core

Regulator Core是整个子系统的核心枢纽,它负责:

  • 协调Machine、Driver和Consumer三者的交互逻辑。
  • 封装底层硬件的差异,提供统一的抽象层。
  • 管理regulator的生命周期、引用计数和级联依赖关系。

同时,Regulator Core还会通过sysfs向用户空间暴露regulator的状态和控制接口,方便进行调试和系统管理。

Regulator子系统核心流程

4.1 初始化流程

子系统的初始化主要发生在Linux系统启动阶段:

  1. Machine层解析DTS:解析设备树,生成与regulator相关的配置节点。
  2. Regulator Driver加载:驱动加载时,调用 regulator_register(),向Core注册自己的 regulator_desc
  3. Regulator Core创建rdev:Core接收注册,创建 regulator_dev (rdev),将其加入全局regulator列表,并建立对应的sysfs接口。
  4. Consumer获取regulator:设备驱动(Consumer)调用 regulator_get() 按名称申请regulator,Core完成名称匹配并返回 struct regulator 句柄。

4.2 调压流程(set_voltage)

当一个Consumer需要调整电压时,其核心流程如下:

  1. Consumer发起调用:例如,regulator_set_voltage(vdd, min, max);
  2. Regulator Core处理:校验请求的电压范围是否在约束之内,检查电源依赖关系,并对该regulator进行加锁。
  3. 调用Driver硬件操作:通过 ops->set_voltage() 回调函数,调用具体Driver的硬件设置函数。
  4. 更新状态并完成:待硬件操作生效后,Core更新内部状态信息,最后释放锁,流程结束。



上一篇:DbgNexum:利用Windows调试API与共享内存实现免写内存的Shellcode注入
下一篇:BrowserUse 集成 AgentRun Sandbox:AI智能体浏览器自动化生产环境最佳实践
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-11 18:04 , Processed in 0.247314 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表