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

📄 2440_501.c

📁 S3C2440+SM501在wince环境下的应用!
💻 C
字号:
//====================================================================
// File Name : 2440_501.c
// Function  : S3C2440 Test Main Menu
// Program   : Terminator
// Date      : July 29, 2008
// Version   : 0.0
// History
//   0.0 : Programming start (July 1,2008) -> 
//====================================================================

#include <stdlib.h>
#include <string.h>

#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "mmu.h"
#include "Nand.h"

#include "sm501.h"
#include "display.h"

#if USE_MAIN
#include <stdio.h>
#endif


void Isr_Init(void);
void HaltUndef(void);
void HaltSwi(void);
void HaltPabort(void);
void HaltDabort(void);

#define SM501_TEST			1

#if SM501_TEST

#define rSM501_Current_Clock		(*(volatile unsigned long *)0x23e0003c)
#define rSM501_Power_Mode0 			(*(volatile unsigned long *)0x23e00040)
#define rSM501_Miscellaneous 		(*(volatile unsigned long *)0x23e00068)

#endif





U32 Mdiv, Pdiv, Sdiv, Fclk, Hclk, Pclk, Hdivn, Pdivn,Pclk_Ratio,Hclk_Ratio,Ref_Cnt;
//U32 Hclk_Ratio, Pclk_Ratio, Ref_Cnt;

void Main()
{
	unsigned int mpll_val,sval,tmpi;
	volatile unsigned long sm501_power;
	int i;
	#if 1
		volatile unsigned long * sm501_test,* sm501_drop;
		sm501_drop = ((volatile unsigned long *)0x13e00004);
		sm501_test = ((volatile unsigned long *)0x23e00060);
	#endif
	
	
	
	Port_Init();
	
	Led_Display(0xf);
	
	// MMU init. I/D cache on.
	MMU_Init();
	
	Led_Display(0x1);
	
	mpll_val=rMPLLCON;
	Mdiv = (mpll_val&(0xff<<12))>>12;
	Pdiv = (mpll_val&(0x3f<<4))>>4;
	Sdiv = (mpll_val&0x3);
	Hdivn = ((rCLKDIVN&0x6)>>1);
	Pdivn = (rCLKDIVN&1);
	
	switch(Sdiv) {
		case 0: sval = 1; break;
		case 1: sval = 2; break;
		case 2: sval = 4; break;
		case 3: sval = 8; break;
		default: sval = 0; break;
	}
	switch(Hdivn) {
		case 0: Hclk_Ratio=1; break;
		case 1: Hclk_Ratio=2; break;
		case 2: Hclk_Ratio=4; break;
		case 3: Hclk_Ratio=3; break;
	}
	switch(Pdivn) {
		case 0: Pclk_Ratio=1; break;
		case 1: Pclk_Ratio=2; break;
	}

	tmpi = rCAMDIVN&(3<<8);
	if(tmpi!=0) {
		if(Hclk_Ratio==3 || Hclk_Ratio==4)
		Hclk_Ratio *= 2;
	}

	Fclk=(U32)( (((float)Mdiv+8)*FIN*2.0)/( ((float)Pdiv+2)*(float)sval) );
	Hclk =(U32)( ((float)Fclk/(float)Hclk_Ratio) );
	Pclk = (U32)( (((float)Fclk/(float)Hclk_Ratio)/(float)Pclk_Ratio));
	
	//Calc_Clock(0);
	
	Isr_Init();
	Uart_Init(Pclk, 115200);
	Uart_Select(1);
	Uart_TxEmpty(1);
	
	Uart_Printf("MPLLVal [M:%xh(%d),P:%xh,S:%xh]\n", Mdiv, Mdiv, Pdiv, Sdiv);
	Uart_Printf("Hdivn = %d,Pdivn = %d\n",Hdivn,Pdivn);
	Uart_Printf("Fclk=%4.1f,Hclk=%4.1f,Pclk=%4.1f MHz]\n", (float)Fclk/MEGA, (float)Hclk/MEGA, (float)Pclk/MEGA);
	
	
	
	#if SM501_TEST
		sm501_power = rSM501_Miscellaneous;
		Uart_Printf("Miscellaneous Times = 0x%x,%x\n",sm501_power,*sm501_drop);
		*sm501_drop=0x12345678;
		//while(rGPBDAT & 0x1);
		rSM501_Miscellaneous|=(0x01<<24);
		//while(rGPBDAT & 0x1);
		rSM501_Power_Mode0|=(0x3);
		//while(rGPBDAT & 0x1);
		rSM501_Current_Clock &= (~(0x1f));
		rSM501_Current_Clock |= (1<<1);
		//while(rGPBDAT & 0x1);	
		Uart_Printf("0x13e00000 = 0x%x\n",*sm501_drop);
	#endif
	
	rMISCCR |= (0x4<<4);
	video_init();
	
}
//===================================================================
void Isr_Init(void)
{
    pISR_UNDEF  = (unsigned)HaltUndef;
    pISR_SWI    = (unsigned)HaltSwi;
    pISR_PABORT = (unsigned)HaltPabort;
    pISR_DABORT = (unsigned)HaltDabort;
	
    rINTMOD     = 0x0;					 //All=IRQ mode
//    rINTCON=0x5;						   //Non-vectored,IRQ enable,FIQ disable    
    rINTMSK     = BIT_ALLMSK;			  //All interrupt is masked.
    rINTSUBMSK  = BIT_SUB_ALLMSK;		  //All sub-interrupt is masked. <- April 01, 2002 SOP

//    rINTSUBMSK  = ~(BIT_SUB_RXD0);		 //Enable Rx0 Default value=0x7ff
//    rINTMSK     = ~(BIT_UART0);			//Enable UART0 Default value=0xffffffff    
	
//    pISR_UART0=(unsigned)RxInt;			//pISR_FIQ,pISR_IRQ must be initialized
}
//===================================================================
void HaltUndef(void)
{
    Uart_Printf("Undefined instruction exception.\n");
    while(1);
}

//===================================================================
void HaltSwi(void)
{
#if !SEMIHOSTING	
		Uart_Printf("SWI exception!!!\n");
		while(1);
#endif	
}

//===================================================================
void HaltPabort(void)
{
    Uart_Printf("Pabort exception.\n");
    while(1);
}

//===================================================================
void HaltDabort(void)
{
    Uart_Printf("Dabort exception.\n");
    while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -