zoukankan      html  css  js  c++  java
  • DM6446的Bootloader 分类: DSP 2013-07-22 16:29 436人阅读 评论(0) 收藏

    RBL(ARM ROM Boot Loader)在芯片出厂的时候就已经烧写到ROM里了,这不需要大家关心,上电后,RBL会自动从EMIFA EM_CS2 memory space (0x0200 0000). 执行指令,这个地址就是NAND FLASH 或NOR FLASH的片选起始地址。当你的系统设置为NAND BOOT的时候,UBL(User Boot Loader)是必不可少的,否则RBL不能直接把UBOOT给BOOT起来,因为RBL只支持14K NAND FLASH 的BOOT程序,而UBOOT编译出来后的bin文件一般都大于80K,特别是版本越高,UBOOT的代码越大,所以这时候就需要写一个UBL。UBL 从NAND FLASH 读取UBOOT,然后把UBOOT COPY 到DDR2(RAM)的相关地址上,然后把UBOOT 给BOOT 起来。根据TI DAVIN RBL的规定,不同型号的NAND FLASH,UBL保存的地址是不同的,512字节PAGE 的NAND(即SMALL PAGE),保存的地址是:0x00004000(16K,32页);2048字节PAGE的NAND (即LARGE PAGE)保存的地址是:0x20000(128K,64页)。

    一、DM6446的启动模式

    系统加电或复位后,CPU都要从某个预定的地址上取得指令,执行Bootloader程序。DM6446处理器ARM端(ARM-Side)提供两种启动模式:

    ★  从异步的外部存储器接口AEMIF(Asynchronous External Memory Interface)/NOR Flash引导启动

    ★  从ARM内部ROM(AIROM,ARM Inner ROM)引导启动

    这两者由Boot Selection(BTSEL[1:0])引脚的设置状态决定。如下:

    ★  BTSEL[1:0]=01时,系统加电或复位后ARM处理器从AEMIF或NOR Flash的零地址(0x02000000)执行引导启动代码,这些代码是由用户生成并烧写的,即从外部存储器启动

    ★  BTSEL[1:0]≠01时,系统加电或复位后,ARM处理器从AIROM的地址(0x00004000)执行RBL(ROM Boot Loader),即从片内ROM的RBL开始运行

    而RBL程序根据BTSEL[1:0]状态(BTSEL[0-3]管脚的电平)来区分不同引导启动模式:

    ★  BTSEL[1:0]=00,NAND Flash引导启动模式:发送控制信息到UBL(User Boot Loader),并从Flash中拷贝UBL到ARM的内部RAM(AIRAM),并转到UBL执行

    ★  BTSEL[1:0]=11,UART引导启动模式:通过UART下载串口UBL并发送控制信息到用户软件

    ★  BTSEL[1:0]=10,保留未用

             因此,DM6446在上电或复位后,存在四种启动方式。如下图。

    DM6446的Bootloader - 毛毛虫 - 毛毛雨的刻薄

    DM6446引导启动流程

    二、AIROM启动模式

    AIROM启动模式受两个限制:1)、AIRAM的空间只有16KB2)、NAND Flash不支持XIPeXecute-In-Place,片内执行)技术。因此,AIROM启动模式可以划分为三个阶段:

    Stage1:加电或复位后,执行RBLRBLTI内嵌的程序,其内部实现不向用户公开;但提供了一个编程接口,以便设计人员据此编写UBL代码。

    Stage2:将UBL拷贝到AIRAM中并执行。UBL被烧写在NAND Flash的从Block1开始的5个存储块上,因此UBL的尺寸小于AIRAM的空间大小,即14K

    Stage3U-Boot。它被烧写在NAND Flash中的UBL后,由UBL读到DDR2中执行。

    DM6446的Bootloader - 毛毛虫 - 毛毛雨的刻薄

    NAND Flash启动阶段划分

    注:虚线部分为NAND引导启动核心

    三、UBL

    UBL对上与RBL交互,对下要加载运行U-Boot,再由U-Boot加载uImageDDR2中运行,最后将控制权交给操作系统。因此,UBL的重要性不言而喻。

    UBL首先完成系统时钟、DDR频率以及运行环境的初始化,然后复制U-BootDDR,并转到start_armboot

    具体设置如下:

    设置引导配置寄存器BOOTCFG,使BTSEL[1:0]=00,即选择NAND Flash引导启动模式;并根据外部NAND Flash型号设置EM_WIDTH位。在RBLNAND读数据时要根据BOOTCFG的第5位(EM_WIDTH)的值来判断总线宽度和存取数据的大小,EM_WIDTH=0,数据宽度为8位(Bit);EM_WIDTH=1,数据宽度为16位。

    定义NAND UBL描述符,包括魔术数、UBL入口点地址、页面数、起始块号、起始页号等。RBL首先要读取NAND Flash的设备ID以及设备存取信息(即块和页的大小、UBL标识符等,保存在设备信息表中),然后从NAND设备CIS/IDI Block之后(Block1)的第0页开始读取有效的UBL描述符。如果没有找到与默认UBL标识相匹配的UBL,就搜索下一个块,最多连续搜索5个块,以避免NAND设备开始连续的几个块存在坏块的情况(一般不会出现。NAND Flash在出厂前会保证第一块和第二块是好的);如果还是没有适合的UBL,则切换到UART启动模式。

    RBL找到一个有效的UBL时,首先读取并处理UBL描述符,RBL根据描述符信息来决定是否开启EMIFExternal Memory Interface)或I-CacheInstruction-Cache)、是否采用DMA等操作。一旦具备了UBL运行条件,RBL就把UBL拷贝到AIRAM中,并跳转到起始入口地址0x00000020处运行UBL

    UBL将为U-Boot建立运行环境。其主要流程如下:

    DM644xInit初始化硬件平台:屏蔽所有中断,电源/休眠管理控制器复位

    UARTInit串口初始化设置

    PLL1Init,系统锁相环PLL1设置

    PLL2InitDDR,锁相环PLL2设置

    DDR2InitDDR2初始化

    AEMIFInitAEMIF接口初始化

    IVTInit,中断向量表初始化

    NAND_InitNAND初始化,在读BOOTCFG时,如果BTSEl[1:0]=00就调用

    NAND_Copy,拷贝U-Boot代码到DDR2

    拷贝成功,根据NAND_BOOT::entryPoint跳转到U-Boot入口的运行

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Delphi公用函数单元
    Delphi XE5 for Android (十一)
    Delphi XE5 for Android (十)
    Delphi XE5 for Android (九)
    Delphi XE5 for Android (八)
    Delphi XE5 for Android (七)
    Delphi XE5 for Android (五)
    Delphi XE5 for Android (四)
    Delphi XE5 for Android (三)
    Delphi XE5 for Android (二)
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706923.html
Copyright © 2011-2022 走看看