10 #include <drivers/usbport/usbmport.h>
13 extern USBPORT_REGISTRATION_PACKET RegPacket
;
15 #define OHCI_HCD_ED_FLAG_CONTROL 0x00000001
16 #define OHCI_HCD_ED_FLAG_RESET_ON_HALT 0x00000008
17 #define OHCI_HCD_ED_FLAG_NOT_ACCESSED 0x00000010
19 #define OHCI_HCD_TD_FLAG_ALLOCATED 0x00000001
20 #define OHCI_HCD_TD_FLAG_PROCESSED 0x00000002
21 #define OHCI_HCD_TD_FLAG_CONTROL_STATUS 0x00000004
22 #define OHCI_HCD_TD_FLAG_DONE 0x00000008
23 #define OHCI_HCD_TD_FLAG_NOT_ACCESSED 0x00000010
25 #define OHCI_MAX_ISO_TRANSFER_SIZE 0x10000
26 #define OHCI_MAX_CONTROL_TRANSFER_SIZE 0x10000
27 #define OHCI_MAX_BULK_TRANSFER_SIZE 0x40000
28 #define OHCI_MAX_INTERRUPT_TRANSFER_SIZE 0x1000
30 #define OHCI_MAX_ISO_TD_COUNT 64
31 #define OHCI_MAX_CONTROL_TD_COUNT 38
32 #define OHCI_MAX_BULK_TD_COUNT 68
33 #define OHCI_MAX_INTERRUPT_TD_COUNT 4
35 #define OHCI_NON_DATA_CONTROL_TDS 2
37 #define OHCI_TRANSFER_FLAGS_SHORT_TRANSFER_OK 1
39 typedef struct _OHCI_TRANSFER
*POHCI_TRANSFER
;
41 typedef union DECLSPEC_ALIGN(32) _OHCI_HW_TRANSFER_DESCRIPTOR
{
43 OHCI_TRANSFER_DESCRIPTOR gTD
; // must be aligned to a 16-byte boundary
44 USB_DEFAULT_PIPE_SETUP_PACKET SetupPacket
;
48 OHCI_ISO_TRANSFER_DESCRIPTOR iTD
; // must be aligned to a 32-byte boundary
50 } OHCI_HW_TRANSFER_DESCRIPTOR
, *POHCI_HW_TRANSFER_DESCRIPTOR
;
52 C_ASSERT(sizeof(OHCI_HW_TRANSFER_DESCRIPTOR
) == 32);
53 C_ASSERT(__alignof(OHCI_HW_TRANSFER_DESCRIPTOR
) == 32);
55 typedef struct _OHCI_HCD_TD
{
57 OHCI_HW_TRANSFER_DESCRIPTOR HwTD
; // must be aligned to a 32-byte boundary
59 ULONG PhysicalAddress
;
66 } OHCI_HCD_TD
, *POHCI_HCD_TD
;
69 C_ASSERT(sizeof(OHCI_HCD_TD
) == 96);
71 C_ASSERT(sizeof(OHCI_HCD_TD
) == 64);
74 typedef struct _OHCI_HCD_ED
{
76 OHCI_ENDPOINT_DESCRIPTOR HwED
; // must be aligned to a 16-byte boundary
78 ULONG PhysicalAddress
;
86 } OHCI_HCD_ED
, *POHCI_HCD_ED
;
88 C_ASSERT(sizeof(OHCI_HCD_ED
) == 64);
90 #define OHCI_STATIC_ED_TYPE_INTERRUPT 0
91 #define OHCI_STATIC_ED_TYPE_CONTROL 1
92 #define OHCI_STATIC_ED_TYPE_BULK 2
94 typedef struct _OHCI_STATIC_ED
{
96 POHCI_ENDPOINT_DESCRIPTOR HwED
;
97 ULONG PhysicalAddress
;
104 } OHCI_STATIC_ED
, *POHCI_STATIC_ED
;
106 typedef struct _OHCI_HC_RESOURCES
{
107 OHCI_HCCA HcHCCA
; // (256 byte align)
108 OHCI_ENDPOINT_DESCRIPTOR InterrruptHeadED
[63]; // (16 byte align)
109 OHCI_ENDPOINT_DESCRIPTOR ControlHeadED
; // (16 byte align)
110 OHCI_ENDPOINT_DESCRIPTOR BulkHeadED
; // (16 byte align)
111 } OHCI_HC_RESOURCES
, *POHCI_HC_RESOURCES
;
113 /* OHCI Endpoint follows USBPORT Endpoint */
114 typedef struct _OHCI_ENDPOINT
{
116 USBPORT_ENDPOINT_PROPERTIES EndpointProperties
;
117 POHCI_STATIC_ED HeadED
;
118 POHCI_HCD_TD FirstTD
;
120 ULONG MaxTransferDescriptors
;
121 POHCI_HCD_TD HcdHeadP
;
122 POHCI_HCD_TD HcdTailP
;
124 } OHCI_ENDPOINT
, *POHCI_ENDPOINT
;
126 /* OHCI Transfer follows USBPORT Transfer */
127 typedef struct _OHCI_TRANSFER
{
130 PUSBPORT_TRANSFER_PARAMETERS TransferParameters
;
133 USBD_STATUS USBDStatus
;
134 POHCI_ENDPOINT OhciEndpoint
;
136 POHCI_HCD_TD ControlStatusTD
;
137 } OHCI_TRANSFER
, *POHCI_TRANSFER
;
139 /* OHCI Extension follows USBPORT Extension */
140 typedef struct _OHCI_EXTENSION
{
142 POHCI_OPERATIONAL_REGISTERS OperationalRegs
;
143 OHCI_REG_FRAME_INTERVAL FrameInterval
;
146 POHCI_HC_RESOURCES HcResourcesVA
;
147 POHCI_HC_RESOURCES HcResourcesPA
;
148 OHCI_STATIC_ED IntStaticED
[63];
149 OHCI_STATIC_ED ControlStaticED
;
150 OHCI_STATIC_ED BulkStaticED
;
151 } OHCI_EXTENSION
, *POHCI_EXTENSION
;
156 OHCI_RH_GetRootHubData(
157 IN PVOID ohciExtension
,
158 IN PVOID rootHubData
);
163 IN PVOID ohciExtension
,
168 OHCI_RH_GetPortStatus(
169 IN PVOID ohciExtension
,
171 IN PUSB_PORT_STATUS_AND_CHANGE PortStatus
);
175 OHCI_RH_GetHubStatus(
176 IN PVOID ohciExtension
,
177 IN PUSB_HUB_STATUS_AND_CHANGE HubStatus
);
181 OHCI_RH_SetFeaturePortReset(
182 IN PVOID ohciExtension
,
187 OHCI_RH_SetFeaturePortPower(
188 IN PVOID ohciExtension
,
193 OHCI_RH_SetFeaturePortEnable(
194 IN PVOID ohciExtension
,
199 OHCI_RH_SetFeaturePortSuspend(
200 IN PVOID ohciExtension
,
205 OHCI_RH_ClearFeaturePortEnable(
206 IN PVOID ohciExtension
,
211 OHCI_RH_ClearFeaturePortPower(
212 IN PVOID ohciExtension
,
217 OHCI_RH_ClearFeaturePortSuspend(
218 IN PVOID ohciExtension
,
223 OHCI_RH_ClearFeaturePortEnableChange(
224 IN PVOID ohciExtension
,
229 OHCI_RH_ClearFeaturePortConnectChange(
230 IN PVOID ohciExtension
,
235 OHCI_RH_ClearFeaturePortResetChange(
236 IN PVOID ohciExtension
,
241 OHCI_RH_ClearFeaturePortSuspendChange(
242 IN PVOID ohciExtension
,
247 OHCI_RH_ClearFeaturePortOvercurrentChange(
248 IN PVOID ohciExtension
,
254 IN PVOID ohciExtension
);
259 IN PVOID ohciExtension
);
261 OHCI_REG_RH_DESCRIPTORA
263 OHCI_ReadRhDescriptorA(
264 IN POHCI_EXTENSION OhciExtension
);
266 #endif /* USBOHCI_H__ */