关于ADS下bootloader之MMU的深入研究

发布者:Howard_Sun最新更新时间:2015-04-09 来源: cechina关键字:ADS  bootloader  MMU 手机看文章 扫描二维码
随时随地手机看文章
如下是ADS下的boot的MMU.c的MMU初始化代码。在2440init.S中跳入Main,这个Main函数在U2440mom.c中实现,这个Main函数包括了对端口,中断服务,MMU,VGA等的初始化函数的调用。MMU.c中进行了MMU的初始化,其中调用了很多初始化函数,使用汇编写的,确切的说是用协处理指令写的。这些函数的声明部分在2440slib.h,实现在2440slib.c中。在MMU的初始化程序MMU_Init中,首先禁止了Dcache,Icache,清除了Dcache和Icache。禁止了MMU,TLB。然后对存储系统进行了虚拟地址到物理地址的映射。然后设置了转化表的基地址,设置了域,开启了MMU,Icache,Dcache。

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
    if(rBWSCON&0x6)//nor启动
                   MMU_SetMTT(0x00000000,0x07f00000,0x00000000,RW_NCNB);   //bank0
           else//nand 启动
                   MMU_SetMTT(0x00000000,0x00001000,0/*(int)__ENTRY*/,RW_CB);   //bank0
    //MMU_SetMTT(0x04000000,0x07f00000,0,RW_NCNB);                          //bank0
    MMU_SetMTT(0x08000000,0x0ff00000,0x08000000,RW_NCNB);  //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_NCNB); //bank4 for STRATA Flash
    MMU_SetMTT(0x28000000,0x2ff00000,0x28000000,RW_NCNB); //bank5
    MMU_SetMTT(0x30000000,0x30100000,0x30000000,RW_CB);          //bank6-1   1
    MMU_SetMTT(0x30200000,0x33e00000,0x30200000,RW_NCNB); //bank6-2      60
    //
    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           127
    MMU_SetMTT(0x48000000,0x5af00000,0x48000000,RW_NCNB); //SFR           303
    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.
}    

for(i=0;i<64;i++)
            for(j=0;j<8;j++)
                MMU_CleanInvalidateDCacheIndex((i<<26)|(j<<5));
    MMU_InvalidateICache(); 

这里是因为ARM920T有64路,每路有8个组。所以。。。为什么要i<<26,j<<5呢,看下图便知




[page]







这是一个MMU的虚拟地址向物理地址映射的函数。通过上边的调用可以看到物理地址和虚拟地址的地址是相同的,那为什么还要开MMU呢,不是多此一举吗,Dcache的开启必须在MMU开启后才能开启,Icache不受MMU影响。开启Cache对系统性能会有很大提升。所以,哈哈。这里_MMUTT_STARTADDRESS是转换表的基址,因为没有使用复杂的操作系统,所以只使用了一级页表,每个页表项对应的是一个1MB的段。pTT=(U32 *)_MMUTT_STARTADDRESS+(vaddrStart>>20);相当于获得相应的页表项。看一下下图就会明白。nSec=(vaddrEnd>>20)-(vaddrStart>>20);这句是计算有几个段。for(i=0;i<=nSec;i++)*pTT++=attr |(((paddrStart>>20)+i)<<20);分别映射每段。Attr是域。


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










这里就不列出那些被调用的汇编代码,这个是飞凌的boot,网上好多人说没开MMU,真是误人子弟啊。
关键字:ADS  bootloader  MMU 引用地址:关于ADS下bootloader之MMU的深入研究

上一篇:使用电位计替代旋转开关
下一篇:CPU卡应用方案和密码管理技术

推荐阅读最新更新时间:2024-03-16 13:57

ARM+Linux嵌入式系统的BootLoader设计
由Boot Loader和固化在固件(firmware)中的Boot代码(可选)共同组成一个嵌入式系统的引导加载程序。它的作用和功能就像固化到计算机内主板上的一个ROM芯片程序BIOS(basIC input output system)。但是它一般不配置像BIOS那样的固件程序,这是因为要考虑经济方面的原因,因此必须自己完成这方面的工作。Boot Loader可以初始化硬件设备,建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。它的实现严重地依赖于硬件,特别是在嵌入式系统中,即使基于同一个CPU的Boot Loader,对于不同的板子,也有很大的不同。   1
[单片机]
ARM+Linux嵌入式系统的<font color='red'>BootLoader</font>设计
基于CPLD的OMAP-L137与ADS1178数据通信设计
   引 言   串行外围设备接口(Serial Peripheral Interface,SPI)总线技术是Motorola公司推出的一种高速同步串行输入/输出接口,近年来广泛应用于外部移位寄存器、D/A转换器、 A/D转换器、串行EEPROM、 LED 显示器等外部设备的拓展。SPI总线是一种三线同步总线(CLK、SI-MO、SOMI),可以共享,便于组成带多个SPI接口的控制系统。其传输速率可编程,连接线少,具有良好的拓展性。    ADS1178 是一款典型的具有SPI接口的A/D转换器,它可以方便地与带有SPI接口的处理器或控制器相连接。 OMAP -L137是一款处理能力强、外接存储空间大、集成度高、外设管理方便的
[单片机]
基于CPLD的OMAP-L137与<font color='red'>ADS</font>1178数据通信设计
基于LPC2378和ADS112的视频矩阵切换装置设计
目前,国内使用的视频矩阵切换系统一般规模较小,并且大多数通过RS232串口连接的键盘来控制视频矩阵的切换,实施远程操控很繁琐。 本文采用NXP公司基于ARM7的微控制器LPC2378与ADI公司的视频矩阵切换芯片ADS112构成了视频矩阵切换装置,实现了具有以太网接口的64路视频输入、8路视频输出的视频矩阵。监控中心可以通过网络传输的方式将视频切换控制命令和云台操作控制命令发送给LPC2378,再由LPC2378根据协议处理上位机发来的命令数据,控制视频矩阵和摄像机云台。这样,操作人员可以使用可视化的上位机,通过以太网对视频进行切换。在上位应用软件的支持下,该系统具有自动、循环切换视频的功能,并且可以通过网络通信的方式,在远端对
[单片机]
基于LPC2378和<font color='red'>ADS</font>112的视频矩阵切换装置设计
s3c2440 ads程序移植到keil中(一) 初步完成
1 与其他工程一直一样 直接加入工程进行编译 2440init.s(8): error: A1023E: File option.inc could not be opened: 等错误 直接把option.inc Memcfg.inc 2440addr.inc 直接放在2440init.s的目录中 然后编译 当前记过错误消失 出现 .led.axf: Error: L6238E: 2440init.o(Init) contains invalid call from '~PRES8 (The user did not require code to preserve 8-byte aligment o
[单片机]
s3c2440 <font color='red'>ads</font>程序移植到keil中(一) 初步完成
S3C2410快速启动的实现
  嵌入式系统对功能、可靠性、成本、体积、功耗等均有严格要求,以ARM体系结构为基础的各种RISC微处理器具有灵活的特性和强大的性能,在嵌入式系统中得到了广泛的应用。---S3C2410是三星公司基于ARM920T设计的一款处理器,在开发基于S3C2410的系统的过程中,如何让系统快速稳定地启动是一个重要问题。嵌入式系统的资源有限,程序通常都是固化在ROM中运行。但在实际应用中,为提高系统的实时性,加快代码的执行速度,系统启动后程序往往要被搬移到RAM中,因为RAM的存取速度要比ROM快得多,这样大大提升系统的性能。启动程序要完成的任务包括:硬件初始化,系统存储系统的配置,复制二级中断向量表。   启动程序过程   系统硬件初
[单片机]
【dsPIC33E】Bootloader(一)Bootloader的介绍与Flash结构
对于嵌入式开发而言,Bootloader几乎与操作系统同等重要,它可以让我们摆脱MCU官方工具,定制自己的烧录工具,不仅提高产品辨识度,同时也大大减少了对外引脚数量(例如兼容通信的Uart或CAN等,而不需要另外接JTAG)。 要开发Bootloader,相对于普通程序,是有一定难度的,这其中涉及到MCU的工作原理、内部存储结构等,而且仅仅依靠C语言可能无法完成,有时需要配合汇编来精确执行特殊指令(例如Flash擦写)。 一般MCU的机器码都是存储在Flash中,MCU启动时PC指针会从内部Flash第一个地址开始读取指令运行,这个过程我们一般无法干涉。但由于我们写的代码存于Flash中,所以一旦从Flash启动,后续操作
[单片机]
【dsPIC33E】<font color='red'>Bootloader</font>(一)<font color='red'>Bootloader</font>的介绍与Flash结构
14位125Msps模数转换器ADS5500及其应用
  1、 概述:近年来,随着数字信号处理技术的迅速发展和新理论、新算法的不断涌现,加之数字信号处理器件性能的全面提高,使实际系统对模数转换器的要求越来越高。因此,在实际的应用中,一般都要求模数转换器必须同时具备很高的采样率和精度、很大的动态范围、极宽的频率响应范围和灵活的数字接口。   2、ADS5500是德克萨斯仪器公司(Texas Instruments)开发的一款14位分辨率、125MSPS采样速率的高性能模数转换器,芯片为64引脚TQFP PowerPAD封装。为实现更高的系统集成度,其内部还包括有宽带宽的线性采样/保持和内部基准电压源的完整转换解决方案。100MHz时ADS5500的信噪比(SNR)为70dB,无失真
[模拟电子]
如何编译文件得到的bootloader的.hex文件(例如:atmega328p)
一、打开Arduino ide的文件存放位置,本人是将其放在D盘的Arduino中 在D:Arduinoarduinohardwarearduinoavrbootloadersoptiboot文件中 你会看到有omake,omake.bat,Makefile,以及.h,.c,.hex等文件。而其中的optiboot_atmega328.hex文件就是atmega328p的bootloader,其就是 arduino ide 中为arduino uno板子烧录的bootloader(如何烧录引导程序bootloader,请问度娘) 二、准备工作:移除optiboot_atmega328.hex文件(移除前做好备份)
[单片机]
如何编译文件得到的<font color='red'>bootloader</font>的.hex文件(例如:atmega328p)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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