Linux 内核学习(2) --- regulator 框架

本文详细介绍了Linux中的Regulator框架,包括Regulator的定义、provider注册过程、structregulator_desc和structregulator_config结构,以及DTS配置和解析。还探讨了OnBoardConfig配置和regulator_consumer的使用,展示了如何通过API进行操作和管理电源管理集成芯片(PMIC)的电压和电流调节器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Regulator 介绍

Regulator 指的是稳定器(调压器),有电压稳定器及电流稳定器两种,能够自动维持恒定电流或者电压,
其中,电压稳定器 voltage regulator 在电路中比较常见。
从设备驱动的角度来看,regulator 的控制比较简单,主要有 enable/disable/ 输出电压或电流大小的控制。
Linux利用 regulator framework 对 regulator 进行管理和控制。

regulator_framework
由调节器供电的设备被称为消费者(regualtor consumer)。它们消耗调节器提供的电力。大多数调节器可以启用和禁用他们的输出,一些也可以控制他们的输出电压或电流。

Linux regulator 也遵循 provider,framwork,consumer 体系,regulator provider 向系统注册称为 regulator device,并提供它们硬件参数和对应的操作接口函数集合,regulator framework 负责管理系统中的 regulator 设置并提供统一的 consumer 接口,regulator consumer 使用统一的 regulator_get() 等函数获取 compatible 对应的 regulator,并用 regulator_enable() regulator_disbale() 和可选的 regulator_set_voltage 操作 regulator

Linux regulator framework 的主要目的:提供标准的内核接口,控制系统的 voltage/current regulators ,并提供相应的开关、电压/电流设置的机制。

在系统运行的过程中,根据具体的需要动态改变 regulators 的输出,从而达到省电的目的。在系统中如果配错 Regulator 是比较危险的,可能会造成硬件器件的损坏。因此,需要在 regulator framework 中对电流或者电压的大小做强制限定,并且不能被 Regulator 的 consumer 或者 provider 更改。

硬件上提供这些物理调节电压和电流的芯片称为 电源管理集成芯片(PMIC)
PMIC
Linux Regualtor framework 被设计用于开关和控制电压和电流调节器,主要主要分为下面的流程:

  1. Regulator provider 的 register
  2. Regulator consumer 的获取和操作
  3. device tree 的配置和解析的接口
  4. user interface sysfs interface

Regulator provider 注册

Regulator 向内核注册的核心函数如下,注册的参数中包含 struct regulator_descstruct regulator_config 两个主要的结构
相对应的,也存在 regulator_unregister 函数,当模块卸载的时候使用该函数

// include/linux/regulator/driver.h
// drivers/regulator/core.c
struct regulator_dev * regulator_register(const struct regulator_desc *regulator_desc,
		   const struct regulator_config *cfg)
void regulator_unregister(struct regulator_dev *rdev)

现在主要分析注册到 regulator_register 要用到的两个主要结构

struct regulator_desc

struct regulator_desc 的定义如下所示:

struct regulator_desc {
   
	// regulator name
	const char *name;
	const char *supply_name;

	// 保存了用于识别 devicetree 中的 regulator name 
	const char *of_match;
	const char *regulators_node;
	int (*of_parse_cb)(struct device_node *,
			    const struct regulator_desc *,
			    struct regulator_config *);

	int id;
	unsigned int continuous_voltage_range:1;
	
	// 表示该调节器可用的选择器数量。它表示调节器能输出的值的数量。输出电压固定时,n_voltage 应设为 1。
	unsigned n_voltages;
	
	// regulator 的操作函数
	const struct regulator_ops *ops;
	// regulator interrupt name
	int irq;
	// 指示调节器是电压调节器还是电流调节器。它可以是 REGULATOR_VOLTAGE 或 REGULATOR_CURRENT
	enum regulator_type type;
	struct module *owner;

    // 表示该稳压器能提供的最小电压值。它是由最低的选择器给出的电压。
	unsigned int min_uV;
	// 表示每个选择器增加的电压。
	unsigned int uV_step;
	unsigned int linear_min_sel;
	int fixed_uV;
	unsigned int ramp_delay;
	int min_dropout_uV;
    .....
}

主要参数的含义如下:

name 含义
name regulator name
id regulator 的数字标志符
owner 代表提供调节器的模块。将该字段设置为 THIS_MODULE
type 指示调节器是电压调节器还是电流调节器,它可以是 REGULATOR_VOLTAGE 或 REGULATOR_CURRENT
n_voltage 表示该调节器可用的选择器数量。它表示调节器能输出的值的数量。输出电压固定时,n_voltage 应设为 1
min_uV 表示该稳压器能提供的最小电压值。它是由最低的选择器给出的电压
uV_step 表示每个选择器增加的电压
ops ops表示调节器操作表。它是一个指向调节器可以支持的一组操作回调的结构
min_uV regualtor 的中断号
struct regualtor_config
struct regulator_config {
   
   struct device *dev;
   const struct regulator_init_data *init_data;
   void *driver_data;
   struct device_node *of_node;
   struct regmap *regmap;

   bool ena_gpio_initialized;
   int ena_gpio;
   unsigned int ena_gpio_invert:1;
   unsigned int ena_gpio_flags;
};

struct regulator_init_data {
   
   const char *supply_regulator;        /* or NULL for system supply */

   // regulator 的限制或者硬件特性,
   struct regulation_constraints constraints;

   int num_consumer_supplies;
   struct regulator_consumer_supply *consumer_supplies;

   /* optional regulator machine specific init */
   int (
### Linux 内核中的 Regulator 子系统 Regulator 子系统是 Linux 内核中用于管理电源调节器的一个模块化框架。它的设计目标是为了简化驱动程序开发者的工作,同时提供一种统一的方式来控制硬件上的电压和电流调节器。 #### 1. Regulator 子系统的架构概述 Regulator 子系统的核心概念包括以下几个部分: - **Consumer API**: 提供给设备驱动使用的接口,允许它们请求特定的电压或电流设置。 - **Core Framework**: 实现了 regulator 的核心逻辑,负责协调 consumer 和 regulator 驱动之间的交互。 - **Driver Implementations**: 各种具体的 regulator 驱动实现了底层硬件的操作细节[^1]。 这些组件共同协作,使得设备可以动态调整其供电需求,从而优化功耗并提高效率。 #### 2. Consumer API 使用方法 为了使某个设备能够利用 regulator 功能,通常需要遵循以下模式: ```c #include <linux/regulator/consumer.h> struct regulator *reg; // 获取指定名称的 regulator reg = devm_regulator_get(dev, "vdd-core"); if (IS_ERR(reg)) { pr_err("Failed to get regulator\n"); } // 设置最小最大电压范围 int ret; ret = regulator_set_voltage(reg, 800000, 1200000); if (ret < 0) { pr_err("Failed to set voltage range\n"); } // 开启 regulator 输出 ret = regulator_enable(reg); if (ret < 0) { pr_err("Failed to enable regulator\n"); } ``` 上述代码片段展示了如何获取一个名为 `vdd-core` 的 regulator 并配置其工作参数[^3]。 #### 3. 反汇编定位错误地址的应用场景 当遇到与 regulator 相关的运行时崩溃或者异常行为时,可以通过反汇编 vmlinux 文件找到具体发生问题的位置。例如,在高通平台 MSM 芯片上升级内核版本期间可能会引入新的 bug 或者不兼容性问题[^2]。此时借助 objdump 工具生成详细的指令列表可以帮助分析根本原因所在。 #### 4. 编译环境准备注意事项 对于不同版本的 Linux 内核以及对应的硬件平台来说,构建合适的交叉编译链至关重要。比如在 Ubuntu 系统下安装 GCC 版本号为 7.5.0 的工具链就可以满足大多数 ARM 架构的需求。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值