概述
本文主要是记录《VxWorks BSP Developer's Guide 6.9》和《VxBus Device Driver Developer's Guide 6.9》的部分章节内容,重点关注VxWorks 6.9的BSP移植和驱动开发。
BSP概述
本章主要介绍VxWorks启动过程中调用的BSP相关函数,BSP移植的主要工作就是实现这些函数。
函数 | 文件 | 描述 |
romInit() | romInit.s | 初始化CPU和内存 |
sysHwInit() | sysLib.c | 硬件外设初始化 |
sysHwInit0() | sysLib.c | 在sysHwInit()之前完成特定硬件外设初始化,该函数只在部分BSP中需要 |
sysHwInit1() | sysLib.c | 只有64bit需要,初始化所有硬件外设和虚拟内存 |
sysHwInit2() | sysLib.c | 准备VxWorks应用运行所需的硬件外设 |
BSP所需的源文件包括:
Required BSP Files:
installDir/vxworks-6.x/target/config/bspname/bspname.h
installDir/vxworks-6.x/target/config/bspname/config.h
installDir/vxworks-6.x/target/config/bspname/Makefile
installDir/vxworks-6.x/target/config/bspname/README
installDir/vxworks-6.x/target/config/bspname/romInit.s
installDir/vxworks-6.x/target/config/bspname/sysALib.s
installDir/vxworks-6.x/target/config/bspname/sysLib.c
installDir/vxworks-6.x/target/config/bspname/target.ref
Optional BSP Files:
installDir/vxworks-6.x/target/config/bspname/sysSerial.c
installDir/vxworks-6.x/target/config/bspname/configNet.h
installDir/vxworks-6.x/target/config/bspname/sysEnd.c
VxBus Device Driver Directories:
installDir/vxworks-6.x/target/src/hwif/busCtlr
installDir/vxworks-6.x/target/src/hwif/console
installDir/vxworks-6.x/target/src/hwif/cpu
installDir/vxworks-6.x/target/src/hwif/demo
installDir/vxworks-6.x/target/src/hwif/dmaCtlr
installDir/vxworks-6.x/target/src/hwif/end
installDir/vxworks-6.x/target/src/hwif/end2
installDir/vxworks-6.x/target/src/hwif/fw
installDir/vxworks-6.x/target/src/hwif/h
installDir/vxworks-6.x/target/src/hwif/hEnd
installDir/vxworks-6.x/target/src/hwif/i2c
installDir/vxworks-6.x/target/src/hwif/intCtlr
installDir/vxworks-6.x/target/src/hwif/mf
installDir/vxworks-6.x/target/src/hwif/mii
installDir/vxworks-6.x/target/src/hwif/nvram
installDir/vxworks-6.x/target/src/hwif/resource
installDir/vxworks-6.x/target/src/hwif/sio
installDir/vxworks-6.x/target/src/hwif/spi
installDir/vxworks-6.x/target/src/hwif/storage
installDir/vxworks-6.x/target/src/hwif/timer
installDir/vxworks-6.x/target/src/hwif/usb
installDir/vxworks-6.x/target/src/hwif/util
installDir/vxworks-6.x/target/src/hwif/vxbus
VxWorks Configuration Directories:
installDir/vxworks-6.x/target/config/all
installDir/vxworks-6.x/target/src/config
installDir/vxworks-6.x/target/config/comps
installDir/vxworks-6.x/target/config/comps/src
installDir/vxworks-6.x/target/config/comps/vxWorks
重要源文件说明:
prjParams.h | VxWorks组件化配置和裁剪,自动生成开关宏(COMPONENTS INCLUDED)和宏参数(PARAMETERS)文件。prjParams.h通常被config.h包含,prjComps.h被target/config/comps/src/configAll.h包含。 |
prjComps.h | |
configAll.h | 被config.h包含 |
configNet.h | 增强型网络驱动配置文件 |
config_pre.h | |
config.h | |
sysALib.s | |
sysLib.c | |
linkSyms.c | |
prjConfig.c | 包含config.h,是VxWorks应用程序的入口,因为prjConfig.c的usrRoot()函数调用了usrAppInit()。创建工程或者重新编译VxWorks系统镜像工程时自动生成,用来初始化VxWorks系统各个组件,每次重新编译工程时会重置。 |
usrConfig.c | 编译bootrom文件时使用,功能与prjConfig.c类似。 |
vxBus.c | |
usrAppInit.c |
VxWorks Image启动流程
sysInit : sysALib.s
禁用中断,初始化栈,跳转到usrInit()
usrInit() : prjConfig.c
sysStart(startType) /* 清零BSS段,配置异常向量表基地址等 */
sysHwInit0();
intVecBaseSet ((FUNCPTR *) VEC_BASE_ADRS);
excShowInit();
usrBootHwInit()
cacheLibInit()
excShowInit()
excVecInit()
sysHwInit() /* 外设驱动初始化 */
usrCacheEnable()
objInfoInit()
objLibInit()
vxMemProbeInit()
classListLibInit()
semLibInit()
classLibInit()
kernelBaseInit()
taskCreateHookInit()
sysDebugModeInit()
usrKernelInit()
sysHwInit() : sysLib.c
hardWareInterFaceInit()
usrKernelInit() : usrKernel.c
调用taskLibInit()初始化task库,计算内存池结束地址memPoolEndAdrs,最后调用kernelInit()
kernelInit() : kernelLib.c
初始化并启动内核,从内存池顶部创建根堆栈和TCB,最后创建tRootTask任务用于执行usrRoot()初始化
usrRoot() : prjConfig.c
初始化内存、系统时钟、I/O系统,标准输入输出,异常处理,添加用户应用程序。
usrAppInit() : usrAppInit.c
用户代码入口。
VxWorks设备驱动
VxWorks设备驱动有VxBus-enabled和legacy(pre-VxBus)两种实现方式。VxBus形式的设备驱动天然支持SMP(symmetric multiprocessing)。
VxBus驱动框架为VxWorks内核和硬件外设定义了一组标准的驱动接口。
VxBus设备驱动有三个要素:设备、驱动和实例。
应用程序通过vxbDevMethodGet()函数去查询每一个实例。
开发流程
重要结构体:
struct hcfResource
{
char * name;
UINT32 type;
union
{
char * string;
UINT32 integer;
void * addr;
ULONG longval;
} u;
};
struct hcfDevice
{
char * devName;
int devUnit;
int busType;
int busIndex;
int count;
const struct hcfResource * pResource;
};
1、实现vxbDevRegInfo设备描述块结构体实例,并通过vxbDevRegister(structure vxbDevRegInfo *pDevInfo)注册驱动程序;
VxWorks系统启动时,通过sysHwInit() -> hardWareInterFaceInit() -> hardWareInterFaceBusInit()调用vxbDevRegister()注册驱动程序。
struct vxbDevRegInfo
{
struct vxbDevRegInfo * pNext;
UINT32 devID;
UINT32 busID;
UINT32 vxbVersion;
char drvName[MAX_DRV_NAME_LEN+1];
struct drvBusFuncs * pDrvBusFuncs;
struct vxbDeviceMethod * pMethods;
BOOL (*devProbe) ( struct vxbDev * pDevInfo);
struct vxbParams * pParamDefaults;
};
pNext用于总线级联,如果没有级联,则置为NULL。
drvName表示设备名称,同时实现设备与驱动的匹配,只有与hcfDeviceList中的设备名称一致,才能匹配上。
pMethods用于提供总线的各种方法,但是通常只提供该总线特有的方法,因为通用方法如open, read等,一般都通过I/O层的系统调用,它们需要单独注册。
devProbe用于检测当前是否存在该类型的设备,如果不需要探测,则置为NULL。
pDrvBusFuncs提供了设备初始化需要的接口:
struct drvBusFuncs
{
void (*devInstanceInit) (struct vxbDev *);
void (*devInstanceInit2) (struct vxbDev *);
void (*devInstanceConnect) (struct vxbDev *);
};
devInstanceInit在VxWorks内核初始化前被调用,devInstanceInit2在VxWorks内核初始化之后内调用,一般设备初始化都通过devInstanceInit2实现。
devInstanceConnect用于设备连接,通常可以不使用,如果它依赖于其他设备,则可以把启动代码放在这里。
2、在hcfDeviceList中添加设备;
hcfDeviceList[]数组管理VxBus驱动框架的所有设备,每个成员描述符的最后一个成员变量pResource用于配置设备特性信息,如串口波特率等。可以通过devResourceGet()函数获取。
3、VxWorks系统启动时,会实例化hcfDeviceList中的设备;
实例化的过程是VxWorks系统遍历hcfDeviceList[]数组,如果hcfDevice->devName与vxbDevRegInfo->drvName与匹配,则调用指向的驱动的初始化函数,如devInstanceInit。
4、在vxbDevRegInfo设备描述结构体实例注册的几个初始化函数中添加示例的设备驱动代码;
vxBusShow命令可以查看所有初始化的设备。