调节器Regulator是为其他设备供电的设备。由regulator供电的设备称为消费者。提供调节器的芯片称为电源集成电路PMIC。调节器可以启用/禁用其输出,也可以控制其输出电压和电流。
一、PMIC/生产者驱动程序
生产者是产生调节电压电流的设备,这个设备的名称是PMIC,可用于控制加电时序、电池管理、DC-DC转换或简单的电源开关。
1. 驱动程序数据结构
i). 调节器描述结构regulator_desc
内核通过struct regulator_desc{}描述PMIC提供的每个调节器。所谓的调节器是一个可以独立调节的输出,例如Intersil的ISL6217A是一款具有3个独立调节输出的PMIC,因此其驱动程序应该有3个regulator_desc{}实例。
struct regulator_desc {
const char* name;
const char *of_match;
int id; // 调节器的数字标识
unsigned n_voltages; // 调节器可输出的数值数量,如果是固定输出电压,则为1.
const struct regulator_ops *ops;
int irq; // 调节器的中断号
enum regulator_type type; // 是电压调节器还是电流调节器,REGULATOR_VOLTAGE, REGULATOR_CURRENT
struct module *owner;
uint min_uV; // 调节器可以输出的最小电压值
uint uV_step; // 每个选择器的电压增量
};
ii). 调节器限制结构regulator_reconstraints{}
当PMIC向消费者公开调节器时,它必须借助于struct regulator_restraints{}结构为调节器加一些名义上的限制。这个结构收集调节器的安全限制,定义消费者不能跨越的边界。这是调节器驱动程序和消费者驱动程序之间的一种约定:
struct regulator_constraints {
const char *name;
//电压输出范围
int min_uV;
int max_uV;
int uV_offset; // 应用于消费者的电压偏移量,以补偿电压下降
// 电流输出范围
int min_uA;
int max_uA;
uint valid_modes_mask; // 消费者可能配置的模式的掩码
uint valid_ops_mask; // 消费者可能执行的操作的掩码
// 系统位于磁盘模式、内存模式、待机模式时regulator的状态;
struct regulator_state state_disk;
struct regulator_state state_mem;
struct regulator_state state_standby;
suspend_state_t initial_state; // 在init处设置挂起状态
uint initial_mode; // 启动时要设置的模式
unsigned always_on:1;
unsigned boot_on:1;
unsigned apply_uV:1; //
};
iii). regulator初始化结构regulator_init_data{}
初始化数据结构struct regulator_init_data{},可以通过SoC文件或DT树把初始化数据结构传递给驱动程序,在DT树模式下可以用of_get_regulator_init_data()获取数据结构:
struct regulator_init_data {
struct regulation_constraints constraints;
int (*regulator_init)(void *driver_data);
void *driver_data;
};
// 将初始化数据放入SoC的开发板文件中,示例intersil的ISL6271A
static struct regulator_init_data isl_init_data[] = {
[0] = { .constraints = { .name = "Core Buck",
.min_uV = 850000,
.max_uV = 1600000,
.valid_modes_mask = REGULATOR_MODE_NORMAL | REGULATOR_MODE_STANDBY,
.valid_ops_mask = REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS,
},
},
[1] = { .constraints = { .name = "LDO1",
.min_uV = 1100000,
.max_uV = 1100000,
.always_on = true,
.valid_modes_mask = REGULATOR_MODE_NORMAL | REGULATOR_MODE_STANDBY,
.valid_ops_mask = REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS,
},
},
[0] = { .constraints = { .name = "LDO2",
.min_uV = 1300000,

本文详细介绍了Linux内核中电源管理的组成部分,特别是调节器(Regulator)和电源管理集成电路(PMIC)的驱动程序设计。内容涵盖了regulator_desc和regulator_init_data结构,以及如何通过设备树(DT)配置和初始化调节器。此外,还讨论了消费者如何与调节器交互以控制电压和电流。
最低0.47元/天 解锁文章
1552

被折叠的 条评论
为什么被折叠?



