微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 高速PCI信号采集卡设计与实现综合实例之:主机应用程序和驱动程序的接口设计

高速PCI信号采集卡设计与实现综合实例之:主机应用程序和驱动程序的接口设计

时间:06-04 来源:互联网 点击:

13.5主机应用程序和驱动程序的接口设计

13.5.1驱动程序例程的封装

通过调用PCI设备驱动程序的例程,我们可以实现操作系统对PCI设备的控制。但是直接调用例程进行编程往往显得不够直接,也不具有足够的针对性。因此在高级语言里面对PCI设备或者信号采集设备的控制,往往是调用已经封装过的例程。

将例程进行封装,形成一些可以调用的具有针对性的PCI信号采集设备API函数,是驱动开发者比较头疼的问题。因为这个过程需要了解WindowsWDM模型,熟悉WindowsDDK的开发过程,而这些往往需要花费硬件开发者的大量时间。

幸运的是,有一些很好的集成开发环境帮助我们完成了这个工作。用户只需要将具体设备的参数导入开发工具的向导中,即可自动生成对应该设备的驱动程序。这些开发工具包括DriverStudio、Windriver等。

另外,针对基于PCI9054的PCI设备,PLX公司已经为用户提供了较为完备的API函数包。用户只需要根据需要调用其中的API函数,即可轻松实现对PCI9054采集设备的控制。下面介绍几个常用的PLXAPI函数。

13.5.2PLXAPI函数

PLX公司为其提供的动态链接库中包含了丰富的API函数,可以用于PCI9054卡的控制与传输。在这些API函数中,有如下的几个是常常用到的(注:在2007年5月提供的PLXSDKVersion5.0中,API函数名有所更新,下面仍然按照V5版之前的函数名进行介绍)。

1.PlxPciDeviceOpen函数

用于设备启动,在对设备进行任何操作之前都应该先打开设备,其函数原型为:

RETURN_CODEPlxPciDeviceOpen(

DEVICE_LOCATION*pDevice,//指向包含设备信息的数据结构的指针

HANDLE*pHandle //指向用于存放已打开设备的句柄的指针

);

DEVICE_LOCATION数据结构的定义如下:

typedefstruct_DEVICE_LOCATION{

U8BusNumber;//PCI设备所在的总线号

U8SlotNumber;//PCI设备所在的插槽号

U16DeviceId;//PCI设备的设备号

U16VendorId;//PCI设备的厂商号

U8SerialNumber[12];//PCI设备的惟一标识码

}DEVICE_LOCATION;

对于PCI9054来说,DeviceId为10b5,VendorId为5406(不同的版本可能为9054)。SerialBumber的格式为“devicename>-indexnumber>”。如:有PLX9054的PCI卡,如果它的序列号为“Pci9054-1”,表示这是第二个PLX9054设备,第一个为“Pci9054-0”。

2.PlxPciDeviceClose函数

用于关闭已打开的PCI设备,其函数原型为:

RETURN_CODEPlxPciDeviceClose(HANDLEhDevice);//已打开的PCI设备的句柄

3.PlxPciBoardReset函数

用于复位已经打开的PCI设备,其函数原型为:

VOIDPlxPciBoardReset(HANDLEhDevice);//已打开的PCI设备的句柄

4.PlxBusIopRead函数

用于从本地总线读取数据(常指DirectSlave读模式),其函数原型为:

RETURN_CODEPlxBusIopRead(

HANDLEhDevice,//已打开的PCI设备的句柄

IOP_SPACEIopSpace,//PCI总线至本地总线,映射空间0/1

U32address,//若bRemap=FALSE,代表IOPSpace相对地址,否则是绝对地址

BOOLEANbRemap,//绝对地址与相对地址布尔值

VOID*pBuffer,//指向用户用于存放读取数据的缓冲区

U32ByteCount,

ACCESS_TYPEAccessType);//读数据方式,支持本地总线使用8位、16位或32位进行传输

5.PlxBusIopWrite函数

用于从本地总线写数据(常指DirectSlave写模式),其函数原型为:

RETURN_CODEPlxBusIopWrite(

HANDLEhDevice,//已打开的PCI设备的句柄

IOP_SPACEIopSpace,//PCI总线至本地总线,映射空间0/1

U32address,//若bRemap=FALSE,代表IOPSpace相对地址,否则是绝对地址

BOOLEANbRemap,//绝对地址与相对地址布尔值

VOID*pBuffer,//指向用户用于存放读取数据的缓冲区

U32ByteCount,//读取的数据量大小

ACCESS_TYPEAccessType);//读数据方式,支持本地总线使用8位、16位或32位进行传输

6.PlxIntrAttach函数

用于链接中断,当有效中断产生时,将事件传递给指针句柄,其函数原型为:

RETURN_CODEPlxIntrAttach(

HANDLEhDevice,//已打开的PCI设备的句柄

PLX_INTRintrTypes,//含有需要指定的中断信息的数据结构(PLX_INTR)

HANDLE*pEventHdl);//指向接收中断事件的指针句柄

7.PlxIntrDisable函数

用于禁止某类中断,其函数原型为:

RETURN_CODEPlxIntrDisable(

HANDLEhDevice,//已打开的PCI设备的句柄

PLX_INTR*pPlxIntr); //含有需要指定的中断信息的数据结构(PLX_INTR)

8.PlxIntrEnable函数

用于使能某类中断,其函数原型为:

RETURN_CODEPlxIntrEnable(

HANDLEhDevice,//已打开的PCI设备的句柄

PLX_INTR*pPlxIntr); //含有需要指定的中断信息的数据结构(PLX_INTR)

9.PlxIntrStatusGet函数

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

网站地图

Top