1 DM6467启动流程
在移植U-Boot之前,首先需要了解DM6467的启动流程,知道U-Boot在系统启动过程中的位置及作用。DM6467标准的启动过程如图 1‑1所示,主要包括四个步骤:RBL(ROM BootLoader)→UBL(User Boot Loader)→U-Boot →Linux内核。
图1‑1 DM6467启动流程
系统上电时,首先运行的是RBL。RBL是固化在片内ROM的,所以用户不能修改,并且功能比较弱。RBL根据开发板上拨码开关的值来确定下一阶段的启动方式,它支持NAND、UART和HPI三种启动方式。我们开发板上使用的是NAND启动,所以RBL负责将NAND Flash中的UBL复制到片内RAM,然后转到UBL执行。当RBL启动之后,其实就可以直接运行应用程序了,但是如果要进行嵌入式系统开发,也即要移植嵌入式操作系统,那么就需要下一阶段的bootloader,这里使用的是UBL。
UBL又称为2nd stagebootloader(第二阶段的bootloader),它主要负责初始化串口、PLL和DDR2 SDRAM,然后根据用户设定来选择下一阶段启动方式。UBL支持NOR、NAND、PCI和UART启动模式,我们选用的是NAND启动,所以UBL负责将NAND中的U-Boot复制到DDR2中,然后转到U-Boot执行。由于RBL没有初始化DDR2,UBL是复制到片内RAM执行的,而DM6467的片内RAM只有32K,但U-Boot的bin文件一般都是100K以上,所以系统需要使用第二阶段的UBL来初始化DDR2,然后将U-Boot复制到DDR2上运行。
TI官方提供了标准的UBL源文件和bin文件,兼容性很强,可以直接用于我们的开发板,不过,也可以根据我们的实际需要在其基础上进行一定修改。
第三阶段的U-Boot主要用于建立内存映射以及堆栈、初始化主要功能模块和复制Linux内核到DDR2,然后传递一些参数给内核,最后转到内核运行。由于这部分与实际的开发板联系紧密,而不同开发板总有些差别,所以需要根据实际情况来修改标准的U-Boot源文件以适应硬件参数。
2 U-Boot简介
U-Boot(UniversalBootloader)是一种广泛用于嵌入式设备的开源bootloader。U-Boot支持许多系统架构,包括PPC、ARM、MIPS、AVR32、X86、68K、Nios和MicroBlaze等。U-Boot也支持各种类型的文件系统,包括Cramfs、ext2、FAT、FDOS、JFFS2、RegisFS和UBIFS等。U-Boot还支持不同类型操作系统,包括NetBSD,、VxWorks、QNX、RTEMS、ARTOS、LynxOS和Linux等。
U-Boot源码可以在其官网http://www.denx.de/wiki/U-Boot/下载,U-Boot版本更新比较快,在U-Boot-2009.08版本及之前的版本中不支持DM646x系列SOC,只有对TI的DaVinci系列开发板的通用支持,在U-Boot-2009.08之后的所有版本都有专门的对DM646x系列SOC的支持,使用这些版本的U-Boot进行移植时可以减少一定工作量。在本文的以下部分,所有的分析及移植过程都是基于U-Boot-2009.08。
2.1 U-Boot源码结构
U-Boot源码解压后所得的目录结构见图 2‑1。从图中可以看到,文件和文件夹很多,并且有些文件夹下面还有很多子文件夹或者有很多文件,但是,由于U-Boot是支持不同架构、不同文件系统、不同开发板,而我们自己的开发板是ARM926ejs核的CPU,移植Linux操作系统,所以U-Boot源码中的大部分是与我们移植任务不相关的。从后面也可以看到,我们移植时对源码修改的地方非常少,并且只局限于几个文件。
图2‑1 U-Boot目录结构
为了使U-Boot更简洁,可以删除顶层目录中的doc、lib_avr32、lib_blackfin、lib_generic、lib_i386、lib_m68k、lib_microblaze、lib_mips、lib_nios、lib_nios2、lib_ppc、lib_sh、lib_sparc、nand_spl、onenand_spl这些文件夹,还有board/中除davinci之外的所有文件夹、cpu/中除arm926ejs之外的所有文件夹。当然,其实还有很多文件与文件夹是与我们开发板无关的,不过比较琐碎,就不用再一一删除了。
对于U-Boot源码顶层目录中各主要文件夹的内容和功能,表 2‑1给出了简单的介绍。另外,在顶层目录中还有一个很重要的文件Makefile,这是整个U-Boot编译时依据的规则,在移植时也可能需要修改。
表 2‑1 U-Boot顶层目录结构
文件夹名 |
包含内容 |
api |
独立于硬件的一些API |
board |
与开发板相关的文件 |
common |
独立于处理器结构的通用代码,如内存大小探测、U-Boot命令 |
cpu |
与cpu相关的文件,每个子文件夹对应一种架构的cpu |
disk |
一些磁盘操作函数 |
drivers |
通用的驱动程序 |
doc |
参考文档 |
fs |
U-Boot支持的文件系统 |
include |
头文件及系统配置文件 |
lib_xxx |
与具体cpu架构相关的库文件 |