|
长期潜水,我来公布一个2410能用的VxWorks BSP。
(以下公布的内容是以前备份的资料或工作笔记,现在也忘了很多,另外本人对VxWorks也了解不多,有问题还请及时指出)
1、介绍
这是我毕业设计的一部分,移植了VxWorks到2410上。网上有很多2410的BSP,许多开发板声称有vxworks的BSP,但实际上大部分不能用,或多或少都存在些问题。我的BSP也是网上的一个版本修改过来的,虽然修改的地方不多,但都十分关键。
说下我板子的硬件资源,大部分仿照SMDK2410,主要包括64MB SDRAM,CS8900和三个串口。因此整个BSP最关键的有三个地方:1、如何引导BSP;2、如何启动BSP;3、网络的驱动程序
2、如何引导BSP
我曾经试图移植VxWorks自带的bootrom,最后串口倒是通了,网口死活不出来,所以放弃,最后采用uboot。uboot支持vxworks加载和引导,设置环境变量setenv bootcmd bootvx,再设置好bootargs(bootline), bootaddr,loadaddr,就可以直接从loadaddr上启动vxworks镜像。uboot网上资料很多,我这里不再详述。
3、如何启动bsp
这是整个移植的关键,这里我只叙述我所遇到的问题。
(1)现象:vxworks bsp加载后运行后,每次都跑飞。反汇编发现在bsp使能了时钟后,产生IRQ异常,PC回到FLASH的0x18位置,而这个位置存储的是UBOOT的跳转表,当然要跳转到UBOOT代码中去;而vxworks又对2410进行了重新初始化,所以UBOOT也不能正常运行,最终造成跑飞。根本原因在于中断未能正确安装!
(2)安装中断向量表:在不能改变FLASH中内容的前提下只能使用MMU映射SDRAM到0地址,让vxworks自己安装中断跳转表。安装之前需要在VxWorks工程配置中打开MMU。中断跳转表的安装采用以下两种方案,实践证明可行,但不知是否是标准做法。在MMU映射表中,SDRAM地址被映射在两个位置,一个是0地址,另一个还是在原来地址;中断跳转可以跳转到相对0的偏移地址,也可跳转到实际的地址(前者还没有进一步证明这种做法是否可靠,另外,这两种方案并没有进行中断保护,也不知道是否有“副作用”)。具体实现可以采用B或LDR指令(将入口地址“换算”成指令),要跳转到实际地址只能使用LDR指令,B只能前后相对偏移32MB,而LDR可以在4GB的线性空间偏移。
/*instruction b xxx*/
/* int i;
i = (int)&excEnterUndef;
*((volatile int*)(S3C_EXC_BASE + 0x4)) = (i-S3C_EXC_BASE-8-0x4)/4+0xea000000;
i = (int)&excEnterSwi;
*((volatile int*)(S3C_EXC_BASE + 0x8)) = (i-S3C_EXC_BASE-8-0x8)/4+0xea000000;
i = (int)&excEnterPrefetchAbort;
*((volatile int*)(S3C_EXC_BASE + 0xc)) = (i-S3C_EXC_BASE-8-0xc)/4+0xea000000;
i = (int)&excEnterDataAbort;
*((volatile int*)(S3C_EXC_BASE + 0x10)) = (i-S3C_EXC_BASE-8-0x10)/4+0xea000000;
i = (int)&intEnt;
*((volatile int*)(S3C_EXC_BASE + 0x18)) = (i-S3C_EXC_BASE-8-0x18)/4+0xea000000;
*/
/*e59ffzzz==ldr pc,xx,xx=0xzzz+8*/
int i;
i = (int)&excEnterUndef;
*((volatile int*)(S3C_EXC_BASE+0x4)) = 0xe59ff0f8;
*((volatile int*)(S3C_EXC_BASE+0x100+0x4))=i;
i = (int)&excEnterSwi;
*((volatile int*)(S3C_EXC_BASE+0x8)) = 0xe59ff0f8;
*((volatile int*)(S3C_EXC_BASE+0x100+0x8))=i;
i = (int)&excEnterPrefetchAbort;
*((volatile int*)(S3C_EXC_BASE+0xc)) = 0xe59ff0f8;
*((volatile int*)(S3C_EXC_BASE+0x100+0xc))=i;
i = (int)&excEnterDataAbort;
*((volatile int*)(S3C_EXC_BASE+0x10)) =0xe59ff0f8;
*((volatile int*)(S3C_EXC_BASE+0x100+0x10))=i;
i = (int)&intEnt;
*((volatile int*)(S3C_EXC_BASE+0x18)) =0xe59ff0f8;
*((volatile int*)(S3C_EXC_BASE+0x100+0x18))=i;
4、vxworks的CS8900 END网络驱动
要点:
(1)、sysAlib.s中,存储器初始化有问题,特别是CS8900的BANK3。
(2)、硬件配置中,CS8900的IO基地址是0x19000000,memory基地址是0x18000000,原BSP中有问题;另外在MMU映射表中,将这两个地址映射到原地址,否则不可用。
(3)、使能CS的IRQ0,原BSP中设置的是5(CHIP_INIT_NUM=0)。
(4)、原BSP的pin enable函数配置有问题,EINT9配置成上升沿或高电平触发不会影响程序运行。
(5)、在cs8900astart()中,原BSP对CS8900进行了软件的复位,应该去掉!!
(6)、在cs8900aconfig()中,将对CS8900的访问方式改成memory方式,因为后面的代码会用到memory方式。
(7)、关于中断的处理,也是原BSP最大的问题:CS8900产生中断后并没有清除EINTPEND中的中断标志,导致2410重复对CS的中断处理;在intLvtChk中,产生CS中断中,屏蔽其中断,在处理完中断后清除SRCPEND、INTPEND、EINTPEND的中断标志,防止中断重入!!
至此UBOOT可启动VXWORKS!
2410 vxworks bspourdev_589503R4B3RC.rar(文件大小:2.44M) (原文件名:备份2008_12_18uboot启动vxworks网络CS8900调通.rar)
![](http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_589504SKTRBB.JPG)
(原文件名:启动.JPG)
uboot环境变量:
环境变量 默认 说明
ipaddr 192.168.0.2 VxWorks IP地址
serverip 192.168.0.1(下位机) 服务器IP,主要有于TFTP下载镜像时用
baudrate 38400 uboot控制台输出波特率
bootaddr 0x30000700 VxWorks启动参数储存位置
loadaddr 0x32000000 VxWorks镜像位置,从本地启动时要设置为0x100000
bootargs cs(0,0) host:vxWorks h=192.168.0.1 e=192.168.0.2:ffffff00 u=user pw=sam
tn=vxWorks VxWorks启动参数
bootcmd 默认没有设置 如果loadaddr=0x100000,设置bootcmd=bootvx,则可实现上电vxWorks自启动
本系统中,VxWorks启动方式有两种:
 本地启动:FLASH中的0x100000位置已烧入VxWorks镜像,因此将loadaddr设为0x100000,再利用bootvx即可启动;更新flash中VxWorks镜像步骤如下:
1、protect off all
2、erase 100000 2fffff
3、tftp 32000000 VxWorks
4、cp.b 32000000 100000 (bytes of image)
5、protect on all
(拷贝VxWorks镜像到Flash中大概要2分钟)
更改环境变量,以增加VxWorks自启动功能,经过下述步骤后,用reset复位uboot,即可实现自启动。
1、setenv loadaddr 100000 //将loadaddr设置到100000位置
2、setenv bootcmd bootvx //设置自启动指令
3、saveenv //保存环境变量
 网络加载启动:将loadaddr设为0x32000000,首先启动TFTP服务器,目标目录是指向编译好的VxWorks镜像,利用bootvx tftp即可启动。网络启动的好处是主机更改了操作系统镜像,通过这种方式可以更新系统。更改环境变量步骤如下:
1、setenv loadaddr 32000000
2、setenv bootcmd //清除自启动指令
3、saveenv //保存环境变量 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|