Regulator的使用

1电源管理 Regulator 分成静态和动态:静态不需要改变电压电流,只需要开光电源,用在bootloader,firmware,kernel board 阶段等。动态,根据需要改变电压电流。

2 获取设备的regulator,dev为驱动对应的设备指针,可以用NULL,Vcc为电源的ID,内核会查表找到电源ID对应的regulator。如:struct regulator *ldo; ldo=regulator_get(NULL,“act_ldo5”);

API

regulator = regulator_get(dev, "Vcc");//获取设备regulator.
regulator_put(regulator);   //释放regulator。
int regulator_enable(regulator);//使能电源输出。调用之前也可能已经使能了。所以用下面函数判断。
int regulaor_is_enabled(regulator); //判断是否使能,>0 表示已经使能。
int regulator_disable(regulator);//关闭电源输出。但是未必立刻关闭,有可以存在电源共享的场景。
int regulator_force_disable(regulator);//强制关闭电源。
int regulator_set_voltage(regulator,min_uV,max_uV);//调节电压的最小和最大输出。如果接下去调用regulator_enable ,那么这个值马上就生效,如果调用regulator_disable等其他的,要等到下一次调用regulator_enable时才能生效。
int regulator_get_voltage(regulator); //通过此接口获取配置的输出电压

例子

static struct device *lens_device;
static struct regulator *regVCAMAF;
void FRegulatorCtrl(void)
{
 int Status;
 if(NULL==regVCAMAF)//申请address成功后,没有必要重复申请,以防产生碎片或由于address 改变disable fail
 {
 regVCAMAF = regulator_get(lens_device, "vldo28"); //lens_device位NULL,内核会查表得到vldo28
 Status = regulator_set_voltage(regVCAMAF, 3000000, 3000000);
 if (Status != 0)
 printk("lregulator_set_voltage fail\n");
 } 
}
void xxx_power_on(void)
{
 int Status;
 FRegulatorCtrl();
 Status = regulator_is_enabled(regVCAMAF);//判断是否已经被enable过,否者可能会造成disable fail
 if(!Status)  {
 Status = regulator_enable(regVCAMAF);
 if (Status != 0)
 printk("regulator_enable fail\n");
 } 
}

void xxx_power_off(void)
{
 int Status;
 FRegulatorCtrl();
 Status = regulator_disable(regVCAMAF);
 if (Status != 0)
 printk("regulator_disable fail\n");
}

你可能感兴趣的:(power)