MTK6573的LDO控制
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\n"); //return -EIO; goto _kdCISModulePowerOn_exit_; } if(TRUE != hwPowerDown(CAMERA_POWER_VCAM_D, mode_name)) { PK_DBG("[CAMERA SENSOR] Fail to OFF digital power\n"); //return -EIO; goto _kdCISModulePowerOn_exit_; } if(TRUE != hwPowerDown(CAMERA_POWER_VCAM_D2,mode_name)) { PK_DBG("[CAMERA SENSOR] Fail to enable digital power\n"); //return -EIO; goto _kdCISModulePowerOn_exit_; } if(TRUE == hwPowerDown(CAMERA_POWER_VCAM_A2,mode_name)) { PK_DBG("[CAMERA SENSOR] CAMERA_POWER_VCAM_A2 stop!!--------------yuanwei\n"); //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\r\n",__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)\r\n", __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\r\n", __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]\r\n",__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\r\n",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控制的主要方法了。