[T106][ZXW-22]7520V3SCV2.01.01.02P42U09_VEC_V0.8_AP_VEC origin source commit
Change-Id: Ic6e05d89ecd62fc34f82b23dcf306c93764aec4b
diff --git a/boot/common/src/loader/drivers/drv_usb3slave.c b/boot/common/src/loader/drivers/drv_usb3slave.c
new file mode 100644
index 0000000..3b1df60
--- /dev/null
+++ b/boot/common/src/loader/drivers/drv_usb3slave.c
@@ -0,0 +1,2117 @@
+/*******************************************************************************
+* °æÈ¨ËùÓÐ (C)2010, ÉîÛÚÊÐÖÐÐËͨѶ¹É·ÝÓÐÏÞ¹«Ë¾¡£
+*
+* ÎļþÃû³Æ£º drv_usb3slave.c
+* Îļþ±êʶ£º
+* ÄÚÈÝÕªÒª£º
+* ÆäËü˵Ã÷£º zx297520 project
+* µ±Ç°°æ±¾£º 1.0
+* ×÷¡¡¡¡Õߣº tangjian
+* Íê³ÉÈÕÆÚ£º
+*
+*
+*******************************************************************************/
+
+
+/*
+**==================================================================
+** Include files
+**==================================================================
+*/
+#include <commond.h>
+#include "drv_usb3slave.h"
+#include "config.h"
+#include <asm/string.h>
+
+/*zloader±àÒëÑ¡ÏîΪnostdlib,ÆÁ±ÎµôÏÂÃæµÄÍ·Îļþ*/
+//#include <stdlib.h>
+//#include <string.h>
+
+/*
+**==================================================================
+** Global Variables
+**==================================================================
+*/
+/* Èí¼þÓÃÀ´¼Ç¼ËùÓÐdeviceÏà¹ØµÄÐÅÏ¢µÄÈ«¾Ö½á¹¹Ìå*/
+
+extern __align(4) dwc_device_descriptor_t Para_Section device_desc ;
+extern __align(4) dwc_config_all_t Para_Section desc ;
+extern __align(4) dwc_string_descriptor_t Para_Section * pStrDescIdx[] ;
+extern __align(4) dwc_dev_qual_descriptor_t Para_Section dev_qual_desc ;
+__align(EVENT_BUFFERS_SIZE*4) T_USB3Slave_EventBuf Para_Section *gp_USB3Slave_EventBuf; //EventBufÒÔEVENT_BUFFERS_SIZE*4×Ö½Ú¶ÔÆë
+__align(16) T_USB3Slave_TRBToHW Para_Section USB3Slave_TRB ; //TRBÒÔ16×Ö½Ú¶ÔÆë
+__align(16) T_USB3Slave_TRBToHW Para_Section USB3Slave_TRB_EP[4] ; //TRBÒÔ16×Ö½Ú¶ÔÆë
+__align(16) T_USB3Slave_CtrlReq Para_Section pCtrlReq ; /**< ¿ØÖÆÇëÇó */
+T_USB3Slave_SlaveObj Para_Section g_USB3Slave={0};
+u8 g_needSetStall = 0;
+u32 g_debugFaultVal = 0;
+
+__align(EVENT_BUFFERS_SIZE*4) T_USB3Slave_EventBuf Para_Section USB3Slave_EventBuf; //EventBufÒÔEVENT_BUFFERS_SIZE*4×Ö½Ú¶ÔÆë
+
+extern void usb_timeout_usdelay(u32 us);
+#if 0
+static inline void delay(unsigned long loops)
+{
+ /*
+ __asm__ volatile ("1:\n" "subs %0, %1, #1\n"
+ "bne 1b":"=r" (loops):"0"(loops));
+ */
+}
+
+static inline void udelay(unsigned long us)
+{
+ delay(us * 200); /* approximate */
+}
+
+void usdelay(unsigned us)
+{
+ udelay(us);
+}
+#endif
+
+static T_USB3Slave_Ep *USB3Slave_GetEpObj(T_USB3Slave_SlaveObj *ptUsb3Slave, u16 uwIndex_le)
+{
+ T_USB3Slave_Ep *ptDep;
+ u32 udEpnum;
+
+ udEpnum = (uwIndex_le & USB_ENDPOINT_NUMBER_MASK) << 1;
+
+ if ( USB_DIR_IN == (uwIndex_le & USB_ENDPOINT_DIR_MASK))
+ udEpnum |= 1;
+
+ ptDep = &(ptUsb3Slave->tEps[udEpnum]);
+
+ /*if (ptDep->udFlags & EP_ENABLED)*/
+ return (T_USB3Slave_Ep*)ptDep;
+
+ //return (T_USB3Slave_Ep*)NULL;
+}
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief Ïò¶ËµãдÃüÁîµÄͨÓú¯Êý
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_SendDevEpCmd º¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - Ïò¶ËµãдÃüÁîµÄͨÓú¯Êý
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: usb3 É豸½á¹¹Ìå
+ * - udEp: ¶ËµãºÅ
+ * - udCmd: ÃüÁî,ÊÇÓÉDEPCMD¼Ä´æÆ÷µÄCmdTypÓò·¢ÆðµÄ¡£
+ * -00h: Reserved
+ * -01h: Set Endpoint Configuration
+ * -02h: Set Endpoint Resource Configuration
+ * -03h: Get Endpoint State
+ * -04h: Set Stall
+ * -05h: Clear Stall
+ * -06h: Start Transfer
+ * -07h: Update Transfer
+ * -08h: End Transfer
+ * -09h: Start New Configuration
+ * - ptParams: ÃüÁî²ÎÊý
+ *
+ * ·µ »Ø Öµ: ÀàÐÍ:u32
+ * - ´íÎóÂë
+ *
+ * ÆäËû˵Ã÷:
+ * -
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+
+static u32 USB3Slave_SendDevEpCmd(T_USB3Slave_SlaveObj *ptUsb3Slave, u32 udEp,
+ u32 udCmd, T_USB3Slave_EpCmdPara *ptParams)
+{
+ volatile u32 udTimeout = 500;
+ u32 udRegValue;
+
+
+ REG32(ptUsb3Slave->udRegs_base + DEPCMDPAR0(udEp)) = ptParams->Parameter0;
+ REG32(ptUsb3Slave->udRegs_base + DEPCMDPAR1(udEp)) = ptParams->Parameter1;
+ REG32(ptUsb3Slave->udRegs_base + DEPCMDPAR2(udEp)) = ptParams->Parameter2;
+
+ REG32(ptUsb3Slave->udRegs_base + DEPCMD(udEp)) = udCmd | USB3Slave_DEPCMD_CMDACT_1;
+ // Ïòcmd¼Ä´æÆ÷µÚ10λд1ºó(command active)£¬¿ØÖÆÆ÷»á×Ô¶¯°Ñ¸ÃλÖÃ0
+
+ do
+ {
+ udRegValue = REG32(ptUsb3Slave->udRegs_base + DEPCMD(udEp));
+
+ if(!(udRegValue & USB3Slave_DEPCMD_CMDACT_1)) break;
+
+ udTimeout--;
+
+ if(!udTimeout)
+ {
+ return ERR_FAIL;
+ }
+ } while(1);
+
+ return SOK;
+}
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief TRB½á¹¹ÌåλÓòÐÎʽת»»³ÉTRBÕûÌå½á¹¹ÌåÐÎʽ£¬±ãÓÚ¶ÔTRBÕûÌå²Ù×÷¡£
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_TrbToHWº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - TRB½á¹¹ÌåλÓòÐÎʽת»»³ÉTRB½á¹¹ÌåÕûÌåÐÎʽ£¬±ãÓÚ¶ÔTRBÕûÌå²Ù×÷¡£
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptTrbBit: TRBλÓòÐÎʽ½á¹¹Ìå
+ * - ptTrbRaw: TRB ÕûÌå½á¹¹ÌåÐÎʽ
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_TrbToHW(T_USB3Slave_TRB *ptTrbBit, T_USB3Slave_TRBToHW *ptTrbRaw)
+{
+ ptTrbRaw->udBpl = ptTrbBit->bplh & DATA_32BIT_MASK;
+ ptTrbRaw->udBph = 0;
+ ptTrbRaw->udSize = ptTrbBit->len_pcm.udVal;
+ /* HWO is written last */
+ ptTrbRaw->udCtrl = ptTrbBit->control.udVal;
+}
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ÔÚ¿ªÊ¼ÅäÖÃ֮ǰ£¬ÒªÏȸøep0дÃüÁî9:¿ªÊ¼ÐµÄÅäÖÃstart new configuration
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_StartCfg º¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ÔÚ¿ªÊ¼ÅäÖÃ֮ǰ£¬ÒªÏȸøep0дÃüÁî9£¬´ËÃüÁî²ÎÊýΪ0
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: usb 3.0É豸½á¹¹Ìå
+ * - ptDep: ¶ËµãÐÅÏ¢½á¹¹Ìå
+ *
+ * ·µ »Ø Öµ: ÀàÐÍ:u32
+ * - ´íÎóÂë
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static u32 USB3Slave_StartCfg(T_USB3Slave_SlaveObj *ptUsb3Slave, T_USB3Slave_Ep *ptDep)
+{
+ T_USB3Slave_EpCmdPara tParams = {0};
+ u32 udCmd;
+
+ /* ÏòDEPCMD дÃüÁî9 */ /*Ö´ÐÐCMD9£¬Ôڶ˵ã0ºÍ2µÄÇé¿ö£¬Ò»°ãÖ»Ôڶ˵ã0£¬¶Ëµã2ÓеãÑо¿*/
+ if (0 == ptDep->udEpNum)
+ {
+ udCmd = USB3Slave_DEPCMD_DEPSTARTCFG;
+ return USB3Slave_SendDevEpCmd(ptUsb3Slave, ptDep->udEpNum, udCmd, &tParams);
+ }
+ return SOK;
+}
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ¶Ô¶Ëµã½øÐÐÅäÖÃ
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_SetEpCfgCmdº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ¶Ô¶Ëµã½øÐÐÅäÖÃ
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - ptDep: ¶ËµãÐÅÏ¢½á¹¹Ìå
+ *
+ * ·µ »Ø Öµ: ÀàÐÍ:u32
+ * - ´íÎóÂë
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static u32 USB3Slave_SetEpCfgCmd(T_USB3Slave_SlaveObj *ptUsb3Slave, T_USB3Slave_Ep *ptDep)
+{
+ T_USB3Slave_EpCmdPara tParams = {0};
+
+ if((0 == ptDep->udEpNum)||(1 == ptDep->udEpNum))
+ ptDep->ucType = USB_ENDPOINT_XFER_CONTROL; //¼Ç¼¶ËµãµÄ´«ÊäÀàÐÍ
+ else
+ ptDep->ucType = USB_ENDPOINT_XFER_BULK;
+
+
+ tParams.Parameter0 = DEPCFG_EP_TYPE(ptDep->ucType & USB_ENDPOINT_XFERTYPE_MASK) \
+ | DEPCFG_MAX_PACKET_SIZE(ptDep->udMaxPacket & 0xffff)
+ | DEPCFG_BURST_SIZE(ptDep->udMaxBurst);
+ /*
+ * We must use the lower 16 TX FIFOs even though
+ * HW might have more
+ */
+ if (ptDep->udDirection)
+ tParams.Parameter0 |= DEPCFG_FIFO_NUMBER(ptDep->udEpNum >> 1);
+
+ if((0 == ptDep->udEpNum)||(1 == ptDep->udEpNum))
+ tParams.Parameter1 = DEPCFG_XFER_COMPLETE_EN | DEPCFG_XFER_NOT_READY_EN;
+ else
+ tParams.Parameter1 = DEPCFG_XFER_COMPLETE_EN;
+
+ /*
+ * We are doing 1:1 mapping for endpoints, meaning
+ * Physical Endpoints 2 maps to Logical Endpoint 2 and
+ * so on. We consider the direction bit as part of the physical
+ * endpoint number. So USB endpoint 0x81 is 0x03.
+ */
+ tParams.Parameter1 |= DEPCFG_EP_NUMBER(ptDep->udEpNum);
+
+ return USB3Slave_SendDevEpCmd(ptUsb3Slave, ptDep->udEpNum,
+ USB3Slave_DEPCMD_SETEPCONFIG, &tParams);
+}
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief Ϊÿ¸ö¶ËµãÉèÖô«Êä×ÊÔ´¸öÊý
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_SetXferResourceº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - Ϊÿ¸ö¶ËµãÉèÖô«Êä×ÊÔ´¸öÊý
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - ptDep: ¶ËµãÐÅÏ¢½á¹¹Ìå
+ *
+ * ·µ »Ø Öµ: ÀàÐÍ:u32
+ * - ´íÎóÂë
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static u32 USB3Slave_SetXferResource(T_USB3Slave_SlaveObj *ptUsb3Slave, T_USB3Slave_Ep *ptDep)
+{
+ T_USB3Slave_EpCmdPara tParams;
+
+ memset(&tParams, 0x00, sizeof(tParams));
+
+ tParams.Parameter0 = DEPXFERCFG_NUM_XFER_RES(1);
+ /* ÉèÖô«Êä×ÊÔ´*/
+ return USB3Slave_SendDevEpCmd(ptUsb3Slave, ptDep->udEpNum,
+ USB3Slave_DEPCMD_SETTRANSFRESOURCE, &tParams);
+}
+
+
+/**
+ * __dwc3_gadget_ep_enable - Initializes a HW endpoint
+ * @ptDep: endpoint to be initialized
+ * @ptDesc: USB Endpoint Descriptor
+ *
+ * Caller should take care of locking
+ */
+/**-------------------------------------------------------------------------------------------------------------------@n
+* @brief ³õʼ»¯Ò»¸öÓ²¼þ¶Ëµã£¬°üÀ¨¿ªÊ¼ÅäÖá¢Èý²ÎÅäÖᢴ«Êä×ÊÔ´ÅäÖã¬Èí¼þtrbÉèÖø³Öµµ½Ó²¼þÉ豸trbÖÐ
+*
+* ¹¦ÄÜÏêÊö:
+* - USB3Slave_CfgEpº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+* - ʹÄÜÒ»¸öÓ²¼þ¶Ëµã£¬°üÀ¨¿ªÊ¼ÅäÖá¢Èý²ÎÅäÖᢴ«Êä×ÊÔ´ÅäÖã¬Èí¼þtrbÉèÖø³Öµµ½Ó²¼þÉ豸trbÖÐ
+*
+* ²ÎÊý¸ÅÊö:
+* - ptDep: ³õʼ»¯¶Ëµã£¬¶ËµãÐÅÏ¢½á¹¹Ìå
+* - ptDesc: USB ¶ËµãÃèÊö·û
+* - ptComp_desc: ¶Ëµãcompanion ÃèÊö·û
+*
+* ·µ »Ø Öµ: ÀàÐÍ:u32
+* - ´íÎóÂë
+*
+*--------------------------------------------------------------------------------------------------------------------*/
+static u32 USB3Slave_CfgEp(T_USB3Slave_Ep *ptDep)
+{
+ T_USB3Slave_SlaveObj *pUSB3Slv = &g_USB3Slave;
+
+ if (!(ptDep->udFlags & EP_ENABLED))
+ {
+//step0:ep0¶ËµãÅäÖÿªÊ¼£¬Ö´ÐÐcmd=9£¬start new conguration
+ USB3Slave_StartCfg(pUSB3Slv, ptDep);
+ }
+
+//step1:Ö´ÐÐcmd1£¬SET EP CONFIG
+ USB3Slave_SetEpCfgCmd(pUSB3Slv, ptDep);
+
+//step2:Ö´ÐÐcmd2£¬Set Endpoint Transfer Resource Configuration £¬param0 = 1
+
+ if (!(ptDep->udFlags & EP_ENABLED))
+ {
+ USB3Slave_SetXferResource(pUSB3Slv, ptDep);
+
+ ptDep->udFlags |= EP_ENABLED;
+ if(global.need_enum ==1)
+ {
+
+//step3:active ep ,0xc720 £¬Ò»¸ö¶Ëµã¶ÔÓÚÒ»¸öbit
+ REG32(pUSB3Slv->udRegs_base + DWC3_DALEPENA)|= (1u<<ptDep->udEpNum);
+ }
+
+ }
+
+ return SOK;
+}
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ep0·¢ËÍÊý¾Ý
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_Ep0StartXferº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ep0·¢ËÍÊý¾Ý
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÀàÐÅÏ¢µÄ½á¹¹Ìå
+ * - ucEpnum: ¶ËµãºÅ
+ * - udBufAddr: ÊäÈëµØÖ·
+ * - udLen: ³¤¶È
+ * - udType: TRB¿ØÖÆÀàÐÍ
+ *
+ * ·µ »Ø Öµ: ÀàÐÍ:u32
+ * - ÀàÐÍÂë
+ *
+ * ÆäËû˵Ã÷:
+ * -
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static u32 USB3Slave_Ep0StartXfer(T_USB3Slave_SlaveObj *ptUsb3Slave, u8 ucEpnum, u32 udBufAddr,
+ u32 udLen, u32 udType)
+{
+ T_USB3Slave_EpCmdPara tParams;
+ T_USB3Slave_TRBToHW *ptTrbRaw;
+ T_USB3Slave_TRB tTrbBit;
+ T_USB3Slave_Ep *ptDep;
+
+ ptDep = &(ptUsb3Slave->tEps[ucEpnum]);
+
+ ptUsb3Slave->ptEp0TRB = ptDep->ptTRB;
+ ptTrbRaw = ptUsb3Slave->ptEp0TRB;
+
+ memset(&tTrbBit, 0, sizeof(tTrbBit));
+
+ tTrbBit.control.bit.TRBCTL = udType;
+ tTrbBit.bplh =udBufAddr ;
+ tTrbBit.len_pcm.bit.BUFSIZ = udLen;
+
+ tTrbBit.control.bit.HWO = 1;
+ tTrbBit.control.bit.LST = 1;
+ /*tTrbBit.control.bit.IOC = 1;
+ tTrbBit.control.bit.ISP_IMI = 1;*/
+
+ USB3Slave_TrbToHW(&tTrbBit, ptTrbRaw);
+
+ memset(&tParams, 0, sizeof(tParams));
+ tParams.Parameter0 = 0; /*tTrbBit¸ß32λµØÖ·£¬Ä¬ÈÏΪ0*/
+ tParams.Parameter1 = (u32)((u32)(ptUsb3Slave->ptEp0TRB)& (u32)0xFFFFFFFF);/* ys */
+
+ USB3Slave_SendDevEpCmd(ptUsb3Slave, ptDep->udEpNum,
+ USB3Slave_DEPCMD_STARTTRANSFER, &tParams);
+ ptDep->udFlags |= EP_BUSY;
+
+//»ñµÃ´«Êä×ÊÔ´Ë÷Òý
+ ptDep->ucResTransIdx = (REG32(ptUsb3Slave->udRegs_base + ((u32)DEPCMD(ptDep->udEpNum)>>16)));
+
+ ptUsb3Slave->eEp0NextEvent = EP0_COMPLETE;
+
+ return SOK;
+}
+
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ch 9.4.5,״̬½×¶Î·µ»ØµÄÊý¾Ý
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_Ep0HandleStatusº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ch 9.4.5,״̬½×¶Î·µ»ØµÄÊý¾Ý
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÀàÐÅÏ¢µÄ½á¹¹Ìå
+ * - ptCtrlReq: ±ê×¼ÇëÇóÃüÁî²ÎÊý
+ *
+ * ·µ »Ø Öµ: ÀàÐÍ:u32
+ * - ´íÎóÂë
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static u32 USB3Slave_Ep0HandleStatus(T_USB3Slave_SlaveObj *ptUsb3Slave, T_USB3Slave_CtrlReq *ptCtrlReq)
+{
+ T_USB3Slave_Ep *ptDep;
+ u32 udRetVal,udRecip;
+ u16 uwUsb_status = 0;
+ u16 *puwResponse_pkt;
+ u32 udDirection;
+
+ udRecip = ptCtrlReq->bmRequestType & USB_RECIP_MASK;
+ switch (udRecip)
+ {
+ case USB_RECIP_DEVICE:
+ {
+ /*
+ * We are self-powered. U1/U2/LTM will be set later
+ * once we handle this states. RemoteWakeup is 0 on SS
+ */
+ uwUsb_status |= ptUsb3Slave->udIsSelfPowered << USB_DEVICE_SELF_POWERED;
+ break;
+ }
+ case USB_RECIP_INTERFACE:
+ {
+ /*
+ * Function Remote Wake Capable D0
+ * Function Remote Wakeup D1
+ */
+ break;
+ }
+ case USB_RECIP_ENDPOINT:
+ {
+ ptDep = USB3Slave_GetEpObj(ptUsb3Slave, ptCtrlReq->wIndex);
+ if (!ptDep)
+ return ERR_INVPARAMS;
+ if (ptDep->udFlags & EP_STALL)
+ uwUsb_status = 1 << USB_ENDPOINT_HALT;
+ break;
+ }
+ default:
+ {
+ return ERR_INVPARAMS;
+ }
+ };
+
+ puwResponse_pkt = (u16 *) ptUsb3Slave->aucSetupBuf;
+ *puwResponse_pkt = uwUsb_status;
+
+ ptDep = &(ptUsb3Slave->tEps[0]);
+
+ udDirection = ptDep->udFlags & EP0_DIR_IN;
+
+ if (ptUsb3Slave->eEp0State != EP0_DATA_PHASE) //ÕâÀïµÈ´ýµÄ״̬¿ÉÄÜÓÐÎÊÌ⣬ÓдýÑо¿£¬pxp
+ {
+ return 0;
+ }
+
+ udRetVal = USB3Slave_Ep0StartXfer(ptUsb3Slave, udDirection,
+ (u32)ptUsb3Slave->aucSetupBuf, sizeof(*puwResponse_pkt),
+ TRBCTL_CONTROL_DATA);
+ ptDep->udFlags &= ~(EP_PENDING_REQUEST | EP0_DIR_IN);
+ return udRetVal;
+}
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ÉèÖÃhaltÌØÐÔ
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_EpSetHaltº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ÉèÖÃhaltÌØÐÔ
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptDep: ¶ËµãÐÅÏ¢½á¹¹Ìå
+ * - udValue: 0ʱÇå³ýstallÌØÐÔ£¬1ʱÉèÖÃstallÌØÐÔ
+ *
+ * ·µ »Ø Öµ: ÀàÐÍ:u32
+ * - ´íÎóÂë
+ *
+ * ÆäËû˵Ã÷:
+ * -
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static u32 USB3Slave_EpSetHalt(T_USB3Slave_Ep *ptDep, u32 udValue)
+{
+ T_USB3Slave_EpCmdPara tParams;
+ T_USB3Slave_SlaveObj *pUSB3Slv = &g_USB3Slave;
+ u32 udRetVal;
+
+ memset(&tParams, 0x00, sizeof(tParams));
+
+ if (udValue)
+ {
+ if (0 == ptDep->udEpNum || 1 == ptDep->udEpNum)
+ {
+ /*
+ * Whenever EP0 is stalled, we will restart
+ * the state machine, thus moving back to
+ * Setup Phase
+ */
+ pUSB3Slv->eEp0State = EP0_SETUP_PHASE;
+ }
+ printf("USB3Slave_EpSetHalt");
+// udRetVal = USB3Slave_SendDevEpCmd(pUSB3Slv, ptDep->udEpNum,
+ // USB3Slave_DEPCMD_CLEARSTALL, &tParams);
+ if(((global.need_enum ==0) || (1 == g_USB3Slave.udUSBSate))&&g_needSetStall!=1)
+ {
+ udRetVal = USB3Slave_SendDevEpCmd(pUSB3Slv, ptDep->udEpNum,
+ USB3Slave_DEPCMD_CLEARSTALL, &tParams);
+ }
+ else
+ {
+ g_needSetStall = 0;
+ pUSB3Slv->eEp0NextEvent = EP0_COMPLETE;
+ udRetVal = USB3Slave_SendDevEpCmd(pUSB3Slv, ptDep->udEpNum,
+ USB3Slave_DEPCMD_SETSTALL, &tParams);
+
+ USB3Slave_Ep0StartXfer(pUSB3Slv, 0, (u32)(pUSB3Slv->tCtrlReq), 8,
+ TRBCTL_CONTROL_SETUP);
+ }
+
+ }
+
+ return udRetVal;
+}
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ÉèÖÃep0ÌØÐÔ
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_Ep0HandleFeatureº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ÉèÖÃep0ÌØÐÔ
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢µÄ½á¹¹Ìå
+ * - ptCtrlReq: ±ê×¼ÇëÇóÃüÁî²ÎÊý
+ * - udSet: 1ʱÉèÖÃÌØÐÔ£¬0ʱÇå³ýÌØÐÔ
+ *
+ * ·µ »Ø Öµ: ÀàÐÍ:u32
+ * - ´íÎóÂë
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static u32 USB3Slave_Ep0HandleFeature(T_USB3Slave_SlaveObj *ptUsb3Slave, T_USB3Slave_CtrlReq *ptCtrlReq, u32 udSet)
+{
+ T_USB3Slave_Ep *ptDep;
+ u32 udRecip;
+ u32 udIndex;
+ u32 udRet;
+
+ udIndex = ptCtrlReq->wIndex;
+ udRecip = ptCtrlReq->bmRequestType & USB_RECIP_MASK;
+ switch (udRecip)
+ {
+ case USB_RECIP_ENDPOINT:
+ {
+
+ ptDep = USB3Slave_GetEpObj(ptUsb3Slave, udIndex);
+ if (!ptDep)
+ return ERR_INVPARAMS;
+ udRet = USB3Slave_EpSetHalt(ptDep, udSet);
+ if (udRet)
+ return ERR_INVPARAMS;
+ break;
+ }
+ default:
+ return ERR_INVPARAMS;
+ };
+
+ return SOK;
+}
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ÉèÖÃep0µØÖ·
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_Ep0SetAddrº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ÉèÖÃep0µØÖ·
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - ptCtrlReq: ±ê×¼ÇëÇóÃüÁî²ÎÊý
+ *
+ * ·µ »Ø Öµ: ÀàÐÍ:u32
+ * - ´íÎóÂë
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static u32 USB3Slave_Ep0SetAddr(T_USB3Slave_SlaveObj *ptUsb3Slave, T_USB3Slave_CtrlReq *ptCtrlReq)
+{
+ u32 udAddr;
+ u32 udRegVal;
+
+ udAddr = ptCtrlReq->wValue;
+
+ udRegVal = REG32(ptUsb3Slave->udRegs_base + DWC3_DCFG);
+ udRegVal &= ~(DWC3_DCFG_DEVADDR_MASK);
+ udRegVal |= DWC3_DCFG_DEVADDR(udAddr);
+ REG32(ptUsb3Slave->udRegs_base + DWC3_DCFG) = udRegVal;
+
+ if (udAddr)
+ ptUsb3Slave->eDevState = ADDRESS_STATE;
+ else
+ ptUsb3Slave->eDevState = DEFAULT_STATE;
+
+ return SOK;
+}
+
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief »ñÈ¡É豸ÃèÊö·û£¬ÉèÖÃÃèÊö·ûÁôÓнӿڣ¬µ«Ôݲ»ÊµÏÖ
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_Ep0HandleDescº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - »ñÈ¡É豸ÃèÊö·û£¬ÉèÖÃÃèÊö·ûÁôÓнӿڣ¬µ«Ôݲ»ÊµÏÖ
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - ptCtrlReq: ±ê×¼ÇëÇóÃüÁî²ÎÊý
+ * - udIsSet:
+ *
+ * ·µ »Ø Öµ: ÀàÐÍ:u32
+ * - ´íÎóÂë
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static u32 USB3Slave_Ep0HandleDesc(T_USB3Slave_SlaveObj *ptUsb3Slave, T_USB3Slave_CtrlReq *ptCtrlReq, u32 udIsSet)
+{
+
+ u32 udLen = 0;
+ u32 udDirection = 0;
+ u16 uwValue = ptCtrlReq->wValue;
+ u8 ucIdx =(u8)(ptCtrlReq->wValue &0xff);
+ u32 udRetVal = 0;
+ T_USB3Slave_Ep * ptDep = &ptUsb3Slave->tEps[1];
+ u16 temp = uwValue >> 8;
+
+ if( USB_DT_DEVICE == temp )
+ {
+ udDirection = 1;
+ udLen = MIN(sizeof(dwc_device_descriptor_t), ptCtrlReq->wLength);
+ udRetVal = USB3Slave_Ep0StartXfer(ptUsb3Slave, udDirection,
+ (u32)&device_desc, udLen,
+ TRBCTL_CONTROL_DATA);
+ ptUsb3Slave->eEp0State = EP0_DATA_PHASE;
+
+ }
+ else if( USB_DT_CONFIG == temp)
+ {
+ udDirection = 1;
+ udLen = MIN(sizeof(dwc_config_all_t), ptCtrlReq->wLength);
+ udRetVal = USB3Slave_Ep0StartXfer(ptUsb3Slave, udDirection,
+ (u32)&desc, udLen,
+ TRBCTL_CONTROL_DATA);
+ ptUsb3Slave->eEp0State=EP0_DATA_PHASE;
+
+ }
+ else if( USB_DT_STRING == temp)
+ {
+ udDirection = 1;
+ if(ucIdx > 5)
+ {
+ USB3Slave_EpSetHalt(ptDep,1);
+ }
+ else
+ {
+ udLen = MIN(((dwc_string_descriptor_t*)(pStrDescIdx[ucIdx]))->bLength, ptCtrlReq->wLength);
+ udRetVal = USB3Slave_Ep0StartXfer(ptUsb3Slave, udDirection,
+ (u32)pStrDescIdx[ucIdx], udLen,
+ TRBCTL_CONTROL_DATA);
+ ptUsb3Slave->eEp0State=EP0_DATA_PHASE;
+ }
+
+ }
+
+ else if( USB_DT_DEVICE_QUALIFIER == temp)
+ {
+ udDirection = 1;
+ udLen =MIN(sizeof(dwc_dev_qual_descriptor_t), ptCtrlReq->wLength);
+ udRetVal = USB3Slave_Ep0StartXfer(ptUsb3Slave, udDirection,
+ (u32)&dev_qual_desc, udLen,
+ TRBCTL_CONTROL_DATA);
+ ptUsb3Slave->eEp0State = EP0_DATA_PHASE;
+
+ }
+ else
+
+ {
+ USB3Slave_EpSetHalt(ptDep,1);
+
+ }
+
+ return udRetVal;
+
+}
+
+/*¸Ãº¯Êý¾ßÌåʵÏÖÓдýÌÖÂÛ£¬pxp */
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ÉèÖÃep0ÅäÖÃ
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_Ep0HandleCfgº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ÉèÖÃep0ÅäÖÃ
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - ptCtrlReq: ±ê×¼ÇëÇóÃüÁî²ÎÊý
+ * - udIsSet:
+ *
+ * ·µ »Ø Öµ: ÀàÐÍ:u32
+ * - ´íÎóÂë
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static u32 USB3Slave_Ep0HandleCfg(T_USB3Slave_SlaveObj *ptUsb3Slave, T_USB3Slave_CtrlReq *ptCtrlReq, u32 udIsSet)
+{
+ u32 udCfg;
+ udCfg = ptCtrlReq->wValue;
+
+ if (udIsSet && udCfg)
+ {
+ ptUsb3Slave->eDevState = CONFIGURED_STATE;
+ REG32(ptUsb3Slave->udRegs_base + DWC3_DALEPENA) = 0x3f;
+
+#if SIM_EN == EMULATION
+ REG32(ARM_PORTA)=0x30;
+#endif
+
+ return SOK;
+ }
+ return SOK;
+}
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ep0±ê×¼ÇëÇóÀàÐÍ
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_Ep0Requestº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ep0±ê×¼ÇëÇóÀàÐÍ
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - ptCtrlReq: ±ê×¼ÇëÇóÃüÁî²ÎÊý
+ * -bmRequestType: ¾ö¶¨Êý¾Ý´«Êä·½ÏòºÍ½ÓÊÕÕßÀàÐÍ¡£
+ * -bRequest : ¾ßÌåÇëÇóÀàÐÍ¡£
+ * -wValue : ×Ö³¤Óò,¸ù¾Ý²»Í¬µÄÇëÇóº¬Òå¸Ä±ä
+ * -wIndex : ×Ö³¤Óò,¸ù¾Ý²»Í¬µÄÇëÇóº¬Òå¸Ä±ä.µäÐÍÓÃÓÚ´«ËÍË÷Òý»òÆ«ÒÆ.
+ * -wLength : ÈçÓÐÊý¾Ý´«Ëͽ׶Î,´ËΪÊý¾Ý×Ö½ÚÊý.
+ * ·µ »Ø Öµ: ÀàÐÍ:u32
+ * - ´íÎóÂë
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static u32 USB3Slave_Ep0Request(T_USB3Slave_SlaveObj *ptUsb3Slave, T_USB3Slave_CtrlReq *ptCtrlReq)
+{
+ u32 udRet = 0;
+ T_USB3Slave_Ep *ptDep0 = 0;
+ u8 temp = 0;
+ //tj Ôö¼ÓÅжÏbmRequestTypeÊÇ·ñΪ±ê×¼ÃüÁÈç¹û²»ÊÇ£¬Ö±½Ó»Østall
+ if(UT_GET_TYPE(ptCtrlReq->bmRequestType)!=UT_STANDARD)
+ {
+ ptDep0 = USB3Slave_GetEpObj(ptUsb3Slave,ptCtrlReq->wIndex);
+ USB3Slave_EpSetHalt(ptDep0, 1);
+ printf"command err.\n");
+ return 1;
+ }
+ temp = ptCtrlReq->bRequest;
+ if( USB_REQ_GET_STATUS == temp)
+
+ {
+ printf("USB_REQ_GET_STATUS\n");
+ udRet = USB3Slave_Ep0HandleStatus(ptUsb3Slave, ptCtrlReq);
+
+ }
+ else if(USB_REQ_CLEAR_FEATURE == temp)
+ {
+ printf("USB_REQ_CLEAR_FEATURE\n");
+// udRet = USB3Slave_Ep0HandleFeature(ptUsb3Slave, ptCtrlReq, 0);
+ udRet = USB3Slave_Ep0HandleFeature(ptUsb3Slave, ptCtrlReq, 1);
+
+ }
+ else if( USB_REQ_SET_ADDRESS == temp)
+ {
+
+ printf("USB_REQ_SET_ADDRESS\n");
+ udRet = USB3Slave_Ep0SetAddr(ptUsb3Slave, ptCtrlReq);
+
+ }
+ else if( USB_REQ_GET_DESCRIPTOR == temp)
+ {
+ printf("USB_REQ_GET_DESCRIPTOR\n");
+ udRet = USB3Slave_Ep0HandleDesc(ptUsb3Slave, ptCtrlReq,0);
+
+ }
+ else if( USB_REQ_SET_CONFIGURATION == temp)
+ {
+
+ printf("USB_REQ_SET_CONFIGURATION\n");
+ udRet = USB3Slave_Ep0HandleCfg(ptUsb3Slave, ptCtrlReq,1);
+
+ }
+ else
+ {
+
+ printf("USB3Slave_EpSetHalt\n");
+ USB3Slave_EpSetHalt(ptDep0, 1);
+ }
+
+
+ return udRet;
+}
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ep0 setup ½×¶Î
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_Ep0InspectSetupº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ep0 setup ½×¶Î
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - ptEpEvt: ¶ËµãÀàÐÍʼþ
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_Ep0InspectSetup(T_USB3Slave_SlaveObj *ptUsb3Slave,
+ const T_USB3Slave_EpEvt *ptEpEvt)
+{
+ u32 udRetVal = 0;
+ u16 uwLen = 0;
+ T_USB3Slave_CtrlReq *ptCtrlReq = (ptUsb3Slave->tCtrlReq);
+
+ uwLen = ptCtrlReq->wLength;
+ /*Èç¹ûÊý¾Ý³¤¶ÈΪ0£¬±íʾûÓÐÊý¾Ý½×¶Î,Á½¸ö½×¶Î£¬Èç¹ûÓÐÊý¾Ý½×¶Î£¬Èý¸ö½×¶Î*/
+ if (!uwLen)
+ {
+ ptUsb3Slave->udThreeStageSetup = FALSE;
+ ptUsb3Slave->udEp0ExpectIn = FALSE;
+ ptUsb3Slave->eEp0NextEvent = EP0_NRDY_STATUS;
+ }
+ else
+ {
+ ptUsb3Slave->udThreeStageSetup = TRUE;
+ ptUsb3Slave->udEp0ExpectIn = !!(ptCtrlReq->bmRequestType & USB_DIR_IN);
+ ptUsb3Slave->eEp0NextEvent = EP0_NRDY_DATA;
+ }
+ printf("USB3Slave_Ep0Request\n");
+ udRetVal = USB3Slave_Ep0Request(ptUsb3Slave,ptCtrlReq);
+
+ if (udRetVal == USB_GADGET_DELAYED_STATUS)
+ ptUsb3Slave->udDelayedStatus = TRUE;
+ }
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ep0 data½×¶Î
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_Ep0CmpltDataº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ep0 data½×¶Î
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - ptEpEvt: ¶ËµãÀàÐÍʼþ
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_Ep0CmpltData(T_USB3Slave_SlaveObj *ptUsb3Slave,
+ const T_USB3Slave_EpEvt *ptEpEvt)
+{
+ /*bootÀïÃæÃ»ÓеȺò¶ÓÁУ¬ÕâÀïÔݲ»×öÈκδ¦Àí*/
+}
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ep0 status ½×¶Î£¬½áÊø±¾´Î¿ØÖÆ´«Ê䣬״̬»Ø¹é
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_Ep0CmpltRequestº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ep0 status ½×¶Î£¬½áÊø±¾´Î¿ØÖÆ´«Ê䣬״̬»Ø¹é
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - ptEpEvt: ¶ËµãÀàÐÍʼþ
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_Ep0CmpltRequest(T_USB3Slave_SlaveObj *ptUsb3Slave,
+ const T_USB3Slave_EpEvt *ptEpEvt)
+{
+ if(ptUsb3Slave->eDevState == CONFIGURED_STATE)
+ {
+ ptUsb3Slave->udUSBSate = 1;
+#if SIM_EN == EMULATION
+ REG32(ARM_PORTA)=0x31;
+#endif
+
+ }
+ ptUsb3Slave->eEp0State = EP0_SETUP_PHASE;
+ USB3Slave_Ep0StartXfer(ptUsb3Slave, 0, (u32)(ptUsb3Slave->tCtrlReq), 8,
+ TRBCTL_CONTROL_SETUP);
+
+}
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ´¦Àíxfercompleteʼþ
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_Ep0XferCmpltº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ´¦Àíxfercompleteʼþ
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - ptEpEvt: ¶ËµãÀàÐÍʼþ
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+/*´¦Àíxfercompleteʼþ*/
+static void USB3Slave_Ep0XferCmplt(T_USB3Slave_SlaveObj *ptUsb3Slave,
+ const T_USB3Slave_EpEvt *ptEpEvt)
+{
+ T_USB3Slave_Ep *ptDep = &(ptUsb3Slave->tEps[ptEpEvt->udEndpoint_number]);
+
+ ptDep->udFlags &= ~EP_BUSY;
+ ptUsb3Slave->udSetupPacketPending = 0;
+ switch (ptUsb3Slave->eEp0State)
+ {
+ case EP0_SETUP_PHASE:
+ {
+ USB3Slave_Ep0InspectSetup(ptUsb3Slave, ptEpEvt);
+ break;
+ }
+ case EP0_DATA_PHASE:
+ {
+ USB3Slave_Ep0CmpltData(ptUsb3Slave, ptEpEvt);
+ break;
+ }
+ case EP0_STATUS_PHASE:
+ {
+ USB3Slave_Ep0CmpltRequest(ptUsb3Slave, ptEpEvt);
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+}
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ¿ªÊ¼´«Ê䣬¿ØÖƽ¨Á¢½×¶Î
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_Ep0OutStartº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ¿ªÊ¼´«Ê䣬¿ØÖƽ¨Á¢½×¶ÎµÄͨÓýӿÚ
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ * ÆäËû˵Ã÷:
+ * -
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_Ep0OutStart(T_USB3Slave_SlaveObj *ptUsb3Slave)
+{
+ USB3Slave_Ep0StartXfer(ptUsb3Slave, 0, (u32)(ptUsb3Slave->tCtrlReq), 8,
+ TRBCTL_CONTROL_SETUP);
+
+}
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ¿ØÖƽ¨Á¢½×¶ÎͨÓýӿÚ
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_Ep0DoCtrlSetupº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ¿ØÖƽ¨Á¢½×¶ÎͨÓýӿÚ
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - ptEpEvt: ¶ËµãÀàÐÍʼþ
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_Ep0DoCtrlSetup(T_USB3Slave_SlaveObj *ptUsb3Slave,
+ const T_USB3Slave_EpEvt *ptEpEvt)
+{
+ USB3Slave_Ep0OutStart(ptUsb3Slave);
+}
+
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ¿ØÖÆ×´Ì¬½×¶Î£¬¿ªÊ¼´«Ê䣬ÕÙ»½¶Ëµã½á¹¹Ìå½øÐд¦Àí
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_Ep0DoCtrlStatusº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ¿ØÖÆ×´Ì¬½×¶Î£¬¿ªÊ¼´«Ê䣬ÕÙ»½¶Ëµã½á¹¹Ìå½øÐд¦Àí
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - udEpnum: ¶ËµãºÅ
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_Ep0DoCtrlStatus(T_USB3Slave_SlaveObj *ptUsb3Slave, u32 udEpnum)
+{
+ u32 udType;
+ T_USB3Slave_Ep *ptDep = &(ptUsb3Slave->tEps[udEpnum]);
+ /* È·¶¨¿ØÖÆ´«ÊäµÄ״̬ÀàÐÍ */
+ udType = ptUsb3Slave->udThreeStageSetup ? TRBCTL_CONTROL_STATUS3
+ : TRBCTL_CONTROL_STATUS2;
+ /* ·¢Æð¿ªÊ¼´«ÊäÃüÁµÈ´ýÖжϲúÉú */
+ USB3Slave_Ep0StartXfer(ptUsb3Slave, ptDep->udEpNum,
+ (u32)(ptUsb3Slave->tCtrlReq), 0, udType);
+}
+
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ¿ØÖÆÊý¾Ý½×¶Î
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_Ep0DoCtrlDataº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ¿ØÖÆÊý¾Ý½×¶Î
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - ptEpEvt: ¶ËµãÀàÐÍʼþ
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_Ep0DoCtrlData(T_USB3Slave_SlaveObj *ptUsb3Slave,
+ const T_USB3Slave_EpEvt *ptEpEvt)
+{
+ if (ptEpEvt->udEndpoint_number)
+ ptUsb3Slave->tEps[ptEpEvt->udEndpoint_number].udFlags |= EP0_DIR_IN;
+
+ /* linuxÇý¶¯ÀﻹÊÇÈ¥ÅжÏÇëÇó¶ÓÁÐÊÇ·ñΪ¿Õ½øÐд¦Àí£¬ÂãÇýûÓÐÇëÇó¶ÓÁУ¬ÏÈ·Å×Å */
+
+}
+
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ´¦Àíxfernotreadyʼþ
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_Ep0XferNotReadyº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ´¦Àíxfernotreadyʼþ
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - ptEpEvt: ¶ËµãÀàÐÍʼþ
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_Ep0XferNotReady(T_USB3Slave_SlaveObj *ptUsb3Slave,
+ const T_USB3Slave_EpEvt *ptEpEvt)
+{
+ u8 usb3Event = 0;
+ T_USB3Slave_Ep * ptDep = &ptUsb3Slave->tEps[0];
+ ptUsb3Slave->udSetupPacketPending = 1;
+ /*
+ * This part is very tricky: If we has just handled
+ * XferNotReady(Setup) and we're now expecting a
+ * XferComplete but, instead, we receive another
+ * XferNotReady(Setup), we should STALL and restart
+ * the state machine.
+ *
+ * In all other cases, we just continue waiting
+ * for the XferComplete event.
+ *
+ * We are a little bit unsafe here because we're
+ * not trying to ensure that last event was, indeed,
+ * XferNotReady(Setup).
+ *
+ * Still, we don't expect any condition where that
+ * should happen and, even if it does, it would be
+ * another error condition.
+ */
+ /*
+ if ((1 == ptUsb3Slave->udEventsequence) && (EP0_COMPLETE == ptUsb3Slave->eEp0NextEvent))
+ {
+ switch (ptEpEvt->EventStatus)
+ {
+ case DEPEVT_STATUS_CONTROL_SETUP:
+ {
+ IC_DBG(IC_DEBUG_INFO, "Unexpected XferNotReady(Setup)\n");
+ break;
+ }
+ case DEPEVT_STATUS_CONTROL_DATA:
+ {
+ IC_DBG(IC_DEBUG_INFO, "DEPEVT_STATUS_CONTROL_DATA: XferNotReady\n");
+ break;
+ }
+ case DEPEVT_STATUS_CONTROL_STATUS:
+ break;
+ default:
+ IC_DBG(IC_DEBUG_INFO, "Uwaiting for XferComplete\n");
+ }
+ return;
+ }
+ */
+ usb3Event = (u8)(ptEpEvt->EventStatus);
+ if (DEPEVT_STATUS_CONTROL_SETUP == usb3Event)
+ {
+ printf("USB3Slave event DEPEVT_STATUS_CONTROL_SETUP\n");
+ ptUsb3Slave->eEp0State = EP0_SETUP_PHASE;
+ USB3Slave_Ep0DoCtrlSetup(ptUsb3Slave, ptEpEvt);
+ }
+ else if (DEPEVT_STATUS_CONTROL_DATA == usb3Event)
+ {
+ printf("USB3Slave event DEPEVT_STATUS_CONTROL_DATA\n");
+ if ( ptUsb3Slave->eEp0NextEvent == EP0_COMPLETE)
+ {
+ return;
+ }
+ ptUsb3Slave->eEp0State = EP0_DATA_PHASE;
+ USB3Slave_Ep0DoCtrlData(ptUsb3Slave, ptEpEvt);
+ }
+ else if (DEPEVT_STATUS_CONTROL_STATUS == usb3Event)
+ {
+ printf("USB3Slave event DEPEVT_STATUS_CONTROL_STATUS\n");
+ ptUsb3Slave->eEp0State = EP0_STATUS_PHASE;
+ USB3Slave_Ep0DoCtrlStatus(ptUsb3Slave, ptEpEvt->udEndpoint_number);
+ }
+ else if (DEPEVT_STATUS_STATUS_SETUP == usb3Event)
+ {
+ printf("USB3Slave event DEPEVT_STATUS_STATUS_SETUP\n");
+ g_needSetStall = 1;
+ USB3Slave_EpSetHalt(ptDep,1);
+ }
+ else
+ {
+ g_debugFaultVal = ptEpEvt->EventStatus;
+ printf("USB3Slave event default\n");
+ }
+}
+
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ´¦Àíep0¿ØÖÆÖжÏ
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_Ep0ISRº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ´¦Àí¿ØÖÆÖжÏ
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - ptEpEvt: ¶ËµãÀàÐÍʼþ
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ * ÆäËû˵Ã÷:
+ * -
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_Ep0ISR(T_USB3Slave_SlaveObj *ptUsb3Slave, T_USB3Slave_EpEvt *ptEpEvt)
+{
+ switch (ptEpEvt->udEndpoint_event)
+ {
+ case DEPEVT_XFERCOMPLETE:
+ {
+ USB3Slave_Ep0XferCmplt(ptUsb3Slave, ptEpEvt);
+ break;
+ }
+ case DEPEVT_XFERNOTREADY:
+ {
+ USB3Slave_Ep0XferNotReady(ptUsb3Slave, ptEpEvt);
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ָʾ´«ÊäÍê³É
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_EpXferCmpltº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ָʾ´«ÊäÍê³É
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - ptDep: ¶ËµãÐÅÏ¢½á¹¹Ìå
+ * - ptEpEvt: ¶ËµãÀàÐÍʼþ
+ * - udStart_new:
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_EpXferCmplt(T_USB3Slave_SlaveObj *ptUsb3Slave,
+ T_USB3Slave_Ep *ptDep, const T_USB3Slave_EpEvt *ptEpEvt,u32 udStart_new)
+{
+
+ u32 udXfercount;
+ T_USB3Slave_TRB *tTrbBit;
+
+ tTrbBit = (T_USB3Slave_TRB *)ptDep->ptTRB ;
+ udXfercount = ptDep->udLen - tTrbBit->len_pcm.bit.BUFSIZ;
+
+ if((0x0 == ptDep->udDirection) && (0x2 == ptDep->ucType))
+ ptUsb3Slave->eDevState = BULKOUT_CMPL;
+ if((0x1 == ptDep->udDirection) && (0x2 == ptDep->ucType))
+ ptUsb3Slave->eDevState = BULKIN_CMPL;
+
+ ptDep->udFlags &= ~EP_BUSY;
+ ptDep->ucResTransIdx = 0;
+
+
+ if(ptDep->fnUsbCb)
+ ptDep->fnUsbCb((u32)(ptDep->pPara), 0, udXfercount, ptDep->udLen);
+}
+
+static void USB3Slave_Init_TRB(T_USB3Slave_Ep *ptDep)
+{
+ T_USB3Slave_TRBToHW *ptTrbRaw;
+ T_USB3Slave_TRB tTrbBit;
+
+ ptTrbRaw = ptDep->ptTRB;
+
+ memset(&tTrbBit, 0, sizeof(tTrbBit));
+
+ tTrbBit.control.bit.CHN = 0;
+ tTrbBit.control.bit.LST = 1;
+ tTrbBit.control.bit.TRBCTL = TRBCTL_NORMAL;
+ tTrbBit.control.bit.HWO = 1;
+
+ tTrbBit.len_pcm.bit.BUFSIZ = ptDep->udLen;
+
+ tTrbBit.bplh=(u64)(ptDep->pudAddrData);
+
+
+ USB3Slave_TrbToHW(&tTrbBit, ptTrbRaw);
+}
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ÆÕͨ¶Ëµã½øÐÐÊý¾Ý´«Êä
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_EpStartXferº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ÆÕͨ¶Ëµã½øÐÐÊý¾Ý´«Êä
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptDep: ¶ËµãÐÅÏ¢½á¹¹Ìå
+ * - uwCmd_param: ÃüÁî²ÎÊý
+ * - udStart_new:
+ *
+ * ·µ »Ø Öµ: ÀàÐÍ:INT
+ * - ´íÎóÂë
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+/*ÆÕͨ¶Ëµã½øÐÐÊý¾Ý´«Êä*/
+static u32 USB3Slave_EpStartXfer(T_USB3Slave_Ep *ptDep, u16 uwCmd_param,
+ u32 udStart_new)
+{
+ T_USB3Slave_EpCmdPara tParams;
+ T_USB3Slave_SlaveObj *pUSB3Slv = &g_USB3Slave;
+ u32 udCmd;
+
+ USB3Slave_Init_TRB(ptDep); //ÅäÖÃTRB
+ memset(&tParams, 0, sizeof(tParams));
+
+ tParams.Parameter0 = 0; /*trb¸ß32λµØÖ·£¬Ä¬ÈÏΪ0*/
+ tParams.Parameter1 = (u32)((u32)(ptDep->ptTRB)& (u32)0xFFFFFFFF);/* ys */
+
+ if (udStart_new)
+ udCmd = USB3Slave_DEPCMD_STARTTRANSFER;
+ else
+ udCmd = USB3Slave_DEPCMD_UPDATETRANSFER;
+
+ udCmd |= USB2Slave_DEPCMD_PARAM(uwCmd_param); //0
+
+ USB3Slave_SendDevEpCmd(pUSB3Slv, ptDep->udEpNum, udCmd, &tParams);
+
+ return SOK;
+}
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ¶ËµãÀàÐ͵ÄeventÖжϴ¦Àí³ÌÐò
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_EpISRº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ¶ËµãÀàÐ͵ÄeventÖжϴ¦Àí³ÌÐò
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - ptEpEvt: ¶ËµãÀàÐÍʼþ
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_EpISR(T_USB3Slave_SlaveObj *ptUsb3Slave, T_USB3Slave_EpEvt *ptEpEvt)
+{
+ T_USB3Slave_Ep *ptDep;
+
+ u8 ucEpnum = ptEpEvt->udEndpoint_number;
+
+ ptDep = &(ptUsb3Slave->tEps[ucEpnum]);
+
+ if (0 == ucEpnum || 1 == ucEpnum)
+ {
+ USB3Slave_Ep0ISR(ptUsb3Slave, ptEpEvt);
+ return;
+ }
+
+ switch (ptEpEvt->udEndpoint_event)
+ {
+ case DEPEVT_XFERCOMPLETE:
+ {
+ USB3Slave_EpXferCmplt(ptUsb3Slave, ptDep, ptEpEvt, 1);
+ break;
+ }
+ default:
+ break;
+ }
+
+}
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief É豸¸´Î»Öжϴ¦Àí
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_ResetISRº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - É豸¸´Î»Öжϴ¦Àí
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_ResetISR(T_USB3Slave_SlaveObj *ptUsb3Slave)
+{
+ u32 udRegVal;
+
+ printf("R");
+//tangjian:±êÖ¾usbÁ¬½Ó
+ global.g_Connet = 1;
+
+/* Reset device address to zero */
+ udRegVal = REG32(ptUsb3Slave->udRegs_base + DWC3_DCFG);
+ udRegVal &= ~(0x7f<<3);
+ REG32(ptUsb3Slave->udRegs_base + DWC3_DCFG) = udRegVal;
+
+}
+
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief »ñÈ¡usb 3.0×ÜÏßʱÖÓ
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_UpdateRamClkSelº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - »ñÈ¡usb 3.0×ÜÏßʱÖÓ
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - ucSpeed: ָʾÁ¬½ÓËÙ¶È
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_UpdateRamClkSel(T_USB3Slave_SlaveObj *ptUsb3Slave, u32 ucSpeed)
+{
+ u32 udRegVal;
+ /*
+ * RAMClkSel is reset to 0 after USB reset, so it must be reprogrammed
+ * each time on Connect Done.
+ */
+
+ /* ÅäÖÃGCTL¼Ä´æÆ÷,sel bus = 0*/
+ udRegVal = REG32(ptUsb3Slave->udRegs_base + DWC3_GCTL);
+ udRegVal &= ~(0x3<<6);
+ REG32(ptUsb3Slave->udRegs_base + DWC3_GCTL) = udRegVal;
+}
+
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief É豸Á¬½ÓÖжϴ¦Àí
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_ConnectdoneISR º¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - É豸Á¬½ÓÖжϴ¦Àí
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÀàÐÅÏ¢½á¹¹Ìå
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_ConnectdoneISR(T_USB3Slave_SlaveObj *ptUsb3Slave)
+{
+ T_USB3Slave_Ep *ptDep;
+ u32 udRegVal;
+ u8 ucSpeed;
+
+ printf("D");
+
+
+ udRegVal = REG32(ptUsb3Slave->udRegs_base + DWC3_DSTS);
+ ucSpeed = udRegVal&0x7;
+
+ ptUsb3Slave->ucSpeed = ucSpeed;
+ USB3Slave_UpdateRamClkSel(ptUsb3Slave, ucSpeed);
+ if(USB3_HIGHSPEED == ucSpeed)
+ {
+
+ printf("2");
+ ptUsb3Slave->tEps[2].udMaxPacket = 512;
+ ptUsb3Slave->tEps[3].udMaxPacket = 512;
+ ptUsb3Slave->tEps[4].udMaxPacket = 512;
+ ptUsb3Slave->tEps[5].udMaxPacket = 512;
+ ptUsb3Slave->eDeviceSpeedType = USB30_SPEED_HIGH;
+ desc.atTxEP[0].wMaxPacketSize = USB_HIGHSPEED_BULK_MAXSIZE;
+ desc.atRxEP[0].wMaxPacketSize = USB_HIGHSPEED_BULK_MAXSIZE;
+ desc.atTxEP1[0].wMaxPacketSize = USB_HIGHSPEED_BULK_MAXSIZE;
+ desc.atRxEP1[0].wMaxPacketSize = USB_HIGHSPEED_BULK_MAXSIZE;
+ }
+ else if(USB3_FULLSPEED == ucSpeed)
+ {
+
+ printf("1");
+ ptUsb3Slave->tEps[2].udMaxPacket = 64;
+ ptUsb3Slave->tEps[3].udMaxPacket = 64;
+ ptUsb3Slave->tEps[4].udMaxPacket = 64;
+ ptUsb3Slave->tEps[5].udMaxPacket = 64;
+ ptUsb3Slave->eDeviceSpeedType = USB30_SPEED_FULL;
+ desc.atTxEP[0].wMaxPacketSize = USB_FULLSPEED_BULK_MAXSIZE;
+ desc.atRxEP[0].wMaxPacketSize = USB_FULLSPEED_BULK_MAXSIZE;
+ desc.atTxEP1[0].wMaxPacketSize = USB_FULLSPEED_BULK_MAXSIZE;
+ desc.atRxEP1[0].wMaxPacketSize = USB_FULLSPEED_BULK_MAXSIZE;
+ }
+//tangjian:ÉèÖÃep0µÄ¶ËµãÐÅÏ¢
+
+ ptDep = &(ptUsb3Slave->tEps[0]);
+ USB3Slave_SetEpCfgCmd(ptUsb3Slave, ptDep);
+ ptDep = &(ptUsb3Slave->tEps[1]);
+ USB3Slave_SetEpCfgCmd(ptUsb3Slave, ptDep);
+
+#if SIM_EN == EMULATION
+
+ REG32(REG_GPIO_OUT)=5;
+// while(REG32(REG_GPIO_IN)!=0xFF);
+ usdelay(1);
+ REG32(REG_GPIO_OUT)=0;
+
+ REG32(REG_GPIO_OUT)=6;
+// while(REG32(REG_GPIO_IN)!=0xFF);
+ usdelay(1);
+ REG32(REG_GPIO_OUT)=0;
+
+ REG32(REG_GPIO_OUT)=7;
+// while(REG32(REG_GPIO_IN)!=0xFF);
+ usdelay(1);
+ REG32(REG_GPIO_OUT)=0;
+
+ REG32(REG_GPIO_OUT)=8;
+// while(REG32(REG_GPIO_IN)!=0xFF);
+ usdelay(1);
+ REG32(REG_GPIO_OUT)=0;
+
+#endif
+
+
+}
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief É豸Öжϴ¦Àí(¶Ï¿ª¡¢¸´Î»¡¢Á¬½Ó¡¢»½ÐÑ¡¢Á¬½Ó״̬¸Ä±ä¡¢EOPF¡¢ÃüÁîÍê³É¡¢Òç³ö¡¢´íÎó)
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_DevISRº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - É豸Öжϴ¦Àí(¶Ï¿ª¡¢¸´Î»¡¢Á¬½Ó¡¢»½ÐÑ¡¢Á¬½Ó״̬¸Ä±ä¡¢EOPF¡¢ÃüÁîÍê³É¡¢Òç³ö¡¢´íÎó)
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - ptDevEvt: É豸ÀàÐÍʼþ
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+
+static void USB3Slave_DevISR(T_USB3Slave_SlaveObj *ptUsb3Slave, const T_USB3Slave_DevEvt *ptDevEvt)
+{
+ switch (ptDevEvt->udType)
+ {
+ case DEVICE_EVENT_RESET:
+ {
+ USB3Slave_ResetISR(ptUsb3Slave);
+ break;
+ }
+ case DEVICE_EVENT_CONNECT_DONE:
+ {
+ USB3Slave_ConnectdoneISR(ptUsb3Slave);
+ break;
+ }
+ case DEVICE_EVENT_EOPF:
+ {
+ printf("S");
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ´¦Àí²»Í¬µÄÖжϺ¯ÊýÈë¿Ú
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_ProcessEvtEntryº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ´¦Àí²»Í¬µÄÖжϺ¯ÊýÈë¿Ú
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - ptEvt: ±íʾevent buffer ÄÚÈÝ
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_ProcessEvtEntry(T_USB3Slave_SlaveObj *ptUsb3Slave, T_USB3Slave_Event *ptEvt)
+{
+ /* Endpoint IRQ, handle it and return early */
+ /*0bit 0ÊÇÉ豸¶ËµãÖÐ¶Ï 1ÊÇÉ豸ÖжÏ*/
+ if (0 == ptEvt->tType.udIs_devspec)
+ USB3Slave_EpISR(ptUsb3Slave, &ptEvt->tEpEvt); /* tDepevt */
+ else
+ USB3Slave_DevISR(ptUsb3Slave, &ptEvt->tDevEvt);
+}
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ´¦Àíevent buffer ÖеÄevent,·Ö·¢²»Í¬event bufferÖмǼµÄÖжϣ¬ÔÙµ÷ÓÃÕæÕýµÄÖжÏÈë¿Ú³ÌÐò
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_ProcessEvtBufº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ´¦Àíevent buffer ÖеÄevent,·Ö·¢²»Í¬event bufferÖмǼµÄÖжϣ¬ÔÙµ÷ÓÃÕæÕýµÄÖжÏÈë¿Ú³ÌÐò
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ * - udBufNum: ±íʾevent bufferÖÐij¸öevent
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_ProcessEvtBuf(T_USB3Slave_SlaveObj *ptUsb3Slave, u32 udBufNum)
+{
+ T_USB3Slave_EventBuf *ptevt;
+ T_USB3Slave_Event ptEvt;
+ u32 udLeft;
+ u32 udCount;
+
+//step0:ÔÚÖжϴ¦Àíº¯ÊýÖлñÈ¡event count£¬À´ÅжÏÓм¸¸öʼþ£¬²¢×÷ÏàÓ¦µÄ´¦Àí
+ udCount = REG32((ptUsb3Slave->udRegs_base + GEVNTCOUNT(udBufNum)));
+ if(!udCount)
+ return;
+ ptevt = ptUsb3Slave->ptEvtBuffs;
+ udLeft = udCount;
+ ptUsb3Slave->udEventsequence = 1;/* ys */
+//step1:´¦ÀíÏàÓ¦µÄʼþ
+ while (udLeft > 0)
+ {
+ ptEvt.udRaw = ptevt->EvtBuf[ptevt->udLpos];
+
+ USB3Slave_ProcessEvtEntry(ptUsb3Slave, &ptEvt);
+ /*
+ * XXX we wrap around correctly to the next entry as almost all
+ * entries are 4 bytes in size. There is one entry which has 12
+ * bytes which is a regular entry followed by 8 bytes data. ATM
+ * I don't know how things are organized if were get next to the
+ * a boundary so I worry about that once we try to handle that.
+ */
+ ptevt->udLpos = (ptevt->udLpos + 1) % EVENT_BUFFERS_SIZE;
+ udLeft -= 4;
+ ptUsb3Slave->udEventsequence++;
+ }
+
+ /*When read, returns the number of valid events in the Event Buffer (in bytes).
+ When written, hardware decrements the count by the value written.
+ The interrupt line remains high when count is not 0.*/
+ REG32(ptUsb3Slave->udRegs_base + GEVNTCOUNT(udBufNum)) = udCount;
+}
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ÖжÏÈë¿Úº¯Êý
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_ISRº¯ÊýÊôÓÚ½Ó¿Úº¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ÖжÏÈë¿Úº¯Êý
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - udIntNo: ÖжϺÅ
+ * - udPara: ÖжϲÎÊý
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ * ÆäËû˵Ã÷:
+ * -
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+void USB3Slave_ISR(u32 udIntNo,u32 udPara)
+{
+ T_USB3Slave_SlaveObj *pUSB3Slv = &g_USB3Slave;
+ u32 udIndex ;
+
+ for (udIndex = 0; udIndex < pUSB3Slv->udNumEvtBufs; udIndex++)
+ {
+ USB3Slave_ProcessEvtBuf(pUSB3Slv,udIndex);
+ }
+
+}
+
+/*³õʼ»¯ÓÃÓڼǼÉ豸ËùÓÐÐÅÏ¢µÄÈ«¾Ö½á¹¹Ìå*/
+/*Ò»´ÎÐÔд²»ÍêÕû£¬ ÔÚ´úÂë²¹³äµÄ¹ý³ÌÖÐÂýÂýÌí¼Ó*/
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ³õʼ»¯È«¾Ö½á¹¹ÌåptUsb3Slave
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_Initº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ³õʼ»¯½á¹¹ÌåÄÚÈ«¾Ö±äÁ¿
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ * ÆäËû˵Ã÷:
+ * -
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_Init(T_USB3Slave_SlaveObj *ptUsb3Slave)
+{
+ T_USB3Slave_HWPARAMS *parms = &ptUsb3Slave->tHwParams;
+
+ gp_USB3Slave_EventBuf = &USB3Slave_EventBuf;
+ ptUsb3Slave->udRegs_base = SYS_USB_BASE;
+ ptUsb3Slave->eSpeedMode = USB3_HIGHSPEED;
+
+ parms->udHwparams0 = REG32(ptUsb3Slave->udRegs_base + GHWPARAMS0);
+ parms->udHwparams1 = REG32(ptUsb3Slave->udRegs_base + GHWPARAMS1);
+ parms->udHwparams2 = REG32(ptUsb3Slave->udRegs_base + GHWPARAMS2);
+ parms->udHwparams3 = REG32(ptUsb3Slave->udRegs_base + GHWPARAMS3);
+ parms->udHwparams4 = REG32(ptUsb3Slave->udRegs_base + GHWPARAMS4);
+ parms->udHwparams5 = REG32(ptUsb3Slave->udRegs_base + GHWPARAMS5);
+ parms->udHwparams6 = REG32(ptUsb3Slave->udRegs_base + GHWPARAMS6);
+ parms->udHwparams7 = REG32(ptUsb3Slave->udRegs_base + GHWPARAMS7);
+ parms->udHwparams8 = REG32(ptUsb3Slave->udRegs_base + GHWPARAMS8);
+
+ ptUsb3Slave->udNumEvtBufs = (parms->udHwparams1&(0x3f<<15))>>15; //»ñÈ¡event_int_num
+// if(global.need_enum ==0)
+ {
+ gp_USB3Slave_EventBuf->udLength = EVENT_BUFFERS_SIZE*4;
+ gp_USB3Slave_EventBuf->udLpos = 0;
+ }
+
+ ptUsb3Slave->ptEvtBuffs = gp_USB3Slave_EventBuf;
+
+ ptUsb3Slave->tCtrlReq = &pCtrlReq;
+}
+
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ¼Ç¼event bufferµØÖ·µ½¿ØÖÆÆ÷¼Ä´æÆ÷ÖÐ
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_EvtBufSetupº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ¼Ç¼event bufferµØÖ·µ½¿ØÖÆÆ÷¼Ä´æÆ÷ÖÐ
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ *
+ * ·µ »Ø Öµ: ÀàÐÍ:INT
+ * - ´íÎóÂë
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_EvtBufSetup(T_USB3Slave_SlaveObj *ptUsb3Slave)
+{
+ T_USB3Slave_EventBuf *ptevt;
+ u32 udIndex = 0;
+ u32 udTemp_data;/*ÓÃÀ´±£´æµØÖ·µÄ*/
+
+ ptevt = ptUsb3Slave->ptEvtBuffs;
+ udTemp_data = (u32)&ptevt->EvtBuf;
+ REG32(ptUsb3Slave->udRegs_base + GEVNTADRLO(udIndex)) = udTemp_data;
+ REG32(ptUsb3Slave->udRegs_base + GEVNTADRHI(udIndex)) = 0;
+ REG32(ptUsb3Slave->udRegs_base + GEVNTSIZ(udIndex)) = ptevt->udLength & 0xffff;
+ REG32(ptUsb3Slave->udRegs_base + GEVNTCOUNT(udIndex)) = ptevt->udLpos;
+}
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ¼Ç¼event bufferµØÖ·µ½¿ØÖÆÆ÷¼Ä´æÆ÷ÖÐ
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_EvtBufSetupº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ¼Ç¼event bufferµØÖ·µ½¿ØÖÆÆ÷¼Ä´æÆ÷ÖÐ
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ *
+ * ·µ »Ø Öµ: ÀàÐÍ:INT
+ * - ´íÎóÂë
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+
+static void USB3Slave_EvtBufRestore(T_USB3Slave_SlaveObj *ptUsb3Slave)
+{
+ /*T_USB3Slave_EventBuf *ptevt;
+ u32 udIndex = 0;
+ u32 udTemp_data;
+ ptevt = ptUsb3Slave->ptEvtBuffs;
+ udTemp_data = (u32)&ptevt->EvtBuf;
+ REG32(ptUsb3Slave->udRegs_base + GEVNTADRLO(udIndex)) = udTemp_data;
+ REG32(ptUsb3Slave->udRegs_base + GEVNTADRHI(udIndex)) = 0;
+ REG32(ptUsb3Slave->udRegs_base + GEVNTSIZ(udIndex)) = ptevt->udLength & 0xffff;
+ REG32(ptUsb3Slave->udRegs_base + GEVNTCOUNT(udIndex)) = ptevt->udLpos;*/
+ u32 udRegVal;
+ u8 ucSpeed;
+
+ T_USB3Slave_EventBuf *ptevt;
+ u32 udIndex = 0;
+ ptevt = ptUsb3Slave->ptEvtBuffs;
+ ptUsb3Slave->ptEvtBuffs = (T_USB3Slave_EventBuf *)(REG32(ptUsb3Slave->udRegs_base + GEVNTADRLO(udIndex)));
+ ptevt->udLength =REG32(ptUsb3Slave->udRegs_base + GEVNTSIZ(udIndex));
+ // ptevt->udLpos = REG32(ptUsb3Slave->udRegs_base + GEVNTCOUNT(udIndex)) ;
+ ptUsb3Slave->tCtrlReq = (T_USB3Slave_CtrlReq *)(*(u32 *)(*(u32 *)(0x0200c804)));
+
+ udRegVal = REG32(ptUsb3Slave->udRegs_base + DWC3_DSTS);
+ ucSpeed = udRegVal&0x7;
+ ptUsb3Slave->ucSpeed = ucSpeed;
+}
+
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ÅäÖö˵ã0£¬¿ªÊ¼µÈ´ý½øÐпØÖÆ´«Êä
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_StartCtrlXferº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ÅäÖö˵ã0£¬¿ªÊ¼µÈ´ý½øÐпØÖÆ´«Êä
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ * ÆäËû˵Ã÷:
+ * -
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_StartCtrlXfer(T_USB3Slave_SlaveObj *ptUsb3Slave)
+{
+ T_USB3Slave_Ep *ptDep;
+ u32 udIndex;
+
+ for (udIndex=0; udIndex < 2; udIndex++) /*//MAX_EPS*2 2¶Ëµãbulk out£¬3¶Ëµãbulk in 4¶Ëµãintr out£¬5¶Ëµã intr in*/
+ {
+ ptDep = &(ptUsb3Slave->tEps[udIndex]);
+ ptDep->ptTRB= &USB3Slave_TRB; //tjÿ¸ö¶ËµãʹÓÃͬһ¸ötrb mem
+ ptDep->udEpNum = udIndex;
+ if(global.need_enum ==1)
+ {
+ USB3Slave_CfgEp(ptDep);
+ }
+ }
+ ptUsb3Slave->eEp0State = EP0_SETUP_PHASE;
+//Ö´ÐÐcmd6±íʾstart transfer¡£
+ USB3Slave_Ep0StartXfer(ptUsb3Slave, 0, (u32)(ptUsb3Slave->tCtrlReq), 8, TRBCTL_CONTROL_SETUP);
+}
+
+
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ³õʼ»¯¶Ëµã½á¹¹Ì壬ÒÔ¼°¶ÔÓ¦¼Ä´æÆ÷ÅäÖÃ(¶ËµãºÅ£¬¶Ëµã״̬£¬´«Êä·½Ïò£¬°ü´óС)
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_InitEpº¯ÊýÊôÓÚÄÚ²¿º¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ³õʼ»¯¶Ëµã½á¹¹Ì壬ÒÔ¼°¶ÔÓ¦¼Ä´æÆ÷ÅäÖÃ(¶ËµãºÅ£¬¶Ëµã״̬£¬´«Êä·½Ïò£¬°ü´óС)
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - ptUsb3Slave: É豸ÐÅÏ¢½á¹¹Ìå
+ *
+ * ·µ »Ø Öµ: ÎÞ
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+static void USB3Slave_InitEp(T_USB3Slave_SlaveObj *ptUsb3Slave)
+{
+ T_USB3Slave_Ep *ptDep;
+ u32 udIndex;
+ /* u32 udFifoNum = 0,udTxfram_space; */
+ for (udIndex = 0; udIndex < ENDPOINTS_NUM; udIndex++)
+ {
+ ptDep = &(ptUsb3Slave->tEps[udIndex]);
+ ptDep->udEpNum = udIndex;
+ ptDep->eEpState = EP_IDLE;
+ ptDep->udFlags = 0; //tj add ¶¨ÒåflagĬÈÏΪ0
+ ptDep->udMaxBurst = 0; //tj add ÓÃÓÚburst size 0-15 : 1-16
+ ptDep->udDirection = udIndex & 1;/*¶¨Òå´«Êä·½Ïò*/
+ if (0 == udIndex|| 1 == udIndex)
+ {
+ ptDep->udMaxPacket = EP0_PACKET_SIZE;/*ÐÒ鹿¶¨¿ØÖÆ´«Êä×î´ó°ü´óС512*/
+ }
+ else
+ {
+ ptDep->udMaxPacket = HS_MAX_PACKET_SIZE;
+ }
+ }
+}
+
+
+
+/**-------------------------------------------------------------------------------------------------------------------@n
+ * @brief ³õʼ»¯¼Ä´æÆ÷
+ *
+ * ¹¦ÄÜÏêÊö:
+ * - USB3Slave_Init º¯ÊýÊôÓÚ½Ó¿Úº¯Êý, Æä¹¦ÄÜÊÇ:
+ * - ³õʼ»¯¼Ä´æÆ÷
+ *
+ * ²ÎÊý¸ÅÊö:
+ * - eUSBSpeedType: USB É豸ËÙ¶ÈÀàÐÍ
+ *
+ * ·µ »Ø Öµ: ÀàÐÍ:u32
+ * - ´íÎóÂë
+ *
+ * ÆäËû˵Ã÷:
+ * -
+ *
+ *--------------------------------------------------------------------------------------------------------------------*/
+u32 USB3Slave_Ctrl_Init(void)
+{
+ u32 udRegValue, i = 0;
+
+ T_USB3Slave_SlaveObj *pUSB3Slv = &g_USB3Slave;
+//step0: ¶Ô½á¹¹Ìåg_USB3Slave½øÐи³Öµ
+ USB3Slave_Init(pUSB3Slv);
+
+//step1:DCTL£¬¶Ô¿ØÖÆÆ÷½øÐÐÈí¸´Î»
+ if(global.need_enum ==1)
+{
+
+ REG32(pUSB3Slv->udRegs_base + DWC3_DCTL) |= DWC3_DCTL_CSFTRST;
+ while(1)
+ {
+ i++;
+ usdelay(10);
+ udRegValue =REG32(pUSB3Slv->udRegs_base + DWC3_DCTL);
+ if ((!(udRegValue & DWC3_DCTL_CSFTRST))||(i>0x1000))/*¸´Î»Íê±Ïºó¸Ãλ×Ô¶¯ÇåÁã*/
+ break;
+ }
+}
+//step2:ÅäÖÃUSB2 PHY */ //0x0007a510
+ /*bit3: 0:8bit 1:16bit
+ bit4: 0:utmi 1:ulpi
+ bit[13:10] 5:16bit utmi 9:8bit utim/ulpi*/
+ if(global.need_enum ==1)
+{
+ #if(SIM_EN == FPGA)
+ #if (USB_PHY == ULPI)
+ udRegValue = 0x7a510|(1<<9); //0xf<<15+0x9<<10+0x1<<4+0x0<<3;
+ #elif (USB_PHY == UTMI)
+ udRegValue = 0x00001408|(1<<9);//0x0<<15|0x5<<10|0x0<<4+0x1<<3;
+ #endif
+ #elif ((SIM_EN == ASIC) || (SIM_EN == EMULATION))
+ udRegValue = 0x00002400|(1<<9);//0x0<<15|0x9<<10|0x0<<4+0x0<<3;
+ #endif
+
+
+ REG32(pUSB3Slv->udRegs_base + DWC3_GUSB2PHYCFG(0)) = udRegValue;
+
+//step3:DCTL£¬¶Ô¿ØÖÆÆ÷ÔٴνøÐÐÈí¸´Î»
+ REG32(pUSB3Slv->udRegs_base + DWC3_DCTL) |= DWC3_DCTL_CSFTRST;
+ while(1)
+ {
+ i++;
+ usdelay(10);
+ udRegValue =REG32(pUSB3Slv->udRegs_base + DWC3_DCTL);
+ if ((!(udRegValue & DWC3_DCTL_CSFTRST))||(i>0x1000))/*¸´Î»Íê±Ïºó¸Ãλ×Ô¶¯ÇåÁã*/
+ break;
+ }
+
+}
+//step4:´Óparams1ÖлñÈ¡eventnum£¬Ó²¼þĬÈÏΪ1,ÅäÖÃevent_buffer
+ if(global.need_enum ==1)
+{
+
+ USB3Slave_EvtBufSetup(pUSB3Slv);
+}
+ else
+{
+ USB3Slave_EvtBufRestore(pUSB3Slv);
+}
+
+//step5: ÅäÖüĴæÆ÷c110£¬°üº¬ÅäÖÃdev mode,ÅäÖÃc700,°üº¬high speed
+if(global.need_enum ==1)
+{
+
+ udRegValue = REG32(pUSB3Slv->udRegs_base + DWC3_GCTL);
+ udRegValue = (udRegValue & 0xffff0000) | 0x200c;//ÔÀ´ÊÇ0x2008 scaledown
+ udRegValue = udRegValue & (~(1<<17)); // In the real hardware, this bit must be set to 1'b0
+ udRegValue = udRegValue & (~(1<<16));//2012.11.9,never attempts three more times to connect at SS
+#if SIM_EN == EMULATION
+ udRegValue = (udRegValue & 0xffff0000) | 0x2008;
+ udRegValue = udRegValue|(0x3<<4); //lanxiang scaledown
+ udRegValue = udRegValue|(1<<16);
+#endif
+ REG32(pUSB3Slv->udRegs_base + DWC3_GCTL) = udRegValue;
+
+ udRegValue = REG32(pUSB3Slv->udRegs_base + DWC3_DCFG);
+ udRegValue &= ~(DWC3_DCFG_SPEED_MASK); //0Ϊhigh speed
+ udRegValue &= (~(0x1f<<17));
+ udRegValue |= pUSB3Slv->eSpeedMode | (1<<17) ; /*1×óÒÆ17ΪÀ´×ÔÑéÖ¤ÂãÇý£¬Óдý·ÖÎö£¬pxp*/
+ REG32(pUSB3Slv->udRegs_base + DWC3_DCFG)= udRegValue;
+}
+ pUSB3Slv->eDeviceSpeedType = USB30_SPEED_UNKNOWN;
+
+//step6:³õʼ»¯EP¶Ëµã£¬bootÖÐÖ»Óõ½0£¬1£¬2£¬3£¬4£¬5£¬ÆäËüµÄ¿ÉÒÔ¿¼ÂDz»Òª¡£
+
+ USB3Slave_InitEp(pUSB3Slv);
+
+//step7:ÅäÖÃÖжÏ(reset , connect done)ʹÄÜ£¬ÈíÁ¬½Ó£¬µÚ31bitÅäÖÃΪrun
+if(global.need_enum ==1)
+{
+ udRegValue = REG32(pUSB3Slv->udRegs_base + DWC3_DEVTEN);
+ udRegValue = udRegValue | (DWC3_DEVTEN_CONNECTDONEEN | DWC3_DEVTEN_USBRSTEN|DWC3_DEVTEN_USBSUSPENDEN);
+ //udRegValue = udRegValue & (~(1<<6)) & (~(1<<7));
+ REG32(pUSB3Slv->udRegs_base + DWC3_DEVTEN) = udRegValue;
+}
+//step8:start control tranfer
+ USB3Slave_StartCtrlXfer(pUSB3Slv);
+ if(global.need_enum ==1)
+{
+
+//step9:run softconnect
+ udRegValue = REG32(pUSB3Slv->udRegs_base + DWC3_DCTL);
+ udRegValue |= (1U<<31); //tj add 31bit for run or stop,correspond to softdisconnect
+ REG32(pUSB3Slv->udRegs_base + DWC3_DCTL) = udRegValue;
+
+
+#if SIM_EN == EMULATION
+ //for hsic
+ REG32(REG_GPIO_OUT)=2;
+// while(REG32(REG_GPIO_IN)!=0xFF);
+ usdelay(1);
+ REG32(REG_GPIO_OUT)=0;
+#endif
+}
+
+ return SOK;
+}
+
+
+u32 USB3_RecvOutData(u32 dwEPNo, u8 *pchBuf, u32 dwLen, F_USB_CB fnUsbCb, void *pPara)
+{
+ T_USB3Slave_Ep *ptDep;
+ T_USB3Slave_SlaveObj *ptUsb3Slave = &g_USB3Slave;
+
+ ptDep = &(ptUsb3Slave->tEps[dwEPNo]);
+
+ ptDep->pudAddrData =(u32*)pchBuf;
+ ptDep->udLen = dwLen;
+ ptDep->fnUsbCb = fnUsbCb;
+ ptDep->pPara = pPara;
+
+ USB3Slave_EpStartXfer(ptDep, 0, 1);
+
+#if SIM_EN == EMULATION
+ REG32(ARM_PORTA)=0x80;
+#endif
+
+ return SOK;
+}
+
+
+
+u32 USB3_SendInData(u32 dwEPNo, u8 *pchBuf, u32 dwLen, F_USB_CB fnUsbCb, void *pPara)
+{
+
+ T_USB3Slave_Ep *ptDep;
+ T_USB3Slave_SlaveObj *ptUsb3Slave = &g_USB3Slave;
+
+ ptDep = &(ptUsb3Slave->tEps[dwEPNo]);
+
+ ptDep->pudAddrData = (u32*)pchBuf;
+ ptDep->udLen = dwLen;
+ ptDep->fnUsbCb = fnUsbCb;
+ ptDep->pPara = pPara;
+
+ USB3Slave_EpStartXfer(ptDep, 0, 1);
+
+#if SIM_EN == EMULATION
+ REG32(ARM_PORTA)=0x82;
+#endif
+
+ return SOK;
+}
+
+u32 USB3Slave_IsNeedZero(u32 dwLen)
+{
+ T_USB3Slave_Ep *ptDep;
+ T_USB3Slave_SlaveObj *ptUsb3Slave = &g_USB3Slave;
+ u32 udMaxPacket;
+
+ if (ptUsb3Slave->ucSpeed == USB3_HIGHSPEED)
+ {
+ udMaxPacket = HS_MAX_PACKET_SIZE;
+ }
+ else if (ptUsb3Slave->ucSpeed == USB3_FULLSPEED)
+ {
+ udMaxPacket = FS_MAX_PACKET_SIZE;
+ }
+ if (dwLen%udMaxPacket == 0)
+ {
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+/*ö¾Ùº¯Êý*/
+u32 USB3Slave_CDC_Enum(void)
+{
+ T_USB3Slave_Ep *ptDep;
+ u32 dwCount=0;
+ u32 dwCount1=0;
+ u32 udIndex;
+
+
+ global.g_Connet = 0;
+ USB3Slave_Ctrl_Init();
+ if(global.need_enum ==0)
+ {
+ for (udIndex=2; udIndex < 6; udIndex++) /*//MAX_EPS*2 2¶Ëµãbulk out£¬3¶Ëµãbulk in 4¶Ëµãintr out£¬5¶Ëµã intr in*/
+ {
+ ptDep = &(g_USB3Slave.tEps[udIndex]);
+ ptDep->ptTRB= &USB3Slave_TRB_EP[udIndex-2]; //tjÿ¸ö¶ËµãʹÓÃͬһ¸ötrb mem
+ ptDep->udEpNum = udIndex;
+
+ //USB3Slave_CfgEp(ptDep);
+ }
+ }
+if(global.need_enum ==1)
+{
+ while(1)
+ {
+ USB3Slave_ISR(0,0);
+ if(0 == global.g_Connet)
+ {
+ dwCount++;
+ usb_timeout_usdelay(50000);
+ if(dwCount>(4000*global.g_USB_TIMEOUT))
+ return 1;
+
+ }
+ else if(1 == g_USB3Slave.udUSBSate)
+ {
+ for (udIndex=2; udIndex < 6; udIndex++) /*//MAX_EPS*2 2¶Ëµãbulk out£¬3¶Ëµãbulk in 4¶Ëµãintr out£¬5¶Ëµã intr in*/
+ {
+ ptDep = &(g_USB3Slave.tEps[udIndex]);
+ ptDep->ptTRB= &USB3Slave_TRB_EP[udIndex-2]; //tjÿ¸ö¶ËµãʹÓÃͬһ¸ötrb mem
+ ptDep->udEpNum = udIndex;
+ USB3Slave_CfgEp(ptDep);
+ }
+ break;
+ }
+ else
+ {
+ dwCount1++;
+ usb_timeout_usdelay(50000);
+ if(dwCount1>(200000*global.g_USB_TIMEOUT))
+ {
+ return 1;
+ }
+
+ }
+ }
+}
+ return 0;
+}
+
+extern void USB_Boot(void);
+extern void USB_Pll_Clk_Rst_InitEnv(void);
+
+void USB3Slave_boot(void)
+{
+ u32 dwConnect;
+ global.g_USB_MODE = 0;
+ global.need_enum = 0;
+// 1:config clock
+ if(global.need_enum ==1)
+ {
+ USB_Pll_Clk_Rst_InitEnv();
+ }
+// 2:USB30_CDC_Enum
+ dwConnect = USB3Slave_CDC_Enum();
+ if(1==dwConnect)
+ {
+ printf("NOLINK\n");
+ return ;
+ }
+
+#if 0//SIM_EN == EMULATION
+ REG32(ARM_PORTA)=0x32;
+#endif
+ printf("FAILED\n");
+}
+
+/** @} */
+
+