📄 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<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 + -