⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 whusb20.h

📁 linux 下的驱动程序 欢迎下载
💻 H
字号:
//////////////////////////////////////////////////////////////////////////////
//文件名称:Whceb01.h
//文件功能:设备扩展、各种驱动例程以及自定义函数的声明
//文件作者:张伟标
//工作部门:研究一室
//创建时间:2004年1月9日
//修改记录:
//版权所有:维豪信息技术有限公司
//
//Copyright 2004 WellHope Information Technology Corporation, Ltd.
//All rights reserved.
/////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////
//	Include WDM standard header with C linkage

#ifdef __cplusplus
extern "C"
{
#endif

//#include "wdm.h"
#include <wdm.h>
//#include <ntddk.h>
#include <stdio.h>

#include "usb100.h"
#include "usbioctl.h" //自己加的
#include "usbdi.h"
#include "usbdlib.h"

#ifdef __cplusplus
}
#endif


/////////////////////////////////////////////////////////////////////////////
//	DebugPrint and Guid headers
#include "Whusb20Type.h"
#include "Whusb20DebugPrint.h"
#include "initguid.h"
#include "Whusb20Guid.h"
#include "Whusb20Trace.h"
#include "Whusb20Defs.h"    //自定义结构及常量


/////////////////////////////////////////////////////////////////////////////
//	Our device extension
#define MAX_CHANNEL		4
#define VALID_CHANNEL	1

#define	WHCEB01_TIMEOUT		-10000*2000 //20毫秒
#define WHCEB01_CREATE_TIMEOUT	-10000*5000	//5s

typedef enum
{
		CHNL_0 = 0,
		CHNL_1 = 1,
		CHNL_2 = 2, //为了方便与运算,所以定义为4
		CHNL_3 = 3,
		CHNL_ERROR = 0xff
}WHCEB01_CHNL;

typedef struct _WHCEB01_CHANNEL
{
	WHCEB01_CHNL		ChannelNum;
	USBD_PIPE_HANDLE	InputHandle;
	USBD_PIPE_HANDLE	OutputHandle;
}WHCEB01_CHANNEL,*PWHCEB01_CHANNEL;



typedef struct _WHCEB01_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;

	ULONG OpenHandleCount;	// Count of open handles

	ULONG UsageCount;		// Pending I/O Count
	BOOL Stopping;			// In process of stopping
	KEVENT StoppingEvent;	// Set when all pending I/O complete

	USBD_CONFIGURATION_HANDLE hWhceb01ConfigurationHandle;	// Selected Configuration handle
	USBD_INTERFACE_HANDLE hWhceb01InterfaceHandle;
	USBD_PIPE_HANDLE hWhceb01PipeHandle;  //原框架中的,现在没用

	USBD_PIPE_HANDLE hWhceb01InterruptInHandle[4]; //中断输入管道句柄 注:实际为BULK传输方式
	USBD_PIPE_HANDLE hWhceb01InterruptOutHandle[4];//中断输出管道句柄 注:实际为BULK传输方式
	BOOL			 ChannelisUsed[4];
	KMUTEX			 ChannelMutex;
	KMUTEX			 FrameMutex;
	KEVENT			 WaitEvent;

	ULONG Whceb01NumOfPipes;  //管道数目

	WHCEB01_PDU_HEAD PduHead;

	ULONG UsbTimeout;	// Read timeout in seconds

	// 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;

} WHCEB01_DEVICE_EXTENSION, *PWHCEB01_DEVICE_EXTENSION;

/////////////////////////////////////////////////////////////////////////////
// Forward declarations of global functions

VOID Whceb01Unload(IN PDRIVER_OBJECT DriverObject);

NTSTATUS Whceb01Power(	IN PDEVICE_OBJECT fdo,
					IN PIRP Irp);

NTSTATUS Whceb01Pnp(	IN PDEVICE_OBJECT fdo,
					IN PIRP Irp);

NTSTATUS Whceb01AddDevice(	IN PDRIVER_OBJECT DriverObject,
						IN PDEVICE_OBJECT pdo);

NTSTATUS Whceb01Create(IN PDEVICE_OBJECT fdo,
					IN PIRP Irp);

NTSTATUS Whceb01Close(	IN PDEVICE_OBJECT fdo,
					IN PIRP Irp);
 
NTSTATUS Whceb01Write(	IN PDEVICE_OBJECT fdo,
					IN PIRP Irp);

NTSTATUS Whceb01Read(	IN PDEVICE_OBJECT fdo,
					IN PIRP Irp);

NTSTATUS Whceb01DeviceControl(	IN PDEVICE_OBJECT fdo,
							IN PIRP Irp);

NTSTATUS Whceb01SystemControl(	IN PDEVICE_OBJECT fdo,
							IN PIRP Irp);

/////////////////////////////////////////////////////////////////////////////

BOOL LockDevice( IN PWHCEB01_DEVICE_EXTENSION dx);
void UnlockDevice( IN PWHCEB01_DEVICE_EXTENSION dx);

NTSTATUS StartDevice(	IN PWHCEB01_DEVICE_EXTENSION dx,
						IN PCM_RESOURCE_LIST AllocatedResourcesTranslated);

VOID StopDevice( IN PWHCEB01_DEVICE_EXTENSION dx);

NTSTATUS ForwardIrpAndWait( IN PDEVICE_OBJECT fdo, IN PIRP Irp);

/////////////////////////////////////////////////////////////////////////////
//	USB routines

NTSTATUS UsbResetDevice( IN PWHCEB01_DEVICE_EXTENSION dx);

NTSTATUS UsbGetUsbInfo( IN PWHCEB01_DEVICE_EXTENSION dx);

NTSTATUS UsbGetDeviceDescriptor( IN PWHCEB01_DEVICE_EXTENSION dx,
								 OUT PUSB_DEVICE_DESCRIPTOR deviceDescriptor,
								 OUT ULONG* Size);

NTSTATUS UsbGetConfigurationDescriptors( IN PWHCEB01_DEVICE_EXTENSION dx, 
										 OUT PUSB_CONFIGURATION_DESCRIPTOR *descriptors,
										 IN UCHAR ConfigIndex,
										 OUT ULONG* DescriptorsSize);

NTSTATUS UsbGetSpecifiedDescriptor( IN PWHCEB01_DEVICE_EXTENSION dx,
									OUT PVOID Descriptor,
									IN UCHAR DescriptorType,
									IN OUT ULONG* Size);

NTSTATUS UsbSelectConfiguration( IN PWHCEB01_DEVICE_EXTENSION dx);

NTSTATUS UsbDeselectConfiguration( IN PWHCEB01_DEVICE_EXTENSION dx);

NTSTATUS UsbDoInterruptTransfer( IN PWHCEB01_DEVICE_EXTENSION dx, IN PVOID Buffer, ULONG* BufferSize);

NTSTATUS UsbGetStatuses( IN PWHCEB01_DEVICE_EXTENSION dx,
						 OUT PUCHAR Statuses,
						 IN ULONG Size);

NTSTATUS UsbGetFrameInfo( IN PWHCEB01_DEVICE_EXTENSION dx,
						  OUT ULONG* FrameLength,
						  OUT ULONG* FrameNumber,
						  OUT ULONG* FrameAlterNumber);

NTSTATUS UsbSendOutputReport( IN PWHCEB01_DEVICE_EXTENSION dx, IN UCHAR OutputData);

NTSTATUS UsbGetIdleRate( IN PWHCEB01_DEVICE_EXTENSION dx);

#define FreeIfAllocated(x) if( (x)!=NULL) { ExFreePool(x); (x) = NULL; }

/////////////////////////////////////////////////////////////////////////////

NTSTATUS CompleteIrp( IN PIRP Irp, IN NTSTATUS status, IN ULONG info);

/////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//自定义函数

/////////////////////////////////////////////////////////////////////////////
//函数名称:Whceb01ResetPipe
//函数功能:复位管道
//入口参数:设备扩展
//          要复位的管道句柄
//返回值  :
/////////////////////////////////////////////////////////////////////////////
NTSTATUS Whceb01ResetPipe( IN PWHCEB01_DEVICE_EXTENSION dx, IN USBD_PIPE_HANDLE hPipe );

/////////////////////////////////////////////////////////////////////////////
//函数名称:Whceb01ResetDevice
//函数功能:复位设备
//入口参数:设备扩展
//返回值  :
/////////////////////////////////////////////////////////////////////////////
NTSTATUS Whceb01ResetDevice( IN PWHCEB01_DEVICE_EXTENSION dx );

/////////////////////////////////////////////////////////////////////////////
//函数名称:Whceb01TransferHostToDevice
//函数功能:host-to-device控制传输函数
//入口参数:设备扩展
//          host-to-device缓冲区指针                    
//          host-to-device缓冲区长度
//返回值  :
/////////////////////////////////////////////////////////////////////////////
NTSTATUS Whceb01TransferHostToDevice( IN  PWHCEB01_DEVICE_EXTENSION dx, 
									   IN  PVOID BufferHostToDevice,
									   IN  ULONG BufferHostToDeviceLength);

/////////////////////////////////////////////////////////////////////////////
//函数名称:Whceb01TransferDeviceToHost
//函数功能:device-to-host控制传输函数
//入口参数:设备扩展
//          device-to-host缓冲区指针                    
//          device-to-host缓冲区长度
//返回值  :
/////////////////////////////////////////////////////////////////////////////
NTSTATUS Whceb01TransferDeviceToHost( IN  PWHCEB01_DEVICE_EXTENSION dx,
									   OUT PVOID BufferDeviceToHost,
									   IN  ULONG BufferDeviceToHostLength);

/////////////////////////////////////////////////////////////////////////////
//函数名称:Whceb01InterruptTransferHtD
//函数功能:host-to-device中断传输函数
//入口参数:设备扩展
//          host-to-device缓冲区指针                    
//          host-to-device缓冲区长度
//返回值  :
/////////////////////////////////////////////////////////////////////////////
NTSTATUS Whceb01InterruptTransferHtD( IN  PWHCEB01_DEVICE_EXTENSION dx, PWHCEB01_CHANNEL pChannel ,
									   IN  PVOID BufferHostToDevice,
									   IN  ULONG BufferHostToDeviceLength);

/////////////////////////////////////////////////////////////////////////////
//函数名称:Whceb01InterruptTransferDtH
//函数功能:device-to-host中断传输函数
//入口参数:设备扩展
//          device-to-host缓冲区指针                    
//          device-to-host缓冲区长度
//返回值  :
/////////////////////////////////////////////////////////////////////////////
NTSTATUS Whceb01InterruptTransferDtH( IN  PWHCEB01_DEVICE_EXTENSION dx, PWHCEB01_CHANNEL pChannel ,
									   OUT PVOID BufferDeviceToHost,
									   IN  ULONG BufferDeviceToHostLength);

/////////////////////////////////////////////////////////////////////////////
//函数名称:Whceb01DelaySpecifiedNumberOfMs
//函数功能:延时函数
//入口参数:要延时的毫秒数
//返回值  :无
/////////////////////////////////////////////////////////////////////////////
VOID Whceb01DelaySpecifiedNumberOfMs( IN ULONG NumberOfMs);

/////////////////////////////////////////////////////////////////////////////
//函数名称:Whceb01DelaySpecifiedNumberOfUs
//函数功能:延时函数
//入口参数:要延时的微秒数
//返回值  :无
/////////////////////////////////////////////////////////////////////////////
VOID Whceb01DelaySpecifiedNumberOfUs( IN ULONG NumberOfUs);

NTSTATUS CallUSBDI( IN PWHCEB01_DEVICE_EXTENSION dx, IN PVOID UrbEtc,
				    IN ULONG IoControlCode,//=IOCTL_INTERNAL_USB_SUBMIT_URB,
				    IN ULONG Arg2);//=0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -