目錄
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