mmu的初始化程序,我查了很久都没有找到一个系统的学资料,现发出初始化原代码,希望,各位高手能分析一下程序中各函数的作用,初始化流程.这也会为以后的初学者有很大帮助的,谢谢!<br /> ************************************************/<br /><br />#include "../inc/def.h"<br />#include "../inc/config.h"<br />#include "../inc/board.h"<br />#include "../inc/utils.h"<br />#include "../inc/slib.h"<br />#include "../inc/mmu.h"<br /><br />// 1) Only the section table is used. <br />// 2) The cachable/non-cachable area can be changed by MMT_DEFAULT value.<br />// The section size is 1MB.<br /><br />void MMU_DCacheCleanAll(void)<br />{<br /> int i, j;<br /> <br /> //If write-back is used,the DCache should be cleared.<br /> for(i=0; i<64; i++)<br /> for(j=0; j<8; j++)<br /> MMU_CleanDCacheIndex((i<<26)|(j<<5));<br /> __asm {<br /> mov r0, #0<br /> mcr p15, 0, r0, c7, c10, 4 // drain WB<br /> }<br />}<br /><br />void MMU_DCacheCleanInvalidateAll(void)<br />{<br /> int i, j;<br /> <br /> //If write-back is used,the DCache should be cleared.<br /> for(i=0; i<64; i++)<br /> for(j=0; j<8; j++)<br /> MMU_CleanInvalidateDCacheIndex((i<<26)|(j<<5));<br /> __asm {<br /> mov r0, #0<br /> mcr p15, 0, r0, c7, c10, 4 // drain WB<br /> }<br />}<br /><br />void MMU_Init(MMU_Table table[])<br />{<br /> //========================== IMPORTANT NOTE =========================<br /> //The current stack and code area can't be re-mapped in this routine.<br /> //If you want memory map mapped freely, your own sophiscated MMU<br /> //initialization code is needed.<br /> //===================================================================<br /><br /> MMU_DisableDCache();<br /> MMU_DisableICache();<br /> MMU_InvalidateDCache(); //invalidate data cache all<br /> MMU_DCacheCleanInvalidateAll();<br /> MMU_InvalidateICache();<br /> <br /> #if 0<br /> //To complete MMU_Init() fast, Icache may be turned on here.<br /> MMU_EnableICache(); <br /> #endif<br /> <br /> MMU_DisableMMU();<br /> MMU_InvalidateTLB();<br /> <br /> for(; table->vEnd; table++)<br /> MMU_SetMTT(table->vStart, table->vEnd, table->pStart, table->attr);<br /> <br /> MMU_SetTTBase(_MMUTT_STARTADDRESS);<br /> MMU_SetDomain(0x55555550|DOMAIN1_ATTR|DOMAIN0_ATTR); <br /> //DOMAIN1: no_access, DOMAIN0,2~15=client(AP is checked)<br /> MMU_SetProcessId(0x0);<br /> MMU_EnableAlignFault();<br /> <br /> MMU_EnableMMU();<br /> MMU_EnableICache();<br /> MMU_EnableDCache(); //DCache should be turned on after MMU is turned on.<br />} <br /><br />// attr=RW_CB,RW_CNB,RW_NCNB,RW_FAULT<br />void ChangeRomCacheStatus(int attr)<br />{<br /> int i,j;<br /> MMU_DisableDCache();<br /> MMU_DisableICache();<br /> //If write-back is used,the DCache should be cleared.<br /> for(i=0;i<64;i++)<br /> for(j=0;j<8;j++)<br /> MMU_CleanInvalidateDCacheIndex((i<<26)|(j<<5));<br /> MMU_InvalidateICache();<br /> MMU_DisableMMU();<br /> MMU_InvalidateTLB();<br /> MMU_SetMTT(0x00000000,0x07f00000,0x00000000,attr); //bank0<br /> MMU_SetMTT(0x08000000,0x0ff00000,0x08000000,attr); //bank1<br /> MMU_EnableMMU();<br /> MMU_EnableICache();<br /> MMU_EnableDCache();<br />} <br /><br />void MMU_SetMTT(U32 vaddrStart, U32 vaddrEnd, U32 paddrStart, int attr)<br />{<br /> U32 *pTT;<br /> int i, nSec;<br /> <br /> pTT = (U32 *)_MMUTT_STARTADDRESS+(vaddrStart>>20);<br /> nSec = (vaddrEnd>>20)-(vaddrStart>>20);<br /> for(i=0; i<=nSec; i++)<br /> *pTT++ = attr|(((paddrStart>>20)+i)<<20);<br />}<br /> |
|