windows-nt/Source/XPSP1/NT/drivers/smartcrd/gempc430/usbdev.h
2020-09-26 16:20:57 +08:00

225 lines
7.5 KiB
C++

// Gemplus (C) 1999
//
// Version 1.0
// Author: Sergey Ivanov
// Date of creation - 04.03.1999
// Change log:
//
#ifndef USB_DEV
#define USB_DEV
#include "wdmdev.h"
#include "debug.h"
#ifdef __cplusplus
extern "C" {
#endif
#pragma warning (disable:4200)
#include <usbdi.h>
#include <usbdlib.h>
#pragma warning (default:4200)
#ifdef __cplusplus
}
#endif
// Type of request driver can construct
#define COMMAND_REQUEST 1
#define RESPONSE_REQUEST 2
#define INTERRUPT_REQUEST 3
// Default buffers' sizes (4k)
// This values will be used as a requests to the bus driver.
// It looks like bus driver will not accept values greater then these.
// It will complain with "invalid parameter" status.
// ??? Is this limitation of bus driver or our driver design?
#define DEFAULT_COMMAND_BUFFER_SIZE 0x100
#define DEFAULT_RESPONSE_BUFFER_SIZE 0x100
#define DEFAULT_INTERRUPT_BUFFER_SIZE 0x100
// If we set Xfer size greater then 256, bus driver crashes with GPF
// The problem still is under investigation...
#define GUR_MAX_TRANSFER_SIZE 256
#pragma LOCKEDCODE
// Power request callback
NTSTATUS onPowerRequestCompletion(IN PDEVICE_OBJECT DeviceObject,IN UCHAR MinorFunction,
IN POWER_STATE PowerState,IN PVOID Context,IN PIO_STATUS_BLOCK IoStatus);
NTSTATUS onPowerIrpComplete(IN PDEVICE_OBJECT NullDeviceObject,IN PIRP Irp,IN PVOID Context);
#pragma PAGEDCODE
class CWDMDevice;
class CUSBDevice : public CWDMDevice
{
public:
NTSTATUS m_Status;
SAFE_DESTRUCTORS();
private:
ULONG Idle_conservation;
ULONG Idle_performance;
// Max xfer size with our device
ULONG m_MaximumTransferSize;
// USB device endpoints
USBD_PIPE_HANDLE m_ControlPipe;
USBD_PIPE_HANDLE m_InterruptPipe;
USBD_PIPE_HANDLE m_ResponsePipe;
USBD_PIPE_HANDLE m_CommandPipe;
// ptr to the USB device descriptor
// for this device
PUSB_DEVICE_DESCRIPTOR m_DeviceDescriptor;
// USB configuration handle and ptr for the configuration the
// device is currently in
USBD_CONFIGURATION_HANDLE m_ConfigurationHandle;
PUSB_CONFIGURATION_DESCRIPTOR m_Configuration;
// we support one interface
// this is a copy of the info structure
// returned from select_configuration or
// select_interface
PUSBD_INTERFACE_INFORMATION m_Interface;
//Bus drivers set the appropriate values in this structure in response
//to an IRP_MN_QUERY_CAPABILITIES IRP. Function and filter drivers might
//alter the capabilities set by the bus driver.
DEVICE_CAPABILITIES Capabilities;
// used to save the currently-being-handled system-requested power irp request
//PIRP PowerIrp;
// Xfer buffers will be dynamically allocated at device start
ULONG ResponseBufferLength;
PVOID m_ResponseBuffer;// Bulk IN pipe
LONG Response_ErrorNum;
ULONG CommandBufferLength;
PVOID m_CommandBuffer;// Bulk OUT pipe
LONG Command_ErrorNum;
ULONG InterruptBufferLength;
PVOID m_InterruptBuffer;// Interrupt IN pipe
LONG Interrupt_ErrorNum;
public:
CUSBDevice();
~CUSBDevice();
virtual VOID dispose()
{
removeRef();
if(!getRefCount()) self_delete();
else
{
TRACE("FAILED TO DISPOSE OBJECT! refcount %x\n",getRefCount());
}
};
protected:
virtual NTSTATUS PnPHandler(LONG HandlerID,IN PIRP Irp);
virtual NTSTATUS PnP_HandleRemoveDevice(IN PIRP Irp);
virtual NTSTATUS PnP_HandleStartDevice(IN PIRP Irp);
virtual NTSTATUS PnP_HandleStopDevice(IN PIRP Irp);
virtual NTSTATUS PnP_StartDevice();
virtual VOID PnP_StopDevice();
virtual NTSTATUS PnP_HandleQueryRemove(IN PIRP Irp);
virtual NTSTATUS PnP_HandleCancelRemove(IN PIRP Irp);
virtual NTSTATUS PnP_HandleQueryStop(IN PIRP Irp);
virtual NTSTATUS PnP_HandleCancelStop(IN PIRP Irp);
virtual NTSTATUS PnP_HandleQueryRelations(IN PIRP Irp);
virtual NTSTATUS PnP_HandleQueryInterface(IN PIRP Irp);
virtual NTSTATUS PnP_HandleQueryCapabilities(IN PIRP Irp);
virtual NTSTATUS PnP_HandleQueryResources(IN PIRP Irp);
virtual NTSTATUS PnP_HandleQueryResRequirements(IN PIRP Irp);
virtual NTSTATUS PnP_HandleQueryText(IN PIRP Irp);
virtual NTSTATUS PnP_HandleFilterResRequirements(IN PIRP Irp);
virtual NTSTATUS PnP_HandleReadConfig(IN PIRP Irp);
virtual NTSTATUS PnP_HandleWriteConfig(IN PIRP Irp);
virtual NTSTATUS PnP_HandleEject(IN PIRP Irp);
virtual NTSTATUS PnP_HandleSetLock(IN PIRP Irp);
virtual NTSTATUS PnP_HandleQueryID(IN PIRP Irp);
virtual NTSTATUS PnP_HandleQueryPnPState(IN PIRP Irp);
virtual NTSTATUS PnP_HandleQueryBusInfo(IN PIRP Irp);
virtual NTSTATUS PnP_HandleUsageNotification(IN PIRP Irp);
virtual NTSTATUS PnP_HandleSurprizeRemoval(IN PIRP Irp);
private:
// USB device support functions
PURB buildBusTransferRequest(CIoPacket* Irp,UCHAR Command);
VOID finishBusTransferRequest(CIoPacket* Irp,UCHAR Command);
NTSTATUS QueryBusCapabilities(PDEVICE_CAPABILITIES Capabilities);
PUSB_DEVICE_DESCRIPTOR getDeviceDescriptor();
PUSB_CONFIGURATION_DESCRIPTOR getConfigurationDescriptor();
PUSBD_INTERFACE_INFORMATION activateInterface(PUSB_CONFIGURATION_DESCRIPTOR Configuration);
NTSTATUS disactivateInterface();
//
NTSTATUS resetDevice();
NTSTATUS resetPipe(IN USBD_PIPE_HANDLE Pipe);
NTSTATUS resetAllPipes();
NTSTATUS abortPipes();
// Low level communication functions...
virtual NTSTATUS sendRequestToDevice(CIoPacket* Irp,PIO_COMPLETION_ROUTINE Routine);
virtual NTSTATUS sendRequestToDeviceAndWait(CIoPacket* Irp);
// Handle requests for specific pipes..
virtual NTSTATUS readSynchronously(CIoPacket* Irp,IN USBD_PIPE_HANDLE Pipe);
virtual NTSTATUS writeSynchronously(CIoPacket* Irp,IN USBD_PIPE_HANDLE Pipe);
// Support for the reader interface
virtual NTSTATUS send(CIoPacket* Irp);
virtual NTSTATUS sendAndWait(CIoPacket* Irp);
// virtual NTSTATUS writeAndWait(PUCHAR pRequest,ULONG RequestLength,PUCHAR pReply,ULONG* pReplyLength);
// virtual NTSTATUS readAndWait(PUCHAR pRequest,ULONG RequestLength,PUCHAR pReply,ULONG* pReplyLength);
public:
virtual NTSTATUS writeAndWait(PUCHAR pRequest,ULONG RequestLength,PUCHAR pReply,ULONG* pReplyLength);
virtual NTSTATUS readAndWait(PUCHAR pRequest,ULONG RequestLength,PUCHAR pReply,ULONG* pReplyLength);
virtual NTSTATUS pnpRequest(IN PIRP Irp);
#define _POWER_
#ifdef _POWER_
// POWER MANAGEMENT FUNCTIONS
virtual NTSTATUS powerRequest(IN PIRP Irp);
virtual VOID activatePowerHandler(LONG HandlerID);
virtual VOID disActivatePowerHandler(LONG HandlerID);
virtual NTSTATUS callPowerHandler(LONG HandlerID,IN PIRP Irp);
virtual BOOLEAN setDevicePowerState(IN DEVICE_POWER_STATE DeviceState);
virtual VOID onSystemPowerDown();
virtual VOID onSystemPowerUp();
// Handlers
virtual NTSTATUS power_HandleSetPower(IN PIRP Irp);
virtual NTSTATUS power_HandleWaitWake(IN PIRP Irp);
virtual NTSTATUS power_HandleSequencePower(IN PIRP Irp);
virtual NTSTATUS power_HandleQueryPower(IN PIRP Irp);
// callback
#endif
// USB device specific implementations of system callbacks
// They ovewrite base class defaults.
virtual NTSTATUS open(PIRP Irp)
{
TRACE("***** USB OPEN DEVICE *****\n");
if (!NT_SUCCESS(acquireRemoveLock()))
return completeDeviceRequest(Irp, STATUS_DELETE_PENDING, 0);
releaseRemoveLock();
return completeDeviceRequest(Irp, STATUS_SUCCESS, 0);
};//Create
virtual NTSTATUS close(PIRP Irp)
{
TRACE("***** USB CLOSE DEVICE *****\n");
return completeDeviceRequest(Irp, STATUS_SUCCESS, 0);
};
virtual NTSTATUS deviceControl(IN PIRP Irp);
virtual NTSTATUS read(IN PIRP Irp);
virtual NTSTATUS write(IN PIRP Irp);
virtual NTSTATUS createDeviceObjectByName(PDEVICE_OBJECT* ppFdo);
};
#endif // If defined