1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi // Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi // No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi // modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi // supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi // Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi // Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi // obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi // such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi // MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi // confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi // third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi // kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi // without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi // intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi // and in conformity with any international standard. You agree to waive any
38*53ee8cc1Swenshuai.xi // claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi // incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi // In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi // consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi // revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi // You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi // even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi // request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi // parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi // services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi // MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi // ("Services").
52*53ee8cc1Swenshuai.xi // You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi // writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi // disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi // or otherwise:
58*53ee8cc1Swenshuai.xi // (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi // mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi // (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi // including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi // of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi // (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi // of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi // Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi // settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi // Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi // Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi // with the said Rules.
72*53ee8cc1Swenshuai.xi // The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi // be English.
74*53ee8cc1Swenshuai.xi // The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
79*53ee8cc1Swenshuai.xi /// File name: usbentry.c
80*53ee8cc1Swenshuai.xi /// @brief USB host driver Entry function.
81*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor Inc.
82*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
83*53ee8cc1Swenshuai.xi //#include <MsCommon.h> // NUSED
84*53ee8cc1Swenshuai.xi
85*53ee8cc1Swenshuai.xi #include "include/drvConfig.h"
86*53ee8cc1Swenshuai.xi //#include "include/drvPorts.h" // NUSED
87*53ee8cc1Swenshuai.xi #include "include/drvKernel.h"
88*53ee8cc1Swenshuai.xi //#include "include/drvTimer.h" // NUSED
89*53ee8cc1Swenshuai.xi //#include "include/drvCPE_EHCI.h" // NUSED
90*53ee8cc1Swenshuai.xi //#include "include/drvCPE_AMBA.h" // NUSED
91*53ee8cc1Swenshuai.xi
92*53ee8cc1Swenshuai.xi //#include "drvUsbd.h" // NUSED
93*53ee8cc1Swenshuai.xi #include "drvMassStor.h"
94*53ee8cc1Swenshuai.xi //#include "drvUSB.h" // NUSED
95*53ee8cc1Swenshuai.xi #include "drvUSBHwCtl.h"
96*53ee8cc1Swenshuai.xi //#include "drvEHCI.h" // NUSED
97*53ee8cc1Swenshuai.xi #if USB_MASS_STORAGE_SUPPORT
98*53ee8cc1Swenshuai.xi #include "drvMSC.h"
99*53ee8cc1Swenshuai.xi #endif
100*53ee8cc1Swenshuai.xi #if USB_HID_SUPPORT
101*53ee8cc1Swenshuai.xi #include "drvHIDGlue.h"
102*53ee8cc1Swenshuai.xi #endif
103*53ee8cc1Swenshuai.xi #if USB_CDC_SUPPORT
104*53ee8cc1Swenshuai.xi #include "drvCDCDev.h"
105*53ee8cc1Swenshuai.xi #endif
106*53ee8cc1Swenshuai.xi /* applying drvUsbHostConfig.h (inside drvUSBHwCtl.h) */
107*53ee8cc1Swenshuai.xi
108*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef *pCurrentChip;
109*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC;
110*53ee8cc1Swenshuai.xi
111*53ee8cc1Swenshuai.xi mem_Alloc pfnAllocCachedMem=NULL, pfnAllocNoncachedMem=NULL;
112*53ee8cc1Swenshuai.xi mem_Free pfnFreeCachedMem=NULL, pfnFreeNoncachedMem=NULL;
113*53ee8cc1Swenshuai.xi mem_VA2PA pfnVA2PA=NULL;
114*53ee8cc1Swenshuai.xi mem_PA2VA pfnPA2VA=NULL;
115*53ee8cc1Swenshuai.xi mem_Cached2Noncached pfnCached2Noncached=NULL;
116*53ee8cc1Swenshuai.xi mem_NonCached2Cached pfnNoncached2Cached=NULL;
117*53ee8cc1Swenshuai.xi
118*53ee8cc1Swenshuai.xi MS_S32 _s32UsbEventId = -1;
119*53ee8cc1Swenshuai.xi MS_U8 gUsbChipID = 0xFF;
120*53ee8cc1Swenshuai.xi
121*53ee8cc1Swenshuai.xi USBCallback _DrvUSBC_CBFun = NULL;
122*53ee8cc1Swenshuai.xi
123*53ee8cc1Swenshuai.xi USBCallback _DrvUSB_CBFun = NULL;
124*53ee8cc1Swenshuai.xi
125*53ee8cc1Swenshuai.xi void ms_ehci_irq (struct usb_hcd *pHcd, struct stPtRegs *pRegs);
126*53ee8cc1Swenshuai.xi
127*53ee8cc1Swenshuai.xi static MS_U8 u8HubStackBuffer[HUB_STACK_SIZE];
128*53ee8cc1Swenshuai.xi
129*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
130*53ee8cc1Swenshuai.xi /// Register a callback function to process the usb plug event
131*53ee8cc1Swenshuai.xi /// @param pCallbackFn \b IN: callback function used in interrupt context.
132*53ee8cc1Swenshuai.xi /// @return None
133*53ee8cc1Swenshuai.xi /// @note call after USB has been initialized
134*53ee8cc1Swenshuai.xi /// The last registered callback will overwrite the previous ones.
135*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_USB_RegisterCallBack(USBCallback pCallbackFn)136*53ee8cc1Swenshuai.xi void MDrv_USB_RegisterCallBack (USBCallback pCallbackFn)
137*53ee8cc1Swenshuai.xi {
138*53ee8cc1Swenshuai.xi //Register a callback function for application to process the data received
139*53ee8cc1Swenshuai.xi _DrvUSB_CBFun = pCallbackFn;
140*53ee8cc1Swenshuai.xi }
141*53ee8cc1Swenshuai.xi
ms_USBGetChipID(void)142*53ee8cc1Swenshuai.xi MS_U8 ms_USBGetChipID(void)
143*53ee8cc1Swenshuai.xi {
144*53ee8cc1Swenshuai.xi #if defined(USB_LIB_CHIPID)
145*53ee8cc1Swenshuai.xi return USB_LIB_CHIPID;
146*53ee8cc1Swenshuai.xi #else
147*53ee8cc1Swenshuai.xi if (gUsbChipID == 0xFF)
148*53ee8cc1Swenshuai.xi gUsbChipID = usb_readb(OS_BASE_ADDR+0x1ecc*2);
149*53ee8cc1Swenshuai.xi
150*53ee8cc1Swenshuai.xi //diag_printf("GetChipID: 0x%x\n", gUsbChipID);
151*53ee8cc1Swenshuai.xi return gUsbChipID;
152*53ee8cc1Swenshuai.xi #endif
153*53ee8cc1Swenshuai.xi }
154*53ee8cc1Swenshuai.xi
155*53ee8cc1Swenshuai.xi extern MS_U8 MDrv_SYS_GetChipRev(void);
ms_U4_series_usb_init(struct s_ChipUsbHostDef * pChip,MS_U8 u8Hostid)156*53ee8cc1Swenshuai.xi void ms_U4_series_usb_init(struct s_ChipUsbHostDef *pChip, MS_U8 u8Hostid)
157*53ee8cc1Swenshuai.xi {
158*53ee8cc1Swenshuai.xi unsigned int UTMI_base = pChip->reg[u8Hostid].baseUTMI;
159*53ee8cc1Swenshuai.xi unsigned int USBC_base = pChip->reg[u8Hostid].baseUSBC;
160*53ee8cc1Swenshuai.xi unsigned int UHC_base = pChip->reg[u8Hostid].baseUHC;
161*53ee8cc1Swenshuai.xi unsigned int USBBC_base = pChip->reg[u8Hostid].baseUSBBC;
162*53ee8cc1Swenshuai.xi unsigned int flag = pChip->reg[u8Hostid].iFlag;
163*53ee8cc1Swenshuai.xi
164*53ee8cc1Swenshuai.xi MS_U8 chipID = pChip->chipID;
165*53ee8cc1Swenshuai.xi
166*53ee8cc1Swenshuai.xi diag_printf("[USB] constant upll NLib, UTMI base %p, USBC base %p, UHC base %p, USBBC base %p\n",
167*53ee8cc1Swenshuai.xi (void *)UTMI_base, (void *)USBC_base, (void *)UHC_base, (void *)USBBC_base);
168*53ee8cc1Swenshuai.xi
169*53ee8cc1Swenshuai.xi if (flag & EHCFLAG_TESTPKG)
170*53ee8cc1Swenshuai.xi {
171*53ee8cc1Swenshuai.xi usb_writew(0x2084, (void*) (UTMI_base+0x2*2));
172*53ee8cc1Swenshuai.xi usb_writew(0x0003, (void*) (UTMI_base+0x20*2));
173*53ee8cc1Swenshuai.xi }
174*53ee8cc1Swenshuai.xi
175*53ee8cc1Swenshuai.xi #if _USB_HS_CUR_DRIVE_DM_ALLWAYS_HIGH_PATCH
176*53ee8cc1Swenshuai.xi /*
177*53ee8cc1Swenshuai.xi * patch for DM always keep high issue
178*53ee8cc1Swenshuai.xi * init overwrite register
179*53ee8cc1Swenshuai.xi */
180*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x0*2)) & (MS_U8)(~BIT3), (void*) (UTMI_base+0x0*2)); //DP_PUEN = 0
181*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x0*2)) & (MS_U8)(~BIT4), (void*) (UTMI_base+0x0*2)); //DM_PUEN = 0
182*53ee8cc1Swenshuai.xi
183*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x0*2)) & (MS_U8)(~BIT5), (void*) (UTMI_base+0x0*2)); //R_PUMODE = 0
184*53ee8cc1Swenshuai.xi
185*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x0*2)) | BIT6, (void*) (UTMI_base+0x0*2)); //R_DP_PDEN = 1
186*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x0*2)) | BIT7, (void*) (UTMI_base+0x0*2)); //R_DM_PDEN = 1
187*53ee8cc1Swenshuai.xi
188*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x10*2)) | BIT6, (void*) (UTMI_base+0x10*2)); //hs_txser_en_cb = 1
189*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x10*2)) & (MS_U8)(~BIT7), (void*) (UTMI_base+0x10*2)); //hs_se0_cb = 0
190*53ee8cc1Swenshuai.xi
191*53ee8cc1Swenshuai.xi /* turn on overwrite mode */
192*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x0*2)) | BIT1, (void*) (UTMI_base+0x0*2)); //tern_ov = 1
193*53ee8cc1Swenshuai.xi #endif
194*53ee8cc1Swenshuai.xi
195*53ee8cc1Swenshuai.xi // disable battery charger function
196*53ee8cc1Swenshuai.xi if (flag & EHCFLAG_USBBC_OFF)
197*53ee8cc1Swenshuai.xi {
198*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBBC_base+0x03*2-1)) & ~0x40, (void*) (USBBC_base+0x03*2-1));
199*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBBC_base+0x0c*2)) & ~0x40, (void*) (USBBC_base+0x0c*2));
200*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x01*2-1)) & ~0x40, (void*) (UTMI_base+0x01*2-1));
201*53ee8cc1Swenshuai.xi }
202*53ee8cc1Swenshuai.xi
203*53ee8cc1Swenshuai.xi usb_writeb(0x0a, (void*) (USBC_base)); // Disable MAC initial suspend, Reset UHC
204*53ee8cc1Swenshuai.xi usb_writeb(0x28, (void*) (USBC_base)); // Release UHC reset, enable UHC and OTG XIU function
205*53ee8cc1Swenshuai.xi
206*53ee8cc1Swenshuai.xi #if 0 // don't touch UPLL setting again. set UPLL only in boot code.
207*53ee8cc1Swenshuai.xi if ((chipID == CHIPID_KRONUS) || (chipID == CHIPID_KAISERIN))
208*53ee8cc1Swenshuai.xi {
209*53ee8cc1Swenshuai.xi U16 reg_t;
210*53ee8cc1Swenshuai.xi
211*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x0D*2-1)) | 0x01, (void*) (UTMI_base+0x0D*2-1)); // set reg_double_data_rate, To get better jitter performance
212*53ee8cc1Swenshuai.xi
213*53ee8cc1Swenshuai.xi reg_t = usb_readw(UTMI_base+0x22*2);
214*53ee8cc1Swenshuai.xi if ((reg_t & 0x10e0) != 0x10e0)
215*53ee8cc1Swenshuai.xi usb_writew(0x10e0, (void*) (UTMI_base+0x22*2));
216*53ee8cc1Swenshuai.xi reg_t = usb_readw(UTMI_base+0x24*2);
217*53ee8cc1Swenshuai.xi if (reg_t != 0x1)
218*53ee8cc1Swenshuai.xi usb_writew(0x1, (void*) (UTMI_base+0x24*2));
219*53ee8cc1Swenshuai.xi //usb_writeb(usb_readb((void*)(UTMI_base+0x22*2)) | 0xE0, (void*) (UTMI_base+0x22*2)); // Set PLL_TEST[23:21] for enable 480MHz clock
220*53ee8cc1Swenshuai.xi //usb_writeb(usb_readb((void*)(UTMI_base+0x20*2)) | 0x02, (void*) (UTMI_base+0x20*2)); // Set PLL_TEST[1] for PLL multiplier 20X
221*53ee8cc1Swenshuai.xi //usb_writeb(0, (void*) (UTMI_base+0x21*2-1));
222*53ee8cc1Swenshuai.xi //usb_writeb(0x10, (void*) (UTMI_base+0x23*2-1));
223*53ee8cc1Swenshuai.xi //usb_writeb(0x01, (void*) (UTMI_base+0x24*2));
224*53ee8cc1Swenshuai.xi }
225*53ee8cc1Swenshuai.xi #endif
226*53ee8cc1Swenshuai.xi
227*53ee8cc1Swenshuai.xi if (flag & EHCFLAG_DOUBLE_DATARATE)
228*53ee8cc1Swenshuai.xi {
229*53ee8cc1Swenshuai.xi if ((flag & EHCFLAG_DDR_MASK) == EHCFLAG_DDR_x15)
230*53ee8cc1Swenshuai.xi {
231*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x20*2)) | 0x76, (void*) (UTMI_base+0x20*2)); // Set usb bus = 480MHz x 1.5
232*53ee8cc1Swenshuai.xi }
233*53ee8cc1Swenshuai.xi else if ((flag & EHCFLAG_DDR_MASK) == EHCFLAG_DDR_x18)
234*53ee8cc1Swenshuai.xi {
235*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x20*2)) | 0x8e, (void*) (UTMI_base+0x20*2)); // Set usb bus = 480MHz x 1.8
236*53ee8cc1Swenshuai.xi }
237*53ee8cc1Swenshuai.xi //else if ((flag & EHCFLAG_DDR_MASK) == EHCFLAG_DDR_x20)
238*53ee8cc1Swenshuai.xi //{
239*53ee8cc1Swenshuai.xi // usb_writeb(usb_readb((void*)(UTMI_base+0xD*2-1)) | 0x01, (void*) (UTMI_base+0xD*2-1)); // Set usb bus = 480MHz x2
240*53ee8cc1Swenshuai.xi //}
241*53ee8cc1Swenshuai.xi
242*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x2c*2)) |0x1, (void*) (UTMI_base+0x2c*2)); //Set slew rate control for overspeed (or 960MHz)
243*53ee8cc1Swenshuai.xi }
244*53ee8cc1Swenshuai.xi
245*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x09*2-1)) & ~0x08, (void*) (UTMI_base+0x09*2-1)); // Disable force_pll_on
246*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x08*2)) & ~0x80, (void*) (UTMI_base+0x08*2)); // Enable band-gap current
247*53ee8cc1Swenshuai.xi usb_writeb(0xC3, (void*)(UTMI_base)); // reg_pdn: bit<15>, bit <2> ref_pdn
248*53ee8cc1Swenshuai.xi mdelay(1); // delay 1ms
249*53ee8cc1Swenshuai.xi
250*53ee8cc1Swenshuai.xi usb_writeb(0x69, (void*) (UTMI_base+0x01*2-1)); // Turn on UPLL, reg_pdn: bit<9>
251*53ee8cc1Swenshuai.xi mdelay(2); // delay 2ms
252*53ee8cc1Swenshuai.xi
253*53ee8cc1Swenshuai.xi usb_writeb(0x01, (void*) (UTMI_base)); // Turn all (including hs_current) use override mode
254*53ee8cc1Swenshuai.xi usb_writeb(0, (void*) (UTMI_base+0x01*2-1)); // Turn on UPLL, reg_pdn: bit<9>
255*53ee8cc1Swenshuai.xi
256*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x3C*2)) | 0x01, (void*) (UTMI_base+0x3C*2)); // set CA_START as 1
257*53ee8cc1Swenshuai.xi mdelay(1); // 10 -> 1
258*53ee8cc1Swenshuai.xi
259*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x3C*2)) & ~0x01, (void*) (UTMI_base+0x3C*2)); // release CA_START
260*53ee8cc1Swenshuai.xi
261*53ee8cc1Swenshuai.xi while ((usb_readb((void*)(UTMI_base+0x3C*2)) & 0x02) == 0); // polling bit <1> (CA_END)
262*53ee8cc1Swenshuai.xi
263*53ee8cc1Swenshuai.xi if (flag & EHCFLAG_DPDM_SWAP)
264*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x0b*2-1)) |0x20, (void*) (UTMI_base+0x0b*2-1)); // dp dm swap
265*53ee8cc1Swenshuai.xi
266*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBC_base+0x02*2)) & ~0x03, (void*) (USBC_base+0x02*2)); //UHC select enable
267*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBC_base+0x02*2)) | 0x01, (void*) (USBC_base+0x02*2)); //UHC select enable
268*53ee8cc1Swenshuai.xi
269*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UHC_base+0x40*2)) & ~0x10, (void*) (UHC_base+0x40*2)); //0: VBUS On.
270*53ee8cc1Swenshuai.xi mdelay(1); // delay 1ms
271*53ee8cc1Swenshuai.xi
272*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UHC_base+0x40*2)) | 0x08, (void*) (UHC_base+0x40*2)); // Active HIGH
273*53ee8cc1Swenshuai.xi //mdelay(1); // NUSED
274*53ee8cc1Swenshuai.xi
275*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UHC_base+0x81*2-1)) | 0x8F, (void*) (UHC_base+0x81*2-1)); //improve the efficiency of USB access MIU when system is busy
276*53ee8cc1Swenshuai.xi
277*53ee8cc1Swenshuai.xi if ((chipID == CHIPID_KRONUS) || (chipID == CHIPID_URANUS4))
278*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UHC_base+0x83*2-1)) | 0x40, (void*) (UHC_base+0x83*2-1)); //set MIU1_sel to 128MB
279*53ee8cc1Swenshuai.xi // Kaiserin will keep the defaut "00" to be as 512MB support
280*53ee8cc1Swenshuai.xi
281*53ee8cc1Swenshuai.xi usb_writeb((usb_readb((void*)(UTMI_base+0x06*2)) & 0x9F) | 0x40, (void*) (UTMI_base+0x06*2)); //reg_tx_force_hs_current_enable
282*53ee8cc1Swenshuai.xi
283*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x03*2-1)) | 0x28, (void*) (UTMI_base+0x03*2-1)); //Disconnect window select
284*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x03*2-1)) & 0xef, (void*) (UTMI_base+0x03*2-1)); //Disconnect window select
285*53ee8cc1Swenshuai.xi
286*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x07*2-1)) & 0xfd, (void*) (UTMI_base+0x07*2-1)); //Disable improved CDR
287*53ee8cc1Swenshuai.xi #ifdef ENABLE_UTMI_240_AS_120_PHASE_ECO
288*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x08*2)) | 0x08, (void*) (UTMI_base+0x08*2));
289*53ee8cc1Swenshuai.xi #endif
290*53ee8cc1Swenshuai.xi #if _USB_CLOCK_PHASE_ADJ_PATCH
291*53ee8cc1Swenshuai.xi if ((chipID == CHIPID_KERES) && (MDrv_SYS_GetChipRev() == 0x0))
292*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x08*2)) & ~0x08, (void*) (UTMI_base+0x08*2));
293*53ee8cc1Swenshuai.xi #endif
294*53ee8cc1Swenshuai.xi
295*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x09*2-1)) |0x81, (void*) (UTMI_base+0x09*2-1)); // UTMI RX anti-dead-loc, ISI effect improvement
296*53ee8cc1Swenshuai.xi #if _USB_CLOCK_PHASE_ADJ_PATCH
297*53ee8cc1Swenshuai.xi if ((chipID == CHIPID_KERES) && (MDrv_SYS_GetChipRev() == 0x0))
298*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x0b*2-1)) & ~0x80, (void*) (UTMI_base+0x0b*2-1));
299*53ee8cc1Swenshuai.xi #else
300*53ee8cc1Swenshuai.xi if ((flag & EHCFLAG_DOUBLE_DATARATE)==0)
301*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x0b*2-1)) |0x80, (void*) (UTMI_base+0x0b*2-1)); // TX timing select latch path
302*53ee8cc1Swenshuai.xi #endif
303*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x15*2-1)) |0x20, (void*) (UTMI_base+0x15*2-1)); // Chirp signal source select
304*53ee8cc1Swenshuai.xi #ifdef ENABLE_UTMI_55_INTERFACE
305*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x15*2-1)) |0x40, (void*) (UTMI_base+0x15*2-1)); // Change to 55 interface
306*53ee8cc1Swenshuai.xi #endif
307*53ee8cc1Swenshuai.xi
308*53ee8cc1Swenshuai.xi usb_writeb( UTMI_EYE_SETTING_2C, (void*) (UTMI_base+0x2c*2));
309*53ee8cc1Swenshuai.xi usb_writeb( UTMI_EYE_SETTING_2D, (void*) (UTMI_base+0x2d*2-1));
310*53ee8cc1Swenshuai.xi usb_writeb( UTMI_EYE_SETTING_2E, (void*) (UTMI_base+0x2e*2));
311*53ee8cc1Swenshuai.xi usb_writeb( UTMI_EYE_SETTING_2F, (void*) (UTMI_base+0x2f*2-1));
312*53ee8cc1Swenshuai.xi
313*53ee8cc1Swenshuai.xi /* Add hardware ECO items here */
314*53ee8cc1Swenshuai.xi // Kaiserin U02 patch code (K2S only)
315*53ee8cc1Swenshuai.xi if ((chipID == CHIPID_KAISERIN) && (MDrv_SYS_GetChipRev() >= 0x01)) // && U02 and Newer IC
316*53ee8cc1Swenshuai.xi {
317*53ee8cc1Swenshuai.xi diag_printf("K2S software patch!!!\n");
318*53ee8cc1Swenshuai.xi
319*53ee8cc1Swenshuai.xi // enable LS cross point ECO
320*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x39*2-1)) | 0x04, (void*) (UTMI_base+0x39*2-1)); //enable deglitch SE0��(low-speed cross point)
321*53ee8cc1Swenshuai.xi
322*53ee8cc1Swenshuai.xi // enable power noise ECO
323*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBC_base+0x02*2)) | 0x40, (void*) (USBC_base+0x02*2)); //enable use eof2 to reset state machine�� (power noise)
324*53ee8cc1Swenshuai.xi
325*53ee8cc1Swenshuai.xi // enable TX/RX reset clock gating ECO
326*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x39*2-1)) | 0x02, (void*) (UTMI_base+0x39*2-1)); //enable hw auto deassert sw reset(tx/rx reset)
327*53ee8cc1Swenshuai.xi
328*53ee8cc1Swenshuai.xi // enable loss short packet interrupt ECO, default 0 on
329*53ee8cc1Swenshuai.xi //usb_writeb(usb_readb((void*)(USBC_base+0x04*2)) & 0x7f, (void*) (USBC_base+0x04*2)); //enable patch for the assertion of interrupt(Lose short packet interrupt)
330*53ee8cc1Swenshuai.xi
331*53ee8cc1Swenshuai.xi // enable babble ECO
332*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBC_base+0x04*2)) | 0x40, (void*) (USBC_base+0x04*2)); //enable add patch to Period_EOF1(babble problem)
333*53ee8cc1Swenshuai.xi
334*53ee8cc1Swenshuai.xi // enable MDATA single TT ECO
335*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBC_base+0x0A*2)) | 0x40, (void*) (USBC_base+0x0A*2)); //enable short packet MDATA in Split transaction clears ACT bit (LS dev under a HS hub)
336*53ee8cc1Swenshuai.xi }
337*53ee8cc1Swenshuai.xi
338*53ee8cc1Swenshuai.xi // Kaiser and Newer IC patch code
339*53ee8cc1Swenshuai.xi if ((chipID == CHIPID_KAISER))
340*53ee8cc1Swenshuai.xi {
341*53ee8cc1Swenshuai.xi diag_printf("Applied hardware ECO patch!!!\n");
342*53ee8cc1Swenshuai.xi
343*53ee8cc1Swenshuai.xi // enable LS cross point ECO (manually all)
344*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x04*2)) | 0x40, (void*) (UTMI_base+0x04*2)); //enable deglitch SE0��(low-speed cross point)
345*53ee8cc1Swenshuai.xi
346*53ee8cc1Swenshuai.xi // enable power noise ECO (manually all)
347*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBC_base+0x02*2)) | 0x40, (void*) (USBC_base+0x02*2)); //enable use eof2 to reset state machine�� (power noise)
348*53ee8cc1Swenshuai.xi
349*53ee8cc1Swenshuai.xi // enable TX/RX reset clock gating ECO (manually all)
350*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x04*2)) | 0x20, (void*) (UTMI_base+0x04*2)); //enable hw auto deassert sw reset(tx/rx reset)
351*53ee8cc1Swenshuai.xi
352*53ee8cc1Swenshuai.xi // enable loss short packet interrupt ECO, default 0 on
353*53ee8cc1Swenshuai.xi //usb_writeb(usb_readb((void*)(USBC_base+0x04*2)) & 0x7f, (void*) (USBC_base+0x04*2)); //enable patch for the assertion of interrupt(Lose short packet interrupt)
354*53ee8cc1Swenshuai.xi
355*53ee8cc1Swenshuai.xi // enable babble ECO, default on
356*53ee8cc1Swenshuai.xi //usb_writeb(usb_readb((void*)(USBC_base+0x04*2)) | 0x40, (void*) (USBC_base+0x04*2)); //enable add patch to Period_EOF1(babble problem)
357*53ee8cc1Swenshuai.xi
358*53ee8cc1Swenshuai.xi // enable MDATA single TT ECO, default on
359*53ee8cc1Swenshuai.xi //writeb(readb((void*)(USBC_base+0x0A*2)) | 0x40, (void*) (USBC_base+0x0A*2)); //enable short packet MDATA in Split transaction clears ACT bit (LS dev under a HS hub)
360*53ee8cc1Swenshuai.xi
361*53ee8cc1Swenshuai.xi // enable DM always high ECO
362*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x10*2)) | 0x40, (void*) (UTMI_base+0x10*2)); // monkey test
363*53ee8cc1Swenshuai.xi }
364*53ee8cc1Swenshuai.xi
365*53ee8cc1Swenshuai.xi // enable miu new bridge ECO
366*53ee8cc1Swenshuai.xi #if defined(ENABLE_PV2MI_BRIDGE_ECO)
367*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBC_base+0x0a*2)) | 0x40, (void*) (USBC_base+0xa*2)); //fix pv2mi bridge mis-behavior
368*53ee8cc1Swenshuai.xi #endif
369*53ee8cc1Swenshuai.xi
370*53ee8cc1Swenshuai.xi #if _USB_HS_CUR_DRIVE_DM_ALLWAYS_HIGH_PATCH
371*53ee8cc1Swenshuai.xi /*
372*53ee8cc1Swenshuai.xi * patch for DM always keep high issue
373*53ee8cc1Swenshuai.xi * init overwrite register
374*53ee8cc1Swenshuai.xi */
375*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x0*2)) | BIT6, (void*) (UTMI_base+0x0*2)); //R_DP_PDEN = 1
376*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x0*2)) | BIT7, (void*) (UTMI_base+0x0*2)); //R_DM_PDEN = 1
377*53ee8cc1Swenshuai.xi
378*53ee8cc1Swenshuai.xi /* turn on overwrite mode */
379*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x0*2)) | BIT1, (void*) (UTMI_base+0x0*2)); //tern_ov = 1
380*53ee8cc1Swenshuai.xi #endif
381*53ee8cc1Swenshuai.xi
382*53ee8cc1Swenshuai.xi #if _USB_MINI_PV2MI_BURST_SIZE
383*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBC_base+0x0b*2-1)) & ~(BIT1|BIT2|BIT3|BIT4), (void*)(USBC_base+0x0b*2-1));
384*53ee8cc1Swenshuai.xi #endif
385*53ee8cc1Swenshuai.xi
386*53ee8cc1Swenshuai.xi #ifdef ENABLE_HS_CONNECTION_FAIL_INTO_VFALL_ECO
387*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBC_base+0x11*2-1)) | BIT1, (void*)(USBC_base+0x11*2-1));
388*53ee8cc1Swenshuai.xi #endif
389*53ee8cc1Swenshuai.xi
390*53ee8cc1Swenshuai.xi #if _USB_MIU_WRITE_WAIT_LAST_DONE_Z_PATCH
391*53ee8cc1Swenshuai.xi /* Enabe PVCI i_miwcplt wait for mi2uh_last_done_z */
392*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UHC_base+0x83*2-1)) | BIT4, (void*)(UHC_base+0x83*2-1));
393*53ee8cc1Swenshuai.xi #endif
394*53ee8cc1Swenshuai.xi
395*53ee8cc1Swenshuai.xi #ifdef ENABLE_HS_DISCONNECTION_DEBOUNCE_ECO
396*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBC_base+0x1*2-1)) | BIT4, (void*)(USBC_base+0x1*2-1));
397*53ee8cc1Swenshuai.xi #endif
398*53ee8cc1Swenshuai.xi
399*53ee8cc1Swenshuai.xi #if defined(ENABLE_UHC_PREAMBLE_ECO)
400*53ee8cc1Swenshuai.xi /* [7]: reg_etron_en, to enable utmi Preamble function */
401*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x3f*2-1)) | BIT7, (void*)(UTMI_base+0x3f*2-1));
402*53ee8cc1Swenshuai.xi
403*53ee8cc1Swenshuai.xi /* [3:]: reg_preamble_en, to enable Faraday Preamble */
404*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBC_base+0x0f*2-1)) | BIT3, (void*)(USBC_base+0x0f*2-1));
405*53ee8cc1Swenshuai.xi
406*53ee8cc1Swenshuai.xi /* [0]: reg_preamble_babble_fix, to patch Babble occurs in Preamble */
407*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBC_base+0x10*2)) | BIT0, (void*)(USBC_base+0x10*2));
408*53ee8cc1Swenshuai.xi
409*53ee8cc1Swenshuai.xi /* [1]: reg_preamble_fs_within_pre_en, to patch FS crash problem */
410*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBC_base+0x10*2)) | BIT1, (void*)(USBC_base+0x10*2));
411*53ee8cc1Swenshuai.xi
412*53ee8cc1Swenshuai.xi /* [2]: reg_fl_sel_override, to override utmi to have FS drive strength */
413*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UTMI_base+0x03*2-1)) | BIT2, (void*)(UTMI_base+0x03*2-1));
414*53ee8cc1Swenshuai.xi #endif
415*53ee8cc1Swenshuai.xi
416*53ee8cc1Swenshuai.xi #if defined(ENABLE_HS_ISO_IN_CORNER_ECO)
417*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBC_base+0x13*2-1)) | BIT0, (void*)(USBC_base+0x13*2-1));
418*53ee8cc1Swenshuai.xi #endif
419*53ee8cc1Swenshuai.xi
420*53ee8cc1Swenshuai.xi #if defined(ENABLE_UHC_RUN_BIT_ALWAYS_ON_ECO)
421*53ee8cc1Swenshuai.xi /* Don't close RUN bit when device disconnect */
422*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(UHC_base+0x34*2)) | BIT7, (void*)(UHC_base+0x34*2));
423*53ee8cc1Swenshuai.xi #endif
424*53ee8cc1Swenshuai.xi
425*53ee8cc1Swenshuai.xi #if defined(ENABLE_DISCONNECT_PE_CLR_ECO)
426*53ee8cc1Swenshuai.xi /*Enable Port is disabled when device is dosconnected ECO*/
427*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBC_base+0x12*2)) | BIT7, (void*) (USBC_base+0x12*2));
428*53ee8cc1Swenshuai.xi #endif
429*53ee8cc1Swenshuai.xi
430*53ee8cc1Swenshuai.xi #if !defined(_EHC_SINGLE_SOF_TO_CHK_DISCONN)
431*53ee8cc1Swenshuai.xi /* Use 2 SOFs to check disconnection */
432*53ee8cc1Swenshuai.xi usb_writeb((usb_readb((void*)(USBC_base+0x03*2-1)) & BIT7) | (0x02<<1 | BIT0), (void*)(USBC_base+0x03*2-1));
433*53ee8cc1Swenshuai.xi #endif
434*53ee8cc1Swenshuai.xi
435*53ee8cc1Swenshuai.xi #if defined(ENABLE_DISCONNECT_SPEED_REPORT_RESET_ECO)
436*53ee8cc1Swenshuai.xi /* UHC speed type report should be reset by device disconnection */
437*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBC_base+0x20*2)) | BIT0, (void*)(USBC_base+0x20*2));
438*53ee8cc1Swenshuai.xi #endif
439*53ee8cc1Swenshuai.xi
440*53ee8cc1Swenshuai.xi #if defined(ENABLE_BABBLE_PCD_ONE_PULSE_TRIGGER_ECO)
441*53ee8cc1Swenshuai.xi /* Port Change Detect (PCD) is triggered by babble.
442*53ee8cc1Swenshuai.xi * Pulse trigger will not hang this condition.
443*53ee8cc1Swenshuai.xi */
444*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBC_base+0x20*2)) | BIT1, (void*)(USBC_base+0x20*2));
445*53ee8cc1Swenshuai.xi #endif
446*53ee8cc1Swenshuai.xi
447*53ee8cc1Swenshuai.xi #if defined(ENABLE_HC_RESET_FAIL_ECO)
448*53ee8cc1Swenshuai.xi /* generation of hhc_reset_u */
449*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBC_base+0x20*2)) | BIT2, (void*)(USBC_base+0x20*2));
450*53ee8cc1Swenshuai.xi #endif
451*53ee8cc1Swenshuai.xi
452*53ee8cc1Swenshuai.xi #if defined(ENABLE_SRAM_CLK_GATING_ECO)
453*53ee8cc1Swenshuai.xi /* do SRAM clock gating automatically to save power */
454*53ee8cc1Swenshuai.xi usb_writeb(usb_readb((void*)(USBC_base+0x20*2)) & (U8)(~BIT4), (void*)(USBC_base+0x20*2));
455*53ee8cc1Swenshuai.xi #endif
456*53ee8cc1Swenshuai.xi
457*53ee8cc1Swenshuai.xi if (flag & EHCFLAG_TESTPKG)
458*53ee8cc1Swenshuai.xi {
459*53ee8cc1Swenshuai.xi usb_writew(0x0210, (void*) (UTMI_base+0x2C*2)); //
460*53ee8cc1Swenshuai.xi usb_writew(0x8100, (void*) (UTMI_base+0x2E*2)); //
461*53ee8cc1Swenshuai.xi
462*53ee8cc1Swenshuai.xi usb_writew(0x0600, (void*) (UTMI_base+0x14*2)); //
463*53ee8cc1Swenshuai.xi usb_writew(0x0038, (void*) (UTMI_base+0x10*2)); //
464*53ee8cc1Swenshuai.xi usb_writew(0x0BFE, (void*) (UTMI_base+0x32*2)); //
465*53ee8cc1Swenshuai.xi }
466*53ee8cc1Swenshuai.xi }
467*53ee8cc1Swenshuai.xi
MDrv_Usb_Init(mem_Alloc pfn_Cachedmem_Alloc,mem_Free pfn_Cachedmem_Free,mem_Alloc pfn_NonCachedmem_Alloc,mem_Free pfn_NonCachedmem_Free,mem_VA2PA pfn_mem_VA2PA,mem_PA2VA pfn_mem_PA2VA,mem_Cached2Noncached pfn_mem_Cached2Noncached,mem_NonCached2Cached pfn_mem_NonCached2Cached)468*53ee8cc1Swenshuai.xi void MDrv_Usb_Init(
469*53ee8cc1Swenshuai.xi mem_Alloc pfn_Cachedmem_Alloc,
470*53ee8cc1Swenshuai.xi mem_Free pfn_Cachedmem_Free,
471*53ee8cc1Swenshuai.xi mem_Alloc pfn_NonCachedmem_Alloc,
472*53ee8cc1Swenshuai.xi mem_Free pfn_NonCachedmem_Free,
473*53ee8cc1Swenshuai.xi mem_VA2PA pfn_mem_VA2PA,
474*53ee8cc1Swenshuai.xi mem_PA2VA pfn_mem_PA2VA,
475*53ee8cc1Swenshuai.xi mem_Cached2Noncached pfn_mem_Cached2Noncached,
476*53ee8cc1Swenshuai.xi mem_NonCached2Cached pfn_mem_NonCached2Cached
477*53ee8cc1Swenshuai.xi )
478*53ee8cc1Swenshuai.xi {
479*53ee8cc1Swenshuai.xi diag_printf("USB initial, %d port supported\n", NUM_OF_ROOT_HUB);
480*53ee8cc1Swenshuai.xi
481*53ee8cc1Swenshuai.xi pfnAllocCachedMem = pfn_Cachedmem_Alloc;
482*53ee8cc1Swenshuai.xi pfnFreeCachedMem = pfn_Cachedmem_Free;
483*53ee8cc1Swenshuai.xi pfnAllocNoncachedMem = pfn_NonCachedmem_Alloc;
484*53ee8cc1Swenshuai.xi pfnFreeNoncachedMem = pfn_NonCachedmem_Free;
485*53ee8cc1Swenshuai.xi pfnVA2PA = pfn_mem_VA2PA;
486*53ee8cc1Swenshuai.xi pfnPA2VA = pfn_mem_PA2VA;
487*53ee8cc1Swenshuai.xi pfnCached2Noncached = pfn_mem_Cached2Noncached;
488*53ee8cc1Swenshuai.xi pfnNoncached2Cached = pfn_mem_NonCached2Cached;
489*53ee8cc1Swenshuai.xi
490*53ee8cc1Swenshuai.xi ms_init_sys();
491*53ee8cc1Swenshuai.xi
492*53ee8cc1Swenshuai.xi USB_ASSERT(-1 == _s32UsbEventId, "USB event ID not valid!\n");
493*53ee8cc1Swenshuai.xi _s32UsbEventId = MsOS_CreateEventGroup("UHC_Event");
494*53ee8cc1Swenshuai.xi
495*53ee8cc1Swenshuai.xi quirk_list_init();
496*53ee8cc1Swenshuai.xi
497*53ee8cc1Swenshuai.xi diag_printf("Init USB MSC\n");
498*53ee8cc1Swenshuai.xi if (ms_usb_register(&usb_storage_driver) < 0)
499*53ee8cc1Swenshuai.xi USB_ASSERT( 0, "Init USB MSC fail..\n");
500*53ee8cc1Swenshuai.xi
501*53ee8cc1Swenshuai.xi #if USB_HID_SUPPORT
502*53ee8cc1Swenshuai.xi usb_hid_init();
503*53ee8cc1Swenshuai.xi #endif
504*53ee8cc1Swenshuai.xi
505*53ee8cc1Swenshuai.xi #if USB_CDC_SUPPORT
506*53ee8cc1Swenshuai.xi usb_cdc_init();
507*53ee8cc1Swenshuai.xi #endif
508*53ee8cc1Swenshuai.xi
509*53ee8cc1Swenshuai.xi // Decide the current chip
510*53ee8cc1Swenshuai.xi pCurrentChip = &chipDESC;
511*53ee8cc1Swenshuai.xi #if defined(CHIP_K2)
512*53ee8cc1Swenshuai.xi diag_printf("Chip Kaiserin!\n");
513*53ee8cc1Swenshuai.xi if (MDrv_SYS_GetChipRev() >= 0x01) // U02 and Newer IC
514*53ee8cc1Swenshuai.xi {
515*53ee8cc1Swenshuai.xi // chip top performance tuning [11:9]
516*53ee8cc1Swenshuai.xi usb_writew(usb_readw((void*)(KAISERIN_CHIP_TOP_BASE+0x46*2)) | 0xe00, (void*) (KAISERIN_CHIP_TOP_BASE+0x46*2));
517*53ee8cc1Swenshuai.xi }
518*53ee8cc1Swenshuai.xi #endif
519*53ee8cc1Swenshuai.xi // set the current chipID
520*53ee8cc1Swenshuai.xi pCurrentChip->chipID = ms_USBGetChipID();
521*53ee8cc1Swenshuai.xi
522*53ee8cc1Swenshuai.xi #ifdef _USB_ENABLE_BDMA_PATCH
523*53ee8cc1Swenshuai.xi /* get the registers and decide to turn on BDMA SW patch */
524*53ee8cc1Swenshuai.xi set_64bit_OBF_cipher();
525*53ee8cc1Swenshuai.xi #endif
526*53ee8cc1Swenshuai.xi // show Lib Infomation
527*53ee8cc1Swenshuai.xi diag_printf("[USB] MS USB Host Lib for %s only\n", pCurrentChip->name);
528*53ee8cc1Swenshuai.xi }
529*53ee8cc1Swenshuai.xi
MDrv_UsbClose(void)530*53ee8cc1Swenshuai.xi void MDrv_UsbClose(void)
531*53ee8cc1Swenshuai.xi {
532*53ee8cc1Swenshuai.xi ms_usb_deregister(&usb_storage_driver);
533*53ee8cc1Swenshuai.xi MsOS_DeleteEventGroup(_s32UsbEventId);
534*53ee8cc1Swenshuai.xi _s32UsbEventId = -1;
535*53ee8cc1Swenshuai.xi
536*53ee8cc1Swenshuai.xi ms_exit_sys();
537*53ee8cc1Swenshuai.xi diag_printf("[USB] End of MDrv_UsbClose...\n");
538*53ee8cc1Swenshuai.xi }
539*53ee8cc1Swenshuai.xi
540*53ee8cc1Swenshuai.xi #if 0 // NUSED
541*53ee8cc1Swenshuai.xi /*
542*53ee8cc1Swenshuai.xi <1>.Disable RunStop
543*53ee8cc1Swenshuai.xi <1.1>. Chirp hardware patch 1
544*53ee8cc1Swenshuai.xi <2> .Write PortReset=1
545*53ee8cc1Swenshuai.xi <3>.Wait time=>50ms
546*53ee8cc1Swenshuai.xi <3.1>. Chirp hardware patch 2
547*53ee8cc1Swenshuai.xi <3.2>. Wait time=>20ms
548*53ee8cc1Swenshuai.xi <4>.Write PortReset=0
549*53ee8cc1Swenshuai.xi <4.1>. Chirp hardware patch 3
550*53ee8cc1Swenshuai.xi <5>.Waiting for PortReset==0
551*53ee8cc1Swenshuai.xi <6>.Enable RunStop Bit
552*53ee8cc1Swenshuai.xi <6.1>.reset UTMI
553*53ee8cc1Swenshuai.xi <6.2> Write RunStop Bit=1
554*53ee8cc1Swenshuai.xi <6.3>.Wait time 5ms, wait some slow device to be ready
555*53ee8cc1Swenshuai.xi <7>.Detect Speed
556*53ee8cc1Swenshuai.xi */
557*53ee8cc1Swenshuai.xi #define MSTAR_CHIRP_PATCH 1
558*53ee8cc1Swenshuai.xi #define MSTAR_EHC_RTERM_PATCH 1
559*53ee8cc1Swenshuai.xi
560*53ee8cc1Swenshuai.xi int ms_PortReset(unsigned int regUTMI, unsigned int regUHC)
561*53ee8cc1Swenshuai.xi {
562*53ee8cc1Swenshuai.xi MS_U32 wTmp;
563*53ee8cc1Swenshuai.xi
564*53ee8cc1Swenshuai.xi diag_printf("PortReset: UTMI 0x%x, UHC 0x%x\n", regUTMI, regUHC);
565*53ee8cc1Swenshuai.xi
566*53ee8cc1Swenshuai.xi writeb(readb((void*)(regUHC+0x10*2)) | 0x1, (void*)(regUHC+0x10*2)); //Set UHC run
567*53ee8cc1Swenshuai.xi
568*53ee8cc1Swenshuai.xi #if MSTAR_CHIRP_PATCH
569*53ee8cc1Swenshuai.xi writeb(0x10, (void*)(regUTMI+0x2C*2));
570*53ee8cc1Swenshuai.xi writeb(0x00, (void*)(regUTMI+0x2D*2-1));
571*53ee8cc1Swenshuai.xi writeb(0x00, (void*)(regUTMI+0x2F*2-1));
572*53ee8cc1Swenshuai.xi writeb(0x80 ,(void*)(regUTMI+0x2A*2));
573*53ee8cc1Swenshuai.xi //writeb(0x20 ,(void*)(regUTMI+0x2A*2));
574*53ee8cc1Swenshuai.xi #endif
575*53ee8cc1Swenshuai.xi
576*53ee8cc1Swenshuai.xi #if (MSTAR_EHC_RTERM_PATCH)
577*53ee8cc1Swenshuai.xi writeb(readb((void*)(regUTMI+0x13*2-1))|0x70, (void*)(regUTMI+0x13*2-1));
578*53ee8cc1Swenshuai.xi #endif
579*53ee8cc1Swenshuai.xi
580*53ee8cc1Swenshuai.xi // Write PortReset bit
581*53ee8cc1Swenshuai.xi writeb(readb((void*)(regUHC+0x31*2-1)) | 0x01,(void*)(regUHC+0x31*2-1));
582*53ee8cc1Swenshuai.xi mdelay(50); //shorten the reset period for Transcend USB3.0 HDD
583*53ee8cc1Swenshuai.xi #if MSTAR_CHIRP_PATCH
584*53ee8cc1Swenshuai.xi writeb(0x0 ,(void*)(regUTMI+0x2A*2));
585*53ee8cc1Swenshuai.xi #endif
586*53ee8cc1Swenshuai.xi mdelay(20);
587*53ee8cc1Swenshuai.xi
588*53ee8cc1Swenshuai.xi // Clear PortReset bit
589*53ee8cc1Swenshuai.xi writeb(readb((void*)(regUHC+0x31*2-1)) & 0xfe,(void*)(regUHC+0x31*2-1));
590*53ee8cc1Swenshuai.xi
591*53ee8cc1Swenshuai.xi wTmp=0;
592*53ee8cc1Swenshuai.xi
593*53ee8cc1Swenshuai.xi while (1)
594*53ee8cc1Swenshuai.xi {
595*53ee8cc1Swenshuai.xi if ((readb((void*)(regUHC+0x31*2-1)) & 0x1)==0) break;
596*53ee8cc1Swenshuai.xi
597*53ee8cc1Swenshuai.xi wTmp++;
598*53ee8cc1Swenshuai.xi //udelay(1);
599*53ee8cc1Swenshuai.xi if (wTmp>20000)
600*53ee8cc1Swenshuai.xi {
601*53ee8cc1Swenshuai.xi diag_printf("??? Error waiting for Bus Reset Fail...==> Reset HW Control\n");
602*53ee8cc1Swenshuai.xi //mbHost20_USBCMD_HCReset_Set();
603*53ee8cc1Swenshuai.xi writeb(readb((void*)(regUHC+0x10*2)) | 0x2,(void*)(regUHC+0x10*2));
604*53ee8cc1Swenshuai.xi
605*53ee8cc1Swenshuai.xi //while(mbHost20_USBCMD_HCReset_Rd()==1);
606*53ee8cc1Swenshuai.xi while(readb((void*)(regUHC+0x10*2)) && 0x2);
607*53ee8cc1Swenshuai.xi return (1);
608*53ee8cc1Swenshuai.xi }
609*53ee8cc1Swenshuai.xi }
610*53ee8cc1Swenshuai.xi
611*53ee8cc1Swenshuai.xi
612*53ee8cc1Swenshuai.xi #if (MSTAR_CHIRP_PATCH)
613*53ee8cc1Swenshuai.xi writeb(readb((void*)(regUTMI+0x2c*2)) |0x10, (void*) (regUTMI+0x2c*2));
614*53ee8cc1Swenshuai.xi writeb(readb((void*)(regUTMI+0x2d*2-1)) |0x02, (void*) (regUTMI+0x2d*2-1));
615*53ee8cc1Swenshuai.xi writeb(readb((void*)(regUTMI+0x2f*2-1)) |0x81, (void*) (regUTMI+0x2f*2-1));
616*53ee8cc1Swenshuai.xi #endif
617*53ee8cc1Swenshuai.xi
618*53ee8cc1Swenshuai.xi #if (MSTAR_EHC_RTERM_PATCH)
619*53ee8cc1Swenshuai.xi writeb(readb((void*)(regUTMI+0x13*2-1))&0x8F, (void*)(regUTMI+0x13*2-1));
620*53ee8cc1Swenshuai.xi #endif
621*53ee8cc1Swenshuai.xi
622*53ee8cc1Swenshuai.xi writeb(readb((void*)(regUTMI+0x06*2))|0x03, (void*)(regUTMI+0x06*2)); //reset UTMI
623*53ee8cc1Swenshuai.xi writeb(readb((void*)(regUTMI+0x06*2))&(~0x03), (void*)(regUTMI+0x06*2)); //reset UTMI
624*53ee8cc1Swenshuai.xi
625*53ee8cc1Swenshuai.xi writeb(readb((void*)(regUHC+0x10*2)) | 0x1, (void*)(regUHC+0x10*2)); //Set UHC run
626*53ee8cc1Swenshuai.xi
627*53ee8cc1Swenshuai.xi mdelay(5); //wait some slow device to be ready
628*53ee8cc1Swenshuai.xi
629*53ee8cc1Swenshuai.xi return (0);
630*53ee8cc1Swenshuai.xi }
631*53ee8cc1Swenshuai.xi #endif
632*53ee8cc1Swenshuai.xi
633*53ee8cc1Swenshuai.xi extern BOOL ms_usb_get_connected_dev_state(int *pdevstate,
634*53ee8cc1Swenshuai.xi unsigned char *pDevClass, struct usb_device *pusbdev, BOOL *pIntfDrvMatched);
635*53ee8cc1Swenshuai.xi
__ms_USBCriticalSectionIn(MS_U8 u8Hostid,MS_U32 WaitMs)636*53ee8cc1Swenshuai.xi MS_BOOL __ms_USBCriticalSectionIn(MS_U8 u8Hostid, MS_U32 WaitMs)
637*53ee8cc1Swenshuai.xi {
638*53ee8cc1Swenshuai.xi MS_BOOL retval = false;
639*53ee8cc1Swenshuai.xi struct s_gVar4UsbPort *pRootHub = pCurrentChip->p_roothub[u8Hostid];
640*53ee8cc1Swenshuai.xi
641*53ee8cc1Swenshuai.xi retval = MsOS_ObtainMutex(pRootHub->_s32MutexUSB, WaitMs);
642*53ee8cc1Swenshuai.xi
643*53ee8cc1Swenshuai.xi //lock_usb_core(); // NUSED
644*53ee8cc1Swenshuai.xi
645*53ee8cc1Swenshuai.xi return retval;
646*53ee8cc1Swenshuai.xi }
647*53ee8cc1Swenshuai.xi
ms_USBCriticalSectionIn_TimeOut(MS_U8 Port,MS_U32 WaitMs)648*53ee8cc1Swenshuai.xi MS_BOOL ms_USBCriticalSectionIn_TimeOut(MS_U8 Port, MS_U32 WaitMs)
649*53ee8cc1Swenshuai.xi {
650*53ee8cc1Swenshuai.xi return __ms_USBCriticalSectionIn(Port, WaitMs);
651*53ee8cc1Swenshuai.xi }
652*53ee8cc1Swenshuai.xi
ms_USBCriticalSectionIn(MS_U8 Port)653*53ee8cc1Swenshuai.xi MS_BOOL ms_USBCriticalSectionIn(MS_U8 Port)
654*53ee8cc1Swenshuai.xi {
655*53ee8cc1Swenshuai.xi return __ms_USBCriticalSectionIn(Port, MSOS_WAIT_FOREVER);
656*53ee8cc1Swenshuai.xi }
657*53ee8cc1Swenshuai.xi
ms_USBCriticalSectionOut(MS_U8 u8Hostid)658*53ee8cc1Swenshuai.xi void ms_USBCriticalSectionOut(MS_U8 u8Hostid)
659*53ee8cc1Swenshuai.xi {
660*53ee8cc1Swenshuai.xi struct s_gVar4UsbPort *pRootHub = pCurrentChip->p_roothub[u8Hostid];
661*53ee8cc1Swenshuai.xi
662*53ee8cc1Swenshuai.xi //unlock_usb_core(); // NUSED
663*53ee8cc1Swenshuai.xi MsOS_ReleaseMutex(pRootHub->_s32MutexUSB);
664*53ee8cc1Swenshuai.xi }
665*53ee8cc1Swenshuai.xi
666*53ee8cc1Swenshuai.xi // ------------------------------------------------------------------------
667*53ee8cc1Swenshuai.xi
668*53ee8cc1Swenshuai.xi struct s_gVar4UsbPort gVar4UsbPort0 =
669*53ee8cc1Swenshuai.xi {
670*53ee8cc1Swenshuai.xi "USB Hub Task",
671*53ee8cc1Swenshuai.xi 0,
672*53ee8cc1Swenshuai.xi { 0*MAX_USTOR, 1*MAX_USTOR},
673*53ee8cc1Swenshuai.xi "cpe_ehci",
674*53ee8cc1Swenshuai.xi "CPE_AMBA EHCI",
675*53ee8cc1Swenshuai.xi u8HubStackBuffer,
676*53ee8cc1Swenshuai.xi "USB_MUTEX",
677*53ee8cc1Swenshuai.xi };
678*53ee8cc1Swenshuai.xi
679*53ee8cc1Swenshuai.xi #ifdef ENABLE_THIRD_EHC
680*53ee8cc1Swenshuai.xi MS_U8 u8HubStackBuffer_Port2[HUB_STACK_SIZE];
681*53ee8cc1Swenshuai.xi struct s_gVar4UsbPort gVar4UsbPort2 =
682*53ee8cc1Swenshuai.xi {
683*53ee8cc1Swenshuai.xi "USB Hub Task 2",
684*53ee8cc1Swenshuai.xi 2,
685*53ee8cc1Swenshuai.xi { 2*MAX_USTOR, 3*MAX_USTOR},
686*53ee8cc1Swenshuai.xi "cpe_ehci_2",
687*53ee8cc1Swenshuai.xi "CPE_AMBA EHCI 2",
688*53ee8cc1Swenshuai.xi u8HubStackBuffer_Port2,
689*53ee8cc1Swenshuai.xi "USB_MUTEX_Port2",
690*53ee8cc1Swenshuai.xi };
691*53ee8cc1Swenshuai.xi #endif
692*53ee8cc1Swenshuai.xi
693*53ee8cc1Swenshuai.xi static MS_U8 u8HubStackBuffer_Port1[HUB_STACK_SIZE];
694*53ee8cc1Swenshuai.xi struct s_gVar4UsbPort gVar4UsbPort1 =
695*53ee8cc1Swenshuai.xi {
696*53ee8cc1Swenshuai.xi "USB Hub Task 1",
697*53ee8cc1Swenshuai.xi 1,
698*53ee8cc1Swenshuai.xi { MAX_USTOR, 2*MAX_USTOR},
699*53ee8cc1Swenshuai.xi "cpe_ehci_1",
700*53ee8cc1Swenshuai.xi "CPE_AMBA EHCI 1",
701*53ee8cc1Swenshuai.xi u8HubStackBuffer_Port1,
702*53ee8cc1Swenshuai.xi "USB_MUTEX_Port1",
703*53ee8cc1Swenshuai.xi };
704*53ee8cc1Swenshuai.xi
705*53ee8cc1Swenshuai.xi #ifdef ENABLE_FOURTH_EHC
706*53ee8cc1Swenshuai.xi static MS_U8 u8HubStackBuffer_Port3[HUB_STACK_SIZE];
707*53ee8cc1Swenshuai.xi struct s_gVar4UsbPort gVar4UsbPort3 =
708*53ee8cc1Swenshuai.xi {
709*53ee8cc1Swenshuai.xi "USB Hub Task 3",
710*53ee8cc1Swenshuai.xi 3,
711*53ee8cc1Swenshuai.xi { 3*MAX_USTOR, 4*MAX_USTOR},
712*53ee8cc1Swenshuai.xi "cpe_ehci_3",
713*53ee8cc1Swenshuai.xi "CPE_AMBA EHCI 3",
714*53ee8cc1Swenshuai.xi u8HubStackBuffer_Port3,
715*53ee8cc1Swenshuai.xi "USB_MUTEX_Port3",
716*53ee8cc1Swenshuai.xi };
717*53ee8cc1Swenshuai.xi #endif
718*53ee8cc1Swenshuai.xi
719*53ee8cc1Swenshuai.xi #ifdef ENABLE_FIFTH_EHC
720*53ee8cc1Swenshuai.xi static MS_U8 u8HubStackBuffer_Port4[HUB_STACK_SIZE];
721*53ee8cc1Swenshuai.xi struct s_gVar4UsbPort gVar4UsbPort4 =
722*53ee8cc1Swenshuai.xi {
723*53ee8cc1Swenshuai.xi "USB Hub Task 4",
724*53ee8cc1Swenshuai.xi 4,
725*53ee8cc1Swenshuai.xi { 4*MAX_USTOR, 5*MAX_USTOR},
726*53ee8cc1Swenshuai.xi "cpe_ehci_4",
727*53ee8cc1Swenshuai.xi "CPE_AMBA EHCI 4",
728*53ee8cc1Swenshuai.xi u8HubStackBuffer_Port4,
729*53ee8cc1Swenshuai.xi "USB_MUTEX_Port4",
730*53ee8cc1Swenshuai.xi };
731*53ee8cc1Swenshuai.xi #endif
732*53ee8cc1Swenshuai.xi
733*53ee8cc1Swenshuai.xi /* USB host declaration by chip ID */
734*53ee8cc1Swenshuai.xi #if defined(CHIP_U4)
735*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC =
736*53ee8cc1Swenshuai.xi {
737*53ee8cc1Swenshuai.xi CHIPID_URANUS4,
738*53ee8cc1Swenshuai.xi "URANUS4",
739*53ee8cc1Swenshuai.xi 3,
740*53ee8cc1Swenshuai.xi {
741*53ee8cc1Swenshuai.xi {0, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC_NULL, E_IRQ_UHC, E_IRQ_USBC},
742*53ee8cc1Swenshuai.xi {0, BASE_UTMI1, BASE_UHC1, BASE_USBC1, BASE_USBBC_NULL, E_IRQ_UHC1, E_IRQ_USBC1},
743*53ee8cc1Swenshuai.xi {EHCFLAG_DPDM_SWAP, BASE_UTMI2, BASE_UHC2, BASE_USBC2, BASE_USBBC_NULL, E_IRQ_UHC2, E_IRQ_USBC2},
744*53ee8cc1Swenshuai.xi },
745*53ee8cc1Swenshuai.xi {&gVar4UsbPort0, &gVar4UsbPort1, &gVar4UsbPort2}
746*53ee8cc1Swenshuai.xi };
747*53ee8cc1Swenshuai.xi #elif defined(CHIP_K1)
748*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC =
749*53ee8cc1Swenshuai.xi {
750*53ee8cc1Swenshuai.xi CHIPID_KRONUS,
751*53ee8cc1Swenshuai.xi "KRONUS",
752*53ee8cc1Swenshuai.xi 2,
753*53ee8cc1Swenshuai.xi {
754*53ee8cc1Swenshuai.xi {EHCFLAG_DPDM_SWAP, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC_NULL, E_IRQ_UHC, E_IRQ_USBC },
755*53ee8cc1Swenshuai.xi {EHCFLAG_DPDM_SWAP, BASE_UTMI2, BASE_UHC2, BASE_USBC2, BASE_USBBC_NULL, E_IRQ_UHC2, E_IRQ_USBC2},
756*53ee8cc1Swenshuai.xi },
757*53ee8cc1Swenshuai.xi {&gVar4UsbPort0, &gVar4UsbPort1, }
758*53ee8cc1Swenshuai.xi };
759*53ee8cc1Swenshuai.xi #elif defined(CHIP_K2)
760*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC =
761*53ee8cc1Swenshuai.xi {
762*53ee8cc1Swenshuai.xi CHIPID_KAISERIN,
763*53ee8cc1Swenshuai.xi "KAISERIN",
764*53ee8cc1Swenshuai.xi 4,
765*53ee8cc1Swenshuai.xi {
766*53ee8cc1Swenshuai.xi {0, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC_NULL, E_IRQ_UHC, E_IRQ_USBC},
767*53ee8cc1Swenshuai.xi {0, BASE_UTMI1, BASE_UHC1, BASE_USBC1, BASE_USBBC_NULL, E_IRQ_UHC1, E_IRQ_USBC1},
768*53ee8cc1Swenshuai.xi {0, BASE_UTMI2, BASE_UHC2, BASE_USBC2, BASE_USBBC_NULL, E_IRQ_UHC2, E_IRQ_USBC2},
769*53ee8cc1Swenshuai.xi {0, BASE_UTMI3, BASE_UHC3, BASE_USBC3, BASE_USBBC_NULL, E_IRQ_UHC3, E_IRQ_USBC3},
770*53ee8cc1Swenshuai.xi },
771*53ee8cc1Swenshuai.xi {&gVar4UsbPort0, &gVar4UsbPort1, &gVar4UsbPort2, &gVar4UsbPort3}
772*53ee8cc1Swenshuai.xi };
773*53ee8cc1Swenshuai.xi #elif defined(CHIP_KAPPA)
774*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC =
775*53ee8cc1Swenshuai.xi {
776*53ee8cc1Swenshuai.xi CHIPID_KAPPA,
777*53ee8cc1Swenshuai.xi "KAPPA",
778*53ee8cc1Swenshuai.xi 1,
779*53ee8cc1Swenshuai.xi {
780*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC0_KAPPA, E_IRQ_UHC, E_IRQ_USBC},
781*53ee8cc1Swenshuai.xi },
782*53ee8cc1Swenshuai.xi {&gVar4UsbPort0}
783*53ee8cc1Swenshuai.xi };
784*53ee8cc1Swenshuai.xi #elif defined(CHIP_KRITI)
785*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC =
786*53ee8cc1Swenshuai.xi {
787*53ee8cc1Swenshuai.xi CHIPID_KRITI,
788*53ee8cc1Swenshuai.xi "KRITI",
789*53ee8cc1Swenshuai.xi 1,
790*53ee8cc1Swenshuai.xi {
791*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC0_KAPPA, E_IRQ_UHC, E_IRQ_USBC},
792*53ee8cc1Swenshuai.xi },
793*53ee8cc1Swenshuai.xi {&gVar4UsbPort0}
794*53ee8cc1Swenshuai.xi };
795*53ee8cc1Swenshuai.xi #elif defined(CHIP_KRATOS)
796*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC =
797*53ee8cc1Swenshuai.xi {
798*53ee8cc1Swenshuai.xi CHIPID_KRATOS,
799*53ee8cc1Swenshuai.xi "KRATOS",
800*53ee8cc1Swenshuai.xi 2,
801*53ee8cc1Swenshuai.xi {
802*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC0_KRATOS, E_IRQ_UHC, E_IRQ_USBC},
803*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI1, BASE_UHC1, BASE_USBC1, BASE_USBBC1_KRATOS, E_IRQ_UHC1, E_IRQ_USBC1},
804*53ee8cc1Swenshuai.xi },
805*53ee8cc1Swenshuai.xi {&gVar4UsbPort0, &gVar4UsbPort1}
806*53ee8cc1Swenshuai.xi };
807*53ee8cc1Swenshuai.xi #elif defined(CHIP_KELTIC)
808*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC =
809*53ee8cc1Swenshuai.xi {
810*53ee8cc1Swenshuai.xi CHIPID_KELTIC,
811*53ee8cc1Swenshuai.xi "KELTIC",
812*53ee8cc1Swenshuai.xi 1,
813*53ee8cc1Swenshuai.xi {
814*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC0_KELTIC, E_IRQ_UHC, E_IRQ_USBC},
815*53ee8cc1Swenshuai.xi },
816*53ee8cc1Swenshuai.xi {&gVar4UsbPort0}
817*53ee8cc1Swenshuai.xi };
818*53ee8cc1Swenshuai.xi #elif defined(CHIP_KENYA)
819*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC =
820*53ee8cc1Swenshuai.xi {
821*53ee8cc1Swenshuai.xi CHIPID_KENYA,
822*53ee8cc1Swenshuai.xi "KENYA",
823*53ee8cc1Swenshuai.xi 2,
824*53ee8cc1Swenshuai.xi {
825*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC0_KENYA, E_IRQ_UHC, E_IRQ_USBC},
826*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI1, BASE_UHC1, BASE_USBC1, BASE_USBBC1_KENYA, E_IRQ_UHC1, E_IRQ_USBC1},
827*53ee8cc1Swenshuai.xi },
828*53ee8cc1Swenshuai.xi {&gVar4UsbPort0, &gVar4UsbPort1}
829*53ee8cc1Swenshuai.xi };
830*53ee8cc1Swenshuai.xi #elif defined(CHIP_KAISER)
831*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC =
832*53ee8cc1Swenshuai.xi {
833*53ee8cc1Swenshuai.xi CHIPID_KAISER,
834*53ee8cc1Swenshuai.xi "KAISER",
835*53ee8cc1Swenshuai.xi 3,
836*53ee8cc1Swenshuai.xi {
837*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF | EHCFLAG_DPDM_SWAP, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC0_KAISER, E_IRQ_UHC, E_IRQ_USBC},
838*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF | EHCFLAG_DPDM_SWAP, BASE_UTMI1, BASE_UHC1, BASE_USBC1, BASE_USBBC1_KAISER, E_IRQ_UHC1, E_IRQ_USBC1},
839*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI2, BASE_UHC2, BASE_USBC2, BASE_USBBC2_KAISER, E_IRQ_UHC2, E_IRQ_USBC2},
840*53ee8cc1Swenshuai.xi },
841*53ee8cc1Swenshuai.xi {&gVar4UsbPort0, &gVar4UsbPort1, &gVar4UsbPort2}
842*53ee8cc1Swenshuai.xi };
843*53ee8cc1Swenshuai.xi #elif defined(CHIP_KERES)
844*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC =
845*53ee8cc1Swenshuai.xi {
846*53ee8cc1Swenshuai.xi CHIPID_KERES,
847*53ee8cc1Swenshuai.xi "KERES",
848*53ee8cc1Swenshuai.xi 2,
849*53ee8cc1Swenshuai.xi {
850*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC0_KERES, E_IRQ_UHC, E_IRQ_USBC},
851*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI1, BASE_UHC1, BASE_USBC1, BASE_USBBC1_KERES, E_IRQ_UHC1, E_IRQ_USBC1},
852*53ee8cc1Swenshuai.xi },
853*53ee8cc1Swenshuai.xi {&gVar4UsbPort0, &gVar4UsbPort1}
854*53ee8cc1Swenshuai.xi };
855*53ee8cc1Swenshuai.xi #elif defined(CHIP_KIRIN)
856*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC =
857*53ee8cc1Swenshuai.xi {
858*53ee8cc1Swenshuai.xi CHIPID_KIRIN,
859*53ee8cc1Swenshuai.xi "KIRIN",
860*53ee8cc1Swenshuai.xi 2,
861*53ee8cc1Swenshuai.xi {
862*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC0_KERES, E_IRQ_UHC, E_IRQ_USBC},
863*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI1, BASE_UHC1, BASE_USBC1, BASE_USBBC1_KERES, E_IRQ_UHC1, E_IRQ_USBC1},
864*53ee8cc1Swenshuai.xi },
865*53ee8cc1Swenshuai.xi {&gVar4UsbPort0, &gVar4UsbPort1}
866*53ee8cc1Swenshuai.xi };
867*53ee8cc1Swenshuai.xi #elif defined(CHIP_KRIS)
868*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC =
869*53ee8cc1Swenshuai.xi {
870*53ee8cc1Swenshuai.xi CHIPID_KRIS,
871*53ee8cc1Swenshuai.xi "KRIS",
872*53ee8cc1Swenshuai.xi 2,
873*53ee8cc1Swenshuai.xi {
874*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC0_KERES, E_IRQ_UHC, E_IRQ_USBC},
875*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI1, BASE_UHC1, BASE_USBC1, BASE_USBBC1_KERES, E_IRQ_UHC1, E_IRQ_USBC1},
876*53ee8cc1Swenshuai.xi },
877*53ee8cc1Swenshuai.xi {&gVar4UsbPort0, &gVar4UsbPort1}
878*53ee8cc1Swenshuai.xi };
879*53ee8cc1Swenshuai.xi #elif defined(CHIP_KIWI)
880*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC =
881*53ee8cc1Swenshuai.xi {
882*53ee8cc1Swenshuai.xi CHIPID_KIWI,
883*53ee8cc1Swenshuai.xi "KIWI",
884*53ee8cc1Swenshuai.xi 2,
885*53ee8cc1Swenshuai.xi {
886*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF | EHCFLAG_DPDM_SWAP, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC0_KIWI, E_IRQ_UHC, E_IRQ_USBC},
887*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF | EHCFLAG_DPDM_SWAP, BASE_UTMI1, BASE_UHC1, BASE_USBC1, BASE_USBBC1_KIWI, E_IRQ_UHC1, E_IRQ_USBC1},
888*53ee8cc1Swenshuai.xi },
889*53ee8cc1Swenshuai.xi {&gVar4UsbPort0, &gVar4UsbPort1}
890*53ee8cc1Swenshuai.xi };
891*53ee8cc1Swenshuai.xi #elif defined(CHIP_CLIPPERS)
892*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC =
893*53ee8cc1Swenshuai.xi {
894*53ee8cc1Swenshuai.xi CHIPID_CLIPPERS,
895*53ee8cc1Swenshuai.xi "CLIPPERS",
896*53ee8cc1Swenshuai.xi 3,
897*53ee8cc1Swenshuai.xi {
898*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC0_CLIPPERS, E_IRQ_UHC, E_IRQ_USBC},
899*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI1, BASE_UHC1, BASE_USBC1, BASE_USBBC1_CLIPPERS, E_IRQ_UHC1, E_IRQ_USBC1},
900*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI2_CLIPPERS, BASE_UHC2_CLIPPERS, BASE_USBC2_CLIPPERS, BASE_USBBC2_CLIPPERS, E_IRQ_UHC2, E_IRQ_USBC2},
901*53ee8cc1Swenshuai.xi },
902*53ee8cc1Swenshuai.xi {&gVar4UsbPort0, &gVar4UsbPort1, &gVar4UsbPort2}
903*53ee8cc1Swenshuai.xi };
904*53ee8cc1Swenshuai.xi #elif defined(CHIP_CURRY)
905*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC =
906*53ee8cc1Swenshuai.xi {
907*53ee8cc1Swenshuai.xi CHIPID_CURRY,
908*53ee8cc1Swenshuai.xi "CURRY",
909*53ee8cc1Swenshuai.xi 3,
910*53ee8cc1Swenshuai.xi {
911*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC0_CURRY, E_IRQ_UHC, E_IRQ_USBC},
912*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI1, BASE_UHC1, BASE_USBC1, BASE_USBBC1_CURRY, E_IRQ_UHC1, E_IRQ_USBC1},
913*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI2_CURRY, BASE_UHC2, BASE_USBC2, BASE_USBBC2_CURRY, E_IRQ_UHC2, E_IRQ_USBC2},
914*53ee8cc1Swenshuai.xi },
915*53ee8cc1Swenshuai.xi {&gVar4UsbPort0, &gVar4UsbPort1, &gVar4UsbPort2}
916*53ee8cc1Swenshuai.xi };
917*53ee8cc1Swenshuai.xi #elif defined(CHIP_KAYLA)
918*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC =
919*53ee8cc1Swenshuai.xi {
920*53ee8cc1Swenshuai.xi CHIPID_KAYLA,
921*53ee8cc1Swenshuai.xi "KAYLA",
922*53ee8cc1Swenshuai.xi 2,
923*53ee8cc1Swenshuai.xi {
924*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC0_KERES, E_IRQ_UHC, E_IRQ_USBC},
925*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI1, BASE_UHC1, BASE_USBC1, BASE_USBBC1_KERES, E_IRQ_UHC1, E_IRQ_USBC1},
926*53ee8cc1Swenshuai.xi },
927*53ee8cc1Swenshuai.xi {&gVar4UsbPort0, &gVar4UsbPort1}
928*53ee8cc1Swenshuai.xi };
929*53ee8cc1Swenshuai.xi #elif defined(CHIP_KANO)
930*53ee8cc1Swenshuai.xi #if 1 // for compile
931*53ee8cc1Swenshuai.xi #define E_INT_IRQ_UHC4 0xff
932*53ee8cc1Swenshuai.xi #define E_INT_IRQ_USB4 0xff
933*53ee8cc1Swenshuai.xi #endif
934*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC =
935*53ee8cc1Swenshuai.xi {
936*53ee8cc1Swenshuai.xi CHIPID_KANO,
937*53ee8cc1Swenshuai.xi "KANO",
938*53ee8cc1Swenshuai.xi #ifdef ENABLE_XHC_COMPANION
939*53ee8cc1Swenshuai.xi 5,
940*53ee8cc1Swenshuai.xi {
941*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC0_KANO, E_IRQ_UHC, E_IRQ_USBC, XHC_COMP_NONE},
942*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI1, BASE_UHC1, BASE_USBC1, BASE_USBBC1_KANO, E_IRQ_UHC1, E_IRQ_USBC1, XHC_COMP_NONE},
943*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI2_KANO, BASE_UHC2, BASE_USBC2, BASE_USBBC2_KANO, E_IRQ_UHC2, E_IRQ_USBC2, XHC_COMP_NONE},
944*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF | EHCFLAF_XHC_COMP, BASE_UTMI3_KANO, BASE_UHC3_KANO, BASE_USBC3_KANO, BASE_USBBC3_KANO, E_IRQ_UHC3, E_IRQ_USBC3, XHC_COMP_PORT0},
945*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF | EHCFLAF_XHC_COMP, BASE_UTMI4_KANO, BASE_UHC4_KANO, BASE_USBC4_KANO, BASE_USBBC4_KANO, E_IRQ_UHC4, E_IRQ_USBC4, XHC_COMP_PORT1},
946*53ee8cc1Swenshuai.xi },
947*53ee8cc1Swenshuai.xi {&gVar4UsbPort0, &gVar4UsbPort1, &gVar4UsbPort2, &gVar4UsbPort3, &gVar4UsbPort4}
948*53ee8cc1Swenshuai.xi #else
949*53ee8cc1Swenshuai.xi 3,
950*53ee8cc1Swenshuai.xi {
951*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC0_KANO, E_IRQ_UHC, E_IRQ_USBC},
952*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI1, BASE_UHC1, BASE_USBC1, BASE_USBBC1_KANO, E_IRQ_UHC1, E_IRQ_USBC1},
953*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI2_KANO, BASE_UHC2, BASE_USBC2, BASE_USBBC2_KANO, E_IRQ_UHC2, E_IRQ_USBC2},
954*53ee8cc1Swenshuai.xi },
955*53ee8cc1Swenshuai.xi {&gVar4UsbPort0, &gVar4UsbPort1, &gVar4UsbPort2}
956*53ee8cc1Swenshuai.xi #endif
957*53ee8cc1Swenshuai.xi };
958*53ee8cc1Swenshuai.xi #elif defined(CHIP_K6)
959*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC =
960*53ee8cc1Swenshuai.xi {
961*53ee8cc1Swenshuai.xi CHIPID_K6,
962*53ee8cc1Swenshuai.xi "K6",
963*53ee8cc1Swenshuai.xi #ifdef ENABLE_XHC_COMPANION
964*53ee8cc1Swenshuai.xi 3,
965*53ee8cc1Swenshuai.xi {
966*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC0_K6, E_IRQ_UHC, E_IRQ_USBC, XHC_COMP_NONE},
967*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI1, BASE_UHC1, BASE_USBC1, BASE_USBBC1_K6, E_IRQ_UHC1, E_IRQ_USBC1, XHC_COMP_NONE},
968*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF | EHCFLAF_XHC_COMP, BASE_UTMI2_K6, BASE_UHC2_K6, BASE_USBC2_K6, BASE_USBBC2_K6, E_IRQ_UHC2_K6, E_IRQ_USBC2_K6, XHC_COMP_PORT0},
969*53ee8cc1Swenshuai.xi },
970*53ee8cc1Swenshuai.xi {&gVar4UsbPort0, &gVar4UsbPort1, &gVar4UsbPort2}
971*53ee8cc1Swenshuai.xi #else
972*53ee8cc1Swenshuai.xi 2,
973*53ee8cc1Swenshuai.xi {
974*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC0_K6, E_IRQ_UHC, E_IRQ_USBC},
975*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI1, BASE_UHC1, BASE_USBC1, BASE_USBBC1_K6, E_IRQ_UHC1, E_IRQ_USBC1},
976*53ee8cc1Swenshuai.xi },
977*53ee8cc1Swenshuai.xi {&gVar4UsbPort0, &gVar4UsbPort1}
978*53ee8cc1Swenshuai.xi #endif
979*53ee8cc1Swenshuai.xi };
980*53ee8cc1Swenshuai.xi #elif defined(CHIP_K6LITE)
981*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC =
982*53ee8cc1Swenshuai.xi {
983*53ee8cc1Swenshuai.xi CHIPID_K6LITE,
984*53ee8cc1Swenshuai.xi "K6LITE",
985*53ee8cc1Swenshuai.xi 3,
986*53ee8cc1Swenshuai.xi {
987*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC0_K6LITE, E_IRQ_UHC, E_IRQ_USBC},
988*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI1, BASE_UHC1, BASE_USBC1, BASE_USBBC1_K6LITE, E_IRQ_UHC1, E_IRQ_USBC1},
989*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI2_K6LITE, BASE_UHC2_K6LITE, BASE_USBC2_K6LITE, BASE_USBBC2_K6LITE, E_IRQ_UHC2, E_IRQ_USBC2},
990*53ee8cc1Swenshuai.xi },
991*53ee8cc1Swenshuai.xi {&gVar4UsbPort0, &gVar4UsbPort1, &gVar4UsbPort2}
992*53ee8cc1Swenshuai.xi };
993*53ee8cc1Swenshuai.xi #elif defined(CHIP_K5TN)
994*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipDESC =
995*53ee8cc1Swenshuai.xi {
996*53ee8cc1Swenshuai.xi CHIPID_K5TN,
997*53ee8cc1Swenshuai.xi "K5TN",
998*53ee8cc1Swenshuai.xi 2,
999*53ee8cc1Swenshuai.xi {
1000*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI0, BASE_UHC0, BASE_USBC0, BASE_USBBC0_KERES, E_IRQ_UHC, E_IRQ_USBC},
1001*53ee8cc1Swenshuai.xi {EHCFLAG_USBBC_OFF, BASE_UTMI1, BASE_UHC1, BASE_USBC1, BASE_USBBC1_KERES, E_IRQ_UHC1, E_IRQ_USBC1},
1002*53ee8cc1Swenshuai.xi },
1003*53ee8cc1Swenshuai.xi {&gVar4UsbPort0, &gVar4UsbPort1}
1004*53ee8cc1Swenshuai.xi };
1005*53ee8cc1Swenshuai.xi #else
1006*53ee8cc1Swenshuai.xi #error No USB Chip definition
1007*53ee8cc1Swenshuai.xi #endif
1008*53ee8cc1Swenshuai.xi
1009*53ee8cc1Swenshuai.xi // any new chip added here ^^^
1010*53ee8cc1Swenshuai.xi //
1011*53ee8cc1Swenshuai.xi
1012*53ee8cc1Swenshuai.xi /**
1013*53ee8cc1Swenshuai.xi * @brief USB port N interrupt service routine
1014*53ee8cc1Swenshuai.xi *
1015*53ee8cc1Swenshuai.xi * @param InterruptNum eIntNum
1016*53ee8cc1Swenshuai.xi *
1017*53ee8cc1Swenshuai.xi * @return none
1018*53ee8cc1Swenshuai.xi */
ms_DrvUSB_OnInterrupt_EX(InterruptNum eIntNum)1019*53ee8cc1Swenshuai.xi static void ms_DrvUSB_OnInterrupt_EX(InterruptNum eIntNum)
1020*53ee8cc1Swenshuai.xi {
1021*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef *pChip = pCurrentChip;
1022*53ee8cc1Swenshuai.xi struct usb_hcd *hcd;
1023*53ee8cc1Swenshuai.xi MS_U8 p;
1024*53ee8cc1Swenshuai.xi
1025*53ee8cc1Swenshuai.xi if (pChip == NULL)
1026*53ee8cc1Swenshuai.xi return;
1027*53ee8cc1Swenshuai.xi MsOS_DisableInterrupt(eIntNum);
1028*53ee8cc1Swenshuai.xi for (p = 0; p < pChip->nRootHub; p++)
1029*53ee8cc1Swenshuai.xi {
1030*53ee8cc1Swenshuai.xi if (eIntNum == pChip->reg[p].uhcIRQ)
1031*53ee8cc1Swenshuai.xi break;
1032*53ee8cc1Swenshuai.xi }
1033*53ee8cc1Swenshuai.xi hcd = pChip->p_roothub[p]->cpe_ehci_dev.dev.driver_data;
1034*53ee8cc1Swenshuai.xi ms_ehci_irq(hcd, NULL);
1035*53ee8cc1Swenshuai.xi MsOS_EnableInterrupt(eIntNum);
1036*53ee8cc1Swenshuai.xi }
1037*53ee8cc1Swenshuai.xi
1038*53ee8cc1Swenshuai.xi /**
1039*53ee8cc1Swenshuai.xi * @brief initial USB port N interrupt service routine
1040*53ee8cc1Swenshuai.xi *
1041*53ee8cc1Swenshuai.xi * @param InterruptNum eIntNum
1042*53ee8cc1Swenshuai.xi *
1043*53ee8cc1Swenshuai.xi * @return none
1044*53ee8cc1Swenshuai.xi */
ms_InitUSBIntr_EX(struct usb_hcd * hcd,int str_on)1045*53ee8cc1Swenshuai.xi void ms_InitUSBIntr_EX(struct usb_hcd * hcd, int str_on)
1046*53ee8cc1Swenshuai.xi {
1047*53ee8cc1Swenshuai.xi ms_ehci_interrupt_enable(hcd, str_on);
1048*53ee8cc1Swenshuai.xi MsOS_AttachInterrupt(hcd->ehci_irq, ms_DrvUSB_OnInterrupt_EX);
1049*53ee8cc1Swenshuai.xi MsOS_EnableInterrupt(hcd->ehci_irq);
1050*53ee8cc1Swenshuai.xi }
1051*53ee8cc1Swenshuai.xi
ms_UnInitUSBIntr_EX(struct usb_hcd * hcd)1052*53ee8cc1Swenshuai.xi void ms_UnInitUSBIntr_EX(struct usb_hcd * hcd)
1053*53ee8cc1Swenshuai.xi {
1054*53ee8cc1Swenshuai.xi MsOS_DisableInterrupt(hcd->ehci_irq);
1055*53ee8cc1Swenshuai.xi MsOS_DetachInterrupt(hcd->ehci_irq);
1056*53ee8cc1Swenshuai.xi ms_ehci_interrupt_disable(hcd);
1057*53ee8cc1Swenshuai.xi }
1058*53ee8cc1Swenshuai.xi
1059*53ee8cc1Swenshuai.xi /**
1060*53ee8cc1Swenshuai.xi * @brief USB port connect status and safe guard disconnect ehci reset
1061*53ee8cc1Swenshuai.xi *
1062*53ee8cc1Swenshuai.xi * @param struct usb_hcd *hcd
1063*53ee8cc1Swenshuai.xi *
1064*53ee8cc1Swenshuai.xi * @return true/false
1065*53ee8cc1Swenshuai.xi */
ms_UsbDeviceConnect_EX(struct usb_hcd * hcd)1066*53ee8cc1Swenshuai.xi MS_BOOL ms_UsbDeviceConnect_EX(struct usb_hcd *hcd)
1067*53ee8cc1Swenshuai.xi {
1068*53ee8cc1Swenshuai.xi static MS_U32 usbStartTime = 0;
1069*53ee8cc1Swenshuai.xi
1070*53ee8cc1Swenshuai.xi if (ms_RoothubPortConnected(hcd))
1071*53ee8cc1Swenshuai.xi {
1072*53ee8cc1Swenshuai.xi return TRUE;
1073*53ee8cc1Swenshuai.xi }
1074*53ee8cc1Swenshuai.xi else
1075*53ee8cc1Swenshuai.xi {
1076*53ee8cc1Swenshuai.xi if (MsOS_GetSystemTime()-usbStartTime > 1000 )
1077*53ee8cc1Swenshuai.xi {
1078*53ee8cc1Swenshuai.xi usbStartTime=MsOS_GetSystemTime();
1079*53ee8cc1Swenshuai.xi ms_ResetMstarUsb(hcd);
1080*53ee8cc1Swenshuai.xi hcd->isRootHubPortReset = TRUE;
1081*53ee8cc1Swenshuai.xi hcd->isBadDeviceRH = FALSE;
1082*53ee8cc1Swenshuai.xi hcd->isBadDevice = FALSE;
1083*53ee8cc1Swenshuai.xi hcd->badDeviceCnt = 0;
1084*53ee8cc1Swenshuai.xi }
1085*53ee8cc1Swenshuai.xi return FALSE;
1086*53ee8cc1Swenshuai.xi }
1087*53ee8cc1Swenshuai.xi }
1088*53ee8cc1Swenshuai.xi
1089*53ee8cc1Swenshuai.xi extern int ms_hub_poll(struct s_gVar4UsbPort *pRootHub);
1090*53ee8cc1Swenshuai.xi /**
1091*53ee8cc1Swenshuai.xi * @brief USB port N hub event polling task
1092*53ee8cc1Swenshuai.xi *
1093*53ee8cc1Swenshuai.xi * @param MS_U32 argc
1094*53ee8cc1Swenshuai.xi * @param VOID *argv
1095*53ee8cc1Swenshuai.xi *
1096*53ee8cc1Swenshuai.xi * @return none
1097*53ee8cc1Swenshuai.xi */
ms_UsbTask_EX(MS_U32 argc,VOID * argv)1098*53ee8cc1Swenshuai.xi void ms_UsbTask_EX(MS_U32 argc, VOID *argv)
1099*53ee8cc1Swenshuai.xi {
1100*53ee8cc1Swenshuai.xi MS_BOOL isConnect;
1101*53ee8cc1Swenshuai.xi int DevState, numConnDev;
1102*53ee8cc1Swenshuai.xi MS_U8 DevClass = USB_INTERFACE_CLASS_NONE;
1103*53ee8cc1Swenshuai.xi MS_U8 kk;
1104*53ee8cc1Swenshuai.xi #if USB_HID_SUPPORT
1105*53ee8cc1Swenshuai.xi MS_BOOL isHIDPlugIn;
1106*53ee8cc1Swenshuai.xi #endif
1107*53ee8cc1Swenshuai.xi struct s_gVar4UsbPort *pRootHub = (struct s_gVar4UsbPort *) argc;
1108*53ee8cc1Swenshuai.xi const MS_U8 hostID = pRootHub->hostid;
1109*53ee8cc1Swenshuai.xi
1110*53ee8cc1Swenshuai.xi diag_printf("UTask EX>> ... port %d starting\n", hostID);
1111*53ee8cc1Swenshuai.xi while (pRootHub->taskRunning)
1112*53ee8cc1Swenshuai.xi {
1113*53ee8cc1Swenshuai.xi #if USB_HID_SUPPORT
1114*53ee8cc1Swenshuai.xi isHIDPlugIn = FALSE;
1115*53ee8cc1Swenshuai.xi #endif
1116*53ee8cc1Swenshuai.xi
1117*53ee8cc1Swenshuai.xi // Waiting for USB port connection
1118*53ee8cc1Swenshuai.xi while(pRootHub->taskRunning)
1119*53ee8cc1Swenshuai.xi {
1120*53ee8cc1Swenshuai.xi ms_USBCriticalSectionIn(hostID);
1121*53ee8cc1Swenshuai.xi isConnect = ms_UsbDeviceConnect_EX(pRootHub->p_UsbHcd);
1122*53ee8cc1Swenshuai.xi ms_USBCriticalSectionOut(hostID);
1123*53ee8cc1Swenshuai.xi
1124*53ee8cc1Swenshuai.xi #if USBC_IP_SUPPORT // USBC IP control
1125*53ee8cc1Swenshuai.xi if ((pCurrentChip->usbc_ip[hostID].portNum == hostID) && (pCurrentChip->usbc_ip[hostID].eventFlag))
1126*53ee8cc1Swenshuai.xi if (_DrvUSBC_CBFun)
1127*53ee8cc1Swenshuai.xi {
1128*53ee8cc1Swenshuai.xi if (pCurrentChip->usbc_ip[hostID].eventType)
1129*53ee8cc1Swenshuai.xi _DrvUSBC_CBFun(USBC_NON_OVER_CURRENT, hostID, NULL);
1130*53ee8cc1Swenshuai.xi else
1131*53ee8cc1Swenshuai.xi _DrvUSBC_CBFun(USBC_OVER_CURRENT, hostID, NULL);
1132*53ee8cc1Swenshuai.xi pCurrentChip->usbc_ip[hostID].eventFlag = 0;
1133*53ee8cc1Swenshuai.xi }
1134*53ee8cc1Swenshuai.xi #endif
1135*53ee8cc1Swenshuai.xi if(isConnect)
1136*53ee8cc1Swenshuai.xi break;
1137*53ee8cc1Swenshuai.xi #ifdef USB_SYSTEM_STR_SUPPORT
1138*53ee8cc1Swenshuai.xi if (pCurrentChip->u8Park)
1139*53ee8cc1Swenshuai.xi pRootHub->bPark_ok = TRUE;
1140*53ee8cc1Swenshuai.xi #endif
1141*53ee8cc1Swenshuai.xi MsOS_DelayTask(100);
1142*53ee8cc1Swenshuai.xi }
1143*53ee8cc1Swenshuai.xi
1144*53ee8cc1Swenshuai.xi // removing any delay before USB bus reset
1145*53ee8cc1Swenshuai.xi //MsOS_DelayTask(1000);
1146*53ee8cc1Swenshuai.xi diag_printf("UTask EX>> USB Port %d is connected\n", hostID);
1147*53ee8cc1Swenshuai.xi
1148*53ee8cc1Swenshuai.xi while (pRootHub->taskRunning)
1149*53ee8cc1Swenshuai.xi {
1150*53ee8cc1Swenshuai.xi #ifdef USB_SYSTEM_STR_SUPPORT
1151*53ee8cc1Swenshuai.xi while(pCurrentChip->u8Park)
1152*53ee8cc1Swenshuai.xi {
1153*53ee8cc1Swenshuai.xi pRootHub->bPark_ok = TRUE;
1154*53ee8cc1Swenshuai.xi MsOS_DelayTask(50);
1155*53ee8cc1Swenshuai.xi }
1156*53ee8cc1Swenshuai.xi #endif
1157*53ee8cc1Swenshuai.xi
1158*53ee8cc1Swenshuai.xi if (pRootHub->p_UsbHcd->isBadDeviceRH)
1159*53ee8cc1Swenshuai.xi {
1160*53ee8cc1Swenshuai.xi diag_printf("UTask EX>> A bad device found on root port %d\n", pRootHub->hostid);
1161*53ee8cc1Swenshuai.xi break;
1162*53ee8cc1Swenshuai.xi }
1163*53ee8cc1Swenshuai.xi
1164*53ee8cc1Swenshuai.xi kk = 0;
1165*53ee8cc1Swenshuai.xi while(kk<HUB_DEBOUNCE_STABLE)
1166*53ee8cc1Swenshuai.xi {
1167*53ee8cc1Swenshuai.xi ms_USBCriticalSectionIn(hostID);
1168*53ee8cc1Swenshuai.xi isConnect = ms_RoothubPortConnected(pRootHub->p_UsbHcd);
1169*53ee8cc1Swenshuai.xi ms_USBCriticalSectionOut(hostID);
1170*53ee8cc1Swenshuai.xi if ( !isConnect )
1171*53ee8cc1Swenshuai.xi {
1172*53ee8cc1Swenshuai.xi #if USB_MASS_STORAGE_SUPPORT
1173*53ee8cc1Swenshuai.xi if (pRootHub->taskRunning) // guard for port close
1174*53ee8cc1Swenshuai.xi ms_MSC_fast_device_disconnect(pRootHub->vPortRange.vPortDevStart, pRootHub->vPortRange.vPortDevEnd);
1175*53ee8cc1Swenshuai.xi #endif
1176*53ee8cc1Swenshuai.xi goto PORT_DISCONNECT_EX;
1177*53ee8cc1Swenshuai.xi }
1178*53ee8cc1Swenshuai.xi kk++;
1179*53ee8cc1Swenshuai.xi MsOS_DelayTask(HUB_DEBOUNCE_STEP);
1180*53ee8cc1Swenshuai.xi }
1181*53ee8cc1Swenshuai.xi
1182*53ee8cc1Swenshuai.xi // Device is connecting to the port
1183*53ee8cc1Swenshuai.xi numConnDev = 0;
1184*53ee8cc1Swenshuai.xi if (pRootHub->taskRunning) // guard for port close
1185*53ee8cc1Swenshuai.xi numConnDev = ms_hub_poll(pRootHub);
1186*53ee8cc1Swenshuai.xi
1187*53ee8cc1Swenshuai.xi announce_new_dev:
1188*53ee8cc1Swenshuai.xi // Mass storage disk mount
1189*53ee8cc1Swenshuai.xi #if USB_MASS_STORAGE_SUPPORT
1190*53ee8cc1Swenshuai.xi if (pRootHub->taskRunning) // guard for port close
1191*53ee8cc1Swenshuai.xi ms_MSC_device_inquiry(pRootHub->vPortRange.vPortDevStart, pRootHub->vPortRange.vPortDevEnd);
1192*53ee8cc1Swenshuai.xi #endif
1193*53ee8cc1Swenshuai.xi
1194*53ee8cc1Swenshuai.xi #if USB_HID_SUPPORT
1195*53ee8cc1Swenshuai.xi // TODO: correct HIDGlue API pointer type
1196*53ee8cc1Swenshuai.xi //if (pRootHub->p_UsbHcd == pCurrentChip->p_roothub[pRootHub->hostid]->cpe_ehci_dev.dev.driver_data)
1197*53ee8cc1Swenshuai.xi // diag_printf("Yes, matched\n");
1198*53ee8cc1Swenshuai.xi if (pRootHub->taskRunning) // guard for port close
1199*53ee8cc1Swenshuai.xi isHIDPlugIn = ms_HID_device_in_inquiry((void *)pRootHub->p_UsbHcd, isHIDPlugIn);
1200*53ee8cc1Swenshuai.xi #endif
1201*53ee8cc1Swenshuai.xi
1202*53ee8cc1Swenshuai.xi while (numConnDev-- && pRootHub->taskRunning)
1203*53ee8cc1Swenshuai.xi {
1204*53ee8cc1Swenshuai.xi USB_ASSERT(numConnDev>=0, "BUG()!!!! numConndev<0\n");
1205*53ee8cc1Swenshuai.xi BOOL IntfDrvMatched = FALSE;
1206*53ee8cc1Swenshuai.xi
1207*53ee8cc1Swenshuai.xi if ( ms_usb_get_connected_dev_state(&DevState, &DevClass, pRootHub->arConnDev[numConnDev].connDev, &IntfDrvMatched) )
1208*53ee8cc1Swenshuai.xi {
1209*53ee8cc1Swenshuai.xi if (DevState < USB_STATE_CONFIGURED)
1210*53ee8cc1Swenshuai.xi {
1211*53ee8cc1Swenshuai.xi diag_printf("UTask EX>> Usb device not configured (dev#%d)\n", numConnDev);
1212*53ee8cc1Swenshuai.xi if (pRootHub->p_UsbHcd->isBadDevice || pRootHub->p_UsbHcd->isBadDeviceRH)
1213*53ee8cc1Swenshuai.xi {
1214*53ee8cc1Swenshuai.xi diag_printf("UTask EX>> Usb device no responding (dev#%d)\n", numConnDev);
1215*53ee8cc1Swenshuai.xi if ( _DrvUSB_CBFun != NULL )
1216*53ee8cc1Swenshuai.xi _DrvUSB_CBFun(USB_PLUG_IN, USB_EVENT_DEV_NO_RESPONSE, NULL);
1217*53ee8cc1Swenshuai.xi }
1218*53ee8cc1Swenshuai.xi }
1219*53ee8cc1Swenshuai.xi else
1220*53ee8cc1Swenshuai.xi {
1221*53ee8cc1Swenshuai.xi switch (DevClass)
1222*53ee8cc1Swenshuai.xi {
1223*53ee8cc1Swenshuai.xi #if USB_MASS_STORAGE_SUPPORT
1224*53ee8cc1Swenshuai.xi case USB_INTERFACE_CLASS_MSD: // list of device class supported
1225*53ee8cc1Swenshuai.xi #endif
1226*53ee8cc1Swenshuai.xi #if USB_HID_SUPPORT
1227*53ee8cc1Swenshuai.xi case USB_INTERFACE_CLASS_HID:
1228*53ee8cc1Swenshuai.xi #endif
1229*53ee8cc1Swenshuai.xi break;
1230*53ee8cc1Swenshuai.xi #ifndef USB_NOT_SUPPORT_EX_HUB
1231*53ee8cc1Swenshuai.xi case USB_INTERFACE_CLASS_HUB:
1232*53ee8cc1Swenshuai.xi diag_printf("UTask EX>> Port %d external Hub is connected (dev#%d)\n", hostID, numConnDev);
1233*53ee8cc1Swenshuai.xi break;
1234*53ee8cc1Swenshuai.xi #endif
1235*53ee8cc1Swenshuai.xi default:
1236*53ee8cc1Swenshuai.xi diag_printf("UTask EX>> found Non-classical deivce (dev#%d)\n", numConnDev);
1237*53ee8cc1Swenshuai.xi if ( _DrvUSB_CBFun != NULL )
1238*53ee8cc1Swenshuai.xi {
1239*53ee8cc1Swenshuai.xi if(IntfDrvMatched == TRUE)
1240*53ee8cc1Swenshuai.xi {
1241*53ee8cc1Swenshuai.xi diag_printf("UTask EX>> Usb device Vendor supported (dev#%d)\n", numConnDev);
1242*53ee8cc1Swenshuai.xi _DrvUSB_CBFun(USB_PLUG_IN, USB_EVENT_DEV_TYPE_VENDOR, NULL);
1243*53ee8cc1Swenshuai.xi }
1244*53ee8cc1Swenshuai.xi else
1245*53ee8cc1Swenshuai.xi {
1246*53ee8cc1Swenshuai.xi diag_printf("UTask EX>> Usb device not supported (dev#%d)\n", numConnDev);
1247*53ee8cc1Swenshuai.xi _DrvUSB_CBFun(USB_PLUG_IN, USB_EVENT_DEV_TYPE_UNKNOW, NULL);
1248*53ee8cc1Swenshuai.xi }
1249*53ee8cc1Swenshuai.xi }
1250*53ee8cc1Swenshuai.xi }
1251*53ee8cc1Swenshuai.xi }
1252*53ee8cc1Swenshuai.xi }
1253*53ee8cc1Swenshuai.xi }
1254*53ee8cc1Swenshuai.xi
1255*53ee8cc1Swenshuai.xi #if USBC_IP_SUPPORT // USBC IP control
1256*53ee8cc1Swenshuai.xi if ((pCurrentChip->usbc_ip[hostID].portNum == hostID) && (pCurrentChip->usbc_ip[hostID].eventFlag))
1257*53ee8cc1Swenshuai.xi if (ms_RoothubPortConnected(pRootHub->p_UsbHcd))
1258*53ee8cc1Swenshuai.xi if (_DrvUSBC_CBFun)
1259*53ee8cc1Swenshuai.xi {
1260*53ee8cc1Swenshuai.xi if (pCurrentChip->usbc_ip[hostID].eventType)
1261*53ee8cc1Swenshuai.xi _DrvUSBC_CBFun(USBC_NON_OVER_CURRENT, hostID, NULL);
1262*53ee8cc1Swenshuai.xi else
1263*53ee8cc1Swenshuai.xi _DrvUSBC_CBFun(USBC_OVER_CURRENT, hostID, NULL);
1264*53ee8cc1Swenshuai.xi pCurrentChip->usbc_ip[hostID].eventFlag = 0;
1265*53ee8cc1Swenshuai.xi }
1266*53ee8cc1Swenshuai.xi #endif
1267*53ee8cc1Swenshuai.xi
1268*53ee8cc1Swenshuai.xi //MsOS_DelayTask(1000);
1269*53ee8cc1Swenshuai.xi }
1270*53ee8cc1Swenshuai.xi
1271*53ee8cc1Swenshuai.xi PORT_DISCONNECT_EX:
1272*53ee8cc1Swenshuai.xi diag_printf("UTask EX>> USB root port %d disconnecting...\n", hostID);
1273*53ee8cc1Swenshuai.xi //if (pRootHub->taskRunning)
1274*53ee8cc1Swenshuai.xi //{
1275*53ee8cc1Swenshuai.xi // MsOS_DelayTask(100); //By Jonas! for hub event!
1276*53ee8cc1Swenshuai.xi //}
1277*53ee8cc1Swenshuai.xi //else
1278*53ee8cc1Swenshuai.xi //{
1279*53ee8cc1Swenshuai.xi //MsOS_DelayTask(600); //By Jonas! for hub event!
1280*53ee8cc1Swenshuai.xi //}
1281*53ee8cc1Swenshuai.xi numConnDev = 0;
1282*53ee8cc1Swenshuai.xi if (pRootHub->taskRunning) // guard for port close
1283*53ee8cc1Swenshuai.xi numConnDev = ms_hub_poll(pRootHub); //for disconnect hub event
1284*53ee8cc1Swenshuai.xi
1285*53ee8cc1Swenshuai.xi #if USB_HID_SUPPORT
1286*53ee8cc1Swenshuai.xi if (pRootHub->taskRunning) // guard for port close
1287*53ee8cc1Swenshuai.xi ms_HID_device_out_inquiry((void *)pRootHub->p_UsbHcd, isHIDPlugIn);
1288*53ee8cc1Swenshuai.xi #endif
1289*53ee8cc1Swenshuai.xi
1290*53ee8cc1Swenshuai.xi if(numConnDev != 0)
1291*53ee8cc1Swenshuai.xi {
1292*53ee8cc1Swenshuai.xi diag_printf("[USB] get new device after disconnecting...\n");
1293*53ee8cc1Swenshuai.xi goto announce_new_dev;
1294*53ee8cc1Swenshuai.xi }
1295*53ee8cc1Swenshuai.xi
1296*53ee8cc1Swenshuai.xi //device is disconnected
1297*53ee8cc1Swenshuai.xi kk = 0;
1298*53ee8cc1Swenshuai.xi while(pRootHub->taskRunning)
1299*53ee8cc1Swenshuai.xi {
1300*53ee8cc1Swenshuai.xi ms_USBCriticalSectionIn(hostID);
1301*53ee8cc1Swenshuai.xi isConnect = ms_RoothubPortConnected(pRootHub->p_UsbHcd);
1302*53ee8cc1Swenshuai.xi ms_USBCriticalSectionOut(hostID);
1303*53ee8cc1Swenshuai.xi if(isConnect == FALSE)
1304*53ee8cc1Swenshuai.xi {
1305*53ee8cc1Swenshuai.xi diag_printf("UTask EX>> device plug out!\n");
1306*53ee8cc1Swenshuai.xi break;
1307*53ee8cc1Swenshuai.xi }
1308*53ee8cc1Swenshuai.xi if (pRootHub->p_UsbHcd->isBadDeviceRH && (kk % 10 == 0))
1309*53ee8cc1Swenshuai.xi {
1310*53ee8cc1Swenshuai.xi diag_printf("UTask EX>> a bad device waiting plug-out!\n");
1311*53ee8cc1Swenshuai.xi }
1312*53ee8cc1Swenshuai.xi #ifdef USB_SYSTEM_STR_SUPPORT
1313*53ee8cc1Swenshuai.xi if (pCurrentChip->u8Park)
1314*53ee8cc1Swenshuai.xi pRootHub->bPark_ok = TRUE;
1315*53ee8cc1Swenshuai.xi #endif
1316*53ee8cc1Swenshuai.xi MsOS_DelayTask(100);
1317*53ee8cc1Swenshuai.xi kk++;
1318*53ee8cc1Swenshuai.xi }
1319*53ee8cc1Swenshuai.xi if (pRootHub->p_UsbHcd) // guard for port close
1320*53ee8cc1Swenshuai.xi {
1321*53ee8cc1Swenshuai.xi ms_USBCriticalSectionIn(hostID);
1322*53ee8cc1Swenshuai.xi diag_printf("UTask EX>> reset ms USB\n");
1323*53ee8cc1Swenshuai.xi /* enable QH Head re-link flow */
1324*53ee8cc1Swenshuai.xi pRootHub->p_UsbHcd->rh_disconn = 1;
1325*53ee8cc1Swenshuai.xi ms_ResetMstarUsb(pRootHub->p_UsbHcd);
1326*53ee8cc1Swenshuai.xi pRootHub->p_UsbHcd->rh_disconn = 0;
1327*53ee8cc1Swenshuai.xi ms_USBCriticalSectionOut(hostID);
1328*53ee8cc1Swenshuai.xi }
1329*53ee8cc1Swenshuai.xi
1330*53ee8cc1Swenshuai.xi }
1331*53ee8cc1Swenshuai.xi diag_printf("UTask EX>> ... port %d finished\n", hostID);
1332*53ee8cc1Swenshuai.xi pRootHub->taskFinish = TRUE;
1333*53ee8cc1Swenshuai.xi }
1334*53ee8cc1Swenshuai.xi
1335*53ee8cc1Swenshuai.xi /**
1336*53ee8cc1Swenshuai.xi * @brief creating USB mutex for selected port
1337*53ee8cc1Swenshuai.xi *
1338*53ee8cc1Swenshuai.xi * @param U8 port
1339*53ee8cc1Swenshuai.xi *
1340*53ee8cc1Swenshuai.xi * @return USB mutex
1341*53ee8cc1Swenshuai.xi */
ms_Create_USB_Mutex(MS_U8 u8Hostid)1342*53ee8cc1Swenshuai.xi MS_S32 ms_Create_USB_Mutex(MS_U8 u8Hostid)
1343*53ee8cc1Swenshuai.xi {
1344*53ee8cc1Swenshuai.xi struct s_gVar4UsbPort *pRootHub = pCurrentChip->p_roothub[u8Hostid];
1345*53ee8cc1Swenshuai.xi
1346*53ee8cc1Swenshuai.xi return pRootHub->_s32MutexUSB = MsOS_CreateMutex(E_MSOS_FIFO, pRootHub->usb_mutex_name, MSOS_PROCESS_SHARED);
1347*53ee8cc1Swenshuai.xi }
1348*53ee8cc1Swenshuai.xi
1349*53ee8cc1Swenshuai.xi /**
1350*53ee8cc1Swenshuai.xi * @brief deleting USB mutex for selected port
1351*53ee8cc1Swenshuai.xi *
1352*53ee8cc1Swenshuai.xi * @param U8 port
1353*53ee8cc1Swenshuai.xi *
1354*53ee8cc1Swenshuai.xi * @return none
1355*53ee8cc1Swenshuai.xi */
ms_Delete_USB_Mutex(MS_U8 u8Hostid)1356*53ee8cc1Swenshuai.xi void ms_Delete_USB_Mutex(MS_U8 u8Hostid)
1357*53ee8cc1Swenshuai.xi {
1358*53ee8cc1Swenshuai.xi struct s_gVar4UsbPort *pRootHub = pCurrentChip->p_roothub[u8Hostid];
1359*53ee8cc1Swenshuai.xi
1360*53ee8cc1Swenshuai.xi MsOS_DeleteMutex(pRootHub->_s32MutexUSB);
1361*53ee8cc1Swenshuai.xi }
1362*53ee8cc1Swenshuai.xi
1363*53ee8cc1Swenshuai.xi /**
1364*53ee8cc1Swenshuai.xi * @brief creating USB port N hub event polling task
1365*53ee8cc1Swenshuai.xi *
1366*53ee8cc1Swenshuai.xi * @param struct s_gVar4UsbPort *pRootHub
1367*53ee8cc1Swenshuai.xi *
1368*53ee8cc1Swenshuai.xi * @return none
1369*53ee8cc1Swenshuai.xi */
ms_USB_Start_EX(struct s_gVar4UsbPort * pRootHub)1370*53ee8cc1Swenshuai.xi void ms_USB_Start_EX(struct s_gVar4UsbPort *pRootHub)
1371*53ee8cc1Swenshuai.xi {
1372*53ee8cc1Swenshuai.xi MS_U8 *HubStack;
1373*53ee8cc1Swenshuai.xi
1374*53ee8cc1Swenshuai.xi diag_printf("\nUsb start EX..., pRootHub = %x\n\n", (unsigned int)pRootHub);
1375*53ee8cc1Swenshuai.xi
1376*53ee8cc1Swenshuai.xi HubStack = pRootHub->u8pHubStackBuffer;
1377*53ee8cc1Swenshuai.xi
1378*53ee8cc1Swenshuai.xi if (ms_Create_USB_Mutex(pRootHub->hostid) < 0)
1379*53ee8cc1Swenshuai.xi {
1380*53ee8cc1Swenshuai.xi diag_printf("create USB mutex failed\n");
1381*53ee8cc1Swenshuai.xi GEN_EXCEP;
1382*53ee8cc1Swenshuai.xi return;
1383*53ee8cc1Swenshuai.xi }
1384*53ee8cc1Swenshuai.xi
1385*53ee8cc1Swenshuai.xi //Create Task
1386*53ee8cc1Swenshuai.xi pRootHub->taskRunning = TRUE;
1387*53ee8cc1Swenshuai.xi pRootHub->taskFinish = FALSE;
1388*53ee8cc1Swenshuai.xi
1389*53ee8cc1Swenshuai.xi pRootHub->pid = MsOS_CreateTask((TaskEntry) ms_UsbTask_EX,
1390*53ee8cc1Swenshuai.xi (MS_U32)pRootHub,
1391*53ee8cc1Swenshuai.xi E_TASK_PRI_HIGH,
1392*53ee8cc1Swenshuai.xi TRUE,
1393*53ee8cc1Swenshuai.xi HubStack,
1394*53ee8cc1Swenshuai.xi HUB_STACK_SIZE,
1395*53ee8cc1Swenshuai.xi pRootHub->name);
1396*53ee8cc1Swenshuai.xi if (pRootHub->pid < 0)
1397*53ee8cc1Swenshuai.xi {
1398*53ee8cc1Swenshuai.xi diag_printf("create USB Task failed\n");
1399*53ee8cc1Swenshuai.xi ms_Delete_USB_Mutex(pRootHub->hostid);
1400*53ee8cc1Swenshuai.xi GEN_EXCEP;
1401*53ee8cc1Swenshuai.xi return;
1402*53ee8cc1Swenshuai.xi }
1403*53ee8cc1Swenshuai.xi }
1404*53ee8cc1Swenshuai.xi
ms_USB_Stop_EX(struct s_gVar4UsbPort * pRootHub)1405*53ee8cc1Swenshuai.xi void ms_USB_Stop_EX(struct s_gVar4UsbPort *pRootHub)
1406*53ee8cc1Swenshuai.xi {
1407*53ee8cc1Swenshuai.xi while(!pRootHub->taskFinish)
1408*53ee8cc1Swenshuai.xi {
1409*53ee8cc1Swenshuai.xi MsOS_DelayTask(100);
1410*53ee8cc1Swenshuai.xi }
1411*53ee8cc1Swenshuai.xi diag_printf("[ms_USB_Stop_EX] DeleteTask ++\n");
1412*53ee8cc1Swenshuai.xi /* 20150608 remove MsOS_DeleteTask per system's request */
1413*53ee8cc1Swenshuai.xi //MsOS_DeleteTask(pRootHub->pid);
1414*53ee8cc1Swenshuai.xi pRootHub->pid = -1;
1415*53ee8cc1Swenshuai.xi ms_USBCriticalSectionIn(pRootHub->hostid);
1416*53ee8cc1Swenshuai.xi ms_USBCriticalSectionOut(pRootHub->hostid);
1417*53ee8cc1Swenshuai.xi ms_Delete_USB_Mutex(pRootHub->hostid);
1418*53ee8cc1Swenshuai.xi diag_printf("[ms_USB_Stop_EX] delete Mutex --\n");
1419*53ee8cc1Swenshuai.xi }
1420*53ee8cc1Swenshuai.xi
1421*53ee8cc1Swenshuai.xi
1422*53ee8cc1Swenshuai.xi extern int ms_create_cpe_hcd(struct cpe_dev *dev);
1423*53ee8cc1Swenshuai.xi extern void ms_usb_hcd_cpe_ehci_remove (struct usb_hcd *pHcd);
1424*53ee8cc1Swenshuai.xi
1425*53ee8cc1Swenshuai.xi /**
1426*53ee8cc1Swenshuai.xi * @brief USB port N initial
1427*53ee8cc1Swenshuai.xi *
1428*53ee8cc1Swenshuai.xi * @param MS_U8 u8PortNum
1429*53ee8cc1Swenshuai.xi *
1430*53ee8cc1Swenshuai.xi * @return true/false
1431*53ee8cc1Swenshuai.xi */
MDrv_USB_Port_Init(MS_U8 u8Hostid)1432*53ee8cc1Swenshuai.xi MS_BOOL MDrv_USB_Port_Init(MS_U8 u8Hostid)
1433*53ee8cc1Swenshuai.xi {
1434*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef *pChip = pCurrentChip;
1435*53ee8cc1Swenshuai.xi
1436*53ee8cc1Swenshuai.xi if (pChip->nRootHub <= u8Hostid)
1437*53ee8cc1Swenshuai.xi {
1438*53ee8cc1Swenshuai.xi diag_printf("Chip %s does not not support port %d\n", pChip->name, u8Hostid);
1439*53ee8cc1Swenshuai.xi return FALSE;
1440*53ee8cc1Swenshuai.xi }
1441*53ee8cc1Swenshuai.xi else
1442*53ee8cc1Swenshuai.xi {
1443*53ee8cc1Swenshuai.xi diag_printf("Init chip %s, port %d\n", pChip->name, u8Hostid);
1444*53ee8cc1Swenshuai.xi // bind chip reg definition with cpe_dev
1445*53ee8cc1Swenshuai.xi pChip->p_roothub[u8Hostid]->cpe_ehci_dev.uhcbase = pChip->reg[u8Hostid].baseUHC;
1446*53ee8cc1Swenshuai.xi pChip->p_roothub[u8Hostid]->cpe_ehci_dev.utmibase = pChip->reg[u8Hostid].baseUTMI;
1447*53ee8cc1Swenshuai.xi pChip->p_roothub[u8Hostid]->cpe_ehci_dev.usbcbase = pChip->reg[u8Hostid].baseUSBC;
1448*53ee8cc1Swenshuai.xi pChip->p_roothub[u8Hostid]->cpe_ehci_dev.intNum = pChip->reg[u8Hostid].uhcIRQ;
1449*53ee8cc1Swenshuai.xi }
1450*53ee8cc1Swenshuai.xi /* initial hub event list */
1451*53ee8cc1Swenshuai.xi ms_list_init(&pChip->p_roothub[u8Hostid]->hub_event);
1452*53ee8cc1Swenshuai.xi pChip->p_roothub[u8Hostid]->cpe_ehci_dev.pHubEvent = &pChip->p_roothub[u8Hostid]->hub_event;
1453*53ee8cc1Swenshuai.xi pChip->p_roothub[u8Hostid]->cpe_ehci_dev.bus_name = pChip->p_roothub[u8Hostid]->bus_name;
1454*53ee8cc1Swenshuai.xi pChip->p_roothub[u8Hostid]->cpe_ehci_dev.product_desc = pChip->p_roothub[u8Hostid]->product_desc;
1455*53ee8cc1Swenshuai.xi pChip->p_roothub[u8Hostid]->cpe_ehci_dev.devid = pChip->p_roothub[u8Hostid]->hostid;
1456*53ee8cc1Swenshuai.xi
1457*53ee8cc1Swenshuai.xi // do Usb Host initial
1458*53ee8cc1Swenshuai.xi ms_U4_series_usb_init(pChip, u8Hostid);
1459*53ee8cc1Swenshuai.xi
1460*53ee8cc1Swenshuai.xi #ifdef ENABLE_XHC_COMPANION
1461*53ee8cc1Swenshuai.xi if(pChip->reg[u8Hostid].iFlag & EHCFLAF_XHC_COMP)
1462*53ee8cc1Swenshuai.xi {
1463*53ee8cc1Swenshuai.xi //enable xHCI clock
1464*53ee8cc1Swenshuai.xi xhci_enable_clock();
1465*53ee8cc1Swenshuai.xi //disable port
1466*53ee8cc1Swenshuai.xi xhci_ssport_set_state(&pChip->reg[u8Hostid].xhci, false);
1467*53ee8cc1Swenshuai.xi //turn on power
1468*53ee8cc1Swenshuai.xi xhci_ppc(&pChip->reg[u8Hostid].xhci, true);
1469*53ee8cc1Swenshuai.xi }
1470*53ee8cc1Swenshuai.xi #endif
1471*53ee8cc1Swenshuai.xi
1472*53ee8cc1Swenshuai.xi ms_create_cpe_hcd(&pChip->p_roothub[u8Hostid]->cpe_ehci_dev); // create hcd base on cpe info
1473*53ee8cc1Swenshuai.xi if (pChip->p_roothub[u8Hostid]->cpe_ehci_dev.dev.driver_data == NULL)
1474*53ee8cc1Swenshuai.xi {
1475*53ee8cc1Swenshuai.xi diag_printf("port %d hcd not allocated!!!\n", u8Hostid);
1476*53ee8cc1Swenshuai.xi return FALSE;
1477*53ee8cc1Swenshuai.xi }
1478*53ee8cc1Swenshuai.xi pChip->p_roothub[u8Hostid]->p_UsbHcd = pChip->p_roothub[u8Hostid]->cpe_ehci_dev.dev.driver_data; // for MDrv_UsbDeviceConnect()
1479*53ee8cc1Swenshuai.xi
1480*53ee8cc1Swenshuai.xi ms_USB_Start_EX(pChip->p_roothub[u8Hostid]);
1481*53ee8cc1Swenshuai.xi
1482*53ee8cc1Swenshuai.xi return TRUE;
1483*53ee8cc1Swenshuai.xi }
1484*53ee8cc1Swenshuai.xi
1485*53ee8cc1Swenshuai.xi /**
1486*53ee8cc1Swenshuai.xi * @brief Halt USB port N
1487*53ee8cc1Swenshuai.xi *
1488*53ee8cc1Swenshuai.xi * @param MS_U8 u8Hostid
1489*53ee8cc1Swenshuai.xi *
1490*53ee8cc1Swenshuai.xi * @return true/false
1491*53ee8cc1Swenshuai.xi */
MDrv_USB_Port_Close(MS_U8 u8Hostid)1492*53ee8cc1Swenshuai.xi MS_BOOL MDrv_USB_Port_Close(MS_U8 u8Hostid)
1493*53ee8cc1Swenshuai.xi {
1494*53ee8cc1Swenshuai.xi struct s_gVar4UsbPort *pRootHub = pCurrentChip->p_roothub[u8Hostid];
1495*53ee8cc1Swenshuai.xi struct usb_hcd *pHcd = pRootHub->p_UsbHcd;
1496*53ee8cc1Swenshuai.xi
1497*53ee8cc1Swenshuai.xi diag_printf("[USB] try to shutdown UHC(%d)\n", u8Hostid);
1498*53ee8cc1Swenshuai.xi
1499*53ee8cc1Swenshuai.xi if(!pHcd)
1500*53ee8cc1Swenshuai.xi {
1501*53ee8cc1Swenshuai.xi diag_printf("[USB] Error UHC%d is not inited ??\n", u8Hostid);
1502*53ee8cc1Swenshuai.xi return FALSE;
1503*53ee8cc1Swenshuai.xi }
1504*53ee8cc1Swenshuai.xi
1505*53ee8cc1Swenshuai.xi pRootHub->taskRunning= FALSE;
1506*53ee8cc1Swenshuai.xi pHcd->state = HCD_STATE_HALT; // speed up port close flow
1507*53ee8cc1Swenshuai.xi ms_usb_set_device_state(pHcd->self.root_hub, USB_STATE_NOTATTACHED);
1508*53ee8cc1Swenshuai.xi diag_printf("[USB] disable Port %d interrupt\n", u8Hostid);
1509*53ee8cc1Swenshuai.xi ms_UnInitUSBIntr_EX(pHcd);
1510*53ee8cc1Swenshuai.xi
1511*53ee8cc1Swenshuai.xi diag_printf("[USB] ms_USB_Stop_EX(%d)\n", u8Hostid);
1512*53ee8cc1Swenshuai.xi ms_USB_Stop_EX(pRootHub);
1513*53ee8cc1Swenshuai.xi
1514*53ee8cc1Swenshuai.xi #ifdef ENABLE_XHC_COMPANION
1515*53ee8cc1Swenshuai.xi if(pCurrentChip->reg[u8Hostid].iFlag & EHCFLAF_XHC_COMP)
1516*53ee8cc1Swenshuai.xi {
1517*53ee8cc1Swenshuai.xi //turn off power
1518*53ee8cc1Swenshuai.xi xhci_ppc(&pCurrentChip->reg[u8Hostid].xhci, false);
1519*53ee8cc1Swenshuai.xi //enable port
1520*53ee8cc1Swenshuai.xi xhci_ssport_set_state(&pCurrentChip->reg[u8Hostid].xhci, true);
1521*53ee8cc1Swenshuai.xi mdelay(1000);
1522*53ee8cc1Swenshuai.xi }
1523*53ee8cc1Swenshuai.xi #endif
1524*53ee8cc1Swenshuai.xi
1525*53ee8cc1Swenshuai.xi diag_printf("[USB] ms_usb_hcd_cpe_ehci_remove\n");
1526*53ee8cc1Swenshuai.xi ms_usb_hcd_cpe_ehci_remove(pHcd);
1527*53ee8cc1Swenshuai.xi
1528*53ee8cc1Swenshuai.xi pRootHub->cpe_ehci_dev.dev.driver_data = NULL;
1529*53ee8cc1Swenshuai.xi pRootHub->p_UsbHcd = NULL;
1530*53ee8cc1Swenshuai.xi diag_printf("[USB] End of MDrv_USB_Port_Close(%d)\n", u8Hostid);
1531*53ee8cc1Swenshuai.xi return TRUE;
1532*53ee8cc1Swenshuai.xi }
1533*53ee8cc1Swenshuai.xi
1534*53ee8cc1Swenshuai.xi extern void ms_init_usbc_intr(MS_U8 p);
1535*53ee8cc1Swenshuai.xi /**
1536*53ee8cc1Swenshuai.xi * @brief register call back function of over current detection
1537*53ee8cc1Swenshuai.xi *
1538*53ee8cc1Swenshuai.xi * @param USBCallback pCallbackFn
1539*53ee8cc1Swenshuai.xi * @param MS_U8 port_mask
1540*53ee8cc1Swenshuai.xi *
1541*53ee8cc1Swenshuai.xi * @return none
1542*53ee8cc1Swenshuai.xi */
MDrv_OverCurrentDetect_RegisterCallBack(USBCallback pCallbackFn,MS_U8 port_mask)1543*53ee8cc1Swenshuai.xi void MDrv_OverCurrentDetect_RegisterCallBack (USBCallback pCallbackFn, MS_U8 port_mask)
1544*53ee8cc1Swenshuai.xi {
1545*53ee8cc1Swenshuai.xi #if USBC_IP_SUPPORT // USBC IP control
1546*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef *pChip = pCurrentChip;
1547*53ee8cc1Swenshuai.xi MS_U8 p;
1548*53ee8cc1Swenshuai.xi
1549*53ee8cc1Swenshuai.xi diag_printf("<MDrv_OverCurrentDetect_RegisterCallBack> %p, port_mask(%x)\n", pCallbackFn, port_mask);
1550*53ee8cc1Swenshuai.xi _DrvUSBC_CBFun = pCallbackFn;
1551*53ee8cc1Swenshuai.xi for (p = 0; p < pChip->nRootHub; p++)
1552*53ee8cc1Swenshuai.xi if (port_mask & (1<<p))
1553*53ee8cc1Swenshuai.xi ms_init_usbc_intr(p);
1554*53ee8cc1Swenshuai.xi #else
1555*53ee8cc1Swenshuai.xi diag_printf("<MDrv_OverCurrentDetect_RegisterCallBack> NOT support!!! Please turn on USBC_IP_SUPPORT in drvUSB.h\n");
1556*53ee8cc1Swenshuai.xi #endif
1557*53ee8cc1Swenshuai.xi }
1558*53ee8cc1Swenshuai.xi
1559*53ee8cc1Swenshuai.xi /**
1560*53ee8cc1Swenshuai.xi * @brief return connection bit for portN
1561*53ee8cc1Swenshuai.xi *
1562*53ee8cc1Swenshuai.xi * @param MS_U8 u8Hostid
1563*53ee8cc1Swenshuai.xi *
1564*53ee8cc1Swenshuai.xi * @return connection bit
1565*53ee8cc1Swenshuai.xi */
1566*53ee8cc1Swenshuai.xi
MDrv_UsbDeviceConnectBitEx(MS_U8 u8Hostid)1567*53ee8cc1Swenshuai.xi int MDrv_UsbDeviceConnectBitEx(MS_U8 u8Hostid)
1568*53ee8cc1Swenshuai.xi {
1569*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef *pChip = pCurrentChip;
1570*53ee8cc1Swenshuai.xi struct usb_hcd *hcd;
1571*53ee8cc1Swenshuai.xi
1572*53ee8cc1Swenshuai.xi if (pChip == NULL)
1573*53ee8cc1Swenshuai.xi {
1574*53ee8cc1Swenshuai.xi diag_printf("[USB] Error!!! pChip is Null\n");
1575*53ee8cc1Swenshuai.xi return -1;
1576*53ee8cc1Swenshuai.xi }
1577*53ee8cc1Swenshuai.xi
1578*53ee8cc1Swenshuai.xi hcd = pChip->p_roothub[u8Hostid]->cpe_ehci_dev.dev.driver_data;
1579*53ee8cc1Swenshuai.xi
1580*53ee8cc1Swenshuai.xi if(hcd == NULL)
1581*53ee8cc1Swenshuai.xi {
1582*53ee8cc1Swenshuai.xi diag_printf("[USB] Error!!! hcd is Null, host_id %d\n", u8Hostid);
1583*53ee8cc1Swenshuai.xi return -1;
1584*53ee8cc1Swenshuai.xi }
1585*53ee8cc1Swenshuai.xi
1586*53ee8cc1Swenshuai.xi if(ms_RoothubPortConnected(hcd))
1587*53ee8cc1Swenshuai.xi return 1;
1588*53ee8cc1Swenshuai.xi
1589*53ee8cc1Swenshuai.xi return 0;
1590*53ee8cc1Swenshuai.xi }
1591*53ee8cc1Swenshuai.xi
1592*53ee8cc1Swenshuai.xi #ifdef USB_SYSTEM_STR_SUPPORT
MDrv_Usb_STR_Off(MS_U8 u8Hostid)1593*53ee8cc1Swenshuai.xi void MDrv_Usb_STR_Off(MS_U8 u8Hostid)
1594*53ee8cc1Swenshuai.xi {
1595*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef *pChip = pCurrentChip;
1596*53ee8cc1Swenshuai.xi struct usb_hcd *hcd;
1597*53ee8cc1Swenshuai.xi
1598*53ee8cc1Swenshuai.xi if (pChip == NULL)
1599*53ee8cc1Swenshuai.xi {
1600*53ee8cc1Swenshuai.xi diag_printf("[USB] Error!!! pChip is Null\n");
1601*53ee8cc1Swenshuai.xi return;
1602*53ee8cc1Swenshuai.xi }
1603*53ee8cc1Swenshuai.xi hcd = pChip->p_roothub[u8Hostid]->cpe_ehci_dev.dev.driver_data;
1604*53ee8cc1Swenshuai.xi
1605*53ee8cc1Swenshuai.xi if(hcd == NULL)
1606*53ee8cc1Swenshuai.xi {
1607*53ee8cc1Swenshuai.xi diag_printf("[USB] Error!!! hcd is Null, host_id %d\n", u8Hostid);
1608*53ee8cc1Swenshuai.xi return;
1609*53ee8cc1Swenshuai.xi }
1610*53ee8cc1Swenshuai.xi diag_printf("[USB] STR off...port %d\n", u8Hostid);
1611*53ee8cc1Swenshuai.xi pChip->u8Park = 1;
1612*53ee8cc1Swenshuai.xi hcd->state = HCD_STATE_HALT; // spped up urb flow
1613*53ee8cc1Swenshuai.xi diag_printf("[USB] STR waiting for park ");
1614*53ee8cc1Swenshuai.xi while(pChip->p_roothub[u8Hostid]->bPark_ok == FALSE)
1615*53ee8cc1Swenshuai.xi {
1616*53ee8cc1Swenshuai.xi diag_printf(".");
1617*53ee8cc1Swenshuai.xi MsOS_DelayTask(50);
1618*53ee8cc1Swenshuai.xi }
1619*53ee8cc1Swenshuai.xi diag_printf(" ok\n");
1620*53ee8cc1Swenshuai.xi ms_UnInitUSBIntr_EX(hcd);
1621*53ee8cc1Swenshuai.xi }
1622*53ee8cc1Swenshuai.xi
1623*53ee8cc1Swenshuai.xi extern void ms_ehci_periodic_size_init (struct usb_hcd *hcd);
MDrv_Usb_STR_On(MS_U8 u8Hostid)1624*53ee8cc1Swenshuai.xi void MDrv_Usb_STR_On(MS_U8 u8Hostid)
1625*53ee8cc1Swenshuai.xi {
1626*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef *pChip = pCurrentChip;
1627*53ee8cc1Swenshuai.xi struct usb_hcd *hcd;
1628*53ee8cc1Swenshuai.xi
1629*53ee8cc1Swenshuai.xi if (pChip == NULL)
1630*53ee8cc1Swenshuai.xi {
1631*53ee8cc1Swenshuai.xi diag_printf("[USB] Error!!! pChip is Null\n");
1632*53ee8cc1Swenshuai.xi return;
1633*53ee8cc1Swenshuai.xi }
1634*53ee8cc1Swenshuai.xi hcd = pChip->p_roothub[u8Hostid]->cpe_ehci_dev.dev.driver_data;
1635*53ee8cc1Swenshuai.xi
1636*53ee8cc1Swenshuai.xi if(hcd == NULL)
1637*53ee8cc1Swenshuai.xi {
1638*53ee8cc1Swenshuai.xi diag_printf("[USB] Error!!! hcd is Null, host_id %d\n", u8Hostid);
1639*53ee8cc1Swenshuai.xi return;
1640*53ee8cc1Swenshuai.xi }
1641*53ee8cc1Swenshuai.xi diag_printf("[USB] STR on...port %d\n", u8Hostid);
1642*53ee8cc1Swenshuai.xi ms_U4_series_usb_init(pChip, u8Hostid);
1643*53ee8cc1Swenshuai.xi ms_ehci_periodic_size_init(hcd);
1644*53ee8cc1Swenshuai.xi ms_InitUSBIntr_EX(hcd, 1);
1645*53ee8cc1Swenshuai.xi hcd->isBadDeviceRH = FALSE;
1646*53ee8cc1Swenshuai.xi pChip->u8Park = 0;
1647*53ee8cc1Swenshuai.xi pChip->p_roothub[u8Hostid]->bPark_ok = FALSE;
1648*53ee8cc1Swenshuai.xi }
1649*53ee8cc1Swenshuai.xi #endif
1650*53ee8cc1Swenshuai.xi
1651