blob: a851b15d587bafbe6224ea09914158813fa35d17 [file] [log] [blame]
/*******************************************************************************
* °æÈ¨ËùÓÐ (C)2010, ÉîÛÚÊÐÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
*
* ÎļþÃû³Æ£º drv_usb3slave.h
* Îļþ±êʶ£º
* ÄÚÈÝÕªÒª£º
* ÆäËü˵Ã÷£º zx297520 project
* µ±Ç°°æ±¾£º 1.0
* ×÷¡¡¡¡Õߣº tangjian
* Íê³ÉÈÕÆÚ£º
*
*
*******************************************************************************/
#ifndef __USB3_SLAVE_DRV_H
#define __USB3_SLAVE_DRV_H
/* *INDENT-OFF* */
#ifdef __cplusplus
extern "C" {
#endif
/* *INDENT-ON* */
/*
**==================================================================
** Include files
**==================================================================
*/
#include "usb.h"
#include "global.h"
#include "drv_usb3slave_reg.h"
#include "dwc_otg_cil.h" //ÓÃÓÚ¶¨Ò廨µ÷º¯Êý
/* DRV´íÎóÂë */
#define SOK (0) /**< ÕýÈ· */
#define ERR_FAIL (0x01) /**< Ò»°ã´íÎó */
#define ERR_INUSE (0x02) /**< ÍâÉè×ÊÔ´ÕýÔÚʹÓà */
#define ERR_XIO (0x03) /**< ¹²Ïí×ÊÔ´¾ºÕù */
#define ERR_OVFL (0x04) /**< ¿ÉÓÃ×ÊÔ´ºÄ¾¡ */
#define ERR_INVHANDLE (0x05) /**< ´«Èë¾ä±úÎÞЧ */
#define ERR_INVPARAMS (0x06) /**< ²ÎÊýÎÞЧ */
#define ERR_INVCMD (0x07) /**< ÃüÁîÎÞЧ */
#define ERR_NOMEM (0x08) /**< ÄÚ´æºÄ¾¡ */
#define ERR_UNSUPPORTED (0x09) /**< ÐÐΪ²»Ö§³Ö */
#define ERR_INVHWVERSION (0x10) /**< Ó²¼þ°æ±¾²»Æ¥Åä */
#define FALSE 0
#define TRUE 1
#define DWC3_DCFG_SPEED_MASK (7 << 0)
#define DWC3_DCFG 0xc700
#define DWC3_DCFG_DEVADDR(addr) ((addr) << 3)
#define DWC3_DCFG_DEVADDR_MASK DWC3_DCFG_DEVADDR(0x7f)
#define DWC3_DCTL 0xc704
#define DWC3_DCTL_CSFTRST (1 << 30)
/*0x200-0x23c*/
#define DWC3_GUSB2PHYCFG(n) (0xc200 + (n * 0x04))
/*0x2C0-0x2fc*/
#define DWC3_GUSB3PIPECTL(n) (0xc2c0 + (n * 0x04))
/*0x300-0x37C*/
#define DWC3_GTXFIFOSIZ(n) (0xc300 + (n * 0x04))
/*0x380-0x3fc*/
#define DWC3_GRXFIFOSIZ(n) (0xc380 + (n * 0x04))
#define DWC3_GCTL 0xc110
#define DWC3_DCTL_RUN_STOP (1 << 31)
#define DWC3_DEVTEN_USBSUSPENDEN (1 << 6)
#define DWC3_DEVTEN_WKUPEVTEN (1 << 4)
#define DWC3_DEVTEN_ULSTCNGEN (1 << 3)
#define DWC3_DEVTEN_CONNECTDONEEN (1 << 2)
#define DWC3_DEVTEN_USBRSTEN (1 << 1)
#define DWC3_DEVTEN_DISCONNEVTEN (1 << 0)
#define DWC3_DEVTEN 0xc708
#define DWC3_DSTS 0xc70c
#define DWC3_DALEPENA 0xc720
/** ¶¨ÒåÃèÊö·ûÀàÐÍ */
#define USB_DT_DEVICE 0x01
#define USB_DT_CONFIG 0x02
#define USB_DT_STRING 0x03
#define USB_DT_INTERFACE 0x04
#define USB_DT_ENDPOINT 0x05
#define USB_DT_DEVICE_QUALIFIER 0x06
#define USB_DT_OTHER_SPEED_CONFIG 0x07
#define USB_DT_INTERFACE_POWER 0x08
/** these are from a minor usb 2.0 revision (ECN) */
#define USB_DT_OTG 0x09
#define USB_DT_DEBUG 0x0a
#define USB_DT_INTERFACE_ASSOCIATION 0x0b
/** these are from the Wireless USB spec */
#define USB_DT_SECURITY 0x0c
#define USB_DT_KEY 0x0d
#define USB_DT_ENCRYPTION_TYPE 0x0e
#define USB_DT_BOS 0x0f
#define USB_DT_DEVICE_CAPABILITY 0x10
#define USB_DT_WIRELESS_ENDPOINT_COMP 0x11
#define USB_DT_WIRE_ADAPTER 0x21
#define USB_DT_RPIPE 0x22
#define USB_DT_CS_RADIO_CONTROL 0x23
/** From the T10 UAS specification */
#define USB_DT_PIPE_USAGE 0x24
/** From the USB 3.0 spec */
#define USB_DT_SS_ENDPOINT_COMP 0x30
/** USB directions */
#define USB_DIR_OUT 0 /* to device */
#define USB_DIR_IN 0x80 /* to host */
/** USB types, the second of three bmRequestType fields, ЭÒé9.3.1 */
#define USB_TYPE_MASK (0x03 << 5)
#define USB_TYPE_STANDARD (0x00 << 5)
#define USB_TYPE_CLASS (0x01 << 5)
#define USB_TYPE_VENDOR (0x02 << 5)
#define USB_TYPE_RESERVED (0x03 << 5)
/** USB recipients, the third of three bmRequestType fields */
#define USB_RECIP_MASK 0x1f
#define USB_RECIP_DEVICE 0x00
#define USB_RECIP_INTERFACE 0x01
#define USB_RECIP_ENDPOINT 0x02
#define USB_RECIP_OTHER 0x03
/** From Wireless USB 1.0 */
#define USB_RECIP_PORT 0x04
#define USB_RECIP_RPIPE 0x05
/*
* Standard requests, for the bRequest field of a SETUP packet.
*
* These are qualified by the bmRequestType field, so that for example
* TYPE_CLASS or TYPE_VENDOR specific feature flags could be retrieved
* by a GET_STATUS request.
*/
#define USB_REQ_GET_STATUS 0x00
#define USB_REQ_CLEAR_FEATURE 0x01
#define USB_REQ_SET_FEATURE 0x03
#define USB_REQ_SET_ADDRESS 0x05
#define USB_REQ_GET_DESCRIPTOR 0x06
#define USB_REQ_SET_DESCRIPTOR 0x07
#define USB_REQ_GET_CONFIGURATION 0x08
#define USB_REQ_SET_CONFIGURATION 0x09
#define USB_REQ_GET_INTERFACE 0x0A
#define USB_REQ_SET_INTERFACE 0x0B
#define USB_REQ_SYNCH_FRAME 0x0C
#define USB_REQ_GET_MAX_LUN 0xFE
/*
* USB feature flags are written using USB_REQ_{CLEAR,SET}_FEATURE, and
* are read as a bit array returned by USB_REQ_GET_STATUS. (So there
* are at most sixteen features of each type.) Hubs may also support a
* new USB_REQ_TEST_AND_SET_FEATURE to put ports into L1 suspend.
*/
#define USB_DEVICE_SELF_POWERED 0 /**< (read only) */
#define USB_DEVICE_REMOTE_WAKEUP 1 /**< dev may initiate wakeup */
#define USB_DEVICE_TEST_MODE 2 /**< (wired high speed only) */
#define USB_DEVICE_BATTERY 2 /**< (wireless) */
#define USB_DEVICE_B_HNP_ENABLE 3 /**< (otg) dev may initiate HNP */
#define USB_DEVICE_WUSB_DEVICE 3 /**< (wireless)*/
#define USB_DEVICE_A_HNP_SUPPORT 4 /**< (otg) RH port supports HNP */
#define USB_DEVICE_A_ALT_HNP_SUPPORT 5 /**< (otg) other RH port does */
#define USB_DEVICE_DEBUG_MODE 6 /**< (special devices only) */
/*
* New Feature Selectors as added by USB 3.0
* See USB 3.0 spec Table 9-7
* Suspend Options, Table 9-7 USB 3.0 spec
*/
#define USB_DEVICE_U1_ENABLE 48 /**< dev may initiate U1 transition */
#define USB_DEVICE_U2_ENABLE 49 /**< dev may initiate U2 transition */
#define USB_DEVICE_LTM_ENABLE 50 /**< dev may send LTM */
#define USB_INTRF_FUNC_SUSPEND 0 /**< function suspend */
#define USB_INTR_FUNC_SUSPEND_OPT_MASK 0xFF00
#define USB_INTRF_FUNC_SUSPEND_LP (1 << (8 + 0))
#define USB_INTRF_FUNC_SUSPEND_RW (1 << (8 + 1))
#define USB_ENDPOINT_HALT 0 /**< IN/OUT will STALL */
/** Bit array elements as returned by the USB_REQ_GET_STATUS request */
#define USB_DEV_STAT_U1_ENABLED 2 /**< transition into U1 state */
#define USB_DEV_STAT_U2_ENABLED 3 /**< transition into U2 state */
#define USB_DEV_STAT_LTM_ENABLED 4 /**< Latency tolerance messages */
/**
* USB function drivers should return USB_GADGET_DELAYED_STATUS if they
* wish to delay the data/status stages of the control transfer till they
* are ready. The control transfer will then be kept from completing till
* all the function drivers that requested for USB_GADGET_DELAYED_STAUS
* invoke usb_composite_setup_continue().
*/
#define USB_GADGET_DELAYED_STATUS 0x7fff /**< Impossibly large value */
//#define EP0_PACKET_SIZE 64
//#define MAX_EPS (0x8)
/**
* struct usb_ctrlrequest - SETUP data for a USB device control request
* Note that the driver for any interface can issue control requests.
* For most devices, interfaces don't coordinate with each other, so
* such requests may be made at any time.
*/
typedef struct T_USB3Slave_CtrlReq
{
u8 bmRequestType; /**< Æ¥Åäsetup°übmRequestTypeÓò */
u8 bRequest; /**< Æ¥Åäsetup°übRequestÓò */
u16 wValue; /**< Æ¥Åäsetup°üwValueÓò */
u16 wIndex; /**< Æ¥Åäsetup°üwIndexÓò */
u16 wLength; /**< Æ¥Åäsetup°üwLengthÓò */
}__attribute__ ((__packed__)) T_USB3Slave_CtrlReq;
/** ¶Ëµã´«ÊäÀàÐ͵Ⱥ궨Òå */
#define USB_ENDPOINT_NUMBER_MASK 0x0f /* in bEndpointAddress */
#define USB_ENDPOINT_DIR_MASK 0x80
#define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */
#define USB_ENDPOINT_XFER_CONTROL 0
#define USB_ENDPOINT_XFER_ISOC 1
#define USB_ENDPOINT_XFER_BULK 2
#define USB_ENDPOINT_XFER_INT 3
#define USB_ENDPOINT_MAX_ADJUSTABLE 0x80
/** ×î´ó°ü´óС£¬²ÎÕÕЭÒ飬¾ù¿ÉÉèÖÃΪ1024 */
#define HS_MAX_PACKET_SIZE 512
#define FS_MAX_PACKET_SIZE 64
/** ¿ØÖÆ´«Êä×î´ó°ü´óС */
/** ¶ËµãÊýÄ¿ */
#define ENDPOINTS_NUM 6
/** ЭÒé¶ËµãÃèÊö·û */
/** TRB¿ØÖÆÖи÷¸öλ¶ÎµÄºê¶¨Òå*/
#define TRBCTL_NORMAL 1
#define TRBCTL_CONTROL_SETUP 2
#define TRBCTL_CONTROL_STATUS2 3
#define TRBCTL_CONTROL_STATUS3 4
#define TRBCTL_CONTROL_DATA 5
#define TRBCTL_ISOCHRONOUS_FIRST 6
#define TRBCTL_ISOCHRONOUS 7
#define TRBCTL_LINK_TRB 8
/** struct T_USB3Slave_TRBToHW - transfer request block (hw format) */
typedef struct T_USB3Slave_TRBToHW
{
u32 udBpl; /**< Ö¸ÏòbufferµÄµÍ32λµØÖ· */
u32 udBph; /**< Ö¸ÏòbufferµÄ¸ß32λµØÖ· */
u32 udSize; /**< Êý¾Ý´«ÊäµÄ³¤¶È */
u32 udCtrl; /**< TRB¿ØÖÆ */
}__attribute__ ((__packed__)) T_USB3Slave_TRBToHW;
/** struct T_USB3Slave_TRB - transfer request block */
typedef struct T_USB3Slave_TRB
{
u64 bplh; /**< Ö¸ÏòbufferµØÖ· */
union
{
struct
{
u32 BUFSIZ:24; /**< Êý¾Ý´«ÊäµÄ³¤¶È */
u32 PCM1:2; /**< Packet Count M1 */
u32 Reserved27_26:2;
u32 TRBSTS:4; /**< TRB״̬ */
}bit;
u32 udVal;
}len_pcm;
union
{
struct
{
u32 HWO:1; /**< ָʾӲ¼þÓµÓеÄTRB */
u32 LST:1; /**< ×îºóÒ»¸öTRB */
u32 CHN:1; /**< ´ËTRBÓëÏÂÒ»¸öTRBÏà¹ØÁª */
u32 CSP:1; /**< µ±½ÓÊÕµ½Ò»¸ö¶Ì°ücore½«»á¼ÌÐøµ½ÏÂÒ»¸öBuffer Descriptor */
u32 TRBCTL:6; /**< TRB ¿ØÖÆ */
u32 ISP_IMI:1; /**< Interrupt on Short Packet/Interrupt on Missed ISOC */
u32 IOC:1; /**< Èç¹û±»ÉèÖ㬱íʾ´«ÊäÍê³Éºó²úÉúÖÐ¶Ï */
u32 Reserved13_12:2;
u32 StreamID_SOFNum:16; /**< Stream ID/SOF Number */
u32 Reserved31_30:2;
}bit;
u32 udVal;
}control;
}__attribute__ ((__packed__)) T_USB3Slave_TRB;
/** EVENT buffer´óС */
#define EVENT_BUFFERS_SIZE 256//256
/**
* struct T_USB3Slave_EventBuf - Software event buffer representation
*/
typedef struct
{
u32 EvtBuf[EVENT_BUFFERS_SIZE]; /**< ·ÖÅäµÄEVENT Buffer */
u32 udLength; /**< ·ÖÅäEVENT Buffer ´óС */
u32 udLpos; /**< ÓÃÓÚָʾµ±Ç°EVENTµÄÆðʼλÖà */
}T_USB3Slave_EventBuf;
/** EVENTÀàÐÍ */
#define EVENT_TYPE_MASK 0xfe
#define EVENT_TYPE_DEV 0
#define EVENT_TYPE_CARKIT 3
#define EVENT_TYPE_I2C 4
typedef struct T_USB3Slave_EventType
{
u32 udIs_devspec:1; /**< ÓÃÓÚÅжÏÊǶ˵ãÀàÐÍEVENT»¹ÊÇÉ豸ÀàÐÍEVENT */
u32 udType:6; /**< EVENT ÀàÐÍ */
u32 udReserved8_31:25;
}__attribute__ ((__packed__)) T_USB3Slave_EventType;
/** ¶ËµãÀàÐÍEVENTÀàÐÍ */
#define DEPEVT_XFERCOMPLETE 0x01
#define DEPEVT_XFERINPROGRESS 0x02
#define DEPEVT_XFERNOTREADY 0x03
#define DEPEVT_RXTXFIFOEVT 0x04
#define DEPEVT_STREAMEVT 0x06
#define DEPEVT_EPCMDCMPLT 0x07
#define DEPEVT_STATUS_BUSERR (1 << 0)
#define DEPEVT_STATUS_SHORT (1 << 1)
#define DEPEVT_STATUS_IOC (1 << 2)
#define DEPEVT_STATUS_LST (1 << 3)
/** Stream event only */
#define DEPEVT_STREAMEVT_FOUND 1
#define DEPEVT_STREAMEVT_NOTFOUND 2
/** Control-only Status */
#define DEPEVT_STATUS_CONTROL_SETUP 0
#define DEPEVT_STATUS_CONTROL_DATA 1
#define DEPEVT_STATUS_CONTROL_STATUS 2
#define DEPEVT_STATUS_STATUS_SETUP 10
/**
* struct dwc3_event_depvt - Device Endpoint Events
* @udOne_bit: indicates this is an endpoint event (not used)
* @udEndpoint_number: number of the endpoint
* @udEndpoint_event: The event we have:
* 0x00 - Reserved
* 0x01 - XferComplete
* 0x02 - XferInProgress
* 0x03 - XferNotReady
* 0x04 - RxTxFifoEvt (IN->Underrun, OUT->Overrun)
* 0x05 - Reserved
* 0x06 - StreamEvt
* 0x07 - EPCmdCmplt
* @udReserved11_10: Reserved, don't use.
* @EventStatus: Indicates the status of the event. Refer to databook for more information.
* @EventParam: Parameters of the current event. Refer to databook for more information.
*/
/** ²Î¼ûÊÖ²á7.2.8.1ÃèÊö¶ËµãÀàÐÍEVENT */
typedef struct T_USB3Slave_EpEvt
{
u32 udOne_bit:1; /**< 1bitÓÃÓÚÅжÏÊǶ˵ãÀàÐÍevent»¹ÊÇÉ豸ÀàÐÍevent */
u32 udEndpoint_number:5; /**< ָʾÎïÀí¶ËµãºÅ */
u32 udEndpoint_event:4; /**< ָʾ¶ËµãÀàÐÍevent */
u32 udReserved11_10:2;
u32 EventStatus:4; /**< ָʾevent״̬£¬Refer to databook for more information*/
u32 EventParam:16; /**< µ±Ç°event²ÎÊý. Refer to databook for more information */
}__attribute__ ((__packed__)) T_USB3Slave_EpEvt;
/**
* struct T_USB3Slave_DevEvt - Device Events
* @udOne_bit: indicates this is a non-endpoint event (not used)
* @udDevice_event: indicates it's a device event. Should read as 0x00
* @udType: indicates the type of device event.
* 0 - DisconnEvt
* 1 - USBRst
* 2 - ConnectDone
* 3 - ULStChng
* 4 - WkUpEvt
* 5 - Reserved
* 6 - EOPF
* 7 - SOF
* 8 - Reserved
* 9 - ErrticErr
* 10 - CmdCmplt
* 11 - EvntOverflow
* 12 - VndrDevTstRcved
* @udReserved15_12: Reserved, not used
* @udEvtInfo: Information about this event
* @udReserved31_24: Reserved, not used
*/
/** DEVICE EVENT ÀàÐÍ */
#define DEVICE_EVENT_DISCONNECT 0
#define DEVICE_EVENT_RESET 1
#define DEVICE_EVENT_CONNECT_DONE 2
#define DEVICE_EVENT_LINK_STATUS_CHANGE 3
#define DEVICE_EVENT_WAKEUP 4
#define DEVICE_EVENT_EOPF 6
#define DEVICE_EVENT_SOF 7
#define DEVICE_EVENT_ERRATIC_ERROR 9
#define DEVICE_EVENT_CMD_CMPL 10
#define DEVICE_EVENT_OVERFLOW 11
typedef struct T_USB3Slave_DevEvt
{
u32 udOne_bit:1; /**< 1bitÓÃÓÚÅжÏÊǶ˵ãÀàÐÍevent»¹ÊÇÉ豸ÀàÐÍevent */
u32 udDevice_event:7; /**< É豸ÀàÐÍevent */
u32 udType:4; /**< ָʾ·¢ÉúµÄ¸÷ÖÖevent */
u32 udReserved15_12:4;
u32 udEvtInfo:8; /**< event ÐÅÏ¢±ÈÌØ¡£ÓÃÓÚָʾÊÇ·ñÊÇSSºÍlink state */
u32 udReserved31_24:8;
}__attribute__ ((__packed__)) T_USB3Slave_DevEvt;
/**
* struct T_USB3Slave_Event_GEvt - Other Core Events
* @udOne_bit: indicates this is a non-endpoint event (not used)
* @udDevice_event: indicates it's (0x03) Carkit or (0x04) I2C event.
* @udPhy_port_number: self-explanatory
* @udReserved31_12: Reserved, not used.
*/
typedef struct T_USB3Slave_Event_GEvt
{
u32 udOne_bit:1;
u32 udDevice_event:7;
u32 udPhy_port_number:4;
u32 udReserved31_12:20;
}__attribute__ ((__packed__)) T_USB3Slave_Event_GEvt;
/** union T_USB3Slave_Event - representation of Event Buffer contents */
typedef union
{
u32 udRaw; /**< ָʾµ±Ç°eventµÄÖµ */
T_USB3Slave_EventType tType; /**< ָʾevent ÀàÐÍ(00h±íʾdevice specific event) */
T_USB3Slave_EpEvt tEpEvt; /**< ¶ËµãÀàÐÍevent */
T_USB3Slave_DevEvt tDevEvt; /**< É豸ÀàÐÍevent */
T_USB3Slave_Event_GEvt tGetEvt; /**< Other Core Events */
}T_USB3Slave_Event;
/** ¶¨ÒåEPµÄ±ê¼Çºê */
#define EP_ENABLED (1 << 0)
#define EP_STALL (1 << 1)
#define EP_WEDGE (1 << 2)
#define EP_BUSY (1 << 4)
#define EP_PENDING_REQUEST (1 << 5)
/** This last one is specific to EP0 */
#define EP0_DIR_IN ((u32)1 << 31)
/** EP񈬀 */
#define EP_FLAG_STALLED (1 << 0)
#define EP_FLAG_WEDGED (1 << 1)
/** EP·½Ïò */
#define EP_DIRECTION_TX true
#define EP_DIRECTION_RX false
/** ¶ËµãµÄ״̬±ä»¯*/
typedef enum
{
EP_IDLE = 0, /**< EP¿ÕÏÐ */
EP_HALTED, /**< EP halt */
EP0_CTRLIN_SETUP, /**< EP0¿ØÖƽ¨Á¢IN½×¶Î */
EP0_CTRLOUT_SETUP, /**< EP0¿ØÖƽ¨Á¢OUT½×¶Î */
EP0_CTRLNULL_SETUP, /**< EP0¿ØÖƽ¨Á¢Îª¿Õ */
EP0_CTRL_INDATA, /**< EP0¿ØÖÆINÊý¾Ý½×¶Î */
EP0_CTRL_OUTDATA, /**< EP0¿ØÖÆOUTÊý¾Ý½×¶Î */
EP0_CTRL_INSTATUS, /**< EP0¿ØÖÆIN״̬½×¶Î */
EP0_CTRL_OUTSTATUS, /**< EP0¿ØÖÆOUT״̬½×¶Î */
EP_RX, /**< EP½ÓÊÕ״ָ̬ʾ */
EP_TX /**< EP·¢ËÍ״ָ̬ʾ */
}E_USB3Slave_EpState;
/** ָʾEp0ÏÂÒ»¸öEVENTÀàÐÍ */
typedef enum
{
EP0_UNKNOWN = 0,
EP0_COMPLETE, /**< EP0״ָ̬ʾΪÍê³É*/
EP0_NRDY_SETUP, /**< EP0״̬NRDYָʾΪ½¨Á¢½×¶Î*/
EP0_NRDY_DATA, /**< EP0״̬NRDYָʾΪÊý¾Ý½×¶Î*/
EP0_NRDY_STATUS, /**< EP0״̬NRDYָʾΪ״̬½×¶Î*/
} E_USB3Slave_Ep0Next;
/** ָʾEP0¿ØÖÆ´«ÊäµÄÈý¸ö½×¶Î */
typedef enum
{
EP0_UNCONNECTED = 0,
EP0_SETUP_PHASE, /**< EP0¿ØÖÆ´«ÊäµÄ½¨Á¢½×¶Î */
EP0_DATA_PHASE, /**< EP0¿ØÖÆ´«ÊäµÄÊý¾Ý½×¶Î */
EP0_STATUS_PHASE, /**< EP0¿ØÖÆ´«ÊäµÄ״̬½×¶Î */
}E_USB3Slave_Ep0State;
/** ³¬¸ßËÙģʽϵÄÁ¬½Ó״̬ */
/** ¿ØÖÆ´«ÊäÖÐö¾ÙËù´¦µÄ״̬½×¶Î */
typedef enum
{
DEFAULT_STATE = 0, /**< ȱʡ״̬ */
ADDRESS_STATE, /**< µØÖ·×´Ì¬ */
CONFIGURED_STATE, /**< ÅäÖÃ״̬ */
SETINTERFACE_STATE, /**< ÉèÖýӿÚ״̬*/
GETMAXLUN_STATE, /**<GET MAX lUN*/
BULKIN_CMPL, /**< BULK IN´«ÊäÍê³É״̬ */
BULKOUT_CMPL, /**< BULK OUT´«ÊäÍê³É״̬ */
IntrIN_CMPL, /**< Interrupt IN´«ÊäÍê³É״̬ */
IntrOUT_CMPL, /**< Interrupt OUT´«ÊäÍê³É״̬ */
}E_USB3Slave_ReqState;
/** ¶¨ÒåUSB3.0µÄËÙ¶ÈÀàÐÍ£¬²ÎÕÕ¿ØÖÆÆ÷ÊÖ²áP513, DCFG¼Ä´æÆ÷0:2±ÈÌØ */
typedef enum
{
USB3_HIGHSPEED = 0, /**< 3'b000 USB2.0 PHY clock is 30 MHz or 60 MHz */
USB3_FULLSPEED = 1, /**< 3'b001 USB2.0 PHY clock is 30 MHz or 60 MHz */
USB3_SUPERSPEED = 4, /**< 3'b100 USB3.0 PHY clock is 30 MHz or 60 MH */
}E_USB3Slave_SpeedMode;
/** ָʾÁ¬½ÓµÄÉ豸µÄËÙ¶ÈÀàÐÍ */
typedef enum
{
USB30_SPEED_UNKNOWN = 0, /**< enumerating */
USB30_SPEED_LOW, USB30_SPEED_FULL, /**< usb 1.1 */
USB30_SPEED_HIGH, /**< usb 2.0 */
USB30_SPEED_WIRELESS, /**< wireless (usb 2.5) */
USB30_SPEED_SUPER, /**< usb 3.0 */
}E_USB3Slave_Speed;
/** T_USB3Slave_HWPARAMS - copy of HWPARAMS registers */
typedef struct
{
u32 udHwparams0; /**< ¶ÔÓ¦ÓÚGHWPARAMS0¼Ä´æÆ÷¶ÁÈ¡µÄÖµ */
u32 udHwparams1; /**< ¶ÔÓ¦ÓÚGHWPARAMS1¼Ä´æÆ÷¶ÁÈ¡µÄÖµ */
u32 udHwparams2; /**< ¶ÔÓ¦ÓÚGHWPARAMS2¼Ä´æÆ÷¶ÁÈ¡µÄÖµ */
u32 udHwparams3; /**< ¶ÔÓ¦ÓÚGHWPARAMS3¼Ä´æÆ÷¶ÁÈ¡µÄÖµ */
u32 udHwparams4; /**< ¶ÔÓ¦ÓÚGHWPARAMS4¼Ä´æÆ÷¶ÁÈ¡µÄÖµ */
u32 udHwparams5; /**< ¶ÔÓ¦ÓÚGHWPARAMS5¼Ä´æÆ÷¶ÁÈ¡µÄÖµ */
u32 udHwparams6; /**< ¶ÔÓ¦ÓÚGHWPARAMS6¼Ä´æÆ÷¶ÁÈ¡µÄÖµ */
u32 udHwparams7; /**< ¶ÔÓ¦ÓÚGHWPARAMS7¼Ä´æÆ÷¶ÁÈ¡µÄÖµ */
u32 udHwparams8; /**< ¶ÔÓ¦ÓÚGHWPARAMS8¼Ä´æÆ÷¶ÁÈ¡µÄÖµ */
}T_USB3Slave_HWPARAMS;
/** ÓÃÓڶ˵ãÃüÁîµÄÈý¸ö²ÎÊý */
typedef struct T_USB3Slave_EpCmdPara
{
u32 Parameter2; /**< ָʾÉ豸ÎïÀí¶ËµãÃüÁî²ÎÊý2 */
u32 Parameter1; /**< ָʾÉ豸ÎïÀí¶ËµãÃüÁî²ÎÊý1 */
u32 Parameter0; /**< ָʾÉ豸ÎïÀí¶ËµãÃüÁî²ÎÊý0 */
}__attribute__ ((__packed__)) T_USB3Slave_EpCmdPara;
/** DEPCFG parameter 1 */
#define DEPCFG_INT_NUM(n) ((n) << 0)
#define DEPCFG_XFER_COMPLETE_EN (1 << 8)
#define DEPCFG_XFER_IN_PROGRESS_EN (1 << 9)
#define DEPCFG_XFER_NOT_READY_EN (1 << 10)
#define DEPCFG_FIFO_ERROR_EN (1 << 11)
#define DEPCFG_STREAM_EVENT_EN (1 << 13)
#define DEPCFG_BINTERVAL_M1(n) ((n) << 16)
#define DEPCFG_STREAM_CAPABLE (1 << 24)
#define DEPCFG_EP_NUMBER(n) ((n) << 25)
#define DEPCFG_BULK_BASED (1 << 30)
#define DEPCFG_FIFO_BASED (1 << 31)
/** DEPCFG parameter 0 */
#define DEPCFG_EP_TYPE(n) ((n) << 1)
#define DEPCFG_MAX_PACKET_SIZE(n) ((n) << 3)
#define DEPCFG_FIFO_NUMBER(n) ((n) << 17)
#define DEPCFG_BURST_SIZE(n) ((n) << 22)
#define DEPCFG_DATA_SEQ_NUM(n) ((n) << 26)
#define DEPCFG_IGN_SEQ_NUM (1 << 31)
/** DEPXFERCFG parameter 0 */
#define DEPXFERCFG_NUM_XFER_RES(n) ((n) & 0xffff)
/** ¶ËµãÐÅÏ¢½á¹¹Ìå */
#pragma pack (4) /*Ö¸¶¨°´4×Ö½Ú¶ÔÆë*/
typedef struct
{
u32 udEpNum; /**< µ±Ç°epºÅ */
u8 *pucBuf; /**< »º³åÇøÖ¸Õë */
u32 udPos; /**< »º³åÇø¶ÁдָÕë */
u32 udLen; /**< »º³åÇø×ܳ¤¶È */
u32 udMaxPacket; /**< ×î´ó°üµÄ´óС */
u32 udMaxStream; /**< Ö§³ÖµÄ×î´óÁ÷Êý */
u32 udMaxBurst; /**< ¸Ã¶ËµãÖ§³ÖµÄ×î´óburstÊý */
T_USB3Slave_TRBToHW *ptTRB; /**< ×¼±¸ÓÃÓÚtrbµÄ»º³åÇø */
u32 udDMAChannel; /**< ¶ËµãʹÓõÄdmaͨµÀ, ¸ß16Ϊģʽ£¬µÍ16ΪͨµÀºÅ */
u8 ucType; /**< Ö§³ÖµÄ´«ÊäÀàÐÍ */
void *pPara; /**< »Øµ÷º¯ÊýµÄ²ÎÊý */
E_USB3Slave_EpState eEpState; /**< ¶Ëµã״̬ */
u32 udDirection; /**< ¶Ëµã´«Êä·½Ïò * @direction: true for TX, false for RX */
void *DriverData; /**< Êý¾ÝÓÃÓÚ´«Êä,ºóÐøµ÷ÊÔ¿ÉÄÜ»áÓõ½*/
u32 udInterval; /**< ¶ËµãµÄInterval */
u32 udBusySlot; /**< ´¦ÓÚæ״̬TRB¸öÊý */
u32 udFreeSlot; /**< ´¦ÓÚ¿ÕÏÐ״̬TRB¸öÊý */
u32 *pudAddrData; /**< ĿǰÖ÷ÒªÊÇBULK´«ÊäÓÃÓÚ½ÓÊպͷ¢ËÍÊý¾ÝµÄµØÖ· */
u8 ucAddress; /**< µØÖ· */
u32 udFlags; /**< ¶Ëµã±ê¼Ç */
u32 udCurrentTrb; /**< µ±Ç°TRB */
u8 ucResTransIdx; /**< ´«Êä×ÊÔ´Ë÷Òý */
u32 udStreamCapable; /**< ÊÇ·ñ¾ßÓÐÁ÷ÄÜÁ¦ */
F_USB_CB fnUsbCb; //¶Ëµã²Ù×÷Íê³ÉºóµÄ»Øµ÷º¯Êý
}T_USB3Slave_Ep;
#pragma pack () /*È¡Ïû¶ÔÆë*/
/** struct dwc3 - representation of our controller */
/** È«¾ÖdeviceÐÅÏ¢½á¹¹Ì壬ÓÃÓÚÈí¼þ */
#pragma pack (4) /*Ö¸¶¨°´4×Ö½Ú¶ÔÆë*/
typedef struct
{
u32 udRegs_base; /**< ¼Ç¼¼Ä´æÆ÷»ùÖ· */
E_USB3Slave_SpeedMode eSpeedMode; /**< µ±Ç°É豸µÄËÙ¶È */
E_USB3Slave_Speed eDeviceSpeedType; /**< ËÙ¶ÈÀàÐÍ£¬¼æÈÝlinuxÇý¶¯Ëù×÷£¬¾ßÌåʹÓôýÒé */
T_USB3Slave_HWPARAMS tHwParams; /**< ±£´æËùÓÐÓ²¼þ²ÎÊý */
u32 udMode; /**< ±£´æ¿ØÖÆÆ÷µ±Ç°Ëù´¦Ä£Ê½ */
T_USB3Slave_EventBuf *ptEvtBuffs; /**< ±£´æevent */
u32 udNumEvtBufs; /**< ¼Ç¼evnet¸öÊý£¬´ÓÓ²¼þ²ÎÊýÖлñµÃ*/
T_USB3Slave_Ep tEps[ENDPOINTS_NUM]; /**< ±£´æ¶ËµãÐÅÏ¢ */
u32 udIsSelfPowered; /**< ×Ô¹©µçture*/
u32 udThreeStageSetup; /**< Èý½×¶ÎÉèÖÃ*/
u32 udEp0Bounced; /**< bounce buffer for ep0 */
u32 udEp0ExpectIn; /**< true when we expect a DATA IN transfer */
u32 udSetupPacketPending; /**< true when there's a Setup Packet in FIFO. Workaround */
u32 udDelayedStatus; /**< ÑÓ³Ù״̬*/
u32 udEventsequence; /**< eventÐòºÅ */
E_USB3Slave_Ep0Next eEp0NextEvent; /**< ָʾ¶ËµãµÄÏÂÒ»¸öEVENT */
E_USB3Slave_Ep0State eEp0State; /**< ep0״̬*/
E_USB3Slave_ReqState eDevState; /**< É豸״̬ */
u32 udUSBSate; /**< ö¾Ù״̬ */
/*ÒÔÏÂÊý¾Ý³ÉÔ±³¤¶ÈÉèÖòÎÕÕlinux 3.3.6ÖжÔusb3¿ØÖÆÆ÷µÄ³õʼº¯Êý*/
T_USB3Slave_CtrlReq *tCtrlReq; /**< ¿ØÖÆÇëÇó */
T_USB3Slave_TRBToHW *ptEp0TRB; /**< ep0 TRBÉèÖÃ*/
u8 aucSetupBuf[2]; /**< ½¨Á¢buffer δÓÃĿǰ */
u8 ucSpeed; /**< ËÙ¶È */
u32 *pudTxData; /**< Ö¸Ïò·¢Ë͵ÄÊý¾Ý´óС */
}T_USB3Slave_SlaveObj;
#pragma pack () /*È¡Ïû¶ÔÆë*/
/** ¶¨ÒåSlaveObj ¶ÔÏóµÄÈ«¾Ö±äÁ¿*/
/** DWC3 Features to be used as Driver Data ĿǰûÓÐÓõ½ÔÝʱ·ÅÔÚÕâÀï*/
/*#define HAS_PERIPHERAL BIT(0)
#define HAS_XHCI BIT(1)
#define HAS_OTG BIT(3)*/
#define DATA_32BIT_MASK 0xFFFFFFFF
#define ADDRESS_MAX 127
/* *INDENT-OFF* */
#ifdef __cplusplus
}
#endif
/* *INDENT-ON* */
#endif /* __USB3_SLAVE_DRV_H */
/** @} */