1 // Licensed under the Apache License, Version 2.0
2 // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4 // All files in the project carrying such notice may not be copied, modified, or distributed
5 // except according to those terms.
6 //! USB Spec Definitions.
7 use shared::basetsd::ULONG64;
8 use shared::guiddef::GUID;
9 use shared::minwindef::{UCHAR, ULONG, USHORT};
10 use um::winnt::WCHAR;
11 ENUM!{enum USB_DEVICE_SPEED {
12     UsbLowSpeed = 0,
13     UsbFullSpeed,
14     UsbHighSpeed,
15     UsbSuperSpeed,
16 }}
17 ENUM!{enum USB_DEVICE_TYPE {
18     Usb11Device = 0,
19     Usb20Device,
20 }}
21 STRUCT!{#[repr(packed)] struct BM_REQUEST_TYPE {
22     B: UCHAR,
23 }}
24 BITFIELD!{BM_REQUEST_TYPE B: UCHAR [
25     Recipient set_Recipient[0..2],
26     Reserved set_Reserved[2..5],
27     Type set_Type[5..7],
28     Dir set_Dir[7..8],
29 ]}
30 pub type PBM_REQUEST_TYPE = *mut BM_REQUEST_TYPE;
31 STRUCT!{#[repr(packed)] struct USB_DEFAULT_PIPE_SETUP_PACKET_wValue_s {
32     LowByte: UCHAR,
33     HiByte: UCHAR,
34 }}
35 UNION!{#[repr(packed)] union USB_DEFAULT_PIPE_SETUP_PACKET_wValue {
36     [u16; 1],
37     s s_mut: USB_DEFAULT_PIPE_SETUP_PACKET_wValue_s,
38     W W_mut: USHORT,
39 }}
40 STRUCT!{#[repr(packed)] struct USB_DEFAULT_PIPE_SETUP_PACKET_wIndex_s {
41     LowByte: UCHAR,
42     HiByte: UCHAR,
43 }}
44 UNION!{#[repr(packed)] union USB_DEFAULT_PIPE_SETUP_PACKET_wIndex {
45     [u16; 1],
46     s s_mut: USB_DEFAULT_PIPE_SETUP_PACKET_wIndex_s,
47     W W_mut: USHORT,
48 }}
49 STRUCT!{#[repr(packed)] struct USB_DEFAULT_PIPE_SETUP_PACKET {
50     bmRequestType: BM_REQUEST_TYPE,
51     bRequest: UCHAR,
52     wValue: USB_DEFAULT_PIPE_SETUP_PACKET_wValue,
53     wIndex: USB_DEFAULT_PIPE_SETUP_PACKET_wIndex,
54     wLength: USHORT,
55 }}
56 pub type PUSB_DEFAULT_PIPE_SETUP_PACKET = *mut USB_DEFAULT_PIPE_SETUP_PACKET;
57 pub const BMREQUEST_HOST_TO_DEVICE: UCHAR = 0;
58 pub const BMREQUEST_DEVICE_TO_HOST: UCHAR = 1;
59 pub const BMREQUEST_STANDARD: UCHAR = 0;
60 pub const BMREQUEST_CLASS: UCHAR = 1;
61 pub const BMREQUEST_VENDOR: UCHAR = 2;
62 pub const BMREQUEST_TO_DEVICE: UCHAR = 0;
63 pub const BMREQUEST_TO_INTERFACE: UCHAR = 1;
64 pub const BMREQUEST_TO_ENDPOINT: UCHAR = 2;
65 pub const BMREQUEST_TO_OTHER: UCHAR = 3;
66 #[inline]
USB_DESCRIPTOR_MAKE_TYPE_AND_INDEX(d: UCHAR, i: UCHAR) -> USHORT67 pub fn USB_DESCRIPTOR_MAKE_TYPE_AND_INDEX(d: UCHAR, i: UCHAR) -> USHORT {
68     (d as USHORT) << 8 | (i as USHORT)
69 }
70 pub const USB_REQUEST_GET_STATUS: UCHAR = 0x00;
71 pub const USB_REQUEST_CLEAR_FEATURE: UCHAR = 0x01;
72 pub const USB_REQUEST_SET_FEATURE: UCHAR = 0x03;
73 pub const USB_REQUEST_SET_ADDRESS: UCHAR = 0x05;
74 pub const USB_REQUEST_GET_DESCRIPTOR: UCHAR = 0x06;
75 pub const USB_REQUEST_SET_DESCRIPTOR: UCHAR = 0x07;
76 pub const USB_REQUEST_GET_CONFIGURATION: UCHAR = 0x08;
77 pub const USB_REQUEST_SET_CONFIGURATION: UCHAR = 0x09;
78 pub const USB_REQUEST_GET_INTERFACE: UCHAR = 0x0A;
79 pub const USB_REQUEST_SET_INTERFACE: UCHAR = 0x0B;
80 pub const USB_REQUEST_SYNC_FRAME: UCHAR = 0x0C;
81 pub const USB_REQUEST_SET_SEL: UCHAR = 0x30;
82 pub const USB_REQUEST_ISOCH_DELAY: UCHAR = 0x31;
83 pub const USB_DEVICE_DESCRIPTOR_TYPE: UCHAR = 0x01;
84 pub const USB_CONFIGURATION_DESCRIPTOR_TYPE: UCHAR = 0x02;
85 pub const USB_STRING_DESCRIPTOR_TYPE: UCHAR = 0x03;
86 pub const USB_INTERFACE_DESCRIPTOR_TYPE: UCHAR = 0x04;
87 pub const USB_ENDPOINT_DESCRIPTOR_TYPE: UCHAR = 0x05;
88 pub const USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE: UCHAR = 0x06;
89 pub const USB_OTHER_SPEED_CONFIGURATION_DESCRIPTOR_TYPE: UCHAR = 0x07;
90 pub const USB_INTERFACE_POWER_DESCRIPTOR_TYPE: UCHAR = 0x08;
91 pub const USB_OTG_DESCRIPTOR_TYPE: UCHAR = 0x09;
92 pub const USB_DEBUG_DESCRIPTOR_TYPE: UCHAR = 0x0A;
93 pub const USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE: UCHAR = 0x0B;
94 pub const USB_BOS_DESCRIPTOR_TYPE: UCHAR = 0x0F;
95 pub const USB_DEVICE_CAPABILITY_DESCRIPTOR_TYPE: UCHAR = 0x10;
96 pub const USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR_TYPE: UCHAR = 0x30;
97 pub const USB_SUPERSPEEDPLUS_ISOCH_ENDPOINT_COMPANION_DESCRIPTOR_TYPE: UCHAR = 0x31;
98 pub const USB_RESERVED_DESCRIPTOR_TYPE: UCHAR = 0x06;
99 pub const USB_CONFIG_POWER_DESCRIPTOR_TYPE: UCHAR = 0x07;
100 pub const USB_FEATURE_ENDPOINT_STALL: UCHAR = 0x00;
101 pub const USB_FEATURE_REMOTE_WAKEUP: UCHAR = 0x01;
102 pub const USB_FEATURE_TEST_MODE: UCHAR = 0x02;
103 pub const USB_FEATURE_FUNCTION_SUSPEND: UCHAR = 0x00;
104 pub const USB_FEATURE_U1_ENABLE: UCHAR = 0x30;
105 pub const USB_FEATURE_U2_ENABLE: UCHAR = 0x31;
106 pub const USB_FEATURE_LTM_ENABLE: UCHAR = 0x32;
107 pub const USB_FEATURE_LDM_ENABLE: UCHAR = 0x35;
108 pub const USB_FEATURE_BATTERY_WAKE_MASK: UCHAR = 0x28;
109 pub const USB_FEATURE_OS_IS_PD_AWARE: UCHAR = 0x29;
110 pub const USB_FEATURE_POLICY_MODE: UCHAR = 0x2A;
111 pub const USB_FEATURE_CHARGING_POLICY: UCHAR = 0x36;
112 pub const USB_CHARGING_POLICY_DEFAULT: UCHAR = 0x00;
113 pub const USB_CHARGING_POLICY_ICCHPF: UCHAR = 0x01;
114 pub const USB_CHARGING_POLICY_ICCLPF: UCHAR = 0x02;
115 pub const USB_CHARGING_POLICY_NO_POWER: UCHAR = 0x03;
116 pub const USB_STATUS_PORT_STATUS: UCHAR = 0x00;
117 pub const USB_STATUS_PD_STATUS: UCHAR = 0x01;
118 pub const USB_STATUS_EXT_PORT_STATUS: UCHAR = 0x02;
119 pub const USB_GETSTATUS_SELF_POWERED: UCHAR = 0x01;
120 pub const USB_GETSTATUS_REMOTE_WAKEUP_ENABLED: UCHAR = 0x02;
121 pub const USB_GETSTATUS_U1_ENABLE: UCHAR = 0x04;
122 pub const USB_GETSTATUS_U2_ENABLE: UCHAR = 0x08;
123 pub const USB_GETSTATUS_LTM_ENABLE: UCHAR = 0x10;
124 STRUCT!{#[repr(packed)] struct USB_DEVICE_STATUS {
125     AsUshort16: USHORT,
126 }}
127 BITFIELD!{USB_DEVICE_STATUS AsUshort16: USHORT [
128     SelfPowered set_SelfPowered[0..1],
129     RemoteWakeup set_RemoteWakeup[1..2],
130     U1Enable set_U1Enable[2..3],
131     U2Enable set_U2Enable[3..4],
132     LtmEnable set_LtmEnable[4..5],
133     Reserved set_Reserved[5..16],
134 ]}
135 pub type PUSB_DEVICE_STATUS = *mut USB_DEVICE_STATUS;
136 STRUCT!{#[repr(packed)] struct USB_INTERFACE_STATUS {
137     AsUshort16: USHORT,
138 }}
139 BITFIELD!{USB_INTERFACE_STATUS AsUshort16: USHORT [
140     RemoteWakeupCapable set_RemoteWakeupCapable[0..1],
141     RemoteWakeupEnabled set_RemoteWakeupEnabled[1..2],
142     Reserved set_Reserved[2..16],
143 ]}
144 pub type PUSB_INTERFACE_STATUS = *mut USB_INTERFACE_STATUS;
145 STRUCT!{#[repr(packed)] struct USB_ENDPOINT_STATUS {
146     AsUshort16: USHORT,
147 }}
148 BITFIELD!{USB_ENDPOINT_STATUS AsUshort16: USHORT [
149     Halt set_Halt[0..1],
150     Reserved set_Reserved[1..16],
151 ]}
152 pub type PUSB_ENDPOINT_STATUS = *mut USB_ENDPOINT_STATUS;
153 STRUCT!{#[repr(packed)] struct USB_COMMON_DESCRIPTOR {
154     bLength: UCHAR,
155     bDescriptorType: UCHAR,
156 }}
157 pub type PUSB_COMMON_DESCRIPTOR = *mut USB_COMMON_DESCRIPTOR;
158 STRUCT!{#[repr(packed)] struct USB_DEVICE_DESCRIPTOR {
159     bLength: UCHAR,
160     bDescriptorType: UCHAR,
161     bcdUSB: USHORT,
162     bDeviceClass: UCHAR,
163     bDeviceSubClass: UCHAR,
164     bDeviceProtocol: UCHAR,
165     bMaxPacketSize0: UCHAR,
166     idVendor: USHORT,
167     idProduct: USHORT,
168     bcdDevice: USHORT,
169     iManufacturer: UCHAR,
170     iProduct: UCHAR,
171     iSerialNumber: UCHAR,
172     bNumConfigurations: UCHAR,
173 }}
174 pub type PUSB_DEVICE_DESCRIPTOR = *mut USB_DEVICE_DESCRIPTOR;
175 pub const USB_DEVICE_CLASS_RESERVED: UCHAR = 0x00;
176 pub const USB_DEVICE_CLASS_AUDIO: UCHAR = 0x01;
177 pub const USB_DEVICE_CLASS_COMMUNICATIONS: UCHAR = 0x02;
178 pub const USB_DEVICE_CLASS_HUMAN_INTERFACE: UCHAR = 0x03;
179 pub const USB_DEVICE_CLASS_MONITOR: UCHAR = 0x04;
180 pub const USB_DEVICE_CLASS_PHYSICAL_INTERFACE: UCHAR = 0x05;
181 pub const USB_DEVICE_CLASS_POWER: UCHAR = 0x06;
182 pub const USB_DEVICE_CLASS_IMAGE: UCHAR = 0x06;
183 pub const USB_DEVICE_CLASS_PRINTER: UCHAR = 0x07;
184 pub const USB_DEVICE_CLASS_STORAGE: UCHAR = 0x08;
185 pub const USB_DEVICE_CLASS_HUB: UCHAR = 0x09;
186 pub const USB_DEVICE_CLASS_CDC_DATA: UCHAR = 0x0A;
187 pub const USB_DEVICE_CLASS_SMART_CARD: UCHAR = 0x0B;
188 pub const USB_DEVICE_CLASS_CONTENT_SECURITY: UCHAR = 0x0D;
189 pub const USB_DEVICE_CLASS_VIDEO: UCHAR = 0x0E;
190 pub const USB_DEVICE_CLASS_PERSONAL_HEALTHCARE: UCHAR = 0x0F;
191 pub const USB_DEVICE_CLASS_AUDIO_VIDEO: UCHAR = 0x10;
192 pub const USB_DEVICE_CLASS_BILLBOARD: UCHAR = 0x11;
193 pub const USB_DEVICE_CLASS_DIAGNOSTIC_DEVICE: UCHAR = 0xDC;
194 pub const USB_DEVICE_CLASS_WIRELESS_CONTROLLER: UCHAR = 0xE0;
195 pub const USB_DEVICE_CLASS_MISCELLANEOUS: UCHAR = 0xEF;
196 pub const USB_DEVICE_CLASS_APPLICATION_SPECIFIC: UCHAR = 0xFE;
197 pub const USB_DEVICE_CLASS_VENDOR_SPECIFIC: UCHAR = 0xFF;
198 STRUCT!{#[repr(packed)] struct USB_DEVICE_QUALIFIER_DESCRIPTOR {
199     bLength: UCHAR,
200     bDescriptorType: UCHAR,
201     bcdUSB: USHORT,
202     bDeviceClass: UCHAR,
203     bDeviceSubClass: UCHAR,
204     bDeviceProtocol: UCHAR,
205     bMaxPacketSize0: UCHAR,
206     bNumConfigurations: UCHAR,
207     bReserved: UCHAR,
208 }}
209 pub type PUSB_DEVICE_QUALIFIER_DESCRIPTOR = *mut USB_DEVICE_QUALIFIER_DESCRIPTOR;
210 STRUCT!{#[repr(packed)] struct USB_BOS_DESCRIPTOR {
211     bLength: UCHAR,
212     bDescriptorType: UCHAR,
213     wTotalLength: USHORT,
214     bNumDeviceCaps: UCHAR,
215 }}
216 pub type PUSB_BOS_DESCRIPTOR = *mut USB_BOS_DESCRIPTOR;
217 pub const USB_DEVICE_CAPABILITY_WIRELESS_USB: UCHAR = 0x01;
218 pub const USB_DEVICE_CAPABILITY_USB20_EXTENSION: UCHAR = 0x02;
219 pub const USB_DEVICE_CAPABILITY_SUPERSPEED_USB: UCHAR = 0x03;
220 pub const USB_DEVICE_CAPABILITY_CONTAINER_ID: UCHAR = 0x04;
221 pub const USB_DEVICE_CAPABILITY_PLATFORM: UCHAR = 0x05;
222 pub const USB_DEVICE_CAPABILITY_POWER_DELIVERY: UCHAR = 0x06;
223 pub const USB_DEVICE_CAPABILITY_BATTERY_INFO: UCHAR = 0x07;
224 pub const USB_DEVICE_CAPABILITY_PD_CONSUMER_PORT: UCHAR = 0x08;
225 pub const USB_DEVICE_CAPABILITY_PD_PROVIDER_PORT: UCHAR = 0x09;
226 pub const USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_USB: UCHAR = 0x0A;
227 pub const USB_DEVICE_CAPABILITY_PRECISION_TIME_MEASUREMENT: UCHAR = 0x0B;
228 pub const USB_DEVICE_CAPABILITY_BILLBOARD: UCHAR = 0x0D;
229 pub const USB_DEVICE_CAPABILITY_CONFIGURATION_SUMMARY: UCHAR = 0x10;
230 STRUCT!{#[repr(packed)] struct USB_DEVICE_CAPABILITY_USB20_EXTENSION_DESCRIPTOR_bmAttributes {
231     AsUlong: ULONG,
232 }}
233 BITFIELD!{USB_DEVICE_CAPABILITY_USB20_EXTENSION_DESCRIPTOR_bmAttributes AsUlong: ULONG [
234     Reserved set_Reserved[0..1],
235     LPMCapable set_LPMCapable[1..2],
236     BESLAndAlternateHIRDSupported set_BESLAndAlternateHIRDSupported[2..3],
237     BaselineBESLValid set_BaselineBESLValid[3..4],
238     DeepBESLValid set_DeepBESLValid[4..5],
239     Reserved1 set_Reserved1[5..8],
240     BaselineBESL set_BaselineBESL[8..12],
241     DeepBESL set_DeepBESL[12..16],
242     Reserved2 set_Reserved2[16..32],
243 ]}
244 STRUCT!{#[repr(packed)] struct USB_DEVICE_CAPABILITY_USB20_EXTENSION_DESCRIPTOR {
245     bLength: UCHAR,
246     bDescriptorType: UCHAR,
247     bDevCapabilityType: UCHAR,
248     bmAttributes: USB_DEVICE_CAPABILITY_USB20_EXTENSION_DESCRIPTOR_bmAttributes,
249 }}
250 pub type PUSB_DEVICE_CAPABILITY_USB20_EXTENSION_DESCRIPTOR
251     = *mut USB_DEVICE_CAPABILITY_USB20_EXTENSION_DESCRIPTOR;
252 pub const USB_DEVICE_CAPABILITY_USB20_EXTENSION_BMATTRIBUTES_RESERVED_MASK: ULONG = 0xFFFF00E1;
253 STRUCT!{#[repr(packed)] struct USB_DEVICE_CAPABILITY_POWER_DELIVERY_DESCRIPTOR_bmAttributes {
254     AsUlong: ULONG,
255 }}
256 BITFIELD!{USB_DEVICE_CAPABILITY_POWER_DELIVERY_DESCRIPTOR_bmAttributes AsUlong: ULONG [
257     Reserved set_Reserved[0..1],
258     BatteryCharging set_BatteryCharging[1..2],
259     USBPowerDelivery set_USBPowerDelivery[2..3],
260     Provider set_Provider[3..4],
261     Consumer set_Consumer[4..5],
262     ChargingPolicy set_ChargingPolicy[5..6],
263     TypeCCurrent set_TypeCCurrent[6..7],
264     Reserved2 set_Reserved2[7..8],
265     ACSupply set_ACSupply[8..9],
266     Battery set_Battery[9..10],
267     Other set_Other[10..11],
268     NumBatteries set_NumBatteries[11..14],
269     UsesVbus set_UsesVbus[14..15],
270     Reserved3 set_Reserved3[15..32],
271 ]}
272 STRUCT!{#[repr(packed)] struct USB_DEVICE_CAPABILITY_POWER_DELIVERY_DESCRIPTOR {
273     bLength: UCHAR,
274     bDescriptorType: UCHAR,
275     bDevCapabilityType: UCHAR,
276     bReserved: UCHAR,
277     bmAttributes: USB_DEVICE_CAPABILITY_POWER_DELIVERY_DESCRIPTOR_bmAttributes,
278     bmProviderPorts: USHORT,
279     bmConsumerPorts: USHORT,
280     bcdBCVersion: USHORT,
281     bcdPDVersion: USHORT,
282     bcdUSBTypeCVersion: USHORT,
283 }}
284 pub type PUSB_DEVICE_CAPABILITY_POWER_DELIVERY_DESCRIPTOR
285     = *mut USB_DEVICE_CAPABILITY_POWER_DELIVERY_DESCRIPTOR;
286 STRUCT!{#[repr(packed)] struct USB_DEVICE_CAPABILITY_PD_CONSUMER_PORT_DESCRIPTOR_bmCapabilities {
287     AsUshort: USHORT,
288 }}
289 BITFIELD!{USB_DEVICE_CAPABILITY_PD_CONSUMER_PORT_DESCRIPTOR_bmCapabilities AsUshort: USHORT [
290     BatteryCharging set_BatteryCharging[0..1],
291     USBPowerDelivery set_USBPowerDelivery[1..2],
292     USBTypeCCurrent set_USBTypeCCurrent[2..3],
293     Reserved set_Reserved[3..16],
294 ]}
295 STRUCT!{#[repr(packed)] struct USB_DEVICE_CAPABILITY_PD_CONSUMER_PORT_DESCRIPTOR {
296     bLength: UCHAR,
297     bDescriptorType: UCHAR,
298     bDevCapabilityType: UCHAR,
299     bReserved: UCHAR,
300     bmCapabilities: USB_DEVICE_CAPABILITY_PD_CONSUMER_PORT_DESCRIPTOR_bmCapabilities,
301     wMinVoltage: USHORT,
302     wMaxVoltage: USHORT,
303     wReserved: USHORT,
304     dwMaxOperatingPower: ULONG,
305     dwMaxPeakPower: ULONG,
306     dwMaxPeakPowerTime: ULONG,
307 }}
308 pub type PUSB_DEVICE_CAPABILITY_PD_CONSUMER_PORT_DESCRIPTOR
309     = *mut USB_DEVICE_CAPABILITY_PD_CONSUMER_PORT_DESCRIPTOR;
310 STRUCT!{#[repr(packed)] struct USB_DEVICE_CAPABILITY_SUPERSPEED_USB_DESCRIPTOR {
311     bLength: UCHAR,
312     bDescriptorType: UCHAR,
313     bDevCapabilityType: UCHAR,
314     bmAttributes: UCHAR,
315     wSpeedsSupported: USHORT,
316     bFunctionalitySupport: UCHAR,
317     bU1DevExitLat: UCHAR,
318     wU2DevExitLat: USHORT,
319 }}
320 pub type PUSB_DEVICE_CAPABILITY_SUPERSPEED_USB_DESCRIPTOR
321     = *mut USB_DEVICE_CAPABILITY_SUPERSPEED_USB_DESCRIPTOR;
322 pub const USB_DEVICE_CAPABILITY_SUPERSPEED_BMATTRIBUTES_RESERVED_MASK: UCHAR = 0xFD;
323 pub const USB_DEVICE_CAPABILITY_SUPERSPEED_BMATTRIBUTES_LTM_CAPABLE: UCHAR = 0x02;
324 pub const USB_DEVICE_CAPABILITY_SUPERSPEED_SPEEDS_SUPPORTED_RESERVED_MASK: USHORT = 0xFFF0;
325 pub const USB_DEVICE_CAPABILITY_SUPERSPEED_SPEEDS_SUPPORTED_LOW: USHORT = 0x0001;
326 pub const USB_DEVICE_CAPABILITY_SUPERSPEED_SPEEDS_SUPPORTED_FULL: USHORT = 0x0002;
327 pub const USB_DEVICE_CAPABILITY_SUPERSPEED_SPEEDS_SUPPORTED_HIGH: USHORT = 0x0004;
328 pub const USB_DEVICE_CAPABILITY_SUPERSPEED_SPEEDS_SUPPORTED_SUPER: USHORT = 0x0008;
329 pub const USB_DEVICE_CAPABILITY_SUPERSPEED_U1_DEVICE_EXIT_MAX_VALUE: UCHAR = 0x0A;
330 pub const USB_DEVICE_CAPABILITY_SUPERSPEED_U2_DEVICE_EXIT_MAX_VALUE: USHORT = 0x07FF;
331 pub const USB_DEVICE_CAPABILITY_MAX_U1_LATENCY: UCHAR = 0x0A;
332 pub const USB_DEVICE_CAPABILITY_MAX_U2_LATENCY: USHORT = 0x07FF;
333 pub const USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_SPEED_LSE_BPS: ULONG = 0;
334 pub const USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_SPEED_LSE_KBPS: ULONG = 1;
335 pub const USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_SPEED_LSE_MBPS: ULONG = 2;
336 pub const USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_SPEED_LSE_GBPS: ULONG = 3;
337 pub const USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_SPEED_MODE_SYMMETRIC: ULONG = 0;
338 pub const USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_SPEED_MODE_ASYMMETRIC: ULONG = 1;
339 pub const USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_SPEED_DIR_RX: ULONG = 0;
340 pub const USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_SPEED_DIR_TX: ULONG = 1;
341 pub const USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_SPEED_PROTOCOL_SS: ULONG = 0;
342 pub const USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_SPEED_PROTOCOL_SSP: ULONG = 1;
343 STRUCT!{#[repr(packed)] struct USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_SPEED {
344     AsUlong32: ULONG,
345 }}
346 BITFIELD!{USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_SPEED AsUlong32: ULONG [
347     SublinkSpeedAttrID set_SublinkSpeedAttrID[0..4],
348     LaneSpeedExponent set_LaneSpeedExponent[4..6],
349     SublinkTypeMode set_SublinkTypeMode[6..7],
350     SublinkTypeDir set_SublinkTypeDir[7..8],
351     Reserved set_Reserved[8..14],
352     LinkProtocol set_LinkProtocol[14..16],
353     LaneSpeedMantissa set_LaneSpeedMantissa[16..32],
354 ]}
355 STRUCT!{#[repr(packed)] struct USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_USB_DESCRIPTOR_bmAttributes {
356     AsUlong32: ULONG,
357 }}
358 BITFIELD!{USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_USB_DESCRIPTOR_bmAttributes AsUlong32: ULONG [
359     SublinkSpeedAttrCount set_SublinkSpeedAttrCount[0..5],
360     SublinkSpeedIDCount set_SublinkSpeedIDCount[5..9],
361     Reserved set_Reserved[9..32],
362 ]}
363 STRUCT!{#[repr(packed)]
364     struct USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_USB_DESCRIPTOR_wFunctionalitySupport {
365     AsUshort: USHORT,
366 }}
367 BITFIELD!{
368     USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_USB_DESCRIPTOR_wFunctionalitySupport AsUshort: USHORT [
369     SublinkSpeedAttrID set_SublinkSpeedAttrID[0..4],
370     Reserved set_Reserved[4..8],
371     MinRxLaneCount set_MinRxLaneCount[8..12],
372     MinTxLaneCount set_MinTxLaneCount[12..16],
373 ]}
374 STRUCT!{#[repr(packed)] struct USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_USB_DESCRIPTOR {
375     bLength: UCHAR,
376     bDescriptorType: UCHAR,
377     bDevCapabilityType: UCHAR,
378     bReserved: UCHAR,
379     bmAttributes: USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_USB_DESCRIPTOR_bmAttributes,
380     wFunctionalitySupport:
381         USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_USB_DESCRIPTOR_wFunctionalitySupport,
382     wReserved: USHORT,
383     bmSublinkSpeedAttr: [USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_SPEED; 1],
384 }}
385 pub type PUSB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_USB_DESCRIPTOR
386     = *mut USB_DEVICE_CAPABILITY_SUPERSPEEDPLUS_USB_DESCRIPTOR;
387 STRUCT!{#[repr(packed)] struct USB_DEVICE_CAPABILITY_CONTAINER_ID_DESCRIPTOR {
388     bLength: UCHAR,
389     bDescriptorType: UCHAR,
390     bDevCapabilityType: UCHAR,
391     bReserved: UCHAR,
392     ContainerID: [UCHAR; 16],
393 }}
394 pub type PUSB_DEVICE_CAPABILITY_CONTAINER_ID_DESCRIPTOR
395     = *mut USB_DEVICE_CAPABILITY_CONTAINER_ID_DESCRIPTOR;
396 STRUCT!{#[repr(packed)] struct USB_DEVICE_CAPABILITY_CONFIGURATION_SUMMARY_DESCRIPTOR_Function {
397     bClass: UCHAR,
398     bSubClass: UCHAR,
399     bProtocol: UCHAR,
400 }}
401 STRUCT!{#[repr(packed)] struct USB_DEVICE_CAPABILITY_CONFIGURATION_SUMMARY_DESCRIPTOR {
402     bLength: UCHAR,
403     bDescriptorType: UCHAR,
404     bDevCapabilityType: UCHAR,
405     bcdVersion: USHORT,
406     bConfigurationValue: UCHAR,
407     bMaxPower: UCHAR,
408     bNumFunctions: UCHAR,
409     Function: [USB_DEVICE_CAPABILITY_CONFIGURATION_SUMMARY_DESCRIPTOR_Function; 1],
410 }}
411 pub type PUSB_DEVICE_CAPABILITY_CONFIGURATION_SUMMARY_DESCRIPTOR
412     = *mut USB_DEVICE_CAPABILITY_CONFIGURATION_SUMMARY_DESCRIPTOR;
413 STRUCT!{#[repr(packed)] struct USB_DEVICE_CAPABILITY_PLATFORM_DESCRIPTOR {
414     bLength: UCHAR,
415     bDescriptorType: UCHAR,
416     bDevCapabilityType: UCHAR,
417     bReserved: UCHAR,
418     PlatformCapabilityUuid: GUID,
419     CapabililityData: [UCHAR; 1],
420 }}
421 pub type PUSB_DEVICE_CAPABILITY_PLATFORM_DESCRIPTOR
422     = *mut USB_DEVICE_CAPABILITY_PLATFORM_DESCRIPTOR;
423 STRUCT!{#[repr(packed)] struct USB_DEVICE_CAPABILITY_BILLBOARD_DESCRIPTOR_VconnPower {
424     AsUshort: USHORT,
425 }}
426 BITFIELD!{USB_DEVICE_CAPABILITY_BILLBOARD_DESCRIPTOR_VconnPower AsUshort: USHORT [
427     VConnPowerNeededForFullFunctionality set_VConnPowerNeededForFullFunctionality[0..3],
428     Reserved set_Reserved[3..15],
429     NoVconnPowerRequired set_NoVconnPowerRequired[15..16],
430 ]}
431 STRUCT!{#[repr(packed)] struct USB_DEVICE_CAPABILITY_BILLBOARD_DESCRIPTOR_AlternateMode {
432     wSVID: USHORT,
433     bAlternateMode: UCHAR,
434     iAlternateModeSetting: UCHAR,
435 }}
436 STRUCT!{#[repr(packed)] struct USB_DEVICE_CAPABILITY_BILLBOARD_DESCRIPTOR {
437     bLength: UCHAR,
438     bDescriptorType: UCHAR,
439     bDevCapabilityType: UCHAR,
440     iAddtionalInfoURL: UCHAR,
441     bNumberOfAlternateModes: UCHAR,
442     bPreferredAlternateMode: UCHAR,
443     VconnPower: USB_DEVICE_CAPABILITY_BILLBOARD_DESCRIPTOR_VconnPower,
444     bmConfigured: [UCHAR; 32],
445     bReserved: ULONG,
446     AlternateMode: [USB_DEVICE_CAPABILITY_BILLBOARD_DESCRIPTOR_AlternateMode; 1],
447 }}
448 pub type PUSB_DEVICE_CAPABILITY_BILLBOARD_DESCRIPTOR
449     = *mut USB_DEVICE_CAPABILITY_BILLBOARD_DESCRIPTOR;
450 DEFINE_GUID!{GUID_USB_MSOS20_PLATFORM_CAPABILITY_ID,
451     0xd8dd60df, 0x4589, 0x4cc7, 0x9c, 0xd2, 0x65, 0x9d, 0x9e, 0x64, 0x8a, 0x9f}
452 STRUCT!{#[repr(packed)] struct USB_DEVICE_CAPABILITY_DESCRIPTOR {
453     bLength: UCHAR,
454     bDescriptorType: UCHAR,
455     bDevCapabilityType: UCHAR,
456 }}
457 pub type PUSB_DEVICE_CAPABILITY_DESCRIPTOR = *mut USB_DEVICE_CAPABILITY_DESCRIPTOR;
458 STRUCT!{#[repr(packed)] struct USB_CONFIGURATION_DESCRIPTOR {
459     bLength: UCHAR,
460     bDescriptorType: UCHAR,
461     wTotalLength: USHORT,
462     bNumInterfaces: UCHAR,
463     bConfigurationValue: UCHAR,
464     iConfiguration: UCHAR,
465     bmAttributes: UCHAR,
466     MaxPower: UCHAR,
467 }}
468 pub type PUSB_CONFIGURATION_DESCRIPTOR = *mut USB_CONFIGURATION_DESCRIPTOR;
469 pub const USB_CONFIG_POWERED_MASK: UCHAR = 0xC0;
470 pub const USB_CONFIG_BUS_POWERED: UCHAR = 0x80;
471 pub const USB_CONFIG_SELF_POWERED: UCHAR = 0x40;
472 pub const USB_CONFIG_REMOTE_WAKEUP: UCHAR = 0x20;
473 pub const USB_CONFIG_RESERVED: UCHAR = 0x1F;
474 STRUCT!{#[repr(packed)] struct USB_INTERFACE_ASSOCIATION_DESCRIPTOR {
475     bLength: UCHAR,
476     bDescriptorType: UCHAR,
477     bFirstInterface: UCHAR,
478     bInterfaceCount: UCHAR,
479     bFunctionClass: UCHAR,
480     bFunctionSubClass: UCHAR,
481     bFunctionProtocol: UCHAR,
482     iFunction: UCHAR,
483 }}
484 pub type PUSB_INTERFACE_ASSOCIATION_DESCRIPTOR = *mut USB_INTERFACE_ASSOCIATION_DESCRIPTOR;
485 STRUCT!{#[repr(packed)] struct USB_INTERFACE_DESCRIPTOR {
486     bLength: UCHAR,
487     bDescriptorType: UCHAR,
488     bInterfaceNumber: UCHAR,
489     bAlternateSetting: UCHAR,
490     bNumEndpoints: UCHAR,
491     bInterfaceClass: UCHAR,
492     bInterfaceSubClass: UCHAR,
493     bInterfaceProtocol: UCHAR,
494     iInterface: UCHAR,
495 }}
496 pub type PUSB_INTERFACE_DESCRIPTOR = *mut USB_INTERFACE_DESCRIPTOR;
497 STRUCT!{#[repr(packed)] struct USB_ENDPOINT_DESCRIPTOR {
498     bLength: UCHAR,
499     bDescriptorType: UCHAR,
500     bEndpointAddress: UCHAR,
501     bmAttributes: UCHAR,
502     wMaxPacketSize: USHORT,
503     bInterval: UCHAR,
504 }}
505 pub type PUSB_ENDPOINT_DESCRIPTOR = *mut USB_ENDPOINT_DESCRIPTOR;
506 pub const USB_ENDPOINT_DIRECTION_MASK: UCHAR = 0x80;
507 #[inline]
USB_ENDPOINT_DIRECTION_OUT(addr: UCHAR) -> UCHAR508 pub fn USB_ENDPOINT_DIRECTION_OUT(addr: UCHAR) -> UCHAR {
509     !(addr & USB_ENDPOINT_DIRECTION_MASK)
510 }
511 #[inline]
USB_ENDPOINT_DIRECTION_IN(addr: UCHAR) -> UCHAR512 pub fn USB_ENDPOINT_DIRECTION_IN(addr: UCHAR) -> UCHAR {
513     addr & USB_ENDPOINT_DIRECTION_MASK
514 }
515 pub const USB_ENDPOINT_ADDRESS_MASK: UCHAR = 0x0F;
516 pub const USB_ENDPOINT_TYPE_MASK: UCHAR = 0x03;
517 pub const USB_ENDPOINT_TYPE_CONTROL: UCHAR = 0x00;
518 pub const USB_ENDPOINT_TYPE_ISOCHRONOUS: UCHAR = 0x01;
519 pub const USB_ENDPOINT_TYPE_BULK: UCHAR = 0x02;
520 pub const USB_ENDPOINT_TYPE_INTERRUPT: UCHAR = 0x03;
521 pub const USB_ENDPOINT_TYPE_BULK_RESERVED_MASK: UCHAR = 0xFC;
522 pub const USB_ENDPOINT_TYPE_CONTROL_RESERVED_MASK: UCHAR = 0xFC;
523 pub const USB_20_ENDPOINT_TYPE_INTERRUPT_RESERVED_MASK: UCHAR = 0xFC;
524 pub const USB_30_ENDPOINT_TYPE_INTERRUPT_RESERVED_MASK: UCHAR = 0xCC;
525 pub const USB_ENDPOINT_TYPE_ISOCHRONOUS_RESERVED_MASK: UCHAR = 0xC0;
526 pub const USB_30_ENDPOINT_TYPE_INTERRUPT_USAGE_MASK: UCHAR = 0x30;
527 pub const USB_30_ENDPOINT_TYPE_INTERRUPT_USAGE_PERIODIC: UCHAR = 0x00;
528 pub const USB_30_ENDPOINT_TYPE_INTERRUPT_USAGE_NOTIFICATION: UCHAR = 0x10;
529 pub const USB_30_ENDPOINT_TYPE_INTERRUPT_USAGE_RESERVED10: UCHAR = 0x20;
530 pub const USB_30_ENDPOINT_TYPE_INTERRUPT_USAGE_RESERVED11: UCHAR = 0x30;
531 #[inline]
USB_30_ENDPOINT_TYPE_INTERRUPT_USAGE(bmAttr: UCHAR) -> UCHAR532 pub fn USB_30_ENDPOINT_TYPE_INTERRUPT_USAGE(bmAttr: UCHAR) -> UCHAR {
533     bmAttr & USB_30_ENDPOINT_TYPE_INTERRUPT_USAGE_MASK
534 }
535 pub const USB_ENDPOINT_TYPE_ISOCHRONOUS_SYNCHRONIZATION_MASK: UCHAR = 0x0C;
536 pub const USB_ENDPOINT_TYPE_ISOCHRONOUS_SYNCHRONIZATION_NO_SYNCHRONIZATION: UCHAR = 0x00;
537 pub const USB_ENDPOINT_TYPE_ISOCHRONOUS_SYNCHRONIZATION_ASYNCHRONOUS: UCHAR = 0x04;
538 pub const USB_ENDPOINT_TYPE_ISOCHRONOUS_SYNCHRONIZATION_ADAPTIVE: UCHAR = 0x08;
539 pub const USB_ENDPOINT_TYPE_ISOCHRONOUS_SYNCHRONIZATION_SYNCHRONOUS: UCHAR = 0x0C;
540 #[inline]
USB_ENDPOINT_TYPE_ISOCHRONOUS_SYNCHRONIZATION(bmAttr: UCHAR) -> UCHAR541 pub fn USB_ENDPOINT_TYPE_ISOCHRONOUS_SYNCHRONIZATION(bmAttr: UCHAR) -> UCHAR {
542     bmAttr & USB_ENDPOINT_TYPE_ISOCHRONOUS_SYNCHRONIZATION_MASK
543 }
544 pub const USB_ENDPOINT_TYPE_ISOCHRONOUS_USAGE_MASK: UCHAR = 0x30;
545 pub const USB_ENDPOINT_TYPE_ISOCHRONOUS_USAGE_DATA_ENDOINT: UCHAR = 0x00;
546 pub const USB_ENDPOINT_TYPE_ISOCHRONOUS_USAGE_FEEDBACK_ENDPOINT: UCHAR = 0x10;
547 pub const USB_ENDPOINT_TYPE_ISOCHRONOUS_USAGE_IMPLICIT_FEEDBACK_DATA_ENDPOINT: UCHAR = 0x20;
548 pub const USB_ENDPOINT_TYPE_ISOCHRONOUS_USAGE_RESERVED: UCHAR = 0x30;
549 #[inline]
USB_ENDPOINT_TYPE_ISOCHRONOUS_USAGE(bmAttr: UCHAR) -> UCHAR550 pub fn USB_ENDPOINT_TYPE_ISOCHRONOUS_USAGE(bmAttr: UCHAR) -> UCHAR {
551     bmAttr & USB_ENDPOINT_TYPE_ISOCHRONOUS_USAGE_MASK
552 }
553 STRUCT!{#[repr(packed)] struct USB_HIGH_SPEED_MAXPACKET {
554     us: USHORT,
555 }}
556 BITFIELD!{USB_HIGH_SPEED_MAXPACKET us: USHORT [
557     MaxPacket set_MaxPacket[0..11],
558     HSmux set_HSmux[11..13],
559     Reserved set_Reserved[13..16],
560 ]}
561 pub type PUSB_HIGH_SPEED_MAXPACKET = *mut USB_HIGH_SPEED_MAXPACKET;
562 pub const USB_ENDPOINT_SUPERSPEED_BULK_MAX_PACKET_SIZE: USHORT = 1024;
563 pub const USB_ENDPOINT_SUPERSPEED_CONTROL_MAX_PACKET_SIZE: USHORT = 512;
564 pub const USB_ENDPOINT_SUPERSPEED_ISO_MAX_PACKET_SIZE: USHORT = 1024;
565 pub const USB_ENDPOINT_SUPERSPEED_INTERRUPT_MAX_PACKET_SIZE: USHORT = 1024;
566 STRUCT!{#[repr(packed)] struct USB_STRING_DESCRIPTOR {
567     bLength: UCHAR,
568     bDescriptorType: UCHAR,
569     bString: [WCHAR; 1],
570 }}
571 pub type PUSB_STRING_DESCRIPTOR = *mut USB_STRING_DESCRIPTOR;
572 pub const MAXIMUM_USB_STRING_LENGTH: UCHAR = 255;
573 STRUCT!{#[repr(packed)] struct USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR_bmAttributes_Bulk {
574     BitField: UCHAR,
575 }}
576 BITFIELD!{USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR_bmAttributes_Bulk BitField: UCHAR [
577     MaxStreams set_MaxStreams[0..5],
578     Reserved1 set_Reserved1[5..8],
579 ]}
580 STRUCT!{#[repr(packed)]
581     struct USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR_bmAttributes_Isochronous {
582     BitField: UCHAR,
583 }}
584 BITFIELD!{USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR_bmAttributes_Isochronous BitField: UCHAR [
585     Mult set_Mult[0..2],
586     Reserved2 set_Reserved2[2..7],
587     SspCompanion set_SspCompanion[7..8],
588 ]}
589 UNION!{#[repr(packed)] union USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR_bmAttributes {
590     [u8; 1],
591     AsUchar AsUchar_mut: UCHAR,
592     Bulk Bulk_mut: USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR_bmAttributes_Bulk,
593     Isochronous Isochronous_mut:
594         USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR_bmAttributes_Isochronous,
595 }}
596 STRUCT!{#[repr(packed)] struct USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR {
597     bLength: UCHAR,
598     bDescriptorType: UCHAR,
599     bMaxBurst: UCHAR,
600     bmAttributes: USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR_bmAttributes,
601     wBytesPerInterval: USHORT,
602 }}
603 pub type PUSB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR
604     = *mut USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR;
605 pub const USB_SUPERSPEED_ISOCHRONOUS_MAX_MULTIPLIER: UCHAR = 2;
606 STRUCT!{#[repr(packed)] struct USB_SUPERSPEEDPLUS_ISOCH_ENDPOINT_COMPANION_DESCRIPTOR {
607     bLength: UCHAR,
608     bDescriptorType: UCHAR,
609     wReserved: USHORT,
610     dwBytesPerInterval: ULONG,
611 }}
612 pub type PUSB_SUPERSPEEDPLUS_ISOCH_ENDPOINT_COMPANION_DESCRIPTOR
613     = *mut USB_SUPERSPEEDPLUS_ISOCH_ENDPOINT_COMPANION_DESCRIPTOR;
614 pub const USB_SUPERSPEEDPLUS_ISOCHRONOUS_MIN_BYTESPERINTERVAL: ULONG = 0xC001;
615 pub const USB_SUPERSPEEDPLUS_ISOCHRONOUS_MAX_BYTESPERINTERVAL: ULONG = 0xFFFFFF;
616 STRUCT!{#[repr(packed)] struct USB_HUB_DESCRIPTOR {
617     bDescriptorLength: UCHAR,
618     bDescriptorType: UCHAR,
619     bNumberOfPorts: UCHAR,
620     wHubCharacteristics: USHORT,
621     bPowerOnToPowerGood: UCHAR,
622     bHubControlCurrent: UCHAR,
623     bRemoveAndPowerMask: [UCHAR; 64],
624 }}
625 pub type PUSB_HUB_DESCRIPTOR = *mut USB_HUB_DESCRIPTOR;
626 pub const USB_20_HUB_DESCRIPTOR_TYPE: UCHAR = 0x29;
627 STRUCT!{#[repr(packed)] struct USB_30_HUB_DESCRIPTOR {
628     bLength: UCHAR,
629     bDescriptorType: UCHAR,
630     bNumberOfPorts: UCHAR,
631     wHubCharacteristics: USHORT,
632     bPowerOnToPowerGood: UCHAR,
633     bHubControlCurrent: UCHAR,
634     bHubHdrDecLat: UCHAR,
635     wHubDelay: USHORT,
636     DeviceRemovable: USHORT,
637 }}
638 pub type PUSB_30_HUB_DESCRIPTOR = *mut USB_30_HUB_DESCRIPTOR;
639 pub const USB_30_HUB_DESCRIPTOR_TYPE: UCHAR = 0x2A;
640 pub const USB_REQUEST_GET_STATE: UCHAR = 0x02;
641 pub const USB_REQUEST_CLEAR_TT_BUFFER: UCHAR = 0x08;
642 pub const USB_REQUEST_RESET_TT: UCHAR = 0x09;
643 pub const USB_REQUEST_GET_TT_STATE: UCHAR = 0x0A;
644 pub const USB_REQUEST_STOP_TT: UCHAR = 0x0B;
645 pub const USB_REQUEST_SET_HUB_DEPTH: UCHAR = 0x0C;
646 pub const USB_REQUEST_GET_PORT_ERR_COUNT: UCHAR = 0x0D;
647 STRUCT!{#[repr(packed)] struct USB_HUB_STATUS {
648     AsUshort16: USHORT,
649 }}
650 BITFIELD!{USB_HUB_STATUS AsUshort16: USHORT [
651     LocalPowerLost set_LocalPowerLost[0..1],
652     OverCurrent set_OverCurrent[1..2],
653     Reserved set_Reserved[2..16],
654 ]}
655 pub type PUSB_HUB_STATUS = *mut USB_HUB_STATUS;
656 STRUCT!{#[repr(packed)] struct USB_HUB_CHANGE {
657     AsUshort16: USHORT,
658 }}
659 BITFIELD!{USB_HUB_CHANGE AsUshort16: USHORT [
660     LocalPowerChange set_LocalPowerChange[0..1],
661     OverCurrentChange set_OverCurrentChange[1..2],
662     Reserved set_Reserved[2..16],
663 ]}
664 pub type PUSB_HUB_CHANGE = *mut USB_HUB_CHANGE;
665 STRUCT!{#[repr(packed)] struct USB_HUB_STATUS_AND_CHANGE_s {
666     HubStatus: USB_HUB_STATUS,
667     HubChange: USB_HUB_CHANGE,
668 }}
669 UNION!{#[repr(packed)] union USB_HUB_STATUS_AND_CHANGE {
670     [u32; 1],
671     AsUlong32 AsUlong32_mut: ULONG,
672     s s_mut: USB_HUB_STATUS_AND_CHANGE_s,
673 }}
674 pub type PUSB_HUB_STATUS_AND_CHANGE = *mut USB_HUB_STATUS_AND_CHANGE;
675 STRUCT!{#[repr(packed)] struct USB_20_PORT_STATUS {
676     AsUshort16: USHORT,
677 }}
678 BITFIELD!{USB_20_PORT_STATUS AsUshort16: USHORT [
679     CurrentConnectStatus set_CurrentConnectStatus[0..1],
680     PortEnabledDisabled set_PortEnabledDisabled[1..2],
681     Suspend set_Suspend[2..3],
682     OverCurrent set_OverCurrent[3..4],
683     Reset set_Reset[4..5],
684     L1 set_L1[5..6],
685     Reserved0 set_Reserved0[6..8],
686     PortPower set_PortPower[8..9],
687     LowSpeedDeviceAttached set_LowSpeedDeviceAttached[9..10],
688     HighSpeedDeviceAttached set_HighSpeedDeviceAttached[10..11],
689     PortTestMode set_PortTestMode[11..12],
690     PortIndicatorControl set_PortIndicatorControl[12..13],
691     Reserved1 set_Reserved1[13..16],
692 ]}
693 pub type PUSB_20_PORT_STATUS = *mut USB_20_PORT_STATUS;
694 pub const USB_PORT_STATUS_CONNECT: USHORT = 0x0001;
695 pub const USB_PORT_STATUS_ENABLE: USHORT = 0x0002;
696 pub const USB_PORT_STATUS_SUSPEND: USHORT = 0x0004;
697 pub const USB_PORT_STATUS_OVER_CURRENT: USHORT = 0x0008;
698 pub const USB_PORT_STATUS_RESET: USHORT = 0x0010;
699 pub const USB_PORT_STATUS_POWER: USHORT = 0x0100;
700 pub const USB_PORT_STATUS_LOW_SPEED: USHORT = 0x0200;
701 pub const USB_PORT_STATUS_HIGH_SPEED: USHORT = 0x0400;
702 STRUCT!{#[repr(packed)] struct USB_20_PORT_CHANGE {
703     AsUshort16: USHORT,
704 }}
705 BITFIELD!{USB_20_PORT_CHANGE AsUshort16: USHORT [
706     ConnectStatusChange set_ConnectStatusChange[0..1],
707     PortEnableDisableChange set_PortEnableDisableChange[1..2],
708     SuspendChange set_SuspendChange[2..3],
709     OverCurrentIndicatorChange set_OverCurrentIndicatorChange[3..4],
710     ResetChange set_ResetChange[4..5],
711     Reserved2 set_Reserved2[5..16],
712 ]}
713 pub type PUSB_20_PORT_CHANGE = *mut USB_20_PORT_CHANGE;
714 STRUCT!{#[repr(packed)] struct USB_30_PORT_STATUS {
715     AsUshort16: USHORT,
716 }}
717 BITFIELD!{USB_30_PORT_STATUS AsUshort16: USHORT [
718     CurrentConnectStatus set_CurrentConnectStatus[0..1],
719     PortEnabledDisabled set_PortEnabledDisabled[1..2],
720     Reserved0 set_Reserved0[2..3],
721     OverCurrent set_OverCurrent[3..4],
722     Reset set_Reset[4..5],
723     PortLinkState set_PortLinkState[5..9],
724     PortPower set_PortPower[9..10],
725     NegotiatedDeviceSpeed set_NegotiatedDeviceSpeed[10..13],
726     Reserved1 set_Reserved1[13..16],
727 ]}
728 pub type PUSB_30_PORT_STATUS = *mut USB_30_PORT_STATUS;
729 pub const PORT_LINK_STATE_U0: USHORT = 0;
730 pub const PORT_LINK_STATE_U1: USHORT = 1;
731 pub const PORT_LINK_STATE_U2: USHORT = 2;
732 pub const PORT_LINK_STATE_U3: USHORT = 3;
733 pub const PORT_LINK_STATE_DISABLED: USHORT = 4;
734 pub const PORT_LINK_STATE_RX_DETECT: USHORT = 5;
735 pub const PORT_LINK_STATE_INACTIVE: USHORT = 6;
736 pub const PORT_LINK_STATE_POLLING: USHORT = 7;
737 pub const PORT_LINK_STATE_RECOVERY: USHORT = 8;
738 pub const PORT_LINK_STATE_HOT_RESET: USHORT = 9;
739 pub const PORT_LINK_STATE_COMPLIANCE_MODE: USHORT = 10;
740 pub const PORT_LINK_STATE_LOOPBACK: USHORT = 11;
741 pub const PORT_LINK_STATE_TEST_MODE: USHORT = 11;
742 STRUCT!{#[repr(packed)] struct USB_30_PORT_CHANGE {
743     AsUshort16: USHORT,
744 }}
745 BITFIELD!{USB_30_PORT_CHANGE AsUshort16: USHORT [
746     ConnectStatusChange set_ConnectStatusChange[0..1],
747     Reserved2 set_Reserved2[1..3],
748     OverCurrentIndicatorChange set_OverCurrentIndicatorChange[3..4],
749     ResetChange set_ResetChange[4..5],
750     BHResetChange set_BHResetChange[5..6],
751     PortLinkStateChange set_PortLinkStateChange[6..7],
752     PortConfigErrorChange set_PortConfigErrorChange[7..8],
753     Reserved3 set_Reserved3[8..16],
754 ]}
755 pub type PUSB_30_PORT_CHANGE = *mut USB_30_PORT_CHANGE;
756 UNION!{#[repr(packed)] union USB_PORT_STATUS {
757     [u16; 1],
758     AsUshort16 AsUshort16_mut: USHORT,
759     Usb20PortStatus Usb20PortStatus_mut: USB_20_PORT_STATUS,
760     Usb30PortStatus Usb30PortStatus_mut: USB_30_PORT_STATUS,
761 }}
762 pub type PUSB_PORT_STATUS = *mut USB_PORT_STATUS;
763 UNION!{#[repr(packed)] union USB_PORT_CHANGE {
764     [u16; 1],
765     AsUshort16 AsUshort16_mut: USHORT,
766     Usb20PortChange Usb20PortChange_mut: USB_20_PORT_CHANGE,
767     Usb30PortChange Usb30PortChange_mut: USB_30_PORT_CHANGE,
768 }}
769 pub type PUSB_PORT_CHANGE = *mut USB_PORT_CHANGE;
770 STRUCT!{#[repr(packed)] struct USB_PORT_EXT_STATUS {
771     AsUlong32: ULONG,
772 }}
773 BITFIELD!{USB_PORT_EXT_STATUS AsUlong32: ULONG [
774     RxSublinkSpeedID set_RxSublinkSpeedID[0..4],
775     TxSublinkSpeedID set_TxSublinkSpeedID[4..8],
776     RxLaneCount set_RxLaneCount[8..12],
777     TxLaneCount set_TxLaneCount[12..16],
778     Reserved set_Reserved[16..32],
779 ]}
780 pub type PUSB_PORT_EXT_STATUS = *mut USB_PORT_EXT_STATUS;
781 STRUCT!{#[repr(packed)] struct USB_PORT_STATUS_AND_CHANGE_s {
782     PortStatus: USB_PORT_STATUS,
783     PortChange: USB_PORT_CHANGE,
784 }}
785 UNION!{#[repr(packed)] union USB_PORT_STATUS_AND_CHANGE {
786     [u32; 1],
787     AsUlong32 AsUlong32_mut: ULONG,
788     s s_mut: USB_PORT_STATUS_AND_CHANGE_s,
789 }}
790 pub type PUSB_PORT_STATUS_AND_CHANGE = *mut USB_PORT_STATUS_AND_CHANGE;
791 STRUCT!{#[repr(packed)] struct USB_PORT_EXT_STATUS_AND_CHANGE_s {
792     PortStatusChange: USB_PORT_STATUS_AND_CHANGE,
793     PortExtStatus: USB_PORT_EXT_STATUS,
794 }}
795 UNION!{#[repr(packed)] union USB_PORT_EXT_STATUS_AND_CHANGE {
796     [u64; 1],
797     AsUlong64 AsUlong64_mut: ULONG64,
798     s s_mut: USB_PORT_EXT_STATUS_AND_CHANGE_s,
799 }}
800 pub type PUSB_PORT_EXT_STATUS_AND_CHANGE = *mut USB_PORT_EXT_STATUS_AND_CHANGE;
801 STRUCT!{#[repr(packed)] struct USB_HUB_30_PORT_REMOTE_WAKE_MASK {
802     AsUchar8: UCHAR,
803 }}
804 BITFIELD!{USB_HUB_30_PORT_REMOTE_WAKE_MASK AsUchar8: UCHAR [
805     ConnectRemoteWakeEnable set_ConnectRemoteWakeEnable[0..1],
806     DisconnectRemoteWakeEnable set_DisconnectRemoteWakeEnable[1..2],
807     OverCurrentRemoteWakeEnable set_OverCurrentRemoteWakeEnable[2..3],
808     Reserved0 set_Reserved0[3..8],
809 ]}
810 pub type PUSB_HUB_30_PORT_REMOTE_WAKE_MASK = *mut USB_HUB_30_PORT_REMOTE_WAKE_MASK;
811 STRUCT!{#[repr(packed)] struct USB_FUNCTION_SUSPEND_OPTIONS {
812     AsUchar: UCHAR,
813 }}
814 BITFIELD!{USB_FUNCTION_SUSPEND_OPTIONS AsUchar: UCHAR [
815     PowerState set_PowerState[0..1],
816     RemoteWakeEnabled set_RemoteWakeEnabled[1..2],
817     Reserved0 set_Reserved0[2..8],
818 ]}
819 pub type PUSB_FUNCTION_SUSPEND_OPTIONS = *mut USB_FUNCTION_SUSPEND_OPTIONS;
820 pub const USB_FEATURE_INTERFACE_POWER_D0: USHORT = 0x0002;
821 pub const USB_FEATURE_INTERFACE_POWER_D1: USHORT = 0x0003;
822 pub const USB_FEATURE_INTERFACE_POWER_D2: USHORT = 0x0004;
823 pub const USB_FEATURE_INTERFACE_POWER_D3: USHORT = 0x0005;
824 pub const USB_SUPPORT_D0_COMMAND: UCHAR = 0x01;
825 pub const USB_SUPPORT_D1_COMMAND: UCHAR = 0x02;
826 pub const USB_SUPPORT_D2_COMMAND: UCHAR = 0x04;
827 pub const USB_SUPPORT_D3_COMMAND: UCHAR = 0x08;
828 pub const USB_SUPPORT_D1_WAKEUP: UCHAR = 0x10;
829 pub const USB_SUPPORT_D2_WAKEUP: UCHAR = 0x20;
830 STRUCT!{#[repr(packed)] struct USB_CONFIGURATION_POWER_DESCRIPTOR {
831     bLength: UCHAR,
832     bDescriptorType: UCHAR,
833     SelfPowerConsumedD0: [UCHAR; 3],
834     bPowerSummaryId: UCHAR,
835     bBusPowerSavingD1: UCHAR,
836     bSelfPowerSavingD1: UCHAR,
837     bBusPowerSavingD2: UCHAR,
838     bSelfPowerSavingD2: UCHAR,
839     bBusPowerSavingD3: UCHAR,
840     bSelfPowerSavingD3: UCHAR,
841     TransitionTimeFromD1: USHORT,
842     TransitionTimeFromD2: USHORT,
843     TransitionTimeFromD3: USHORT,
844 }}
845 pub type PUSB_CONFIGURATION_POWER_DESCRIPTOR = *mut USB_CONFIGURATION_POWER_DESCRIPTOR;
846 STRUCT!{#[repr(packed)] struct USB_INTERFACE_POWER_DESCRIPTOR {
847     bLength: UCHAR,
848     bDescriptorType: UCHAR,
849     bmCapabilitiesFlags: UCHAR,
850     bBusPowerSavingD1: UCHAR,
851     bSelfPowerSavingD1: UCHAR,
852     bBusPowerSavingD2: UCHAR,
853     bSelfPowerSavingD2: UCHAR,
854     bBusPowerSavingD3: UCHAR,
855     bSelfPowerSavingD3: UCHAR,
856     TransitionTimeFromD1: USHORT,
857     TransitionTimeFromD2: USHORT,
858     TransitionTimeFromD3: USHORT,
859 }}
860 pub type PUSB_INTERFACE_POWER_DESCRIPTOR = *mut USB_INTERFACE_POWER_DESCRIPTOR;
861