1. 关于使用U-Boot启动VxWorks
对于ARM和PowerPC系统,可以使用第三方的U-Boot启动VxWorks。ARM和PowerPC的BSP都是用DTB文件将设备访问信息从BSP代码中分离出来。U-Boot作为ARM和PowerPC的标准启动程序,可以使用独立的DTB文件。
2. 获取与构建U-Boot
U-Boot源码可从DENX获得。在使用U-Boot启动VxWorks镜像之前,需要首先在主机上安装和构建U-Boot。
(1)准备工作
在获取与构建U-Boot之前,需要在主机上安装如下软件:
- git
- 交叉开发环境(提供针对开发板的SDK)
- 以RPM形式提供的风和U-Boot补丁
(2)执行过程
a) 下载U-Boot源码
执行如下命令:
$ git clone git://git.denx.de/u-boot.git
b) 构建U-Boot二进制文件
执行如下命令构建U-Boot二进制文件:
$ make distclean CROSS_COMPILE=path_to_your_cross_build_tools
$ make your_board_config ARCH=path_to_your_cross_build_tools
$ make ARCH=your_arch CROSS_COMPILE=path_to_your_cross_build_tools
最后需要将该二进制文件加载到板子上的可启动介质中去。
3. 使用U-Boot启动VxWorks
根据VxWorks镜像的结构,U-Boot提供了不同的启动选项。
在构建VxWorks内核镜像时,在BSP目录下必须有一个可供使用的DTB文件。VxWorks内核镜像必须使用默认的ELF格式,并且命名为VxWorks。
过程描述:
(1)使用objcopy工具将VxWorks内核镜像由ELF格式转换为二进制格式;
- 对于ARM架构,执行如下命令:
$ objcopyarm -O binary vxWorks vxWorks.bin
- 对于PPC架构,执行如下命令:
$ objcopyppc -O binary vxWorks vxWorks.bin
(2)将U-Boot镜像头部添加到VxWorks二进制文件中;
VxWorks提供mkimage工具,用于生成VxWorks.uboot文件。
mkimage工具包括如下选项:
- -A:设置架构
- -O:设置OS
- -T:设置镜像类型
- -C:设置压缩类型
- -a:设置加载地址
- -e:设置入口地址
- -n:设置镜像名称
- -d:供使用的数据文件
对于ARM架构,需要执行如下命令:
$ mkimage -A arm -O vxworks -T kernel -C none -a 0x80100000 -e 0x80100000 -n vxworks -d vxWorks.bin vxWorks.uboot
对于PPC架构,需要执行如下命令:
$ mkimage -A ppc -O vxworks -T kernel -C none -a 0x00100000 -e 0x00100000 -n vxworks -d vxWorks.bin vxWorks.uboot
加载地址与入口地址可以不同。加载地址指定了U-Boot拷贝VxWorks内核镜像的地址。入口地址是待执行的第一条指令的地址。在准备任务完成后,U-Boot将跳转到入口地址。在VxWorks中,这两个地址通常是相同的。BSP使用RAM_LOW_ADRS地址,因为在镜像的起始部分,VxWorks具有自己的入口地址。
(3)执行如下命令,使用wrtool将DTB文件嵌入VxWorks二进制文件中;
-> prj build -target vxWorks.bin
(4)重复第2步,将U-Boot镜像头部添加到VxWorks.bin
也可以使用一个压缩的VxWorks内核镜像。U-Boot可以启动gzip、bzip2、Ima或Izo压缩格式的VxWorks内核镜像。压缩VxWorks二进制文件时,既可以使用DTB,也可以不适用DTB。
执行如下命令压缩镜像,结果文件为vxWorks.bin.gz:
$ gzip --best vxWorks.bin
接着按照如下命令将U-Boot镜像头部添加到vxWorks.bin.gz:
$ mkimage -A ppc -O vxworks -T kernel -C gzip -a 0x00100000 -e 0x00100000 -n vxworks -d vxWorks.bin.gz vxWorks.uboot
(5)启动目标板,等待U-Boot提示符(U-Boot#)
(6)执行标准的setenv命令,提供启动命令行
U-Boot# setenv-bootargs cpsw(0,0)
DTB 文件中存放着传递给VxWorks内核的启动命令行。如果按照ePAPR标准要求,启动命令行被写入设备树中选定的节点中。VxWorks7内核从设备树中提取信息,并按需解析。
U-Boot为内核提供启动命令行。如果未选择节点,U-Boot就在设备树中创建一个,然后更新启动命令行。如果环境变量bootargs已经设置,U-Boot则使用该环境变量更新选中节点的启动命令行属性。如果启动命令行属性已经存在,U-Boot则直接覆写它。不管是否有可用的启动命令行,U-Boot都要创建一个选中的节点。
注意:对于一个嵌入的DTB文件,U-Boot无法更新DTB文件中的启动命令行。因此,将无法传递环境变量bootargs。在此情况下,VxWorks内核仅适用硬编码到设备树中的启动命令行。
(7)根据系统需求启动VxWorks
当使用独立的DTB文件时,memory,bootargs,enable-method和cpurelease-addr等节点可被U-Boot更新。对于目标板,target.ref文件中为这些节点提供了可用的信息与合适的值。
在某些情况下,需要设置额外的环境变量。这些变量由U-Boot传递给VxWorks内核镜像或直接被U-Boot使用。这些设置可在U-Boot命令提示符下使用setenv、saveenv命令实现。典型的环境变量包括:
bootargs:
内核使用的启动那个命令行如下:
"motetsec(2,0)host:vxWorks h=10.1.0.240 e=10.1.0.41:fffffe00 g=10.1.0.1 u=vxworks pw=vxworks f=0x0"
fdt_high:
DTB文件将重定向到fdt_high地址以下的空间。VxWorks内核镜像必须能访问到重定向的DTB地址。
bootm:
将内核拷贝到由uImage定义的内核加载地址中。U-Boot将存放在一个寄存器中的DTB重定向地址传递给内核。
启动方式说明:
4. 准备与启动存放在ROM中的镜像(就地执行)
VxWorks支持ROM常驻镜像,可以直接从存储设备中执行(如NorFLASH)。
有两种方法可以使用ROM常驻镜像。
方法1:最简单的方法是创建一个嵌入设备树的VxWorks内核镜像,然后使用go命令加载。
方法2:可以使用bootm命令。如果使用该方法,则需要执行额外的操作。例如,在加载地址与入口地址之间必须有64字节的间隔,这64字节都需要填充为0xff,原因是标准的U-Boot头部是64字节。
方法2的操作过程如下:
(1)修改sysALib.s,为U-Boot头部保留64字节空间。
例如:
FUNC_LABEL(_sysInit)
FUNC_BEGIN(sysInit)
#ifdef UBOOT_XIP
.fill 16,4,0xff /* reserve for XIP header */
#endif
(2)执行带-x选项的mkimage命令,添加一个支持XIP(一种特殊的头部)的U-Boot头部。
例如:
$ mkimage -x -A arm -O vxworks -T kernel -C none -a 0x80100000 -e 0x80100000 -n vxworks -d vxWorks.bin vxWorks.uboot
(3)执行bootm命令,启动ROM常驻镜像,例如:
$ bootm 0x80100000
5. 使用U-Boot创建和启动VxWorks镜像
使用wrtool工具,可以构建适用于U-Boot的VxWorks镜像。
wrtool命令行工具可以用于生成供U-Boot加载和启动的VxWorks镜像。可以使用两种方法构建VxWorks镜像:
- 使用独立的DTB文件构建VxWorks镜像,并使用bootm命令启动;
- 使用嵌入的DTB文件构建VxWorks镜像,并使用go命令启动;
前提条件:
为执行后续步骤,首先需要具备如下条件:
- 一个可用的基于板子或CPU BSP的VSB项目;
- 一个基于上述VSB项目的VIP项目;
既可以使用U-Boot启动全功能的VxWorks内核,也可以使用U-Boot启动一个VxWorks bootapp镜像。为了创建一个VxWorks bootapp镜像,在创建VIP项目是必须指定PROFILE_BOOTRAPP特性。
操作步骤:
(1)如果使用嵌入的DTB文件构建了VxWorks镜像,则向内核镜像中添加INCLUDE_STANDALONE_DTB组件:
-> prj vip component add INCLUDE_STANDALONE_DTB
(2)向VxWorks镜像中添加独立的符号表
执行如下命令,为内核镜像添加INCLUDE_STANDALONE_SYM_TBL组件:
-> prj vip component add INCLUDE_STANDALONE_SYM_TBL
(3)使用如下选项构建VxWorks镜像和DTB
- 如果使用独立的DTB文件构建VxWorks内核,则执行如下命令:
-> prj build -target uVxWorks
- 如果使用嵌入的DTB文件构建VxWorks内核,则执行如下命令,该过程将生成一个嵌入DTB文件的镜像(VxWorks.bin)
-> prj build -target vxWorks.bin
(4)设置U-Boot网络参数
U-Boot可以利用TFTP或NFS客户端从网络上加载文件。执行如下命令可以设置U-Boot网络参数:
$ setenv ethaddr 00:04:9f:ef:01:01
$ setenv ipaddr 192.168.10.5
$ setenv netmask 255.255.255.0
$ setenv serverip 192.168.10.2
$ setenv gatewayip 192.168.10.1
$ saveenv
(5)利用U-Boot下载文件到目标板
可根据需要选择如下选项进行下载:
- 如果使用独立的DTB,则执行如下命令下载文件:
$ tftp 80300000 uVxWorks
$ tftp 80e00000 your-board.dtb
此时,也可以按照如下命令提供一个VxWorks6.9.x风格的启动命令行(这个启动命令行将覆盖DTB文件中默认的启动命令行):
$ setenv bootargs motetsec(2,0)host:vxWorks h=192.168.10.2 e=192.168.10.5:ffffff00 g=192.168.10.1 u=vxworks pw=vxworks f=0x0
- 如果使用嵌入的DTB,则执行如下命令下载文件:
$ tftp 80300000 vxWorks.bin
(6)启动VxWorks镜像
根据需要,可以选择如下两种方式:
- 如果需要启动使用独立的DTB文件的VxWorks镜像,则执行如下bootm命令:
$ bootm 0x80300000 - 0x80e00000
- 如果需要启动使用嵌入DTB文件的VxWorks镜像,则执行如下go命令:
$ go 0x80300000