PCI总线数据输出板驱动程序的开发
4 添加代码完成应用程序和驱动程序的通信
在DriverWorks中,应用程序使用CDeviceInterfaceClass的实例去获得一个或更多的DeviceInterface实例。CDeviceInterface类抽象了一个单一设备接口,它的成员函数DevicePath( )返回一个路径名指针,它被发送到CreateFile去打开设备,即获取设备句柄。
打开设备以后,应用程序通过函数ReadFile(),WriteFile()和DeviceIoControl()函数调用访问设备。其中,DeviceIoControl()函数可以用不同的IOCTL命令实现不同的功能。要完成应用程序和驱动程序的通信,还必须添加硬件板卡访问命令。在驱动程序中,主要用inb(),outb()函数进行硬件访问,具体参数可参照vc的msdn。
在本系统中,主要用DeviceIoControl()来调用驱动程序。相应的通信函数和添加的读写代码如下:
NTSTATUS PCI_DADevice::PCI_DA_IOCTL_Read_Handler(KIrp I)
{
NTSTATUS status= STATUS_SUCCESS;
//得到IOCTL缓冲区指针
PUCHAR pOutBuffer=(PUCHAR) I.IoctlBuffer() ;
//输出缓冲区大小
ULONG ioOutSize=I.IoctlOutputBufferSize();
//读取偏移地址为n-1的数据,放入输出缓冲区,传递给应用程序
pOutBuffer[0]= m_MemoryRange1.inb(ioOutSize-1);
//读取一个字节数据
I.Information()=1;
return status;
}
NTSTATUS PCI_DADevice::PCI_DA_IOCTL_Write_Handler(KIrp I)
{
NTSTATUS status=STATUS_SUCCESS;
//得到IOCTL缓冲区指针
PUCHAR pInBuffer=(PUCHAR) I.IoctlBuffer ();
//输入缓冲区大小
ULONG ioInSize=I.IoctlInputBufferSize();
//将数据写入偏移地址为n-1的存储单元
m_MemoryRange1.outb
(ioInSize-1,pInBuffer[0]);
//写入大小为一个字节
I.Information()=1;
return status;
}
编译驱动程序,生成一个.inf文件和一个.sys文件,这就是需要安装的驱动程序文件。编译无错误,就可以安装调试驱动程序了。
5 安装调试驱动程序
插入自己设计的PCI板卡,重新启动计算机,出现安装新硬件向导。安装已经生成的.inf文件和.sys文件。安装后,查看pci设备的资源,若与自己硬件设置的资源空间相同,则设备驱动安装成功。
用Windows自带的命令提示符,打开驱动程序框架自带的test应用程序,测试通过驱动程序读写数据。若读取的和写入的数据一致,则驱动程序开发成功。
结束语
本文以一种基于PCI总线的D/A数据输出板卡为例,介绍了在Windows 2000/XP下用DriverStudio开发PCI总线WDM驱动程序的基本方法,详细叙述了应用程序和驱动程序之间的通信机制和硬件访问方法;针对板卡的硬件结构和功能用途,介绍了PCI9052总线控制器PCI配置寄存器和局部配置寄存器地址配置的具体方法;给出了利用安装新硬件向导安装驱动程序的方法,实现了上位机和数据输出板卡的通信。
- PCI9030及其PCI总线接口电路设计(07-28)
- 基于PCI总线的雷达视频高速数据采集接口设计(10-16)
- 基于CPCI总线的智能A/D,D/A模块设计(01-28)
- 基于PCI总线的数字图像处理仿真系统设计方案(01-21)
- 基于PCI总线的GP-IB接口电路设计与实现(09-06)
- PCI总线和PCIE总线的差异(12-04)