驱动开发硬核特训 │ 深度解析 fixed regulator 驱动与 regulator_ops


一、引言:本次目标

本篇聚焦于:

  • Regulator 子系统基础概念
  • 设备树节点与驱动代码的对应关系
  • regulator_descregulator_opsregulator_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 为例,总结驱动注册完整路径:

  1. platform_driver 匹配 "regulator-fixed"
  2. 执行 reg_fixed_voltage_probe
  3. 调用 of_get_fixed_voltage_config 解析设备树
  4. 创建并初始化 regulator_desc
  5. 调用 devm_regulator_register
  6. 核心 subsystem 接管,生成 regulator_dev
  7. 驱动注册完成

最终,这个 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 电源子系统的关键基础!🚀


相关推荐
VernonJsn9 小时前
visual studio 2022的windows驱动开发
ide·驱动开发·visual studio
嵌入式郑工16 小时前
RK3566 LubanCat 开发板 USB Gadget 配置完整复盘
linux·驱动开发·ubuntu
雾削木2 天前
树莓派 ESPHome 固件编译与烧录全攻略(解决超时与串口识别问题)
驱动开发
春日见3 天前
win11 分屏设置
java·开发语言·驱动开发·docker·单例模式·计算机外设
DarkAthena3 天前
【GaussDB】手动编译不同python版本的psycopg2驱动以适配airflow
驱动开发·python·gaussdb
松涛和鸣3 天前
DAY66 SPI Driver for ADXL345 Accelerometer
linux·网络·arm开发·数据库·驱动开发
嵌入式郑工4 天前
# RK3576 平台 RTC 时钟调试全过程
linux·驱动开发·ubuntu
GS8FG4 天前
针对Linux,RK3568平台下,I2C驱动的一点小小的领悟
linux·驱动开发
一路往蓝-Anbo4 天前
第 4 篇:策略模式 (Strategy) —— 算法的热插拔艺术
网络·驱动开发·stm32·嵌入式硬件·算法·系统架构·策略模式
A-花开堪折4 天前
RK3568 Android 11 驱动开发(五):串口驱动适配
驱动开发