📄 power.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 + -