Embed:
(wiki syntax)
Show/hide line numbers
usbdi.h
00001 /* 00002 * usbdi.h 00003 * 00004 * USBD and USB device driver definitions 00005 * 00006 * This file is part of the w32api package. 00007 * 00008 * Contributors: 00009 * Created by Casper S. Hornstrup <chorns@users.sourceforge.net> 00010 * 00011 * THIS SOFTWARE IS NOT COPYRIGHTED 00012 * 00013 * This source code is offered for use in the public domain. You may 00014 * use, modify or distribute it freely. 00015 * 00016 * This code is distributed in the hope that it will be useful but 00017 * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY 00018 * DISCLAIMED. This includes but is not limited to warranties of 00019 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00020 * 00021 */ 00022 00023 #ifndef __USBDI_H 00024 #define __USBDI_H 00025 00026 #if __GNUC__ >=3 00027 #pragma GCC system_header 00028 #endif 00029 00030 #ifdef __USB_H 00031 #error usb.h cannot be included with usbdi.h 00032 #else 00033 00034 #ifdef __cplusplus 00035 extern "C" { 00036 #endif 00037 00038 #include "ntddk.h" 00039 #include "usbioctl.h" 00040 00041 #define USBDI_VERSION 0x300 00042 00043 #define USB_DEFAULT_DEVICE_ADDRESS 0 00044 #define USB_DEFAULT_ENDPOINT_ADDRESS 0 00045 #define USB_DEFAULT_MAX_PACKET 64 00046 00047 #define URB_FROM_IRP(Irp) ((IoGetCurrentIrpStackLocation(Irp))->Parameters.Others.Argument1) 00048 00049 #define URB_FUNCTION_SELECT_CONFIGURATION 0x0000 00050 #define URB_FUNCTION_SELECT_INTERFACE 0x0001 00051 #define URB_FUNCTION_ABORT_PIPE 0x0002 00052 #define URB_FUNCTION_TAKE_FRAME_LENGTH_CONTROL 0x0003 00053 #define URB_FUNCTION_RELEASE_FRAME_LENGTH_CONTROL 0x0004 00054 #define URB_FUNCTION_GET_FRAME_LENGTH 0x0005 00055 #define URB_FUNCTION_SET_FRAME_LENGTH 0x0006 00056 #define URB_FUNCTION_GET_CURRENT_FRAME_NUMBER 0x0007 00057 #define URB_FUNCTION_CONTROL_TRANSFER 0x0008 00058 #define URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER 0x0009 00059 #define URB_FUNCTION_ISOCH_TRANSFER 0x000A 00060 #define URB_FUNCTION_RESET_PIPE 0x001E 00061 #define URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE 0x000B 00062 #define URB_FUNCTION_GET_DESCRIPTOR_FROM_ENDPOINT 0x0024 00063 #define URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE 0x0028 00064 #define URB_FUNCTION_SET_DESCRIPTOR_TO_DEVICE 0x000C 00065 #define URB_FUNCTION_SET_DESCRIPTOR_TO_ENDPOINT 0x0025 00066 #define URB_FUNCTION_SET_DESCRIPTOR_TO_INTERFACE 0x0029 00067 #define URB_FUNCTION_SET_FEATURE_TO_DEVICE 0x000D 00068 #define URB_FUNCTION_SET_FEATURE_TO_INTERFACE 0x000E 00069 #define URB_FUNCTION_SET_FEATURE_TO_ENDPOINT 0x000F 00070 #define URB_FUNCTION_SET_FEATURE_TO_OTHER 0x0023 00071 #define URB_FUNCTION_CLEAR_FEATURE_TO_DEVICE 0x0010 00072 #define URB_FUNCTION_CLEAR_FEATURE_TO_INTERFACE 0x0011 00073 #define URB_FUNCTION_CLEAR_FEATURE_TO_ENDPOINT 0x0012 00074 #define URB_FUNCTION_CLEAR_FEATURE_TO_OTHER 0x0022 00075 #define URB_FUNCTION_GET_STATUS_FROM_DEVICE 0x0013 00076 #define URB_FUNCTION_GET_STATUS_FROM_INTERFACE 0x0014 00077 #define URB_FUNCTION_GET_STATUS_FROM_ENDPOINT 0x0015 00078 #define URB_FUNCTION_GET_STATUS_FROM_OTHER 0x0021 00079 #define URB_FUNCTION_RESERVED0 0x0016 00080 #define URB_FUNCTION_VENDOR_DEVICE 0x0017 00081 #define URB_FUNCTION_VENDOR_INTERFACE 0x0018 00082 #define URB_FUNCTION_VENDOR_ENDPOINT 0x0019 00083 #define URB_FUNCTION_VENDOR_OTHER 0x0020 00084 #define URB_FUNCTION_CLASS_DEVICE 0x001A 00085 #define URB_FUNCTION_CLASS_INTERFACE 0x001B 00086 #define URB_FUNCTION_CLASS_ENDPOINT 0x001C 00087 #define URB_FUNCTION_CLASS_OTHER 0x001F 00088 #define URB_FUNCTION_RESERVED 0x001D 00089 #define URB_FUNCTION_GET_CONFIGURATION 0x0026 00090 #define URB_FUNCTION_GET_INTERFACE 0x0027 00091 #define URB_FUNCTION_LAST 0x0029 00092 00093 typedef LONG USBD_STATUS; 00094 typedef PVOID USBD_PIPE_HANDLE; 00095 typedef PVOID USBD_CONFIGURATION_HANDLE; 00096 typedef PVOID USBD_INTERFACE_HANDLE; 00097 00098 #define USBD_ERROR(Status) ((USBD_STATUS)(Status) < 0) 00099 #define USBD_HALTED(Status) ((ULONG)(Status) >> 30 == 3) 00100 #define USBD_PENDING(Status) ((ULONG)(Status) >> 30 == 1) 00101 #define USBD_STATUS(Status) ((ULONG)(Status) & 0x0FFFFFFFL) 00102 #define USBD_SUCCESS(Status) ((USBD_STATUS)(Status) >= 0) 00103 00104 #define USBD_STATUS_SUCCESS ((USBD_STATUS)0x00000000L) 00105 #define USBD_STATUS_PENDING ((USBD_STATUS)0x40000000L) 00106 #define USBD_STATUS_HALTED ((USBD_STATUS)0xC0000000L) 00107 #define USBD_STATUS_ERROR ((USBD_STATUS)0x80000000L) 00108 #define USBD_STATUS_NO_MEMORY ((USBD_STATUS)0x80000100L) 00109 #define USBD_STATUS_INVALID_URB_FUNCTION ((USBD_STATUS)0x80000200L) 00110 #define USBD_STATUS_INVALID_PARAMETER ((USBD_STATUS)0x80000300L) 00111 #define USBD_STATUS_ERROR_BUSY ((USBD_STATUS)0x80000400L) 00112 #define USBD_STATUS_REQUEST_FAILED ((USBD_STATUS)0x80000500L) 00113 #define USBD_STATUS_INVALID_PIPE_HANDLE ((USBD_STATUS)0x80000600L) 00114 #define USBD_STATUS_NO_BANDWIDTH ((USBD_STATUS)0x80000700L) 00115 #define USBD_STATUS_INTERNAL_HC_ERROR ((USBD_STATUS)0x80000800L) 00116 #define USBD_STATUS_ERROR_SHORT_TRANSFER ((USBD_STATUS)0x80000900L) 00117 #define USBD_STATUS_CRC ((USBD_STATUS)0xC0000001L) 00118 #define USBD_STATUS_BTSTUFF ((USBD_STATUS)0xC0000002L) 00119 #define USBD_STATUS_DATA_TOGGLE_MISMATCH ((USBD_STATUS)0xC0000003L) 00120 #define USBD_STATUS_STALL_PID ((USBD_STATUS)0xC0000004L) 00121 #define USBD_STATUS_DEV_NOT_RESPONDING ((USBD_STATUS)0xC0000005L) 00122 #define USBD_STATUS_PID_CHECK_FAILURE ((USBD_STATUS)0xC0000006L) 00123 #define USBD_STATUS_UNEXPECTED_PID ((USBD_STATUS)0xC0000007L) 00124 #define USBD_STATUS_DATA_OVERRUN ((USBD_STATUS)0xC0000008L) 00125 #define USBD_STATUS_DATA_UNDERRUN ((USBD_STATUS)0xC0000009L) 00126 #define USBD_STATUS_RESERVED1 ((USBD_STATUS)0xC000000AL) 00127 #define USBD_STATUS_RESERVED2 ((USBD_STATUS)0xC000000BL) 00128 #define USBD_STATUS_BUFFER_OVERRUN ((USBD_STATUS)0xC000000CL) 00129 #define USBD_STATUS_BUFFER_UNDERRUN ((USBD_STATUS)0xC000000DL) 00130 #define USBD_STATUS_NOT_ACCESSED ((USBD_STATUS)0xC000000FL) 00131 #define USBD_STATUS_FIFO ((USBD_STATUS)0xC0000010L) 00132 #define USBD_STATUS_ENDPOINT_HALTED ((USBD_STATUS)0xC0000030L) 00133 #define USBD_STATUS_BAD_START_FRAME ((USBD_STATUS)0xC0000A00L) 00134 #define USBD_STATUS_ISOCH_REQUEST_FAILED ((USBD_STATUS)0xC0000B00L) 00135 #define USBD_STATUS_FRAME_CONTROL_OWNED ((USBD_STATUS)0xC0000C00L) 00136 #define USBD_STATUS_FRAME_CONTROL_NOT_OWNED \ 00137 ((USBD_STATUS)0xC0000D00L) 00138 #define USBD_STATUS_INAVLID_CONFIGURATION_DESCRIPTOR \ 00139 ((USBD_STATUS)0xC0000F00L) 00140 #define USBD_STATUS_CANCELING ((USBD_STATUS)0x00020000L) 00141 00142 #define USBD_PIPE_DIRECTION_IN(pipeInformation) \ 00143 ((pipeInformation)->EndpointAddress & USB_ENDPOINT_DIRECTION_MASK) 00144 00145 struct _URB_HEADER { 00146 USHORT Length; 00147 USHORT Function; 00148 USBD_STATUS Status; 00149 PVOID UsbdDeviceHandle; 00150 ULONG UsbdFlags; 00151 }; 00152 00153 struct _URB_HCD_AREA { 00154 PVOID HcdEndpoint; 00155 PIRP HcdIrp; 00156 LIST_ENTRY HcdListEntry; 00157 LIST_ENTRY HcdListEntry2; 00158 PVOID HcdCurrentIoFlushPointer; 00159 PVOID HcdExtension; 00160 }; 00161 00162 struct _URB_BULK_OR_INTERRUPT_TRANSFER { 00163 struct _URB_HEADER Hdr; 00164 USBD_PIPE_HANDLE PipeHandle; 00165 ULONG TransferFlags; 00166 ULONG TransferBufferLength; 00167 PVOID TransferBuffer; 00168 PMDL TransferBufferMDL; 00169 struct _URB *UrbLink; 00170 struct _URB_HCD_AREA hca; 00171 }; 00172 00173 struct _URB_CONTROL_DESCRIPTOR_REQUEST { 00174 struct _URB_HEADER Hdr; 00175 PVOID Reserved; 00176 ULONG Reserved0; 00177 ULONG TransferBufferLength; 00178 PVOID TransferBuffer; 00179 PMDL TransferBufferMDL; 00180 struct _URB *UrbLink; 00181 struct _URB_HCD_AREA hca; 00182 USHORT Reserved1; 00183 UCHAR Index; 00184 UCHAR DescriptorType; 00185 USHORT LanguageId; 00186 USHORT Reserved2; 00187 }; 00188 00189 struct _URB_CONTROL_FEATURE_REQUEST { 00190 struct _URB_HEADER Hdr; 00191 PVOID Reserved; 00192 ULONG Reserved2; 00193 ULONG Reserved3; 00194 PVOID Reserved4; 00195 PMDL Reserved5; 00196 struct _URB *UrbLink; 00197 struct _URB_HCD_AREA hca; 00198 USHORT Reserved0; 00199 USHORT FeatureSelector; 00200 USHORT Index; 00201 USHORT Reserved1; 00202 }; 00203 00204 struct _URB_CONTROL_GET_CONFIGURATION_REQUEST { 00205 struct _URB_HEADER Hdr; 00206 PVOID Reserved; 00207 ULONG Reserved0; 00208 ULONG TransferBufferLength; 00209 PVOID TransferBuffer; 00210 PMDL TransferBufferMDL; 00211 struct _URB *UrbLink; 00212 struct _URB_HCD_AREA hca; 00213 UCHAR Reserved1[8]; 00214 }; 00215 00216 struct _URB_CONTROL_GET_INTERFACE_REQUEST { 00217 struct _URB_HEADER Hdr; 00218 PVOID Reserved; 00219 ULONG Reserved0; 00220 ULONG TransferBufferLength; 00221 PVOID TransferBuffer; 00222 PMDL TransferBufferMDL; 00223 struct _URB *UrbLink; 00224 struct _URB_HCD_AREA hca; 00225 UCHAR Reserved1[4]; 00226 USHORT Interface; 00227 USHORT Reserved2; 00228 }; 00229 00230 struct _URB_CONTROL_GET_STATUS_REQUEST { 00231 struct _URB_HEADER Hdr; 00232 PVOID Reserved; 00233 ULONG Reserved0; 00234 ULONG TransferBufferLength; 00235 PVOID TransferBuffer; 00236 PMDL TransferBufferMDL; 00237 struct _URB *UrbLink; 00238 struct _URB_HCD_AREA hca; 00239 UCHAR Reserved1[4]; 00240 USHORT Index; 00241 USHORT Reserved2; 00242 }; 00243 00244 struct _URB_CONTROL_TRANSFER { 00245 struct _URB_HEADER Hdr; 00246 USBD_PIPE_HANDLE PipeHandle; 00247 ULONG TransferFlags; 00248 ULONG TransferBufferLength; 00249 PVOID TransferBuffer; 00250 PMDL TransferBufferMDL; 00251 struct _URB *UrbLink; 00252 struct _URB_HCD_AREA hca; 00253 UCHAR SetupPacket[8]; 00254 }; 00255 00256 struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST { 00257 struct _URB_HEADER Hdr; 00258 PVOID Reserved; 00259 ULONG TransferFlags; 00260 ULONG TransferBufferLength; 00261 PVOID TransferBuffer; 00262 PMDL TransferBufferMDL; 00263 struct _URB *UrbLink; 00264 struct _URB_HCD_AREA hca; 00265 UCHAR RequestTypeReservedBits; 00266 UCHAR Request; 00267 USHORT Value; 00268 USHORT Index; 00269 USHORT Reserved1; 00270 }; 00271 00272 struct _URB_FRAME_LENGTH_CONTROL { 00273 struct _URB_HEADER Hdr; 00274 }; 00275 00276 struct _URB_GET_CURRENT_FRAME_NUMBER { 00277 struct _URB_HEADER Hdr; 00278 ULONG FrameNumber; 00279 }; 00280 00281 struct _URB_GET_FRAME_LENGTH { 00282 struct _URB_HEADER Hdr; 00283 ULONG FrameLength; 00284 ULONG FrameNumber; 00285 }; 00286 00287 typedef struct _USBD_ISO_PACKET_DESCRIPTOR { 00288 ULONG Offset; 00289 ULONG Length; 00290 USBD_STATUS Status; 00291 } USBD_ISO_PACKET_DESCRIPTOR, *PUSBD_ISO_PACKET_DESCRIPTOR; 00292 00293 struct _URB_ISOCH_TRANSFER { 00294 struct _URB_HEADER Hdr; 00295 USBD_PIPE_HANDLE PipeHandle; 00296 ULONG TransferFlags; 00297 ULONG TransferBufferLength; 00298 PVOID TransferBuffer; 00299 PMDL TransferBufferMDL; 00300 struct _URB *UrbLink; 00301 struct _URB_HCD_AREA hca; 00302 ULONG StartFrame; 00303 ULONG NumberOfPackets; 00304 ULONG ErrorCount; 00305 USBD_ISO_PACKET_DESCRIPTOR IsoPacket[1]; 00306 }; 00307 00308 struct _URB_PIPE_REQUEST { 00309 struct _URB_HEADER Hdr; 00310 USBD_PIPE_HANDLE PipeHandle; 00311 ULONG Reserved; 00312 }; 00313 00314 struct _URB_SET_FRAME_LENGTH { 00315 struct _URB_HEADER Hdr; 00316 LONG FrameLengthDelta; 00317 }; 00318 00319 typedef struct _USBD_DEVICE_INFORMATION { 00320 ULONG OffsetNext; 00321 PVOID UsbdDeviceHandle; 00322 USB_DEVICE_DESCRIPTOR DeviceDescriptor; 00323 } USBD_DEVICE_INFORMATION, *PUSBD_DEVICE_INFORMATION; 00324 00325 typedef enum _USBD_PIPE_TYPE { 00326 UsbdPipeTypeControl, 00327 UsbdPipeTypeIsochronous, 00328 UsbdPipeTypeBulk, 00329 UsbdPipeTypeInterrupt 00330 } USBD_PIPE_TYPE; 00331 00332 /* USBD_PIPE_INFORMATION.PipeFlags constants */ 00333 #define USBD_PF_CHANGE_MAX_PACKET 0x00000001 00334 #define USBD_PF_DOUBLE_BUFFER 0x00000002 00335 #define USBD_PF_ENABLE_RT_THREAD_ACCESS 0x00000004 00336 #define USBD_PF_MAP_ADD_TRANSFERS 0x00000008 00337 00338 typedef struct _USBD_PIPE_INFORMATION { 00339 USHORT MaximumPacketSize; 00340 UCHAR EndpointAddress; 00341 UCHAR Interval; 00342 USBD_PIPE_TYPE PipeType; 00343 USBD_PIPE_HANDLE PipeHandle; 00344 ULONG MaximumTransferSize; 00345 ULONG PipeFlags; 00346 } USBD_PIPE_INFORMATION, *PUSBD_PIPE_INFORMATION; 00347 00348 typedef struct _USBD_INTERFACE_INFORMATION { 00349 USHORT Length; 00350 UCHAR InterfaceNumber; 00351 UCHAR AlternateSetting; 00352 UCHAR Class; 00353 UCHAR SubClass; 00354 UCHAR Protocol; 00355 UCHAR Reserved; 00356 USBD_INTERFACE_HANDLE InterfaceHandle; 00357 ULONG NumberOfPipes; 00358 USBD_PIPE_INFORMATION Pipes[1]; 00359 } USBD_INTERFACE_INFORMATION, *PUSBD_INTERFACE_INFORMATION; 00360 00361 struct _URB_SELECT_CONFIGURATION { 00362 struct _URB_HEADER Hdr; 00363 PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; 00364 USBD_CONFIGURATION_HANDLE ConfigurationHandle; 00365 USBD_INTERFACE_INFORMATION Interface; 00366 }; 00367 00368 struct _URB_SELECT_INTERFACE { 00369 struct _URB_HEADER Hdr; 00370 USBD_CONFIGURATION_HANDLE ConfigurationHandle; 00371 USBD_INTERFACE_INFORMATION Interface; 00372 }; 00373 00374 typedef struct _USBD_VERSION_INFORMATION { 00375 ULONG USBDI_Version; 00376 ULONG Supported_USB_Version; 00377 } USBD_VERSION_INFORMATION, *PUSBD_VERSION_INFORMATION; 00378 00379 typedef struct _URB { 00380 union { 00381 struct _URB_HEADER UrbHeader; 00382 struct _URB_SELECT_INTERFACE UrbSelectInterface; 00383 struct _URB_SELECT_CONFIGURATION UrbSelectConfiguration; 00384 struct _URB_PIPE_REQUEST UrbPipeRequest; 00385 struct _URB_FRAME_LENGTH_CONTROL UrbFrameLengthControl; 00386 struct _URB_GET_FRAME_LENGTH UrbGetFrameLength; 00387 struct _URB_SET_FRAME_LENGTH UrbSetFrameLength; 00388 struct _URB_GET_CURRENT_FRAME_NUMBER UrbGetCurrentFrameNumber; 00389 struct _URB_CONTROL_TRANSFER UrbControlTransfer; 00390 struct _URB_BULK_OR_INTERRUPT_TRANSFER UrbBulkOrInterruptTransfer; 00391 struct _URB_ISOCH_TRANSFER UrbIsochronousTransfer; 00392 struct _URB_CONTROL_DESCRIPTOR_REQUEST UrbControlDescriptorRequest; 00393 struct _URB_CONTROL_GET_STATUS_REQUEST UrbControlGetStatusRequest; 00394 struct _URB_CONTROL_FEATURE_REQUEST UrbControlFeatureRequest; 00395 struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST UrbControlVendorClassRequest; 00396 struct _URB_CONTROL_GET_INTERFACE_REQUEST UrbControlGetInterfaceRequest; 00397 struct _URB_CONTROL_GET_CONFIGURATION_REQUEST UrbControlGetConfigurationRequest; 00398 }; 00399 } URB, *PURB; 00400 00401 #ifdef __cplusplus 00402 } 00403 #endif 00404 00405 #endif /* defined __USB_H */ 00406 00407 #endif /* __USBDI_H */
Generated on Tue Jul 12 2022 19:59:55 by
1.7.2