linux Regulator电源设备驱动框架

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

        调节器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,
    
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值