📄 power.c
字号:
/*****************************************
NAME: POWER.C
DESC: Dialogue
HISTORY:
2004.06.13 : ver 0.0
******************************************/
#include "def.h"
#include "option.h"
#include "2460addr.h"
#include "2460lib.h"
#include "2460slib.h"
#include "power.h"
#include "idle.h"
#include "stop.h"
#include "sleep.h"
//#include "etc_reset.h"
//Options for current measurement
#define QUICK_SORT (1)
#define DHRYSTONE21 (2)
#define CPU_WORK DHRYSTONE21//QUICK_SORT //DHRYSTONE21
void PWR_Lcd_Tft_16Bit_240320_On(void);
static void Lcd_Port_Init(void);
void PWR_StartTimer(void);
void StartDmaMem2Mem(void);
void PWR_StartIIS(void);
int compare1(const void *a,const void *b);
int compare2(const void *a,const void *b);
static int dim[0x4000]; //64KB,which is bigger than D-Cache(16KB)
#define NUM_SORT_DATA 0x10000
static int dim2[NUM_SORT_DATA]; //128KB,which is bigger than D-Cache(16KB)
extern void Test_IdleMode_Temp(void);
void * func_power_test[][2]=
{
// "123456789012345678"
//Power mode test
(void *)Test_IdleMode, "Idle mode test ",
(void *)Test_StopMode, "Stop mode test ",
(void *)Test_SleepMode, "Sleep mode test ",
(void *)MeasurePowerConsumption, "Normal mode test ",
//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",
0,0
};
void Ch3_Power_Test(void)
{
int i;
printf("\nPower mode test.\n");
// Test_SleepMode();
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("\nClock & Power test end.\n");
}
void MeasurePowerConsumption(void)
{
int i,j, hdiv_val, pdiv_val, select;
volatile int a,b,c;
printf("[Measure the power consumption of S3C2460]\n");
MMU_Init();
#if 0
printf("(1)203MHz,(2)305MHz,(3)400MHz(1:4:8),(4)400MHz(1:3:6),(5)533MHz\n");
printf("Select Clock Frequency to test(0 or Enter to skip) : ");
select = Uart_GetIntNum();
// Clock setting
ChangeUPllValue(56,2,2); // 48MHz
switch(select) {
case 1: // 203.2MHz
ChangeClockDivider(12,12); // 1:2:4
ChangeMPllValue(246,13,0);
break;
case 2: // 305MHz
ChangeClockDivider(13,12); // 1:3:6
ChangeMPllValue(119,3,0);
break;
case 3: // 400MHz, 1:4:8
ChangeClockDivider(14,12);
ChangeMPllValue(92,1,0);
break;
case 4: // 400MHz, 1:3:6
ChangeClockDivider(13,12); // 1:4:8
ChangeMPllValue(92,1,0);
break;
case 5: // 533MHz
ChangeClockDivider(14,12); // 1:4:8
ChangeMPllValue(214,3,0);
break;
case 0:
default:
break;
}
#endif
GlobalCLK();
ChangeSDRAMParameter(HCLK);
//Uart_Init(PCLK, 115200);
// Clock off unused block.
#if 0 //org.
rHCLKCON=(1<<31)|(1<<30)|(1<<29)|(1<<28)|(1<<27)|(1<<26)|(1<<25)|(1<<24)|(1<<23)\
// L2RAM1 L2RAM2 DDR1 DDR2 CSI NFLASH SROM Matrix M DMA1
|(1<<22)|(1<<21)|(1<<20)|(1<<19)|(1<<18)|(1<<17)|(1<<16)|(1<<15)|(1<<14)\
// M DMA0 MBX DSP OTG IrDA MODEM UHost DBLOCK VLX
|(1<<13)|(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<7)|(1<<6)|(1<<5)\
// LCD CAMIF POST DCTQ MC ME DDMA3 DDMA2 DDMA1
|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);
// DDMA0 DMA3 DMA2 DMA1 DMA0
rPCLKCON=(1<<31)|(1<<30)|(1<<29)|(1<<28)|(1<<27)|(1<<26)|(1<<25)|(1<<24)|(1<<23)\
// DDMA3 DDMA2 DDMA1 DDMA0 DMA3 DMA2 DMA1 DMA0 MDMA1
|(1<<22)|(1<<21)|(1<<20)|(1<<19)|(1<<18)|(1<<17)|(1<<16)|(1<<15)|(1<<14)\
// MDMA0 CSI GPIO Key RTC WDT PWM DSP PCM
|(1<<13)|(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<7)|(1<<6)|(1<<5)\
// I2S AC97 reserved SDIO Mstick reserved SPI Udevice
|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);
// I2C IrDA Uart2 Uart1 Uart0
rSCLKCON=(0x1ff<<23)|(1<<22)|(1<<21)|(1<<20)|(1<<19)|(1<<18)|(1<<17)|(1<<16)|(1<<15)|(1<<14)\
// I2SCLK LCD UART MBX 3D MBX Dmemory Dsystem L2RAM1 L2RAM0
|(1<<13)|(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<7)|(1<<6)|(1<<5)\
// DDR1 DDR0 CSI OTG12 CAMIF Deblock VLX POST DCTQ
|(1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);
// ME IrDA OTG Host Device
#else //tmp.(khs.050819)
/* same as L-TDMB */
#if (WHICH_PORT == 1)
//rHCLKCON(0x40000030) = 0x1510280F;
rHCLKCON=rHCLKCON&~((7<<29)|(1<<27)|(1<<25)|(7<<21)|(3<<18)|(0xf<<14)|(1<<12)|(0x7<<8)|(0xf<<4));
//rPCLKCON(0x40000034) = 0x0F1DAEF7;
rPCLKCON=rPCLKCON&~((0xf<<28)|(7<<21)|(1<<17)|(1<<14)|(1<<12)|(1<<8)|(1<<3));
//rSCLKCON(0x40000038) = 0xFFF31041;
rSCLKCON=rSCLKCON&~((0x3<<18)|(7<<13)|(3<<10)|(7<<7)|(0x1f<<1));
#else
//rHCLKCON(0x40000030) = 0x1510280F;
rHCLKCON=rHCLKCON&~((3<<30)|(1<<28)|(1<<27)|(1<<25)|(7<<21)|(3<<18)|(0xf<<14)|(1<<12)|(0x7<<8)|(0xf<<4));
//rPCLKCON(0x40000034) = 0x0F1DAEF7;
rPCLKCON=rPCLKCON&~((0xf<<28)|(7<<21)|(1<<17)|(1<<14)|(1<<12)|(1<<8)|(1<<3));
//rSCLKCON(0x40000038) = 0xFFF31041;
rSCLKCON=rSCLKCON&~((0x3<<18)|(3<<14)|(1<<12)|(3<<10)|(7<<7)|(0x1f<<1));
#endif
#endif
printf("Add Mem to Mem DMA(y/n) ? ");
if(getchar()=='y') {
printf("\n- DMA Mem to Mem(1024 words).\n");
StartDmaMem2Mem();
}
printf("\n");
printf("- Run Timer0 (130KHz).\n");
Timer_Burden();
printf("- TFT-LCD 240x320 16bit is running.\n");
// Test_Lcd_16Bit_240320_On();
Test_Lcd_SER_16Bit_240320_On();
printf("- IIS(DMA2) is running(CDCLK=16.9Mhz,LRCK=44.1Khz).\n");
PWR_StartIIS();
#if CPU_WORK==QUICK_SORT
//qsort;
for(i=0;i<NUM_SORT_DATA;i++) dim2[i]=i;
printf("- CPU JOB:quick sort of 65536 integer data.\n");
printf("status: ");
i=0;
while(1)
{
qsort(dim2,NUM_SORT_DATA,sizeof(int),compare1);
qsort(dim2,NUM_SORT_DATA,sizeof(int),compare2);
printf("\b%1d", i++%10);
if(Uart_GetKey()) break;
}
#else
printf("- CPU JOB:Dhrystone 2.1 code.\n");
printf("status: ");
i=0;
while(1)
{
Dhry_Run();
printf("\b%1d", i++%10);
if(Uart_GetKey()) break;
}
#endif
printf("\nExit\n");
}
static unsigned short buf3[4096];
void __irq PWR_IsrDma2(void)
{
rSUBSRCPND=BIT_SUB_DMA2;
ClearPending(BIT_DMA_SBUS);
// printf("#");
}
void PWR_StartIIS(void)
{
unsigned int iis_div_val=3;
//printf("IIS(DMA2) is running(CDCLK=16.9Mhz,LRCK=44.1Khz).\n");
pISR_DMA_SBUS=(unsigned int)PWR_IsrDma2;
// rINTMSK=rINTMSK&~(BIT_DMA_SBUS);
rINTSUBMSK&=~(BIT_SUB_DMA2);
rGPECON=rGPECON&~(3<<8|3<<4|3<<2|3<<0)|(2<<8|2<<4|2<<2|2<<0); //I2SSDO,CDCLK,I2SSCLK,I2SLRCK
rDISRC2=(unsigned int)buf3;
rDISRCC2=(0<<1)+(0<<0);//src=AHB,increment
rDIDST2=((unsigned int) rIISFIFO );
rDIDSTC2=(1<<1)+(1<<0); //APB,fix
rDCON2=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(0<<22)|(1<<20)|(4096);
//handshake, sync PCLK, TC int, single tx, single service, I2SSDO, I2S request,
//auto-reload, half-word,
rDMAREQSEL2=(2<<1)|(1<<0);
rDMASKTRIG2=(1<<1)+0; //DMA2 channel on, no-sw trigger
iis_div_val = (unsigned int)(((float)PCLK/16934400.0)+0.5)-1;
rIISPSR=(iis_div_val<<5)|(iis_div_val<<0); //IIS_LRCK=44.1Khz @384fs,PCLK=50 or 66.7Mhz.
rIISCON=(1<<5)+(1<<2)+(1<<1);
//Tx DMA enable,Rx idle,prescaler enable
rIISMOD=(2<<6)|(1<<3)|(1<<2)|(1<<0);
//Master,Tx,L-ch=low,iis,16bit ch.,CDCLK=384fs,IISCLK=32fs
rIISFCON=(1<<15)+(1<<13); //Tx DMA,Tx FIFO enable
rIISCON |=0x1;
}
int Dma2Dmabuf1[1024],Dma2Dmabuf2[1024];
void __irq PWR_IsrDma0(void)
{
rSUBSRCPND=BIT_SUB_DMA0;
ClearPending(BIT_DMA_SBUS);
rDMASKTRIG0=0x3;
// printf("$");
}
void StartDmaMem2Mem(void)
{
//printf("seamless DMA0 SDRAM->SDRAM transfer is running.\n");
pISR_DMA_SBUS=(unsigned int)PWR_IsrDma0;
rINTMSK=rINTMSK&~(BIT_DMA_SBUS);
rINTSUBMSK&=~(BIT_SUB_DMA0);
rDISRC0=(unsigned int)Dma2Dmabuf1;
rDISRCC0=(0<<1)|(0<<0); //src=AHB,increment
rDIDST0=(unsigned int)Dma2Dmabuf2;
rDIDSTC0=(0<<1)|(0<<0); //dst=AHB,increment
rDCON0=(1<<31)|(1<<29)|(1<<27)|(2<<20)|(1024);
//handshake,done int. enable,whole mode,DSZ=word,TC=1024
rDMAREQSEL0=0;
rDMASKTRIG0=0x3;
}
void TmpStartDmaMem2Mem(void)
{
//printf("seamless DMA0 SDRAM->SDRAM transfer is running.\n");
rDISRC0=(unsigned int)Dma2Dmabuf1;
rDISRCC0=(0<<1)|(0<<0); //src=AHB,increment
rDIDST0=(unsigned int)Dma2Dmabuf2;
rDIDSTC0=(0<<1)|(0<<0); //dst=AHB,increment
rDCON0=(1<<31)|(1<<30)|(0<<29)|(1<<28)|(0<<27)|(1<<22)|(2<<20)|(1024*64);
rDMAREQSEL0=0;
rDMASKTRIG0=0x3;
}
int compare1(const void *a,const void *b)
{
if(*(int *)a>*(int *)b)
return 1;
else if(*(int *)a==*(int *)b)
return 0;
else
return -1;
}
int compare2(const void *a,const void *b)
{
if(*(int *)a>*(int *)b)
return -1;
else if(*(int *)a==*(int *)b)
return 0;
else
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -