当前位置:首页 > 嵌入式 > 嵌入式硬件
[导读]VxBus是风河公司新的设备驱动程序架构,是VxWorks新增的特性,它是在VxWorks6.2及以后版本被增加到VxWorks中的。在以前的版本中,驱动程序并没有和工程配置集成到一起,如果

VxBus是风河公司新的设备驱动程序架构,是VxWorks新增的特性,它是在VxWorks6.2及以后版本被增加到VxWorks中的。在以前的版本中,驱动程序并没有和工程配置集成到一起,如果要配置设备驱动,就要通过修改BSP目录下的config.h和syslib.c文件来完成。而基于VxBus架构模型的好处是允许驱动的集成和配置在Workbench工程中完成。这就意味着在Workbench环境下,每个驱动程序都能通过可视化环境进行配置,都能够按要求添加或删除设备。本文结合基于PCI2040数据采集卡驱动的开发过程[1],分析了VxBus架构下驱动的设计实现。

1 VxBus简介

VxBus是指在VxWorks中用于支持设备驱动的特有的架构,这种架构包含对minimal BSP的支持。它包括以下功能:①允许设备驱动匹配对应设备;②提供驱动程序访问硬件的机制;③软件其他部分访问设备功能;④在VxWorks系统中,实现设备驱动的模块化。VxBus在总线控制器驱动程序服务的支持下,能在总线上发现设备,并执行一些初始化工作,使驱动与硬件设备之间正常的通讯。

VxBus 在整个系统中的位置示意图。可以看到,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传输到主机上,数据在主机上得到进一步的处理。

 

3 驱动开发

基于VxBus架构下PCI2040设备驱动的开发主要包括设备的初始化、设备控制以及设备驱动如何以组件形式添加到Workbench配置界面中。下面分步介绍它的实现。

3.1设备驱动初始化

设备的初始化,包含在BSP的初始化过程中[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 /*设备资源列表*/

};

最后这个结构在vxbPci2040Registe()中被使用。这个结构包括几个驱动的初始化入口,其中Pci2040Probe()是 PCI2040采集卡的硬件探测函数,该函数在VxBus初始化过程中检测采集卡的数量,当检测到采集卡时,将采集卡与驱动结合,形成设备的一个实例,以便应用程序使用。Pci204InstanceInit( )函数在VxBus初始化的第一阶段被调用, Pci204InstanceInit( )函数只是简单地确保设备的中断被禁止。

当所有驱动在VxWorks注册之后,hardWareInterFaceBusInit( )和hardWareInterFaceInit( ) 函数返回,sysHwInit( ) 完成非VxBus 驱动的初始化并返回。sysHwInit( ) 函数返回后,VxWorks内核被初始化。

3.1.2 内核自检

在这个阶段,内核在sysHwInit2( )中执行,BSP调用Pci2040InstanceInit2( )函数[5]。在这个函数中,建立系统内存到设备空间的映射。关键部分代码如下:

LOCAL void Pci204InstInit2(VXB_DEVICE_ID pDev)

{……[!--empirenews.page--]

for (i = 0; i < VXB_MAXBARS; i++)

{

if (pDev->regBaseFlags[i] == VXB_REG_IO)

break;

}

if (i == VXB_MAXBARS)

return;

pDrvCtrl->Pci2040Bar = pDev->pRegBase[i];

vxbRegMap (pDev, i, &pDrvCtrl->Pci2040Handle);

//设备I/O映射到系统内存

……

}

此时,完成内核服务初始化,并可以被驱动访问。但是,中间层的服务仍然无效。

3.1.3 应用程序初始化驱动部分

在devInstanceInit2( )函数最后,创建用户的运行任务,并完成设备驱动的初始化。在这个阶段,Pci2040InstanceConnect( )函数被调用,完成最后的初始化工作,在这个函数中,主要是建立中断与中断服务程序的连接。

至此,设备驱动的初始化完成。

3.2驱动程序的配置

采用VxBus驱动的一个主要优点是:设备的驱动程序可以被看成VxWorks 系统的一个组件,通过集成的Workbench开发环境来配置设备驱动。为了实现这一功能,开发的驱动需要增加一些额外的扩展文件。标准VxWorks设备驱动有一个最小的文件集,对于大多数VxWorks设备驱动,最小的设备驱动集要求有6个单独的文件[6]。PCI2040数据采集卡需要有以下文件:

· 一个驱动源文件PCI2040.c,执行驱动运行逻辑,包括PCI2040驱动的实现代码。

· 一个组件描述文件PCI2040.cdf,允许集成驱动到VxWorks开发工具Workbench当中。

· 一个PCI2040.dc文件,提供驱动注册函数原型。

· 一个PCI2040.dr文件,提供一个调用注册函数的C语言代码段。

· 一个readme文件 ,提供版本信息。

· 一个makefile 文件,提供建立驱动的编译规则。

当上述文件在workbench环境下进行相应的配置后,PCI2040的设备驱动就会以组件的形式出现在开发工程的Kernel Configuration选项中,可以方便地进行PCI2040驱动配置。

4 应用程序与驱动的通信

为了使设备和驱动能够在VxWorks系统中使用,让应用程序、中间件、VxWorks内核模块访问设备,执行一些操作,最基本的方法是在VxWorks 中采用VxBus方法来实现硬件设备的访问。VxBus方法是在驱动中公开一个入口,使VxBus中API函数可以调用这些入口函数。在PCI2040初始化阶段,Pci2040Methods结构中注册的函数就是在驱动中公开的函数,用于对PCI2040的操作。

例如,通过PCI2040 完成对DSP数据寄存器的访问

struct vxbDriverControl ctrl;

vxbDevMethodRun(DEVMETHOD_CALL(ReadHPID),&ctrl);

vxbDevMethodRun( )函数够被用于调用一个指定的驱动方法,这个函数反复查找所有的实例,并检查每一个,看是否有指定公开申明的方法,如果实例有指定的方法,vxbDevMethodRun( )调用方法函数。

为了避免重复遍历在系统上的所有实例,可以用 vxbDevMethodGet( )函数找出驱动函数相对应的驱动方法 ,然后通过下面代码完成函数调用。

STATUS (*methodFunc)(VXB_DEVICE_ID devID, void * pArg);

methodFunc = bDevMethodGet(devID,DEVMETHOD_CALL(ReadHPID));

if(methodFunc != NULL )

(*methodFunc)(devID, pArg);

在PCI2040的数据采集卡中,通常是DSP在采集完数据后,通过中断通知主机,去读取数据。下面是中断服务相关代码。

void PCI2040Isr()

{ ……

temp=*(PCI2040. instID.pRegister+0x4); //读中断寄存器

if((tempr&0x1)!=0) //检查是否是该实例中断

{ *(PCI2040. instID.pRegister +0x4)=0x1;

temp= *(PCI2040. instIDpDspHpicRegister);

*(PCI2040. instIDpDspHpicRegister)=temp|0x0808;

//通知DSP,清除HINT中断

semGive(semForPci2040Int);

}

}

采用基于VxBus架构来开发PCI2040数据采集卡的驱动,通过扩展文件实现驱动的配置。与简单的非VxBus驱动相比,显然增加了工作量,然而对于基于多个BSP设备的复杂的驱动,VxBus驱动是优于非VxBus驱动的。通过实际运用证明,所开发采集卡的驱动能够稳定运行,并且能很方便地将该驱动移植到其他的系统。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在嵌入式系统开发、调试和测试过程中,J-Link作为一种高效的调试工具,为开发者提供了极大的便利。然而,要想充分发挥J-Link的功能,首先需要正确安装其驱动程序。本文将详细介绍J-Link驱动的安装过程,并深入解析其中...

关键字: jlink 嵌入式系统 嵌入式开发

与谷歌的合作使 Nordic 能够在 nRF Connect SDK 中嵌入开发人员软件,以构建与安卓移动设备兼容的谷歌Find My Device和未知跟踪器警报服务

关键字: 谷歌 SoC 嵌入式开发

嵌入式开发作为当今电子工程和信息技术领域的核心分支,涵盖了广泛的软硬件技术和系统集成方法,用于构建高性能、低成本、低功耗、体积小巧且功能专一的嵌入式系统。这些系统无处不在,从微型传感器节点到复杂的工业控制设备,从日常使用...

关键字: 嵌入式开发 Python

嵌入式开发是当今信息技术领域不可或缺的一部分,它融合了硬件设计、软件开发和系统集成等多个学科,专门用于创建那些被嵌入到特定设备或系统中的专用计算机系统。嵌入式开发的主要过程包括利用分立元件或集成器件进行电路设计、结构设计...

关键字: 嵌入式开发 硬件设计 软件开发

嵌入式开发作为一种专业且技术密集型的领域,涵盖了从硬件底层驱动、中间件到应用层软件开发等多个层面的工作,其所需的工具种类繁多,各有针对性,旨在提升开发效率、保证代码质量以及简化调试过程。

关键字: 嵌入式开发 keil

嵌入式开发作为信息技术领域的重要分支,其涉及的语言种类繁多,各具特色。这些语言的选择取决于目标平台的特性、性能需求、开发者的熟练程度以及项目的具体要求。本文将详细介绍几种常见的嵌入式开发语言,包括C语言、C++、汇编语言...

关键字: 嵌入式开发 C语言

嵌入式开发是一项综合了硬件设计、软件编程以及系统整合的技术活动,其目的是为了创造出能够在特定环境中高效、稳定运行的嵌入式系统。这一流程涵盖了多个紧密关联且不可或缺的阶段,从最初的客户需求分析到最终的产品测试和交付,每个环...

关键字: 嵌入式开发 硬件设计

嵌入式开发作为一个融合了计算机软硬件和系统工程的综合性领域,其成功与否往往取决于三个核心要素的有效整合与协调。这三个要素分别是:硬件平台的选择与设计、软件开发及其优化、以及系统级的设计与集成。深入理解并熟练掌握这三个方面...

关键字: 嵌入式开发 ARM

嵌入式开发作为信息技术的关键支柱,在全球数字化转型浪潮中扮演着无可替代的角色。从传统的嵌入式微控制器到如今先进的片上系统(SoC),再到与云计算、人工智能深度融合的智能终端,嵌入式系统的演进与发展始终紧跟时代脉搏。本文将...

关键字: 嵌入式开发 智能应用

嵌入式开发是一种专门针对特定硬件平台设计和实现软件系统的工程实践,它涵盖了从需求分析、系统设计、编程实现、调试测试直到产品部署及维护的全过程。本文将深入探讨嵌入式开发的主要阶段,分解其流程并阐述每个步骤的关键要点,以便于...

关键字: 嵌入式开发 嵌入式软件
关闭
关闭