mini2440裸机之MMU(二)(mmu.c)

发布者:灵感发电站最新更新时间:2022-05-18 来源: eefocus关键字:mini2440  裸机  MMU  mmu 手机看文章 扫描二维码
随时随地手机看文章

/************************************************ 
  NAME    : MMU.C
  DESC   :
  Revision: 2002.2.28 ver 0.0
 ************************************************/

#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
//段(section)是大小为1MB的存储块
// 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.段大小为1MB


extern char __ENTRY[]; 

void MMU_Init(void)
{
    int i,j;
     //========================== IMPORTANT NOTE =========================
    这段程序不能实现当前堆栈和代码区域的重新映射,假如你想让存储区域自由

    映射,需要你自己编写一个细致入微的MMU初始化代码

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

    MMU_DisableDCache();  //禁止数据高速缓存
    MMU_DisableICache();  //禁止指令高速缓存

     //要使用回写操作,一定要对DCache进行清除

 ---------------------------------------------------------------------------------------
|    for(i=0;i<64;i++)            !!!!  我要详细讲解这段!!!!                       |
|     for(j=0;j<8;j++)                                                                   |
|         MMU_CleanInvalidateDCacheIndex((i<<26)|(j<<5));  //使整个DCache的数据无效       |
|    MMU_InvalidateICache();   //使整个指令Cache无效                                      |
|                                                                                        |

 ---------------------------------------------------------------------------------------   
    #if 0
     //为了快速完成MMU_Init(), Icache在这打开
    MMU_EnableICache(); 
    #endif
    
    MMU_DisableMMU();     //禁止MMU
    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

  ///Strata Flash是Intel的NOR型闪存
    MMU_SetMTT(0x28000000,0x2ff00000,0x28000000,RW_NCNB);  //bank5
     //30f00000->30100000, 31000000->30200000

    //下面3条代码是对s3c2440虚拟地址映射到物理地址(内存)的操作,2440的SDRAM是bank6
    MMU_SetMTT(0x30000000,0x30100000,0x30000000,RW_CB);    //bank6-1   1M
    MMU_SetMTT(0x30200000,0x33e00000,0x30200000,RW_NCNB);  //bank6-2  60M
    MMU_SetMTT(0x33f00000,0x33f00000,0x33f00000,RW_CB);    //bank6-3  
    MMU_SetMTT(0x38000000,0x3ff00000,0x38000000,RW_NCNB);  //bank7    127M
    
    MMU_SetMTT(0x40000000,0x47f00000,0x40000000,RW_NCNB);  //SFR      127M
    MMU_SetMTT(0x48000000,0x5af00000,0x48000000,RW_NCNB);  //SFR      303M
    MMU_SetMTT(0x5b000000,0x5b000000,0x5b000000,RW_NCNB);  //SFR
    MMU_SetMTT(0x5b100000,0xfff00000,0x5b100000,RW_FAULT); //not used 如果应用层访问到该区域MMU会报错

    
    MMU_SetTTBase(_MMUTT_STARTADDRESS);   //写转换表基地址到C2
    MMU_SetDomain(0x55555550|DOMAIN1_ATTR|DOMAIN0_ATTR);  //写域访问控制位到C3

      //上句最后C3中内容为0101 0101 0101 0101 0101 0101 0101 0001
      //DOMAIN1: no_access, DOMAIN0,2~15=client(AP is checked)
    MMU_SetProcessId(0x0);  //关闭FCSE(快速上下文切换)
    MMU_EnableAlignFault();  //开启对齐检测
     
    MMU_EnableMMU();     //使能MMU
    MMU_EnableICache();  //使能ICache
    MMU_EnableDCache();  //当MMU打开后,DCache必须要打开

}   


// attr=RW_CB,RW_CNB,RW_NCNB,RW_FAULT


void ChangeRomCacheStatus(int attr)
{
    int i,j;
    MMU_DisableDCache();  //禁止数据高速缓存
    MMU_DisableICache();  //禁止指令高速缓存
     //要使用回写操作,一定要对DCache进行清除

    for(i=0;i<64;i++)
     for(j=0;j<8;j++)
         MMU_CleanInvalidateDCacheIndex((i<<26)|(j<<5));  //使整个DCache的数据无效
    MMU_InvalidateICache();     //使整个指令Cache无效
    MMU_DisableMMU();   //禁止MMU
    MMU_InvalidateTLB();  //使快表无效
    MMU_SetMTT(0x00000000,0x07f00000,0x00000000,attr);  //bank0
    MMU_SetMTT(0x08000000,0x0ff00000,0x08000000,attr);  //bank1
    MMU_EnableMMU();   //使能MMU
    MMU_EnableICache();  //使能ICahe
    MMU_EnableDCache();  //当MMU打开后,DCache必须要打开
}    
//设置页表函数
//vaddrStart:虚拟起始地址
//vaddrEnd:虚拟结束地址
//paddrStart:物理起始地址
//attr:访问属性
//虚拟存储空间到物理存储空间的映射是以内存块为单位的:分为1MB/64KB/4KB/1KB
//虚拟存储空间中的一块连续的存储空间被映射成物理存储空间中同样大小的一块连续
//存储空间页表中,每一个地址变换条目实际上就记录了一个虚拟存储空间的存储块的基
//地址与物理存储空间相应的一个存储块的基地址的对应关系


     
void MMU_SetMTT(int vaddrStart,int vaddrEnd,int paddrStart,int attr)
{
    volatile U32 *pTT;   //定义了页表的指针
    volatile int i,nSec;
    pTT=(U32 *)_MMUTT_STARTADDRESS+(vaddrStart>>20);  //由于内存块是1M(20bit),写页表的基地址
    nSec=(vaddrEnd>>20)-(vaddrStart>>20);             // nSec:段大小
    for(i=0;i<=nSec;i++)*pTT++=attr |(((paddrStart>>20)+i)<<20);
//页表存储访问信息和存储块的基地址
//(((paddrStart>>20)+i)<<20) :对应的物理内存页的地址
// attr:访问权限和缓冲属性
}

 

参考网址: 

http://bbs.21ic.com/icview-127516-1-1.html

http://blog.csdn.net/woshixingaaa/article/details/6255870

http://blog.sina.com.cn/s/blog_651c92d3010107qr.html

http://6xudonghai.blog.163.com/blog/static/336406292008724103317304/
 


关键字:mini2440  裸机  MMU  mmu 引用地址:mini2440裸机之MMU(二)(mmu.c)

上一篇:mini2440LED驱动程序开发
下一篇:s3c2440 内存管理单元MMU学习笔记

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

C&K 继 RK 系列之后推出 RKC2 轻触开关
RKC2 系列轻触开关是车钥匙、医疗设备和小型电子设备的完美解决方案 马萨诸塞州沃尔瑟姆 — 2021 年 9 月 23 日 — 作为全球最大的开关解决方案供应商, C&K 自豪地宣布继 RK 系列之后推出 RKC2 系列轻触开关, 以满足更多市场需求。RKC2 是一款小型开关, 非常适合高度作为一大制约因素的应用场合, 而且有四种不同的操作力度可供选择。 RKC2 开关是为车钥匙、物联网设备、可穿戴设备、手机、高端消费和医疗设备等小型电子设备开发的。凭借小尺寸 (3.5 x 2.7mm), RKC2 成为追求空间效率的设计方案的上佳选择。RKC2 的高度只有1.7mm, 因此印刷电路板可以紧贴应用设备的表面, 为其
[电源管理]
<font color='red'>C</font>&K 继 RK 系列之后推出 RKC2 轻触开关
锤子两款新机通过3C认证 或定位中端市场
此前,锤子科技CEO罗永浩曾表示锤子将会在今年春季推出定位中端的智能手机,现在就有两款锤子手机通过了3C验证。   文件显示,通过验证的手机代号为OD103和OD105,其快充规格最高可达24W,也就是说锤子新机还将支持旗舰机都在采用的高通 QuickCharge 3.0 快充功能。 锤子两款新机通过3C认证 或定位中端市场   此外有消息称锤子近期正在布局线下专卖店,看来,锤子科技也要跟随小米的道路,大力发展线下产业。锤子CEO曾表示随着手机市场开始趋于饱和,市场将会出现只会购买越来越贵的手机的趋势,锤子将会在接下来的日子砍掉千元机系列。因而这两款智能手机的价格极有可能会超过1000元。   不仅如此,锤子未来还将布局一系列
[手机便携]
示波器分析I2C时序波形图
对于嵌入式开发的朋友来说,I2C协议实在是再熟悉不过了,有太多的器件,采用的都是通过I2C来进行相应的设置。今天,我们就随便聊聊这个I2C协议。 I2C协议中最重要的一点是I2C地址。这个地址有7位和10位两种形式。7位能够表示127个地址,而在实际使用中基本上不会挂载如此多的设置,所以很多设备的地址都采用7位,所以本文接下来的说明都是基于此。 I2C还有一个很重要的概念,就是“主—从”。对于从设备来说,它是啥都不干的,更不会自动发送数据;而主设备,则是起到控制作用,一切都是从它开始。 除了GND以外,I2C有两根线,分别是SDA和SCL,所有的设备都是接到这两根线上。那么,这些设备如何知道数据是发送给它们呢?这就得依
[测试测量]
mini2440之启动机制
arm core:为执行汇编程序的核心部件 rom:厂家固化的代码,用于在arm上电后执行,将nand flash中大小如sram的前面代码(bootloader代码)拷贝到sram中,并cpu跳到sram的0x0位置 sram:在执行nand flash中前小段代码(4kb左右),初始化sdram/ddr,并将nand flash中剩余的bootloader代码拷贝到sdram中,最后跳入sdram中继续执行 sdram:即为内存,当从sram中进入sdram后,开始执行bootloader的其余代码,加载内核到内存(内核存在于内存),加载完后进入内核继续正常运行 Nor flash:带有通用的sram的接口,可以直接访问内存,
[单片机]
<font color='red'>mini2440</font>之启动机制
AT89C5x(AT89S5x)系列单片机概述
MCS-51系列单片机的代表性产品为8051,其他单片机都是在8051的基础上进行功能的增减。20世纪80年代中期以后,Intel公司已把精力集中在高档CPU芯片的开发、研制上,逐渐淡出单片机芯片的开发和生产。由于MCS-51系列单片机设计上的成功以及较高的市场占有率,以MCS-51技术核心为主导的单片机已经成为许多厂家、电气公司竞相选用的对象,并以此为基核。因此,Intel公司以专利转让或技术交换的形式把8051的内核技术转让给了许多半导体芯片生产厂家,如ATMEL、Philips、Cygnal、ANALOG、LG、ADI、Maxim、DEVICES、DALLAS等公司。这些厂家生产的兼容机与8051的内核结构、指令系统相同
[单片机]
AT89<font color='red'>C</font>5x(AT89S5x)系列单片机概述
基于s3c2410 2.6.25内核cs8900网卡驱动的移植
因为在驱动中使用的是虚拟地址,因此要首先将网卡的物理地址映射到虚拟地址 ************************************************************** 1 。在include/asm-arm/plat-s3c24xx/common-smdk.h文件中添加 其中必须使用宏__phys_to_pfn 即将物理地址右移12位,跟踪源码可知 与struct map_desc中的pfn相关 #define pSMDK2410_ETH_IO __phys_to_pfn(0x19000000) #define vSMDK2410_ETH_IO S3C2410_ADDR(0x04000000) #de
[单片机]
三、RS-232C机械连接器及引脚定义
目前,大部分计算机的RS-232C通信接口都使用了DB9连接器,如上面图中所示,主板的接口连接器有9根针输出(RS-232公头),也有些比较旧的计算机使用DB25连接器输出,下面我们来介绍DB9和DB25输出接口的引脚定义。 RS-232C串口引脚定义表 9针RS-232串口(DB9) . 25针RS-232串口(DB25) 引脚 简写 功能说明 引脚 简写 功能说明 1 CD 载波侦测(Carrier Detect) 8 CD 载波侦测(Carrier Detect) 2
[嵌入式]
AT89S51单片机与82C55的接口设计编程
  1.硬件接口电路      下图所示为AT89S51单片机扩展一片82C55的电路图。图中,74LS373是地址锁存器,P0.1、P0.0经74LS373与82C55的地址线A1、A0连接;P0.7经74LS373与片选端CS相连,其他地址线悬空;82C55的控制线RD(的反)、WR(的反)直接与AT89S51单片机的RD(的反)和WR(的反)端相连;AT89S51单片机的数据总线P0.0~P0.7与82C55的数据线D0~D7连接。      2.确定82C55端口地址      图中82C55只有3条线与AT89S51单片机的地址线相接,片选端CS、端口地址选择端Al、A0,分别接于P0.7、P0.1和P0.0,其他地址线
[单片机]
AT89S51单片机与82<font color='red'>C</font>55的接口设计编程
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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