MTK的很多模块供电都可以采用LDO供电,对于power management 来说需要添加对应的电源控制。
下面举例说明如何控制相关的LDO
MTK提供的函数如下应用如下:
camera在关闭时要关闭3个LDO电压,DVDD 2.8V,AVDD 2.8V,和Vcore 1.8电压 三个电压。
if(TRUE != hwPowerDown(CAMERA_POWER_VCAM_A2,mode_name))
{
PK_DBG("[CAMERA SENSOR] Fail to enable analog power
");
//return -EIO;
goto _kdCISModulePowerOn_exit_;
}
if(TRUE != hwPowerDown(CAMERA_POWER_VCAM_D, mode_name)) {
PK_DBG("[CAMERA SENSOR] Fail to OFF digital power
");
//return -EIO;
goto _kdCISModulePowerOn_exit_;
}
if(TRUE != hwPowerDown(CAMERA_POWER_VCAM_D2,mode_name))
{
PK_DBG("[CAMERA SENSOR] Fail to enable digital power
");
//return -EIO;
goto _kdCISModulePowerOn_exit_;
}
if(TRUE == hwPowerDown(CAMERA_POWER_VCAM_A2,mode_name))
{
PK_DBG("[CAMERA SENSOR] CAMERA_POWER_VCAM_A2 stop!!--------------yuanwei
");
//return -EIO;
///goto _kdCISModulePowerOn_exit_;
}
但是遇到个奇怪的问题是 style="background-color: rgb(255, 255, 255); ">CAMERA_POWER_VCAM_A2 这个电压无法关闭。跟踪了一下代码发现,这个LDO复用了。然后在看 hwPowerDown 这个函数bool hwPowerDown(MT65XX_POWER powerId, char *mode_name)
{
UINT32 i;
BOOL bFind = FALSE;
if(powerId >= MT65XX_POWER_COUNT_END)
{
MSG(PMIC,"%s:%s:%d powerId:%d is wrong
",__FILE__,__FUNCTION__,
__LINE__ , powerId);
return FALSE;
}
if(g_MT6573_BusHW.Power[powerId].dwPowerCount == 0)
{
MSG(PMIC,"%s:%s:%d powerId:%d (g_MT6573_BusHW.dwPowerCount[powerId] = 0)
",
__FILE__,__FUNCTION__,__LINE__ ,powerId);
return FALSE;
}
for (i = 0; i< MAX_DEVICE; i++)
{
if (!strcmp(g_MT6573_BusHW.Power[powerId].mod_name[i], mode_name))
{
MSG(PMIC,"[%s] powerId:%d index:%d mod_name: %s
",
__FUNCTION__,powerId, i, mode_name);
sprintf(g_MT6573_BusHW.Power[powerId].mod_name[i] , "%s", NON_OP);
bFind = TRUE;
break ;
}
}
if(!bFind)
{
MSG(PMIC,"[%s] Cannot find [%d] master is [%s]
",__FUNCTION__,powerId, mode_name);
return TRUE;
}
g_MT6573_BusHW.Power[powerId].dwPowerCount--;
if(g_MT6573_BusHW.Power[powerId].dwPowerCount > 0)
{
return TRUE;
}
/* Turn off PMU LDO*/
MSG(CG,"[%d] PMU LDO Disable
",powerId );
upmu_ldo_enable(powerId, KAL_FALSE);
return TRUE;
}
style="background-color: rgb(255, 255, 255); ">这个函数中会对LDO的打开进行计数,如果有1个模块打开了,关闭的话就会真正关闭LDO的输出,但是如果2个打开了这个LOD。那对应的计数就是2,你关闭的时候只是减少了LDO的计数,而不是真正关闭。 g_MT6573_BusHW.Power[powerId].dwPowerCount--;
if(g_MT6573_BusHW.Power[powerId].dwPowerCount > 0)
{
return TRUE;
}
如果想一次性关闭就可以用这个函数upmu_ldo_enable(powerId, KAL_FALSE);
如果有其他模块在使用这个LDO。你关闭可能会引起问题的哦。
这就是LDO控制的主要方法了。