VxWorks 的 bootrom 到 u-boot 的移植心得
tof@ustc_bbs 2006.3.27
目录
VxWorks 的 bootrom 到 u-boot 的移植心得 ..................................... 2
1.u-boot 简介 ....................................................................................... 2
2.准备工作 ........................................................................................... 2
2.1 安装 VmWare 下的 Linux................................................................................ 2
2.2 下载 u-boot 和编译器.................................................................................... 4
2.3 硬件准备......................................................................................................... 6
3.软硬件结构分析.................................................................................. 6
3.1 软件的存储设备............................................................................................. 6
3.2 bootrom 和 VxWorks 的软件结构.................................................................. 6
3.3 熟悉 u-boot.................................................................................................... 8
4 从 flash 读取到内存的 u-boot 启动方式................................................. 9
4.1 为什么要从 flash 启动 u-boot.................................................................... 9
4.2 初入 u-boot.................................................................................................... 9
4.3 软硬结合的配置文件\include\configs\[boardname].h....................... 13
4.4 u-boot 入口程序\cpu\mpc824x\start.S.................................................. 23
4.5 u-boot 控制台命令和启动方式.................................................................. 25
5. 最后的收尾工作.............................................................................. 28
5.1 u-boot 从 flash 加载 VxWorks................................................................... 28
5.2 修改 u-boot 脱离 bootrom.......................................................................... 31
1 / 31
VxWorks 的 bootrom 到 u-boot 的移植心得
tof@ustc_bbs 2006.3.27
VxWorks 的 bootrom 到 u-boot 的移植心得
原因:Wind River 公司推出的 VxWorks 具有优良的性能,可惜是个收费软件。因此考
虑将原来 VxWorks 下配套的软件(引导程序 bootrom,操作系统 VxWorks,用户程序 user
application)统统移植到免费的 linux 下。其中 bootrom 可由 denx 推出的 u-boot 代替。
硬件条件:实验室自己开发的电路板,已经有成功运行的 bootrom 和 VxWorks,CPU
为 MPC8240(powerpc603 类型的核),启动地址对应到8bit 数据宽度的 EEPROM,有板载
Flash,但地址不连续,串口网口齐全。
本文内容:用于将 bootrom 移植成 u-boot,虽然涉及到 bootrom,VxWorks 和 user
application,但真正被代替的只有 bootrom。并不包括 VxWorks 到嵌入式 linux,以及 user
application 的移植方法。
1.u-boot 简介
U-Boot,全称 Universal BootLoader,是遵循 GPL 条款的开放源码项目。其源码目录、
编译形式与 Linux 内核很相似,事实上,不少 U-Boot 源码就是相应的 Linux 内核源程序的
简化,尤其是一些设备的驱动程序,这从 U-Boot 源码的注释中能体现这一点。但是 U-Boot
不仅仅支持嵌入式 Linux 系统的引导,当前,它还支持 NetBSD, VxWorks, QNX, RTEMS,
ARTOS,LynxOS 嵌入式操作系统。其目前要支持的目标操作系统是 OpenBSD, NetBSD,
FreeBSD,4.4BSD, Linux,SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS,
QNX,RTEMS,ARTOS。U-Boot 除了支持 PowerPC 系列的处理器外,还能支持 MIPS、x86、
ARM、NIOS、XScale 等诸多常用系列的处理器。
更多内容:MPC8xx 的 U-Boot 移植体会
http://oradom.c.blogbus.com/logs/2005/10/1516893.html
2.准备工作
2.1 安装 VmWare 下的 Linux
通常玩 Tornado 的都是在 Windows 下(或者在 windows 的伪 Dos 下玩命令行)。但是
u-boot 要在 linux 下编译。由于移植过程中不可避免的要参考VxWorks 的 BSP,而且从u-boot
启动的 VxWorks 可能与从 bootrom 启动的 VxWorks 略有不同,因此强烈建议在 Windows 下
安装 VmWare 虚拟机,再装上一个 Linux。我用的是比较古老的红帽子 Linux7.3。
关于 Linux 在 VmWare 下的安装资料网上到处都是,自己搜去吧。需要注意的是,装完
之后强烈建议安装 VMŁInstall VmWare Tools,安装好了之后分辨率就可以设置上去了,否
则看起来太难受了。此外,再设置一个共享文件夹 VMŁSettings,linux 下在/mnt/hgfs/目录
下,方便 Windows 和 Linux 之间互相拷贝文件(这个地方我一直没有搞定,从 Windows 下
向共享文件夹里拷贝文件可以,从 linux 下总是报错:Error while copying to … there is not
2 / 31
VxWorks 的 bootrom 到 u-boot 的移植心得
tof@ustc_bbs 2006.3.27
enough space on the destination,用 root 也是一样。)或者设置一下网络后,用ServU在 Windows
下开一个 ftp,开放读写权限(反正也就 linux 一个用户),效果也是一样的。
安装 VMware tools
设置 VmWare 网络
3 / 31
VxWorks 的 bootrom 到 u-boot 的移植心得
tof@ustc_bbs 2006.3.27
设置 VmWare 共享文件夹
2.2 下载 u-boot 和编译器
u-boot 的源代码可以从 denx 的网站上下载。直接用 linux 下的命令下载:
$ cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot login
$ cvs -z6 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot co -P u-boot
直接下载 u-boot 到当前目录\u-boot 下(最后一个参数是下载后的目录),这种方法下载
的文件可以直接使用。
最新版本说明以及其它下载方式参见下面的网页:
http://www.denx.de/wiki/view/DULG/UBootVersions
下载完 u-boot,还需要下载 linux 下的 ppc 系列的编译器,用来编译生成 powerpc 系列
cpu 认识的二进制文件。具体说明如下:
http://www.denx.de/wiki/view/DULG/ELDKDownloadPowerPC
由于下载速度比较慢,建议不用网页上建议的 linux 下命令的方式下载,而用断点续传
的 ftp 工具慢慢下。
下载地址为:mirror.switch.ch,目录为:/mirror/eldk/eldk/4.0/ppc-linux-x86/iso,下载那
个 ppc-*_freescale.iso 或者 ppc-*_amcc.iso 就行了。
Amcc 的 适 用 于 AMCC 的 4xx/4xxFP 处 理 器 , freescale 适 用 于 其 他 的 处 理 器
(5xxx,6xx,7xx,74xx,8xx,85xx),我用的就是后一种。
把 VmWare 的启动 CD 设定为此 iso 文件。
4 / 31
VxWorks 的 bootrom 到 u-boot 的移植心得
tof@ustc_bbs 2006.3.27
设定 VmWare 的 CDROM 为 iso 文件
然后在命令行下:
$ mount /dev/cdrom
$ cd /mnt/cdrom
$ ./install [-d
] []
最后一句是设定安装到的路径和安装的组建,例如要安装 powerpc603 系列的编译器,
目的地址放在/soft 下,则命令为:
$./install –d /soft ppc_6xx
如果不输入 cpu 类型,则所有的类型都被安装。
安装完毕还需要设定环境变量:
export CROSS_COMPILE=ppc_6xx-
export PATH=$PATH:/soft/usr/bin:/soft/bin
第一句是设定编译的 cpu 类型,第二句设定路径,就是编译器安装后的路径。设置完毕
之后可以找一个简单的 foo.c 文件编译一下,看看是否安装成功。
$ ${CROSS_COMPILE}gcc –o foo foo.c
具体情况参见/mnt/cdrom 下的 readme.html。
比较懒的人可以用 root 权限,在文件/etc/profile 文件下加入下面两行,这样就不用每次
都输入了。(http://www.stcore.com/html/2005/1024/51803.html,里面有单用户设置 path 的方
法)
export CROSS_COMPILE=ppc_6xx-
export PATH=$PATH:/soft/usr/bin:/soft/bin
重新启动 VmWare,否则这两个环境变量的设置是无效的哦。
5 / 31
VxWorks 的 bootrom 到 u-boot 的移植心得
tof@ustc_bbs 2006.3.27
2.3 硬件准备
合适的电源,串口线(Windows 下用超级终端监视),对接网线或者正常网线+HUB。
这些调试 VxWorks 下的 bootrom 也要用,就不多废话了。强烈建议用仿真器,可惜我没有,
导致调试过程中麻烦的要死。还好我有一套已经调试好的bootrom+VxWorks,硬件也都正常,
否则直接改 u-boot,估计很难调通。此外,由于启动设备为 EEPROM,还需要一个编程器
(包括 PLCC 到双列直插的转接座)。
3.软硬件结构分析
3.1 软件的存储设备
先来看看板子上的存储设备。
首先是 ROM,可以掉电存储,也是我使用的电路板的 CPU 上电自动跳转的地址所在。
ROM 的优势是拆卸方便,如果在板上焊了 ROM 座,那么可以用编程器烧录的 ROM 就是
不需要任何软件准备,就可以直接使用的唯一东西。缺点是烧录起来又慢又麻烦。
其次是 FLASH,可以掉电存储,可以用 CPU 编程控制在线烧录。如果手头有仿真器,
而且电路板上的 FLASH 做到了地址连续,可以用仿真器烧录,如果再将其地址映射到 CPU
的上电跳转地址,是最理想的放 bootloader 的地方。缺点是普通 FLASH 没有方便编程器烧
录的封装,而仿真器比较贵。
最后是 RAM,不能掉电存储,但是无论是 u-boot 还是 VxWorks 的 bootrom,启动后期
都会跳转到 RAM 运行,原因是在 RAM 里程序的运行速度明显高于 ROM 或者 FLASH。最
终操作系统也需要在 RAM 里运行。
综上,如果是将要设计的电路板,且手头上有仿真器,建议用 FLASH 作为启动设备。
或者使用跳线控制地址映射,选择从 ROM 或者 FLASH 启动。注意 FLASH 的设计必须做
到地址连续。
对于我手头的电路板,只能从 ROM 启动。因此本文中介绍的是从 ROM 启动的修改方
式。没有使用仿真器,在 u-boot 的调试中借用了 bootrom 和 VxWorks。如果有其他形式的
bootloader 和 RTOS,本文也可以作为参考。否则只能建议去购买仿真器了。
3.2 bootrom 和 VxWorks 的软件结构
这不是本文的重点,更具体的可以参考源代码和 Wind River 的 Tornado BSP Training
Workshop,熟悉 VxWorks 的读者可以直接跳过本节。
首先看看 VxWorks,广义上的 VxWorks 包括了操作系统引导程序 bootrom 和操作系统
VxWorks。而用户程序 User Application,在开发过程中通常是使用网络下载,在开发完毕后
和 VxWorks 结合到一起,因此开发完毕后主要的执行文件,就是 bootrom 和 VxWorks。这
两个文件都是基于 Wind River 提供的板级开发包(Board Support Package, 简称 BSP)生成的。
修改和生成方法分为在 IDE Tornado 的图形界面下编译和在 Dos 命令行下输入命令两种。个
人认为,图形界面的修改不能解决底层问题,真正底层的修改还是需要修改源代码,且 Dos
键盘操作比鼠标操作快(估计很多老 Dos 和 Linux 用户会同意吧),因此我用的是命令行。
6 / 31
VxWorks 的 bootrom 到 u-boot 的移植心得
tof@ustc_bbs 2006.3.27
首先从 BSP 制作一个 bootrom,详细的修改和调试步骤就不在这里罗嗦了。
Bootrom 的启动顺序为:
romInit.s:第一个执行的汇编,初始化一堆 CPU 内部寄存器,禁止中断、浮点运算,
初始化内存控制。
bootInit.c:romStart()为首个执行的 C 程序,将 bootrom 代码拷贝到内存。
bootConfig.c:usrInit()为首个在内存中执行的 C 程序,之后跳转 usrRoot(),它们初始化
包括 PCI 总线、串口、网口在内的硬件,最后开展多任务,运行 bootCmdLoop(),提供串口
操作,控制自动启动或者选择其他启动方式。
VxWorks 启动顺序为:
sysALib.s:VxWorks 首个启动的汇编,CPU 内部寄存器初始化。
usrConfig.c: usrInit(),VxWorks 首个执行的 C 程序,之后跳转 usrRoot(),它们进行更加
详细的硬件初始化,初始化多任务内核,最后调用 user application。
Bootrom 运行过程中,不同地址的在不同启动阶段的内容分布如下,其中 ROM 由于不
内容
ROM
RAM
可写,因此不再重复:
时间
初始上电
拷 贝 剩 余
bootrom 后
运
行
bootrom
RAM
RAM
载
加
VxWorks
后
RAM
RAM
RAM
RAM
RAM
大小
首地址
0xfff00000
0x00080000
0x00400000 0x00080000
0x1000
0x00400000 0x00080000
0x00400000
-0x1000
0x00004200 255
0x00400000 略小于 bootrom.bin
0x00010000 约 1MB, 即 vxWorks.bin
0x00400000
-0x1000
0x4200
的大小
0x1000
255
说明
包含 bootrom.bin
包含 bootrom.bin
包含 bootrom.bin
堆栈
启动参数
bootrom.bin
VxWorks 映像
堆栈
启动参数
其中各参数的宏定义即意义按出现顺序如下:
0xfff00000(+0x100): ROM_TEXT_ADRS ,MPC8240 的启动地址为 0xfff00100 ,在
config.h 和 makefile 中同时定义,必须一致,且如果系统一上电就运行 bootrom,则此地址
不能修改
0x00400000:
RAM_HIGH_ADRS,bootrom 映像加载到内存的目的地址,在 config.h
和 makefile 中同时定义,必须一致,可以修改
0x1000:
0x00080000: ROM_COPY_SIZE,从 ROM 拷贝到 RAM 的长度,必须大于非压缩型
STACK_SAVE,bootrom 运行过程中需要的堆栈大小,一般不需要修改
bootrom 映像的大小,一般不修改
0x00004200: BOOT_LINE_OFFSET,存放诸如本地IP 等启动参数的内存位置,与 CPU
类型有关,一般不修改
255:
BOOT_LINE_SIZE,启动参数的长度,一般不需要修改,除非启动行比
较长
0x00010000: RAM_LOW_ADRS,vxWorks 映像加载到内存的目的地址,在 config.h 和
makefile 中同时定义,必须一致,可以修改
在 VxWorks 加载完毕之后,程序跳转到VxWorks 的入口,内存被重新分配,包括bootrom
7 / 31
VxWorks 的 bootrom 到 u-boot 的移植心得
tof@ustc_bbs 2006.3.27
映像所在的内存区域都被回收,重新成为系统内存。在启动过程中,只要RAM_HIGH_ADRS-
STACK_SAVE-RAM_LOW_ADRS 大 于 VxWorks 映 像 大 小 , 且 RAM_HIGH_ADRS+
ROM_COPY_SIZE 不超过系统内存顶端,上面的内存设置基本上可以保证正常加载。
3.3 熟悉 u-boot
安装完了 u-boot,应当从阅读根目录下的 README 文件开始。
安装完毕后 u-boot 文件分布图
我把所有的 u-boot 文件都拷贝到了 windows 下,大规模的修改也是在 windows 下进行
的,当需要搜寻察看代码的时候,也是用 windows 下的搜索。
回头来看 README,Directory Hierarchy 一项介绍了文件分布和大概含义。建议至少把
README 文件粗读一遍。
然后到 board 目录下,选择一个跟你的电路板类似的模板,至少 CPU 要一样。对于我
的板子,我选择了 CPU 为 MPC8240 的 sandpoint 板,在目录.\u-boot-1.1.4\board\sandpoint
下。先粗略看看这里的文件吧。对应的.h 配置文件为 u-boot-1.1.4\include\configs\sandpoint.c,
此文件中定义了板上的硬件选择,以及大量的参数配置。此文件必须要精读,最好能对照着
VxWorks 的 BSP 看懂这些宏定义。由于 u-boot 的全部代码都是开放的,看懂宏定义的最好
方法就是在 u-boot 目录下搜索,看看.s 和.c 代码中是如何使用这些宏定义的。
看到这里,估计大家都等不及了,那么先看看 u-boot 的映像文件是如何编译出来的。
先按照 2.2 的方法导入环境变量,然后在 linux 下开一个 terminal,跳转到 u-boot 根目录
下输入:
make distclean
make Sandpoint8240_config
此命令清除上次编译残留下的文件和配置信息,因为 u-boot 是直接下载的,无法保证
当前状态的正确性。如果已经运行过 make distclean,而下一次编译还是针对同一个目标板,
则无需再次 distclean 了。再输入:
此命令通知编译器,将要制作的 u-boot 是基于 sandpoint 板的。最后输入:
一大段编译信息后,根目录下将出现 u-boot,u-boot.bin,u-boot.map 和 u-boot.srec 四个
文件,其中可以烧录的二进制文件为 u-boot.bin。
make all
8 / 31