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 /* Types of resources. For USBPORT_RESOURCES::ResourcesTypes */
25 #define USBPORT_RESOURCES_PORT 1
26 #define USBPORT_RESOURCES_INTERRUPT 2
27 #define USBPORT_RESOURCES_MEMORY 4
29 typedef struct _USBPORT_RESOURCES
{
32 ULONG InterruptVector
;
35 KAFFINITY InterruptAffinity
;
38 KINTERRUPT_MODE InterruptMode
;
45 BOOLEAN IsChirpHandled
;
48 } USBPORT_RESOURCES
, *PUSBPORT_RESOURCES
;
50 C_ASSERT(sizeof(USBPORT_RESOURCES
) == 52);
52 typedef ULONG MPSTATUS
; // Miniport status
53 typedef ULONG RHSTATUS
; // Roothub status
55 #define MP_STATUS_SUCCESS 0
56 #define MP_STATUS_FAILURE 1
57 #define MP_STATUS_NO_RESOURCES 2
58 #define MP_STATUS_NO_BANDWIDTH 3
59 #define MP_STATUS_ERROR 4
60 #define MP_STATUS_RESERVED1 5
61 #define MP_STATUS_NOT_SUPPORTED 6
62 #define MP_STATUS_HW_ERROR 7
63 #define MP_STATUS_UNSUCCESSFUL 8
65 #define RH_STATUS_SUCCESS 0
66 #define RH_STATUS_NO_CHANGES 1
67 #define RH_STATUS_UNSUCCESSFUL 2
69 typedef USB_20_PORT_CHANGE USB_PORT_STATUS_CHANGE
;
71 typedef union _USBHUB_PORT_STATUS
{
73 USB_PORT_STATUS UsbPortStatus
;
74 USB_PORT_STATUS_CHANGE UsbPortStatusChange
;
77 } USBHUB_PORT_STATUS
, *PUSBHUB_PORT_STATUS
;
79 /* Hub status & hub status change bits.
80 See USB 2.0 spec Table 11-19 and Table 11-20. */
81 #define HUB_STATUS_CHANGE_LOCAL_POWER 0x00010000
82 #define HUB_STATUS_CHANGE_OVERCURRENT 0x00020000
84 /* Additional USB Class Codes from USB.org */
85 #define USBC_DEVICE_CLASS_AUDIO_VIDEO 0x10
86 #define USBC_DEVICE_CLASS_BILLBOARD 0x11
87 #define USBC_DEVICE_CLASS_TYPE_C_BRIDGE 0x12
89 /* Miniport functions */
91 (NTAPI
*PHCI_OPEN_ENDPOINT
)(
97 (NTAPI
*PHCI_REOPEN_ENDPOINT
)(
103 (NTAPI
*PHCI_QUERY_ENDPOINT_REQUIREMENTS
)(
109 (NTAPI
*PHCI_CLOSE_ENDPOINT
)(
115 (NTAPI
*PHCI_START_CONTROLLER
)(
120 (NTAPI
*PHCI_STOP_CONTROLLER
)(
125 (NTAPI
*PHCI_SUSPEND_CONTROLLER
)(PVOID
);
128 (NTAPI
*PHCI_RESUME_CONTROLLER
)(PVOID
);
131 (NTAPI
*PHCI_INTERRUPT_SERVICE
)(PVOID
);
134 (NTAPI
*PHCI_INTERRUPT_DPC
)(
139 (NTAPI
*PHCI_SUBMIT_TRANSFER
)(
147 (NTAPI
*PHCI_SUBMIT_ISO_TRANSFER
)(
155 (NTAPI
*PHCI_ABORT_TRANSFER
)(
162 (NTAPI
*PHCI_GET_ENDPOINT_STATE
)(
167 (NTAPI
*PHCI_SET_ENDPOINT_STATE
)(
173 (NTAPI
*PHCI_POLL_ENDPOINT
)(
178 (NTAPI
*PHCI_CHECK_CONTROLLER
)(PVOID
);
181 (NTAPI
*PHCI_GET_32BIT_FRAME_NUMBER
)(PVOID
);
184 (NTAPI
*PHCI_INTERRUPT_NEXT_SOF
)(PVOID
);
187 (NTAPI
*PHCI_ENABLE_INTERRUPTS
)(PVOID
);
190 (NTAPI
*PHCI_DISABLE_INTERRUPTS
)(PVOID
);
193 (NTAPI
*PHCI_POLL_CONTROLLER
)(PVOID
);
196 (NTAPI
*PHCI_SET_ENDPOINT_DATA_TOGGLE
)(
202 (NTAPI
*PHCI_GET_ENDPOINT_STATUS
)(
207 (NTAPI
*PHCI_SET_ENDPOINT_STATUS
)(
213 (NTAPI
*PHCI_RESET_CONTROLLER
)(PVOID
);
215 /* Roothub functions */
217 (NTAPI
*PHCI_RH_GET_ROOT_HUB_DATA
)(
222 (NTAPI
*PHCI_RH_GET_STATUS
)(
227 (NTAPI
*PHCI_RH_GET_PORT_STATUS
)(
230 PUSBHUB_PORT_STATUS
);
233 (NTAPI
*PHCI_RH_GET_HUB_STATUS
)(
238 (NTAPI
*PHCI_RH_SET_FEATURE_PORT_RESET
)(
243 (NTAPI
*PHCI_RH_SET_FEATURE_PORT_POWER
)(
248 (NTAPI
*PHCI_RH_SET_FEATURE_PORT_ENABLE
)(
253 (NTAPI
*PHCI_RH_SET_FEATURE_PORT_SUSPEND
)(
258 (NTAPI
*PHCI_RH_CLEAR_FEATURE_PORT_ENABLE
)(
263 (NTAPI
*PHCI_RH_CLEAR_FEATURE_PORT_POWER
)(
268 (NTAPI
*PHCI_RH_CLEAR_FEATURE_PORT_SUSPEND
)(
273 (NTAPI
*PHCI_RH_CLEAR_FEATURE_PORT_ENABLE_CHANGE
)(
278 (NTAPI
*PHCI_RH_CLEAR_FEATURE_PORT_CONNECT_CHANGE
)(
283 (NTAPI
*PHCI_RH_CLEAR_FEATURE_PORT_RESET_CHANGE
)(
288 (NTAPI
*PHCI_RH_CLEAR_FEATURE_PORT_SUSPEND_CHANGE
)(
293 (NTAPI
*PHCI_RH_CLEAR_FEATURE_PORT_OVERCURRENT_CHANGE
)(
298 (NTAPI
*PHCI_RH_DISABLE_IRQ
)(PVOID
);
301 (NTAPI
*PHCI_RH_ENABLE_IRQ
)(PVOID
);
303 /* Miniport ioctl functions */
305 (NTAPI
*PHCI_START_SEND_ONE_PACKET
)(
316 (NTAPI
*PHCI_END_SEND_ONE_PACKET
)(
327 (NTAPI
*PHCI_PASS_THRU
)(
335 (NTAPI
*PUSBPORT_DBG_PRINT
)(
342 (NTAPI
*PUSBPORT_TEST_DEBUG_BREAK
)(PVOID
);
345 (NTAPI
*PUSBPORT_ASSERT_FAILURE
)(
353 (NTAPI
*PUSBPORT_GET_MINIPORT_REGISTRY_KEY_VALUE
)(
362 (NTAPI
*PUSBPORT_INVALIDATE_ROOT_HUB
)(PVOID
);
365 (NTAPI
*PUSBPORT_INVALIDATE_ENDPOINT
)(
370 (NTAPI
*PUSBPORT_COMPLETE_TRANSFER
)(
378 (NTAPI
*PUSBPORT_COMPLETE_ISO_TRANSFER
)(
385 (NTAPI
*PUSBPORT_LOG_ENTRY
)(
394 (NTAPI
*PUSBPORT_GET_MAPPED_VIRTUAL_ADDRESS
)(
400 (NTAPI ASYNC_TIMER_CALLBACK
)(
401 IN PVOID MiniportExtension
,
402 IN PVOID CallBackContext
);
405 (NTAPI
*PUSBPORT_REQUEST_ASYNC_CALLBACK
)(
410 ASYNC_TIMER_CALLBACK
*);
413 (NTAPI
*PUSBPORT_READ_WRITE_CONFIG_SPACE
)(
421 (NTAPI
*PUSBPORT_WAIT
)(
426 (NTAPI
*PUSBPORT_INVALIDATE_CONTROLLER
)(
431 (NTAPI
*PUSBPORT_BUG_CHECK
)(PVOID
);
434 (NTAPI
*PUSBPORT_NOTIFY_DOUBLE_BUFFER
)(
440 /* Miniport functions */
442 (NTAPI
*PHCI_REBALANCE_ENDPOINT
)(
448 (NTAPI
*PHCI_FLUSH_INTERRUPTS
)(PVOID
);
451 (NTAPI
*PHCI_RH_CHIRP_ROOT_PORT
)(
456 (NTAPI
*PHCI_TAKE_PORT_CONTROL
)(PVOID
);
458 #define USB_MINIPORT_VERSION_OHCI 0x01
459 #define USB_MINIPORT_VERSION_UHCI 0x02
460 #define USB_MINIPORT_VERSION_EHCI 0x03
462 #define USB_MINIPORT_FLAGS_INTERRUPT 0x0001
463 #define USB_MINIPORT_FLAGS_PORT_IO 0x0002
464 #define USB_MINIPORT_FLAGS_MEMORY_IO 0x0004
465 #define USB_MINIPORT_FLAGS_USB2 0x0010
466 #define USB_MINIPORT_FLAGS_DISABLE_SS 0x0020
467 #define USB_MINIPORT_FLAGS_NOT_LOCK_INT 0x0040
468 #define USB_MINIPORT_FLAGS_POLLING 0x0080
469 #define USB_MINIPORT_FLAGS_NO_DMA 0x0100
470 #define USB_MINIPORT_FLAGS_WAKE_SUPPORT 0x0200
472 typedef struct _USBPORT_REGISTRATION_PACKET
{
473 ULONG MiniPortVersion
;
475 ULONG MiniPortBusBandwidth
;
477 SIZE_T MiniPortExtensionSize
;
478 SIZE_T MiniPortEndpointSize
;
479 SIZE_T MiniPortTransferSize
;
482 SIZE_T MiniPortResourcesSize
;
485 PHCI_OPEN_ENDPOINT OpenEndpoint
;
486 PHCI_REOPEN_ENDPOINT ReopenEndpoint
;
487 PHCI_QUERY_ENDPOINT_REQUIREMENTS QueryEndpointRequirements
;
488 PHCI_CLOSE_ENDPOINT CloseEndpoint
;
489 PHCI_START_CONTROLLER StartController
;
490 PHCI_STOP_CONTROLLER StopController
;
491 PHCI_SUSPEND_CONTROLLER SuspendController
;
492 PHCI_RESUME_CONTROLLER ResumeController
;
493 PHCI_INTERRUPT_SERVICE InterruptService
;
494 PHCI_INTERRUPT_DPC InterruptDpc
;
495 PHCI_SUBMIT_TRANSFER SubmitTransfer
;
496 PHCI_SUBMIT_ISO_TRANSFER SubmitIsoTransfer
;
497 PHCI_ABORT_TRANSFER AbortTransfer
;
498 PHCI_GET_ENDPOINT_STATE GetEndpointState
;
499 PHCI_SET_ENDPOINT_STATE SetEndpointState
;
500 PHCI_POLL_ENDPOINT PollEndpoint
;
501 PHCI_CHECK_CONTROLLER CheckController
;
502 PHCI_GET_32BIT_FRAME_NUMBER Get32BitFrameNumber
;
503 PHCI_INTERRUPT_NEXT_SOF InterruptNextSOF
;
504 PHCI_ENABLE_INTERRUPTS EnableInterrupts
;
505 PHCI_DISABLE_INTERRUPTS DisableInterrupts
;
506 PHCI_POLL_CONTROLLER PollController
;
507 PHCI_SET_ENDPOINT_DATA_TOGGLE SetEndpointDataToggle
;
508 PHCI_GET_ENDPOINT_STATUS GetEndpointStatus
;
509 PHCI_SET_ENDPOINT_STATUS SetEndpointStatus
;
510 PHCI_RESET_CONTROLLER ResetController
;
513 PHCI_RH_GET_ROOT_HUB_DATA RH_GetRootHubData
;
514 PHCI_RH_GET_STATUS RH_GetStatus
;
515 PHCI_RH_GET_PORT_STATUS RH_GetPortStatus
;
516 PHCI_RH_GET_HUB_STATUS RH_GetHubStatus
;
517 PHCI_RH_SET_FEATURE_PORT_RESET RH_SetFeaturePortReset
;
518 PHCI_RH_SET_FEATURE_PORT_POWER RH_SetFeaturePortPower
;
519 PHCI_RH_SET_FEATURE_PORT_ENABLE RH_SetFeaturePortEnable
;
520 PHCI_RH_SET_FEATURE_PORT_SUSPEND RH_SetFeaturePortSuspend
;
521 PHCI_RH_CLEAR_FEATURE_PORT_ENABLE RH_ClearFeaturePortEnable
;
522 PHCI_RH_CLEAR_FEATURE_PORT_POWER RH_ClearFeaturePortPower
;
523 PHCI_RH_CLEAR_FEATURE_PORT_SUSPEND RH_ClearFeaturePortSuspend
;
524 PHCI_RH_CLEAR_FEATURE_PORT_ENABLE_CHANGE RH_ClearFeaturePortEnableChange
;
525 PHCI_RH_CLEAR_FEATURE_PORT_CONNECT_CHANGE RH_ClearFeaturePortConnectChange
;
526 PHCI_RH_CLEAR_FEATURE_PORT_RESET_CHANGE RH_ClearFeaturePortResetChange
;
527 PHCI_RH_CLEAR_FEATURE_PORT_SUSPEND_CHANGE RH_ClearFeaturePortSuspendChange
;
528 PHCI_RH_CLEAR_FEATURE_PORT_OVERCURRENT_CHANGE RH_ClearFeaturePortOvercurrentChange
;
529 PHCI_RH_DISABLE_IRQ RH_DisableIrq
;
530 PHCI_RH_ENABLE_IRQ RH_EnableIrq
;
533 PHCI_START_SEND_ONE_PACKET StartSendOnePacket
;
534 PHCI_END_SEND_ONE_PACKET EndSendOnePacket
;
535 PHCI_PASS_THRU PassThru
;
538 PUSBPORT_DBG_PRINT UsbPortDbgPrint
;
539 PUSBPORT_TEST_DEBUG_BREAK UsbPortTestDebugBreak
;
540 PUSBPORT_ASSERT_FAILURE UsbPortAssertFailure
;
541 PUSBPORT_GET_MINIPORT_REGISTRY_KEY_VALUE UsbPortGetMiniportRegistryKeyValue
;
542 PUSBPORT_INVALIDATE_ROOT_HUB UsbPortInvalidateRootHub
;
543 PUSBPORT_INVALIDATE_ENDPOINT UsbPortInvalidateEndpoint
;
544 PUSBPORT_COMPLETE_TRANSFER UsbPortCompleteTransfer
;
545 PUSBPORT_COMPLETE_ISO_TRANSFER UsbPortCompleteIsoTransfer
;
546 PUSBPORT_LOG_ENTRY UsbPortLogEntry
;
547 PUSBPORT_GET_MAPPED_VIRTUAL_ADDRESS UsbPortGetMappedVirtualAddress
;
548 PUSBPORT_REQUEST_ASYNC_CALLBACK UsbPortRequestAsyncCallback
;
549 PUSBPORT_READ_WRITE_CONFIG_SPACE UsbPortReadWriteConfigSpace
;
550 PUSBPORT_WAIT UsbPortWait
;
551 PUSBPORT_INVALIDATE_CONTROLLER UsbPortInvalidateController
;
552 PUSBPORT_BUG_CHECK UsbPortBugCheck
;
553 PUSBPORT_NOTIFY_DOUBLE_BUFFER UsbPortNotifyDoubleBuffer
;
556 PHCI_REBALANCE_ENDPOINT RebalanceEndpoint
;
557 PHCI_FLUSH_INTERRUPTS FlushInterrupts
;
558 PHCI_RH_CHIRP_ROOT_PORT RH_ChirpRootPort
;
559 PHCI_TAKE_PORT_CONTROL TakePortControl
;
562 } USBPORT_REGISTRATION_PACKET
, *PUSBPORT_REGISTRATION_PACKET
;
564 typedef struct _USBPORT_MINIPORT_INTERFACE
{
565 PDRIVER_OBJECT DriverObject
;
566 LIST_ENTRY DriverLink
;
567 PDRIVER_UNLOAD DriverUnload
;
569 USBPORT_REGISTRATION_PACKET Packet
;
570 } USBPORT_MINIPORT_INTERFACE
, *PUSBPORT_MINIPORT_INTERFACE
;
572 C_ASSERT(sizeof(USBPORT_MINIPORT_INTERFACE
) == 336);
574 typedef struct _USBPORT_ENDPOINT_PROPERTIES
{
575 USHORT DeviceAddress
;
576 USHORT EndpointAddress
;
577 USHORT TotalMaxPacketSize
; // TransactionPerMicroframe * MaxPacketSize
580 USB_DEVICE_SPEED DeviceSpeed
;
582 ULONG ScheduleOffset
;
589 ULONG MaxTransferSize
;
592 UCHAR InterruptScheduleMask
;
593 UCHAR SplitCompletionMask
;
594 UCHAR TransactionPerMicroframe
; // 1 + additional transactions. Total: from 1 to 3)
598 } USBPORT_ENDPOINT_PROPERTIES
, *PUSBPORT_ENDPOINT_PROPERTIES
;
600 C_ASSERT(sizeof(USBPORT_ENDPOINT_PROPERTIES
) == 64);
602 typedef struct _USBPORT_SCATTER_GATHER_ELEMENT
{
603 PHYSICAL_ADDRESS SgPhysicalAddress
;
605 ULONG SgTransferLength
;
608 } USBPORT_SCATTER_GATHER_ELEMENT
, *PUSBPORT_SCATTER_GATHER_ELEMENT
;
610 C_ASSERT(sizeof(USBPORT_SCATTER_GATHER_ELEMENT
) == 24);
612 typedef struct _USBPORT_SCATTER_GATHER_LIST
{
615 PVOID MappedSystemVa
;
616 ULONG SgElementCount
;
617 USBPORT_SCATTER_GATHER_ELEMENT SgElement
[1];
618 } USBPORT_SCATTER_GATHER_LIST
, *PUSBPORT_SCATTER_GATHER_LIST
;
620 C_ASSERT(sizeof(USBPORT_SCATTER_GATHER_LIST
) == 40);
622 typedef struct _USBPORT_TRANSFER_PARAMETERS
{
624 ULONG TransferBufferLength
;
625 ULONG TransferCounter
;
628 USB_DEFAULT_PIPE_SETUP_PACKET SetupPacket
;
629 } USBPORT_TRANSFER_PARAMETERS
, *PUSBPORT_TRANSFER_PARAMETERS
;
631 C_ASSERT(sizeof(USBPORT_TRANSFER_PARAMETERS
) == 28);
633 typedef struct _USBPORT_ROOT_HUB_DATA
{
635 ULONG HubCharacteristics
;
636 ULONG PowerOnToPowerGood
;
637 ULONG HubControlCurrent
;
638 } USBPORT_ROOT_HUB_DATA
, *PUSBPORT_ROOT_HUB_DATA
;
640 C_ASSERT(sizeof(USBPORT_ROOT_HUB_DATA
) == 16);
644 USBPORT_GetHciMn(VOID
);
648 USBPORT_RegisterUSBPortDriver(
649 IN PDRIVER_OBJECT DriverObject
,
651 IN PUSBPORT_REGISTRATION_PACKET RegistrationPacket
);
653 #endif /* USBMPORT_H__ */