当前位置:首页>Linux>从硬件到内核:Linux Regulator子系统揭秘

从硬件到内核:Linux Regulator子系统揭秘

  • 2026-10-21 13:29:25
从硬件到内核:Linux Regulator子系统揭秘

               Regulator子系统介绍            

               1.1 Regulator是什么?            

Regulator(稳压器)用于为SoC内部或外部模块提供稳定的电压或电流。

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

regulator子系统是Linux内核为板级/SoC多路可控电源设计的统一电源管理框架。它的主要作用是:

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

               Regulator子系统框架            

从整体架构来看,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指的是具体regulator设备的驱动,它直接对接PMIC或稳压芯片,是Regulator子系统中唯一接触硬件寄存器的部分。

一个典型的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是使用regulator的一方,通常是各类设备驱动(CPU、GPU、外设等)。

Consumer 侧通过 struct regulator 抽象 regulator 设备,并通过统一接口进行操作,常见接口包括:

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

Consumer完全不关心底层硬件实现,所有请求都会交由Regulator Core统一处理。

               2.4 Regulator Core            

Regulator Core是Regulator子系统的核心,负责:

  • • 实现 Machine / Driver / Consumer 三者的协作逻辑
  • • 封装底层硬件差异
  • • 管理 regulator 的生命周期、引用计数和依赖关系

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

               Regulator子系统核心流程            

               4.1 初始化流程            

初始化过程主要发生在系统启动阶段:

  1. 1. Machine层解析DTS生成regulator相关节点
  2. 2. Regulator Driver加载调用regulator_register()向Core注册regulator_desc
  3. 3. Regulator Core创建rdev建立全局regulator列表建立sysfs接口
  4. 4. Consumer获取regulator调用regulator_get()Core进行名称匹配
               4.2 调压流程(set_voltage)            

当Consumer需要调整电压时,流程如下:

  1. 1. Consumer调用:regulator_set_voltage(vdd, min, max);
  2. 2. Regulator Core:校验电压范围检查依赖关系锁定regulator
  3. 3. 调用Driver回调:ops->set_voltage();
  4. 4. 硬件生效后:更新内部状态释放锁

请在微信客户端打开

写至此处,也该画上句号了。常言道,程序员的世界由0和1构成,但我逐渐意识到——更多的时候,我们面对的是“咦?这怎么又出错了?”
感谢您的阅读,希望我的些许探索,能够助您避开一些陷阱,更接近事实的真相。
敬请关注「码上求真」,期待下次与您相逢。

最新文章

随机文章