4 #define USBPORT_HCI_MN 0x10000001
7 #define USBPORT_TRANSFER_TYPE_ISOCHRONOUS 0
8 #define USBPORT_TRANSFER_TYPE_CONTROL 1
9 #define USBPORT_TRANSFER_TYPE_BULK 2
10 #define USBPORT_TRANSFER_TYPE_INTERRUPT 3
13 #define USBPORT_ENDPOINT_UNKNOWN 0
14 #define USBPORT_ENDPOINT_PAUSED 2
15 #define USBPORT_ENDPOINT_ACTIVE 3
16 #define USBPORT_ENDPOINT_REMOVE 4
17 #define USBPORT_ENDPOINT_CLOSED 5
20 #define USBPORT_ENDPOINT_RUN 0
21 #define USBPORT_ENDPOINT_HALT 1
22 #define USBPORT_ENDPOINT_CONTROL 4
24 /* Interrupt Endpoint Poll Interval */
25 #define ENDPOINT_INTERRUPT_1ms 1
26 #define ENDPOINT_INTERRUPT_2ms 2
27 #define ENDPOINT_INTERRUPT_4ms 4
28 #define ENDPOINT_INTERRUPT_8ms 8
29 #define ENDPOINT_INTERRUPT_16ms 16
30 #define ENDPOINT_INTERRUPT_32ms 32
32 #define INTERRUPT_ENDPOINTs (ENDPOINT_INTERRUPT_32ms + \
33 ENDPOINT_INTERRUPT_16ms + \
34 ENDPOINT_INTERRUPT_8ms + \
35 ENDPOINT_INTERRUPT_4ms + \
36 ENDPOINT_INTERRUPT_2ms + \
37 ENDPOINT_INTERRUPT_1ms)
39 /* Types of resources. For USBPORT_RESOURCES::ResourcesTypes */
40 #define USBPORT_RESOURCES_PORT 1
41 #define USBPORT_RESOURCES_INTERRUPT 2
42 #define USBPORT_RESOURCES_MEMORY 4
44 typedef struct _USBPORT_RESOURCES
{
46 USB_CONTROLLER_FLAVOR HcFlavor
;
47 ULONG InterruptVector
;
50 KAFFINITY InterruptAffinity
;
53 KINTERRUPT_MODE InterruptMode
;
60 BOOLEAN IsChirpHandled
;
63 } USBPORT_RESOURCES
, *PUSBPORT_RESOURCES
;
65 C_ASSERT(sizeof(USBPORT_RESOURCES
) == 32 + 5 * sizeof(PVOID
));
67 typedef struct _USBPORT_ENDPOINT_PROPERTIES
{
69 USHORT EndpointAddress
;
70 USHORT TotalMaxPacketSize
; // TransactionPerMicroframe * MaxPacketSize
73 USB_DEVICE_SPEED DeviceSpeed
;
82 ULONG MaxTransferSize
;
85 UCHAR InterruptScheduleMask
;
86 UCHAR SplitCompletionMask
;
87 UCHAR TransactionPerMicroframe
; // 1 + additional transactions. Total: from 1 to 3)
91 } USBPORT_ENDPOINT_PROPERTIES
, *PUSBPORT_ENDPOINT_PROPERTIES
;
93 C_ASSERT(sizeof(USBPORT_ENDPOINT_PROPERTIES
) == 56 + 2 * sizeof(PVOID
));
95 typedef struct _USBPORT_TRANSFER_PARAMETERS
{
97 ULONG TransferBufferLength
;
98 ULONG TransferCounter
;
99 BOOL IsTransferSplited
;
101 USB_DEFAULT_PIPE_SETUP_PACKET SetupPacket
;
102 } USBPORT_TRANSFER_PARAMETERS
, *PUSBPORT_TRANSFER_PARAMETERS
;
104 C_ASSERT(sizeof(USBPORT_TRANSFER_PARAMETERS
) == 28);
106 typedef struct _USBPORT_SCATTER_GATHER_ELEMENT
{
107 PHYSICAL_ADDRESS SgPhysicalAddress
;
109 ULONG SgTransferLength
;
112 } USBPORT_SCATTER_GATHER_ELEMENT
, *PUSBPORT_SCATTER_GATHER_ELEMENT
;
114 C_ASSERT(sizeof(USBPORT_SCATTER_GATHER_ELEMENT
) == 24);
116 typedef struct _USBPORT_SCATTER_GATHER_LIST
{
119 PVOID MappedSystemVa
;
120 ULONG SgElementCount
;
121 USBPORT_SCATTER_GATHER_ELEMENT SgElement
[2];
122 } USBPORT_SCATTER_GATHER_LIST
, *PUSBPORT_SCATTER_GATHER_LIST
;
124 C_ASSERT(sizeof(USBPORT_SCATTER_GATHER_LIST
) == 48 + 4 * sizeof(PVOID
));
126 typedef struct _USBPORT_ENDPOINT_REQUIREMENTS
{
127 ULONG HeaderBufferSize
;
128 ULONG MaxTransferSize
;
129 } USBPORT_ENDPOINT_REQUIREMENTS
, *PUSBPORT_ENDPOINT_REQUIREMENTS
;
131 typedef ULONG MPSTATUS
; // Miniport status
132 typedef ULONG RHSTATUS
; // Roothub status
134 #define MP_STATUS_SUCCESS 0
135 #define MP_STATUS_FAILURE 1
136 #define MP_STATUS_NO_RESOURCES 2
137 #define MP_STATUS_NO_BANDWIDTH 3
138 #define MP_STATUS_ERROR 4
139 #define MP_STATUS_RESERVED1 5
140 #define MP_STATUS_NOT_SUPPORTED 6
141 #define MP_STATUS_HW_ERROR 7
142 #define MP_STATUS_UNSUCCESSFUL 8
144 #define RH_STATUS_SUCCESS 0
145 #define RH_STATUS_NO_CHANGES 1
146 #define RH_STATUS_UNSUCCESSFUL 2
148 /* Additional USB Class Codes from USB.org */
149 #define USBC_DEVICE_CLASS_TYPE_C_BRIDGE 0x12
151 /* Miniport functions */
153 (NTAPI
*PHCI_OPEN_ENDPOINT
)(
155 PUSBPORT_ENDPOINT_PROPERTIES
,
159 (NTAPI
*PHCI_REOPEN_ENDPOINT
)(
161 PUSBPORT_ENDPOINT_PROPERTIES
,
165 (NTAPI
*PHCI_QUERY_ENDPOINT_REQUIREMENTS
)(
167 PUSBPORT_ENDPOINT_PROPERTIES
,
168 PUSBPORT_ENDPOINT_REQUIREMENTS
);
171 (NTAPI
*PHCI_CLOSE_ENDPOINT
)(
177 (NTAPI
*PHCI_START_CONTROLLER
)(
182 (NTAPI
*PHCI_STOP_CONTROLLER
)(
187 (NTAPI
*PHCI_SUSPEND_CONTROLLER
)(PVOID
);
190 (NTAPI
*PHCI_RESUME_CONTROLLER
)(PVOID
);
193 (NTAPI
*PHCI_INTERRUPT_SERVICE
)(PVOID
);
196 (NTAPI
*PHCI_INTERRUPT_DPC
)(
201 (NTAPI
*PHCI_SUBMIT_TRANSFER
)(
204 PUSBPORT_TRANSFER_PARAMETERS
,
206 PUSBPORT_SCATTER_GATHER_LIST
);
209 (NTAPI
*PHCI_SUBMIT_ISO_TRANSFER
)(
212 PUSBPORT_TRANSFER_PARAMETERS
,
217 (NTAPI
*PHCI_ABORT_TRANSFER
)(
224 (NTAPI
*PHCI_GET_ENDPOINT_STATE
)(
229 (NTAPI
*PHCI_SET_ENDPOINT_STATE
)(
235 (NTAPI
*PHCI_POLL_ENDPOINT
)(
240 (NTAPI
*PHCI_CHECK_CONTROLLER
)(PVOID
);
243 (NTAPI
*PHCI_GET_32BIT_FRAME_NUMBER
)(PVOID
);
246 (NTAPI
*PHCI_INTERRUPT_NEXT_SOF
)(PVOID
);
249 (NTAPI
*PHCI_ENABLE_INTERRUPTS
)(PVOID
);
252 (NTAPI
*PHCI_DISABLE_INTERRUPTS
)(PVOID
);
255 (NTAPI
*PHCI_POLL_CONTROLLER
)(PVOID
);
258 (NTAPI
*PHCI_SET_ENDPOINT_DATA_TOGGLE
)(
264 (NTAPI
*PHCI_GET_ENDPOINT_STATUS
)(
269 (NTAPI
*PHCI_SET_ENDPOINT_STATUS
)(
275 (NTAPI
*PHCI_RESET_CONTROLLER
)(PVOID
);
277 /* Roothub functions */
279 (NTAPI
*PHCI_RH_GET_ROOT_HUB_DATA
)(
284 (NTAPI
*PHCI_RH_GET_STATUS
)(
288 #define USB20_PORT_STATUS_RESERVED1_OWNED_BY_COMPANION (1 << 2)
291 (NTAPI
*PHCI_RH_GET_PORT_STATUS
)(
294 PUSB_PORT_STATUS_AND_CHANGE
);
297 (NTAPI
*PHCI_RH_GET_HUB_STATUS
)(
299 PUSB_HUB_STATUS_AND_CHANGE
);
302 (NTAPI
*PHCI_RH_SET_FEATURE_PORT_RESET
)(
307 (NTAPI
*PHCI_RH_SET_FEATURE_PORT_POWER
)(
312 (NTAPI
*PHCI_RH_SET_FEATURE_PORT_ENABLE
)(
317 (NTAPI
*PHCI_RH_SET_FEATURE_PORT_SUSPEND
)(
322 (NTAPI
*PHCI_RH_CLEAR_FEATURE_PORT_ENABLE
)(
327 (NTAPI
*PHCI_RH_CLEAR_FEATURE_PORT_POWER
)(
332 (NTAPI
*PHCI_RH_CLEAR_FEATURE_PORT_SUSPEND
)(
337 (NTAPI
*PHCI_RH_CLEAR_FEATURE_PORT_ENABLE_CHANGE
)(
342 (NTAPI
*PHCI_RH_CLEAR_FEATURE_PORT_CONNECT_CHANGE
)(
347 (NTAPI
*PHCI_RH_CLEAR_FEATURE_PORT_RESET_CHANGE
)(
352 (NTAPI
*PHCI_RH_CLEAR_FEATURE_PORT_SUSPEND_CHANGE
)(
357 (NTAPI
*PHCI_RH_CLEAR_FEATURE_PORT_OVERCURRENT_CHANGE
)(
362 (NTAPI
*PHCI_RH_DISABLE_IRQ
)(PVOID
);
365 (NTAPI
*PHCI_RH_ENABLE_IRQ
)(PVOID
);
367 /* Miniport ioctl functions */
369 (NTAPI
*PHCI_START_SEND_ONE_PACKET
)(
380 (NTAPI
*PHCI_END_SEND_ONE_PACKET
)(
391 (NTAPI
*PHCI_PASS_THRU
)(
399 (*PUSBPORT_DBG_PRINT
)(
406 (NTAPI
*PUSBPORT_TEST_DEBUG_BREAK
)(PVOID
);
409 (NTAPI
*PUSBPORT_ASSERT_FAILURE
)(
417 (NTAPI
*PUSBPORT_GET_MINIPORT_REGISTRY_KEY_VALUE
)(
426 (NTAPI
*PUSBPORT_INVALIDATE_ROOT_HUB
)(PVOID
);
429 (NTAPI
*PUSBPORT_INVALIDATE_ENDPOINT
)(
434 (NTAPI
*PUSBPORT_COMPLETE_TRANSFER
)(
442 (NTAPI
*PUSBPORT_COMPLETE_ISO_TRANSFER
)(
449 (NTAPI
*PUSBPORT_LOG_ENTRY
)(
458 (NTAPI
*PUSBPORT_GET_MAPPED_VIRTUAL_ADDRESS
)(
464 (NTAPI ASYNC_TIMER_CALLBACK
)(
465 IN PVOID MiniportExtension
,
466 IN PVOID CallBackContext
);
469 (NTAPI
*PUSBPORT_REQUEST_ASYNC_CALLBACK
)(
474 ASYNC_TIMER_CALLBACK
*);
477 (NTAPI
*PUSBPORT_READ_WRITE_CONFIG_SPACE
)(
485 (NTAPI
*PUSBPORT_WAIT
)(
489 #define USBPORT_INVALIDATE_CONTROLLER_RESET 1
490 #define USBPORT_INVALIDATE_CONTROLLER_SURPRISE_REMOVE 2
491 #define USBPORT_INVALIDATE_CONTROLLER_SOFT_INTERRUPT 3
494 (NTAPI
*PUSBPORT_INVALIDATE_CONTROLLER
)(
499 (NTAPI
*PUSBPORT_BUG_CHECK
)(PVOID
);
502 (NTAPI
*PUSBPORT_NOTIFY_DOUBLE_BUFFER
)(
508 /* Miniport functions */
510 (NTAPI
*PHCI_REBALANCE_ENDPOINT
)(
512 PUSBPORT_ENDPOINT_PROPERTIES
,
516 (NTAPI
*PHCI_FLUSH_INTERRUPTS
)(PVOID
);
519 (NTAPI
*PHCI_RH_CHIRP_ROOT_PORT
)(
524 (NTAPI
*PHCI_TAKE_PORT_CONTROL
)(PVOID
);
526 #define USB_MINIPORT_VERSION_OHCI 0x01
527 #define USB_MINIPORT_VERSION_UHCI 0x02
528 #define USB_MINIPORT_VERSION_EHCI 0x03
529 #define USB_MINIPORT_VERSION_XHCI 0x04
531 #define USB_MINIPORT_FLAGS_INTERRUPT 0x0001
532 #define USB_MINIPORT_FLAGS_PORT_IO 0x0002
533 #define USB_MINIPORT_FLAGS_MEMORY_IO 0x0004
534 #define USB_MINIPORT_FLAGS_USB2 0x0010
535 #define USB_MINIPORT_FLAGS_DISABLE_SS 0x0020
536 #define USB_MINIPORT_FLAGS_NOT_LOCK_INT 0x0040
537 #define USB_MINIPORT_FLAGS_POLLING 0x0080
538 #define USB_MINIPORT_FLAGS_NO_DMA 0x0100
539 #define USB_MINIPORT_FLAGS_WAKE_SUPPORT 0x0200
541 #define TOTAL_USB11_BUS_BANDWIDTH 12000
542 #define TOTAL_USB20_BUS_BANDWIDTH 400000
544 typedef struct _USBPORT_REGISTRATION_PACKET
{
545 ULONG MiniPortVersion
;
547 ULONG MiniPortBusBandwidth
;
549 SIZE_T MiniPortExtensionSize
;
550 SIZE_T MiniPortEndpointSize
;
551 SIZE_T MiniPortTransferSize
;
554 SIZE_T MiniPortResourcesSize
;
557 PHCI_OPEN_ENDPOINT OpenEndpoint
;
558 PHCI_REOPEN_ENDPOINT ReopenEndpoint
;
559 PHCI_QUERY_ENDPOINT_REQUIREMENTS QueryEndpointRequirements
;
560 PHCI_CLOSE_ENDPOINT CloseEndpoint
;
561 PHCI_START_CONTROLLER StartController
;
562 PHCI_STOP_CONTROLLER StopController
;
563 PHCI_SUSPEND_CONTROLLER SuspendController
;
564 PHCI_RESUME_CONTROLLER ResumeController
;
565 PHCI_INTERRUPT_SERVICE InterruptService
;
566 PHCI_INTERRUPT_DPC InterruptDpc
;
567 PHCI_SUBMIT_TRANSFER SubmitTransfer
;
568 PHCI_SUBMIT_ISO_TRANSFER SubmitIsoTransfer
;
569 PHCI_ABORT_TRANSFER AbortTransfer
;
570 PHCI_GET_ENDPOINT_STATE GetEndpointState
;
571 PHCI_SET_ENDPOINT_STATE SetEndpointState
;
572 PHCI_POLL_ENDPOINT PollEndpoint
;
573 PHCI_CHECK_CONTROLLER CheckController
;
574 PHCI_GET_32BIT_FRAME_NUMBER Get32BitFrameNumber
;
575 PHCI_INTERRUPT_NEXT_SOF InterruptNextSOF
;
576 PHCI_ENABLE_INTERRUPTS EnableInterrupts
;
577 PHCI_DISABLE_INTERRUPTS DisableInterrupts
;
578 PHCI_POLL_CONTROLLER PollController
;
579 PHCI_SET_ENDPOINT_DATA_TOGGLE SetEndpointDataToggle
;
580 PHCI_GET_ENDPOINT_STATUS GetEndpointStatus
;
581 PHCI_SET_ENDPOINT_STATUS SetEndpointStatus
;
582 PHCI_RESET_CONTROLLER ResetController
;
585 PHCI_RH_GET_ROOT_HUB_DATA RH_GetRootHubData
;
586 PHCI_RH_GET_STATUS RH_GetStatus
;
587 PHCI_RH_GET_PORT_STATUS RH_GetPortStatus
;
588 PHCI_RH_GET_HUB_STATUS RH_GetHubStatus
;
589 PHCI_RH_SET_FEATURE_PORT_RESET RH_SetFeaturePortReset
;
590 PHCI_RH_SET_FEATURE_PORT_POWER RH_SetFeaturePortPower
;
591 PHCI_RH_SET_FEATURE_PORT_ENABLE RH_SetFeaturePortEnable
;
592 PHCI_RH_SET_FEATURE_PORT_SUSPEND RH_SetFeaturePortSuspend
;
593 PHCI_RH_CLEAR_FEATURE_PORT_ENABLE RH_ClearFeaturePortEnable
;
594 PHCI_RH_CLEAR_FEATURE_PORT_POWER RH_ClearFeaturePortPower
;
595 PHCI_RH_CLEAR_FEATURE_PORT_SUSPEND RH_ClearFeaturePortSuspend
;
596 PHCI_RH_CLEAR_FEATURE_PORT_ENABLE_CHANGE RH_ClearFeaturePortEnableChange
;
597 PHCI_RH_CLEAR_FEATURE_PORT_CONNECT_CHANGE RH_ClearFeaturePortConnectChange
;
598 PHCI_RH_CLEAR_FEATURE_PORT_RESET_CHANGE RH_ClearFeaturePortResetChange
;
599 PHCI_RH_CLEAR_FEATURE_PORT_SUSPEND_CHANGE RH_ClearFeaturePortSuspendChange
;
600 PHCI_RH_CLEAR_FEATURE_PORT_OVERCURRENT_CHANGE RH_ClearFeaturePortOvercurrentChange
;
601 PHCI_RH_DISABLE_IRQ RH_DisableIrq
;
602 PHCI_RH_ENABLE_IRQ RH_EnableIrq
;
605 PHCI_START_SEND_ONE_PACKET StartSendOnePacket
;
606 PHCI_END_SEND_ONE_PACKET EndSendOnePacket
;
607 PHCI_PASS_THRU PassThru
;
610 PUSBPORT_DBG_PRINT UsbPortDbgPrint
;
611 PUSBPORT_TEST_DEBUG_BREAK UsbPortTestDebugBreak
;
612 PUSBPORT_ASSERT_FAILURE UsbPortAssertFailure
;
613 PUSBPORT_GET_MINIPORT_REGISTRY_KEY_VALUE UsbPortGetMiniportRegistryKeyValue
;
614 PUSBPORT_INVALIDATE_ROOT_HUB UsbPortInvalidateRootHub
;
615 PUSBPORT_INVALIDATE_ENDPOINT UsbPortInvalidateEndpoint
;
616 PUSBPORT_COMPLETE_TRANSFER UsbPortCompleteTransfer
;
617 PUSBPORT_COMPLETE_ISO_TRANSFER UsbPortCompleteIsoTransfer
;
618 PUSBPORT_LOG_ENTRY UsbPortLogEntry
;
619 PUSBPORT_GET_MAPPED_VIRTUAL_ADDRESS UsbPortGetMappedVirtualAddress
;
620 PUSBPORT_REQUEST_ASYNC_CALLBACK UsbPortRequestAsyncCallback
;
621 PUSBPORT_READ_WRITE_CONFIG_SPACE UsbPortReadWriteConfigSpace
;
622 PUSBPORT_WAIT UsbPortWait
;
623 PUSBPORT_INVALIDATE_CONTROLLER UsbPortInvalidateController
;
624 PUSBPORT_BUG_CHECK UsbPortBugCheck
;
625 PUSBPORT_NOTIFY_DOUBLE_BUFFER UsbPortNotifyDoubleBuffer
;
628 PHCI_REBALANCE_ENDPOINT RebalanceEndpoint
;
629 PHCI_FLUSH_INTERRUPTS FlushInterrupts
;
630 PHCI_RH_CHIRP_ROOT_PORT RH_ChirpRootPort
;
631 PHCI_TAKE_PORT_CONTROL TakePortControl
;
634 } USBPORT_REGISTRATION_PACKET
, *PUSBPORT_REGISTRATION_PACKET
;
636 #define USB10_MINIPORT_INTERFACE_VERSION 100
637 #define USB20_MINIPORT_INTERFACE_VERSION 200
639 typedef struct _USBPORT_MINIPORT_INTERFACE
{
640 PDRIVER_OBJECT DriverObject
;
641 LIST_ENTRY DriverLink
;
642 PDRIVER_UNLOAD DriverUnload
;
644 USBPORT_REGISTRATION_PACKET Packet
;
645 } USBPORT_MINIPORT_INTERFACE
, *PUSBPORT_MINIPORT_INTERFACE
;
647 C_ASSERT(sizeof(USBPORT_MINIPORT_INTERFACE
) == 32 + 76 * sizeof(PVOID
));
649 #define USBPORT_TRANSFER_DIRECTION_OUT 1 // From host to device
650 #define USBPORT_MAX_DEVICE_ADDRESS 127
652 /* For USB1.1 or USB3 Hub Descriptors */
653 typedef union _USBPORT_HUB_11_CHARACTERISTICS
{
655 USHORT PowerControlMode
:1;
656 USHORT NoPowerSwitching
:1; // Reserved. Used only on 1.0 compliant hubs that implement no power switching.
657 USHORT PartOfCompoundDevice
:1;
658 USHORT OverCurrentProtectionMode
:1;
659 USHORT NoOverCurrentProtection
:1;
660 USHORT Reserved1
:11;
663 } USBPORT_HUB_11_CHARACTERISTICS
;
665 C_ASSERT(sizeof(USBPORT_HUB_11_CHARACTERISTICS
) == sizeof(USHORT
));
667 /* For USB2.0 Hub Descriptors */
668 typedef union _USBPORT_HUB_20_CHARACTERISTICS
{
670 USHORT PowerControlMode
:1;
671 USHORT NoPowerSwitching
:1; // Reserved. Used only on 1.0 compliant hubs that implement no power switching.
672 USHORT PartOfCompoundDevice
:1;
673 USHORT OverCurrentProtectionMode
:1;
674 USHORT NoOverCurrentProtection
:1;
675 USHORT TtThinkTime
:2;
676 USHORT PortIndicatorsSupported
:1;
680 } USBPORT_HUB_20_CHARACTERISTICS
;
682 C_ASSERT(sizeof(USBPORT_HUB_20_CHARACTERISTICS
) == sizeof(USHORT
));
684 typedef USBPORT_HUB_11_CHARACTERISTICS USBPORT_HUB_30_CHARACTERISTICS
;
686 typedef union _USBPORT_HUB_CHARACTERISTICS
{
688 USBPORT_HUB_11_CHARACTERISTICS Usb11HubCharacteristics
;
689 USBPORT_HUB_20_CHARACTERISTICS Usb20HubCharacteristics
;
690 USBPORT_HUB_30_CHARACTERISTICS Usb30HubCharacteristics
;
691 } USBPORT_HUB_CHARACTERISTICS
;
693 C_ASSERT(sizeof(USBPORT_HUB_CHARACTERISTICS
) == sizeof(USHORT
));
695 typedef struct _USBPORT_ROOT_HUB_DATA
{
697 USBPORT_HUB_CHARACTERISTICS HubCharacteristics
;
699 ULONG PowerOnToPowerGood
;
700 ULONG HubControlCurrent
;
701 } USBPORT_ROOT_HUB_DATA
, *PUSBPORT_ROOT_HUB_DATA
;
703 C_ASSERT(sizeof(USBPORT_ROOT_HUB_DATA
) == 16);
707 USBPORT_GetHciMn(VOID
);
711 USBPORT_RegisterUSBPortDriver(
712 IN PDRIVER_OBJECT DriverObject
,
714 IN PUSBPORT_REGISTRATION_PACKET RegistrationPacket
);
716 #endif /* USBMPORT_H__ */