基于VxBus设备驱动程序架构的设备驱动开发
VxBus是风河公司新的设备驱动程序架构,是VxWorks新增的特性,它是在VxWorks6.2及以后版本被增加到VxWorks中的。在以前的版本中,驱动程序并没有和工程配置集成到一起,如果要配置设备驱动,就要通过修改BSP目录下的config.h和syslib.c文件来完成。而基于VxBus架构模型的好处是允许驱动的集成和配置在Workbench工程中完成。这就意味着在Workbench环境下,每个驱动程序都能通过可视化环境进行配置,都能够按要求添加或删除设备。本文结合基于PCI2040数据采集卡驱动的开发过程[1],分析了VxBus架构下驱动的设计实现。
1 VxBus简介
VxBus是指在VxWorks中用于支持设备驱动的特有的架构,这种架构包含对minimal BSP的支持。它包括以下功能:①允许设备驱动匹配对应设备;②提供驱动程序访问硬件的机制;③软件其他部分访问设备功能;④在VxWorks系统中,实现设备驱动的模块化。VxBus在总线控制器驱动程序服务的支持下,能在总线上发现设备,并执行一些初始化工作,使驱动与硬件设备之间正常的通讯。
图1是VxBus 在整个系统中的位置示意图。从图1中可以看到,VxBus起到了辅助总线的作用,提供了对总线控制驱动的支持。
在VxWorks6.2版本发布前,设备驱动并不能被集成到VxWorks工程配置当中,为了添加或移出设备驱动,需要有丰富的BSP和驱动开发相关的知识[2]。并且在驱动被添加或移出时要去做一些管理VxWorks 工程的额外的工作。作为VxWorks系统组件的一部分,VxBus消除了上面遇到的一些难题,各种驱动和支持组件的添加与删除完全可以在Workbench工程中进行,而不需要BSP和驱动相关的知识,也不会在添加、删除驱动时增加管理VxWorks工程的额外工作。因此大大方便了BSP的开发。
2 硬件介绍
TI公司推出的PCI2040是一款用于实现PCI局部总线与DSP之间无缝链接的专用芯片。在VxWorks实时操作系统环境下实现主机与DSP的通讯,系统利用PCI2040实现TMS320VC5410与主机的通讯。由于PCI2040是TI的配套专用芯片,硬件级的连接比较简单,将对应的引脚连接即可。需要注意的是,未用的输入信号线需要通过上拉电阻上拉至有效逻辑电平。TMS320VC5410的MCBSP0与TLC2548 连接,实现8路12位A/D数据的采集。TMS320VC5410将采集到的数据通过PCI2040传输到主机上,数据在主机上得到进一步的处理。硬件连接框图如图2所示。
3 驱动开发
基于VxBus架构下PCI2040设备驱动的开发主要包括设备的初始化、设备控制以及设备驱动如何以组件形式添加到Workbench配置界面中。下面分步介绍它的实现。
3.1设备驱动初始化
设备的初始化,包含在BSP的初始化过程中[3],主要分三个阶段,如图3所示。
3.1.1内核预初始化阶段
系统上电启动,CPU在上电时跳转到一个指定的地址 ,开始执行指令,初始化内存和CPU,然后是VxWorks 的初始化处理。
在VxWorks内核预初始化早期,BSP的sysHwInit( )函数被执行[4],在这个函数中,设备驱动初始化工作第一步被执行。sysHwInit( )函数执行一些早期的初始化,调用hardWareInterFaceInit( )函数,执行初始化硬件内存分配机制,这步允许在系统内存池初始化之前,限制为设备驱动分配内存,这个函数接着调用hardWareInterFaceBusInit( ),在hardWareInterFaceBusInit( )函数中完成所有设备驱动和模块的注册工作。PCI2040的注册函数是vxbPci2040Register()。vxbPci2040Register()通过数据结构,向系统注册一些设备初始化函数。其中涉及到三个数据结构:
LOCAL struct drvBusFuncs PciFuncs =
{
Pci2040InstInit, /* devInstanceInit */
Pci2040InstInit2, /* devInstanceInit2 */
Pci204InstConnect /* devConnect */
}
在这个结构中,包含了初始化阶段要调用的函数。下面的初始化过程会用到这些函数。
LOCAL struct vxbDeviceMethod Pci2040Methods[] =
{
DEVMETHOD(ReadHPID, PCI2040ReadHPID),
DEVMETHOD(WriteHPID, PCI2040WriteHPID),
DEVMETHOD(ReadHPIA, PCI2040ReadHPIA),
DEVMETHOD(WriteHPIA, PCI2040WriteHPIA),
DEVMETHOD(ReadHPIC, PCI2040ReadHPIC),
DEVMETHOD(WriteHPIC, PCI2040WriteHPIC),
DEVMETHOD(ReadCSR, PCI2040ReadCSR),
DEVMETHOD(WriteCSR, PCI2040WriteCSR),
{ 0, 0 }
}
这个结构提供了应用软件操作硬件的一些函数及方法。
LOCAL struct vxbPciRegister Pci2040DevPciRegistration =
{
{
NULL, /* pNext */
VXB_DEVID_DEVICE, /* devID */
VXB_BUSID_PCI, /* busID = PCI */
VXB_VER_4_0_0, /* vxbVersion */
LNPCI_NAME, /* drvName */
Pci2040Funcs, /* 总线驱动函数*/
Pci2040Methods, /* 设备方法结构 */
Pci2040Probe, /* 设备探测函数 */
Pci2040ParamDefaults /* 参数*/
},
NELEMENTS(PciPci204DevIDList),
PciPci204DevIDList /*设备资源列表*/
};
VxWorks VxBus 设备驱动 BSP PCI2040 相关文章:
- 蓝牙无线耳机设计及VxWorks移植方法(07-21)
- 军事指挥系统中VxWorks下汉字显示技术(07-16)
- 基于VxWorks的文件系统的研究与实现(09-18)
- 嵌入式语音通信系统中VxWorks BSP的设计实现(09-18)
- 嵌入式系统的VxWorks安全性问题研究(11-06)
- VxWorks下的多重定时器设计(02-16)