李青荣,任 昱
(1.中国电子科技集团公司第二十八研究所,江苏 南京 210007;2.南京莱斯信息技术股份有限公司,江苏 南京 210007)
PC 机的系统引导通常由BIOS 和引导程序完成,引导程序一般使用GRUB;而嵌入式系统一般没有BIOS 这样的固件程序,系统的引导加载完全由Bootloader 独立完成。Bootloader 在操作系统运行前完成初始化硬件环境、建立内存空间的映射表等操作,使得硬件设备初始到正常工作状态,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。嵌入式系统,Bootloader 与底层硬件平台联系紧密,每个不同配置的目标板有不同的Bootloader,因此Bootloader 需要按照硬件具体设计定制,然后烧录到引导启动的ROM 或Flash 中。从可利用的资源和实际项目开发考虑,采用移植已有的Bootloader 源码作为项目的引导程序,可以有效的降低项目开发成本,保证项目的顺利开展。基于以下几点本系统选择了U-Boot 作为引导程序:(1)源码开放;(2)支持引导多种嵌入式操作系统;(3)支持多种型号的处理器;(4)具有较高的可靠性和稳定性;(5)丰富灵活的功能设置,适合U-Boot 调试、不同操作系统的引导要求和产品发布等;(6)具有丰富的设备驱动源码,如SDRAM、以太网、LCD、FLASH、EEPROM、RTC、键盘和串口等;(7)较为丰富的开发调试文档说明,具有强大的网络技术支持。
本系统开发的是基于PowerPC MPC8377E 处理器为核心的硬件平台,原理框图设计如图1 所示。MPC8377E 外围接口丰富,可参考实际需求自由删减,提供了系统开发很大程度的灵活性,同时降低产品开发的难度与成本,有效缩短产品从研发到投放市场的时间,提高了产品的竞争力。MPC8377E 处理器是PowerQUICCTMII Pro 系列产品中具有高性价比的产品,处理器内部集成了e300 内核、PCI、JTAG、PCI-E、DDR 控制器,尤其提供了双千兆以太网控制器,在通信领域中得到非常广泛的应用,MPC8377E 采用90nm 工艺技术,工作主频从400MHz到800MHz[1]。本系统硬件资源具体如下:(1)处理器CPU:Freescale MPC8377E;(2)存储器:512MB DDR2 SDRAM;32MB NOR flash;32MB NAND flash;(3)调试接口:JTAG/ COP;(4)I/O 接口:10/100/1000Mbps 以太网接口:两个千兆位RGMII,两个串口分别用作调试和正常通信。
图1 MPC8377E 目标板原理框
U-Boot(Universal Boot Loader)是遵循GPL 条款的开放源码项目,从FADSROM、PPCBOOT、8xxROM 逐步发展演化而来。其源码目录、编译形式与Linux 内核系统类似,U-Boot 部分源码是通过相应的Linux 内核源程序简化而来,尤其是一些设备的驱动程序,从U-Boot 源码注释中能体现出这一点。但U-Boot 不仅支持嵌入式Linux 系统,它还支持VxWorks、QNX、NetBSD、RTEMS、ARTOS 和LynxOS 等嵌入式操作系统的引导。U-Boot 支持的处理器类型除PowerPC 系列的处理器外,还支持MIPS、x86、ARM、NIOS 和XScale 等诸多常用系列的处理器。本系统采用的是u-boot-2011.3 版本,其主要目录如下:(1)arch:存放各种类型特定架构的实现文件,U-Boot 启动代码一般在这里的start.s 中;(2)api:为拓展应用准备的,与硬件和架构无关的接口定义文件;(3)board:目标板相关文件;(4)common:独立于处理器体系结构的通用代码,如内存大小探测与故障检测;(5)disk:与磁盘操作相关的文件;(6)doc:项目开发的说明文档;(7)driver:常用的设备驱动文件;(8)examples:在U-Boot 下运行的示例程序;如hello_world.c;(9)fs:支持的文件系统(jffs2 等);(10)include:U-Boot 头文件,configs 子目录下存放的是与目标板相关的配置头文件,是移植过程中经常需要修改的文件;(11)lib:所有架构通用的库文件;(12)net:与网络功能相关的文件目录,如bootp、nfs、tftp;(13)post:上电自检相关的文件目录;(14)rtc:RTC 驱动文件;(15)tools:用于创建U-Boot、S-RECORD 和BIN 镜像文件的工具。
在开展移植工作之前,先构建交叉开发环境。嵌入式系统及应用软件开发一般采用宿主机-目标机模式,本系统宿主机开发环境是在X86 架构的windows 操作系统下,用VMware 虚拟机软件安装的Linux Fedora 15 32 位操作系统,搭建德国DENX 软件中心提供的ELDK 开发工具。目标机上部署的是Linux 2.6.28 操作系统。
移植工作一般在U-Boot 项目中寻找与自制目标板相似的硬件平台,按照目标板硬件环境修改配置参数;本系统开发的基于PowerPC 处理器的MPC8377E 的硬件平台与U-Boot-2011.3 版本中mpc837xerdb 硬件平台相类似,接下来的工作是参考硬件设计原理图和芯片手册修改相关代码,这在很多程度上降低了移植难度。U-Boot 的移植步骤说明如下:(1)修改Include/configs/MPC837XERDB.h 文件:(a)修改起始基地址CONFIG_SYS_TEXT_BASE 为0xF0 000000;(b)关闭PCI 总线(#undef CONFIG_PCI);(c)修改DDR2 SDRAM 相关配置,主要配置如图2所示。(2)修改boards.cfg 文件,添加一行:MPC837XERDB powerpc mpc83x mpc837xerdb freescale。(3)执 行make MPC837XERDB_config 命令,成功执行后U-Boot 会自动生成编译规则文件和配置文件,其中编译规则文件(includeconfig.mk)主要定义目标板的架构类型、使用的处理器、目标板的类型和厂商,本系统分别定义的是PowerPC、mpc83xx、mpc837xerdb 和freescale。接下来make 工具会根据以上配置,通过makefile 文件相关链接,逐层递推的对整个U-Boot 项目进行编译。配置文件(includeconfig.h)主要包含当前目标板配置所引用的相关命令、目标板参数所在的头文件。(4)make 完成对u-boot 编译后,生成U-boot.bin 文件。
图2 DDR2 SDRAM 主要配置
嵌入式系统的Bootloader 移植是嵌入式系统设计开发中的非常重要的一个步骤,如果利用像BDI3000 这样的开发调试工具进行U-Boot 调试,对移植工作顺利开展非常有帮助。要想BDI3000 能够启动控制目标板,需要对BDI3000 中的启动参数进行正确配置,具体配置要参考目标板硬件设计信息。在U-Boot 的启动过程串口初始化之前,无法获得U-Boot 启动的字符串提示信息,这个过程中对U-Boot 的调试就必须要用到BDI3000。在串口的初始化之后,便可通过串口打印的信息来实时跟踪所启动的执行流程,以了解U-Boot 目前执行的具体部分或运行到哪一阶段出现了问题[3]。
用BDI3000 调试时,需要关注调试代码地址,可利用objdump 命令获得相关代码地址,方便调试查找定位。重定位前的代码直接运行在NOR FLASH 中,地址可以在objdump 生成文件中直接获得,而重定位后的代码,地址发生偏移,可通过BDI 工具单步执行或者设置断点跟踪调试。
U-Boot 在移植完成并测试成功后,通过BDI3000 把UBoot 映像文件烧写到NOR FLASH 相应地址,NOR FLASH 烧写地址必须与硬件所规定的硬件复位向量一致,对于MPC8377E 处理器而言,烧写地址是0xF0000000。U-Boot 经过部署后,目标机能够正确引导内核和加载文件系统。
U-Boot 是一个功能非常强大的开源的系统引导软件,支持ARM、PowerPC 等多种架构处理器平台上的Linux、VxWorks等多种嵌入式操作系统引导。U-Boot 设置环境参数,配置硬件平台初始化,为加载操作系统创造良好的运行环境。本系统基于PowerPC 处理器的MPC8377E 的硬件平台,实现了UBoot 移植,并成功引导linux 操作系统,使得linux 操作系统稳定运行。
[1]MPC8377E PowerQUICC II Pro Processor Hardware Specifications[Z].America:Freescale Semiconductor Corp,2008.
[2]孙纪坤,张小全.嵌入式Linux 系统开发技术详解—基于ARM[M].北京:人民邮电出版社,2006.
[3]宋国军,张侃谕,林学龙.嵌入式系统中U-Boot 基本特点及其移植方法[J].单片机与嵌入式系统应用,2004(10).