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

分类: 嵌入式

http://blog.chinaunix.net/uid-26435987-id-3082166.html(转)

/************************************************ 
  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/

时间: 2024-12-08 15:25:03

mini2440裸机之MMU(二)(mmu.c) (转)的相关文章

mini2440裸机试炼之—RTC闹钟中断,节拍中断

环境搭建 硬件环境:J-link v8.mini2440.J-link转接板.串口转USB线 软件环境:windows7(32位).开发板uboot(NandFlash).J-link驱动(J-Link ARM V4.10i).SecureCRT.ADS1.2 其中ADS里的AXD设置:加载JlinkRDI.dll+Options->Configure Interface...,在Session File一页中选择"Run Configuration Script",将该name

mini2440裸机试炼之IIS——音乐播放器

IIS 信号频率设置 IIS(Inter-IC Sound)由飞利浦公司开发,是一种常用的音频设备接口,主要用于CD.MD.MP3等设备. s3c2440一共有5个引脚用于IIS:IISDO.IISDI.IISSCLK.IISLRCK和CDCLK.前两个引脚用于数字音频信号的输出和输入,另外三个引脚都与音频信号的频率有关,可见要用好IIS,就要把信号频率设置正确. IISSCLK为串行时钟,每一个时钟信号传送一位音频信号.因此IISSCLK的频率=声道数×采样频率×采样位数,如采样频率fs为44

mini2440裸机试炼之——Uart与pc端实现文件、字符传输

1.  波特率(Baud rate)即调制速率,1波特即指每秒传输1个符号. 2.  非FIFO模式,即传输数据不利用FIFO缓存,一个字节一个字节地传输. 3.  接收到的数据是放到接收缓存器URXHn中,要发送数据时,是把数据放入发送缓存器UTXHn中.由于UART是通过字节方式传输数据的,因此要区分是大端模式还是小端模式,也就是说这两个寄存器在这两种模式下,所在的地址是不同.为了了解当前数据传输的各种状态,还需要一些状态寄存器.传输状态寄存器UTRSTATn非常有用,它的第0位可以用来判断

mini2440裸机试炼之——整合

mini2440裸机试炼系列先在这里落尾了,写了一个裸机整合的系统,各功能的代码在之前都有介绍的 目录视图: 整合的bin文件下载

mini2440裸机试炼之——看门狗中断和复位操作

看门狗的工作原理: 设本系统程序完整运行一周期的时间是Tp,看门狗的定时周期为Ti,Ti>Tp,在程序正常运行时,定时器就不会溢出,若由于干扰等原因使系统不能在Tp时刻修改定时器的记数值,定时器将在Ti时刻溢出,引发系统复位,使系统得以重新运行,从而起到监控的作用. 看门狗具有两个功能: 1. 当做常规时钟,可以产生中断: 2. 当看门狗定时器使用,当计数器WTCNT为0时,产生复位: 看门狗的功能方框图: 我程序中PCLK为50MHz,预分频值=77,时钟除数因子选128, 时钟周期t_wat

mini2440裸机之MMU(一)(mmu.h) (转)

分类: 嵌入式 http://blog.chinaunix.net/uid-26435987-id-3082165.html(转)  s3c2440 MMU.pdf  下后改为ppt格式才能看 /********************************************************************   NAME    : MMU.H  DESC    :  Revision: 02.28.2002 ver 0.0 ************************

mini2440裸机试炼之——DMA直接存取 实现Uart(串口)通信

这个只能作为自己初步了解MDA的开门篇 实现功能: 将字符串数据通过DMA0通道传递给UTXH0,然后在终端 显示.数据传输完后,DMA0产生中断,beep声, LED亮. DMA基本知识 计算机系统中各种常用的数据输入/输出方法有查询方式(包括无条件及条件传送方式)和中断方式,这些方式适用于CPU与慢速及中速外设之间的数据交换.但当高速外设要与系统内存或者要在系统内存的不同区域之间进行大量数据的快速传送时,就在一定程度上限制了数据传送的速率.直接存储器存取(DMA)就是为解决这个问题提出的,采

mini2440裸机音乐播放器(很久以前的笔记)

[这是好久以前写的,有点乱,没时间整理,当做记录用的.] 图片粘贴失效,没上传图,想要的直接下载文档吧. 项目目的:通过IIS,触摸屏,LCD模块实现音乐播放器功能(按钮上一首.下一首.播放.暂停的音频控制功能,并实现播放歌曲时显示相应的歌曲图片,不播放时显示hello music图片) 项目设备:windows7(32位),mini2440,uboot(nandflash),ADS1.2开发环境,jlink v8,耳机: 功能模块LCD.触摸屏.IIS 分别介绍: Main函数中主频设置: U

裸机实验预备(二)---分别使用dnw和SD卡来下载程序

我们现在正在做的包括以后做的裸机实验,是不涉及到bootloader和os的,整个裸机程序能运行的原理就是:我们把裸机程序当作是uboot的BL1,让iROM中的固化代码将其复制到内部的iRAM中运行.当选择usb启动的时候,由于不需要加头部信息,所以可以直接使用裸机程序,而选择sd/mmc通道启动时,需要为裸机程序加上头部校验信息. 使用dnw下载程序: 使用dnw下载程序的方式很简单,连接好dnw工具后,还需要设置好下载地址,由于裸机程序会被加载到iRAM中运行,所以需要设置下载地址为0xd