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引导启动流程

二、AIROM启动模式

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

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

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

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

NAND Flash启动阶段划分

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

三、UBL

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

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

具体设置如下:

◎ 设置引导配置寄存器BOOTCFG,使BTSEL[1:0]=00,即选择NAND Flash引导启动模式;并根据外部NAND Flash型号设置EM_WIDTH位。在RBL从NAND读数据时要根据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根据描述符信息来决定是否开启EMIF(External Memory Interface)或I-Cache(Instruction-Cache)、是否采用DMA等操作。一旦具备了UBL运行条件,RBL就把UBL拷贝到AIRAM中,并跳转到起始入口地址0x00000020处运行UBL。

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

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

△ UARTInit,串口初始化设置

△ PLL1Init,系统锁相环PLL1设置

△ PLL2InitDDR,锁相环PLL2设置

△ DDR2Init,DDR2初始化

△ AEMIFInit,AEMIF接口初始化

△ IVTInit,中断向量表初始化

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

△ NAND_Copy,拷贝U-Boot代码到DDR2中

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

DM6446的Bootloader的更多相关文章

  1. TI Davinci DM6446开发攻略——根文件系统的裁剪和移植

    一.补充文件系统知识 Linux根文件系统是存放tool软件.lib文件.script(脚本).配置文件.其他特殊文件.自己开发的应用程序的地方.嵌入式linux的根文件系统rootfs就像windo ...

  2. Davinci DM6446开发攻略——linux-2.6.18移植

     TI DAVINCI 使用最新的内核是montavista linux-2.6.18,之前说过,国内很多公司,包括开发板的软件包,一直在使用montavista linux-2.6.10,这个版本准 ...

  3. Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写

      很长一段时间没有更新博客了,是因为要推出新开发方案和做好客户服务工作,忙得不易乐乎.有关DAVINCI U-BOOT的移植,以前写过一篇u-boot-1.3.4(2008年的),其实和这个u-bo ...

  4. DM6446开发攻略:UBOOT-2009.03移植及nand flash烧写

    有关DAVINCI U-BOOT的移植,以前写过一篇u-boot-1.3.4(2008年的),其实和这个u-boot-2009.03差别不大,只不过这个u-boot-2009.03是从TI的网站上下载 ...

  5. STM8如何使用自带的bootloader

    1,首先确认你使用的STM8有没有自带的bootloader.参考下表 2,STM8空器件可以直接使用自带的bootloader. 3,STM8在使用SWIM烧录后,要想继续使用自带的bootload ...

  6. Android Bootloader LittleKernel的两篇文章 【转】

    转自:http://blog.csdn.net/loongembedded/article/details/41747523 2014-12-05 14:37 3599人阅读 评论(2) 收藏 举报 ...

  7. 斐讯k1路由器刷Breed BootLoader(不死UBoot)教程

    刷入Breed BootLoader: 因为这个K1路由器可以开启telnet服务,所以此处刷Breed可以不使用编程器刷Flash芯片的方法进行. 1.打开K1路由器的Telnet服务. 电脑通过有 ...

  8. Linux学习 : 自己写bootloader

    一.bootloader 目标:启动内核 基本功能: ①初始化硬件:关看门狗.设置时钟.设置SDRAM.初始化NAND FLASH ②image比较大需要重定位到SDRAM ②将内核从NAND FLA ...

  9. How to acquire an Android phone with locked bootloader?

    As we know that some devices come with locked bootloaders like Sony, HUAWEI, hTC...If you try to unl ...

随机推荐

  1. 【PHP】学习中遇到的php方法

    [1]range()快速创建一个范围内数组 <?php range(0,20); 创建一个包含从 "0" 到 "20" 之间的元素范围的数组: range ...

  2. 同时装了Python3和Python2,使用pip

    第一种方法: pip安装: py -2 -m pip install -- py -3 -m pip install -- 运行代码: py -2 py.py py -2 py.py 第二种方法: 运 ...

  3. c# Char && string

    char 支持的方法 字符串 声明字符串 String str = [null]; 可以用此方法声明一个空字符串   连接字符串 str +"" + str1; 比较两个字符串 C ...

  4. python字符串常用的方法解析

    这是本人在学习python过程中总结的一些关于字符串的常用的方法. 文中引用了python3.5版本内置的帮助文档,大致进行翻译,并添加了几个小实验. isalnum S.isalnum() -> ...

  5. JMS基础篇(二)

    简介 异构集成是消息发挥作用的一个领域,大型公司内部可能会遇到很多的平台,Java,.net或者公司自己的平台等. 传送消息还应该支持异步机制,以提高系统整体的性能.异步传输一条消息意味着,发送者不必 ...

  6. 一个巨low的“2048”

    代码就是这样,做的不是4*4而是一个2*2 #include<stdio.h>#include<stdlib.h>#include<time.h>int main( ...

  7. oneNote总结

    22.添加附加文件删除后,文件大小没有发生改变的(优化文件和清空回收站)

  8. 使用IntelliJ IDEA(PHPStorm)和xdebug在firefox、chrome中远程调试PHP

    很多PHP程序员都习惯于使用echo.var_dump和exit来中断和调试web应用程序,本文主要介绍结合xdebug.IntelliJ IDEA.Firefox/chrome/IE来远程调试PHP ...

  9. 【SSH框架】之Spring系列(一)

    微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.前言 前面更新过几篇关于 Struts2 框架和 Hibernate 框架的文章,但鉴于这两 ...

  10. 关于http与https之间的区别

    年前的时候进行了一家公司的电话面试两轮,视频面试一轮(已拿到offer),过程中遇到了一个关于http与https的问题,当时回答的并不好,今天将其进行了总结和整理,望读者喜欢: 前言 谷歌在2018 ...