对s3c2440 mmu.c的分析

发布者:CaptivatingEyes最新更新时间:2022-05-23 来源: eefocus关键字:s3c2440  mmu 手机看文章 扫描二维码
随时随地手机看文章

/************************************************

NAME      : MMU.C

DESC   :

Revision : 1.0

************************************************/


#include "def.h"

#include "option.h"

#include "2440addr.h"

#include "2440lib.h"

#include "2440slib.h"

#include "mmu.h"


// 1) Only the section table is used.

// 2) The cachable/non-cachable area can be changed by MMT_DEFAULT value.

//    The section size is 1MB.



extern char __ENTRY[];


void MMU_Init(void)

{

int i,j;

//========================== 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.

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


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();

   

#if 0

//To complete MMU_Init() fast, Icache may be turned on here.

MMU_EnableICache();

#endif

   

MMU_DisableMMU();

MMU_InvalidateTLB();


//MMU_SetMTT(int vaddrStart,int vaddrEnd,int paddrStart,int attr)

//MMU_SetMTT(0x00000000,0x07f00000,0x00000000,RW_CNB); //bank0

MMU_SetMTT(0x00000000,0x03f00000,(int)__ENTRY,RW_CB); //bank0

MMU_SetMTT(0x04000000,0x07f00000,0,RW_NCNB);     //bank0

MMU_SetMTT(0x08000000,0x0ff00000,0x08000000,RW_CNB); //bank1

MMU_SetMTT(0x10000000,0x17f00000,0x10000000,RW_NCNB); //bank2

MMU_SetMTT(0x18000000,0x1ff00000,0x18000000,RW_NCNB); //bank3

//MMU_SetMTT(0x20000000,0x27f00000,0x20000000,RW_CB); //bank4

MMU_SetMTT(0x20000000,0x27f00000,0x20000000,RW_CNB); //bank4 for STRATA Flash

MMU_SetMTT(0x28000000,0x2ff00000,0x28000000,RW_NCNB); //bank5

//30f00000->30100000, 31000000->30200000


//下面3条代码是对s3c2440虚拟地址映射到物理地址(内存)的操作,2440是bank6的。

MMU_SetMTT(0x30000000,0x30100000,0x30000000,RW_CB);   //bank6-1

MMU_SetMTT(0x30200000,0x33e00000,0x30200000,RW_NCNB); //bank6-2

//

MMU_SetMTT(0x33f00000,0x33f00000,0x33f00000,RW_CB);   //bank6-3

MMU_SetMTT(0x38000000,0x3ff00000,0x38000000,RW_NCNB); //bank7

   

MMU_SetMTT(0x40000000,0x47f00000,0x40000000,RW_NCNB); //SFR

MMU_SetMTT(0x48000000,0x5af00000,0x48000000,RW_NCNB); //SFR

MMU_SetMTT(0x5b000000,0x5b000000,0x5b000000,RW_NCNB); //SFR

MMU_SetMTT(0x5b100000,0xfff00000,0x5b100000,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.

}   



// attr=RW_CB,RW_CNB,RW_NCNB,RW_FAULT

void ChangeRomCacheStatus(int attr)

{

int i,j;

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_DisableMMU();

MMU_InvalidateTLB();

MMU_SetMTT(0x00000000,0x07f00000,0x00000000,attr); //bank0

MMU_SetMTT(0x08000000,0x0ff00000,0x08000000,attr); //bank1

MMU_EnableMMU();

MMU_EnableICache();

MMU_EnableDCache();

}   

   


void MMU_SetMTT(int vaddrStart,int vaddrEnd,int paddrStart,int attr)

{

volatile U32 *pTT;

volatile int i,nSec;

pTT=(U32 *)_MMUTT_STARTADDRESS+(vaddrStart>>20);

nSec=(vaddrEnd>>20)-(vaddrStart>>20);

for(i=0;i<=nSec;i++)


       *pTT++=attr |(((paddrStart>>20)+i)<<20);

}


//上面这个函数是分析的重点。vaddrstart是虚拟地址的起始地址,vaddrend是虚拟地址的结束地址,paddrstart是物理地址的开始地址,也就是把内存上从paddrstart开始到距离paddrstart ((vaddrend>>20)-(varrdstart>>20))的这部分内存空间映射到虚拟地址上。


以MMU_SetMTT(0x30000000,0x30100000,0x30000000,RW_CB);   //bank6-1 为例:


虚拟起始地址是0x30000000,结束地址是0x30100000,物理地址是0x3000000,RW_CB是对内存的访问权限控制。从0x30000000(起始地址)到0x300FFFFF的内存是1M,从0x30100000(结束地址)到0x301FFFFF又是1M,因此函数将0x30000000到0x30100000的虚拟地址映射到物理地址0x30000000开始的2M空间。参考下图:

对s3c2440 mmu.c的分析 - chenfang7977 - 在路上

函数中_MMUTT_STARTADDRESS的值是0x33ff8000这是我们从2^32的虚拟地址中取出做为映射物理地址的地址。


pTT=(U32 *)_MMUTT_STARTADDRESS+(vaddrStart>>20);得到的pTT为0x33ff8300,就是说2M的物理地址将从这里开始得到映射 。


nSec=(vaddrEnd>>20)-(vaddrStart>>20);得到的是对Translation Table中段(section)的索引(index),其中每段为1M。这里我们得到的nSec是1。



for(i=0;i<=nSec;i++) //i取到0和1,也就是两个段(2M)


 *pTT++=attr |(((paddrStart>>20)+i)<<20);将物理起始地址的高12位+index做为Translation Table中的section base address,再或上内存权限控制位,而后加上pTT就是最终的虚拟地址,再进入下个循环对下一个块进行映射。内存权限控制位在这里是RW_CB,查mmu.h得知


#define RW_CB   (AP_RW|DOMAIN0|CB|DESC_SEC)    //计算得RW_CB:1100 0001 1110,对应下图中的低12位(AP2位,Domain4位,Domain的值对应协处理器CP15中Control Register3:DOMAIN ACCESS CONTROL REGISTER 16个区域中的一个 ),这里AP是11,表明对supervision和user都是可读可写。Domain是0000,对应Control Register3中的file0(区域0),file0中的两位决定了是否对该内存区域进行访问权限的检查。

对s3c2440 mmu.c的分析 - chenfang7977 - 在路上

C位(write-through (WT)模式)和B位(write-back (WB)模式)不是不能同时为1吗,为什么这里都设置为1???

关键字:s3c2440  mmu 引用地址:对s3c2440 mmu.c的分析

上一篇:s3c2440GPIO程序编写
下一篇:S3C42440之LCD操作

推荐阅读最新更新时间:2024-11-13 10:44

基于89C2051单片机的织机监测器键盘显示装置设计
  1前 言   在嵌入式计算机系统设计中,经常要考虑键盘显示装置的设置问题。尽管有多种方案可以满足键盘显示的要求,但是这些方案都各有其优缺点,比如采用专用的键盘显示器管理芯片8279,在系统的按键及显示器位数较多时是一种好的方案,但目前键盘的设置趋于简单化(即采用一键多用方式或利用增加键和减少键来取代数字键等),因此,一般系统按键不多,其显示器的位数一般也不超过8位。这样,采用 8279由于需要较多的外围 电路 器件,因此显得不是很方便了。而14499是显示器管理芯片,它虽然可以管理四位显示器,但它没有按键管理功能。此外, PS7219是高性能的多位 LED 显示驱动器,可管理8位显示器,并有很强的显示管理功能,如位闪、复位等功
[单片机]
基于89<font color='red'>C</font>2051单片机的织机监测器键盘显示装置设计
C51编译器-语言扩展(4)-函数
Function Declarations函数声明 Cx51对标准C进行了一定的扩展,使用这些扩展可以: (1)把一个函数声明为一个中断过程 (2)选择使用的寄存器组 (3)选择存储器模式 (4)声时可重入 (5)声明外部函数 在函数声中包含这些扩展或属性,使用下面的方法声明Cx51函数 funcname ( ) 这里 return_type 返回值类型 funcname 函数名称 args 参数 small, compact, or large 存储器模式 reentrant 是否可重入 interrupt 是否是中断函数 using
[单片机]
51单片机——LCD1602液晶屏 C语言入门编程
LCD1602: 1602液晶也叫1602字符型液晶,它能显示2行字符信息,每行又能显示16个字符。它是一种专门用来显示字母、数字、符号的点阵型液晶模块。它是由若 干个5x7的点阵字符位组成,每个点阵字符位都可以用显示一个字符, 每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片。 字符代码0x00~0x0F为用户自定义的字符图形RAM(对于5X8点阵的字符,可以存放8组,5X10点阵的字符,存放4组),就是CGRAM了。0x20~0x7F为标准的ASCII码,0xA0~0xFF为日文字符和希腊文字符,其余字符码(0x10~0x1F及0x80~0x9F)没有定义。写入
[单片机]
51单片机——LCD1602液晶屏 <font color='red'>C</font>语言入门编程
ARM 汇编器对C的扩展
__swi void ledtest(); //:声明 edtest 是个软中断。 __asm 内嵌汇编 //:通常在C程序里面需要嵌入汇编代码,这是就可以用__asm关键字来指示编译器下面的代码是用汇编语言来写的, __inline 定义内联函数 //:就像在C语言中用define定义宏一样,用__inline关键字定义的函数在调用的地方被展开,这主要就是为了解决频繁的函数调用开销过大的问题,如果用__inline关键字定义的函数过大,每个调用函数的地方都会将其展开,这样的话在一定程度上也增加代码量,所以说一般用__inline 定义的函数代码量并不是很大。 由于在C语言中无法直接访问COSR, 因此需要通过嵌入
[单片机]
C&K 发布全新密封微型按动开关,高达50,000次使用寿命
高可靠性机电开关的领先制造商 C&K 开发了一种密封微型按动开关。这种开关的 FP11 和 FP12 版本具有高达 50,000 次的延长使用寿命。FP 系列开关通过起动器和衬套之间的 O 形圈完成密封, 能够防止污染。这种密封还可以让自动焊接和清洁得以实现, 从而在组装过程中节省大量的时间和金钱。 多功能 FP 系列按动开关具有多种版本可供选择(垂直和直角安装型;SPST、SPDT、 DPST 和 DPDT;多种盖帽颜色), 通常用于数据通信和电信应用中。 C&K 全球产品经理 Edward Mork 表示:「FP 系列开关将可靠的设计与微型化结合在一起, 以确保持久且高性能的运行。FP 系列开关通过节省 PCB
[网络通信]
<font color='red'>C</font>&K 发布全新密封微型按动开关,高达50,000次使用寿命
三种C51单片机上电复位延时电路图
  下面几种延时复位电路,都是利用在单片机RST引脚上外接一个RC支路的充电时间而形成的。典型复位电路如图(a)所示,其中的阻容值是原始手册中提供的。图(b)是简化后的复位电路,图(c)在图(a)的基础上加上一个二极管D,有助于电容C的快速放电,为下一次上电复位延时做准备。在经历了一系列延时之后,单片机才开始按照时钟源的工作频率,进入到正常的程序运行状态。   
[电源管理]
三种<font color='red'>C</font>51单片机上电复位延时电路图
基于功率晶体管TIP33C和TIP34C的40W功率放大器电路图
这是基于功率晶体管TIP33C和TIP34C为主要部分构建的40W功率放大器的电路图。它采用对称/双电源供电。必须使用散热器来防止晶体管过热。 零件清单: 电阻器: 0,47 欧姆 5 瓦:2 10 欧姆 2W:1 33 欧姆 2W:1 100 欧姆 2W:2 10K 欧姆 2W:1 5,6 欧姆(1/4 瓦):2 120 欧姆:5 220 欧姆:1 470 欧姆:1 1K 欧姆:2 4K7 欧姆:1 6K8 欧姆:1 15K 欧姆:2 电容器: 220uF / 35V : 1 100uF / 50V : 2 10uF / 25V : 2 0,1uF / 100V 聚酯:2 180 pF : 1 100 pF : 1
[嵌入式]
基于功率晶体管TIP33<font color='red'>C</font>和TIP34<font color='red'>C</font>的40W功率放大器电路图
用3DA87C制作调频发射电路
用3DA87C制作调频发射电路 介绍一个用普通三极管3DA87C来制作的远距离调频发射电路,该电路也是普通的三点式振荡电路,文章中说明该远距离发射电路采用大电流发射,在开阔地带可达1KM,笔者购来元件动手按原理图组装试验,元件按文章中的要求,三极管要选用带蓝色点标志的放大倍数要大于80倍,但是在实验中发现它的频率不是落在88-108MHZ正常的调频波段之内,而是无论怎样调整电容和电感,均低于88MHZ的大约是七十几MHZ的频率点上,笔者是TESUN收音机的带电视伴音接收功能的收音机才能正常接收,后来查阅资料发现是该三极管的fT截止频率参数值不够,使其振荡频率提不上去。 为了使发射距离提高而又能使其频率落到正常调频收音机的接收范围之
[模拟电子]
用3DA87<font color='red'>C</font>制作调频发射电路
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved