📄 power.c
字号:
/*****************************************
NAME: POWER.C
DESC: Dialogue, slow, hold mode test
HISTORY:
2004.01.15 : ver 0.0
******************************************/
#include "def.h"
#include "option.h"
#include "24a0addr.h"
#include "24a0lib.h"
#include "24a0slib.h"
#include "lcdlib.h"
#include "power.h"
#include "idle.h"
#include "pll.h"
#include "stop.h"
#include "sleep.h"
#include "pwr_c.h"
void __irq SlowEint0Int(void);
volatile int slowExit;
void * func_power_test[][2]=
{
// "123456789012345678"
//Clock test
(void *)Test_PLL, "PLL change test ",
(void *)ChangePLL, "PLL change(manual)",
(void *)Test_PllOnOff, "PLL On/Off test ",
//Power mode test
(void *)Test_SlowMode, "Slow mode test ",
(void *)Test_HoldMode, "Hold mode test ",
(void *)Test_IdleMode, "Idle mode test ",
(void *)Test_MMUIdleMode, "Idle mode(MMU) ",
(void *)Test_IdleModeHard, "Idle hard test ",
(void *)Test_StopMode, "Stop mode test ",
(void *)Test_SleepMode, "Sleep mode test ",
(void *)MeasurePowerConsumption, "Power consumption ",
//Various reset test
(void *)Test_SoftReset, "Soft Reset ",
(void *)Test_WarmReset, "Warm Reset ",
(void *)Test_WDTReset, "Watch-dog Reset ",
(void *)Test_BattFault, "Batt_FLT ",
(void *)Test_BattFaultInterrupt, "Batt_FLT_Interrupt",
(void *)Test_SlowMode_Repeat, "Slow Mode Repeat",
(void *)Test_ChangingPll_withSlow, "PLL Change w Slow",
0,0
};
void Ch33_Power_Test(void)
{
int i;
Uart_Printf("\nPower mode test.\n");
while(1)
{
i=0;
Uart_Printf("\n\n");
while(1)
{ //display menu
Uart_Printf("%2d:%s",i,func_power_test[i][1]);
i++;
if((int)(func_power_test[i][0])==0)
{
Uart_Printf("\n");
break;
}
if((i%3)==0)
Uart_Printf("\n");
}
Uart_Printf("\nSelect (\"-1\" to exit) : ");
i = Uart_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]) )();
}
Uart_Printf("\nPower_Test program end.\n");
}
void Test_SlowMode(void)
{
int i;
unsigned int saveLCD;
unsigned int saveREFRESH;
slowExit=0;
saveREFRESH=rSDRAM_REFRESH;
saveLCD=rLCDCON1;
rGPCON_L=( rGPCON_L & ~(3<<0) ) |(2<<0); //GP0=EINT0
rEXTINTC0=( rEXTINTC0 & ~(7<<0) ) |(2<<0); //EINT0=falling edge triggered
pISR_EINT0_2=(U32)SlowEint0Int;
ClearPending(BIT_EINT0_2);
rEINTPEND=BIT_EINTPEND_EINT0;
rEINTMASK=~BIT_EINTPEND_EINT0;
rINTMSK=~BIT_EINT0_2;
Uart_Printf("[SLOW MODE TEST]\n");
Uart_Printf(" 1. LEDs are flickered by 200ms period at %dMhz 20 times.\n",FCLK/1000000);
Uart_Printf(" 2. Entering SLOW mode.\n");
Uart_Printf(" 3. LEDs are flickered by %fms period at %dMhz until......\n",(float)(200*FCLK/FIN), FCLK/1000000);
Uart_Printf(" 4. Press EINT0 key to exit SLOW mode\n");
Uart_TxEmpty(0); //To avoid being crushed the character
for(i=0;i<20;i++)
{
Led_Display(0x0);
Delay(1000);
Led_Display(0xf);
Delay(1000);
}
rCLKSRC=(0<<8)|(0<<7)|(1<<5)|(1<<4)|(0); // OnOSC_EN disable,U_PLL on,M_PLL off,External clk,Divider=0
rSDRAM_REFRESH=7.8*(FIN/1000000); // Period= 7.8us
//The other memory control register should be optimized for SLOW mode.
rLCDCON1&=0xffffffe; // Disable Video output and control signal
rLCDCON1=(rLCDCON1 & ~(0x3ff<<8) ) |(1<<0); //Change CLKVAL & Enable ENVID bit
while(!slowExit)
{
Led_Display(0x0);
Delay(1000);
Led_Display(0xf);
Delay(1000);
}
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(1<<4)|(0); // OnOSC_EN disable,U_PLL on,M_PLL on,External clk,Divider=0
for(i=0;i<2048;i++); //S/W MPLL lock-time
rLCDCON1=saveLCD;
rSDRAM_REFRESH=saveREFRESH;
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(0<<4)|(0); // OnOSC_EN disable,U_PLL on,M_PLL on,MPLL_clk,Divider=0
}
void __irq SlowEint0Int(void)
{
rINTMSK=BIT_ALLMSK;
rEINTMASK=BIT_EINTPEND_ALLMSK;
rEINTPEND=BIT_EINTPEND_EINT0;
ClearPending(BIT_EINT0_2);
slowExit=1;
}
void Test_HoldMode(void)
{
Uart_Printf("[Power Saving Mode by Stopping Each Block]\n");
Uart_Printf("LCD ENVID is turned off.\n");
LcdEnvidOnOff(0);
Uart_Printf("Check the current cunsumption. Type any key to proceed.\n");
//Except GPIO,UART0
rCLKCON=0x3fffff0;
Uart_Getch();
Uart_Printf("IrDA off.\n");
rCLKCON&=~(1<<4);
Uart_Getch();
Uart_Printf("External AHB off.\n");
rCLKCON&=~(1<<5);
Uart_Getch();
Uart_Printf("AC97 off.\n");
rCLKCON&=~(1<<6);
Uart_Getch();
Uart_Printf("USB host off(DP0/DN0 is suspended).\n");
rCLKCON&=~(1<<7);
//rMISCCR|=(1<<12); //USB port0 = suspend
Uart_Getch();
Uart_Printf("PWM Timer off.\n");
rCLKCON&=~(1<<8);
Uart_Getch();
/* UART0 is a message port */
Uart_Printf("UART1 off.\n");
rCLKCON&=~(1<<10);
Uart_Getch();
Uart_Printf("SPI off.\n");
rCLKCON&=~(1<<11);
Uart_Getch();
Uart_Printf("IIC off.\n");
rCLKCON&=~(1<<12);
Uart_Getch();
Uart_Printf("IIS off.\n");
rCLKCON&=~(1<<13);
Uart_Getch();
Uart_Printf("USB device off(DP1/DN1 is also suspended).\n");
rCLKCON&=~(1<<15);
//rMISCCR|=(1<<13); //USB port1 = suspend
Uart_Getch();
Uart_Printf("MemoryStick off.\n");
rCLKCON&=~(1<<16);
Uart_Getch();
Uart_Printf("SD off.\n");
rCLKCON&=~(1<<17);
Uart_Getch();
Uart_Printf("ADC off.\n");
rADCCON|=(1<<2);
rCLKCON&=~(1<<18);
Uart_Getch();
Uart_Printf("Keypad off.\n");
rCLKCON&=~(1<<19);
Uart_Getch();
Uart_Printf("MPEG4 off.\n");
rCLKCON&=~(1<<20);
Uart_Getch();
Uart_Printf("Camera I/F off.\n");
rCLKCON&=~(1<<21);
Uart_Getch();
Uart_Printf("LCD off.\n");
rCLKCON&=~(1<<22);
Uart_Getch();
Uart_Printf("Camera off.\n");
rCLKCON&=~(1<<23);
Uart_Getch();
Uart_Printf("MPEG4 I/F off.\n");
rCLKCON&=~(1<<24);
Uart_Getch();
Uart_Printf("VPost off.\n");
rCLKCON&=~(1<<25);
Uart_Getch();
Uart_Printf("Return to Normal Mode.\n");
rCLKCON=0x3fffff0;
rADCCON&=(1<<2);
//rMISCCR&=~((1<<12)|(1<<13)); //USB port0,1 = normal
LcdEnvidOnOff(1);
}
void Test_SlowMode_Repeat(void)
{
int i;
unsigned int count;
unsigned int saveLCD;
unsigned int saveREFRESH;
#if 0
count=0;
rSDRAM_REFRESH=7.8*(FIN/1000000);
rGPCON_L = (rGPCON_L & ~(0x3<<16))|(1<<16);
while(1) {
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(1<<4)|(0);
rGPDAT &= ~(1<<8);
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(0<<4)|(0);
rGPDAT |= (1<<8);
}
#else
count=0;
rSDRAM_REFRESH=7.8*(FIN/1000000);
rGPCON_L = (rGPCON_L & ~(0x3<<20))|(1<<20);
while(1) {
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(1<<4)|(0);
rGPDAT &= ~(1<<10);
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(0<<4)|(0);
rGPDAT |= (1<<10);
}
#endif
}
void Test_ChangingPll_withSlow(void)
{
U32 i,j, count;
U32 savedREFRESH, PLLCount;
i=j=count=PLLCount=0;
rCLKCON &= ~(1<<1);
rLOCKTIME = 10;
#if 0
while(1) {
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(1<<4)|(0); //Slow Mode
ChangeMPllValue(32,2,1);// FCLK=96MHz
for(i=0; i<10; i++);
ChangeClockDivider(0,1);
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(0<<4)|(0); //Normal Mode
for(i=0; i<1000; i++);
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(1<<4)|(0); //Slow Mode
ChangeClockDivider(1,1);
ChangeMPllValue(32,2,0);// FCLK=192MHz
for(i=0; i<10; i++);
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(0<<4)|(0); //Normal Mode
j++;
if((j%1000)==0) Uart_Printf("%d\n", count++);
}
#elif 0
savedREFRESH=rSDRAM_REFRESH;
while(1) {
rSDRAM_REFRESH=7.8*(FIN/1000000);
//rLCDCON1&=0xfffffffc;
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(1<<4)|(0);
//rLCDCON1=(rLCDCON1 & ~(0x3f<<13) ) |(1<<0);
//102Mhz:102Mhz:51Mhz
rMPLLCON = (32<<12)|(2<<4)|(1);
for(i=0; i<1000; i++);
rCLKDIVN = (0<<1)|(1);
//Exit Slow mode, FCLK=PLL out
//rLCDCON1&=0xfffffffc;
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(0<<4)|(0);
rSDRAM_REFRESH=savedREFRESH;
//rLCDCON1=(rLCDCON1 & ~(0x3f<<13) ) |(1<<0);
//Slow mode, FCLK=External Clock
rSDRAM_REFRESH=7.8*(FIN/1000000);
//rLCDCON1&=0xfffffffc;
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(1<<4)|(0);
//rLCDCON1=(rLCDCON1 & ~(0x3f<<13) ) |(1<<0);
//204Mhz:102Mhz:51Mhz
rCLKDIVN = (1<<1)|(1);
rMPLLCON = (32<<12)|(2<<4)|(0);
for(i=0; i<1000; i++);
//Exit Slow mode, FCLK=PLL out
//rLCDCON1&=0xfffffffc;
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(0<<4)|(0);
rSDRAM_REFRESH=savedREFRESH;
//rLCDCON1=(rLCDCON1 & ~(0x3f<<13) ) |(1<<0);
//if((i%1000) == 0)
Uart_Printf("%d\n", PLLCount++);
Uart_TxEmpty(0);
i++;
}
#elif 0 //0701
rGPCON_L = (rGPCON_L & ~(0x3<<20))|(1<<20);
rGPCON_U = (rGPCON_U & ~(0x3<<12))|(1<<12);
/*
rGPDAT &= ~((1<<25)|(1<<10));
Uart_Getch();
rGPDAT |= ((1<<25)|(1<<10));
Uart_Getch();
rGPDAT &= ~((1<<25)|(1<<10));
*/
i=PLLCount=0;
savedREFRESH=rSDRAM_REFRESH;
rSDRAM_REFRESH=7.8*(FIN/1000000);
while(1) {
rGPDAT &= ~((1<<25)|(1<<10)); //**************************0
//rSDRAM_REFRESH=7.8*(FIN/1000000);
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(1<<4)|(0);
//rGPDAT = (rGPDAT & ~(1<<25))|(1<<10);//**************************1
//102Mhz:102Mhz:51Mhz
rMPLLCON = (32<<12)|(2<<4)|(1);
//rGPDAT = (1<<25)|(rGPDAT & ~(1<<10));//**************************2
for(i=0; i<1000; i++);
rCLKDIVN = (0<<1)|(1);
//rGPDAT = (1<<25)|(1<<10);//**************************3
//Exit Slow mode, FCLK=PLL out
rGPDAT = (rGPDAT & ~(1<<25))|(1<<10);//**************************1
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(0<<4)|(0);
//rSDRAM_REFRESH=savedREFRESH;
//Slow mode, FCLK=External Clock
rGPDAT = (1<<25)|(rGPDAT & ~(1<<10));//**************************2
//rSDRAM_REFRESH=7.8*(FIN/1000000);
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(1<<4)|(0);
//204Mhz:102Mhz:51Mhz
rCLKDIVN = (1<<1)|(1);
rMPLLCON = (32<<12)|(2<<4)|(0);
for(i=0; i<1000; i++);
//Exit Slow mode, FCLK=PLL out
rGPDAT = (1<<25)|(1<<10);//**************************3
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(0<<4)|(0);
//rSDRAM_REFRESH=savedREFRESH;
if((i%1000) == 0) {
Uart_Printf("%d\n", PLLCount++);
Uart_TxEmpty(0);
}
i++;
}
#else
rGPCON_L = (rGPCON_L & ~(0x3<<20))|(1<<20);
rGPCON_U = (rGPCON_U & ~(0x3<<12))|(1<<12);
i=PLLCount=0;
savedREFRESH=rSDRAM_REFRESH;
rSDRAM_REFRESH=7.8*(FIN/1000000);
while(1) {
rGPDAT &= ~((1<<25)|(1<<10)); //**************************0
rSDRAM_REFRESH=7.8*(FIN/1000000);
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(1<<4)|(0);
for(i=0; i<6000; i++);
//rGPDAT = (rGPDAT & ~(1<<25))|(1<<10);//**************************1
//102Mhz:102Mhz:51Mhz
rMPLLCON = (60<<12)|(2<<4)|(1);
//rGPDAT = (1<<25)|(rGPDAT & ~(1<<10));//**************************2
for(i=0; i<100; i++);
rCLKDIVN = (0<<1)|(1);
//rGPDAT = (1<<25)|(1<<10);//**************************3
//Exit Slow mode, FCLK=PLL out
rGPDAT = (rGPDAT & ~(1<<25))|(1<<10);//**************************1
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(0<<4)|(0);
for(i=0; i<6000; i++);
rSDRAM_REFRESH=savedREFRESH;
//Slow mode, FCLK=External Clock
rGPDAT = (1<<25)|(rGPDAT & ~(1<<10));//**************************2
rSDRAM_REFRESH=7.8*(FIN/1000000);
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(1<<4)|(0);
for(i=0; i<6000; i++);
//204Mhz:102Mhz:51Mhz
rCLKDIVN = (1<<1)|(1);
rMPLLCON = (60<<12)|(2<<4)|(0);
for(i=0; i<100; i++);
//Exit Slow mode, FCLK=PLL out
rGPDAT = (1<<25)|(1<<10);//**************************3
rCLKSRC=(0<<8)|(0<<7)|(0<<5)|(0<<4)|(0);
for(i=0; i<6000; i++);
rSDRAM_REFRESH=savedREFRESH;
if((j%1000) == 0) {
Uart_Printf("%d\n", PLLCount++);
Uart_TxEmpty(0);
}
j++;
}
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -