U-Boot and VxWorks 7

使用U-Boot启动VxWorks 7

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