Linux regulator

Linux的regulator是电源管理的关键组件,它允许动态调整电压和电流。regulator工作在软件控制下,通过API进行电源调节。设备在初始化时获取regulator,然后设置电压和电流。电压API包括设置和获取电压,而enable和disable API用于开启和关闭电源。regulator的驱动程序需要注册到内核,并在设备中提供初始化数据。
摘要由CSDN通过智能技术生成

/*regulator 是驱动中电源管理的基础设施。要先注册到内核中,然后使用这些电压输出的模块get其regulator,在驱动中的init里,在适当时间中进行电压电流的设置.
与 gpio 差不多? 一样是基础设施?
*/

//
Linux 内核的动态电压和电流控制接口
功耗已经成为电子产品设计的首要考虑。
//
“LDO是 low dropout regulator,意为低压差线性稳压器”,是相对于传统的线性稳压器来说的。传统的线性稳压器,如78xx系列的芯片都要求输入电压要比输出电压高出 2v~3V以上,否则就不能正常工作。但是在一些情况下,这样的条件显然是太苛刻了,如5v转3.3v,输入与输出的压差只有1.7v,显然是不满足条件的。针对这种情况,才有了LDO类的电源转换芯片。生产LDO芯片的公司很多,常见的有ALPHA, Linear(LT), Micrel, National semiconductor,TI等

in:twl4030-poweroff.c
pm_power_off: what it for???

一种称为校准器(regulator)的动态电压和电流控制的方法,很有参考意义和实际使用价值。

//***********************************************************************//
1: 校准器的基本概念
所谓校准器实际是在软件控制下把输入的电源调节精心输出。

2:Consumer 的API
regulator = regulator_get(dev, “Vcc”);
其中,dev 是设备“Vcc”一个字符串代表,校准器(regulator)然后返回一个指针,也是regulator_put(regulator)使用的。
打开和关闭校准器(regulator)API如下。
int regulator_enable(regulator);
int regulator_disable(regulator);

3: 电压的API
消费者可以申请提供给它们的电压,如下所示。
int regulator_set_voltage(regulator, int min_uV, int max_uV);
在改变电压前要检查约束,如下所示。
regulator_set_voltage(regulator,100000,150000)
电压值下面的设置改变如下所示。
int regulator_get_voltage)struct regulator *regulator);

4:校准器的驱动和系统配置
在实际使用校准器之前,需要按照下面的结构写校准器的驱动程序,然后注册后通知给消费者使用。

//************************* linux regulator 模型******************************************//

static LIST_HEAD(regulator_list); //整个regulator模型的所有regulator.
static LIST_HEAD(regulator_map_list); //整个regulator模型的map

struct regulator_consumer_supply :
用户支持的接口映射。 supply -> device
struct regulator_state:
用于表示 在整个系统的低功耗状态下的设备状态。
struct regulation_constraints :
操作约束。
struct regulator_init_data
校准器平台初始化数据。
struct regulator_dev

向内核注册后 得到regulator设备结构

注册:
struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc,struct device *dev, void *driver_data)
反注册:
要使用注册得到 regulator_dev:
void regulator_unregister(struct regulator_dev *rdev)

/* Regulator operating modes.**/
#define REGULATOR_MODE_FAST
0x1 //电压可以快速调
#define REGULATOR_MODE_NORMAL
0x2 //一般模式
#define REGULATOR_MODE_IDLE
0x4 //低load
#define REGULATOR_MODE_STANDBY
0x8 //sleep/ standby 状态下 低功耗

例子:
/* VSIM for OMAP VDD_MMC1A (i/o for DAT4…DAT7) */
static struct regulator_init_data zoom2_vsim = { //这个data被置于 对应的 platform_device 的data字段中。

.constraints = {
.min_uV
= 1800000,
.max_uV
= 3000000,
.valid_modes_mask
= REGULATOR_MODE_NORMAL /这里设置/
| REGULATOR_MODE_STANDBY,
.valid_ops_mask
= REGULATOR_CHANGE_VOLTAGE /这里设置这个regulator上可进行的操作。调电压,模式可变,可以打开关闭/
| REGULATOR_CHANGE_MODE
| REGULATOR_CHANGE_STATUS,
},
.num_consumer_supplies = 1,
.consumer_supplies = &zoom2_vsim_supply,
};
// regulator 的初始化数据要放到 device 's platform_data
struct regulator_init_data *init_data = dev->platform_data;

" 重点"
//*************************** twl4030 regulator 的实现 ***************************//
struct twlreg_info : 关联到驱动与设备的数据。驱动的私有数据,driver_data.
struct twlreg_info {
/
start of regulator’s PM_RECEIVER control register bank */
u8
base;

/* twl4030 resource ID, for resource control state machine */
u8
id;

/* FIXED_LDO voltage */
u8
deciV;

/* voltage in mV = table[VSEL]; table_len must be a power-of-two */
u8
table_len;
const

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值