转载:ISA板卡读取数据的驱动程序源码(1)
2008-09-20 17:23
225 查看
瀚海星云 -- Kernel精华区文章阅读
[返回上一页] [本讨论区]
本人曾经做过一个关于对各种ISA板卡读取数据的驱动程序, 期间也曾遇到很多困难,有幸得到本版几位大侠的帮助,感 激不已,先将我的源码共享给大家,希望能对大家有所帮助, 也希望能对繁荣本版进一点微薄之力! (注:本程序参考了“WDM设备驱动程序开发指”的例程, 因此,甚至在有些地方没有改动,DeviceIo.cpp中的代码 为主要部分) GUID.h /******************************************************************** created: 2001/07/01 created: 1:7:2001 22:03 filename: GUID.h author: Tulip *********************************************************************/ // {6C5DD839-5328-409b-AD0C-F15EF88A1E2A} DEFINE_GUID(VQC_GUID, 0x6c5dd839, 0x5328, 0x409b, 0xad, 0xc, 0xf1, 0x5e, 0xf8, 0x8a, 0x1e, 0x2a); // {4E8F502F-859B-4080-B4A3-02033B198E26} DEFINE_GUID(VQC5352_GUID, 0x4e8f502f, 0x859b, 0x4080, 0xb4, 0xa3, 0x2, 0x3, 0x3b, 0x19, 0x8e, 0x26); Ioctl.h /******************************************************************** created: 2001/07/01 created: 1:7:2001 22:03 filename: Ioctl.h author: Tulip *********************************************************************/ // Return status codes enum VQC_IO_ERRORS { VQC_OK = 0, VQC_UNRECOGNISED_CMD, // Unrecognised command VQC_NO_CMD_PARAMS, // Command does not have required VQC_NO_CMD_PARAMS, // Command does not have required number of parameters VQC_NO_OUTPUT_ROOM, // No room in output buffer VQC_NO_INTERRUPT, // IRQ_CONNECT: No interrupt resource given VQC_ALREADY_CONNECTED_TO_INT, // IRQ_CONNECT: Already connected to interrupt VQC_NOT_IN_RANGE, // IRQ_CONNECT: Interrupt register not in range VQC_BAD_INTERRUPT_VALUE, // IRQ_CONNECT: Impossible to get interrupt value with specified mask VQC_CANNOT_CONNECT_TO_INTERRUPT, // IRQ_CONNECT: cannot connect to the given interrupt VQC_DELAY_TOO_LONG, // Delay must be 60us or smaller VQC_CANCELLED, // Command processing stopped as IRP cancelled VQC_BYTE_CMDS_ONLY, // Only BYTE/UCHAR size commands are currently supported }; ///////////////////////////////////////////////////////////////////////////// // Command codes reg: 1 byte Offset into address space // Value 1/2/4 byte value according to top 2 bits // count: 1 byte count // seconds:IRQ based read or write timeout const UCHAR VQC_UCHAR = 0x00; const UCHAR VQC_UWORD = 0x40; // Not implemented yet const UCHAR VQC_ULONG = 0x80; // Not implemented yet enum VQC_IO_CMDS { VQC_WRITE, // reg,Value VQC_READ, // reg Value VQC_DELAY, // delay 1us units, delay<=60us VQC_WRITES, // reg,count,Values,delay Write values to same reg with delay VQC_READS, // reg,count,delay Values Read values from same reg with delay VQC_IRQ_CONNECT, // reg,mask,Value Connect to interrupt // on interrupt: reg read // on interrupt: reg read // anded with mask // if equals value then it's ours // Usually last cmd in a buffer to make next cmds synchronised VQC_DOTS, // Value VQC_WRITE_AD, // reg, Value VQC_READ_AD, // reg VQC_READ_DATA, // reg }; #define IOCTL_VQC_RUN_CMDS CTL_CODE( / FILE_DEVICE_UNKNOWN, / 0x801, / METHOD_BUFFERED, / FILE_ANY_ACCESS) #define IOCTL_VQC_REGISTER_EVENT CTL_CODE( / FILE_DEVICE_UNKNOWN, / 0x802, / METHOD_BUFFERED, / FILE_ANY_ACCESS) #define IOCTL_VQC_READ_ADC12 CTL_CODE( / FILE_DEVICE_UNKNOWN, / 0x803, / METHOD_BUFFERED, / FILE_ANY_ACCESS) #define IOCTL_VQC_READ_ADC24 CTL_CODE( / FILE_DEVICE_UNKNOWN, / 0x804, / METHOD_BUFFERED, / FILE_ANY_ACCESS) #define IOCTL_VQC_SINGLE_EVENT CTL_CODE( / FILE_DEVICE_UNKNOWN, / 0x805, / METHOD_BUFFERED, / FILE_ANY_ACCESS) #define IOCTL_VQC_WRITE_5373 CTL_CODE( / #define IOCTL_VQC_WRITE_5373 CTL_CODE( / FILE_DEVICE_UNKNOWN, / 0x806, / METHOD_BUFFERED, / FILE_ANY_ACCESS) #define IOCTL_VQC_READ_5372 CTL_CODE( / FILE_DEVICE_UNKNOWN, / 0x807, / METHOD_BUFFERED, / FILE_ANY_ACCESS) #define IOCTL_VQC_RW_5352 CTL_CODE( / FILE_DEVICE_UNKNOWN, / 0x808, / METHOD_BUFFERED, / FILE_ANY_ACCESS) #define IOCTL_VQC_OPEN_WATCHDOG CTL_CODE( / FILE_DEVICE_UNKNOWN, / 0x809, / METHOD_BUFFERED, / FILE_ANY_ACCESS) #define IOCTL_VQC_CLOSE_WATCHDOG CTL_CODE( / FILE_DEVICE_UNKNOWN, / 0x810, / METHOD_BUFFERED, / FILE_ANY_ACCESS) #define IOCTL_VQC_INITIRQ_5352 CTL_CODE( / FILE_DEVICE_UNKNOWN, / 0x811, / METHOD_BUFFERED, / FILE_ANY_ACCESS) Vqc.h /******************************************************************** created: 2001/07/01 created: 1:7:2001 21:59 filename: vqc.h author: Tulip *********************************************************************/ ///////////////////////////////////////////////////////////////////////////// // Include WDM standard header with C linkage #ifdef __cplusplus extern "C" { #endif #include "wdm.h" #ifdef __cplusplus } #endif ///////////////////////////////////////////////////////////////////////////// // DebugPrint and Guid headers #include "DebugPrint.h" #include "GUID.h" ///////////////////////////////////////////////////////////////////////////// // Our device extension typedef struct _VQC_DEVICE_EXTENSION { PDEVICE_OBJECT fdo; PDEVICE_OBJECT pdo; PDEVICE_OBJECT NextStackDevice; UNICODE_STRING ifSymLinkName; bool GotResources; // Not stopped bool Paused; // Stop or remove pending bool IODisabled; // Paused or stopped // bool InterruptsEnabled; LONG OpenHandleCount; // Count of open handles LONG UsageCount; // Pending I/O Count bool Stopping; // In process of stopping KEVENT StoppingEvent; // Set when all pending I/O complete // Resource allocations bool GotPortOrMemory; bool PortInIOSpace; bool PortNeedsMapping; PUCHAR PortBase; PHYSICAL_ADDRESS PortStartAddress; ULONG PortLength; bool GotInterrupt; ULONG Vector; KIRQL Irql; KINTERRUPT_MODE Mode; KAFFINITY Affinity; PKINTERRUPT InterruptObject; // Interrupt handling support bool ConnectedToInterrupt; WORK_QUEUE_ITEM ConnectIntWQI; // Work queue item for connecting to interrupt bool ConnectIntQueued; // Work queue item queued: StartIo bool ConnectIntQueued; // Work queue item queued: StartIo doesn't complete IRP NTSTATUS TxStatus; // R/W status return PUCHAR RunCmdsOutBuffer;// Output buffer during RUN_CMDS ULONG CmdOutputCount; // Count of bytes output from commands // 定时器(5386板上的8253) PKEVENT pTimerEvent; UCHAR Dots; // A/D转换卡(5438) PUCHAR ADBase; // AD板的首地址 UCHAR ADData[64]; // 从A/D读上来的数据缓冲区 // 24点采样 (Start) bool bFreeBuf, bNewBuf0, bNewBuf1; USHORT AD24Buf0[32][24]; USHORT AD24Buf1[32][24]; KSPIN_LOCK AD24Buf0Lock, AD24Buf1Lock; // 24点采样 (End) // 开出量(5373), 地址1--168, 2--110 PUCHAR Port_5373_1, Port_5373_2; // 开入量(5372), 地址1--114, 2--158, 3--164, 4--118 PUCHAR Port_5372_1, Port_5372_2, Port_5372_3, Port_5372_4; // 开入量(5352), 地址 178 PUCHAR Port_5352; // 利用 WATCHDOG PUCHAR Port_Watchdog443; PUCHAR Port_Watchdog44; } VQC_DEVICE_EXTENSION, *PVQC_DEVICE_EXTENSION; ///////////////////////////////////////////////////////////////////////////// // Forward declarations of global functions VOID VqcUnload( IN PDRIVER_OBJECT DriverObject ); NTSTATUS VqcPower( IN PDEVICE_OBJECT fdo, IN PIRP Irp ); NTSTATUS VqcPnp( IN PDEVICE_OBJECT fdo, IN PIRP Irp ); NTSTATUS VqcAddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo ); NTSTATUS VqcCreate( IN PDEVICE_OBJECT fdo, IN PIRP Irp ); NTSTATUS VqcClose( IN PDEVICE_OBJECT fdo, IN PIRP Irp ); NTSTATUS VqcWrite(IN PDEVICE_OBJECT fdo, IN PIRP Irp); NTSTATUS VqcRead(IN PDEVICE_OBJECT fdo, IN PIRP Irp); NTSTATUS VqcDeviceControl(IN PDEVICE_OBJECT fdo, IN PIRP Irp); NTSTATUS VqcSystemControl(IN PDEVICE_OBJECT fdo, IN PIRP Irp); VOID VqcStartIo(IN PDEVICE_OBJECT fdo, IN PIRP Irp); VOID VqcDpcForIsr(IN PKDPC Dpc, IN PDEVICE_OBJECT fdo, IN PIRP Irp, IN PVQC_DEVICE_EXTENSION dx); VOID VqcCancelIrp( IN PDEVICE_OBJECT fdo, IN PIRP Irp ); NTSTATUS VqcDispatchCleanup( IN PDEVICE_OBJECT fdo, IN PIRP Irp ); VOID IrqConnectRoutine( IN PVOID Context ); ///////////////////////////////////////////////////////////////////////////// bool LockDevice( IN PVQC_DEVICE_EXTENSION dx ); void UnlockDevice( IN PVQC_DEVICE_EXTENSION dx ); NTSTATUS StartDevice( IN PVQC_DEVICE_EXTENSION dx, IN PCM_RESOURCE_LIST AllocatedResourcesTranslated ); VOID StopDevice( IN PVQC_DEVICE_EXTENSION dx ); #define FreeIfAllocated(x) if( (x)!=NULL) { ExFreePool(x); (x) = NULL; } ///////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// NTSTATUS CompleteIrp( IN PIRP Irp, IN NTSTATUS status, IN ULONG info=0, IN CCHAR PriorityBoost=IO_NO_INCREMENT ); ///////////////////////////////////////////////////////////////////////////// -- ※ 来源:·武汉白云黄鹤站 bbs.whnet.edu.cn·[FROM: 211.69.197.65] ※ 来源: 中国科大BBS站 [bbs.ustc.edu.cn] |
相关文章推荐
- NDIS网络数据监控程序NDISMonitor(1)-----驱动程序(编译过程与源码讲解)
- C#源码读取excel数据到程序中-SQL SERVER-到dataset中
- fetch bulk collect into 批量效率的读取游标数据 【转载】
- 【转载】fscanf和fprintf函数从文件中格式化读取double型数据
- fetch bulk collect into 批量效率的读取游标数据 【转载】
- C++读取mat数据(1)【转载】
- hadoop源码解析之hdfs读取数据全流程分析
- Java源码——读取顺序存取文件中的数据(read text file and display each record)
- 【转载】C++ 简单读写文本文件、统计文件的行数、读取文件数据到数组
- VB快速读取TextBox第N行的数据 (转载)
- NDIS网络数据监控程序NDISMonitor(1)-----驱动程序(编译过程与源码讲解)
- 开放源码的对象关系映射工具ORM.NET 读取数据 Retrieve Data using ORM.NET
- Hadoop源码分析之客户端读取HDFS数据
- 往sqlite中写入图片二进制数据及读取源码 for iphone
- MongoDB数据访问[C#]附源码下载(查询增删改) 转载
- 往sqlite中写入图片二进制数据及读取源码 for iphone
- ArcEngine读取数据(数据访问)-转载
- 【转载】VC 通过剪贴板读取word数据并存为jpg
- NDIS网络数据监控程序NDISMonitor(1)-----驱动程序(编译过程与源码讲解)
- 【Netty源码分析】数据读取过程