1 /** @file 2 3 Copyright (c) 2017, Linaro Limited. All rights reserved. 4 5 This program and the accompanying materials 6 are licensed and made available under the terms and conditions of the BSD License 7 which accompanies this distribution. The full text of the license may be found at 8 http://opensource.org/licenses/bsd-license.php 9 10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12 13 **/ 14 15 #ifndef __DW_USB3_DXE_H__ 16 #define __DW_USB3_DXE_H__ 17 18 #define DW_USB3_BASE FixedPcdGet32 (PcdDwUsb3DxeBaseAddress) 19 20 #define GSBUCFG0 (DW_USB3_BASE + 0xC100) 21 #define GCTL (DW_USB3_BASE + 0xC110) 22 23 #define GCTL_PWRDNSCALE_MASK (0x1FFF << 19) 24 #define GCTL_PWRDNSCALE(x) (((x) & 0x1FFF) << 19) 25 #define GCTL_U2RSTECN BIT16 26 #define GCTL_PRTCAPDIR_MASK (BIT13 | BIT12) 27 #define GCTL_PRTCAPDIR_HOST BIT12 28 #define GCTL_PRTCAPDIR_DEVICE BIT13 29 #define GCTL_PRTCAPDIR_OTG (BIT13 | BIT12) 30 #define GCTL_U2EXIT_LFPS BIT2 31 32 #define GUSB2PHYCFG(x) (DW_USB3_BASE + 0xC200 + (((x) & 0xF) << 2)) 33 34 #define GUSB2PHYCFG_USBTRDTIM_MASK (0xF << 10) 35 #define GUSB2PHYCFG_USBTRDTIM(x) (((x) & 0xF) << 10) 36 #define GUSB2PHYCFG_SUSPHY BIT6 37 38 #define GUSB3PIPECTL(x) (DW_USB3_BASE + 0xC2C0 + (((x) & 0x3) << 2)) 39 40 #define PIPECTL_DELAYP1TRANS BIT18 41 #define PIPECTL_SUSPEND_EN BIT17 42 #define PIPECTL_LFPS_FILTER BIT9 43 #define PIPECTL_TX_DEMPH_MASK (0x3 << 1) 44 #define PIPECTL_TX_DEMPH(x) (((x) & 0x3) << 1) 45 46 #define GTXFIFOSIZ(x) (DW_USB3_BASE + 0xC300 + (((x) & 0x1F) << 2)) 47 #define GRXFIFOSIZ(x) (DW_USB3_BASE + 0xC380 + (((x) & 0x1F) << 2)) 48 49 #define FIFOSIZ_ADDR(x) (((x) & 0xFFFF) << 16) 50 #define FIFOSIZ_DEP(x) ((x) & 0xFFFF) 51 52 #define GEVNTADRL(x) (DW_USB3_BASE + 0xC400 + (((x) & 0x1F) << 2)) 53 #define GEVNTADRH(x) (DW_USB3_BASE + 0xC404 + (((x) & 0x1F) << 2)) 54 #define GEVNTSIZ(x) (DW_USB3_BASE + 0xC408 + (((x) & 0x1F) << 2)) 55 56 #define GEVNTSIZ_EVNTINTMASK BIT31 57 #define GEVNTSIZ_EVNTSIZ_MASK (0xFFFF) 58 #define GEVNTSIZ_EVNTSIZ(x) ((x) & 0xFFFF) 59 60 #define GEVNTCOUNT(x) (DW_USB3_BASE + 0xC40C + (((x) & 0x1F) << 2)) 61 #define GEVNTCOUNT_EVNTCOUNT_MASK (0xFFFF) 62 #define GEVNTCOUNT_EVNTCOUNT(x) ((x) & 0xFFFF) 63 64 // Non-Endpoint specific event flag 65 #define GEVNT_INTTYPE_MASK (0x7F << 1) 66 #define GEVNT_INTTYPE(x) (((x) & 0x7F) << 1) 67 #define EVENT_I2C_INT 4 68 #define EVENT_CARKIT_INT 3 69 #define EVENT_OTG_INT 1 70 #define EVENT_DEV_INT 0 71 72 #define GEVNT_NON_EP BIT0 73 // Endpoint specific event flag 74 #define GEVNT_DEPEVT_INTTYPE_MASK (0xF << 6) 75 #define GEVNT_DEPEVT_INTTYPE(x) (((x) & 0xF) << 6) 76 #define GEVNT_DEPEVT_INTTYPE_EPCMD_CMPL (7 << 6) 77 #define GEVNT_DEPEVT_INTTYPE_STRM_EVT (6 << 6) 78 #define GEVNT_DEPEVT_INTTYPE_FIFOXRUN (4 << 6) 79 #define GEVNT_DEPEVT_INTTYPE_XFER_NRDY (3 << 6) 80 #define GEVNT_DEPEVT_INTTYPE_XFER_IN_PROG (2 << 6) 81 #define GEVNT_DEPEVT_INTTYPE_XFER_CMPL (1 << 6) 82 #define GEVNT_DEPEVT_EPNUM_MASK (0x1F << 1) 83 #define GEVNT_DEPEVT_EPNUM_SHIFT 1 84 #define GEVNT_DEPEVT_EPNUM(x) (((x) & 0x1F) << 1) 85 // Devices specific event flag 86 #define GEVNT_DEVT_MASK (0xF << 8) 87 #define GEVNT_DEVT_SHIFT 8 88 #define GEVNT_DEVT(x) (((x) & 0xF) << 8) 89 #define GEVNT_DEVT_INACT_TIMEOUT_RCVD (0x15 << 8) 90 #define GEVNT_DEVT_VNDR_DEV_TST_RCVD (0x14 << 8) 91 #define GEVNT_DEVT_OVERFLOW (0x13 << 8) 92 #define GEVNT_DEVT_CMD_CMPL (0x12 << 8) 93 #define GEVNT_DEVT_ERRATICERR (0x11 << 8) 94 #define GEVNT_DEVT_SOF (0x7 << 8) 95 #define GEVNT_DEVT_EOPF (0x6 << 8) 96 #define GEVNT_DEVT_HIBER_REQ (0x5 << 8) 97 #define GEVNT_DEVT_WKUP (0x4 << 8) 98 #define GEVNT_DEVT_ULST_CHNG (0x3 << 8) 99 #define GEVNT_DEVT_CONNDONE (0x2 << 8) 100 #define GEVNT_DEVT_USBRESET (0x1 << 8) 101 #define GEVNT_DEVT_DISCONN (0x0 << 8) 102 103 #define DCFG (DW_USB3_BASE + 0xC700) 104 105 #define DCFG_NUMP_MASK (0x1F << 17) 106 #define DCFG_NUMP(x) (((x) & 0x1F) << 17) 107 #define DCFG_DEVADDR_MASK (0x7F << 3) 108 #define DCFG_DEVADDR(x) (((x) & 0x7F) << 3) 109 #define DCFG_DEVSPD_MASK (0x7) 110 #define DCFG_DEVSPD(x) ((x) & 0x7) 111 #define DEVSPD_HS_PHY_30MHZ_OR_60MHZ 0 112 #define DEVSPD_FS_PHY_30MHZ_OR_60MHZ 1 113 #define DEVSPD_LS_PHY_6MHZ 2 114 #define DEVSPD_FS_PHY_48MHZ 3 115 #define DEVSPD_SS_PHY_125MHZ_OR_250MHZ 4 116 117 #define DCTL (DW_USB3_BASE + 0xC704) 118 119 #define DCTL_RUN_STOP BIT31 120 #define DCTL_CSFTRST BIT30 121 #define DCTL_INIT_U2_EN BIT12 122 #define DCTL_ACCEPT_U2_EN BIT11 123 #define DCTL_INIT_U1_EN BIT10 124 #define DCTL_ACCEPT_U1_EN BIT9 125 126 #define DEVTEN (DW_USB3_BASE + 0xC708) 127 #define DEVTEN_CONNECTDONEEN BIT2 128 #define DEVTEN_USBRSTEN BIT1 129 #define DEVTEN_DISCONNEN BIT0 130 131 #define DSTS (DW_USB3_BASE + 0xC70C) 132 #define DSTS_GET_DEVSPD(x) ((x) & 0x7) 133 134 #define DALEPENA (DW_USB3_BASE + 0xC720) 135 136 #define DEPCMDPAR2(x) (DW_USB3_BASE + 0xC800 + ((x) & 0x1F) * 0x10) 137 #define DEPCMDPAR1(x) (DW_USB3_BASE + 0xC804 + ((x) & 0x1F) * 0x10) 138 #define DEPCMDPAR0(x) (DW_USB3_BASE + 0xC808 + ((x) & 0x1F) * 0x10) 139 #define DEPCMD(x) (DW_USB3_BASE + 0xc80C + ((x) & 0x1F) * 0x10) 140 141 #define DEPCMD_COMMANDPARAM_MASK (0xFFFF << 16) 142 #define DEPCMD_COMMANDPARAM(x) (((x) & 0xFFFF) << 16) 143 /* Stream Number or uFrame (input) */ 144 #define DEPCMD_STR_NUM_OR_UF_MASK (0xFFFF << 16) 145 #define DEPCMD_STR_NUM_OR_UF(x) (((x) & 0xFFFF) << 16) 146 /* Transfer Resource Index (output) */ 147 #define DEPCMD_XFER_RSRC_IDX_SHIFT 16 148 #define DEPCMD_XFER_RSRC_IDX_MASK (0x7F << 16) 149 #define DEPCMD_XFER_RSRC_IDX(x) (((x) & 0x7F) << 16) 150 #define GET_DEPCMD_XFER_RSRC_IDX(x) (((x) >> 16) & 0x7F) 151 #define DEPCMD_CMDACT BIT10 152 #define DEPCMD_CMDTYPE_MASK 0xFF 153 #define DEPCMD_CMDTYPE(x) ((x) & 0xFF) 154 155 /* EP registers range as: OUT0, IN0, OUT1, IN1, ... */ 156 #define EP_OUT_IDX(x) ((x) * 2) 157 #define EP_IN_IDX(x) (((x) * 2) + 1) 158 159 #define CMDTYPE_SET_EP_CFG 1 160 #define CMDTYPE_SET_XFER_CFG 2 161 #define CMDTYPE_GET_EP_STATE 3 162 #define CMDTYPE_SET_STALL 4 163 #define CMDTYPE_CLR_STALL 5 164 #define CMDTYPE_START_XFER 6 165 #define CMDTYPE_UPDATE_XFER 7 166 #define CMDTYPE_END_XFER 8 167 #define CMDTYPE_START_NEW_CFG 9 168 169 #define EPTYPE_CONTROL 0 170 #define EPTYPE_ISOC 1 171 #define EPTYPE_BULK 2 172 #define EPTYPE_INTR 3 173 174 #define CFG_ACTION_INIT 0 175 #define CFG_ACTION_RESTORE 1 176 #define CFG_ACTION_MODIFY 2 177 178 #define EPCFG0_CFG_ACTION_MASK (0x3 << 30) 179 #define EPCFG0_CFG_ACTION(x) (((x) & 0x3) << 30) 180 #define EPCFG0_BRSTSIZ_MASK (0xF << 22) 181 #define EPCFG0_BRSTSIZ(x) (((x) & 0xF) << 22) 182 #define EPCFG0_TXFNUM_MASK (0x1F << 17) 183 #define EPCFG0_TXFNUM(x) (((x) & 0x1F) << 17) 184 #define EPCFG0_MPS_MASK (0x7FF << 3) 185 #define EPCFG0_MPS(x) (((x) & 0x7FF) << 3) 186 #define EPCFG0_EPTYPE_MASK (0x3 << 1) 187 #define EPCFG0_EPTYPE_SHIFT 1 188 #define EPCFG0_EPTYPE(x) (((x) & 0x3) << 1) 189 190 /* Endpoint Number */ 191 #define EPCFG1_EP_NUM_MASK (0xF << 26) 192 #define EPCFG1_EP_NUM(x) (((x) & 0xF) << 26) 193 /* Endpoint Direction */ 194 #define EPCFG1_EP_DIR_IN BIT25 195 /* Stream Not Ready */ 196 #define EPCFG1_XFER_NRDY BIT10 197 /* XferInProgress Enable */ 198 #define EPCFG1_XFER_IN_PROG BIT9 199 /* Stream Completed */ 200 #define EPCFG1_XFER_CMPL BIT8 201 202 #define USB_SPEED_UNKNOWN 0 203 #define USB_SPEED_LOW 1 204 #define USB_SPEED_FULL 2 205 #define USB_SPEED_HIGH 3 206 #define USB_SPEED_VARIABLE 4 207 #define USB_SPEED_SUPER 5 208 209 // DMA registers 210 #define DSCSTS_TRBRSP_MASK (0xF << 28) 211 #define DSCSTS_TRBRSP(x) (((x) & 0xF) << 28) 212 #define GET_DSCSTS_TRBRSP(x) (((x) >> 28) & 0xF) 213 #define TRBRSP_MISSED_ISOC_IN 1 214 #define TRBRSP_SETUP_PEND 2 215 #define TRBRSP_XFER_IN_PROG 4 216 #define DSCSTS_PCM1_MASK (0x3 << 24) 217 #define DSCSTS_PCM1(x) (((x) & 0x3) << 24) 218 #define DSCSTS_XFERCNT_MASK 0xFFFFFF 219 #define DSCSTS_XFERCNT(x) ((x) & 0xFFFFFF) 220 #define GET_DSCSTS_XFERCNT(x) ((x) & 0xFFFFFF) 221 222 #define DSCCTL_STRMID_SOFN(x) (((x) & 0xFFFF) << 14) 223 #define DSCCTL_IOC BIT11 224 #define DSCCTL_ISP BIT10 225 #define DSCCTL_TRBCTL_MASK (0x3F << 4) 226 #define DSCCTL_TRBCTL(x) (((x) & 0x3F) << 4) 227 #define DSCCTL_LST BIT1 228 #define DSCCTL_HWO BIT0 229 #define TRBCTL_NORMAL 1 230 #define TRBCTL_SETUP 2 231 #define TRBCTL_STATUS_2 3 232 #define TRBCTL_STATUS_3 4 233 #define TRBCTL_CTLDATA_1ST 5 234 #define TRBCTL_ISOC_1ST 6 235 #define TRBCTL_ISOC 7 236 #define TRBCTL_LINK 8 237 #define TRBCTL_NORMAL_ZLP 9 238 239 240 #define UE_DIR_IN 0x80 241 #define UE_DIR_OUT 0 242 #define UE_SET_DIR(a, d) ((a) | (((d) & 1) << 7)) 243 #define UE_GET_DIR(a) ((a) & 0x80) 244 #define UE_ADDR 0x0F 245 #define UE_GET_ADDR(a) ((a) & UE_ADDR) 246 247 #define UT_GET_DIR(a) ((a) & 0x80) 248 #define UT_WRITE 0x00 249 #define UT_READ 0x80 250 251 #define UT_GET_TYPE(a) ((a) & 0x60) 252 #define UT_STANDARD 0x00 253 #define UT_CLASS 0x20 254 #define UT_VENDOR 0x40 255 256 #define UT_GET_RECIPIENT(a) ((a) & 0x1f) 257 #define UT_DEVICE 0x00 258 #define UT_INTERFACE 0x01 259 #define UT_ENDPOINT 0x02 260 #define UT_OTHER 0x03 261 262 #define UR_GET_STATUS 0x00 263 #define UR_CLEAR_FEATURE 0x01 264 #define UR_SET_FEATURE 0x03 265 #define UR_SET_ADDRESS 0x05 266 #define UR_GET_DESCRIPTOR 0x06 267 #define UR_SET_DESCRIPTOR 0x07 268 #define UR_GET_CONFIG 0x08 269 #define UR_SET_CONFIG 0x09 270 #define UR_GET_INTERFACE 0x0A 271 #define UR_SET_INTERFACE 0x0B 272 #define UR_SYNCH_FRAME 0x0C 273 #define UR_SET_SEL 0x30 274 #define UR_SET_ISOC_DELAY 0x31 275 276 /* Feature numbers */ 277 #define UF_ENDPOINT_HALT 0 278 #define UF_DEVICE_REMOTE_WAKEUP 1 279 #define UF_TEST_MODE 2 280 #define UF_DEVICE_B_HNP_ENABLE 3 281 #define UF_DEVICE_A_HNP_SUPPORT 4 282 #define UF_DEVICE_A_ALT_HNP_SUPPORT 5 283 #define UF_FUNCTION_SUSPEND 0 284 #define UF_U1_ENABLE 48 285 #define UF_U2_ENABLE 49 286 #define UF_LTM_ENABLE 50 287 288 #define UDESC_DEVICE 0x01 289 #define UDESC_CONFIG 0x02 290 #define UDESC_STRING 0x03 291 #define UDESC_INTERFACE 0x04 292 #define UDESC_ENDPOINT 0x05 293 #define UDESC_SS_USB_COMPANION 0x30 294 #define UDESC_DEVICE_QUALIFIER 0x06 295 #define UDESC_BOS 0x0f 296 #define UDESC_DEVICE_CAPABILITY 0x10 297 298 #define STRING_LANGUAGE 0 299 #define STRING_MANUFACTURER 1 300 #define STRING_PRODUCT 2 301 #define STRING_SERIAL 3 302 303 #define CONFIG_VALUE 1 304 305 #define USB3_BULK_IN_EP 1 306 #define USB3_BULK_OUT_EP 1 307 308 #define USB_ENUM_ADB_PORT_VID 0x18D1 309 #define USB_ENUM_ADB_PORT_PID 0xD00D 310 #define USB_ENUM_INTERFACE_ADB_SUBCLASS 0x42 311 #define USB_ENUM_INTERFACE_ADB_PROTOCOL 0x03 312 313 struct usb3_pcd; 314 315 typedef enum pcd_state { 316 USB3_STATE_UNCONNECTED, /* no host */ 317 USB3_STATE_DEFAULT, 318 USB3_STATE_ADDRESSED, 319 USB3_STATE_CONFIGURED, 320 } pcdstate_e; 321 322 typedef enum ep0_state { 323 EP0_IDLE, 324 EP0_IN_DATA_PHASE, 325 EP0_OUT_DATA_PHASE, 326 EP0_IN_WAIT_NRDY, 327 EP0_OUT_WAIT_NRDY, 328 EP0_IN_STATUS_PHASE, 329 EP0_OUT_STATUS_PHASE, 330 EP0_STALL, 331 } ep0state_e; 332 333 typedef struct usb3_dma_desc { 334 /** Buffer Pointer - Low address quadlet */ 335 UINT32 bptl; 336 337 /** Buffer Pointer - High address quadlet */ 338 UINT32 bpth; 339 340 /** Status quadlet. Fields defined in enum @ref desc_sts_data. */ 341 UINT32 status; 342 343 /** Control quadlet. Fields defined in enum @ref desc_ctl_data. */ 344 UINT32 control; 345 } usb3_dma_desc_t; 346 347 typedef struct usb3_pcd_req { 348 usb3_dma_desc_t *trb; 349 UINT64 trbdma; 350 351 UINT32 length; 352 UINT32 actual; 353 354 UINT64 *bufdma; 355 int (*complete)(unsigned actual, int status); 356 } usb3_pcd_req_t; 357 358 typedef struct usb_device_request { 359 UINT8 bmRequestType; 360 UINT8 bRequest; 361 UINT16 wValue; 362 UINT16 wIndex; 363 UINT16 wLength; 364 } usb_device_request_t; 365 366 #pragma pack(1) 367 /** USB_DT_DEVICE: Device descriptor */ 368 typedef struct usb_device_descriptor { 369 UINT8 bLength; 370 UINT8 bDescriptorType; 371 372 UINT16 bcdUSB; 373 #define USB_CLASS_COMM 0x02 374 #define USB_CLASS_VENDOR_SPEC 0xFF 375 #define USB_SC_VENDOR_SPEC 0xFF 376 #define USB_PR_VENDOR_SPEC 0xFF 377 UINT8 bDeviceClass; 378 UINT8 bDeviceSubClass; 379 UINT8 bDeviceProtocol; 380 UINT8 bMaxPacketSize0; 381 UINT16 idVendor; 382 UINT16 idProduct; 383 UINT16 bcdDevice; 384 UINT8 iManufacturer; 385 UINT8 iProduct; 386 UINT8 iSerialNumber; 387 UINT8 bNumConfigurations; 388 } usb_device_descriptor_t; 389 390 /* USB_DT_CONFIG: Config descriptor */ 391 typedef struct usb_config_descriptor { 392 UINT8 bLength; 393 UINT8 bDescriptorType; 394 395 UINT16 wTotalLength; 396 UINT8 bNumInterfaces; 397 #define CONFIG_VALUE 1 398 UINT8 bConfigurationValue; 399 UINT8 iConfiguration; 400 #define USB_CONFIG_ATT_ONE (1 << 7) 401 UINT8 bmAttributes; 402 #define USB_CONFIG_VBUS_DRAW (0xFA) 403 UINT8 bMaxPower; 404 } usb_config_descriptor_t; 405 406 /* USB_DT_DEVICE_QUALIFIER: Device Qualifier descriptor */ 407 typedef struct usb_qualifier_descriptor { 408 UINT8 bLength; 409 UINT8 bDescriptorType; 410 411 UINT16 bcdUSB; 412 UINT8 bDeviceClass; 413 UINT8 bDeviceSubClass; 414 UINT8 bDeviceProtocol; 415 UINT8 bMaxPacketSize0; 416 UINT8 bNumConfigurations; 417 UINT8 bRESERVED; 418 } usb_qualifier_descriptor_t; 419 420 /* USB_DT_INTERFACE: Interface descriptor */ 421 typedef struct usb_interface_descriptor { 422 UINT8 bLength; 423 UINT8 bDescriptorType; 424 425 UINT8 bInterfaceNumber; 426 UINT8 bAlternateSetting; 427 UINT8 bNumEndpoints; 428 UINT8 bInterfaceClass; 429 UINT8 bInterfaceSubClass; 430 UINT8 bInterfaceProtocol; 431 UINT8 iInterface; 432 } usb_interface_descriptor_t; 433 434 /* USB_DT_ENDPOINT: Endpoint descriptor */ 435 typedef struct usb_endpoint_descriptor { 436 UINT8 bLength; 437 UINT8 bDescriptorType; 438 439 UINT8 bEndpointAddress; 440 UINT8 bmAttributes; 441 #define USB_ENDPOINT_XFER_CONTROL 0x00 442 #define USB_ENDPOINT_XFER_ISOC 0x01 443 #define USB_ENDPOINT_XFER_BULK 0x02 444 #define USB_ENDPOINT_XFER_INT 0x03 445 UINT16 wMaxPacketSize; 446 UINT8 bInterval; 447 } usb_endpoint_descriptor_t; 448 449 /* USB_DT_SS_ENDPOINT_COMP: SuperSpeed Endpoint Companion descriptor */ 450 typedef struct usb_ss_ep_comp_descriptor { 451 UINT8 bLength; 452 UINT8 bDescriptorType; 453 454 UINT8 bMaxBurst; 455 UINT8 bmAttributes; 456 UINT16 wBytesPerInterval; 457 } usb_ss_ep_comp_descriptor_t; 458 459 /* WUSB BOS Descriptor (Binary device Object Store) */ 460 typedef struct wusb_bos_desc { 461 UINT8 bLength; 462 UINT8 bDescriptorType; 463 UINT16 wTotalLength; 464 UINT8 bNumDeviceCaps; 465 } wusb_bos_desc_t; 466 467 #define USB_DEVICE_CAPABILITY_20_EXTENSION 0x02 468 typedef struct usb_dev_cap_20_ext_desc { 469 UINT8 bLength; 470 UINT8 bDescriptorType; 471 UINT8 bDevCapabilityType; 472 #define USB_20_EXT_LPM 0x02 473 UINT32 bmAttributes; 474 } usb_dev_cap_20_ext_desc_t; 475 476 #define USB_DEVICE_CAPABILITY_SS_USB 0x03 477 typedef struct usb_dev_cap_ss_usb { 478 UINT8 bLength; 479 UINT8 bDescriptorType; 480 UINT8 bDevCapabilityType; 481 #define USB_DC_SS_USB_LTM_CAPABLE 0x02 482 UINT8 bmAttributes; 483 #define USB_DC_SS_USB_SPEED_SUPPORT_LOW 0x01 484 #define USB_DC_SS_USB_SPEED_SUPPORT_FULL 0x02 485 #define USB_DC_SS_USB_SPEED_SUPPORT_HIGH 0x04 486 #define USB_DC_SS_USB_SPEED_SUPPORT_SS 0x08 487 UINT32 wSpeedsSupported; 488 UINT8 bFunctionalitySupport; 489 UINT8 bU1DevExitLat; 490 UINT32 wU2DevExitLat; 491 } usb_dev_cap_ss_usb_t; 492 493 #define USB_DEVICE_CAPABILITY_CONTAINER_ID 0x04 494 typedef struct usb_dev_cap_container_id { 495 UINT8 bLength; 496 UINT8 bDescriptorType; 497 UINT8 bDevCapabilityType; 498 UINT8 bReserved; 499 UINT8 containerID[16]; 500 } usb_dev_cap_container_id_t; 501 #pragma pack() 502 503 typedef union usb_setup_pkt { 504 usb_device_request_t req; 505 UINT32 d32[2]; 506 UINT8 d8[8]; 507 } usb_setup_pkt_t; 508 509 typedef struct usb3_pcd_ep { 510 struct usb3_pcd *pcd; 511 512 UINT8 EpInIdx; 513 UINT8 EpOutIdx; 514 UINT8 phys; 515 516 //UINT8 phys; 517 UINT8 num; 518 UINT8 type; 519 UINT8 maxburst; 520 UINT16 maxpacket; 521 /* Tx FIFO # for IN EPs */ 522 UINT8 tx_fifo_num; 523 524 /* The Transfer Resource Index from the Start Transfer command */ 525 UINT8 tri_out; 526 UINT8 tri_in; 527 528 UINT8 stopped; 529 /* Send ZLP */ 530 UINT8 send_zlp; 531 /* True if 3-stage control transfer */ 532 UINT8 three_stage; 533 /* True if transfer has been started on EP */ 534 UINT8 xfer_started; 535 /* EP direction 0 = OUT */ 536 UINT8 is_in; 537 /* True if endpoint is active */ 538 UINT8 active; 539 /* Initial data pid of bulk endpoint */ 540 UINT8 data_pid_start; 541 542 /* ep_desc (excluding ep0) */ 543 usb3_dma_desc_t *ep_desc; 544 545 #if 0 546 /* TRB descriptor must be aligned to 16 bytes */ 547 UINT8 epx_desc[32]; 548 #endif 549 550 /* request (excluding ep0) */ 551 usb3_pcd_req_t req; 552 } usb3_pcd_ep_t; 553 554 typedef struct usb3_pcd { 555 //struct usb3_device *usb3_dev; 556 557 INT32 link_state; 558 pcdstate_e state; 559 UINT8 new_config; 560 ep0state_e ep0state; 561 562 UINT32 eps_enabled; 563 UINT32 ltm_enable; 564 565 usb3_pcd_ep_t ep0; 566 usb3_pcd_ep_t out_ep; 567 usb3_pcd_ep_t in_ep; 568 569 /* 570 usb3_dev_global_regs_t *dev_global_regs; 571 usb3_dev_ep_regs_t *out_ep_regs; 572 usb3_dev_ep_regs_t *in_ep_regs; 573 */ 574 575 usb3_pcd_req_t ep0_req; 576 577 UINT8 speed; 578 579 usb3_dma_desc_t *ep0_setup_desc; 580 usb3_dma_desc_t *ep0_in_desc; 581 usb3_dma_desc_t *ep0_out_desc; 582 583 /* TRB descriptor must be aligned to 16 bytes */ 584 #if 0 585 UINT8 ep0_setup[32]; 586 UINT8 ep0_in[32]; 587 UINT8 ep0_out[32]; 588 589 usb_setup_pkt_t ep0_setup_pkt[5]; 590 591 #define USB3_STATUS_BUF_SIZE 512 592 UINT8 ep0_status_buf[USB3_STATUS_BUF_SIZE]; 593 594 #define USB3_BULK_BUF_SIZE 2048 595 UINT8 ss_bulk_buf[USB3_BULK_BUF_SIZE]; 596 #endif 597 598 UINT32 file_type; 599 UINT32 file_address; 600 UINT32 file_capacity; 601 UINT32 file_total_frame; 602 UINT32 file_curr_frame; 603 UINT32 file_next_frame; 604 UINT32 file_received; 605 UINT32 file_complete; 606 607 UINT16 test_mode_nr; 608 UINT16 test_mode; 609 } usb3_pcd_t; 610 611 struct usb_enum_port_param { 612 UINT16 idVendor; 613 UINT16 idProduct; 614 UINT8 bInterfaceSubClass; 615 UINT8 bInterfaceProtocol; 616 }; 617 618 #if 0 619 typedef struct usb3_pcd_req { 620 usb3_dma_desc_t *trb; 621 UINT64 trbdma; 622 623 UINT32 length; 624 UINT32 actual; 625 626 UINT64 *bufdma; 627 int (*complete)(unsigned actual, int status); 628 } usb3_pcd_req_t; 629 630 #endif 631 632 #endif /* __DW_USB3_DXE_H__ */ 633