- 论坛徽章:
- 0
|
回复 11# arm-linux-gcc
那个mmu初始化 ,
void SYSTEM_SetMmuMtt(u32 vaddrStart,u32 vaddrEnd,u32 paddrStart,u32 attr)
{
u32 *pTT;
int i,nSec;
pTT = (u32 *)_MMUTT_BaseAddress+(vaddrStart>>20);
nSec = (vaddrEnd>>20)-(vaddrStart>>20);
for(i=0;i<=nSec;i++)
*pTT++ = attr | (((paddrStart>>20)+i)<<20);
}
//////////
// Function Name : SYSTEM_InitMmu
// Function Description :
// Input : NONE
// Output : NONE
// Version :
#define rMEM_CFG_STAT (SYSCON_BASE+0x12c)
void SYSTEM_InitMmu(void)
{
//========================== IMPORTANT NOTE =========================
//The current stack and code area can't be re-mapped in this routine.
//If you want memory map mapped freely, your own sophiscated MMU
//initialization code is needed.
//===================================================================
SYSTEM_DisableICache();
SYSTEM_DisableDCache();
SYSTEM_InvalidateEntireICache();
SYSTEM_CleanInvalidateEntireDCache();
SYSTEM_DisableMMU();
SYSTEM_InvalidateTLB();
// SROM
if( (SYSC_GetMEMCFGSTAT()&(0x3<<5)) != (2<<5) )
{
SYSTEM_SetMmuMtt(0x00000000,0x07f00000,0x00000000,RW_NCNB); //mirroed region
SYSTEM_SetMmuMtt(0x08000000,0x0bf00000,0x08000000,RW_NCNB); //internal rom
SYSTEM_SetMmuMtt(0x0c000000,0x0ff00000,0x0c000000,RW_NCNB); //stepping stone
}
else
{
//Only for OneNand Booting Mode..Map00 error
SYSTEM_SetMmuMtt(0x0c000000,0x0ff00000,0x00000000,RW_NCNB); //mirroed region
SYSTEM_SetMmuMtt(0x04000000,0x07f00000,0x04000000,RW_NCNB);
SYSTEM_SetMmuMtt(0x08000000,0x0bf00000,0x08000000,RW_NCNB); //internal rom
SYSTEM_SetMmuMtt(0x00000000,0x03f00000,0x0c000000,RW_NCNB); //stepping stone
}
SYSTEM_SetMmuMtt(0x10000000,0x17f00000,0x10000000,RW_NCNB); //nCS0
SYSTEM_SetMmuMtt(0x18000000,0x1ff00000,0x18000000,RW_NCNB); //nCS1
SYSTEM_SetMmuMtt(0x20000000,0x27f00000,0x20000000,RW_NCNB); //nCS2
SYSTEM_SetMmuMtt(0x28000000,0x2ff00000,0x28000000,RW_NCNB); //nCS3
SYSTEM_SetMmuMtt(0x30000000,0x37f00000,0x30000000,RW_NCNB); //nCS4
SYSTEM_SetMmuMtt(0x38000000,0x3ff00000,0x38000000,RW_NCNB); //nCS5
// SDRAM (MEM Port0)
SYSTEM_SetMmuMtt(_DRAM0_BaseAddress+0x00000000,_DRAM0_BaseAddress+0x03ffffff,_DRAM0_BaseAddress+0x00000000,RW_NCNB);
// SDRAM (MEM Port1)
SYSTEM_SetMmuMtt(_DRAM_BaseAddress+0x00000000,_DRAM_BaseAddress+0x00f00000,_DRAM_BaseAddress+0x00000000,RW_CB);
SYSTEM_SetMmuMtt(_DRAM_BaseAddress+0x01000000,_DRAM_BaseAddress+0x07e00000,_DRAM_BaseAddress+0x01000000,RW_NCNB);
SYSTEM_SetMmuMtt(_DRAM_BaseAddress+0x07f00000,_DRAM_BaseAddress+0x07f00000,_DRAM_BaseAddress+0x07f00000,RW_CB);
// SFR & Etc
SYSTEM_SetMmuMtt(0x70000000,0x7ff00000,0x70000000,RW_NCNB); //SFR
//TCM
SYSTEM_SetMmuMtt(0x80000000,0x80f00000,0x80000000,RW_NCNB);
SYSTEM_SetTTBase(_MMUTT_BaseAddress);
//DOMAIN1: no_access, DOMAIN0,2~15=client(AP is checked)
SYSTEM_SetDomain(0x55555550|DOMAIN1_ATTR|DOMAIN0_ATTR);
SYSTEM_SetFCSEPID(0x0);
SYSTEM_EnableAlignFault();
SYSTEM_EnableMMU();
SYSTEM_EnableICache();
SYSTEM_EnableDCache(); //DCache should be turned on after MMU is turned on.
SYSTEM_EnableBP();
} |
|