驱动开发硬核特训 │ 深度解析 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 电源子系统的关键基础!🚀


相关推荐
牧以南歌〆2 天前
在Ubuntu主机中修改ARM Linux开发板的根文件系统
linux·arm开发·驱动开发·ubuntu
Narnat2 天前
Rk3568驱动开发_中断_14
驱动开发
mmoyula2 天前
【RK3568 驱动开发:实现一个最基础的网络设备】
android·linux·驱动开发
站在巨人肩膀上的码农3 天前
全志T507 音频ALSA核心层注册流程分析
驱动开发·音视频·安卓·全志·alsa·声卡
车载操作系统---攻城狮3 天前
[驱动开发篇] Can通信快速入门手册 - 应用篇
驱动开发
Natsume17105 天前
嵌入式开发:GPIO、UART、SPI、I2C 驱动开发详解与实战案例
c语言·驱动开发·stm32·嵌入式硬件·mcu·架构·github
S,D6 天前
MCU引脚的漏电流、灌电流、拉电流区别是什么
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·硬件工程
Despacito0o6 天前
ESP32-s3摄像头驱动开发实战:从零搭建实时图像显示系统
人工智能·驱动开发·嵌入式硬件·音视频·嵌入式实时数据库
小米里的大麦15 天前
014 Linux 2.6内核进程调度队列(了解)
linux·运维·驱动开发
Svan.17 天前
Portable Watch:基于STM32的便携智能手表
arm开发·驱动开发·stm32·嵌入式硬件·硬件工程·pcb工艺·智能手表