Regulator(稳压器)用于为SoC内部或外部模块提供稳定的电压或电流。
1.2 什么是regulator子系统?核心作用? regulator子系统是Linux内核为板级/SoC多路可控电源设计的统一电源管理框架。它的主要作用是:
- • 为每一路可控电源(Buck、LDO、DCDC等)提供标准化的软件抽象
- • 让所有用电模块(如CPU、摄像头、WiFi)通过统一 API 进行获取、使能、调压、释放等操作
从整体架构来看,Regulator子系统主要由以下四个部分组成:
在Regulator子系统中,Machine层负责对板级电源硬件连接关系进行静态描述。
主要作用是表明:系统中有哪些regulator,它们之间如何级联,以及每一路电源在物理和安全层面的约束条件。
在内核中,这些配置大多由Device Tree(DTS)提供,本质上仍然会被转换为regulator_init_data及其相关结构。
在实际硬件中,regulator往往构成电源链路:
- • 前级regulator(supply regulator):其输出作为其他regulator的输入
- • 后级regulator(consumer regulator):其输入依赖其他regulator
这些关系在 Machine 层明确后,Regulator Core可以自动完成:
通过struct regulation_constraints,Machine层对regulator的使用行为进行限制,主要包括:
- • 是否允许调压、限流、enable、disable 等操作
- • 输入电压约束(当输入来自其他 regulator 时)
- • 是否在系统启动时即处于开启状态(boot_on)
Regulator Driver指的是具体regulator设备的驱动,它直接对接PMIC或稳压芯片,是Regulator子系统中唯一接触硬件寄存器的部分。
一个典型的regulator driver主要包含以下内容:
1)struct regulator_desc——静态描述
struct regulator_desc 用于描述 regulator的静态属性,包括:
- • 操作函数集
struct regulator_ops - • 使用regmap时对应的寄存器、bitmask等信息
2)struct regulator_config ——运行期配置
struct regulator_config用于描述regulator的运行期配置,其特点是:
- •
struct regulator_init_data 指针(Machine 层信息)
Regulator Driver通过以下接口向Regulator Core注册:
- •
devm_regulator_register()
- •
struct regulator_desc * - •
struct regulator_config *
Regulator Core 会据此分配并初始化一个:
Regulator Consumer是使用regulator的一方,通常是各类设备驱动(CPU、GPU、外设等)。
Consumer 侧通过 struct regulator 抽象 regulator 设备,并通过统一接口进行操作,常见接口包括:
- •
regulator_get() / regulator_put() - •
regulator_enable() / regulator_disable() - •
regulator_set_voltage() / regulator_get_voltage()
Consumer完全不关心底层硬件实现,所有请求都会交由Regulator Core统一处理。
Regulator Core是Regulator子系统的核心,负责:
- • 实现 Machine / Driver / Consumer 三者的协作逻辑
- • 管理 regulator 的生命周期、引用计数和依赖关系
同时,Regulator Core还会通过sysfs向用户空间暴露regulator状态和控制接口,便于调试和管理。
- 1. Machine层解析DTS生成regulator相关节点
- 2. Regulator Driver加载调用
regulator_register()向Core注册regulator_desc - 3. Regulator Core创建rdev建立全局regulator列表建立sysfs接口
- 4. Consumer获取regulator调用
regulator_get()Core进行名称匹配
- 1. Consumer调用:
regulator_set_voltage(vdd, min, max); - 2. Regulator Core:校验电压范围检查依赖关系锁定regulator
- 3. 调用Driver回调:
ops->set_voltage();