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入口的运行

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

  • 相关阅读:
    CSS居中方法搜集
    函数表达式与函数声明的一点区别
    z-index 解析
    Android EditText的输入监听,输入字符的动态获取
    dispatchkeyevent的调用机制
    自定义带有图片的PreferenceActivity
    declare-styleable:自定义控件的属性
    在fragment中调用SharedPreferences
    使用Preference保存设置
    getSharedPreferences()与getSharedPreferences()与getDefaultSharedPreferences()的区别
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706923.html
Copyright © 2011-2022 走看看