BSP介绍与开发

1. BSP综述

BSP是系统用来管理外设的部分,由两部分组成:初始化、驱动程序。

所谓初始化是指从系统上电复位开始直到wind kernel和usrRoot根任务启动的这段时间,系统的执行过程。

驱动程序就是一些包含I/O操作的子函数。初始化包括:CPU Init、Board Init、System Init。CPU Init初始化CPU的内部寄存器。Board Init初始化智能I/O的寄存器,将device打通。System Init为系统的运行准备数据结构,进行数据初始化。

驱动程序的特点是不能自动执行,只能被动调用。调用可以有三种方式:任务直接调用、任务调用System Call、任务调用服务。所以驱动程序可以抽象为三个层次:常规操作、与VxWorks的接口、与Component的接口。常规操作是设备的固有操作逻辑,有两层含义: I/O编址微观上表现为CPU操作device的寄存器、宏观上表现为具体操作的含义。驱动程序与VxWorks的接口、驱动程序与Component的接口有三层含义:

  • I/O管理
  • 操作类型规整
  • 参数规整

驱动程序与VxWorks的接口使Driver具有更好的层次性,驱动程序与Component的接口使Driver具有更好的抽象性。

2. BSP的理解分析

BSP可以从两个角度出发:

  1. BSP在宿主机上由什么函数和文件组成,以及目录情况
  2. BSP在目标机上是以什么逻辑执行的

VxWorks的BSP组成文件主要包含在四个目录下:

Tornado\target\config\all :所有BSP的公共部分

Tornado\target\config\comps\vxworks :基本模块描述文件(*.cdf)

Tornado\target\config\comps\src :模块配置文件(被usrConfig.c使用)

Tornado\target\config\bspname :与目标板相关的部分

下面分别介绍这两个目录下的文件:

1. config\all:在该目录下主要有如下几个文件

bootConfig.c : 是所有Boot Rom的主要初始化与控制文件。

BootConfig.c是usrConfig.c的一个子集,所以Boot Image只能提供完整VxWorks Image中的部分功能。Boot Image不使用MMU库(SPARC除外)。在集成环境下修改工程相关的配置信息不会影响Boot Image,只有直接修改config.h,configAll.h,bootConfig.c和bootInit.c文件才会影响到Boot Image;

bootInit.c:定义了romStart()函数,用于Boot Rom的第二阶段初始化。首先把text和data段从ROM拷到RAM中,然后初始化部分RAM,进行解压;

usrConfig.c:包含VxWorks Image的主要初始化代码。使用命令行编译时才会用到此文件;

2. config\bspname:在该目录下主要有如下几个文件

makefile: 用于命令行下编译。其中定义了一些宏,如:ROM_TEXT_ADRS,ROM_WARM_ADRS,ROM_SIZE,RAM_LOW_ADRS,RAM_HIGH_ADRS;

config.h:包含所有的头文件和与CPU相关的宏定义,如:对Cache和MMU的配置,RAM和ROM的定位以及大小配置,外部总线地址映射,PCI地址宏;

romInit.s:该文件包含Boot Rom和Rom-based VxWorks Image的初始化入口汇编代码,即实现了romInit()。目标板一上电就开始执行romInit(),主要完成三部分工作:

  1. 屏蔽中断,初始化CPU;
  2. 配置内存系统,通常包括关闭cache,初始化内存控制器;
  3. 初始化堆栈指针和其它寄存器以执行C语言,然后调用romStart().

Note: romInit()函数必须设计成与内存地址无关的代码(PIC),romInit.s只执行一些必要的初始化,其余的初始化工作可放到sysHwInit()中实现。

sysALib.s:包含目标板或系统相关的汇编语言函数,即实现了_sysInit()。这是Boot Rom起来以后执行的第一段代码,sysALib.s类似于romInit.s完成的工作,但它不必设计成PIC,且可调用其它库中的函数。

sysLib.c:包含目标板或系统相关的C语言函数,该文件提供板级接口,通过该接口,VxWorks和应用程序的实现与目标系统无关,sysLib.c包含src\drv目录下的驱动程序子文件,驱动程序的安装和初始化在子文件中完成。

sysSerial.c:串口驱动程序的安装和初始化。

sysNet.c:网络接口设备的安装和初始化。

bspname.h:包含与板子相关的宏定义。若要把src\drv下的某驱动程序移植到目标板上,必须在bspname.h文件开始包含目录target\h\drv下该驱动程序相对应的头文件。 bspname.h应该定义:中断向量或中断号;I/O设备地址;设备寄存器位的含义定义;系统时钟和辅助时钟最大和最小时钟速率。

3. BSP的函数构成 sysLib.c中应该实现一下几类函数:

  1. 系统时钟中断相关的函数:sysClkConnect(),sysClkDisable(),sysClkEnable(),sysClkInt(),sysClkRateGet(),sysClkRateSet();
  2. 系统硬件初始化函数:sysHwInit(),sysHwInit2()
  3. 内存相关的函数:sysMemTop(),sysNvRamGet(),sysNvRamSet()
  4. 串口相关的函数:sysSerialHwInit(),sysSerialHwInit2(),sysSerialChanGet()
  5. 杂项函数:sysBspRev(),sysModel(),sysToMonitor()
  6. 其它可选函数:如:辅助时钟中断相关函数,总线相关函数。