📄 pwr_c.c
字号:
/*****************************************
NAME: PWR_C.C
DESC: Power consumption check code
HISTORY:
2003.04.15 : ver 0.0
******************************************/
#include <stdlib.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "24a0addr.h"
#include "24a0lib.h"
#include "24a0slib.h"
#include "mmu.h"
#include "lcdlib.h"
#include "glib.h"
//Options for current measurement
#define QUICK_SORT (TRUE)
#define DHRYSTONE21 (FALSE)
//#define CPU_WORK QUICK_SORT //DHRYSTONE21 //QUICK_SORT
#define DMA0_ON (TRUE)
#define MONITOR_HCLK_ON (TRUE)
#define UNUSED_BLCOK_OFF (TRUE)
void PWR_Lcd_Tft_16Bit_240320_On(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);
#define NUM_SORT_DATA 0x10000
static int dim2[NUM_SORT_DATA]; //128KB,which is bigger than D-Cache(16KB)
//#define TMP_FCLK (237000000)
//#define TMP_FCLK (226000000)
//#define TMP_FCLK (220000000)
//#define TMP_FCLK (214000000)
//#define TMP_FCLK (202000000)
//#define TMP_FCLK (180000000)
//#define TMP_FCLK (152000000)
#define TMP_FCLK (135000000)
//#define TMP_FCLK (101250000)
//#define TMP_FCLK ( 84000000)
//#define TMP_FCLK ( 50000000)
void MeasurePowerConsumption(void)
{
int i;
Uart_Printf("[Measure the power consumption of S3C24A0]\n");
Uart_Printf("FCLK is changed to %5.1lfMhz.\n",TMP_FCLK/1000000.);
MMU_Init();
PreChangeSdramParameter();
//port => 1:SDRAM Xp Port, 2:SDRAM Xd Port, 3: both ports
PreChangeSromParameter(3);
//bank => 0:bank0, 1:bank1, 2:bank2, 3:all banks
#if TMP_FCLK==237000000
ChangeClockDivider(1,1); // 1:2:4
ChangeMPllValue(71,2,0); // TMP_FCLK=237000000Hz
Uart_Init(237000000/4,115200);
ChangeSdramParameter(TMP_FCLK/2);
ChangeSromParameter((TMP_FCLK/2), 3);
#endif
#if TMP_FCLK==226000000
ChangeClockDivider(1,1); // 1:2:4
ChangeMPllValue(105,4,0); // TMP_FCLK=226000000Hz
Uart_Init(226000000/4,115200);
ChangeSdramParameter(TMP_FCLK/2);
ChangeSromParameter((TMP_FCLK/2), 3);
#endif
#if TMP_FCLK==214000000
ChangeClockDivider(1,1); // 1:2:4
ChangeMPllValue(99,4,0); // TMP_FCLK=214000000Hz
Uart_Init(214000000/4,115200);
ChangeSdramParameter(TMP_FCLK/2);
ChangeSromParameter((TMP_FCLK/2), 3);
#endif
#if TMP_FCLK==202000000
ChangeClockDivider(1,1); // 1:2:4
ChangeMPllValue(93,4,0); // TMP_FCLK=202000000Hz
Uart_Init(202000000/4,115200);
ChangeSdramParameter(TMP_FCLK/2);
ChangeSromParameter((TMP_FCLK/2), 3);
#endif
#if TMP_FCLK==180000000
ChangeClockDivider(1,1); // 1:2:4
ChangeMPllValue(82,4,0); // TMP_FCLK=180000000Hz
Uart_Init(180000000/4,115200);
ChangeSdramParameter(TMP_FCLK/2);
ChangeSromParameter((TMP_FCLK/2), 3);
#endif
#if TMP_FCLK==152000000
ChangeClockDivider(1,0); // 1:2:2
ChangeMPllValue(68,4,0); // TMP_FCLK=152000000Hz
Uart_Init(152000000/2,115200);
ChangeSdramParameter(TMP_FCLK/2);
ChangeSromParameter((TMP_FCLK/2), 3);
#endif
#if TMP_FCLK==135000000
ChangeClockDivider(0,1); // 1:1:2
ChangeMPllValue(82,2,1); // FCLK=135000000Hz
Uart_Init(135000000/2,115200);
ChangeSdramParameter(TMP_FCLK);
ChangeSromParameter((TMP_FCLK), 3);
#endif
#if TMP_FCLK==101000000
ChangeClockDivider(0,1); // 1:1:2
ChangeMPllValue(93,4,1); // TMP_FCLK=101000000Hz
Uart_Init(101250000/2,115200);
ChangeSdramParameter(TMP_FCLK);
ChangeSromParameter((TMP_FCLK), 3);
#endif
#if TMP_FCLK==84000000
ChangeClockDivider(0,1); // 1:1:2
ChangeMPllValue(76,4,1); // TMP_FCLK=84000000Hz
Uart_Init(84000000/2,115200);
ChangeSdramParameter(TMP_FCLK);
ChangeSromParameter((TMP_FCLK), 3);
#endif
#if TMP_FCLK==50000000
ChangeMPllValue(42,1,2); // TMP_FCLK=50000000Hz
ChangeClockDivider(0,0); // 1:1:1
Uart_Init(50000000/1,115200);
ChangeSdramParameter(TMP_FCLK);
ChangeSromParameter((TMP_FCLK), 3);
#endif
#if UNUSED_BLCOK_OFF
rCLKCON=rCLKCON&~(1<<17|1<<12|1<<11|1<<10); //SPI,IIC,UART1,SDI
#endif
#if MONITOR_HCLK_ON
rCLKCON=rCLKCON&~(1<<1)|(1<<1); //HCLK moitor enable
#endif
#if DMA0_ON
StartDmaMem2Mem();
#endif
PWR_StartTimer();
Uart_Printf("TFT-LCD 240x320 16bpp mode is running.\n");
PWR_Lcd_Tft_16Bit_240320_On();
PWR_StartIIS();
#if QUICK_SORT
Uart_Printf("CPU JOB:quick sort of 65536 intteger data.\n");
//qsort;
for(i=0;i<NUM_SORT_DATA;i++)dim2[i]=i;
i=0;
while(1)
{
qsort(dim2,NUM_SORT_DATA,sizeof(int),compare1);
qsort(dim2,NUM_SORT_DATA,sizeof(int),compare2);
Uart_Printf(",");
}
#endif
#if DHRYSTONE21
Uart_Printf("CPU JOB:Dhrystone 2.1 code.\n");
while(1)
{
dhrystone21();
Uart_Printf(".");
}
#endif
Uart_Printf("End of the Measurement\n");
}
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;
}
void DoQsort(void) //function for SLOW mode current current consumption
{
qsort(dim2,NUM_SORT_DATA,sizeof(int),compare1);
qsort(dim2,NUM_SORT_DATA,sizeof(int),compare2);
}
void PWR_Lcd_Tft_16Bit_240320_On(void)
{
int i,j,k;
LcdBGInit(MODE_PAR_16BIT565_240320);
LcdEnvidOnOff(1);
GlibRectangle(0,0,239,319,0x07e0);
GlibFilledRectangle(0,0,20,20,65535);
GlibRectangle(220,300,239,319,65535);
GlibLine(0,0,239,319,0x1f);
GlibLine(239,0,0,319,0xf800);
Uart_Printf("TFT 64K color mode test.\n");
}
void PWR_StartTimer(void)
{
Uart_Printf("All 5 timers are running.\n");
rTCFG0=0x8080; //Prescaler=128;
rTCFG1=0x11111; //Devider=1/4;
rTCNTB0=0x8000; //Count buffer=32768
rTCMPB0=0x4000; //Compare buffer=16384
rTCNTB1=0x8000;
rTCMPB1=0x4000;
rTCNTB2=0x8000;
rTCMPB2=0x4000;
rTCNTB3=0x8000;
rTCMPB3=0x4000;
rTCNTB4=0x8000;
rTCON=0x6aaa0a; //manual update
rTCON=0x599909; //run
}
static int buf1[1024],buf2[1024];
void __irq PWR_IsrDma0(void)
{
rINTSUBMSK=rINTSUBMSK|(BIT_SUB_DMA0);
rINTMSK=rINTMSK|(BIT_DMA);
ClearPending(BIT_DMA);
rSUBSRCPND=BIT_SUB_DMA0;
Uart_Printf("$");
rDMASKTRIG0=0x3;
rINTMSK=rINTMSK&~(BIT_DMA);
rINTSUBMSK=rINTSUBMSK&~(BIT_SUB_DMA0);
}
void StartDmaMem2Mem(void)
{
Uart_Printf("seamless DMA0 SDRAM->SDRAM transfer is running.\n");
pISR_DMA=(unsigned)PWR_IsrDma0;
//Clear interrupt pending
ClearPending(BIT_DMA);
rSUBSRCPND=BIT_SUB_DMA0;
//Unmask interrupt
rINTMSK=rINTMSK&~(BIT_DMA);
rINTSUBMSK=rINTSUBMSK&~(BIT_SUB_DMA0);
rDISRC0=(U32)buf1;
rDISRCC0=(0<<1)|(0<<0); //src=AHB,increment
rDIDST0=(U32)buf2;
rDIDSTC0=(0<<1)|(0<<0); //dst=AHB,increment
rDCON0=(1<<31)|(1<<30)|(1<<29)|(1<<27)|(2<<20)|(1024);
//handshake,AHB sync,done int. enable,whole mode,DSZ=word,TC=1024
rDMASKTRIG0=0x3;
}
static U16 buf3[4096];
void __irq PWR_IsrDma2(void)
{
rINTSUBMSK=rINTSUBMSK|(BIT_SUB_DMA2);
rINTMSK=rINTMSK|(BIT_DMA);
ClearPending(BIT_DMA);
rSUBSRCPND=BIT_SUB_DMA0;
Uart_Printf("#");
rINTMSK=rINTMSK&~(BIT_DMA);
rINTSUBMSK=rINTSUBMSK&~(BIT_SUB_DMA2);
}
void PWR_StartIIS(void)
{
Uart_Printf("IIS(DMA2) is running(CDCLK=16.9Mhz,LRCK=44.1Khz).\n");
pISR_DMA=(unsigned)PWR_IsrDma2;
//Clear interrupt pending
ClearPending(BIT_DMA);
rSUBSRCPND=BIT_SUB_DMA2;
//Unmask interrupt
rINTMSK=rINTMSK&~(BIT_DMA);
rINTSUBMSK=rINTSUBMSK&~(BIT_SUB_DMA2);
rDISRC2=(U32)buf3;
rDISRCC2=(0<<1)|(0<<0);//src=AHB,increment
rDIDST2=((U32) IISFIFO);
rDIDSTC2=(1<<1)|(1<<0); //APB,fix
rDCON2=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<24)|(1<<23)|(0<<22)|(1<<20)|(4096);
//handshake, sync PCLK, TC int, single tx, single service, I2SSDO, I2S request,
//auto-reload, half-word,
rDMASKTRIG2=(1<<1)|(0); //DMA2 channel on, no-sw trigger
rIISPSR=(2<<5)|(2<<0); //IIS_LRCK=44.1Khz @384fs,PCLK=50Mhz.
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;
}
/*
****************************************************************************
*
* "DHRYSTONE" Benchmark Program
* -----------------------------
*
* Version: C, Version 2.1
*
* File: dhry.h (part 1 of 3)
*
* Date: May 25, 1988
*
* Author: Reinhold P. Weicker
* Siemens AG, E STE 35
* Postfach 3240
* 8520 Erlangen
* Germany (West)
* Phone: [xxx-49]-9131-7-20330
* (8-17 Central European Time)
* Usenet: ..!mcvax!unido!estevax!weicker
*
* Original Version (in Ada) published in
* "Communications of the ACM" vol. 27., no. 10 (Oct. 1984),
* pp. 1013 - 1030, together with the statistics
* on which the distribution of statements etc. is based.
*
* In this C version, the following C library functions are used:
* - strcpy, strcmp (inside the measurement loop)
* - printf, scanf (outside the measurement loop)
* In addition, Berkeley UNIX system calls "times ()" or "time ()"
* are used for execution time measurement. For measurements
* on other systems, these calls have to be changed.
*
* Collection of Results:
* Reinhold Weicker (address see above) and
*
* Rick Richardson
* PC Research. Inc.
* 94 Apple Orchard Drive
* Tinton Falls, NJ 07724
* Phone: (201) 389-8963 (9-17 EST)
* Usenet: ...!uunet!pcrat!rick
*
* Please send results to Rick Richardson and/or Reinhold Weicker.
* Complete information should be given on hardware and software used.
* Hardware information includes: Machine type, CPU, type and size
* of caches; for microprocessors: clock frequency, memory speed
* (number of wait states).
* Software information includes: Compiler (and runtime library)
* manufacturer and version, compilation switches, OS version.
* The Operating System version may give an indication about the
* compiler; Dhrystone itself performs no OS calls in the measurement loop.
*
* The complete output generated by the program should be mailed
* such that at least some checks for correctness can be made.
*
***************************************************************************
*/
/* Compiler and system dependent definitions: */
#define Mic_secs_Per_Second 1000000.0
/* Berkeley UNIX C returns process times in seconds/HZ */
#ifdef NOSTRUCTASSIGN
#define structassign(d, s) memcpy(&(d), &(s), sizeof(d))
#else
#define structassign(d, s) d = s
#endif
#ifdef NOENUM
#define Ident_1 0
#define Ident_2 1
#define Ident_3 2
#define Ident_4 3
#define Ident_5 4
typedef int Enumeration;
#else
typedef enum {Ident_1, Ident_2, Ident_3, Ident_4, Ident_5}
Enumeration;
#endif
/* for boolean and enumeration types in Ada, Pascal */
/* General definitions: */
#include <stdio.h>
/* for strcpy, strcmp */
#define Null 0
/* Value of a Null pointer */
#define true 1
#define false 0
typedef int One_Thirty;
typedef int One_Fifty;
typedef char Capital_Letter;
typedef int Boolean;
typedef char Str_30 [31];
typedef int Arr_1_Dim [50];
typedef int Arr_2_Dim [50] [50];
typedef struct record
{
struct record *Ptr_Comp;
Enumeration Discr;
union {
struct {
Enumeration Enum_Comp;
int Int_Comp;
char Str_Comp [31];
} var_1;
struct {
Enumeration E_Comp_2;
char Str_2_Comp [31];
} var_2;
struct {
char Ch_1_Comp;
char Ch_2_Comp;
} var_3;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -