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函数
用于回来当时终端状况,其函数原型为:
RETURN_CODEPlxIntrStatusGet(
HANDLEhDevice,//已翻开的PCI设备的句柄
PLX_INTR*pPlxIntr); //含有需求指定的中止信息的数据结构(PLX_INTR)
10.PlxIntrWait函数
用于等候中止,并可设定等候时刻长度,其函数原型为:
RETURN_CODEPlxIntrWait(
HANDLEhDevice,//已翻开的PCI设备的句柄
HANDLEhEvent,//被等候的事情句柄
U32Timeout_ms//为等候的时刻长度,单位为ms
);
由于此函数只能用在Linux体系中,因此在Windows体系中运用PLXAPI函数包等候中止时,运用别的两个WindowsAPI函数进行中止等候,即WaitSingleObject()函数和WaitMultipleObject()函数。
11.PlxDmaSglChannelOpen函数
用于敞开Scatter/Gather形式DMA通道,其函数原型为:
RETURN_CODEPlxDmaSglChannelOpen(
HANDLEhDevice,//已翻开的PCI设备的句柄
DMA_CHANNELchannel,//为被敞开的DMA通道
DMA_CHANNEL_DESC*pDesc);//包含DMA通道的参数描绘结构体(DMA_CHANNEL_DESC)指针
12.PlxDmaSglChannelClose函数
用于封闭现已翻开的Scatter/Gather形式DMA通道,其函数原型为:
RETURN_CODEPlxDmaSglChanneClose(
HANDLEhDevice,//已翻开的PCI设备的句柄
DMA_CHANNELchannel);//即将封闭的已被敞开的DMA通道
13.PlxDmaSglTransfer函数
用于开端进行Scatter/Gather形式的DMA传输,其函数原型为:
RETURN_CODEPlxDmaSglTransfer(
HANDLEhDevice, //已翻开的PCI设备的句柄
DMA_CHANNELchannel, //进行Scatter/Gather形式DMA传输的通道
DMA_TRANSFER_ELEMENT*dmaData, //指向用于DMA数据缓冲区结构(DMA_TRANSFER_
//ELEMENT)指针
BOOLEANreturnImmediate); //取值为FALSE表明程序等候DMA传输完毕后再履行下一
//条指令
//,反之,则不等候完毕就履行下一条指令
13.5.3API函数调用
有了这些丰厚的API函数资源,用户即可依据自己的需求为信号收集设备规划功用多样的应用程序。在进行应用程序的规划时,只需求将API函数库包含在用户的程序中即可。
PLX公司供给的PLXSDK开发包中包含了完好的API函数库文件。将这些API库文件复制到用户的应用程序目录下,并在程序中include进去,即可调用这些API函数。更多的函数及用法详见PLXSDK的编程者开发手册。
13.5.4PCI9054驱动程序装置
INF文件是装置设备驱动程序时有必要运用的文件,其扩展名为.inf。驱动程序装置后将它保存在windows/inf目录中,是Winodws操作体系下用来描绘设备或文件等数据信息的文件。
INF文件全称InformationFile文件。在操作体系发现新硬件之后向体系指明应该装置的驱动程序,体系为设备供给的服务以及注册表项要修正的内容。它为该设备供给一个全面描绘硬件参数和相应驱动文件(动态链接库等文件)的信息。
驱动程序装置的终究成果包含对体系的两个永久更改。
·描绘驱动程序的体系注册表项、它的卸载次序以及任何正确的装备材料。
·将驱动程序文件复制到一个指定的体系目录中。
INF文件是由规范的ASCII码组成,能够用任何一款文字编辑器检查修正其间的内容。它是分节的,每节以“[]”扩起来,每一个节名最长为255个字符(Windows2000/XP/2003操作体系中)或28个字符(Windows98操作体系中)。
节与节之间的内容叫条目,每一个节是由许多的条目组成的。每一个条目都由“=”分隔,如“a=b”。假如每一个条目的等号后有多个值,则每一个值之间用逗号分离隔。INF对巨细写不灵敏,行注释句子指令是“;”,相似VisualBasic里的“’”。假如一行写不下,运用“\”来换行。更多关于INF文件的规矩和阐明能够检查WindowsDDK的阐明,这儿不再胪陈。
经过INF文件,用户能够答应体系主动装置信号收集设备的驱动程序,或许在对话支撑下依照体系装置导游一步一步完结驱动程序装置进程。