birenpeter 发表于 2010-10-13 14:56:11

公布一个能用的2410 VxWorks BSP

长期潜水,我来公布一个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                //保存环境变量

obit 发表于 2010-10-13 15:18:55

这东西要放在阿莫雕刻机的脱机控制盒上用

eworker 发表于 2010-10-13 15:38:57

不错

richey07 发表于 2010-10-13 17:39:30

建议置酷
带网口的bsp不好找

lwy86 发表于 2010-10-13 18:22:56

mark

liouravr 发表于 2010-10-13 21:06:59

牛啊,看能不嫩一直到2440上去

zchong 发表于 2011-2-17 19:23:35

有必要移植到2440上去

alexmayer 发表于 2011-2-17 21:52:31

vxworks弄起来太麻烦了

hejunbok 发表于 2012-5-9 20:35:20

cool,牛啊

NQARMgooogleman 发表于 2012-5-9 21:40:08

这个我有一个,周立功2410 试验箱上的,一直没搞过。呵呵
这个要大公司才能玩的动。我还是搞我的wince和android了。
页: [1]
查看完整版本: 公布一个能用的2410 VxWorks BSP