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也要修改。
更多推荐
所有评论(0)