PCI设备WINDOWS驱动程序的开发
果指定的内存不能存取,函数将返回FFFFFFFFH。
如:PDWORD pBase = (PDWORD)MapPhysToLinear((PVOID)PhysAddress,PhysSize,0);
将pBase传递给调用驱动的用户程序,用户程序就可以像使用指针一样利用pBase访问内存。
4、I/O端口的操作
在PC机上,I/O寻址方式与内存寻址方式不同,所以处理方法也不同。I/O空间是一个64K字节的寻址空间,I/O寻址没有实模式与保护模式之分,在各种模式下寻址方式相同。在Windows9x系统下,运行于第3级的应用程序也可以直接使用I/O指令访问I/O空间。在设备初始化访问配置空间时,已用到了I/O指令,在对硬件进行配置时,也可以根据从配置空间基址寄存器PCI Base Address 1中返回的I/O端口基地址使用I/O指令。
5、响应中断
VTOOLSD提供了VHardwareInt类,虚拟IRQ,处理硬件中断。在Windows9x中,VPICD虚拟了物理可编程中断控制器的端口,从而可以控制物理中断控制器。虚拟IRQ的编程思路:首先从VHardwareInt类中派生出一个类,重载OnHardwareInt函数;然后,动态创建一个派生类对象实例;最后钩挂处理程序,这就是需要编写的中断服务程序。(关于VHardwareInt类可参考VTOOLSD)
四、驱动程序的调用和封装
编写设备驱动并不是最终的目的,需要由用户程序来调用驱动并实现一定的功能。一般调用设备驱动是使用CreateFile函数打开设备文件,得到一个文件句柄。使用如下的语句就可以打开文件。
HANDLE hVxD=CreateFile("\\\\.\\PCIDEVICE.VXD",0,0,0, OPEN_EXISTING,
FILE_FLAG_DELETE_ON_CLOSE,
0);
打开设备文件后,调用DeviceIoControl函数就可以实现应用程序与设备驱动程序的通信。完成硬件操作之后,可以调用函数CloseHandle(hVxD);关闭设备驱动。(关于这三个函数的详细说明请参考MSDN)
至此,我们完成了对驱动程序的初步设计,考虑到有的函数(如DeviceIoControl)调用起来非常复杂,为了提高程序的通用性,要对部分函数进行封装。因为动态链接库(DLL)可以在多数软件开发平台中调用,所以常用DLL封装形式。另外需要注意的是由于驱动程序具有与操作系统相同的特权,并且直接操作硬件,如果程序工作不稳定,会造成死机甚至系统崩溃,所以要对驱动程序进行全面细致的测试。
参考文献
1.李贵山. PCI局部总线开发者指南 西安电子科技大学出版社 1997
2.彭礼孝.虚拟设备驱动程序开发起步与进阶 人民邮电出版社 2000
3.PCI BIOS SPECIFICATION Revision 2.1 1994
- 基于MCGS系统的DCS总线接口的设计与实现(11-15)
- 基于LabWindows/CVI的通信电源系统自动化测试的实现(01-23)
- LabWindows/CVI的便携式电源控制器测试系统设计(03-04)
- 基于LabWindows CVI的扭矩扳手数据处理系统的设计与实现(10-16)
- 基于LabWindows/CVI虚拟仪器编程语言的飞行模拟器(08-12)
- Windows系统安全模式另类应用(05-17)