Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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