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

📄 power.c

📁 samsung 最新芯片2450 的测试程序.
💻 C
字号:
/*****************************************
  NAME: power.c
  DESC: SLOW,HOLD mode test
  HISTORY:
  03.23.2002:purnnamu: first release for 2410
  06.02.2002:DonGo: Modified for 2413
  10.31.2007: SKY
  	- Modified for 2450	
 *****************************************/
 
#include "System.h" 
#include "power.h"
#include "pll_test.h"
#include "sleep.h"
#include "stop.h"
#include "idle.h"



//////////////////////////////////////////////////////////////////////////

volatile int slowExit;
void __irq SlowEint0Int(void)
{
	ClearPending(BIT_EINT0);
	slowExit=1;
}


void * func_power_test[][2]=
{	
	//                          			"0123456789012345678"
	//Power mode test

	(void *)Test_SlowMode,					"Slow mode test    ",
	(void *)Test_HoldMode,					"Clk gating test   ",
	(void *)Test_IdleMode,					"Idle mode test    ",
	(void *)Test_SleepMode,					"Sleep mode test   ",
	(void *)Test_StopMode,					"Stop mode test   ",
	(void *)Test_DeepStopMode,					"Deep Stop mode test   ",
	(void *)Test_SoftMode,					"Soft Reset Test   ",
	(void *)Test_BattFaultInterrupt,		"nBATT_FLT test    ",
	(void *)Test_Dvs,						"DVS test          ",
	(void *)Change_Voltage,					"Arm voltage test     ",
	(void *)Test_Powerdown,					"Power mode repeat test",
	
	0,0
};


void Test_Power(void)
{
	int i;
	
	printf("\nPower mode test.\n");
	
	rGPHCON=rGPHCON&~(0xf<<26)|(0xa<<26);//CLKOUT1,0
	rGPHUDP=rGPHUDP&~((0x3<<26)|(0x3<<28));  // pull updown disable		
	rMISCCR=rMISCCR&~((0x7<<8)|(0x7<<4))|(0x3<<8)|(0x2<<4); //HCLK,ARMCLK
	
	while(1)
	{
		i=0;
		printf("\n\n");
		while(1)
		{   //display menu
			printf("%2d:%s",i,func_power_test[i][1]);
			i++;
			if((int)(func_power_test[i][0])==0)
			{
				printf("\n");
				break;
			}
			if((i%3)==0)
			printf("\n");
		}

		printf("\nSelect (\"-1\" to exit) : ");
		i = GetIntNum();
		if(i==-1) break;		// return.
		if(i>=0 && (i<((sizeof(func_power_test)-1)/8)) )	// select and execute...
			( (void (*)(void)) (func_power_test[i][0]) )();
	}
	
	printf("\nPower_Test program end.\n");
}


void Test_SlowMode(void)
{

#if 1 
	int i;
	unsigned int saveREFRESH, saveCLKSRC, saveCLKDIV0;

	slowExit=0;

	
	printf("S3C2450 will wake up by EINT0 (Falling Edge Triggered).\n");

	rGPFUDP &= ~(3<<0);   // Pull up down disable
	rGPFCON=rGPFCON & ~(3<<0)|(2<<0);	//GPF0=EINT0
	rEXTINT0=rEXTINT0&~(0x7<<0)|(0x2<<0);  //EINT0=falling edge triggered
	
	pISR_EINT0	= (U32)SlowEint0Int;
	rSRCPND = BIT_EINT0;
	rINTPND = BIT_EINT0;
	
	rINTMSK&=~(BIT_EINT0);
	
 //   rSMCCR&=~(0x3<<1);
//	rCLKDIV0&=~(1<<3);
	
	printf("[SLOW MODE TEST]\n");
	printf("  Check the CLKOUT0 pad clock is the same as X-tal input in Slow mode.\n");
	printf("  Compare the LED Blink speed at each mode.\n");
	printf("\n  Press any key to enter slow mode.\n");
	printf("  CLKDIV0:0x%x\n", rCLKDIV0);
	
	Uart_TxEmpty();	//To avoid being crushed the character
//    Init_LED();

	while(!slowExit) {    // Normal mode
		Led_Display(0xa);
		//DoQsort(); 
		for(i=0; i<1000000; i++);
		
		Led_Display(0x5);
		//DoQsort();
		for(i=0; i<1000000; i++);

		if(Uart_GetKey()!=0) break;
	}
	printf("\n  Press EINT0 key to exit SLOW mode\n");
	Uart_TxEmpty();	//To avoid being crushed the character
	
	saveCLKSRC = rCLKSRC;
	saveCLKDIV0 = rCLKDIV0;
	rCLKSRC=rCLKSRC & ~((1<<4)|(1<<3));
	SetCLKDIV( 0, 0, 0, 0); // FCLK=reference clock,  ARMCLK:HCLK:PCLK=1:1:1
	//rCLKDIV0&=~((0xf<<9)|(0x3<<4)|(1<<2)|(0x3<<0)); // FCLK=reference clock,  ARMCLK:HCLK:PCLK=1:1:1

	rSMCCR&=~(0x3<<1);
	rCLKDIV0&=~(1<<3);
	
	// Re-setting the refresh count for 12MHz HCLK.
	saveREFRESH=rREFRESH;
	rREFRESH=(U32)(2048+1-12*7.8); 
//	for(i=0;i<2048;i++); 
    
	slowExit=0;

	while(!slowExit) {
		Led_Display(0xa);
		//DoQsort(); 
		for(i=0; i<1000000; i++);
						
		Led_Display(0x5);
		//DoQsort();
		for(i=0; i<1000000; i++);
		if(Uart_GetKey()!=0) break;
	
	}
	
	rINTMSK=BIT_ALLMSK;

 	rCLKDIV0 = saveCLKDIV0;
 	rSMCCR|=(0x1<<1);
	rCLKSRC = saveCLKSRC;
   
	rREFRESH=saveREFRESH;
//	for(i=0;i<2048;i++); 


#endif
}

void Test_HoldMode(void)
{

    int rHCLKCON_save, rPCLKCON_save, rSCLKCON_save; 
#if 1  
	printf("[Power Saving Mode by Stopping Each Block]\n");

	printf("Check the current cunsumption. Type any key to proceed.\n");	
	//Except GPIO,UART0
	
	rHCLKCON_save = rHCLKCON;
	rPCLKCON_save = rPCLKCON;
	rSCLKCON_save = rSCLKCON;
	
	rHCLKCON=0xffffffff;	// All HCLK enable. 
	rPCLKCON=0xffffffff;
	rSCLKCON=0xffffffff;
	
	printf("Control HCLKCON register!!!.\n");
	getchar();

	printf("Disable HCLK into 2D.\n");
	rHCLKCON&=~(1<<20);
	getchar();
   /*
	printf("Disable HCLK into DRAMC.\n");
	rHCLKCON&=~(1<<19);
	getchar();

	printf("Disable HCLK into SSMC.\n");
	rHCLKCON&=~(1<<18);
	getchar();
	*/
	printf("Disable HCLK into CFC.\n");
	rHCLKCON&=~(1<<17);
	getchar();
	
	printf("Disable HCLK into HSMMC0.\n");
	rHCLKCON&=~(1<<16);
	getchar();

	printf("Disable HCLK into HSMMC1.\n");
	rHCLKCON&=~(1<<15);
	getchar();	

	printf("Disable HCLK into IROM.\n");
	rHCLKCON&=~(1<<13);
	getchar();

	printf("Disable HCLK into USB Device.\n");
	rHCLKCON&=~(1<<12);
	getchar();
	
	printf("Disable HCLK into USB Host.\n");
	rHCLKCON&=~(1<<11);
	getchar();
	
	printf("Disable HCLK into LCD(STN).\n");
	rHCLKCON&=~(1<<10);
	getchar();
	
	printf("Disable HCLK into Display controller.\n");
	rHCLKCON&=~(1<<9);
	getchar();
	
	printf("Disable HCLK into CAMIF.\n");
	rHCLKCON&=~(1<<8);
	getchar();

	printf("Disable HCLK into DMA7.\n");
	rHCLKCON&=~(1<<5);
	getchar();
	
	printf("Disable HCLK into DMA6.\n");
	rHCLKCON&=~(1<<4);
	getchar();
	
	printf("Disable HCLK into DMA5.\n");
	rHCLKCON&=~(1<<5);
	getchar();
	
	printf("Disable HCLK into DMA4.\n");
	rHCLKCON&=~(1<<4);
	getchar();
	
	printf("Disable HCLK into DMA3.\n");
	rHCLKCON&=~(1<<3);
	getchar();
	
	printf("Disable HCLK into DMA2.\n");
	rHCLKCON&=~(1<<2);
	getchar();
	
	printf("Disable HCLK into DMA1.\n");
	rHCLKCON&=~(1<<1);
	getchar();
	
	printf("Disable HCLK into DMA0.\n");
	rHCLKCON&=~(1<<0);
	getchar();

	printf("Control PCLKCON register!!!.\n");

	printf("Disable PCLK into PCM.\n");
	rPCLKCON&=~(1<<19);
	getchar();
	
	printf("Disable PCLK into GPS.\n");
	rPCLKCON&=~(1<<18);
	getchar();
	
	printf("Disable PCLK into I2S1.\n");
	rPCLKCON&=~(1<<17);
	getchar();
	
	printf("Disable PCLK into I2C1.\n");
	rPCLKCON&=~(1<<16);
	getchar();	
	
	printf("Disable PCLK into CHIP_ID.\n");
	rPCLKCON&=~(1<<15);
	getchar();
	
	printf("Disable PCLK into HSSPI1.\n");
	rPCLKCON&=~(1<<14);
	getchar();
	
	printf("Disable PCLK into GPIO.\n");
	rPCLKCON&=~(1<<13);
	getchar();
	
	printf("Disable PCLK into RTC.\n");
	rPCLKCON&=~(1<<12);
	getchar();
	
	printf("Disable PCLK into WDT.\n");
	rPCLKCON&=~(1<<11);
	getchar();
	
	printf("Disable PCLK into PWM.\n");
	rPCLKCON&=~(1<<10);
	getchar();
	
	printf("Disable PCLK into I2S0.\n");
	rPCLKCON&=~(1<<9);
	getchar();
	
	printf("Disable PCLK into AC97.\n");
	rPCLKCON&=~(1<<8);
	getchar();
	
	printf("Disable PCLK into TSADC.\n");
	rPCLKCON&=~(1<<7);
	getchar();
	
	printf("Disable PCLK into HSSPI0.\n");
	rPCLKCON&=~(1<<6);
	getchar();
	
	printf("Disable PCLK into Reserved.\n");
	rPCLKCON&=~(1<<5);
	getchar();
	
	printf("Disable PCLK into I2C0.\n");
	rPCLKCON&=~(1<<4);
	getchar();
	
	printf("Disable PCLK into UART3.\n");
	rPCLKCON&=~(1<<3);
	getchar();
	
	printf("Disable PCLK into UART2.\n");
	rPCLKCON&=~(1<<2);
	getchar();
/*	
	printf("Disable PCLK into UART1.\n");
	rPCLKCON&=~(1<<1);
	getchar();
*/	
	printf("Disable PCLK into UART0.\n");
	rPCLKCON&=~(1<<0);
	getchar();
	
	
	printf("Control SCLKCON register!!!.\n");

	printf("Disable SCLK into SPICLK1[MPLL].\n");
	rSCLKCON&=~(1<<20);
	getchar();
	
	printf("Disable SCLK into SPICLK0[MPLL].\n");
	rSCLKCON&=~(1<<19);
	getchar();
	
	printf("Disable SCLK into PCM1[EXT_CLK].\n");
	rSCLKCON&=~(1<<18);
	getchar();
	
	printf("Disable SCLK into PCM0[EXT_CLK].\n");
	rSCLKCON&=~(1<<17);
	getchar();
	
    
	printf("Disable SCLK into DDRCLK.\n");
	rSCLKCON&=~(1<<16);
	getchar();
/*	
	printf("Disable SCLK into SMCCLK.\n");
	rSCLKCON&=~(1<<15);
	getchar();
*/	
	printf("Disable SCLK into SPICLK0[EPLL].\n");
	rSCLKCON&=~(1<<14);
	getchar();
	
	printf("Disable SCLK into HSMMC_0_1_MPLLRefCLK.\n");
	rSCLKCON&=~(1<<13);
	getchar();
	
	printf("Disable SCLK into HSMMC0[EPLL].\n");
	rSCLKCON&=~(1<<12);
	getchar();
	
	printf("Disable SCLK into CAM.\n");
	rSCLKCON&=~(1<<11);
	getchar();
	
	printf("Disable SCLK into Display Controller.\n");
	rSCLKCON&=~(1<<10);
	getchar();
	
	printf("Disable SCLK into I2S0.\n");
	rSCLKCON&=~(1<<9);
	getchar();
/*	
	printf("Disable SCLK into UART.\n");
	rSCLKCON&=~(1<<8);
	getchar();
*/	
	printf("Disable SCLK into SPICLK[EPLL].\n");
	rSCLKCON&=~(1<<7);
	getchar();
	
	printf("Disable SCLK into HSMMC1[EPLL]..\n");
	rSCLKCON&=~(1<<6);
	getchar();
	
	printf("Disable SCLK into I2S1.\n");
	rSCLKCON&=~(1<<5);
	getchar();
	
	printf("Disable SCLK into USB HOST.\n");
	rSCLKCON&=~(1<<1);
	getchar();
	
	printf("Clock gating test is ended!!!\n");
	
	rHCLKCON = rHCLKCON_save;
 	rPCLKCON = rPCLKCON_save;
	rSCLKCON = rSCLKCON_save;
	
#endif
}

void Test_Dvs(void)
{

	printf("DVS mode test.\n");
	rMISCCR=rMISCCR&~((0x7<<8)|(0x7<<4))|(0x3<<8)|(0x2<<4);
	printf("CLKOUT1: HCLK, CLKOUT0: FCLK \n");
	
	
	while(1) {    // Normal mode
		printf(" DVS mode Off !!!\n");
		Led_Display(0xa);
		rCLKDIV0|=(1<<13); 
		Delay(10000);
		
		printf(" DVS mode On !!!\n");
		Led_Display(0x5);
		rCLKDIV0&=~(1<<13); 
		Delay(10000);
	
		if(Uart_GetKey()!=0) break;
	}

    rCLKDIV0&=~(1<<13); 

}

void Change_Voltage(void)
{
    int voltage;
    U8 ch;
    
    
    printf("1:Int voltage only, 2:Arm voltage only, 3: Arm & Int \n");
	ch=getchar();

//	printf("%c\n\n", ch);
	
	switch(ch) {
		case '0':
			printf("Select voltage? [0.8V -> 1.75V] : ");
			printf("Core voltage? [ex)1.35V -> 135] : ");
			voltage = GetIntNum();
			if (voltage > 175) 
			{
				printf("ARM core voltage limit is 1.45V, then set 1.45V\n");
				voltage = 145;
			}
			Max1718_Set(0, voltage); // pwr=1:ARM, pwr=0:INT
		break;
		case '1':
			printf("Select voltage? [0.8V -> 1.75V] : ");
			printf("Core voltage? [ex)1.35V -> 135] : ");
			voltage = GetIntNum();
			if (voltage > 175) 
			{
				printf("ARM core voltage limit is 1.45V, then set 1.45V\n");
				voltage = 145;
			}
			Max1718_Set(1, voltage); // pwr=1:ARM, pwr=0:INT
		break;
		case '2':
			printf("Select voltage? [0.8V -> 1.75V] : ");
			printf("Core voltage? [ex)1.35V -> 135] : ");
			voltage = GetIntNum();
			if (voltage > 175) 
			{
				printf("ARM core voltage limit is 1.5V, then set 1.45V\n");
				voltage = 145;
			}
			Max1718_Set(0, voltage); // pwr=1:ARM, pwr=0:INT
			Max1718_Set(1, voltage); // pwr=1:ARM, pwr=0:INT
		break;
			
		default:
		break;
	}

   	Delay(10);
	
	
}

void Test_Powerdown(void)
{


	U32 PowerDownRandom;
	
	printf("All Power Down Mode Test\n");
	
	
	while(1)
	{
		PowerDownRandom = (rand()%4);
		switch(PowerDownRandom)
		{
			case 0:
				Test_SleepMode();
				break;
			case 1:
				Test_SleepMode();
				break;
			case 2:
				Test_SleepMode();
				break;
			case 3:
				Test_SleepMode();
				break;		
			default:
				break;
		}
	}	

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -