Bootloader在AT91RM9200系统中的实现
基于ARM920T核的AT91RM9200芯片以其丰富的内部外设,高达200MIPS的处理速度,以及它温度范围宽的特点,在工业控制领域嵌入式开发中大有应用的空间。Bootloader是用来引导操作系统的引导装载程序,用来初始化硬件设备、确立内存空间的映射,为最终引导操作系统内核提供一个合适的软硬件环境。它严重地依赖硬件环境,往往因使用的芯片、外部设备、操作系统的内核配置而不同,它的实现是嵌入式开发中必不可少的环节。
实现适合本系统的引导程序方法有两种:一是自行开发的bootloader,其特点是可以使这个程序在满足要求的基础上占用尽量的小的空间,但是工作量较大,开发周期延长,除了一些特殊要求的情况,工程开发中一般不会自行编写;二是使用已有的代码进行移植,特点是工作量小,有vivi、U- boot、Blob等很多开源的bootloader可用,这些程序支持的PowerPC,ARM,MIPS等多种平台,开发者只需做相对较少的移植工作就可以,出于工程开发角度,往往采取这种方式。
笔者开发了基于AT91RM9200的雷达监控分机测试板,本文将以此嵌入式板为例,介绍用GNU工具开发ARM程序的方法,探讨如何利用这种方法编写自己的bootloader,并详细地介绍了U-boot的移植步骤和要点。
1硬件特点
1.1AT91RM9200处理器启动特点
AT91系列处理器有片内和片外两种启动模式[1],支持地址的重映射,在ARM芯片中具有代表性。
AT91RM9200内部集成有16K字节的SRAM和128K字节的ROM。若是BMS引脚为低电平则从NCS0所接的外部的Flash芯片启动。若BMS引脚为高电平则从内部ROM启动,ROM中固化了FirmWare,这段固化的程序先后自动检测SPI连接的DataFlash,TWI连接的EEPROM的,EBI连接的8位的并行Flash芯片是否有合法的程序,如果有则放入SRAM中执行,如果没有检测到,便初始化调试串口和USB的设备端口,分别支持Xmodem和DFU协议的文件下载,可以将用户传送的文件放入内部SRAM中[2]。
由于本芯片支持地址Remap(地址重映射),在下载完后将SRAM的地址由0x0020_0000重新映射到0x0000_0000,将内部ROM地址由0x0000_0000映射到0x0010_0000,然后从地址0x0000_0000的内部SRAM开始执行。
1.2 Bootloader的下载和烧写
很多ARM芯片同AT91系列芯片一样,支持Remap,这就为使用串口下载程序和对Flash的烧写提供了方便。这种芯片在使用 bootloader之前一般需要两个前期的引导程序。本系统中使用了loader.bin和boot.bin两个程序:其中loader.bin运行于内部RAM,用来向SDRAM下载程序并运行;boot.bin固化在flash的起始地址下(如图1所示)用来解压引导Flash中的U-boot程序。
设置跳线,使系统上电后从内部启动,通过串口下载loader.bin程序,该程序的大小一定要小于16K字节,即内部SRAM的容量。如上文所述,下载后会运行它,由这个程序负责通过Xmodem协议将u-boot.bin程序下载到SDRAM中并运行,开发者再通过U-boot的cp命令将 boot.bin和u-boot.bin的压缩文件u-boot.gz烧写入Flash,下次从外部启动时就可以直接启动U-boot了。其中 boot.bin,实现将u-boot.gz的解压装入SDRAM并且执行。
ATMEL公司提供了针对他们出的该款芯片开发板的boot和loader的代码,可以从网上下载到,开发者可以对比一下参数设置,如果必要的话要对一些参数进行修改。
下面是这两个程序中比较关键的参数。loader当中的关键参数是AT91C_UBOOT_BASE_ADDRESS,用Xmodem协议接收的文件将存放在这个地址下。它的宏定义在main.h中:
#define AT91C_UBOOT_BASE_ADDRESS 0x21F00000 。
Boot中的关键的参数是:
#define SRC 0x10010000
/*在flash中的u-boot.gz的地址*/
#define DST 0x21F00000
/*uboot.gz解压后要copy到SDRAM中的地址*/
#define LEN 0x020000
/*解压后的大小(字节)*/
这些参数根据具体情况可能需要修改,特别是SRC要和U-boot中的相关设置一致,具体参数将在3中介绍。图1是Flash存储器的空间分配情况,分别列出了各个地址段的用途。
评论