3 硬件启动过程
编写硬件启动的初始化过程是HAL移植的一个难点。当硬件重新上电后,系统的程序指针会自动指向地址0(通常地址0存放着bootloader代码段,本例中从外部Flash 0x80000000地址引导)。在eCos操作系统中,程序首先会运行vectors.S文件(该文件存在于hal/arm/arch/src/目录下),它定义了reset_vector、start等各种启动标号。接着调用SmartARM2200平台层的hal_platform_setup. h文件中的宏platform_setupl。
haLplatform_setup.h定义了宏platform_setupl以供vectors.S调用。该宏定义了目标板上SRAM和Flash的初始化启动,其中包括了它们的总线宽度、读写速度、内存大小。然后根据不同的启动方式执行程序。对于RAM启动方式,无需进行程序段与数据段的搬移,系统已认为SRAM的起始地址即为程序的起始地址;对于ROM启动方式,需要拷贝数据段,而程序段无需拷贝。
在程序拷贝完成后,系统会进行其他硬件的初始化过程,包括系统时钟、监控串口等基本硬件设备。
4 内存布局文件编写
平台的内存布局文件在include/pkgconf目录下。通常,每个平台包括了RAM、ROM两种不同启动方式的内存布局文件集。每种启动方式的内存布局文件集都由3个类型的描述文件组成:.h文件包含内存域的C宏定义;.ldi文件定义内存域和内存段位置的链接脚本文件;.mlt文件包括由MLT工具产生的对内存布局的描述。当需要手动修改内存布局时,只有.h和.ldi文件可以被修改,.mlt文件只能由MLT工具生成。
下面以SmartARM2200的RAM启动方式内存布局为例,说明mlt_arm_lpc2xxx_smartarm2200_ram.h和mlt_arm_lpc2xxx_smartarm2200_ram.ldi的程序结构。
由于SmartARM2200的开发板有1个16 KB的内部RAM和1个16 MB的外部SRAM,因而要定义两个内存域ram0和ram。系统设置寄存器在初始化时已经把内存段重新映射,因而两个SRAM的基地址就是 0x40000000和0x81000000,分配方式都是可读写的内存段。
在mlt_arm_lpc2xxx_smartarm2200_ram.ldi中分为两大部分。首先是MEMORY部分,它定义了在RAM启动方式下所需要的内存域,以及该内存域的起始地址和长度。MEMORY部分的内容必须与mlt_arm_lpc2xxx_smartarm2200_ram.h中定义的宏相一致。其次,是SECTIONS部分,它定义了RAM启动方式下所规定的内存段,这些内存段的定义与系统内存管理功能有关。在 SECTION_XXX后带有相应的参数,这些参数包括了内存段所属的内存域、起始地址(或者是对齐方式)、虚拟内存地址(VMA)和加载内存地址 (LMA)。
以SECTION_fixed_vectors(ram,0x81000000,LMA_EQ_VMA)为例,它表示fixed_vectors段属于 ram内存域,起始地址为0x81000000,加载内存地址等于虚拟内存地址。LMA_EQ_VMA同时也可以解释为该内存段不需要在程序运行后重新分配加载。
5 驱动程序的移植
SST39VF1601的驱动是在SST39VF400的拷贝的基础上修改的,主要改动部分如下:
RTL8019AS的驱动是在NS的DP89302A(都兼容NE2000)的拷贝基础上修改的,应该重点注意的是寄存器地址应该乘以2(因为地址线是从 A1开始的),由于该地址总线上还有LCD模块,为了两者能同时工作,总线宽度设置为16位,RTL8019AS的寄存器是8位的,写入和读取函数定义为 8位的,数据的读写视工作在8位DMA或16位DMA而定。
6 调试结果
SmartARM2200开发板上带有1块2 MB的Flash和1块16 MB的SRAM。
利用eCos的自带编译工具configtool对新建的SmartARM2200目标板进行编译,生成RedBoot的目标文件。然后通过AXD下载到目标板的SRAM中运行。此时的RedBoot应为RAM启动方式。刚开始调试的难度有点大,因为AXD不支持elf文件的下载,有些目标文件可以通过 objdump反汇编对照调试。
通过对RedBoot的常用命令的测试结果可以看出,本文提供的SmartARM2200的移植方案是成功的,ping命令正常,tftp下载正常。
结 语
RedBoot和U-boot都是优秀的bootloader程序,但RedBoot比U-boot的可移植性好。通过对RedBoot的移植可以熟悉 eCos系统的开发环境、configtool图形化配置工具、硬件抽象层HAL及驱动的移植,为进一步eCos系统开发打下基础。