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

📄 power.c

📁 三星s3c2460开发板完整功能测试代码
💻 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 + -