最近根据客户要求,制作了一块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还是可以的,对系统的启动速度有所提高.