基于cortex-A8的Bootloader设计
随着整个微电子行业日新月异的发展,ARM处理器已经带给了人们越来越多的惊喜。目前它凭借着自身高性能,低成本,低功耗等特点,已经广泛应用于消费电子、数字家电、及工业生产等领域中。ARM公司推出的新一代cortex系列产品为开发人员提供了更多不同层面的选择。cortex-A8为cortex 系列中的“A”系,属于ARMV7架构,主要面向搭载操作系统的,高性能的应用领域。Bootloader是系统上电后执行的第一段代码,其功能类似于电脑的BIOS。简单来说,Bootloader主要的工作有两点:其一是初始化底层硬件资源,为操作系统启动提供必要的环境;其二是从存储设备中读取操作系统镜像并启动。但为了方便后期开发,我们往往要为Bootloader添加其他的功能。如支持串口打印调试信息,支持nfs网络下载,支持根文件系统烧写等。本文以u-boot-2013.01为源码包,设计和实现了一个基于s5pv210平台的,功能齐全且高效稳定的Bootloader。
1 硬件平台
1.1 s5pv210简介
s5pv210是三星公司推出的一款基于cortex-A8架构的,高性能的应用处理器。该处理器支持ARM V7指令集,具有32位内部总线结构,主频最高可达1GHz。另外该处理器还支持挂接LPDDR1、LPDDR2和DDR2类型的RAM,Flash方面可选择Nand Flash,Nor Flash等。不仅如此,该处理器还提供了包括串口、LCD、IIC、SPI、USB、HDMI等丰富的外部接口资源。目前s5pv210以其高效的性能和卓越的图形处理能力已经广泛的应用于智能手机和平板电脑之中。
1.2 s5pv210的启动方式
s5pv210支持多种启动方式,下图为s5pv210启动的流程图:
图1 s5pv210的启动流程
s5pv210 的启动过程由BL0,BL1和BL2(BL为Bootloader的简称)三部分代码实现,其中BL0在出厂时已经被固化到64KB的iROM中。 s5pv210上电后首先执行BL0,该段代码主要负责一些简单的初始化工作,如关看门狗,初始化ICache等。然后BL0会根据硬件设置判断为何种方式启动,并将BL1从启动设备(OneNand,Nand Flash,USB,UART,SD card等)拷贝到Internal SRAM的BL1区中。最后BL0会比较一个校验值,如果相等则跳转到BL1中继续执行,否则转入其他启动方式。该校验值存在BL1的头部中,其大小为 16字节。
开发人员一般会单独编写一个工具对BL1编译出的二进制文件添加头部。其校验值(checksum)的计算方法如下:
...
a = Buf + SPL_HEADER_SIZE;
for(i = 0, checksum = 0; i IMG_SIZE - SPL_HEADER_SIZE; i++) {
checksum += (0x000000FF) *a++;
}
...
BL1的完整结构如下:
由于BL1的大小被限制为16K,所以一般情况下BL1负责的工作也不多。BL1在被执行后首先初始化系统时钟、内存、串口等。然后将BL2代码拷贝到 Internal SRAM的BL2区中并跳转执行。实际上SRAM的BL2区的大小只有80K,但很多情况下BL2代码的大小远远超过80K,所以将BL2代码拷贝到 SRAM中意义不大。更好的做法是直接将BL2拷贝到容量更大的内存中,不过在拷贝之前一定要先初始化好系统时钟和内存。
BL2是整个Bootloader的主体部分,因此它需要完成更多的初始化工作,例如初始化网卡,Flash等。之后BL2读取操作系统镜像到内存中运行。我们一般把操作系统镜像放到Flash上,也可以放到SD卡上,根据具体的开发平台而定。
2 软件平台
2.1 U-Boot介绍
U-Boot(全称Universal Boot Loader)是Bootloader的一种,其他常见的Bootloader还有RedBoot,vivi等。与之相比,U-Boot具有代码开源,可靠性和扩展性较高等优点。另外,对于类似于Nand Flash、Nor Flash、网卡、LCD等硬件资源的,U-Boot已经抽象出与硬件平台无关的代码作为设备驱动源码提供给开发者。对于与硬件平台相关的代码,U- Boot将其定义成宏,并保留到配置文件中。开发者往往只需要修改这些宏的值就能成功使用这些硬件资源,这让我们的移植工作变得十分简单。
2.2 U-Boot中几个比较重要的源文件
U-Boot的源码包包含有上千个源文件,但经过分析之后,可以找出如下几个比较重要的源文件(括号中为该源文件所在源码包的位置)。
(1)start.S(arch\arm\cpu\armv7\start.S)
通过分析U-Boot的链接文件可以发现,start.S是U-Boot上电后被执行的第一个源文件。该源文件包括定义了异常向量入口,相关的全局变量,禁用L2缓存,关闭MMU等,之后跳转到lowlevel_init()函数中继续执行。
(2)lowlevel_init.S(board\samsung\smdkv210\lowlevel_init.S)
该源文件同样用汇编代码编写,其中只定义了一个函数lowlevel_init()。该函数实现对平台硬件资源的一系列初始化过程,包括关看门狗,初始化系统时钟,内存和串口。
(3
cortext-A8 Bootloader设计 s5pv210 相关文章:
- S5PV210(TQ210)学习笔记——内存配置(DDR2)(11-28)
- S5PV210(TQ210)学习笔记——LCD驱动编写(11-28)
- S5PV210(TQ210)学习笔记——8位HWECC与YAFFS2的OOB布局(11-28)
- S5PV210(TQ210)学习笔记——Nand配置(11-28)
- S5PV210(TQ210)学习笔记——触摸屏驱动编写(11-28)
- S5PV210(TQ210)学习笔记——内核移植与文件系统构建(11-28)