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控制的主要方法了。 





原文地址:https://www.cnblogs.com/yuzaipiaofei/p/4124216.html