映像所在的内存区域都被回收,重新成为系统内存。在启动过程中,只要RAM_HIGH_ADRSSTACK_ 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
此命令清除上次编译残留下的文件和配置信息,因为u-boot 是直接下载的,无法保证当前状态的正确性。如果已经运行过make
distclean,而下一次编译还是针对同一个目标板,则无需再次distclean 了。再输入:
make Sandpoint8240_config
此命令通知编译器,将要制作的u-boot 是基于sandpoint 板的。最后输入:
make all
一大段编译信息后,根目录下将出现u-boot,u-boot.bin,u-boot.map 和u-boot.srec 四个文件,其中可以烧录的二进制文件为u-boot.bin。
4 从flash 读取到内存的u-boot 启动方式
4.1 为什么要从flash 启动u-boot
烧写ROM 的方式是可以调试u-boot 的,但太耗时,现在用的骗程器太古老,还要启动到Win98 才能烧,在Win2000
和Win98 间切换,每次还伴随着运行VmWare 启动Linux。 因此采用下面的方式调试u-boot。
电路板上电,从EEPROM 启动,EEPROM 中烧录的是VxWorks 对应的bootrom,在bootrom 加载VxWorks
映像时,不加载VxWorks,而是加载u-boot 映像,再跳转到u-boot映像入口处运行,最后u-boot 加载VxWorks
映像,再运行VxWorks。相当于在bootrom 到VxWorks 之间插入了u-boot 这个中间件。
从flash 启动u-boot 有如下优势:
1.只需要烧录一次EEPROM,flash 的读写可以软件完成,不仅烧录速度大大提高,而且由于u-boot 映像是从flash
加载到内存后再执行,运行速度也很快。
2.bootrom 已经作了大量的CPU 寄存器初始化工作,因此u-boot 中初始化的部分几乎可以先注释掉,便于初入门者高屋建翎,首先把握u-boot
的总体结构,而不是陷入大堆PPC汇编指令中。此外,由于映射方式和外围设备控制的寄存器初始化都已经完成,在u-boot 的入口就可以写某个目的地址点灯,明确指示程序运行到地方,或者在串口初始化之前把寄存器值用点灯的方式表现出来。PCI
设备(例如网口)的PCI 寄存器已经被正确初始化,即
使没有在u-boot 中将其设定为需要初始化的PCI 设备,也可以正常运行。
3.便于修改成u-boot 放在EEPROM中的形式。从ROM开始运行的u-boot 和从RAM 开始运行的u-boot 主要区别有两点:u-boot
的基地址定义,RAM 控制的初始化。来回修改并不困难。
总而言之,从flash 加载u-boot 到内存再调试的方法,可以加快u-boot 调试进程。且VxWorks 的开发中,也需要把VxWorks
映像固化到flash 并实现在线更新,因此从flash 加载二进制映像的程序代码(在bootrom 中)和将二进制映像文件烧录到flash
的程序代码(在bootrom 或者VxWorks 中,我的程序放在VxWorks 中)都已经实现。u-boot 最终要代替bootrom,bootrom
中从flash 加载VxWorks 的代码也可以方便地移植到u-boot 中。
4.2 初入u-boot
为了不搅乱u-boot 原来的布局,因此自己先建立一个给自己修改的程序包。在\board 目录下新建文件夹user8240,把\board\sandpoint
下的文件都拷贝进来,再到\include\configs\目录下把sandpoint8240.h 复制一份,改名为user8240.h。修改宏定义:
#define CONFIG_SANDPOINT 1
为:
#define CONFIG_USER8240 1 /*标志用户电路板所定制的u-boot 程序*/
最后到u-boot 根目录下,修改makefile,找到Sandpoint8240_config,依样画葫芦地在下面写上添上:
user8240_config: unconfig
@./mkconfig $(@:_config=) ppc mpc824x user8240
在命令行下:
make distclean
make user8240_config
make all
生成u-boot.bin,察看一下二进制文件,发现它很类似于VxWorks 的bootrom,所不同的是,bootrom.bin
从文件开头空出0x100 个Byte 的0x00,第一条执行的机器码( 4 个字节,对应于MPC8240 汇编的一条语句)是一个跳转,跳过紧接着的ASCII
版本信息。而u-boot.bin最开始是ASCII 版本信息,加上后面的0x00 总共0x100 个Byte,第一条执行的机器码是把启动类型(冷启动)放入寄存器r21
种。这两种loader 都是从文件开头偏移0x100 处执行的,因为CPU 的启动地址为0xfff00100,而ROM 的基地址需要为整值,因此放在0xfff00000,前0x100
个字节不会被执行,填什么都可以。再看看vxWorks.bin,发现它的第一个byte 就是可执行机器码。因此,从flash
读取VxWorks 影像文件跳转的程序需要修改才能适用于u-boot,且最好把u-boot 放在flash 里与VxWorks
不同的位置,这样等u-boot 基本调试完毕,还可以让u-boot 从flash 读取VxWorks。
先修改用户程序,在原有的烧写flash 的基础上,添加烧写u-boot 的代码。我没有使用VxWorks 支持的Flash
文件系统,直接采用特定内存存放到固定地址的方法,因为一般flash的读写次数至少上万,而我们调试需要的次数远小于此。我板子上的flash
为intel 28F320B3,共有63 个block。直接定义:
#define FLASH_DATA_CPU 1 /*vxWorks 存放的起始block,
main block0 和8 个para block 空出*/
#define FLASH_DATA_UBOOT 20 /*U-BOOT 存放的起始block*/
#define FLASH_DATA_BOOTLINE 30 /*bootline 存放的block*/
其中前两个宏定义分别为映像文件开始存放的位置,直接向后写即可。最后一个宏定义把VxWorks 的启动行也存入Flash,后面将介绍这样设置的原因。由于每个main
block 的大小为65536byte,因此三个定义之间的间隔空间为1.3MB 和0.65MB,简单的VxWorks.bin和u-boot.bin
大小约为0.7MB 和0.15MB,不会互相覆盖。如果读者在程序中使用了过大的静态数组,映像文件的大小会增加,必须酌情修改,避免程序重叠。
在flash 中存放的格式很简单,前4 个byte 表示总长度,后面为二进制文件。如果想做压缩算法或者纠错算法也行,这里只介绍最简单的。在VxWorks
的用户程序中开一个网络server,Windows 下写一个读取文件并发送的client 程序,规定好通讯协议,就可以用Windows控制VxWorks
把Windows 下的二进制文件(VxWorks.bin 和u-boot.bin)写入flash 了。
建议把用户程序和VxWorks 结合到一起,在usrConfig.c 的结尾开启server,做成用户程序自启动的VxWorks,包括bootrom
从网络load 需要的VxWorks 和从flash load 需要的VxWorks.bin。命令行下先跳转到BSP 目录下,然后输入制作命令:
torvars
make vxWorks
elftobin <vxWorks> vxWorks.bin
第一条是设置环境变量,在tornado 安装目录\ host\x86-win32\bin 目录下可以找到torvars.bat,拷贝到自己的bsp
目录下就行了(或者你根据里面的内容直接修改Windows 环境变量也行,那样就不用每次输入torvars,缺点是无法适用于同时安装了两个或以上版本Tornado
的情况,例如Tornado2.0 和2.2,设置起来会有冲突)。第二条制作vxWorks,第三条制作对应的二进制文件。
1
2
3
4
5
6
7
8
9
10
11 |