BSP文件主要包含在Target/config下的目录中;其中target/config/aU中包含如下文件configAll.h,bootConfig.c,bootlnit.c,usrConfig.c等文件,这些都是BSP通用文件。我们一般不对这些通用文件作修改;target/config/integrator920t是专为基于ARM920T内核的处理器设计的BSP模板文件,我们所选择的S3C2410处理器是基于ARM920T内核的,因此我们主要的工作就是对这个文件夹下面的文件作修改。下面主要给出对该文件夹下面的几个重要文件所作的修改。
1)修改config.h
Config.h文件包含了所有头文件和与CPU板子相关的特殊定义。config.h中主要修改的内容有:
定义引导行
#define DEFAULT-BOOT-LINE\
"fei(0,0)host:/tor2/target/config/integrator920t/vxWorks"\
"h=90.0.0.3 e=90.0.0.50:ffffff00 u=target tn=targetname"
Fei为传输协议;host后面为主机中存放VxWorks映像的路径,h为主机IP,e为目标板IP。
目标板内存的配置,这一部分必须根据实际CPU以及外扩存储器的大小来确定:
#define LOCAL-MEM-LOCAL-ADRS 0x00000000
/*固定在零点*/
#define LOCAL-MEM-BUS-ADRS 0x00000000
/*固定在零点·/
#define LOCAL-MEM-SIZE 0x04000000
/*64MB由两片32M的外扩SDRAM组成*/
#define ROM-BASE-ADRS 0x24000000
/*ROM基地址*/
#define ROM-TEXT-ADRS ROM-BASE-ADRS
/*ROM中代码起始地址*/
#define ROM-SIZE 0x00100000
define RAM-LOW-ADRS 0x00001000
/*VxWorks映像入口点,对所有ARM处理器存储布局都一样*/
#define RAM-HIGH-ADRS 0x00600000
/* boot ROM在RAM中的入口*/
VxWorks的缺省配置是由configAll.h来确定的,用户可通过config.h来改变缺省配置,一般来说,缺省配置是按照比较完备的方式进行系统配置,而实际的软件、硬件环境往往不那么完备,用户必须查看configAll.h,并在config.h中将不要的软、硬件配置和初始化去掉.
2)修改romlnit.s
romlnit.s主要工作由函数romInit()完成,该函数是所有固化在ROM或者Flash里VxWorks映像首先执行的代码.主要完成的任务有;
禁止中断,使处理器复位。通过设置CPSR的I-BIT和F-BIT都为1来实现。还要设置中断寄存器为关模式同时将处理器切换到SVC32模式下,屏蔽AIC中断。
代码如下:
MRS r1,cpsr
BIC r1,r1,#MASK-MODE
ORR r1,r1,#MODE-SVC32 | I-BIT|F-BlT
MSR cpsr,r1
MOV r2,#IC-BASE
/*R2的值传递给中断控制器*/
MVN r1,#0/*&FFFFFFFF*/
STR r1,[r2,#FIQ-DISABLE-IC-BASE]
/*关闭所有FIQ中断源*/
STR r1,[r2,#IRQ-DISABLE-IC-BASE]
/*关闭所有IRQ中断源*/
保存启动类型,在跳至romlnit()函数的时候,传递启动类型.
初始化缓存并屏蔽缓存。
设定内存系统以及片子的片选,刷新周期,注意在配置刷新周期时一定要与具体板上扩展的SDRAM相一致。否则片子无法正常工作.关闭缓存建立内存控制器。
在调试这段代码的时候,由于串口网口都没有启动,因此只能通过点灯程序来加跟踪程序的执行情况。
另外,在romStart()跳转到romInit()的C程序之前尽可能少地初始化硬件.硬件的初始化是sysHwInit()程序完成的任务.
3)修改sysLib.c
sysLib.c是BSP初始化的核心代码,在这个文件中必须复位所有的硬件,使其处于初始化状态,以保证在后面中断使能之后,不会产生没有初始化的中断。它提供了板级接口,基于这些接口,VxWorks和应用程序的构造与系统无关。该文件功能大致包括:初始化功能;存储器/地址映射功能;总线中断功能;时钟计数器功能等.如下是其中两个重要的函数sysHwInit(),sysHwInit2()以及代码注释。
SysHwInit(),它由通用初始化函数usrInit()调用;
void sysHwInit(void)
{
fune-armIntStackSplit=sysIntStackSplit;
/*初始化IRQ/SVC中断堆栈程序*/
#if defined(INCLUDE-PCI)
sysV3Init(),/*初始化V3 PCI桥接控制器*/
if(pciIomapLibInit(PCI-MECHANISM-3,CPU-PCI-CNFIG-ADRS,CPU-PCI-CNFG-ADRS,0) !=OK)
sysToMonitor(BOOT-NO-AUTOBOOT);
#endif
#ifdef INCLUDE-SERIAL
sysSerialHwInit();/*初始化串口设备,该函数在sysSerial.c中*/
#endif
}
串口设备的初始化在sysSerial.c中完成初始化设备描述符:设置设备参数地址,波特率,以及设备中断级。
sysHwInit2(),连接系统中断,初始化其它必须的配置,该函数由定时器驱动中的sysClkConnect()调用。
void sysHwInit2(void)
{
static BOOL initialised=FALSE;
/*初始化中断库以及中断驱动*/
intLibInit(AMBA-INT-NUM-LEVELS,AMBA-INT-NUM-LEVELS,INT-MODE);
ambaIntDevInit();
/*连接系统时钟中断以及辅助时钟中断*/
(void)intConnect(INUM-TO-IVEC(SYS-TIMER-INT-VEC),sysClkInt,0);
(void)intConnect(INUM-TO-IVEC(AUX-TIMER-INT-VEC),sysAuxClkInt,0);
#ifdef INCLUDE-SERIAL /*连接串口中断*/
sysSerialHwInit2();
/*该函数也在sysSerial.c中*/
#endif
initialised=TRUE;
}
4.3 VxWorks的编译生成
对BSP包里面的文件修改好以后,需要对其进行编译下载调试,装载到目标板中的VxWorks映像取决于使用的下载方法,主要映像有:
1)VxWorks
这是下载型的VxWorks映像,从RAM开始执行,它由目标板上的引导程序通过串口或者网口将它下载到目标板本地的RAM中运行.在Tornado开发环境中,这是一个默认的选项,主要在调试阶段使用.使用宿主机上的WindShell工具和符号表。
2)VxWorks.st
这也是基于RAM的映像,需要通过引导ROM将它下载到目标机执行,但该对象文件内置符号表。
3)VxWorks-rom
这是非压缩,基于ROM的映像。在这个对象文件执行前把自已拷贝到目标机RAM中。这种类型的映像通常在启动阶段比较慢,但其执行阶段都在RAM中完成的,比驻留型的映像要快。
4)VxWorks.st-rom
这是ROM驻留的压缩的VxWorks映像。它在执行前把自己解压并拷贝到目标机RAM中执行。
5)VxWorks.res-rom
这是ROM驻留的非压缩VxWorks.st的映像。它在执行前把自己数据段拷贝到目标机RAM中.S3C2410可以Strata flash NOR flash或者smart media card NAND flash两种flash卡启动,当系统映像下载到某个flash,通过适当的跳线从指定的flash启动.
4.4调试中需要注意的几个问题
在romlnit.s中初始化程序不要太多,它初始化的目的是为了载入VxWorks映像,实际初始化任务主要由sysHwInit()函数来完成。对于下载型的VxWorks映像,sysAlib.s()中的sysInit()函数应该重复映像下载前的所有初始化操作,否则在一些情况下可能会忽略存储控制器的设置。
对特定的BSP驱动程序的修改,只能在特定的BSP的目录下,在这里为target/config/integrator920t目录下,不要直接在target/src/drv以及target/h/drv目录下修改.
调试阶段不要使用malloc()等缓冲区调用函数。如在前面所提到的函数intConnect()不能够在sysHwInit()中被调用,这是因为在VxWorks未启动之前,此时整个系统的内存分配库还没有被初试化,调用malloc()等缓冲区调用函数,将会导致系统瘫痪.
结语
本文在介绍了BSP组成以及VxWorks映像的启动过程后,以S3C2410开发板的BSP为例,介绍了VxWorks的BSP设计中的几个重要文件的修改以及在BSP开发调试中需要注意的几个问题。针对不同的目标板,BSP的实现不尽相同,需要根据目标板的具体硬件结构进行具体设计,但各种目标板之间有一定的共性,希望本文可以对开发各类型的目标板具有一定的参考价值。