MPC5121E的VXWORKS5.5 BSP移植记录

    最近根据客户要求,制作了一块mpc5121e的板子。板子到手后,照例先把bootloader什么的搞起来。操作系统方面,客户要求跑vxworks5.5系统。但vxworks5.5下面,并没有对e300系列的支持。查e300的资料,这是对603e系列稍作改动而来的,那么在vxworks5.5上面跑应该不成问题的,但BSP只能自己动手了。

    写BSP也不用完全重新开始。vxworks提供了一个templatePpc模板,基本上照着这个来改就可以了。
    在开始写代码之前,首先要规划好内存布局。我是这么定义的:
        0x00000000-0x10000000: DDR2空间,128M
        0xe0000000-0xe0100000: IMMR空间,1M
        0xfc000000-0xfe000000: Flash空间,32M
        0xfe000000-0xffffffff: cpld控制空间,32M
    这些空间必须已经在bootloader阶段初始化完成。

    首先是Makefile。主要是定义好CPU=PPC603,和TOOL=gnu。然后各种地址按自己的板子的配置来定义:
        ROM_TEXT_ADRS   = fc000100 # ROM cold entry address
        ROM_WARM_ADRS   = fc000104 # ROM warm entry address
        ROM_SIZE        = 00800000 # number of bytes of ROM space
        RAM_LOW_ADRS    = 00100000 # RAM text/data address for vxWorks
        RAM_HIGH_ADRS   = 01000000 # RAM text/data address for bootrom

    然后是修改config.h里面的各种配置。注意,一开始最好不要打开MMU和cache,先把基本系统跑起来再调试这些。config.h里面也有与Makefile里面一样的地址定义,两者必须保持一致。文件里面还有很多关于VME、PCI、USB、SCSI等定义,我建议把这些内容先删掉,并把相关文件也删掉。这样有助于保持代码清洁,也让你头脑更清醒。这些功能可以以后慢慢添加。

    configNet.h里面,因为一开始还没有网络驱动,所以把endDevTbl置空即可(只保留END_TBL_END项)。

    sysLib.c是BSP的主要文件。首先根据内存布局,配置好sysBatDesc和sysPhysMemDesc两个MMU描述表。这里可以参考以下mpc8260里面的相关写法。然后就是修改一些定义如SYS_MODEL等。sysLib.c会包含一些其他的BSP相关的文件,比如sysSerial.c sysNet.c等。这里其实只保留sysSerial.c即可,其他的暂时不用。

    一个最小的BSP,需要三个驱动: 定时器Timer,串口SIO, 中断控制器。

    Timer的话,所有的PowerPC都有一个dec timer,按固定的时间递减,为0时触发一个异常。这个驱动系统自带的就有(ppcDecTimer.c),我们拿过来稍微改改就能用了。

    中断控制器,虽然vxworks没有提供过e300系列的BSP,我们却在驱动目录发现了一个quiccIntrCtl.c。看里面的描述,是83xx系列用的。然后再看看结构定义,发现寄存器等和mpc5121e基本一致。这样一来就省事了,也是稍作修改就可以用了。

    SIO驱动就没这么好运了,没有现成的或类似的驱动可用,只能自己写。同样,vxworks提供了SIO模板,就在上面添加就行了。因为之前在bootloader里面已经知道串口是如何操作了,所以这部分其实不是很难。
    这里顺便提一下mpc5121e的串口。一般的串口都有自己的内部FIFO。mpc5121e的串口和FIFO是分开的,大小可以配置,比较灵活。当FIFO打开时,数据收发通过FIFO的数据端口实现。mpc5121e也有直接的数据端口,可以不通过fifo直接收发数据。刚开始在boorloader里面,我想不打开FIFO直接发数据,发现没有任何反应,没有任何发送动作。同样,若想直接接收数据,你找遍整个数据手册,都没发现有接收数据准备好标志。后来只好打开FIFO了事。也就是说,串口必须通过FIFO来使用,但数据手册里面只字未提啊。

    好吧,现在一切就绪,只差编译调试了。三个驱动可以先在syslib.c里面包含近来。然后创建工程编译,改掉无数编译错误后,成功得到一个vxworks文件!然后bootloader加载运行,又成功看到sysHwinit里面的调试打印输出!然后就没那么幸运了,系统挂了。通过在工程的prjConfig.c里面逐条插入打印语句,排查了若干逻辑错误后,终于,vxworks的LOGO出现了。抱歉这里写的这么简单,如果想详细写,就是另外一篇文章了。

    最后,打开MMU和cache,不出所料,系统又挂了。经过若干查找资料与代码测试,发现mpc5121e的cache不能先于MMU打开。奇怪的是8260系列也是基于603e的核,却没有这个问题。于是写了若干补丁代码,终于系统正常运行了。


    时间统计: 改代码、写代码,一天半时间。编译与各种调试,一天半时间。比起当年第一次写2410的bsp,要快两天:D

 

-------------------------------------------

update: 最近发现,关于cache的说法是不正确的.cache可以先于mmu打开.但是由于没有mmu的细粒度的控制,所有的存储访问都会被cache,包括IMMR空间.这样访问IMMR的程序就会出问题,导致死机等等.

    但是,只打开icache还是可以的,对系统的启动速度有所提高.

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值