目录
Regulator 介绍
Regulator 指的是稳定器(调压器),有电压稳定器及电流稳定器两种,能够自动维持恒定电流或者电压,
其中,电压稳定器 voltage regulator
在电路中比较常见。
从设备驱动的角度来看,regulator
的控制比较简单,主要有 enable/disable/ 输出电压或电流大小的控制。
Linux利用 regulator framework 对 regulator
进行管理和控制。
由调节器供电的设备被称为消费者(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)
Linux Regualtor framework 被设计用于开关和控制电压和电流调节器,主要主要分为下面的流程:
Regulator provider
的 registerRegulator consumer
的获取和操作device tree
的配置和解析的接口- user interface sysfs interface
Regulator provider 注册
Regulator 向内核注册的核心函数如下,注册的参数中包含 struct regulator_desc
和 struct 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 (