DM6446的Bootloader

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

时间: 2024-10-20 18:29:41

DM6446的Bootloader的相关文章

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

一.补充文件系统知识 Linux根文件系统是存放tool软件.lib文件.script(脚本).配置文件.其他特殊文件.自己开发的应用程序的地方.嵌入式linux的根文件系统rootfs就像windows操作系统的C.D盘这种概念机制,FLASH对应硬盘.但linux是挂载点的概念,根文件系统是一个整体,组织到一个树状的目录结构中.这种文件组织遵守文件系统科学分类标准FHS,一种国际标准.运行.维护系统所必须的各种 在开发.测试阶段,基本上都是使用NFS(网络文件系统),NFS文件系统是在你的开

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

  很长一段时间没有更新博客了,是因为要推出新开发方案和做好客户服务工作,忙得不易乐乎.有关DAVINCI U-BOOT的移植,以前写过一篇u-boot-1.3.4(2008年的),其实和这个u-boot-2009.03差别不大,只不过这个u-boot-2009.03是从TI的网站上下载的,是DAVINCI系列最新的u-boot,也适合DM6467和DM365/368,移植的方法承接<Davinci DM6446开发攻略--u-boot-1.3.4移植(1)>,而本篇着重介绍nand flas

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

 TI DAVINCI 使用最新的内核是montavista linux-2.6.18,之前说过,国内很多公司,包括开发板的软件包,一直在使用montavista linux-2.6.10,这个版本准确来说是比较低的,实时性肯定没2.6.18好(MontaVista Linux Professional Edition 5.0以linux-2.6.18为基础,打破了Linux不适用于实时和嵌入式应用的迷思):使用devfs,没有使用udev:对DM365等新出的DAVINCI芯片支持限度很小:u

WinCE Boot方式及Bootloader架构概述

Bootloader的概念就是一个用于引导的loader,在系统上电的时候最先被运行,然后对硬件平台做最基本的初始化,最后把操作系统加载起来.不同的嵌入式操作系统都有自己的Bootloader,但是本质功能都是一样的. 在WinCE中用的最多的就是EBOOT,是一个基于网络的Bootloader,而且可以根据需要带有命令行菜单功能,网络调试功能以及文件系统的相关功能.在这里我只谈ARM平台的引导,因为其他架构的CPU我没用过,就不吹牛了.一般基于不同的硬件设计,会有不同的引导方式: NORFla

开源飞控-WMC飞控刷bootloader问题

问题描述 WMC飞控刷bootloader问题 wmc飞控能不能用arduino,刷bootloader变成cc3d飞控......

Davinci DM6446开发攻略——u-boot-1.3.4移植(1)

UBOOT的版本更新速度比较快,截止今天,稳定正式的版本是u-boot-2009.11-rc2,而TI最新的EVM开发包里的UBOOT是1.2.0版本,国内很多公司还一直使用u-boot-1.1.4和u-boot-1.1.6.其实,我们也没必要追风跟上最新版本,程序跑稳定才是最重要的.当然,有兴趣研究研究也不错,毕竟最新版本增加很多实用的功能.在移植之前,我们简单介绍u-boot这些版本架构的变化.从u-boot-1.3.0到u-boot-1.3.2基本上架构是一样的,而从u-boot-1.3.

TI Davinci DM6446开发攻略——开发环境搭建

TI DAVINCI DM6446的开发环境搭建不像三星S3C2410,S3C2440,ATMEL的AT91SAM9260之类的单核ARM那么简单,因为DM6446还有DSP端的开发环境,以及双核之间的通信和程序编译等问题,所以开发攻略第一步就是要搭好开发环境.其实TI的EVM(TI 的开发板)也提供相关的EVM start guide(sprue66f.pdf),适合参考.         DAVINCI开发环境搭建基本上可分以下几步:         1) 准备好各种相关的windows,l

bootloader功能介绍/时钟初始化设置/串口工作原理/内存工作原理/NandFlash工作原理

bootloader功能介绍 初始化开发板上主要硬件(时钟,内存,硬盘), 把操作系统从硬盘拷贝到内存,然后让cpu跳转到内存中执行操作系统. boot阶段 1.关闭影响CPU正常执行的外设 -关闭看门狗(watch dog)   WTCON 0xE2700000 -关闭中断 CPSR I和F位设置为1,关闭,不响应任何中断. 2.初始化时钟 -倍频到1Ghz,为外设分频 *串口驱动 3.初始化内存控制器,DDRAM -验证内存,往里面写一个值,然后再读出来 4.初始化硬盘,nand Flash

嵌入式系统烧写uboot/bootloader/kernel的一般方法

嵌入式系统烧写uboot/bootloader/kernel的一般方法   本文介绍了在嵌入式系统中烧写uboot/bootloader/kernel 的一般方法,以及如果uboot或者内核出现错误,  www.2cto.com   引导失败等情况时如何重新烧写uboot/kernel.   烧写uboot/kernel的方式一般有两种,一种是在linux本身(shell中),直接将uboot/kernel的影像文件(二进制文件)使用操作烧写flash的命令烧写到flash特定分区上,   另一