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

📄 c_init.c

📁 ucos-ii在 阳初2440开发板的移植 可支持从norflash启动,从nandflash启动以及由其它bootloader加载到SDRAM中运行
💻 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<nSec;i++)
        *pTT++=attr |(((paddrStart>>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.
}

//===================================================================

⌨️ 快捷键说明

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