00001
00002
00003
00004
00005
00006
00007
00008
00009 #pragma once
00010 #include <oska/all.h>
00011 #include <sdioemb/slot_api.h>
00012 #include <sdioemb/windows/slot_api.h>
00013 #include <sdioemb/slot_ushc.h>
00014 #include <sdioemb/trace.h>
00015
00016 #include <usbdi.h>
00017 #include <usbdlib.h>
00018 #include <Wdfusb.h>
00019
00020 DRIVER_INITIALIZE DriverEntry;
00021 EVT_WDF_OBJECT_CONTEXT_CLEANUP UshcDriverCleanup;
00022 EVT_WDF_OBJECT_CONTEXT_CLEANUP UshcEvtDeviceCleanup;
00023 EVT_WDF_DRIVER_DEVICE_ADD UshcEvtDeviceAdd;
00024 EVT_WDF_DEVICE_PREPARE_HARDWARE UshcEvtDevicePrepareHardware;
00025 EVT_WDF_DEVICE_RELEASE_HARDWARE UshcEvtDeviceReleaseHardware;
00026 EVT_WDF_DEVICE_D0_ENTRY UshcEvtDeviceD0Entry;
00027 EVT_WDF_DEVICE_D0_EXIT UshcEvtDeviceD0Exit;
00028 EVT_WDF_USB_READER_COMPLETION_ROUTINE InterruptPipeReadComplete;
00029 EVT_WDF_REQUEST_COMPLETION_ROUTINE CbwRequestCompletionRoutine;
00030 EVT_WDF_REQUEST_COMPLETION_ROUTINE DataRequestCompletionRoutine;
00031 EVT_WDF_REQUEST_COMPLETION_ROUTINE CswRequestCompletionRoutine;
00032 EVT_WDF_USB_READERS_FAILED InterruptPipeReadFailed;
00033 EVT_WDF_WORKITEM Worker;
00034 EVT_WDF_WORKITEM UshcSetBusFreqWork;
00035
00036 typedef struct sdioemb_slot SDIOEMB_SLOT;
00037 typedef struct sdioemb_slot* PSDIOEMB_SLOT;
00038
00039 typedef struct sdioemb_cmd SDIO_CMD;
00040 typedef struct sdioemb_cmd* PSDIO_CMD;
00041
00042 typedef enum ushc_request USHC_REQUEST;
00043 typedef enum ushc_request_direction USHC_REQUEST_DIRECTION;
00044 typedef enum ushc_request_recipient USHC_REQUEST_RECIPIENT;
00045
00046 typedef struct sdioemb_ushc SDIOEMB_USHC;
00047 typedef enum sdioemb_power SDIOEMB_POWER;
00048
00049 #pragma pack (push, 1)
00050
00051 typedef struct _CBW
00052 {
00053 #define USHC_SDIO_CBW_SIGNATURE 'C'
00054 UCHAR Signature;
00055 UCHAR CmdIndex;
00056 INT16 BlockSize;
00057 UINT32 Arg;
00058 }
00059 CBW, *PCBW;
00060
00061 typedef struct _CSW
00062 {
00063 #define USHC_SDIO_CSW_SIGNATURE 'S'
00064 UCHAR Signature;
00065 UCHAR Status;
00066 UINT32 Response;
00067 }
00068 CSW, *PSBW;
00069
00070 typedef struct _USHC_INT_DATA
00071 {
00072 UCHAR Status;
00073 UCHAR Reserved[3];
00074 }
00075 USHC_INT_DATA, *PUSHC_INT_DATA;
00076
00077 #pragma pack (pop)
00078
00079
00080 typedef struct _USHC_DEVICE_CONTEXT
00081 {
00082 WDFUSBDEVICE WdfUsbTargetDevice;
00083 USB_DEVICE_DESCRIPTOR UsbDeviceDescriptor;
00084 PUSB_CONFIGURATION_DESCRIPTOR UsbConfigurationDescriptor;
00085 WDFUSBINTERFACE UsbInterface;
00086 WDFUSBPIPE DataOutPipe;
00087 WDFUSBPIPE DataInPipe;
00088 WDFUSBPIPE InterruptPipe;
00089
00090 UINT32 ControlerCapabilities;
00091 UINT16 ControlerState;
00092 INT32 NumSlots;
00093 SDIOEMB_SLOT **Slots;
00094 bool Registered;
00095 }
00096 USHC_DEVICE_CONTEXT, *PUSHC_DEVICE_CONTEXT;
00097 WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(USHC_DEVICE_CONTEXT, UshcGetDeviceContext);
00098
00099 typedef struct _USHC_DATA
00100 {
00101 struct sdioemb_wdf_slot_data wdf_data;
00102 SDIOEMB_USHC Ushc;
00103 WDFDEVICE Device;
00104 WDFSPINLOCK Lock;
00105 CBW Cbw;
00106 WDFREQUEST CbwRequest;
00107 WDFMEMORY CbwMemory;
00108 CSW Csw;
00109 WDFREQUEST CswRequest;
00110 WDFMEMORY CswMemory;
00111
00112 LONG CommandIoCount;
00113
00114 bool SetBusFreqPending;
00115 int PendingBusFreq;
00116 struct sdioemb_cmd *PendingCmd;
00117 WDFWORKITEM SetBusFreqWork;
00118 }
00119 USHC_DATA, *PUSHC_DATA;
00120
00121 typedef struct _WORKER_CONTEXT
00122 {
00123 PUSHC_DATA Ushc;
00124 WDFUSBPIPE Pipe;
00125 }
00126 WORKER_CONTEXT, *PWORKER_CONTEXT;
00127 WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(WORKER_CONTEXT, GetWorkerContext)
00128
00129 NTSTATUS UshcRegistryInit(__in WDFDEVICE Device);
00130
00131 NTSTATUS UshcCreateSlot(__in WDFDEVICE Device, __out PSDIOEMB_SLOT *NewSlot, __in INT SlotIndex);
00132 VOID UshcDestroySlot(__in WDFDEVICE Device, __in PSDIOEMB_SLOT Slot);
00133
00134 NTSTATUS SelectInterface(__in WDFDEVICE Device);
00135 NTSTATUS SetControler(__in PUSHC_DEVICE_CONTEXT Dc, __in UINT16 ControlerState);
00136 INT UshcSetBusFreq(__in PSDIOEMB_SLOT Slot, __in INT Clk);
00137 INT UshcSetBusWidth(__in PSDIOEMB_SLOT Slot, __in INT BusWidth);
00138 INT UshcSetHostControl(__in PSDIOEMB_SLOT Slot, __in UINT16 ControlerState);
00139 INT UshcSubmitVendorRequest(__in PSDIOEMB_SLOT Slot,
00140 __in USHC_REQUEST Request,
00141 __in USHC_REQUEST_DIRECTION Direction,
00142 __in USHC_REQUEST_RECIPIENT Recipient,
00143 __in UINT16 Value,
00144 __in UINT16 Index,
00145 __in PVOID IoBuffer,
00146 __in UINT32 IoBufferLength);
00147 INT UshcSubmitCbwRequest(__in PSDIOEMB_SLOT Slot, __in UCHAR CmdIndex, __in UINT16 BlockSize, __in UINT32 CmdArg);
00148 INT UshcSubmitDataRequest(__in PSDIOEMB_SLOT Slot,
00149 __in USHC_REQUEST_DIRECTION Direction,
00150 __in_bcount(RequestBufferLength) PVOID RequestBuffer,
00151 __in UINT32 RequestBufferLength);
00152 INT UshcSubmitCswRequest(__in PSDIOEMB_SLOT Slot);
00153 INT NTStatus2Posix(__in NTSTATUS Status);
00154 NTSTATUS SubmitVendorRequest(__in WDFUSBDEVICE WdfUsbTargetDevice,
00155 __in UCHAR RequestCode,
00156 __in WDF_USB_BMREQUEST_DIRECTION RequestDirection,
00157 __in WDF_USB_BMREQUEST_RECIPIENT RequestRecipient,
00158 __in USHORT Value,
00159 __in USHORT Index,
00160 __in_bcount_opt(TransferBufferLength) PVOID RequestBuffer,
00161 __in ULONG RequestBufferLength);
00162
00163 NTSTATUS QPipeResetWorkItem(__in PUSHC_DATA Ushc, __in WDFUSBPIPE Pipe);
00164 NTSTATUS ResetPipe(__in PUSHC_DATA Ushc, __in WDFUSBPIPE Pipe);