高速PCI信号采集卡设计与实现综合实例之:主机应用程序和驱动程序的接口设计
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函数
高速PCI信号采集卡 驱动程序 主机应用程序 接口设计 FPGA 相关文章:
- 高速PCI信号采集卡设计与实现综合实例之: 产品定型和设计文档备案(06-04)
- 高速PCI信号采集卡设计与实现综合实例之:产品稳定性和可靠性测试(06-04)
- 高速PCI信号采集卡设计与实现综合实例之:设计需求分析与功能定义(06-04)
- 高速PCI信号采集卡设计与实现综合实例之:样机的调试方法和技巧(06-04)
- 高速PCI信号采集卡设计与实现综合实例之:PCI卡的驱动程序设计(06-04)
- 高速PCI信号采集卡设计与实现综合实例之:硬件系统实现(06-04)