📄 dvs.c
字号:
// Enable PLL Clock Out
g_pSysConReg->CLK_SRC |= (0x7);
#endif
#endif
#ifdef ENABLE_VOLTAGE_CONTROL
if(g_CurrentLevel < NewLevel) // Clock Speed of New Level is Faster, Voltage of New Level is Higher
{
LTC3714_VoltageSet(SETVOLTAGE_ARM, VoltageARM(NewLevel), 0);
LTC3714_VoltageSet(SETVOLTAGE_INTERNAL, VoltageInternal(NewLevel), 0);
}
#endif
//OALMSG(TRUE, (L"[DVS] System Level Changed [%d -> %d]\r\n", g_CurrentLevel, NewLevel));
// Update System Level Variable
g_CurrentLevel = NewLevel;
}
}
// for Profiling DVS transition and Measuring CPU idle and active rate
void ProfileDVSOnOff(BOOL bOnOff)
{
#ifdef DVS_LEVEL_PROFILE
int i;
if (bOnOff)
{
for (i=0; i<SYS_LEVEL_MAX; i++)
{
g_aDVFSProfileTable[i][0] = 0;
g_aDVFSProfileTable[i][1] = 0;
}
g_bProfileDSV = TRUE;
// Profile Idle Rate in Non DVS Mode when USB cable is plugged
if (*g_pOTGLinkReg & (0x3<<18)) // Check USB Device in Use
{
g_dwLastTickCount_NonDVS = CurMSec;
g_dwLastIdleCount_NonDVS = g_dwCurrentIdleTime;
OALMSG(TRUE, (L"[Non DVS] Profile Start...\r\n"));
}
else
{
OALMSG(TRUE, (L"[DVS] Profile Start...\r\n"));
}
}
else
{
g_bProfileDSV = FALSE;
// Profile Idle Rate in Non DVS Mode when USB cable is plugged
if (*g_pOTGLinkReg & (0x3<<18)) // Check USB Device in Use
{
DWORD dwTick, dwIdle;
dwTick = CurMSec - g_dwLastTickCount_NonDVS;
dwIdle = g_dwCurrentIdleTime - g_dwLastIdleCount_NonDVS;
g_dwLastTickCount_NonDVS = 0;
g_dwLastIdleCount_NonDVS = 0;
OALMSG(TRUE, (L"[Non DVS] Profile Stop... Idle[%d ms] Active[%d ms]\r\n", dwIdle, dwTick-dwIdle));
}
else
{
OALMSG(TRUE, (L"[DVS] Profile Stop...\r\n"));
for (i=0; i<SYS_LEVEL_MAX; i++)
{
OALMSG(TRUE, (L"Level%d I[%d] A[%d]\r\n", i, g_aDVFSProfileTable[i][0], g_aDVFSProfileTable[i][1]));
}
}
}
#endif
}
UINT32 delayLoopCount;
void Delay(UINT32 usec)
{
volatile UINT32 i=0;
for(;usec>0;usec--)
{
for(i=0;i<delayLoopCount;i++);
}
}
void LTC3714_Init()
{
// We assume these GPIOs is used for only changing votage.
g_pGPIOReg = (S3C6410_GPIO_REG *)OALPAtoVA(S3C6410_BASE_REG_PA_GPIO, FALSE);
//GPIO Setting - For LTC3714 VID
g_pGPIOReg->GPNCON = (g_pGPIOReg->GPNCON & ~(0x3ff<<22)) | (0x155<<22);
// Pull-up/dn disable
g_pGPIOReg->GPNPUD = (g_pGPIOReg->GPNPUD & ~(0x3ff<<22));
// Latch Control Signal
// CORE_REG_OE: XhiA9(GPL9), ARM_REG_LE: XhiA8(GPL8), INT_REG_LE: XhiA10(GPL10)
g_pGPIOReg->GPLCON1 = (g_pGPIOReg->GPLCON1 & ~(0xfff)) | (0x111);
g_pGPIOReg->GPLPUD = (g_pGPIOReg->GPLPUD & ~(0x3f<<16));
}
//////////
// Function Name : LTC3714_VoltageSet
// Function Description : CLKGate_Test in the Normal Mode
// Input : uPwr : 1: ARM Voltage Control, 2: Internal Voltage Control, 3: Both Voltage Control
// uVoltage : 1mV
// Output : None
// Version : v0.1
void LTC3714_VoltageSet(UINT32 uPwr, UINT32 uVoltage, UINT32 uDelay)
{
int uvtg, uRegValue;
//DWORD oldGPNDAT;
//DWORD oldGPLDAT;
//////////////////////////////////////////////
// GPN15 GPN14 GNP13 GPN12 GPN11
// VID4 VID3 VID2 VID1 VID0 // Voltage
// 0 0 0 0 0 // 1.75V
// 0 0 0 0 1 // 1.70V
// 0 0 0 1 0 // 1.65V
// 0 0 0 1 1 // 1.60V
// 0 0 1 0 0 // 1.55V
// 0 0 1 0 1 // 1.50V
// 0 0 1 1 0 // 1.45V
// 0 0 1 1 1 // 1.40V
// 0 1 0 0 0 // 1.35V
// 0 1 0 0 1 // 1.30V
// 0 1 0 1 0 // 1.25V
// 0 1 0 1 1 // 1.20V
// 0 1 1 0 0 // 1.15V
// 0 1 1 0 1 // 1.10V
// 0 1 1 1 0 // 1.05V
// 0 1 1 1 1 // 1.00V
// 1 0 0 0 0 // 0.975V
// 1 0 0 0 1 // 0.950V
// 1 0 0 1 0 // 0.925V
// 1 0 0 1 1 // 0.900V
// 1 0 1 0 0 // 0.875V
// 1 0 1 0 1 // 0.850V
// 1 0 1 1 0 // 0.825V
// 1 0 1 1 1 // 0.800V
// 1 1 0 0 0 // 0.775V
// 1 1 0 0 1 // 0.750V
// 1 1 0 1 0 // 0.725V
// 1 1 0 1 1 // 0.700V
// 1 1 1 0 0 // 0.675V
// 1 1 1 0 1 // 0.650V
// 1 1 1 1 0 // 0.625V
// 1 1 1 1 1 // 0.600V
uvtg=uVoltage;
uRegValue = g_pGPIOReg->GPNDAT; // GPNDAT Register
switch (uvtg)
{
case 1750:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(0<<14)|(0<<13)|(0<<12)|(0<<11)); //D4~0
break;
case 1700:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(0<<14)|(0<<13)|(0<<12)|(1<<11)); //D4~0
break;
case 1650:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(0<<14)|(0<<13)|(1<<12)|(0<<11)); //D4~0
break;
case 1600:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(0<<14)|(0<<13)|(1<<12)|(1<<11)); //D4~0
break;
case 1550:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(0<<14)|(1<<13)|(0<<12)|(0<<11)); //D4~0
break;
case 1500:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(0<<14)|(1<<13)|(0<<12)|(1<<11)); //D4~0
break;
case 1450:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(0<<14)|(1<<13)|(1<<12)|(0<<11)); //D4~0
break;
case 1400:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(0<<14)|(1<<13)|(1<<12)|(1<<11)); //D4~0
break;
case 1350:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(1<<14)|(0<<13)|(0<<12)|(0<<11)); //D4~0
break;
case 1300:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(1<<14)|(0<<13)|(0<<12)|(1<<11)); //D4~0
break;
case 1250:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(1<<14)|(0<<13)|(1<<12)|(0<<11)); //D4~0
break;
case 1200:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(1<<14)|(0<<13)|(1<<12)|(1<<11)); //D4~0
break;
case 1150:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(1<<14)|(1<<13)|(0<<12)|(0<<11)); //D4~0
break;
case 1100:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(1<<14)|(1<<13)|(0<<12)|(1<<11)); //D4~0
break;
case 1050:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(1<<14)|(1<<13)|(1<<12)|(0<<11)); //D4~0
break;
case 1000:
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)); //D4~0
break;
case 975:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(0<<14)|(0<<13)|(0<<12)|(0<<11)); //D4~0
break;
case 950:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(0<<14)|(0<<13)|(0<<12)|(1<<11)); //D4~0
break;
case 925:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(0<<14)|(0<<13)|(1<<12)|(0<<11)); //D4~0
break;
case 900:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(0<<14)|(0<<13)|(1<<12)|(1<<11)); //D4~0
break;
case 875:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(0<<14)|(1<<13)|(0<<12)|(0<<11)); //D4~0
break;
case 850:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(0<<14)|(1<<13)|(0<<12)|(1<<11)); //D4~0
break;
case 825:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(0<<14)|(1<<13)|(1<<12)|(0<<11)); //D4~0
break;
case 800:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(0<<14)|(1<<13)|(1<<12)|(1<<11)); //D4~0
break;
case 775:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(1<<14)|(0<<13)|(0<<12)|(0<<11)); //D4~0
break;
case 750:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(1<<14)|(0<<13)|(0<<12)|(1<<11)); //D4~0
break;
case 725:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(1<<14)|(0<<13)|(1<<12)|(0<<11)); //D4~0
break;
case 700:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(1<<14)|(0<<13)|(1<<12)|(1<<11)); //D4~0
break;
case 675:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(1<<14)|(1<<13)|(0<<12)|(0<<11)); //D4~0
break;
case 650:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(1<<14)|(1<<13)|(0<<12)|(1<<11)); //D4~0
break;
case 625:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(1<<14)|(1<<13)|(1<<12)|(0<<11)); //D4~0
break;
case 600:
uRegValue=(uRegValue&~(0x1f<<11))|((1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)); //D4~0
break;
default: // 1.00V
uRegValue=(uRegValue&~(0x1f<<11))|((0<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)); //D4~0
break;
}
g_pGPIOReg->GPNDAT = uRegValue; // GPNDAT Register
if(uPwr&SETVOLTAGE_ARM) //ARM Voltage Control => ARM_REG_LE => Output H => Data Changed
{
g_pGPIOReg->GPLDAT = (g_pGPIOReg->GPLDAT & ~(0x1<<8)) | (0x1<<8);
}
if(uPwr&SETVOLTAGE_INTERNAL) // INT Voltage Control
{
g_pGPIOReg->GPLDAT = (g_pGPIOReg->GPLDAT & ~(0x1<<10)) | (0x1<<10);
}
// Output Enable
g_pGPIOReg->GPLDAT = (g_pGPIOReg->GPLDAT & ~(0x1<<9)) | (0x1<<9);
Delay(uDelay);
g_pGPIOReg->GPLDAT = (g_pGPIOReg->GPLDAT & ~(0x1<<8));
g_pGPIOReg->GPLDAT = (g_pGPIOReg->GPLDAT & ~(0x1<<10));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -