⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dvs.c

📁 SAMSUNG S3C6410 CPU BSP for winmobile6
💻 C
📖 第 1 页 / 共 2 页
字号:
	// 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 + -