uboot启动vxworks

uboot启动vxworks

 

1    任务背景

一块单板两块flash,一块存储bootrom和vxworks,另一块存储uboot和Linux,从哪块启动需要拨单板上的跳线。

准备将这块板放置到机房,仅使用一块flash,uboot同时启动vxworks和Linux。如此可以方便vxworks调试。

 

2    当前进展

通过uboot下载vxworks镜像,而且已经执行到vxworks的第一个函数sysInit(sysAlib.s),但在启动vxworks时出现异常。异常指令为stb,怀疑uboot没有配置好PPC的相关寄存器,而且vxworks也没有做完全的初始化工作,但是将bootrom的初始化rominit复制过来仍然不行。

由于需要详细了解PowerPC的架构和指令,时间周期较长,故此任务暂缓。

 

3    详细过程

首先网上搜索uboot和vxworks的相关内容,发现uboot已经有启动vxworks的命令bootvx,初时以为很简单,以下为遇到的问题记录:

l  网络问题

发现uboot网络不通,经过其他人员的帮助,发现是uboot的默认网卡取的不对,PowerPC 8548板支持4个网卡,但目前只接了一个,通过以下命令设置默认网卡即可,注意该命令无法保存到环境变量中,比较奇怪

setenv ethacteTSEC2

 

l  下载地址

tftp可以下载vxworks镜像了,但不知道下载到何处,在网上查看发现写的也不一样,有的说要下载到config.h中设定的地址,有的文档直接写了地址0x1000000。后来发现vxworks 镜像是一个标准的ELF文件,uboot的bootvx命令可以直接解析ELF文件,获取代码段位置,再将代码段的内容全部复制到config.h中设定的地址(目前是0x10000),因此tftp 下载时的地址无所谓,只要不和0x10000冲突就行了。

tftp0x1000000   vxWorks

 

l  启动参数

bootvx命令会将启动参数传递给vxworks,这里必须直接参考uboot的源代码,从网上查看帮助有问题。对应的函数为do_bootvx,其中bootaddr为vxworks启动参数存放的内存地址,默认是0x4200;bootargs是启动参数,由于默认uboot启动Linux,因此bootargs变量为Linux的参数,这里需要修改成vxworks的参数,注意不要保存否则Linux就无法启动:

setenv bootargsmotetsec(0,0)host:vxworks h=192.168.x.x e=192.168.x.x u=x pw=w f=0x0

 

l  启动问题

当前启动时,会发生异常直接重启,异常的指令定位如下(sysAlib.s的第4条指令):

stb   r6, 0(r7)

这是存储指令,怀疑内存相关的寄存器没有配置好,遂复制bootrom的rominit代码,但发现更加不行,而且全部复制过来编译出的vxworks在bootrom下也不能启动,说明修改有问题。

查阅网上资料,说可能要将bootrom中的MMU和Cache 相关指令复制到vxworks中,但目前不知道如何。

 

4    遗留问题

当前由于时间和重要性关系,此任务暂缓,后续如果想继续完成则还需要进行以下工作:

l  启动问题

uboot 引导vxworks失败

 

l  芯片复位

上电后硬件无法正确复位芯片。在Linux下可以通过i2c的dev接口对芯片进行复位,在vxworks 下没有软件方法,目前是硬件直接接了一个复位按钮到单板上的。如果要放置到机房,则软件复位问题必须解决

 

l  重启问题

vxworks镜像不能重启,在reboot时会发生异常,如此则无法进行正常测试

 

l  uboot更改

如果机房中无法连接串口,则需要修改uboot和flash,暂列如下:

1.       设置正确的默认以太网接口,不然uboot启动后无法连通网络

2.       烧写vxworks到flash,同时必须规则好分区

3.       修改uboot,支持条件启动,即读取某个变量确定从哪个系统(Linuxvxworks)启动,这个变量只能存储在flash中

4.       修改vxworks,必须能够修改存储在flash中的某个变量。Linux也要修改。


你可能感兴趣的:(linux,网络,Flash,存储,化工,任务)