mmu的初始化程序解析

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

AND

别外,我这几天搜了一些MMU的学习资料,有的很不错,要的留下邮箱
leo1983 发表于 2008-8-7 20:13 | 显示全部楼层

leo20012245@gmail.com

  
南方老色狼 发表于 2008-8-8 08:55 | 显示全部楼层

我要!谢谢

linjunfeng99@163.com
程序匠八 发表于 2008-8-8 09:44 | 显示全部楼层

MMU这个东西看了头都大了

boydsc@1226.com&nbsp;谢谢
rayzhong 发表于 2008-8-8 17:03 | 显示全部楼层

re

也给我一份&nbsp;谢谢<br />rayzhongr@126.com
 楼主| diyzhangy 发表于 2008-8-8 19:11 | 显示全部楼层

发了

5楼,发是是..@126.com<br />
sang_sang 发表于 2008-8-11 20:41 | 显示全部楼层

请也给我一份

sangsang512@sina.com
xielihong 发表于 2008-8-13 16:46 | 显示全部楼层

我也要一份

xiliho221@163.com<br />对mmu也是头大中,我也要一份,谢谢了<br />希望能够渐渐明白
景雯 发表于 2008-9-12 10:44 | 显示全部楼层

正在研究

麻烦给我一份,mosquite7@sina.com
01dxwlm 发表于 2008-9-13 19:03 | 显示全部楼层

麻烦发分给我啊

smalf@sina.com
avocationA 发表于 2008-9-13 22:27 | 显示全部楼层

要一分

fengyeuzou@126.com
robertc 发表于 2008-9-14 00:31 | 显示全部楼层

回复主题:mmu的初始化程序解析

我也要一份&nbsp;chenwei366@163.com
FActzero 发表于 2008-9-14 11:11 | 显示全部楼层

谢谢!

azlinzhi@yahoo.com.cn
01dxwlm 发表于 2008-9-17 15:04 | 显示全部楼层

我也要一份

smalf@sina.com&nbsp;<br />
freewing 发表于 2008-9-23 16:12 | 显示全部楼层

mmu 难, 我也要一份

我也要一份&nbsp;738879104@qq.com&nbsp;。谢谢!<br /><br />有个2410完全开发手册里边也有简单介绍到这个。不过没有深入。<br />http://www.embedsky.net/technical/view_014.html<br /><br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

92

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部