www.pudn.com > S3C2440_uCos-II.rar > C_init.c


//==================================================================== 
// Bios 程序 
// 初始化 内存控制器、重新影谢MMU 
// 加载 Boot 程序 
//==================================================================== 
 
#define DESC_SEC	(0x2|(1<<4)) 
#define CB		    (3<<2)  //cache_on, write_back 
#define CNB		    (2<<2)  //cache_on, write_through  
#define NCB         (1<<2)  //cache_off,WR_BUF on 
#define NCNB		(0<<2)  //cache_off,WR_BUF off 
#define AP_RW		(3<<10) //supervisor=RW, user=RW 
#define AP_RO		(2<<10) //supervisor=RW, user=RO 
 
#define DOMAIN_FAULT	(0x0) 
#define DOMAIN_CHK	    (0x1)  
#define DOMAIN_NOTCHK	(0x3)  
#define DOMAIN0		    (0x0<<5) 
#define DOMAIN1		    (0x1<<5) 
 
#define DOMAIN0_ATTR	(DOMAIN_CHK<<0)  
#define DOMAIN1_ATTR	(DOMAIN_FAULT<<2)  
 
#define RW_CB		(AP_RW|DOMAIN0|CB|DESC_SEC) 
#define RW_CNB		(AP_RW|DOMAIN0|CNB|DESC_SEC) 
#define RW_NCNB		(AP_RW|DOMAIN0|NCNB|DESC_SEC) 
#define RW_FAULT	(AP_RW|DOMAIN1|NCNB|DESC_SEC) 
 
#include "option.h" 
#include "2440addr.h" 
#include "2440slib.h" 
 
//------------------------------------------------------------- 
//------------------------------------------------------------- 
extern void SWI_UNF_Def(void); 
extern void IRQ_FIQ_PABT_Def(void); 
extern void DABT_Def(void);   
extern void __C_Inits(void); 
//extern void __C_Inits_Bios(void); 
 
//========================= 
static void __MMU_SetMTT(int vaddrStart,int vaddrEnd,int paddrStart,int attr) 
{ 
    unsigned int  *pTT; 
    int i,nSec; 
    pTT=(unsigned int  *)_MMUTT_STARTADDRESS+(vaddrStart>>20); 
    nSec=(vaddrEnd-vaddrStart)>>20; 
    for(i=0;i>20)+i)<<20); 
} 
 
void __C_Int_Default() 
{ 
    unsigned int i; 
    unsigned int *pIntVic = (unsigned int *)(_INT_VIC_STARTADDRESS); 
     
    for( i = 0 ; i < 32 ; i++ ) 
    { 
        pIntVic[i] = (unsigned int)(IRQ_FIQ_PABT_Def); 
        //pIntVic++; 
    } 
 
    //pIntVic = (unsigned int *)(_INT_VIC_STARTADDRESS + 0x100); 
    pIntVic[0] = (unsigned int)(SWI_UNF_Def); 
    pIntVic[1] = (unsigned int)(SWI_UNF_Def); 
    pIntVic[2] = (unsigned int)(IRQ_FIQ_PABT_Def); 
    pIntVic[3] = (unsigned int)(DABT_Def); 
    pIntVic[4] = (unsigned int)(IRQ_FIQ_PABT_Def); 
} 
 
extern const unsigned int ROMVECSTART[]; 
extern const unsigned int ROMVECEND[]; 
//=================================================================== 
void PrintChar(unsigned char); 
void __C_Inits() 
{ 
    unsigned int i,j; 
    unsigned int *p = (unsigned int *)(_SDRAM_STARTADDRESS); 
 
 
    //-------------------------- 
    MMU_DisableDCache(); 
    MMU_DisableICache(); 
 
    //If write-back is used,the DCache should be cleared. 
    for(i=0;i<64;i++) { 
    	for(j=0;j<8;j++) { 
    	    MMU_CleanInvalidateDCacheIndex((i<<26)|(j<<5)); 
    	} 
    } 
    MMU_InvalidateICache(); 
    //MMU_EnableICache();  
    MMU_DisableMMU(); 
    MMU_InvalidateTLB(); 
     
    //初始化中断向量表 
    __C_Int_Default(); 
     
 
    //MMU_SetMTT(int vaddrStart,int vaddrEnd,int paddrStart,int attr) 
    //               虚地址起始  虚地址结束   物理地址起始   属性 
    __MMU_SetMTT(0x00000000,0x00100000,_SYS_ADDR_BASE,RW_CB);   // 
 
    __MMU_SetMTT(0x00100000,0x08000000,0x5b000000,RW_FAULT);//not used 
 
    __MMU_SetMTT(0x08000000,0x10000000,0x08000000,RW_NCNB); //bank1 
    __MMU_SetMTT(0x10000000,0x18000000,0x10000000,RW_NCNB); //bank2 
    __MMU_SetMTT(0x18000000,0x20000000,0x18000000,RW_NCNB); //bank3 
    __MMU_SetMTT(0x20000000,0x28000000,0x20000000,RW_NCNB); //bank4 
    __MMU_SetMTT(0x28000000,0x30000000,0x28000000,RW_NCNB); //bank5 
 
    __MMU_SetMTT(0x30000000,0x34000000,0x30000000,RW_CB);	  //bank6-7 
    //__MMU_SetMTT(0x31000000,0x31f00000,0x31000000,RW_CB);	  //bank6-7 
    //__MMU_SetMTT(0x32000000,0x33f00000,0x32000000,RW_CB);	  //bank6-7 
 
    //__MMU_SetMTT(0x40000000,0x43f00000,0x40000000,RW_NCNB); //StepSram 
 
    __MMU_SetMTT(0x44000000,0x48000000,0x00000000,RW_NCNB); //Flash 
    __MMU_SetMTT(0x48000000,0x5b000000,0x48000000,RW_NCNB); //SFR+StepSram     
 
    __MMU_SetMTT(0x5b000000,0xfff00000,0x5b000000,RW_FAULT); //not used 
 
    MMU_SetTTBase(_MMUTT_STARTADDRESS); 
    MMU_SetDomain(0x55555550|DOMAIN1_ATTR|DOMAIN0_ATTR);  
     
    //DOMAIN1: no_access, DOMAIN0,2~15=client(AP is checked) 
    MMU_SetProcessId(0x0); 
    MMU_EnableAlignFault(); 
    	 
    MMU_EnableMMU(); 
    MMU_EnableICache(); 
    MMU_EnableDCache(); //DCache should be turned on after MMU is turned on. 
} 
 
//===================================================================