微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于VxBus设备驱动程序架构的设备驱动开发

基于VxBus设备驱动程序架构的设备驱动开发

时间:11-17 来源:互联网 点击:

  最后这个结构在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)
  {……
   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((tempr0x1)!=0) //检查是否是该实例中断
{ *(PCI2040. instID.pRegister +0x4)=0x1;
temp= *(PCI2040. instIDpDspHpicRegister);
*(PCI2040. instIDpDspHpicRegister)=temp|0x0808;
//通知DSP,清除HINT中断
semGive(semForPci2040Int);
}
}
采用基于VxBus架构来开发PCI2040数据采集卡的驱动,通过扩展文件实现驱动的配置。与简单的非VxBus驱动相比,显然增加了工作量,然而对于基于多个BSP设备的复杂的驱动,VxBus驱动是优于非VxBus驱动的。通过实际运用证明,所开发采集卡的驱动能够稳定运行,并且能很方便地将该驱动移植到其他的系统。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top