NTSTATUS PCIDriverDevice::DeviceControl(KIrp I)
{
NTSTATUS status;
switch (I.IoctlCode())
{
………………………………………
case IOCTL_HIL100_READ_IO_DATA:
status = IOCTL_HIL100_READ_IO_DATA _Handler(I);
case IOCTL_HIL100_WRITE_IO_DATA:
status = IOCTL_HIL100_WRITE_IO_DATA _Handler(I);
case IOCTL_HIL100_WRITE_DA_DATA:
status = IOCTL_HIL100_WRITE_DA_DATA _Handler(I);
case IOCTL_HIL100_READ_AD_DATA:
status = IOCTL_HIL100_READ_AD_DATA _Handler(I);
default:
status = STATUS_INVALID_PARAMETER;
break;
}
………………………….
}
在该函数进行驱动中相应的数据处理与传递,包括从内存中读上层应用程序发送下来的数据或将AD、CAN等外设传递上来的数据送到上层应用程序。
API函数主要提供了PCI卡的开关,A/D、D/A、I/O的读写函数,CAN的设置、读写,中断事件消息函数等。API函数与以上控制代码相关联,传递数据和控制参数。如下程序所示:
bool WriteDataToIO(unsigned char data) //写数据到IO口
{
……
ULONG BytesReturned;
if (!DeviceIoControl(hHIL100, IOCTL_HIL100_WRITE_IO_DATA, &data, 1,
NULL, 0, &BytesReturned, NULL))
……
}
bool ReadDataFromIO(unsigned char *data) //从IO口读数据
{
……
ULONG BytesReturned;
if (!DeviceIoControl(hHIL100, IOCTL_HIL100_READ_IO_DATA, &data, 1,
data, 1, &BytesReturned, NULL))
……
}
bool WriteDataToDA(unsigned short control,unsigned short freq[4])//写数据到AD
{
……
ULONG BytesReturned;
unsigned short pData[16];
pData[0]=control;
pData[1]=freq[0];
pData[2]=freq[1];
pData[3]=freq[2];
pData[4]=freq[3];
if (!DeviceIoControl(hHIL100, IOCTL_HIL100_WRITE_DA_DATA, pData, 10,
NULL, 0, &BytesReturned, NULL))
……
}
bool ReadDataFromAD(unsigned short address[8],unsigned short data[8])
{ //从AD读数据
……
ULONG BytesReturned;
if (!DeviceIoControl(hHIL100, IOCTL_HIL100_READ_AD_DATA,address,16,
&data,16, &BytesReturned, NULL))
……
}
bool ReadDataFromDA (unsigned char address,unsigned short *data)//从DA读数据
{
……
ULONG BytesReturned;
if (!DeviceIoControl(hHIL100, IOCTL_HIL100_READ_DA1_DATA,&address,1,
data, 2, &BytesReturned, NULL))
……
}
将这些接口函数生成动态链接库的形式,供上层应用程序调用。
3 结束语
由于PCI总线的高速特性,使其被广泛应用于高速数据采集系统和数据传输通信系统中,有效地解决了实时采集、实时传输和实时存储等问题。而PCI总线控制器专用芯片的出现则缩短了PCI总线硬件设备的开发周期,使得硬件设备的可靠性和稳定性都有了较大的提高。在开发过程中,尤其对于高速采样及实时严格的系统,我们实现了对该系统高效率的操作特性,该研究有效的解决了高速实时采集、实时传输和实时存储等的驱动问题。同时该PCI多功能CAN适配卡既实现了CAN总线通信功能,同时也实现了多路通道的数据采集和相应控制。
3 本文的创新观点
1) 本文将API函数与控制代码建立起关联
2) 本文将应用程序集成到对应的API函数里