您的位置:首页 > 其它

转载: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]
[返回上一页] [本讨论区]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: