一、引言:本次目标
本篇聚焦于:
- Regulator 子系统基础概念
- 设备树节点与驱动代码的对应关系
- regulator_desc 、regulator_ops 、regulator_dev 的完整讲解
- 驱动端的实际注册与管理流程
通过一个实际案例,系统掌握 regulator 子系统 的全貌。
二、Regulator 子系统概述
Linux 的 Regulator 子系统 是电源管理领域的重要基础设施。
核心目的:
- 抽象各类供电资源(BUCK、LDO、固定电源、开关)
- 统一标准化的 enable/disable/set_voltage 接口
- 集中管理电源状态(包括 suspend/resume 生命周期)
特点总结:
项目 | 描述 |
---|---|
子系统作用 | 统一管理硬件供电资源 |
管理对象 | 各种电压输出单元(BUCK/LDO/fixed/开关) |
上层使用 | 标准 API,无需关心硬件细节 |
配置来源 | 设备树、驱动 |
三、设备树配置实例分析
以 reg_pcie0 节点为例:
dts
reg_pcie0: regulator-pcie {
compatible = "regulator-fixed";
regulator-name = "MPCIE_3V3";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
gpio = <&gpio2 6 GPIO_ACTIVE_HIGH>;
enable-active-high;
regulator-always-on;
};
🔵 各字段对应关系:
设备树属性 | 意义 | 对应 regulator_desc 成员/使用位置 |
---|---|---|
compatible | 匹配 fixed.c 驱动 | 驱动匹配表 fixed_of_match |
regulator-name | 电源名字 | desc.name |
regulator-min-microvolt / max-microvolt | 输出电压范围 | desc.fixed_uV |
gpio | 控制开关的 GPIO 引脚 | regulator_config.ena_gpiod |
enable-active-high | 高电平打开 | gpiod_flags 设置 |
regulator-always-on | 始终保持开启 | regulator constraints |
四、核心结构体讲解
4.1 regulator_desc ------ 电源描述器(静态信息)
c
struct regulator_desc {
const char *name;
const struct regulator_ops *ops;
enum regulator_type type;
int n_voltages;
int fixed_uV;
const char *supply_name;
unsigned int enable_time;
unsigned int off_on_delay;
...
};
🔵 作用:
- 描述电源的所有静态信息
- 注册
regulator_dev
时使用 - 仅初始化一次,之后只读
🔵 与设备树映射表:
成员 | 来源(设备树属性) | 含义 |
---|---|---|
name | regulator-name | 电源名称 |
fixed_uV | regulator-min-microvolt / regulator-max-microvolt | 输出电压(如果是固定值) |
supply_name | vin-supply 或 input-supply | 输入电源名字(可选) |
enable_time | startup-delay-us | 开启所需时间(微秒) |
off_on_delay | off-on-delay-us | 关机后到再开机所需等待时间 |
注意:
ops
不直接来源设备树,而是根据驱动逻辑决定绑定哪个regulator_ops
结构体!
4.2 regulator_ops ------ 电源操作集(动态行为接口)
c
struct regulator_ops {
int (*enable)(struct regulator_dev *rdev);
int (*disable)(struct regulator_dev *rdev);
int (*is_enabled)(struct regulator_dev *rdev);
int (*set_voltage)(struct regulator_dev *rdev, int min_uV, int max_uV);
...
};
🔵 作用:
- 定义电源的实际操作方法
- 驱动根据硬件特点实现不同版本
🔵 fixed.c 示例:
ops 名称 | 适用场景 | 主要实现 |
---|---|---|
fixed_voltage_ops | 单纯固定电压,不可控 | 空实现 |
fixed_voltage_clkenabled_ops | 通过 clock 控制供电 | 调用 clk_prepare_enable/disable |
fixed_voltage_domain_ops | 通过 PM domain 控制供电 | 调用 dev_pm_genpd_set_performance_state |
4.3 regulator_dev ------ 电源实例(运行时状态管理)
c
struct regulator_dev {
struct device dev;
const struct regulator_desc *desc;
int use_count;
...
};
🔵 作用:
- 代表一个实际存在于系统的电源设备
- 内含状态(是否使能,用了几次)
- 提供对外统一接口
五、驱动注册流程梳理
以 fixed.c 为例,总结驱动注册完整路径:
- platform_driver 匹配
"regulator-fixed"
- 执行
reg_fixed_voltage_probe
- 调用
of_get_fixed_voltage_config
解析设备树 - 创建并初始化
regulator_desc
- 调用
devm_regulator_register
- 核心 subsystem 接管,生成
regulator_dev
- 驱动注册完成
最终,这个 regulator 可以被其他模块通过标准 API 控制。
六、完整调用链(开启电源示例)
假设某驱动调用:
c
regulator_enable(my_regulator);
系统内部执行链路:
regulator_enable()
↓
_find_regulator_dev()
↓
调用 rdev->desc->ops->enable()
↓
具体 enable 实现(如 gpiod_set_value 或 clk_prepare_enable)
核心理解: 标准接口 -> 驱动特定实现 -> 硬件动作。
七、整体总结大表
层次 | 内容 | 作用 |
---|---|---|
设备树 (.dts) | 描述供电需求、参数 | 提供设备静态配置 |
regulator_desc | 转换并记录供电参数 | 提供给核心子系统 |
regulator_ops | 提供实际控制方法 | 驱动定义 |
regulator_dev | 实际电源实例,记录状态 | 统一管理,供系统调用 |
八、结语
通过本篇学习,你应该已经掌握了:
- Regulator 子系统的整体概念与必要性
- regulator_desc / regulator_ops / regulator_dev 三者关系
- 设备树属性与驱动代码的详细映射
- 驱动注册、状态管理、标准 API 调用链的全过程
✅ 记住:
desc 定义属性,ops 决定行为,dev 负责实例管理。
这是掌握 Linux 电源子系统的关键基础!🚀