作者email: jinyuhe@163.com
摘要:
本文主要介绍vxworks系统在mpc860系列处理器的开发中怎么实现去掉boot flash,直接从flash引导vxworks的bootrom。
关键词:boot flash,flash,bootrom
引言
美国windriver公司的实时嵌入式系统vxworks和美国motorola公司mpc860系列处理器已经广泛的应用在通信行业的通信产品中,在用vxworks系统进行开发时,会生成两个文件,一个是bootrom文件,此文件类似windows中的bios,是引导文件,完成内存初始化,内核初始化,基本硬件的初始化并最终引导vxworks系统启动,另外一个是vxworks文件,此文件中包括vxworks系统内核及上层应用程序,而这两个文件在mpc860的开发中一般都存储在两片不同的flash上,及bootrom存储在boot flash,而vxworks存储在flash上。
产品需要
实际开发中,生成的没有压缩的bootrom大小一般为512k左右,在vxworks 5.4中是460k左右,而在vxworks 5.5中是540k左右,一般存储bootrom的flash只需要512k大小,因为即使540k的 bootrom也可以截成512k。
在硬件开发flash选型时,boot flash芯片一般采用sst公司的28vf040、29vf040等,flash芯片一般会采用intel、amd公司的,根据需要可能会采用容量为4m、8m、16m、32m大小不等。从节省成本的角度考虑,是不是可以将bootrom直接装载到flash中并引导呢,这样不是可以省掉一片boot flash吗?
vxworks系统中,加上上层应用程序的生成的vxworks文件一般为3m左右,所以不管你采用4m、8m或者更大容量的flash,同时装载bootrom、vxworks文件也是绰绰有余的。
实际情况
我和一个做硬件的朋友曾经做过这样的测试,直接从flash引导bootrom,并引导vxworks系统,实际上是可行的。
要解决此问题,实际上只要将flash的地址稍做处理就可以的。
我们将flash地址映射成两个地址段,一段用做bootrom,一段用做vxworks使用,用做bootrom的地址段为0xfff00000~0xfff80000,另外一段用做vxworks的地址段为0x04080000~0x04800000(假设此flash大小为8m大小),在0xfff00000~0xfff80000地址段写入bootrom,在0x04080000~0x04800000地址段写入vxworks,加电后,pc指针会跳到0xfff00100地址执行第一条指令,引导bootrom起来并最终vxworks系统引导成功。
实现过程
1、 片选
在rominit.s文件中要做如下的片选操作,片选0为boot flash的地址片选,片选1为flash的地址片选,其中rom_base_adrs为0xfff00000
/* ------------------------------------------------------------------------ */
/* initialize chip select 0 for bootrom */
/* ------------------------------------------------------------------------ */
lis r5, hiadj( rom_base_adrs br_ps_8 br_wp br_v)
addi r5, r5, lo( rom_base_adrs br_ps_8 br_wp br_v)
stw r5, br0(0)(r4)
lis r5, hiadj( 0xfff80000 0x00000100 0x00000080)
addi r5, r5, lo( 0xfff80000 0x00000100 0x00000080)
stw r5, or0(0)(r4)
/* ------------------------------------------------------------------------ */
/* initialize chip select 1 for flash */
/* ------------------------------------------------------------------------ */
lis r5, hiadj( 0x04000000 br_ps_16 0x00000001)
addi r5, r5, lo( 0x04000000 br_ps_16 0x00000001)
stw r5, br1(0)(r4)
lis r5, hiadj(0xff800000 0x00000100 0x00000080)
addi r5, r5, lo(0xff800000 0x00000100 0x00000080)
stw r5, or1(0)(r4)
2、 地址映射
在syslib.c文件中有一sysphysmemdesc的地址映射数组的声明,对boot flash和flash的地址按照如下的地址映射后,vxworks系统才会让你对此地址进行相应的读写操作。
{
(void *) 0x04000000,
(void *) 0x04000000,
0x00800000, /* 8 m - flash window 1 */
vm_state_mask_valid vm_state_mask_writable,
vm_state_valid vm_state_writable
},
{
(void *) rom_base_adrs,
(void *) rom_base_adrs,
rom_size, /* flash memory */
vm_state_mask_valid vm_state_mask_writable
vm_state_mask_cacheable ,
vm_state_valid vm_state_writable
vm_state_cacheable_not
}
3、 文件烧录
还存在一个问题,因为boot flash是可以在烧录器上烧录的,而flash芯片是直接焊接在mpc860的主板上,只能通过相应的flash驱动才能进行读写的,是