xref: /utopia/UTPA2-700.0.x/modules/usb/drv/usb_ecos/usbhost/drvUSBEntry.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
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 
84*53ee8cc1Swenshuai.xi #include "include/drvConfig.h"
85*53ee8cc1Swenshuai.xi #include "include/drvPorts.h"
86*53ee8cc1Swenshuai.xi #include "include/drvKernel.h"
87*53ee8cc1Swenshuai.xi #include "include/drvTimer.h"
88*53ee8cc1Swenshuai.xi #include "include/drvUSBMsg.h"
89*53ee8cc1Swenshuai.xi 
90*53ee8cc1Swenshuai.xi #include "drvHCD.h"
91*53ee8cc1Swenshuai.xi #include "drvMassStor.h"
92*53ee8cc1Swenshuai.xi #include "include/drvCPE_EHCI.h"
93*53ee8cc1Swenshuai.xi #include "MsCommon.h"
94*53ee8cc1Swenshuai.xi //#include "drvpower.h"
95*53ee8cc1Swenshuai.xi #include "drvUSB.h"
96*53ee8cc1Swenshuai.xi #include "include/drvIO.h"
97*53ee8cc1Swenshuai.xi #include "drvUSBHwCtl.h"
98*53ee8cc1Swenshuai.xi #include "include/drvCPE_AMBA.h"
99*53ee8cc1Swenshuai.xi #include "drvEHCI.h"
100*53ee8cc1Swenshuai.xi #include "drvUsbcommon.h"
101*53ee8cc1Swenshuai.xi #include "drvSCSI.h"
102*53ee8cc1Swenshuai.xi #if USB_HID_SUPPORT
103*53ee8cc1Swenshuai.xi #include "drvHIDDev.h"
104*53ee8cc1Swenshuai.xi #endif
105*53ee8cc1Swenshuai.xi #if USB_CDC_SUPPORT
106*53ee8cc1Swenshuai.xi #include "drvCDCDev.h"
107*53ee8cc1Swenshuai.xi #endif
108*53ee8cc1Swenshuai.xi 
109*53ee8cc1Swenshuai.xi //#define HSTTASK_DEBUG
110*53ee8cc1Swenshuai.xi #ifdef HSTTASK_DEBUG
111*53ee8cc1Swenshuai.xi #define UDRV_Dbg		diag_printf
112*53ee8cc1Swenshuai.xi #else
113*53ee8cc1Swenshuai.xi #define UDRV_Dbg(x,...)
114*53ee8cc1Swenshuai.xi #endif
115*53ee8cc1Swenshuai.xi 
116*53ee8cc1Swenshuai.xi #define UDRV_ERR		diag_printf
117*53ee8cc1Swenshuai.xi 
118*53ee8cc1Swenshuai.xi 
119*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef *pCurrentChip;
120*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipURANUS4;
121*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipKRONUS;
122*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipKAISERIN;
123*53ee8cc1Swenshuai.xi 
124*53ee8cc1Swenshuai.xi mem_Alloc    pfnAllocCachedMem=NULL, pfnAllocNoncachedMem=NULL;
125*53ee8cc1Swenshuai.xi mem_Free     pfnFreeCachedMem=NULL, pfnFreeNoncachedMem=NULL;
126*53ee8cc1Swenshuai.xi mem_VA2PA    pfnVA2PA=NULL;
127*53ee8cc1Swenshuai.xi mem_PA2VA    pfnPA2VA=NULL;
128*53ee8cc1Swenshuai.xi mem_Cached2Noncached     pfnCached2Noncached=NULL;
129*53ee8cc1Swenshuai.xi mem_NonCached2Cached     pfnNoncached2Cached=NULL;
130*53ee8cc1Swenshuai.xi 
131*53ee8cc1Swenshuai.xi 
132*53ee8cc1Swenshuai.xi S32 _s32MutexUSB;
133*53ee8cc1Swenshuai.xi S32 _s32MutexUSB_Port2;
134*53ee8cc1Swenshuai.xi S32 _s32MutexUSB_Port1;
135*53ee8cc1Swenshuai.xi S32 _s32MutexUSB_Port3;
136*53ee8cc1Swenshuai.xi 
137*53ee8cc1Swenshuai.xi MS_S32 _s32UsbEventId = -1;
138*53ee8cc1Swenshuai.xi MS_BOOL UsbReady = FALSE;
139*53ee8cc1Swenshuai.xi //MS_U16  gIntStatus;
140*53ee8cc1Swenshuai.xi MS_BOOL  isRootHubPortReset = TRUE;
141*53ee8cc1Swenshuai.xi BOOL  gIsBadDevice = FALSE;
142*53ee8cc1Swenshuai.xi MS_U8 gUsbChipID = 0xFF;
143*53ee8cc1Swenshuai.xi 
144*53ee8cc1Swenshuai.xi 
145*53ee8cc1Swenshuai.xi MS_U32 gBaseUTMI=0, gBaseUSBC=0, gBaseUHC=0;
146*53ee8cc1Swenshuai.xi MS_U32 gBaseUTMI2=0, gBaseUSBC2=0, gBaseUHC2=0;
147*53ee8cc1Swenshuai.xi MS_U32 gIrqUHC=0xFFFF, gIrqUHC2=0xFFFF;
148*53ee8cc1Swenshuai.xi 
149*53ee8cc1Swenshuai.xi #define MAX_HCD_SUPPORT 2
150*53ee8cc1Swenshuai.xi MS_U8  gInitHcdNum=0, gHcdMap[MAX_HCD_SUPPORT]={0};
151*53ee8cc1Swenshuai.xi 
152*53ee8cc1Swenshuai.xi USBCallback _DrvUSBC_CBFun = NULL;
153*53ee8cc1Swenshuai.xi 
154*53ee8cc1Swenshuai.xi static void _DrvUSB_OnInterrupt(InterruptNum eIntNum);
155*53ee8cc1Swenshuai.xi void  UsbTask(MS_U32 argc, VOID *argv);
156*53ee8cc1Swenshuai.xi void USB_Start(void);
157*53ee8cc1Swenshuai.xi USBCallback _DrvUSB_CBFun = NULL;
158*53ee8cc1Swenshuai.xi 
159*53ee8cc1Swenshuai.xi extern BOOL UsbReady;
160*53ee8cc1Swenshuai.xi extern struct usb_hcd *g_pUsbHcd;
161*53ee8cc1Swenshuai.xi extern struct cpe_dev cpe_ehci_dev;
162*53ee8cc1Swenshuai.xi 
163*53ee8cc1Swenshuai.xi //HID device types
164*53ee8cc1Swenshuai.xi #if USB_HID_SUPPORT
165*53ee8cc1Swenshuai.xi extern S32 g_Hid_Timer_ID;
166*53ee8cc1Swenshuai.xi extern void usb_hid_parse_report(U8 *start, U16 size, struct button_struct *pButton,struct axis_struct *pAxis, struct key_struct *pKeys);
167*53ee8cc1Swenshuai.xi #endif
168*53ee8cc1Swenshuai.xi extern void init_OS_Port2_Resource(void);
169*53ee8cc1Swenshuai.xi extern void USB_Start_Port2(void);
170*53ee8cc1Swenshuai.xi void USBCriticalSectionIn(MS_U8 Port);
171*53ee8cc1Swenshuai.xi void USBCriticalSectionOut(MS_U8 Port);
172*53ee8cc1Swenshuai.xi extern void init_OS_Resource(void);
173*53ee8cc1Swenshuai.xi extern int __init ehci_cpe_dev_init(void);
174*53ee8cc1Swenshuai.xi extern int __init ehci_cpe_dev_init_Port2(void);
175*53ee8cc1Swenshuai.xi 
176*53ee8cc1Swenshuai.xi 
177*53ee8cc1Swenshuai.xi //#define ERROR_CONCEALMENT
178*53ee8cc1Swenshuai.xi #ifdef ERROR_CONCEALMENT
179*53ee8cc1Swenshuai.xi U32 u32UsbTaskTimer = 0;
180*53ee8cc1Swenshuai.xi #endif
181*53ee8cc1Swenshuai.xi 
182*53ee8cc1Swenshuai.xi #ifndef  MS_NOSAPI
183*53ee8cc1Swenshuai.xi static MS_U8 u8HubStackBuffer[HUB_STACK_SIZE];
184*53ee8cc1Swenshuai.xi #endif
185*53ee8cc1Swenshuai.xi 
186*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
187*53ee8cc1Swenshuai.xi /// Register a callback function to process the usb plug event
188*53ee8cc1Swenshuai.xi /// @param  pCallbackFn \b IN: callback function used in interrupt context.
189*53ee8cc1Swenshuai.xi /// @return None
190*53ee8cc1Swenshuai.xi /// @note   call after USB has been initialized
191*53ee8cc1Swenshuai.xi ///         The last registered callback will overwrite the previous ones.
192*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_USB_RegisterCallBack(USBCallback pCallbackFn)193*53ee8cc1Swenshuai.xi void MDrv_USB_RegisterCallBack (USBCallback pCallbackFn)
194*53ee8cc1Swenshuai.xi {
195*53ee8cc1Swenshuai.xi     //Register a callback function for application to process the data received
196*53ee8cc1Swenshuai.xi     //MsOS_DisableInterrupt(E_IRQ_UHC);
197*53ee8cc1Swenshuai.xi     _DrvUSB_CBFun = pCallbackFn;
198*53ee8cc1Swenshuai.xi     //MsOS_EnableInterrupt(E_IRQ_UHC);
199*53ee8cc1Swenshuai.xi }
200*53ee8cc1Swenshuai.xi 
MDrv_USBGetChipID(void)201*53ee8cc1Swenshuai.xi MS_U8 MDrv_USBGetChipID(void)
202*53ee8cc1Swenshuai.xi {
203*53ee8cc1Swenshuai.xi     if (gUsbChipID == 0xFF)
204*53ee8cc1Swenshuai.xi         gUsbChipID = usb_readb(OS_BASE_ADDR+0x1ecc*2);
205*53ee8cc1Swenshuai.xi 
206*53ee8cc1Swenshuai.xi 	//diag_printf("GetChipID: 0x%x\n", gUsbChipID);
207*53ee8cc1Swenshuai.xi     return gUsbChipID;
208*53ee8cc1Swenshuai.xi }
209*53ee8cc1Swenshuai.xi 
U4_series_usb_init(unsigned int UTMI_base,unsigned int USBC_base,unsigned int UHC_base,unsigned int flag)210*53ee8cc1Swenshuai.xi void U4_series_usb_init(unsigned int UTMI_base, unsigned int USBC_base, unsigned int UHC_base, unsigned int flag)
211*53ee8cc1Swenshuai.xi {
212*53ee8cc1Swenshuai.xi     MS_U8 chipID;
213*53ee8cc1Swenshuai.xi     MS_U16 chipVER = 0x100; // U01
214*53ee8cc1Swenshuai.xi 
215*53ee8cc1Swenshuai.xi 	diag_printf("usb_init start, UTMI base %p, USBC base %p, UHC base %p\n", UTMI_base, USBC_base, UHC_base);
216*53ee8cc1Swenshuai.xi 
217*53ee8cc1Swenshuai.xi     if (flag & EHCFLAG_TESTPKG)
218*53ee8cc1Swenshuai.xi     {
219*53ee8cc1Swenshuai.xi 	    usb_writew(0x2084, (void*) (UTMI_base+0x2*2)); //
220*53ee8cc1Swenshuai.xi 	    usb_writew(0x0003, (void*) (UTMI_base+0x20*2)); //
221*53ee8cc1Swenshuai.xi     }
222*53ee8cc1Swenshuai.xi 
223*53ee8cc1Swenshuai.xi 	usb_writeb(0x0a, (void*) (USBC_base)); // Disable MAC initial suspend, Reset UHC
224*53ee8cc1Swenshuai.xi 	usb_writeb(0x28, (void*) (USBC_base)); // Release UHC reset, enable UHC and OTG XIU function
225*53ee8cc1Swenshuai.xi 
226*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
227*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
228*53ee8cc1Swenshuai.xi 
229*53ee8cc1Swenshuai.xi     chipID = MDrv_USBGetChipID();
230*53ee8cc1Swenshuai.xi     if ((chipID == CHIPID_KRONUS) || (chipID == CHIPID_KAISERIN))
231*53ee8cc1Swenshuai.xi     {
232*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
233*53ee8cc1Swenshuai.xi 	    usb_writeb(0,    (void*) (UTMI_base+0x21*2-1));
234*53ee8cc1Swenshuai.xi 	    usb_writeb(0x10, (void*) (UTMI_base+0x23*2-1));
235*53ee8cc1Swenshuai.xi 	    usb_writeb(0x01, (void*) (UTMI_base+0x24*2));
236*53ee8cc1Swenshuai.xi     }
237*53ee8cc1Swenshuai.xi 
238*53ee8cc1Swenshuai.xi     if (flag & EHCFLAG_DOUBLE_DATARATE)
239*53ee8cc1Swenshuai.xi     {
240*53ee8cc1Swenshuai.xi         if ((flag & EHCFLAG_DDR_MASK) == EHCFLAG_DDR_x15)
241*53ee8cc1Swenshuai.xi         {
242*53ee8cc1Swenshuai.xi 	        usb_writeb(usb_readb((void*)(UTMI_base+0x20*2)) | 0x76, (void*) (UTMI_base+0x20*2)); // Set usb bus = 480MHz x 1.5
243*53ee8cc1Swenshuai.xi         }
244*53ee8cc1Swenshuai.xi         else if ((flag & EHCFLAG_DDR_MASK) == EHCFLAG_DDR_x18)
245*53ee8cc1Swenshuai.xi         {
246*53ee8cc1Swenshuai.xi 	        usb_writeb(usb_readb((void*)(UTMI_base+0x20*2)) | 0x8e, (void*) (UTMI_base+0x20*2)); // Set usb bus = 480MHz x 1.8
247*53ee8cc1Swenshuai.xi         }
248*53ee8cc1Swenshuai.xi         //else if ((flag & EHCFLAG_DDR_MASK) == EHCFLAG_DDR_x20)
249*53ee8cc1Swenshuai.xi         //{
250*53ee8cc1Swenshuai.xi 	    //    usb_writeb(usb_readb((void*)(UTMI_base+0xD*2-1)) | 0x01, (void*) (UTMI_base+0xD*2-1)); // Set usb bus = 480MHz x2
251*53ee8cc1Swenshuai.xi         //}
252*53ee8cc1Swenshuai.xi 
253*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)
254*53ee8cc1Swenshuai.xi     }
255*53ee8cc1Swenshuai.xi 
256*53ee8cc1Swenshuai.xi 	usb_writeb(usb_readb((void*)(UTMI_base+0x09*2-1)) & ~0x08, (void*) (UTMI_base+0x09*2-1)); // Disable force_pll_on
257*53ee8cc1Swenshuai.xi 	usb_writeb(usb_readb((void*)(UTMI_base+0x08*2)) & ~0x80, (void*) (UTMI_base+0x08*2)); // Enable band-gap current
258*53ee8cc1Swenshuai.xi 	usb_writeb(0xC3, (void*)(UTMI_base)); // reg_pdn: bit<15>, bit <2> ref_pdn
259*53ee8cc1Swenshuai.xi 	mdelay(1);	// delay 1ms
260*53ee8cc1Swenshuai.xi 
261*53ee8cc1Swenshuai.xi 	usb_writeb(0x69, (void*) (UTMI_base+0x01*2-1)); // Turn on UPLL, reg_pdn: bit<9>
262*53ee8cc1Swenshuai.xi 	mdelay(2);	// delay 2ms
263*53ee8cc1Swenshuai.xi 
264*53ee8cc1Swenshuai.xi 	usb_writeb(0x01, (void*) (UTMI_base)); // Turn all (including hs_current) use override mode
265*53ee8cc1Swenshuai.xi 	usb_writeb(0, (void*) (UTMI_base+0x01*2-1)); // Turn on UPLL, reg_pdn: bit<9>
266*53ee8cc1Swenshuai.xi 
267*53ee8cc1Swenshuai.xi 	usb_writeb(0x0A, (void*) (USBC_base)); // Disable MAC initial suspend, Reset UHC
268*53ee8cc1Swenshuai.xi 	usb_writeb(0x28, (void*) (USBC_base)); // Release UHC reset, enable UHC XIU function
269*53ee8cc1Swenshuai.xi 
270*53ee8cc1Swenshuai.xi 	usb_writeb(usb_readb((void*)(UTMI_base+0x3C*2)) | 0x01, (void*) (UTMI_base+0x3C*2)); // set CA_START as 1
271*53ee8cc1Swenshuai.xi 	mdelay(10);
272*53ee8cc1Swenshuai.xi 
273*53ee8cc1Swenshuai.xi 	usb_writeb(usb_readb((void*)(UTMI_base+0x3C*2)) & ~0x01, (void*) (UTMI_base+0x3C*2)); // release CA_START
274*53ee8cc1Swenshuai.xi 
275*53ee8cc1Swenshuai.xi 	while ((usb_readb((void*)(UTMI_base+0x3C*2)) & 0x02) == 0);	// polling bit <1> (CA_END)
276*53ee8cc1Swenshuai.xi 
277*53ee8cc1Swenshuai.xi     if (flag & EHCFLAG_DPDM_SWAP)
278*53ee8cc1Swenshuai.xi     	usb_writeb(usb_readb((void*)(UTMI_base+0x0b*2-1)) |0x20, (void*) (UTMI_base+0x0b*2-1)); // dp dm swap
279*53ee8cc1Swenshuai.xi 
280*53ee8cc1Swenshuai.xi 	usb_writeb(usb_readb((void*)(USBC_base+0x02*2)) & ~0x03, (void*) (USBC_base+0x02*2)); //UHC select enable
281*53ee8cc1Swenshuai.xi 	usb_writeb(usb_readb((void*)(USBC_base+0x02*2)) | 0x01, (void*) (USBC_base+0x02*2)); //UHC select enable
282*53ee8cc1Swenshuai.xi 
283*53ee8cc1Swenshuai.xi 	usb_writeb(usb_readb((void*)(UHC_base+0x40*2)) & ~0x10, (void*) (UHC_base+0x40*2)); //0: VBUS On.
284*53ee8cc1Swenshuai.xi 	mdelay(1);	// delay 1ms
285*53ee8cc1Swenshuai.xi 
286*53ee8cc1Swenshuai.xi 	usb_writeb(usb_readb((void*)(UHC_base+0x40*2)) | 0x08, (void*) (UHC_base+0x40*2)); // Active HIGH
287*53ee8cc1Swenshuai.xi 	mdelay(1);	// delay 1ms
288*53ee8cc1Swenshuai.xi 
289*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
290*53ee8cc1Swenshuai.xi 
291*53ee8cc1Swenshuai.xi     if ((chipID == CHIPID_KRONUS) || (chipID == CHIPID_URANUS4))
292*53ee8cc1Swenshuai.xi 	usb_writeb(usb_readb((void*)(UHC_base+0x83*2-1)) | 0x40, (void*) (UHC_base+0x83*2-1)); //set MIU1_sel to 128MB
293*53ee8cc1Swenshuai.xi     // Kaiserin will keep the defaut "00" to be as 512MB support
294*53ee8cc1Swenshuai.xi 
295*53ee8cc1Swenshuai.xi 	usb_writeb((usb_readb((void*)(UTMI_base+0x06*2)) & 0x9F) | 0x40, (void*) (UTMI_base+0x06*2)); //reg_tx_force_hs_current_enable
296*53ee8cc1Swenshuai.xi 
297*53ee8cc1Swenshuai.xi 	usb_writeb(usb_readb((void*)(UTMI_base+0x03*2-1)) | 0x28, (void*) (UTMI_base+0x03*2-1)); //Disconnect window select
298*53ee8cc1Swenshuai.xi 	usb_writeb(usb_readb((void*)(UTMI_base+0x03*2-1)) & 0xef, (void*) (UTMI_base+0x03*2-1)); //Disconnect window select
299*53ee8cc1Swenshuai.xi 
300*53ee8cc1Swenshuai.xi 	usb_writeb(usb_readb((void*)(UTMI_base+0x07*2-1)) & 0xfd, (void*) (UTMI_base+0x07*2-1)); //Disable improved CDR
301*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
302*53ee8cc1Swenshuai.xi 	if ((flag & EHCFLAG_DOUBLE_DATARATE)==0)
303*53ee8cc1Swenshuai.xi 	    usb_writeb(usb_readb((void*)(UTMI_base+0x0b*2-1)) |0x80, (void*) (UTMI_base+0x0b*2-1)); // TX timing select latch path
304*53ee8cc1Swenshuai.xi 	usb_writeb(usb_readb((void*)(UTMI_base+0x15*2-1)) |0x20, (void*) (UTMI_base+0x15*2-1)); // Chirp signal source select
305*53ee8cc1Swenshuai.xi 
306*53ee8cc1Swenshuai.xi 	usb_writeb(usb_readb((void*)(UTMI_base+0x2c*2)) |0x10, (void*) (UTMI_base+0x2c*2));
307*53ee8cc1Swenshuai.xi 	usb_writeb(usb_readb((void*)(UTMI_base+0x2d*2-1)) |0x02, (void*) (UTMI_base+0x2d*2-1));
308*53ee8cc1Swenshuai.xi 	usb_writeb(usb_readb((void*)(UTMI_base+0x2f*2-1)) |0x81, (void*) (UTMI_base+0x2f*2-1));
309*53ee8cc1Swenshuai.xi 
310*53ee8cc1Swenshuai.xi     // Kaiserin U02 patch code
311*53ee8cc1Swenshuai.xi     if (chipID == CHIPID_KAISERIN)
312*53ee8cc1Swenshuai.xi         chipVER = usb_readw((void *)(KAISERIN_CHIP_TOP_BASE+0xCE*2));
313*53ee8cc1Swenshuai.xi     if ((chipID == CHIPID_KAISERIN) && (chipVER == 0x101)) // && U02
314*53ee8cc1Swenshuai.xi     {
315*53ee8cc1Swenshuai.xi         diag_printf("K2S software patch!!!\n");
316*53ee8cc1Swenshuai.xi 
317*53ee8cc1Swenshuai.xi         // enable LS cross point ECO
318*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)
319*53ee8cc1Swenshuai.xi 
320*53ee8cc1Swenshuai.xi         // enable power noise ECO
321*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)
322*53ee8cc1Swenshuai.xi 
323*53ee8cc1Swenshuai.xi         // enable TX/RX reset clock gating ECO
324*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)
325*53ee8cc1Swenshuai.xi 
326*53ee8cc1Swenshuai.xi         // enable loss short packet interrupt ECO, default 0 on
327*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)
328*53ee8cc1Swenshuai.xi 
329*53ee8cc1Swenshuai.xi         // enable babble ECO
330*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)
331*53ee8cc1Swenshuai.xi 
332*53ee8cc1Swenshuai.xi         // enable MDATA single TT ECO
333*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)
334*53ee8cc1Swenshuai.xi     }
335*53ee8cc1Swenshuai.xi 
336*53ee8cc1Swenshuai.xi     if (flag & EHCFLAG_TESTPKG)
337*53ee8cc1Swenshuai.xi     {
338*53ee8cc1Swenshuai.xi 	    usb_writew(0x0210, (void*) (UTMI_base+0x2C*2)); //
339*53ee8cc1Swenshuai.xi 	    usb_writew(0x8100, (void*) (UTMI_base+0x2E*2)); //
340*53ee8cc1Swenshuai.xi 
341*53ee8cc1Swenshuai.xi 	    usb_writew(0x0600, (void*) (UTMI_base+0x14*2)); //
342*53ee8cc1Swenshuai.xi 	    usb_writew(0x0038, (void*) (UTMI_base+0x10*2)); //
343*53ee8cc1Swenshuai.xi 	    usb_writew(0x0BFE, (void*) (UTMI_base+0x32*2)); //
344*53ee8cc1Swenshuai.xi     }
345*53ee8cc1Swenshuai.xi 
346*53ee8cc1Swenshuai.xi }
347*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)348*53ee8cc1Swenshuai.xi void MDrv_Usb_Init(
349*53ee8cc1Swenshuai.xi     mem_Alloc     pfn_Cachedmem_Alloc,
350*53ee8cc1Swenshuai.xi     mem_Free      pfn_Cachedmem_Free,
351*53ee8cc1Swenshuai.xi     mem_Alloc     pfn_NonCachedmem_Alloc,
352*53ee8cc1Swenshuai.xi     mem_Free      pfn_NonCachedmem_Free,
353*53ee8cc1Swenshuai.xi     mem_VA2PA     pfn_mem_VA2PA,
354*53ee8cc1Swenshuai.xi     mem_PA2VA     pfn_mem_PA2VA,
355*53ee8cc1Swenshuai.xi     mem_Cached2Noncached pfn_mem_Cached2Noncached,
356*53ee8cc1Swenshuai.xi     mem_NonCached2Cached pfn_mem_NonCached2Cached
357*53ee8cc1Swenshuai.xi )
358*53ee8cc1Swenshuai.xi {
359*53ee8cc1Swenshuai.xi     MS_U8 cid;
360*53ee8cc1Swenshuai.xi     MS_U16 chipVER = 0x100; // U01
361*53ee8cc1Swenshuai.xi     diag_printf("Usb init\n");
362*53ee8cc1Swenshuai.xi 
363*53ee8cc1Swenshuai.xi     pfnAllocCachedMem = pfn_Cachedmem_Alloc;
364*53ee8cc1Swenshuai.xi     pfnFreeCachedMem = pfn_Cachedmem_Free;
365*53ee8cc1Swenshuai.xi     pfnAllocNoncachedMem = pfn_NonCachedmem_Alloc;
366*53ee8cc1Swenshuai.xi     pfnFreeNoncachedMem = pfn_NonCachedmem_Free;
367*53ee8cc1Swenshuai.xi     pfnVA2PA = pfn_mem_VA2PA;
368*53ee8cc1Swenshuai.xi     pfnPA2VA = pfn_mem_PA2VA;
369*53ee8cc1Swenshuai.xi     pfnCached2Noncached = pfn_mem_Cached2Noncached;
370*53ee8cc1Swenshuai.xi     pfnNoncached2Cached = pfn_mem_NonCached2Cached;
371*53ee8cc1Swenshuai.xi 
372*53ee8cc1Swenshuai.xi     init_sys();
373*53ee8cc1Swenshuai.xi 
374*53ee8cc1Swenshuai.xi #ifndef  MS_NOSAPI
375*53ee8cc1Swenshuai.xi     ASSERT(-1 == _s32UsbEventId);
376*53ee8cc1Swenshuai.xi     _s32UsbEventId = MsOS_CreateEventGroup("UHC_Event");
377*53ee8cc1Swenshuai.xi #endif
378*53ee8cc1Swenshuai.xi 
379*53ee8cc1Swenshuai.xi     usb_stor_init();
380*53ee8cc1Swenshuai.xi 
381*53ee8cc1Swenshuai.xi #if USB_HID_SUPPORT
382*53ee8cc1Swenshuai.xi     usb_hid_init();
383*53ee8cc1Swenshuai.xi #endif
384*53ee8cc1Swenshuai.xi 
385*53ee8cc1Swenshuai.xi #if USB_CDC_SUPPORT
386*53ee8cc1Swenshuai.xi     usb_cdc_init();
387*53ee8cc1Swenshuai.xi #endif
388*53ee8cc1Swenshuai.xi 
389*53ee8cc1Swenshuai.xi     // Decide the current chip
390*53ee8cc1Swenshuai.xi     cid = MDrv_USBGetChipID();
391*53ee8cc1Swenshuai.xi     switch (cid)
392*53ee8cc1Swenshuai.xi     {
393*53ee8cc1Swenshuai.xi         case CHIPID_URANUS4:
394*53ee8cc1Swenshuai.xi             pCurrentChip = &chipURANUS4;
395*53ee8cc1Swenshuai.xi             break;
396*53ee8cc1Swenshuai.xi         case CHIPID_KRONUS:
397*53ee8cc1Swenshuai.xi             pCurrentChip = &chipKRONUS;
398*53ee8cc1Swenshuai.xi             break;
399*53ee8cc1Swenshuai.xi         case CHIPID_KAISERIN:
400*53ee8cc1Swenshuai.xi             pCurrentChip = &chipKAISERIN;
401*53ee8cc1Swenshuai.xi             diag_printf("Chip Kaiserin!\n");
402*53ee8cc1Swenshuai.xi             chipVER = usb_readw((void *)(KAISERIN_CHIP_TOP_BASE+0xCE*2));
403*53ee8cc1Swenshuai.xi             if (chipVER == 0x101) // U02
404*53ee8cc1Swenshuai.xi             {
405*53ee8cc1Swenshuai.xi                 // chip top performance tuning [11:9]
406*53ee8cc1Swenshuai.xi                 usb_writew(usb_readw((void*)(KAISERIN_CHIP_TOP_BASE+0x46*2)) | 0xe00, (void*) (KAISERIN_CHIP_TOP_BASE+0x46*2));
407*53ee8cc1Swenshuai.xi             }
408*53ee8cc1Swenshuai.xi             break;
409*53ee8cc1Swenshuai.xi         default:
410*53ee8cc1Swenshuai.xi             pCurrentChip = NULL;
411*53ee8cc1Swenshuai.xi             diag_printf("Not allowed chip ID\n");
412*53ee8cc1Swenshuai.xi     }
413*53ee8cc1Swenshuai.xi     pCurrentChip->chipID = cid;
414*53ee8cc1Swenshuai.xi }
415*53ee8cc1Swenshuai.xi 
416*53ee8cc1Swenshuai.xi 
417*53ee8cc1Swenshuai.xi extern MS_BOOL MDrv_USB_Port_Init_EX(MS_U8 u8PortNum);
MDrv_USB_Port_Init(MS_U8 u8PortNum)418*53ee8cc1Swenshuai.xi MS_BOOL MDrv_USB_Port_Init(MS_U8 u8PortNum)
419*53ee8cc1Swenshuai.xi {
420*53ee8cc1Swenshuai.xi         unsigned int dwFlag=0;
421*53ee8cc1Swenshuai.xi 	MS_U8 i=0;
422*53ee8cc1Swenshuai.xi         MS_U8 cid;
423*53ee8cc1Swenshuai.xi 	MS_U32 *pUTMI, *pUSBC, *pUHC, *pIrq;
424*53ee8cc1Swenshuai.xi 
425*53ee8cc1Swenshuai.xi         cid = MDrv_USBGetChipID();
426*53ee8cc1Swenshuai.xi 	if (cid== CHIPID_KAISERIN)
427*53ee8cc1Swenshuai.xi 	{
428*53ee8cc1Swenshuai.xi 	        return( MDrv_USB_Port_Init_EX(u8PortNum));
429*53ee8cc1Swenshuai.xi 	}
430*53ee8cc1Swenshuai.xi 
431*53ee8cc1Swenshuai.xi 	if (gInitHcdNum >= MAX_HCD_SUPPORT)
432*53ee8cc1Swenshuai.xi 	{
433*53ee8cc1Swenshuai.xi 		diag_printf(" Assert !! U4_series_usb_init: Exceed max USB number support !!\n");
434*53ee8cc1Swenshuai.xi 		while(1);
435*53ee8cc1Swenshuai.xi 	}
436*53ee8cc1Swenshuai.xi 
437*53ee8cc1Swenshuai.xi 	if (gInitHcdNum) {
438*53ee8cc1Swenshuai.xi 		for (i=0; i<gInitHcdNum; i++) {
439*53ee8cc1Swenshuai.xi 			if (u8PortNum == gHcdMap[i])
440*53ee8cc1Swenshuai.xi 			{
441*53ee8cc1Swenshuai.xi 				diag_printf(" Assert !! U4_series_usb_init: Initialize the same port duplicately !!\n");
442*53ee8cc1Swenshuai.xi 				while(1);
443*53ee8cc1Swenshuai.xi 			}
444*53ee8cc1Swenshuai.xi 		}
445*53ee8cc1Swenshuai.xi 	}
446*53ee8cc1Swenshuai.xi 
447*53ee8cc1Swenshuai.xi 	gHcdMap[gInitHcdNum] = u8PortNum;
448*53ee8cc1Swenshuai.xi 	gInitHcdNum++;
449*53ee8cc1Swenshuai.xi 
450*53ee8cc1Swenshuai.xi 	switch (gInitHcdNum)
451*53ee8cc1Swenshuai.xi 	{
452*53ee8cc1Swenshuai.xi 		case 1:
453*53ee8cc1Swenshuai.xi 				pUTMI = &gBaseUTMI;
454*53ee8cc1Swenshuai.xi 				pUSBC = &gBaseUSBC;
455*53ee8cc1Swenshuai.xi 				pUHC  = &gBaseUHC;
456*53ee8cc1Swenshuai.xi 				pIrq  = &gIrqUHC;
457*53ee8cc1Swenshuai.xi 				break;
458*53ee8cc1Swenshuai.xi 		case 2:
459*53ee8cc1Swenshuai.xi 				pUTMI = &gBaseUTMI2;
460*53ee8cc1Swenshuai.xi 				pUSBC = &gBaseUSBC2;
461*53ee8cc1Swenshuai.xi 				pUHC  = &gBaseUHC2;
462*53ee8cc1Swenshuai.xi 				pIrq  = &gIrqUHC2;
463*53ee8cc1Swenshuai.xi 				break;
464*53ee8cc1Swenshuai.xi 		default:
465*53ee8cc1Swenshuai.xi 			diag_printf(" Assert !! U4_series_usb_init: Not handled code !!\n");
466*53ee8cc1Swenshuai.xi 			while(1);
467*53ee8cc1Swenshuai.xi 			break;
468*53ee8cc1Swenshuai.xi 	}
469*53ee8cc1Swenshuai.xi 
470*53ee8cc1Swenshuai.xi 
471*53ee8cc1Swenshuai.xi     if (cid== CHIPID_KRONUS) //K1 only!!
472*53ee8cc1Swenshuai.xi     {
473*53ee8cc1Swenshuai.xi         dwFlag |= EHCFLAG_DPDM_SWAP;
474*53ee8cc1Swenshuai.xi     }
475*53ee8cc1Swenshuai.xi 
476*53ee8cc1Swenshuai.xi     switch(u8PortNum)
477*53ee8cc1Swenshuai.xi     {
478*53ee8cc1Swenshuai.xi         case 0:
479*53ee8cc1Swenshuai.xi 			*pUTMI = BASE_UTMI0;
480*53ee8cc1Swenshuai.xi 			*pUSBC = BASE_USBC0;
481*53ee8cc1Swenshuai.xi 			*pUHC  = BASE_UHC0;
482*53ee8cc1Swenshuai.xi 			*pIrq  = E_IRQ_UHC;
483*53ee8cc1Swenshuai.xi             break;
484*53ee8cc1Swenshuai.xi 
485*53ee8cc1Swenshuai.xi         case 1:
486*53ee8cc1Swenshuai.xi             if (cid== CHIPID_KRONUS)
487*53ee8cc1Swenshuai.xi             {
488*53ee8cc1Swenshuai.xi 				*pUTMI = BASE_UTMI2;
489*53ee8cc1Swenshuai.xi 				*pUSBC = BASE_USBC2;
490*53ee8cc1Swenshuai.xi 				*pUHC  = BASE_UHC2;
491*53ee8cc1Swenshuai.xi 				*pIrq  = E_IRQ_UHC2;
492*53ee8cc1Swenshuai.xi 			}
493*53ee8cc1Swenshuai.xi 			else
494*53ee8cc1Swenshuai.xi 			{   //U4
495*53ee8cc1Swenshuai.xi 				*pUTMI = BASE_UTMI1;
496*53ee8cc1Swenshuai.xi 				*pUSBC = BASE_USBC1;
497*53ee8cc1Swenshuai.xi 				*pUHC  = BASE_UHC1;
498*53ee8cc1Swenshuai.xi 				*pIrq  = E_IRQ_UHC1;
499*53ee8cc1Swenshuai.xi             }
500*53ee8cc1Swenshuai.xi 			break;
501*53ee8cc1Swenshuai.xi 
502*53ee8cc1Swenshuai.xi         case 2:
503*53ee8cc1Swenshuai.xi             if (cid!= CHIPID_URANUS4) //U4 only!!
504*53ee8cc1Swenshuai.xi         	{
505*53ee8cc1Swenshuai.xi 				diag_printf(" Assert !! U4_series_usb_init: No this port number in the chip !!\n");
506*53ee8cc1Swenshuai.xi 				while(1);
507*53ee8cc1Swenshuai.xi         	}
508*53ee8cc1Swenshuai.xi             if (cid== CHIPID_URANUS4) //U4 only!!
509*53ee8cc1Swenshuai.xi             {
510*53ee8cc1Swenshuai.xi                 dwFlag |= EHCFLAG_DPDM_SWAP;
511*53ee8cc1Swenshuai.xi             }
512*53ee8cc1Swenshuai.xi 
513*53ee8cc1Swenshuai.xi 			*pUTMI = BASE_UTMI2;
514*53ee8cc1Swenshuai.xi 			*pUSBC = BASE_USBC2;
515*53ee8cc1Swenshuai.xi 			*pUHC  = BASE_UHC2;
516*53ee8cc1Swenshuai.xi 			*pIrq  = E_IRQ_UHC2;
517*53ee8cc1Swenshuai.xi             break;
518*53ee8cc1Swenshuai.xi 
519*53ee8cc1Swenshuai.xi         default:
520*53ee8cc1Swenshuai.xi 			diag_printf(" Assert !! U4_series_usb_init: No this port number in the chip !!\n");
521*53ee8cc1Swenshuai.xi 			while(1);
522*53ee8cc1Swenshuai.xi             return FALSE;
523*53ee8cc1Swenshuai.xi             }
524*53ee8cc1Swenshuai.xi 
525*53ee8cc1Swenshuai.xi 
526*53ee8cc1Swenshuai.xi 	switch (gInitHcdNum)
527*53ee8cc1Swenshuai.xi 	{
528*53ee8cc1Swenshuai.xi 		case 1:
529*53ee8cc1Swenshuai.xi             U4_series_usb_init(gBaseUTMI, gBaseUSBC, gBaseUHC, dwFlag);
530*53ee8cc1Swenshuai.xi             init_OS_Resource();
531*53ee8cc1Swenshuai.xi             ehci_cpe_dev_init();
532*53ee8cc1Swenshuai.xi             USB_Start();
533*53ee8cc1Swenshuai.xi 			break;
534*53ee8cc1Swenshuai.xi 		case 2:
535*53ee8cc1Swenshuai.xi             U4_series_usb_init(gBaseUTMI2, gBaseUSBC2, gBaseUHC2, dwFlag);
536*53ee8cc1Swenshuai.xi             init_OS_Port2_Resource();
537*53ee8cc1Swenshuai.xi             ehci_cpe_dev_init_Port2();
538*53ee8cc1Swenshuai.xi             USB_Start_Port2();
539*53ee8cc1Swenshuai.xi             break;
540*53ee8cc1Swenshuai.xi         default:
541*53ee8cc1Swenshuai.xi 			diag_printf(" Assert !! U4_series_usb_init: Not handled code !!\n");
542*53ee8cc1Swenshuai.xi 			while(1);
543*53ee8cc1Swenshuai.xi 			break;
544*53ee8cc1Swenshuai.xi     }
545*53ee8cc1Swenshuai.xi 
546*53ee8cc1Swenshuai.xi     return TRUE;
547*53ee8cc1Swenshuai.xi }
548*53ee8cc1Swenshuai.xi 
USB_Start(void)549*53ee8cc1Swenshuai.xi void USB_Start(void)
550*53ee8cc1Swenshuai.xi {
551*53ee8cc1Swenshuai.xi #ifndef  MS_NOSAPI
552*53ee8cc1Swenshuai.xi     MS_U8 *HubStack;
553*53ee8cc1Swenshuai.xi     int pid;
554*53ee8cc1Swenshuai.xi #endif
555*53ee8cc1Swenshuai.xi 
556*53ee8cc1Swenshuai.xi     diag_printf("Usb start..\n");
557*53ee8cc1Swenshuai.xi 
558*53ee8cc1Swenshuai.xi #ifndef  MS_NOSAPI
559*53ee8cc1Swenshuai.xi     HubStack = u8HubStackBuffer;
560*53ee8cc1Swenshuai.xi     _s32MutexUSB = MsOS_CreateMutex(E_MSOS_FIFO, "USB_MUTEX", MSOS_PROCESS_SHARED);
561*53ee8cc1Swenshuai.xi 
562*53ee8cc1Swenshuai.xi     if (_s32MutexUSB < 0)
563*53ee8cc1Swenshuai.xi     {
564*53ee8cc1Swenshuai.xi         GEN_EXCEP;
565*53ee8cc1Swenshuai.xi         return;
566*53ee8cc1Swenshuai.xi     }
567*53ee8cc1Swenshuai.xi #endif //MS_NOSAPI
568*53ee8cc1Swenshuai.xi 
569*53ee8cc1Swenshuai.xi #ifndef MS_NOSAPI
570*53ee8cc1Swenshuai.xi     //Create Task
571*53ee8cc1Swenshuai.xi     pid = MsOS_CreateTask((TaskEntry) UsbTask,
572*53ee8cc1Swenshuai.xi                          (MS_U32)NULL,
573*53ee8cc1Swenshuai.xi                          E_TASK_PRI_HIGH,
574*53ee8cc1Swenshuai.xi                          TRUE,
575*53ee8cc1Swenshuai.xi                          HubStack,
576*53ee8cc1Swenshuai.xi                          HUB_STACK_SIZE,
577*53ee8cc1Swenshuai.xi                          "USB Hub Task");
578*53ee8cc1Swenshuai.xi     if (pid < 0)
579*53ee8cc1Swenshuai.xi     {
580*53ee8cc1Swenshuai.xi         GEN_EXCEP;
581*53ee8cc1Swenshuai.xi         //MsOS_FreeMemory(HubStack, gs32CachedPoolID);
582*53ee8cc1Swenshuai.xi         MsOS_DeleteMutex(_s32MutexUSB);
583*53ee8cc1Swenshuai.xi 
584*53ee8cc1Swenshuai.xi         //MsOS_DeleteMutex(_s32MutexUSB_Port2);
585*53ee8cc1Swenshuai.xi 
586*53ee8cc1Swenshuai.xi         return;
587*53ee8cc1Swenshuai.xi     }
588*53ee8cc1Swenshuai.xi #else
589*53ee8cc1Swenshuai.xi     //UsbTask();
590*53ee8cc1Swenshuai.xi #endif //MS_NOSAPI
591*53ee8cc1Swenshuai.xi 
592*53ee8cc1Swenshuai.xi     return;
593*53ee8cc1Swenshuai.xi }
594*53ee8cc1Swenshuai.xi 
595*53ee8cc1Swenshuai.xi //void ResetUsbHardware(void) moved to drvUSBHwCtl.c
596*53ee8cc1Swenshuai.xi extern void ResetMstarUsb(struct ehci_hcd *ehci);
597*53ee8cc1Swenshuai.xi 
598*53ee8cc1Swenshuai.xi MS_BOOL MDrv_UsbDeviceConnect_EX(struct usb_hcd *hcd);
MDrv_UsbDeviceConnect(struct usb_hcd * hcd)599*53ee8cc1Swenshuai.xi MS_BOOL MDrv_UsbDeviceConnect(struct usb_hcd *hcd)
600*53ee8cc1Swenshuai.xi {
601*53ee8cc1Swenshuai.xi #if 1 // _EX
602*53ee8cc1Swenshuai.xi     if (MDrv_UsbDeviceConnect_EX(hcd))
603*53ee8cc1Swenshuai.xi         return TRUE;
604*53ee8cc1Swenshuai.xi     else
605*53ee8cc1Swenshuai.xi         return(UsbReady = FALSE);
606*53ee8cc1Swenshuai.xi #else
607*53ee8cc1Swenshuai.xi     struct ehci_hcd *ehci = hcd_to_ehci(hcd);
608*53ee8cc1Swenshuai.xi     MS_U8 temp_s;
609*53ee8cc1Swenshuai.xi     MS_U32 temp;
610*53ee8cc1Swenshuai.xi     static MS_U32  UsbStartTime=0;
611*53ee8cc1Swenshuai.xi 
612*53ee8cc1Swenshuai.xi     temp_s = ehci_readb((U32)&ehci->regs->port_status[0]);
613*53ee8cc1Swenshuai.xi     //temp=mwHost20_PORTSC_ConnectStatus_Rd();
614*53ee8cc1Swenshuai.xi     //diag_printf("ConnectStatus:%02bx\n",temp);
615*53ee8cc1Swenshuai.xi     //MsOS_DelayTask(10);
616*53ee8cc1Swenshuai.xi     if (temp_s & PORT_CONNECT)
617*53ee8cc1Swenshuai.xi     {
618*53ee8cc1Swenshuai.xi         // diag_printf("TEMP:%02bx\n",temp);
619*53ee8cc1Swenshuai.xi         return TRUE;
620*53ee8cc1Swenshuai.xi     }
621*53ee8cc1Swenshuai.xi     else
622*53ee8cc1Swenshuai.xi     {
623*53ee8cc1Swenshuai.xi #ifndef MS_NOSAPI
624*53ee8cc1Swenshuai.xi         if (MsOS_GetSystemTime()-UsbStartTime > 1000 )
625*53ee8cc1Swenshuai.xi         {
626*53ee8cc1Swenshuai.xi             UsbStartTime=MsOS_GetSystemTime();
627*53ee8cc1Swenshuai.xi 
628*53ee8cc1Swenshuai.xi             temp = ehci_readl((U32)&ehci->regs->bus_control);
629*53ee8cc1Swenshuai.xi             temp &= ~0x80;
630*53ee8cc1Swenshuai.xi             ehci_writel(temp, (U32)&ehci->regs->bus_control);
631*53ee8cc1Swenshuai.xi             //UHC_ANDXBYTE(0x40, 0x7F);//disable force enter FSmode
632*53ee8cc1Swenshuai.xi             ResetMstarUsb(ehci);
633*53ee8cc1Swenshuai.xi         }
634*53ee8cc1Swenshuai.xi #endif
635*53ee8cc1Swenshuai.xi         hcd->isRootHubPortReset = TRUE;
636*53ee8cc1Swenshuai.xi         UsbReady=FALSE;
637*53ee8cc1Swenshuai.xi         hcd->isBadDevice = FALSE;
638*53ee8cc1Swenshuai.xi         return FALSE;
639*53ee8cc1Swenshuai.xi     }
640*53ee8cc1Swenshuai.xi #endif
641*53ee8cc1Swenshuai.xi }
642*53ee8cc1Swenshuai.xi 
MDrv_UsbClose(void)643*53ee8cc1Swenshuai.xi void MDrv_UsbClose(void)
644*53ee8cc1Swenshuai.xi {
645*53ee8cc1Swenshuai.xi #ifndef  MS_NOSAPI
646*53ee8cc1Swenshuai.xi //    MsOS_DisableInterrupt(E_IRQ_UHC);
647*53ee8cc1Swenshuai.xi //    MsOS_DetachInterrupt(E_IRQ_UHC);
648*53ee8cc1Swenshuai.xi //    MsOS_DeleteEventGroup(_s32UsbEventId);
649*53ee8cc1Swenshuai.xi //    _s32UsbEventId = -1;
650*53ee8cc1Swenshuai.xi ///    Host20_ReleaseBuffer();
651*53ee8cc1Swenshuai.xi #endif
652*53ee8cc1Swenshuai.xi ///	flib_Host20_Close(0);
653*53ee8cc1Swenshuai.xi #ifndef MS_NOSAPI
654*53ee8cc1Swenshuai.xi #if 0 ///
655*53ee8cc1Swenshuai.xi     if(usb_temp_buf)
656*53ee8cc1Swenshuai.xi     {
657*53ee8cc1Swenshuai.xi         MsOS_FreeMemory((void*)usb_temp_buf,gs32NonCachedPoolID_MIU0);
658*53ee8cc1Swenshuai.xi         usb_temp_buf = 0;
659*53ee8cc1Swenshuai.xi     }
660*53ee8cc1Swenshuai.xi #endif
661*53ee8cc1Swenshuai.xi #endif
662*53ee8cc1Swenshuai.xi }
663*53ee8cc1Swenshuai.xi 
664*53ee8cc1Swenshuai.xi /*
665*53ee8cc1Swenshuai.xi     <1>.Disable RunStop
666*53ee8cc1Swenshuai.xi     <1.1>. Chirp hardware patch 1
667*53ee8cc1Swenshuai.xi     <2> .Write PortReset=1
668*53ee8cc1Swenshuai.xi     <3>.Wait time=>50ms
669*53ee8cc1Swenshuai.xi     <3.1>. Chirp hardware patch 2
670*53ee8cc1Swenshuai.xi     <3.2>. Wait time=>20ms
671*53ee8cc1Swenshuai.xi     <4>.Write PortReset=0
672*53ee8cc1Swenshuai.xi     <4.1>. Chirp hardware patch 3
673*53ee8cc1Swenshuai.xi     <5>.Waiting for PortReset==0
674*53ee8cc1Swenshuai.xi     <6>.Enable RunStop Bit
675*53ee8cc1Swenshuai.xi     <6.1>.reset UTMI
676*53ee8cc1Swenshuai.xi     <6.2> Write RunStop Bit=1
677*53ee8cc1Swenshuai.xi     <6.3>.Wait time 5ms, wait some slow device to be ready
678*53ee8cc1Swenshuai.xi     <7>.Detect Speed
679*53ee8cc1Swenshuai.xi */
680*53ee8cc1Swenshuai.xi #define MSTAR_CHIRP_PATCH 1
681*53ee8cc1Swenshuai.xi #define MSTAR_EHC_RTERM_PATCH 1
682*53ee8cc1Swenshuai.xi 
PortReset(unsigned int regUTMI,unsigned int regUHC)683*53ee8cc1Swenshuai.xi int PortReset(unsigned int regUTMI, unsigned int regUHC)
684*53ee8cc1Swenshuai.xi {
685*53ee8cc1Swenshuai.xi     MS_U32 wTmp;
686*53ee8cc1Swenshuai.xi 
687*53ee8cc1Swenshuai.xi     diag_printf("PortReset: UTMI 0x%x, UHC 0x%x\n", regUTMI, regUHC);
688*53ee8cc1Swenshuai.xi 
689*53ee8cc1Swenshuai.xi 	writeb(readb((void*)(regUHC+0x10*2)) | 0x1, (void*)(regUHC+0x10*2)); //Set UHC run
690*53ee8cc1Swenshuai.xi 
691*53ee8cc1Swenshuai.xi #if MSTAR_CHIRP_PATCH
692*53ee8cc1Swenshuai.xi 	writeb(0x10, (void*)(regUTMI+0x2C*2));
693*53ee8cc1Swenshuai.xi 	writeb(0x00, (void*)(regUTMI+0x2D*2-1));
694*53ee8cc1Swenshuai.xi 	writeb(0x00, (void*)(regUTMI+0x2F*2-1));
695*53ee8cc1Swenshuai.xi 	writeb(0x80 ,(void*)(regUTMI+0x2A*2));
696*53ee8cc1Swenshuai.xi 	//writeb(0x20 ,(void*)(regUTMI+0x2A*2));
697*53ee8cc1Swenshuai.xi #endif
698*53ee8cc1Swenshuai.xi 
699*53ee8cc1Swenshuai.xi     #if (MSTAR_EHC_RTERM_PATCH)
700*53ee8cc1Swenshuai.xi 	writeb(readb((void*)(regUTMI+0x13*2-1))|0x70, (void*)(regUTMI+0x13*2-1));
701*53ee8cc1Swenshuai.xi     #endif
702*53ee8cc1Swenshuai.xi 
703*53ee8cc1Swenshuai.xi         // Write PortReset bit
704*53ee8cc1Swenshuai.xi 	writeb(readb((void*)(regUHC+0x31*2-1)) | 0x01,(void*)(regUHC+0x31*2-1));
705*53ee8cc1Swenshuai.xi 	mdelay(50);  //shorten the reset period for Transcend USB3.0 HDD
706*53ee8cc1Swenshuai.xi #if MSTAR_CHIRP_PATCH
707*53ee8cc1Swenshuai.xi 	writeb(0x0 ,(void*)(regUTMI+0x2A*2));
708*53ee8cc1Swenshuai.xi #endif
709*53ee8cc1Swenshuai.xi 	mdelay(20);
710*53ee8cc1Swenshuai.xi 
711*53ee8cc1Swenshuai.xi         // Clear PortReset bit
712*53ee8cc1Swenshuai.xi 	writeb(readb((void*)(regUHC+0x31*2-1)) & 0xfe,(void*)(regUHC+0x31*2-1));
713*53ee8cc1Swenshuai.xi 
714*53ee8cc1Swenshuai.xi     wTmp=0;
715*53ee8cc1Swenshuai.xi 
716*53ee8cc1Swenshuai.xi     while (1)
717*53ee8cc1Swenshuai.xi     {
718*53ee8cc1Swenshuai.xi          if ((readb((void*)(regUHC+0x31*2-1)) & 0x1)==0)  break;
719*53ee8cc1Swenshuai.xi 
720*53ee8cc1Swenshuai.xi          wTmp++;
721*53ee8cc1Swenshuai.xi          //udelay(1);
722*53ee8cc1Swenshuai.xi          if (wTmp>20000)
723*53ee8cc1Swenshuai.xi   	     {
724*53ee8cc1Swenshuai.xi                diag_printf("??? Error waiting for Bus Reset Fail...==> Reset HW Control\n");
725*53ee8cc1Swenshuai.xi                //mbHost20_USBCMD_HCReset_Set();
726*53ee8cc1Swenshuai.xi                writeb(readb((void*)(regUHC+0x10*2)) | 0x2,(void*)(regUHC+0x10*2));
727*53ee8cc1Swenshuai.xi 
728*53ee8cc1Swenshuai.xi                //while(mbHost20_USBCMD_HCReset_Rd()==1);
729*53ee8cc1Swenshuai.xi                while(readb((void*)(regUHC+0x10*2)) && 0x2);
730*53ee8cc1Swenshuai.xi                return (1);
731*53ee8cc1Swenshuai.xi          }
732*53ee8cc1Swenshuai.xi     }
733*53ee8cc1Swenshuai.xi 
734*53ee8cc1Swenshuai.xi 
735*53ee8cc1Swenshuai.xi #if (MSTAR_CHIRP_PATCH)
736*53ee8cc1Swenshuai.xi 	writeb(readb((void*)(regUTMI+0x2c*2)) |0x10, (void*) (regUTMI+0x2c*2));
737*53ee8cc1Swenshuai.xi 	writeb(readb((void*)(regUTMI+0x2d*2-1)) |0x02, (void*) (regUTMI+0x2d*2-1));
738*53ee8cc1Swenshuai.xi 	writeb(readb((void*)(regUTMI+0x2f*2-1)) |0x81, (void*) (regUTMI+0x2f*2-1));
739*53ee8cc1Swenshuai.xi #endif
740*53ee8cc1Swenshuai.xi 
741*53ee8cc1Swenshuai.xi     #if (MSTAR_EHC_RTERM_PATCH)
742*53ee8cc1Swenshuai.xi 	writeb(readb((void*)(regUTMI+0x13*2-1))&0x8F, (void*)(regUTMI+0x13*2-1));
743*53ee8cc1Swenshuai.xi     #endif
744*53ee8cc1Swenshuai.xi 
745*53ee8cc1Swenshuai.xi     writeb(readb((void*)(regUTMI+0x06*2))|0x03, (void*)(regUTMI+0x06*2)); //reset UTMI
746*53ee8cc1Swenshuai.xi     writeb(readb((void*)(regUTMI+0x06*2))&(~0x03), (void*)(regUTMI+0x06*2)); //reset UTMI
747*53ee8cc1Swenshuai.xi 
748*53ee8cc1Swenshuai.xi     writeb(readb((void*)(regUHC+0x10*2)) | 0x1, (void*)(regUHC+0x10*2)); //Set UHC run
749*53ee8cc1Swenshuai.xi 
750*53ee8cc1Swenshuai.xi     mdelay(5);		//wait some slow device to be ready
751*53ee8cc1Swenshuai.xi 
752*53ee8cc1Swenshuai.xi     return (0);
753*53ee8cc1Swenshuai.xi }
754*53ee8cc1Swenshuai.xi 
755*53ee8cc1Swenshuai.xi #if USB_HID_SUPPORT
756*53ee8cc1Swenshuai.xi extern int usb_hid_get_int_ex (U8 uPort, U8 *Buf, U8 size);
757*53ee8cc1Swenshuai.xi extern int usb_hid_get_int_ex_MultipleIntf (U8 uPort, U8 uIntfNum, U8 *Buf, U8 size);
758*53ee8cc1Swenshuai.xi #endif
759*53ee8cc1Swenshuai.xi 
760*53ee8cc1Swenshuai.xi //BOOL  gUsbInit;
761*53ee8cc1Swenshuai.xi #if USB_HID_SUPPORT
762*53ee8cc1Swenshuai.xi extern U8 Hid_Report_Desc[0x100];
763*53ee8cc1Swenshuai.xi extern U8 Hid_Data[10];
764*53ee8cc1Swenshuai.xi extern struct hid_data *HID_us[MAX_HID_DEV_COUNT][MAX_HID_INTF_COUNT];
765*53ee8cc1Swenshuai.xi extern MS_U32  Invalid_HidDevs;
766*53ee8cc1Swenshuai.xi BOOL  gScanHIDDevices;
767*53ee8cc1Swenshuai.xi #endif
768*53ee8cc1Swenshuai.xi extern BOOL usb_get_connected_dev_state(int *pdevstate, unsigned char *pDevClass, struct usb_hcd *hcd);
UsbTask(MS_U32 argc,VOID * argv)769*53ee8cc1Swenshuai.xi void  UsbTask(MS_U32 argc, VOID *argv)
770*53ee8cc1Swenshuai.xi {
771*53ee8cc1Swenshuai.xi     MS_U16    PortStatus;
772*53ee8cc1Swenshuai.xi     MS_BOOL   isExtHubConnect, isFirstEvent, isConnect;
773*53ee8cc1Swenshuai.xi     int       DevState;
774*53ee8cc1Swenshuai.xi     MS_U8     DevClass, ii, kk;
775*53ee8cc1Swenshuai.xi     MS_U8     LunSts[MAX_USB_STOR_LUNS];
776*53ee8cc1Swenshuai.xi     MS_U8     LunPreSts[MAX_USB_STOR_LUNS];
777*53ee8cc1Swenshuai.xi     MS_BOOL   isMSCPlugIn;
778*53ee8cc1Swenshuai.xi     MS_U8     us_id;
779*53ee8cc1Swenshuai.xi     //struct LUN_Device* LunDevice;
780*53ee8cc1Swenshuai.xi     struct ehci_hcd *ehci = hcd_to_ehci(g_pUsbHcd);
781*53ee8cc1Swenshuai.xi 
782*53ee8cc1Swenshuai.xi     #if (USB_HID_SUPPORT)
783*53ee8cc1Swenshuai.xi     MS_U8    jj;
784*53ee8cc1Swenshuai.xi     #endif
785*53ee8cc1Swenshuai.xi 
786*53ee8cc1Swenshuai.xi     #if USB_HID_SUPPORT
787*53ee8cc1Swenshuai.xi     MS_BOOL   isHIDPlugIn, isHIDPlugIntoSamePort;
788*53ee8cc1Swenshuai.xi     MS_U8     isHIDPlugIn_IntfCnt;
789*53ee8cc1Swenshuai.xi     #endif
790*53ee8cc1Swenshuai.xi     #if USB_CDC_SUPPORT
791*53ee8cc1Swenshuai.xi 	MS_BOOL   isCDCPlugIn;
792*53ee8cc1Swenshuai.xi     #endif
793*53ee8cc1Swenshuai.xi 
794*53ee8cc1Swenshuai.xi     diag_printf("UsbTask..\n");
795*53ee8cc1Swenshuai.xi     while (1)
796*53ee8cc1Swenshuai.xi     {
797*53ee8cc1Swenshuai.xi         //UsbReady=FALSE;   //move to MDrv_UsbDeviceConnect
798*53ee8cc1Swenshuai.xi         isExtHubConnect = FALSE;
799*53ee8cc1Swenshuai.xi         isMSCPlugIn = FALSE;
800*53ee8cc1Swenshuai.xi #if USB_HID_SUPPORT
801*53ee8cc1Swenshuai.xi         isHIDPlugIn = FALSE;
802*53ee8cc1Swenshuai.xi         isHIDPlugIn_IntfCnt = 0;
803*53ee8cc1Swenshuai.xi #endif
804*53ee8cc1Swenshuai.xi #if USB_CDC_SUPPORT
805*53ee8cc1Swenshuai.xi 		isCDCPlugIn = FALSE;
806*53ee8cc1Swenshuai.xi #endif
807*53ee8cc1Swenshuai.xi         // Waiting for USB port connection
808*53ee8cc1Swenshuai.xi         while(1)
809*53ee8cc1Swenshuai.xi         {
810*53ee8cc1Swenshuai.xi             USBCriticalSectionIn(0);
811*53ee8cc1Swenshuai.xi             isConnect = MDrv_UsbDeviceConnect(g_pUsbHcd);
812*53ee8cc1Swenshuai.xi             USBCriticalSectionOut(0);
813*53ee8cc1Swenshuai.xi 
814*53ee8cc1Swenshuai.xi             #if USBC_IP_SUPPORT // USBC IP control
815*53ee8cc1Swenshuai.xi             if ((pCurrentChip->usbc_ip[0].portNum == 0) && (pCurrentChip->usbc_ip[0].eventFlag))
816*53ee8cc1Swenshuai.xi                         if (_DrvUSBC_CBFun)
817*53ee8cc1Swenshuai.xi                         {
818*53ee8cc1Swenshuai.xi                             if (pCurrentChip->usbc_ip[0].eventType)
819*53ee8cc1Swenshuai.xi                                 _DrvUSBC_CBFun(USBC_NON_OVER_CURRENT, 0, NULL);
820*53ee8cc1Swenshuai.xi                             else
821*53ee8cc1Swenshuai.xi                                 _DrvUSBC_CBFun(USBC_OVER_CURRENT, 0, NULL);
822*53ee8cc1Swenshuai.xi                             pCurrentChip->usbc_ip[0].eventFlag = 0;
823*53ee8cc1Swenshuai.xi                         }
824*53ee8cc1Swenshuai.xi             #endif
825*53ee8cc1Swenshuai.xi             if(isConnect)
826*53ee8cc1Swenshuai.xi                 break;
827*53ee8cc1Swenshuai.xi 
828*53ee8cc1Swenshuai.xi             MsOS_DelayTask(100);
829*53ee8cc1Swenshuai.xi         }
830*53ee8cc1Swenshuai.xi 
831*53ee8cc1Swenshuai.xi         // removing any delay before USB bus reset
832*53ee8cc1Swenshuai.xi         //MsOS_DelayTask(1000);
833*53ee8cc1Swenshuai.xi         //diag_printf("USB is connect\n");
834*53ee8cc1Swenshuai.xi 
835*53ee8cc1Swenshuai.xi         while (1)
836*53ee8cc1Swenshuai.xi         {
837*53ee8cc1Swenshuai.xi             if (g_pUsbHcd->isBadDevice)
838*53ee8cc1Swenshuai.xi             {
839*53ee8cc1Swenshuai.xi                 diag_printf("A bad device found, cnt = %d\n", g_pUsbHcd->badDeviceCnt);
840*53ee8cc1Swenshuai.xi                 break;
841*53ee8cc1Swenshuai.xi             }
842*53ee8cc1Swenshuai.xi 
843*53ee8cc1Swenshuai.xi             kk = 0;
844*53ee8cc1Swenshuai.xi             while(kk<HUB_DEBOUNCE_STABLE) // 100, debouncing?
845*53ee8cc1Swenshuai.xi             {
846*53ee8cc1Swenshuai.xi                 USBCriticalSectionIn(0);
847*53ee8cc1Swenshuai.xi                 isConnect = MDrv_UsbDeviceConnect(g_pUsbHcd);
848*53ee8cc1Swenshuai.xi                 USBCriticalSectionOut(0);
849*53ee8cc1Swenshuai.xi                 if ( !isConnect )
850*53ee8cc1Swenshuai.xi                 {
851*53ee8cc1Swenshuai.xi                     MsOS_DelayTask(600);  //By Jonas! for hub event
852*53ee8cc1Swenshuai.xi                     diag_printf("USB port disconnect\n");
853*53ee8cc1Swenshuai.xi                     //if (isExtHubConnect)
854*53ee8cc1Swenshuai.xi                         hub_poll(); //for disconnect hub event
855*53ee8cc1Swenshuai.xi                     goto PORT_DISCONNECT;
856*53ee8cc1Swenshuai.xi                 }
857*53ee8cc1Swenshuai.xi                 kk++;
858*53ee8cc1Swenshuai.xi                 MsOS_DelayTask(HUB_DEBOUNCE_STEP); // mimic Linux behavior
859*53ee8cc1Swenshuai.xi             }
860*53ee8cc1Swenshuai.xi #if 0
861*53ee8cc1Swenshuai.xi             if (!MDrv_UsbDeviceConnect())
862*53ee8cc1Swenshuai.xi             {
863*53ee8cc1Swenshuai.xi                 hub_poll(); //for disconnect hub event
864*53ee8cc1Swenshuai.xi                 break;
865*53ee8cc1Swenshuai.xi             }
866*53ee8cc1Swenshuai.xi #endif
867*53ee8cc1Swenshuai.xi             // Device is connecting to the port
868*53ee8cc1Swenshuai.xi             isFirstEvent = FALSE;
869*53ee8cc1Swenshuai.xi             if (has_hub_events(&PortStatus))
870*53ee8cc1Swenshuai.xi             {
871*53ee8cc1Swenshuai.xi                 //diag_printf("hub event\n");
872*53ee8cc1Swenshuai.xi                 isFirstEvent = TRUE;
873*53ee8cc1Swenshuai.xi                 hub_poll();
874*53ee8cc1Swenshuai.xi 
875*53ee8cc1Swenshuai.xi #if 0
876*53ee8cc1Swenshuai.xi                 if ( PortStatus & USB_PORT_STAT_CONNECTION )
877*53ee8cc1Swenshuai.xi                 {
878*53ee8cc1Swenshuai.xi                     usb_get_connected_dev_state(&DevState, &DevClass);
879*53ee8cc1Swenshuai.xi 
880*53ee8cc1Swenshuai.xi                     if (DevClass == 9)
881*53ee8cc1Swenshuai.xi                     {
882*53ee8cc1Swenshuai.xi                         diag_printf("External Hub is connected\n");
883*53ee8cc1Swenshuai.xi                         isExtHubConnect = TRUE;
884*53ee8cc1Swenshuai.xi                     }
885*53ee8cc1Swenshuai.xi                 }
886*53ee8cc1Swenshuai.xi #endif
887*53ee8cc1Swenshuai.xi             }
888*53ee8cc1Swenshuai.xi 
889*53ee8cc1Swenshuai.xi             if (isExtHubConnect)
890*53ee8cc1Swenshuai.xi                 hub_poll();
891*53ee8cc1Swenshuai.xi 
892*53ee8cc1Swenshuai.xi             isMSCPlugIn = FALSE;
893*53ee8cc1Swenshuai.xi             for (us_id=0; us_id<MAX_USTOR; us_id++)
894*53ee8cc1Swenshuai.xi             {
895*53ee8cc1Swenshuai.xi                 if (Is_Stor_Dev_Info_Valid(us_id))   // Check if we found a Mass Stoarge device.
896*53ee8cc1Swenshuai.xi                 {
897*53ee8cc1Swenshuai.xi                     isMSCPlugIn = TRUE;
898*53ee8cc1Swenshuai.xi                     if (!Is_Stor_Dev_Init(us_id))    // First time after connected
899*53ee8cc1Swenshuai.xi                     {
900*53ee8cc1Swenshuai.xi                         diag_printf("found a Mass Storage device [%x], try to init it\n", us_id);
901*53ee8cc1Swenshuai.xi 
902*53ee8cc1Swenshuai.xi                         if (bInit_USB_Disk(us_id))
903*53ee8cc1Swenshuai.xi                         {
904*53ee8cc1Swenshuai.xi                             for (ii=0; ii<=Get_Stor_Max_Lun(us_id); ii++)
905*53ee8cc1Swenshuai.xi                             {
906*53ee8cc1Swenshuai.xi                                 LunSts[ii] = LunPreSts[ii] = bIsDevValid(us_id, ii);
907*53ee8cc1Swenshuai.xi                                 if (LunSts[ii])
908*53ee8cc1Swenshuai.xi                                 {
909*53ee8cc1Swenshuai.xi                                     diag_printf("LUN %d is init ok\n", ii);
910*53ee8cc1Swenshuai.xi                                 }
911*53ee8cc1Swenshuai.xi                             }
912*53ee8cc1Swenshuai.xi                             Set_Stor_Dev_Init(us_id, TRUE);
913*53ee8cc1Swenshuai.xi                             diag_printf("MSC plug in\n");
914*53ee8cc1Swenshuai.xi                         }
915*53ee8cc1Swenshuai.xi                     }
916*53ee8cc1Swenshuai.xi                     else
917*53ee8cc1Swenshuai.xi                     {
918*53ee8cc1Swenshuai.xi                         vChk_USB_LUNs(us_id);
919*53ee8cc1Swenshuai.xi 
920*53ee8cc1Swenshuai.xi                         for (ii=0; ii<=Get_Stor_Max_Lun(us_id); ii++)
921*53ee8cc1Swenshuai.xi                         {
922*53ee8cc1Swenshuai.xi                             LunSts[ii] = bIsDevValid(us_id, ii);
923*53ee8cc1Swenshuai.xi                             if ( LunSts[ii] && (LunSts[ii] != LunPreSts[ii]) )
924*53ee8cc1Swenshuai.xi                             {
925*53ee8cc1Swenshuai.xi                                 diag_printf("Chk LUN %d is init ok\n", ii);
926*53ee8cc1Swenshuai.xi                             }
927*53ee8cc1Swenshuai.xi                             LunPreSts[ii] = LunSts[ii];
928*53ee8cc1Swenshuai.xi                         }
929*53ee8cc1Swenshuai.xi                     }
930*53ee8cc1Swenshuai.xi                 }
931*53ee8cc1Swenshuai.xi                 else
932*53ee8cc1Swenshuai.xi                 {
933*53ee8cc1Swenshuai.xi                     #if 0
934*53ee8cc1Swenshuai.xi                     if (isMSCPlugIn)
935*53ee8cc1Swenshuai.xi                     {
936*53ee8cc1Swenshuai.xi                         diag_printf("MSC plug out\n");
937*53ee8cc1Swenshuai.xi                         isMSCPlugIn = FALSE;
938*53ee8cc1Swenshuai.xi                         if ( _DrvUSB_CBFun != NULL )
939*53ee8cc1Swenshuai.xi                             _DrvUSB_CBFun(USB_PLUG_OUT, USB_EVENT_DEV_TYPE_STOR);
940*53ee8cc1Swenshuai.xi                     }
941*53ee8cc1Swenshuai.xi                     #endif
942*53ee8cc1Swenshuai.xi                 }
943*53ee8cc1Swenshuai.xi 
944*53ee8cc1Swenshuai.xi             }
945*53ee8cc1Swenshuai.xi 
946*53ee8cc1Swenshuai.xi 
947*53ee8cc1Swenshuai.xi 
948*53ee8cc1Swenshuai.xi         #if USB_HID_SUPPORT
949*53ee8cc1Swenshuai.xi             if (Is_Any_Hid_Dev_Info_Valid_EX())
950*53ee8cc1Swenshuai.xi             {
951*53ee8cc1Swenshuai.xi                 gScanHIDDevices =FALSE;
952*53ee8cc1Swenshuai.xi                 for (ii=0; ii<MAX_HID_DEV_COUNT; ii++)	//find the port index
953*53ee8cc1Swenshuai.xi                 {
954*53ee8cc1Swenshuai.xi                     isHIDPlugIntoSamePort = FALSE;		//a bool value to indicate that the interface enumeration below is for the same port
955*53ee8cc1Swenshuai.xi 		            isHIDPlugIn_IntfCnt = 0;
956*53ee8cc1Swenshuai.xi                     for (jj=0; jj<MAX_HID_INTF_COUNT; jj++)	//find the interface index
957*53ee8cc1Swenshuai.xi                     {
958*53ee8cc1Swenshuai.xi                         if(isHIDPlugIntoSamePort==FALSE)
959*53ee8cc1Swenshuai.xi 			    isHIDPlugIntoSamePort = TRUE;	//for multiple interfaces, using same port
960*53ee8cc1Swenshuai.xi 
961*53ee8cc1Swenshuai.xi                         if ( Is_Hid_Dev_Info_Valid_EX(ii,jj) &&
962*53ee8cc1Swenshuai.xi 				  (HID_us[ii][jj]->pusb_dev->bus->hcpriv == cpe_ehci_dev.dev.driver_data) )
963*53ee8cc1Swenshuai.xi                         {
964*53ee8cc1Swenshuai.xi                             if (!Is_Hid_Dev_Init_EX(ii,jj))
965*53ee8cc1Swenshuai.xi                             {
966*53ee8cc1Swenshuai.xi 	                        if ((Invalid_HidDevs & ((1 << jj)<<(ii*MAX_HID_INTF_COUNT))) != 0)
967*53ee8cc1Swenshuai.xi                                 {
968*53ee8cc1Swenshuai.xi 			            continue;;
969*53ee8cc1Swenshuai.xi 				}
970*53ee8cc1Swenshuai.xi 
971*53ee8cc1Swenshuai.xi                                if (usb_get_report_descriptor_EX(ii, jj, Hid_Report_Desc, 0x65) == ENOERR)
972*53ee8cc1Swenshuai.xi                                 {
973*53ee8cc1Swenshuai.xi                    	    /* index 3 of id_Report_Desc is for Local Usage type: 1(Unknown), 2(Mouse),4(Joystick),6(Keyboard)
974*53ee8cc1Swenshuai.xi                    	    *  e.g. of Joystick: 5 1 9 "4" a1 1 85 ...
975*53ee8cc1Swenshuai.xi                    	    */
976*53ee8cc1Swenshuai.xi                    	    if(Hid_Report_Desc[3]==Usage_Unkown)
977*53ee8cc1Swenshuai.xi                                     {
978*53ee8cc1Swenshuai.xi        			        Invalid_HidDevs |= ((1 << jj)<<(ii * MAX_HID_INTF_COUNT));
979*53ee8cc1Swenshuai.xi                        		diag_printf("Invalid_HidDevs=%lx\n",Invalid_HidDevs);
980*53ee8cc1Swenshuai.xi                        		continue;
981*53ee8cc1Swenshuai.xi                                    }
982*53ee8cc1Swenshuai.xi 
983*53ee8cc1Swenshuai.xi                                     //hid_parse_report(Hid_Report_Desc, 0x65);
984*53ee8cc1Swenshuai.xi                                    usb_hid_parse_report(Hid_Report_Desc, 0x65, &HID_us[ii][jj]->buttons, HID_us[ii][jj]->axis, &HID_us[ii][jj]->keys);
985*53ee8cc1Swenshuai.xi                                     diag_printf("HID finished\n");
986*53ee8cc1Swenshuai.xi                                    Set_Hid_Dev_Init_EX(ii, jj, TRUE);
987*53ee8cc1Swenshuai.xi 
988*53ee8cc1Swenshuai.xi        			    #if 1  //RCC
989*53ee8cc1Swenshuai.xi        			        if ((isHIDPlugIn_IntfCnt < MAX_HID_INTF_COUNT)&& (isHIDPlugIntoSamePort == TRUE))
990*53ee8cc1Swenshuai.xi                                        {
991*53ee8cc1Swenshuai.xi                                            isHIDPlugIn = TRUE;
992*53ee8cc1Swenshuai.xi                                            isHIDPlugIn_IntfCnt++;
993*53ee8cc1Swenshuai.xi                                            diag_printf("HID plug into Port(%d) Intf(%d)\n", ii, jj);
994*53ee8cc1Swenshuai.xi                                            if ( _DrvUSB_CBFun != NULL )
995*53ee8cc1Swenshuai.xi                                                _DrvUSB_CBFun(USB_PLUG_IN, USB_EVENT_DEV_TYPE_HID, NULL);
996*53ee8cc1Swenshuai.xi                                        }
997*53ee8cc1Swenshuai.xi                    	#else
998*53ee8cc1Swenshuai.xi                                         if (!isHIDPlugIn)
999*53ee8cc1Swenshuai.xi                                         {
1000*53ee8cc1Swenshuai.xi                                             isHIDPlugIn = TRUE;
1001*53ee8cc1Swenshuai.xi                                             diag_printf("HID plug in\n");
1002*53ee8cc1Swenshuai.xi                                             if ( _DrvUSB_CBFun != NULL )
1003*53ee8cc1Swenshuai.xi                                                 _DrvUSB_CBFun(USB_PLUG_IN, USB_EVENT_DEV_TYPE_HID, NULL);
1004*53ee8cc1Swenshuai.xi                                         }
1005*53ee8cc1Swenshuai.xi        			    #endif
1006*53ee8cc1Swenshuai.xi                                 //usb_hid_get_int_ex(0, HID_us[0]->IntPipeBuf, 8);
1007*53ee8cc1Swenshuai.xi                                 //MsOS_StartTimer(g_Hid_Timer_ID);
1008*53ee8cc1Swenshuai.xi                                 }
1009*53ee8cc1Swenshuai.xi                             }
1010*53ee8cc1Swenshuai.xi                         }
1011*53ee8cc1Swenshuai.xi                     }
1012*53ee8cc1Swenshuai.xi                 }
1013*53ee8cc1Swenshuai.xi             }
1014*53ee8cc1Swenshuai.xi             else
1015*53ee8cc1Swenshuai.xi             {
1016*53ee8cc1Swenshuai.xi                 if (isHIDPlugIn)
1017*53ee8cc1Swenshuai.xi                 {
1018*53ee8cc1Swenshuai.xi                     diag_printf("HID plug out\n");
1019*53ee8cc1Swenshuai.xi                     isHIDPlugIn = FALSE;
1020*53ee8cc1Swenshuai.xi                     if ( _DrvUSB_CBFun != NULL )
1021*53ee8cc1Swenshuai.xi                         _DrvUSB_CBFun(USB_PLUG_OUT, USB_EVENT_DEV_TYPE_HID, NULL);
1022*53ee8cc1Swenshuai.xi                 }
1023*53ee8cc1Swenshuai.xi             }
1024*53ee8cc1Swenshuai.xi         #endif
1025*53ee8cc1Swenshuai.xi 
1026*53ee8cc1Swenshuai.xi         #if USB_CDC_SUPPORT/* Start of CDC check*/
1027*53ee8cc1Swenshuai.xi     		if (Is_Any_Cdc_Dev_Info_Valid())
1028*53ee8cc1Swenshuai.xi     		{
1029*53ee8cc1Swenshuai.xi     			for (ii=0; ii<MAX_CDC_DEV_COUNT; ii++)	//find the port index
1030*53ee8cc1Swenshuai.xi     			{
1031*53ee8cc1Swenshuai.xi     				if (Is_Cdc_Dev_Info_Valid(ii) &&
1032*53ee8cc1Swenshuai.xi     					(CDC_us[ii]->pusb_dev->bus->hcpriv == cpe_ehci_dev.dev.driver_data) )
1033*53ee8cc1Swenshuai.xi     				{
1034*53ee8cc1Swenshuai.xi     					if (!Is_Cdc_Dev_Init(ii))
1035*53ee8cc1Swenshuai.xi     					{
1036*53ee8cc1Swenshuai.xi     						if( Usb_Cdc_Dev_Init())
1037*53ee8cc1Swenshuai.xi     						{
1038*53ee8cc1Swenshuai.xi     							diag_printf("CDC plug into Port(%d)\n", ii);
1039*53ee8cc1Swenshuai.xi     							isCDCPlugIn = TRUE;
1040*53ee8cc1Swenshuai.xi     							Set_Cdc_Dev_Init(ii, TRUE);
1041*53ee8cc1Swenshuai.xi 
1042*53ee8cc1Swenshuai.xi     						}
1043*53ee8cc1Swenshuai.xi     						else
1044*53ee8cc1Swenshuai.xi     							diag_printf("CDC plug into Port(%d),init faile\n", ii);
1045*53ee8cc1Swenshuai.xi 
1046*53ee8cc1Swenshuai.xi     						if ( _DrvUSB_CBFun != NULL )
1047*53ee8cc1Swenshuai.xi     							_DrvUSB_CBFun(USB_PLUG_IN, USB_EVENT_DEV_TYPE_CDC, NULL);
1048*53ee8cc1Swenshuai.xi     					}
1049*53ee8cc1Swenshuai.xi                         else
1050*53ee8cc1Swenshuai.xi                             Usb_Cdc_Handle();
1051*53ee8cc1Swenshuai.xi 
1052*53ee8cc1Swenshuai.xi     					if (isFirstEvent && (CDC_us[ii]->pusb_dev->parent->parent != NULL))
1053*53ee8cc1Swenshuai.xi     					{
1054*53ee8cc1Swenshuai.xi     						diag_printf("External Hub is connected\n");
1055*53ee8cc1Swenshuai.xi     						isExtHubConnect = TRUE;
1056*53ee8cc1Swenshuai.xi     					}
1057*53ee8cc1Swenshuai.xi 
1058*53ee8cc1Swenshuai.xi     				}
1059*53ee8cc1Swenshuai.xi     			}
1060*53ee8cc1Swenshuai.xi     		}
1061*53ee8cc1Swenshuai.xi     		else
1062*53ee8cc1Swenshuai.xi     		{
1063*53ee8cc1Swenshuai.xi     			if (isCDCPlugIn)
1064*53ee8cc1Swenshuai.xi     			{
1065*53ee8cc1Swenshuai.xi     				diag_printf("CDC plug out\n");
1066*53ee8cc1Swenshuai.xi     				isCDCPlugIn = FALSE;
1067*53ee8cc1Swenshuai.xi     				if ( _DrvUSB_CBFun != NULL )
1068*53ee8cc1Swenshuai.xi     					_DrvUSB_CBFun(USB_PLUG_OUT, USB_EVENT_DEV_TYPE_CDC, NULL);
1069*53ee8cc1Swenshuai.xi     			}
1070*53ee8cc1Swenshuai.xi     		}
1071*53ee8cc1Swenshuai.xi         #endif/* END of CDC check*/
1072*53ee8cc1Swenshuai.xi 
1073*53ee8cc1Swenshuai.xi 
1074*53ee8cc1Swenshuai.xi             if ( (isMSCPlugIn == FALSE)
1075*53ee8cc1Swenshuai.xi                 #if USB_HID_SUPPORT
1076*53ee8cc1Swenshuai.xi                     && !Is_Any_Hid_Dev_Info_Valid_EX()
1077*53ee8cc1Swenshuai.xi                 #endif
1078*53ee8cc1Swenshuai.xi                 #if USB_CDC_SUPPORT
1079*53ee8cc1Swenshuai.xi 				    && !Is_Any_Cdc_Dev_Info_Valid()
1080*53ee8cc1Swenshuai.xi                 #endif
1081*53ee8cc1Swenshuai.xi 				&& isFirstEvent )
1082*53ee8cc1Swenshuai.xi             {
1083*53ee8cc1Swenshuai.xi                 if ( PortStatus & USB_PORT_STAT_CONNECTION )
1084*53ee8cc1Swenshuai.xi                 {
1085*53ee8cc1Swenshuai.xi                     //if ( usb_get_connected_dev_state(&DevState, &DevClass) && (DevState < USB_STATE_CONFIGURED) )
1086*53ee8cc1Swenshuai.xi                     if (usb_get_connected_dev_state(&DevState, &DevClass, g_pUsbHcd))
1087*53ee8cc1Swenshuai.xi                     {
1088*53ee8cc1Swenshuai.xi                         if (DevState < USB_STATE_CONFIGURED)
1089*53ee8cc1Swenshuai.xi                         {
1090*53ee8cc1Swenshuai.xi                             diag_printf("Usb device no responding\n");
1091*53ee8cc1Swenshuai.xi                         }
1092*53ee8cc1Swenshuai.xi                         else
1093*53ee8cc1Swenshuai.xi                         {
1094*53ee8cc1Swenshuai.xi                             if (DevClass == 0x09)
1095*53ee8cc1Swenshuai.xi                             {
1096*53ee8cc1Swenshuai.xi                                 diag_printf("External Hub is connected\n");
1097*53ee8cc1Swenshuai.xi                                 isExtHubConnect = TRUE;
1098*53ee8cc1Swenshuai.xi                             }
1099*53ee8cc1Swenshuai.xi                             else
1100*53ee8cc1Swenshuai.xi                             {
1101*53ee8cc1Swenshuai.xi                                 diag_printf("Usb device not supported\n");
1102*53ee8cc1Swenshuai.xi                                 if ( _DrvUSB_CBFun != NULL )
1103*53ee8cc1Swenshuai.xi                                     _DrvUSB_CBFun(USB_PLUG_IN, USB_EVENT_DEV_TYPE_UNKNOW, NULL);
1104*53ee8cc1Swenshuai.xi                             }
1105*53ee8cc1Swenshuai.xi                         }
1106*53ee8cc1Swenshuai.xi                     }
1107*53ee8cc1Swenshuai.xi                 }
1108*53ee8cc1Swenshuai.xi 
1109*53ee8cc1Swenshuai.xi             }
1110*53ee8cc1Swenshuai.xi 
1111*53ee8cc1Swenshuai.xi             #if USBC_IP_SUPPORT // USBC IP control
1112*53ee8cc1Swenshuai.xi             if ((pCurrentChip->usbc_ip[0].portNum == 0) && (pCurrentChip->usbc_ip[0].eventFlag))
1113*53ee8cc1Swenshuai.xi                     if ( PortStatus & USB_PORT_STAT_CONNECTION)
1114*53ee8cc1Swenshuai.xi                         if (_DrvUSBC_CBFun)
1115*53ee8cc1Swenshuai.xi                         {
1116*53ee8cc1Swenshuai.xi                             if (pCurrentChip->usbc_ip[0].eventType)
1117*53ee8cc1Swenshuai.xi                                 _DrvUSBC_CBFun(USBC_NON_OVER_CURRENT, 0, NULL);
1118*53ee8cc1Swenshuai.xi                             else
1119*53ee8cc1Swenshuai.xi                                 _DrvUSBC_CBFun(USBC_OVER_CURRENT, 0, NULL);
1120*53ee8cc1Swenshuai.xi                             pCurrentChip->usbc_ip[0].eventFlag = 0;
1121*53ee8cc1Swenshuai.xi                         }
1122*53ee8cc1Swenshuai.xi             #endif
1123*53ee8cc1Swenshuai.xi             #if USB_HID_SUPPORT
1124*53ee8cc1Swenshuai.xi 	        gScanHIDDevices =TRUE;
1125*53ee8cc1Swenshuai.xi             #endif
1126*53ee8cc1Swenshuai.xi             //MsOS_DelayTask(1000);
1127*53ee8cc1Swenshuai.xi         }
1128*53ee8cc1Swenshuai.xi 
1129*53ee8cc1Swenshuai.xi PORT_DISCONNECT:
1130*53ee8cc1Swenshuai.xi         diag_printf("No device is connecting\n");
1131*53ee8cc1Swenshuai.xi         //MsOS_StopTimer(g_Hid_Timer_ID);
1132*53ee8cc1Swenshuai.xi 
1133*53ee8cc1Swenshuai.xi         if (has_hub_events(&PortStatus))
1134*53ee8cc1Swenshuai.xi         {
1135*53ee8cc1Swenshuai.xi             diag_printf("Has hub event .. @ port disconnect\n");
1136*53ee8cc1Swenshuai.xi             hub_poll();
1137*53ee8cc1Swenshuai.xi         }
1138*53ee8cc1Swenshuai.xi 
1139*53ee8cc1Swenshuai.xi #if USB_HID_SUPPORT
1140*53ee8cc1Swenshuai.xi         for (ii=0; ii<MAX_HID_DEV_COUNT; ii++)
1141*53ee8cc1Swenshuai.xi         {
1142*53ee8cc1Swenshuai.xi             for (jj=0; jj<MAX_HID_INTF_COUNT; jj++)		//find the interface index
1143*53ee8cc1Swenshuai.xi             {
1144*53ee8cc1Swenshuai.xi                 if (Is_Hid_Dev_Info_Valid_EX(ii,jj))
1145*53ee8cc1Swenshuai.xi                 {
1146*53ee8cc1Swenshuai.xi                     if (HID_us[ii][jj]->pusb_dev->bus->hcpriv == cpe_ehci_dev.dev.driver_data)
1147*53ee8cc1Swenshuai.xi                     {
1148*53ee8cc1Swenshuai.xi                         diag_printf("Set HID Port(%d) Intf(%d) not init\n", ii, jj);
1149*53ee8cc1Swenshuai.xi                         Set_Hid_Dev_Init_EX(ii, jj, FALSE);
1150*53ee8cc1Swenshuai.xi                     }
1151*53ee8cc1Swenshuai.xi                 }
1152*53ee8cc1Swenshuai.xi             }
1153*53ee8cc1Swenshuai.xi         }
1154*53ee8cc1Swenshuai.xi #endif
1155*53ee8cc1Swenshuai.xi 
1156*53ee8cc1Swenshuai.xi #if USB_CDC_SUPPORT
1157*53ee8cc1Swenshuai.xi         /* set each bDevInit of CDC_us back to FALSE */
1158*53ee8cc1Swenshuai.xi         for (ii=0; ii<MAX_CDC_DEV_COUNT; ii++)
1159*53ee8cc1Swenshuai.xi         {
1160*53ee8cc1Swenshuai.xi             if (Is_Cdc_Dev_Info_Valid(ii))
1161*53ee8cc1Swenshuai.xi             {
1162*53ee8cc1Swenshuai.xi                 if (CDC_us[ii]->pusb_dev->bus->hcpriv == cpe_ehci_dev.dev.driver_data)
1163*53ee8cc1Swenshuai.xi                 {
1164*53ee8cc1Swenshuai.xi                     diag_printf("Set CDC Port(%d) not init\n", ii);
1165*53ee8cc1Swenshuai.xi                     Set_Cdc_Dev_Init(ii, FALSE);
1166*53ee8cc1Swenshuai.xi                 }
1167*53ee8cc1Swenshuai.xi             }
1168*53ee8cc1Swenshuai.xi         }
1169*53ee8cc1Swenshuai.xi #endif
1170*53ee8cc1Swenshuai.xi 
1171*53ee8cc1Swenshuai.xi         #if 0
1172*53ee8cc1Swenshuai.xi         if (isMSCPlugIn)
1173*53ee8cc1Swenshuai.xi         {
1174*53ee8cc1Swenshuai.xi             diag_printf("MSC plug out\n");
1175*53ee8cc1Swenshuai.xi             if ( _DrvUSB_CBFun != NULL )
1176*53ee8cc1Swenshuai.xi                 _DrvUSB_CBFun(USB_PLUG_OUT, USB_EVENT_DEV_TYPE_STOR);
1177*53ee8cc1Swenshuai.xi         }
1178*53ee8cc1Swenshuai.xi         #endif
1179*53ee8cc1Swenshuai.xi 
1180*53ee8cc1Swenshuai.xi         #if 0
1181*53ee8cc1Swenshuai.xi         for (us_id=0; us_id<MAX_USTOR; us_id++)
1182*53ee8cc1Swenshuai.xi         {
1183*53ee8cc1Swenshuai.xi             if (Is_Stor_Dev_Info_Valid(us_id))
1184*53ee8cc1Swenshuai.xi             {
1185*53ee8cc1Swenshuai.xi                 diag_printf("!!! Remove device:%d begin..", us_id);
1186*53ee8cc1Swenshuai.xi                 vRemove_DISK_LUNs(us_id);
1187*53ee8cc1Swenshuai.xi                 //Free memory
1188*53ee8cc1Swenshuai.xi 	            dissociate_dev(Mass_stor_us[us_id]);
1189*53ee8cc1Swenshuai.xi 	            usb_stor_release_resources(Mass_stor_us[us_id]);
1190*53ee8cc1Swenshuai.xi                 Clr_Stor_Dev_Info(us_id);
1191*53ee8cc1Swenshuai.xi                 diag_printf("OK\n");
1192*53ee8cc1Swenshuai.xi             }
1193*53ee8cc1Swenshuai.xi         }
1194*53ee8cc1Swenshuai.xi         #endif
1195*53ee8cc1Swenshuai.xi 
1196*53ee8cc1Swenshuai.xi         #if USB_HID_SUPPORT
1197*53ee8cc1Swenshuai.xi         if (isHIDPlugIn)
1198*53ee8cc1Swenshuai.xi         {
1199*53ee8cc1Swenshuai.xi             diag_printf("HID plug out\n");
1200*53ee8cc1Swenshuai.xi             if ( _DrvUSB_CBFun != NULL )
1201*53ee8cc1Swenshuai.xi                 _DrvUSB_CBFun(USB_PLUG_OUT, USB_EVENT_DEV_TYPE_HID, NULL);
1202*53ee8cc1Swenshuai.xi         }
1203*53ee8cc1Swenshuai.xi         #endif
1204*53ee8cc1Swenshuai.xi 
1205*53ee8cc1Swenshuai.xi         #if USB_CDC_SUPPORT
1206*53ee8cc1Swenshuai.xi         if (isCDCPlugIn)
1207*53ee8cc1Swenshuai.xi         {
1208*53ee8cc1Swenshuai.xi             diag_printf("CDC plug out\n");
1209*53ee8cc1Swenshuai.xi             if ( _DrvUSB_CBFun != NULL )
1210*53ee8cc1Swenshuai.xi                 _DrvUSB_CBFun(USB_PLUG_OUT, USB_EVENT_DEV_TYPE_CDC, NULL);
1211*53ee8cc1Swenshuai.xi         }
1212*53ee8cc1Swenshuai.xi         #endif
1213*53ee8cc1Swenshuai.xi         //if get any Hub device, enter Hub handler
1214*53ee8cc1Swenshuai.xi 
1215*53ee8cc1Swenshuai.xi         //if get any MSC device, enter MSC handler
1216*53ee8cc1Swenshuai.xi 
1217*53ee8cc1Swenshuai.xi         //device is disconnected
1218*53ee8cc1Swenshuai.xi 
1219*53ee8cc1Swenshuai.xi         USBCriticalSectionIn(0);
1220*53ee8cc1Swenshuai.xi         ResetMstarUsb(ehci);
1221*53ee8cc1Swenshuai.xi         USBCriticalSectionOut(0);
1222*53ee8cc1Swenshuai.xi 
1223*53ee8cc1Swenshuai.xi     }
1224*53ee8cc1Swenshuai.xi }
1225*53ee8cc1Swenshuai.xi //struct usb_hcd *g_phcd;
1226*53ee8cc1Swenshuai.xi 
InitUSBIntr(struct usb_hcd * hcd)1227*53ee8cc1Swenshuai.xi void InitUSBIntr(struct usb_hcd * hcd)
1228*53ee8cc1Swenshuai.xi {
1229*53ee8cc1Swenshuai.xi     struct ehci_hcd  *ehci = hcd_to_ehci (hcd);
1230*53ee8cc1Swenshuai.xi     U32 temp;
1231*53ee8cc1Swenshuai.xi 
1232*53ee8cc1Swenshuai.xi     diag_printf("InitUSBIntr enter\n");
1233*53ee8cc1Swenshuai.xi     #if 0
1234*53ee8cc1Swenshuai.xi     mwHost20_USBINTR_Set(HOST20_USBINTR_IntOnAsyncAdvance |
1235*53ee8cc1Swenshuai.xi                                             HOST20_USBINTR_SystemError |
1236*53ee8cc1Swenshuai.xi                                             HOST20_USBINTR_USBError |
1237*53ee8cc1Swenshuai.xi                                             HOST20_USBINTR_CompletionOfTransaction);
1238*53ee8cc1Swenshuai.xi 
1239*53ee8cc1Swenshuai.xi     mwHost20_USBSTS_Set(mwHost20_USBSTS_Rd());//clear all pending interrupt
1240*53ee8cc1Swenshuai.xi     //  diag_printf("usb int status:%x\n",mwHost20_USBSTS_Rd());
1241*53ee8cc1Swenshuai.xi     mwOTG20_Control_Int_Polarity_Hi();
1242*53ee8cc1Swenshuai.xi     #else
1243*53ee8cc1Swenshuai.xi     temp = (HOST20_USBINTR_IntOnAsyncAdvance |
1244*53ee8cc1Swenshuai.xi                                             HOST20_USBINTR_SystemError |
1245*53ee8cc1Swenshuai.xi #ifdef ROOTHUB_INTERRUPT_MODE
1246*53ee8cc1Swenshuai.xi                                             HOST20_USBINTR_PortChangeDetect |
1247*53ee8cc1Swenshuai.xi #endif
1248*53ee8cc1Swenshuai.xi                                             HOST20_USBINTR_USBError |
1249*53ee8cc1Swenshuai.xi                                             HOST20_USBINTR_CompletionOfTransaction);
1250*53ee8cc1Swenshuai.xi     ehci_writel (temp, (U32)&ehci->regs->intr_enable);
1251*53ee8cc1Swenshuai.xi 
1252*53ee8cc1Swenshuai.xi     temp = ehci_readb((U32)&ehci->regs->status);
1253*53ee8cc1Swenshuai.xi     ehci_writel (temp, (U32)&ehci->regs->status); //clear all pending interrupt
1254*53ee8cc1Swenshuai.xi 
1255*53ee8cc1Swenshuai.xi     temp = ehci_readb((U32)&ehci->regs->bus_control);
1256*53ee8cc1Swenshuai.xi     temp|= INT_POLAR;
1257*53ee8cc1Swenshuai.xi     ehci_writel (temp, (U32)&ehci->regs->bus_control); // set interrupt polarity high
1258*53ee8cc1Swenshuai.xi     #endif
1259*53ee8cc1Swenshuai.xi 
1260*53ee8cc1Swenshuai.xi #ifndef  MS_NOSAPI
1261*53ee8cc1Swenshuai.xi     //diag_printf("attach usb int\n");
1262*53ee8cc1Swenshuai.xi 	MsOS_AttachInterrupt(gIrqUHC, _DrvUSB_OnInterrupt);
1263*53ee8cc1Swenshuai.xi     //diag_printf("enable usb int\n");
1264*53ee8cc1Swenshuai.xi 	MsOS_EnableInterrupt(gIrqUHC);
1265*53ee8cc1Swenshuai.xi     //diag_printf("ok");
1266*53ee8cc1Swenshuai.xi #endif
1267*53ee8cc1Swenshuai.xi }
1268*53ee8cc1Swenshuai.xi 
_DrvUSB_OnInterrupt(InterruptNum eIntNum)1269*53ee8cc1Swenshuai.xi static void _DrvUSB_OnInterrupt(InterruptNum eIntNum)
1270*53ee8cc1Swenshuai.xi {
1271*53ee8cc1Swenshuai.xi     //MS_U8		OldUSBEchiID;
1272*53ee8cc1Swenshuai.xi 
1273*53ee8cc1Swenshuai.xi     //MS_U8 status;
1274*53ee8cc1Swenshuai.xi     //gIntStatus=mwHost20_USBSTS_Rd();
1275*53ee8cc1Swenshuai.xi     //diag_printf("USB INT:%x\n",gIntStatus);
1276*53ee8cc1Swenshuai.xi     //mwHost20_USBSTS_Set(gIntStatus);         //clear usb intr status
1277*53ee8cc1Swenshuai.xi     MsOS_DisableInterrupt(gIrqUHC);
1278*53ee8cc1Swenshuai.xi     //MsOS_SetEvent(_s32UsbEventId,gIntStatus);
1279*53ee8cc1Swenshuai.xi 
1280*53ee8cc1Swenshuai.xi     //OldUSBEchiID = MDrv_USBGetCurntEhciNum();
1281*53ee8cc1Swenshuai.xi     //MDrv_USBSelectEhci(1);
1282*53ee8cc1Swenshuai.xi     g_pUsbHcd->driver->irq(g_pUsbHcd, NULL);
1283*53ee8cc1Swenshuai.xi     //MDrv_USBSelectEhci(OldUSBEchiID);
1284*53ee8cc1Swenshuai.xi 
1285*53ee8cc1Swenshuai.xi     MsOS_EnableInterrupt(gIrqUHC);
1286*53ee8cc1Swenshuai.xi }
1287*53ee8cc1Swenshuai.xi //extern S32 gs32NonCachedPoolID_MIU0;
1288*53ee8cc1Swenshuai.xi #if 0
1289*53ee8cc1Swenshuai.xi void TestUsbDisk(void)
1290*53ee8cc1Swenshuai.xi {
1291*53ee8cc1Swenshuai.xi U8   *buf1,*buf2;
1292*53ee8cc1Swenshuai.xi U32  ii,k;
1293*53ee8cc1Swenshuai.xi 
1294*53ee8cc1Swenshuai.xi         buf1=(U8*)MsOS_AllocateMemory(0x10000, gs32NonCachedPoolID_MIU0 );//make 64K buffer for testing
1295*53ee8cc1Swenshuai.xi         buf2=(U8*)MsOS_AllocateMemory(0x10000, gs32NonCachedPoolID_MIU0 );//make 64K buffer for testing
1296*53ee8cc1Swenshuai.xi 
1297*53ee8cc1Swenshuai.xi 
1298*53ee8cc1Swenshuai.xi 
1299*53ee8cc1Swenshuai.xi         for (ii=0 ; ii< 0x10000 ; ii++)
1300*53ee8cc1Swenshuai.xi             buf1[ii]=(U8)ii & 0xff;             //make test pattern;
1301*53ee8cc1Swenshuai.xi 
1302*53ee8cc1Swenshuai.xi         k=0;
1303*53ee8cc1Swenshuai.xi        while (1)
1304*53ee8cc1Swenshuai.xi         {
1305*53ee8cc1Swenshuai.xi 
1306*53ee8cc1Swenshuai.xi            for (ii=0 ; ii<0x10000; ii++)
1307*53ee8cc1Swenshuai.xi               buf2[ii]=0;
1308*53ee8cc1Swenshuai.xi 
1309*53ee8cc1Swenshuai.xi            bSCSI_Write_10(0, 0x200, 0x80,buf1);
1310*53ee8cc1Swenshuai.xi            bSCSI_Read_10(0,0x200,0x80,buf2);
1311*53ee8cc1Swenshuai.xi 
1312*53ee8cc1Swenshuai.xi            for (ii=0 ; ii< 0x10000 ; ii++)
1313*53ee8cc1Swenshuai.xi               if (buf1[ii]!=buf2[ii])
1314*53ee8cc1Swenshuai.xi                 {
1315*53ee8cc1Swenshuai.xi                     k=99999999;
1316*53ee8cc1Swenshuai.xi                     while(1) {}         //miscompare....
1317*53ee8cc1Swenshuai.xi 
1318*53ee8cc1Swenshuai.xi                 }
1319*53ee8cc1Swenshuai.xi            // buf1[ii]=(U8)ii & 0xff;             //make test pattern;
1320*53ee8cc1Swenshuai.xi            k++;
1321*53ee8cc1Swenshuai.xi         }
1322*53ee8cc1Swenshuai.xi 
1323*53ee8cc1Swenshuai.xi         MsOS_FreeMemory((void *)buf1,  gs32NonCachedPoolID_MIU0);
1324*53ee8cc1Swenshuai.xi         MsOS_FreeMemory((void *)buf2,  gs32NonCachedPoolID_MIU0);
1325*53ee8cc1Swenshuai.xi }
1326*53ee8cc1Swenshuai.xi #endif
1327*53ee8cc1Swenshuai.xi 
USBCriticalSectionIn(MS_U8 Port)1328*53ee8cc1Swenshuai.xi void USBCriticalSectionIn(MS_U8 Port)
1329*53ee8cc1Swenshuai.xi {
1330*53ee8cc1Swenshuai.xi     if (Port == 0)
1331*53ee8cc1Swenshuai.xi         MsOS_ObtainMutex(_s32MutexUSB, MSOS_WAIT_FOREVER);
1332*53ee8cc1Swenshuai.xi     else if (Port == 2)
1333*53ee8cc1Swenshuai.xi         MsOS_ObtainMutex(_s32MutexUSB_Port2, MSOS_WAIT_FOREVER);
1334*53ee8cc1Swenshuai.xi     else if (Port == 1)
1335*53ee8cc1Swenshuai.xi         MsOS_ObtainMutex(_s32MutexUSB_Port1, MSOS_WAIT_FOREVER);
1336*53ee8cc1Swenshuai.xi     else if (Port == 3)
1337*53ee8cc1Swenshuai.xi         MsOS_ObtainMutex(_s32MutexUSB_Port3, MSOS_WAIT_FOREVER);
1338*53ee8cc1Swenshuai.xi 
1339*53ee8cc1Swenshuai.xi     lock_usb_core();
1340*53ee8cc1Swenshuai.xi }
1341*53ee8cc1Swenshuai.xi 
USBCriticalSectionOut(MS_U8 Port)1342*53ee8cc1Swenshuai.xi void USBCriticalSectionOut(MS_U8 Port)
1343*53ee8cc1Swenshuai.xi {
1344*53ee8cc1Swenshuai.xi     unlock_usb_core();
1345*53ee8cc1Swenshuai.xi 
1346*53ee8cc1Swenshuai.xi     if (Port == 0)
1347*53ee8cc1Swenshuai.xi         MsOS_ReleaseMutex(_s32MutexUSB);
1348*53ee8cc1Swenshuai.xi     else if (Port == 2)
1349*53ee8cc1Swenshuai.xi         MsOS_ReleaseMutex(_s32MutexUSB_Port2);
1350*53ee8cc1Swenshuai.xi     else if (Port == 1)
1351*53ee8cc1Swenshuai.xi         MsOS_ReleaseMutex(_s32MutexUSB_Port1);
1352*53ee8cc1Swenshuai.xi     else if (Port == 3)
1353*53ee8cc1Swenshuai.xi         MsOS_ReleaseMutex(_s32MutexUSB_Port3);
1354*53ee8cc1Swenshuai.xi }
1355*53ee8cc1Swenshuai.xi 
MDrv_GetUsbBlockSize(MS_U8 lun)1356*53ee8cc1Swenshuai.xi MS_U32 MDrv_GetUsbBlockSize(MS_U8 lun)
1357*53ee8cc1Swenshuai.xi {
1358*53ee8cc1Swenshuai.xi     MS_U32 uBlkSize = 0;
1359*53ee8cc1Swenshuai.xi 
1360*53ee8cc1Swenshuai.xi     if ( (Mass_stor_us[0] != NULL) && (lun <= Mass_stor_us[0]->max_lun) )
1361*53ee8cc1Swenshuai.xi     {
1362*53ee8cc1Swenshuai.xi         uBlkSize = Mass_stor_us[0]->Mass_stor_device[lun].u32BlockSize;
1363*53ee8cc1Swenshuai.xi     }
1364*53ee8cc1Swenshuai.xi 
1365*53ee8cc1Swenshuai.xi     return uBlkSize;
1366*53ee8cc1Swenshuai.xi }
1367*53ee8cc1Swenshuai.xi 
MDrv_GetUsbBlockSizeEx(MS_U8 uPort,MS_U8 lun)1368*53ee8cc1Swenshuai.xi MS_U32 MDrv_GetUsbBlockSizeEx(MS_U8 uPort, MS_U8 lun)
1369*53ee8cc1Swenshuai.xi {
1370*53ee8cc1Swenshuai.xi     MS_U32 uBlkSize = 0;
1371*53ee8cc1Swenshuai.xi 
1372*53ee8cc1Swenshuai.xi     if ( (Mass_stor_us[uPort] != NULL) && (lun <= Mass_stor_us[uPort]->max_lun) )
1373*53ee8cc1Swenshuai.xi     {
1374*53ee8cc1Swenshuai.xi         uBlkSize = Mass_stor_us[uPort]->Mass_stor_device[lun].u32BlockSize;
1375*53ee8cc1Swenshuai.xi     }
1376*53ee8cc1Swenshuai.xi 
1377*53ee8cc1Swenshuai.xi     return uBlkSize;
1378*53ee8cc1Swenshuai.xi }
1379*53ee8cc1Swenshuai.xi 
MDrv_GetUsbBlockNum(MS_U8 lun)1380*53ee8cc1Swenshuai.xi MS_U32 MDrv_GetUsbBlockNum(MS_U8 lun)
1381*53ee8cc1Swenshuai.xi {
1382*53ee8cc1Swenshuai.xi     MS_U32 uTotalBlks = 0;
1383*53ee8cc1Swenshuai.xi 
1384*53ee8cc1Swenshuai.xi     if ( (Mass_stor_us[0] != NULL) && (lun <= Mass_stor_us[0]->max_lun) )
1385*53ee8cc1Swenshuai.xi     {
1386*53ee8cc1Swenshuai.xi         uTotalBlks = Mass_stor_us[0]->Mass_stor_device[lun].u32BlockTotalNum;
1387*53ee8cc1Swenshuai.xi     }
1388*53ee8cc1Swenshuai.xi 
1389*53ee8cc1Swenshuai.xi     return uTotalBlks;
1390*53ee8cc1Swenshuai.xi }
1391*53ee8cc1Swenshuai.xi 
MDrv_GetUsbBlockNumEx(MS_U8 uPort,MS_U8 lun)1392*53ee8cc1Swenshuai.xi MS_U32 MDrv_GetUsbBlockNumEx(MS_U8 uPort, MS_U8 lun)
1393*53ee8cc1Swenshuai.xi {
1394*53ee8cc1Swenshuai.xi     MS_U32 uTotalBlks = 0;
1395*53ee8cc1Swenshuai.xi 
1396*53ee8cc1Swenshuai.xi     if ( (Mass_stor_us[uPort] != NULL) && (lun <= Mass_stor_us[uPort]->max_lun) )
1397*53ee8cc1Swenshuai.xi     {
1398*53ee8cc1Swenshuai.xi         uTotalBlks = Mass_stor_us[uPort]->Mass_stor_device[lun].u32BlockTotalNum;
1399*53ee8cc1Swenshuai.xi     }
1400*53ee8cc1Swenshuai.xi 
1401*53ee8cc1Swenshuai.xi     return uTotalBlks;
1402*53ee8cc1Swenshuai.xi }
1403*53ee8cc1Swenshuai.xi 
MDrv_UsbGetMaxLUNCount(void)1404*53ee8cc1Swenshuai.xi MS_U8 MDrv_UsbGetMaxLUNCount(void)
1405*53ee8cc1Swenshuai.xi {
1406*53ee8cc1Swenshuai.xi     if (Mass_stor_us[0] != NULL)
1407*53ee8cc1Swenshuai.xi         return Mass_stor_us[0]->max_lun + 1;
1408*53ee8cc1Swenshuai.xi     else
1409*53ee8cc1Swenshuai.xi         return 0;
1410*53ee8cc1Swenshuai.xi }
1411*53ee8cc1Swenshuai.xi 
MDrv_UsbGetMaxLUNCountEx(MS_U8 uPort)1412*53ee8cc1Swenshuai.xi MS_U8 MDrv_UsbGetMaxLUNCountEx(MS_U8 uPort)
1413*53ee8cc1Swenshuai.xi {
1414*53ee8cc1Swenshuai.xi     if (Mass_stor_us[uPort] != NULL)
1415*53ee8cc1Swenshuai.xi         return Mass_stor_us[uPort]->max_lun + 1;
1416*53ee8cc1Swenshuai.xi     else
1417*53ee8cc1Swenshuai.xi         return 0;
1418*53ee8cc1Swenshuai.xi }
1419*53ee8cc1Swenshuai.xi 
MDrv_UsbBlockReadToMIU(MS_U8 lun,MS_U32 u32BlockAddr,MS_U32 u32BlockNum,MS_U32 u32MIUAddr)1420*53ee8cc1Swenshuai.xi MS_BOOL MDrv_UsbBlockReadToMIU(
1421*53ee8cc1Swenshuai.xi     MS_U8 lun,
1422*53ee8cc1Swenshuai.xi     MS_U32 u32BlockAddr,
1423*53ee8cc1Swenshuai.xi     MS_U32 u32BlockNum,
1424*53ee8cc1Swenshuai.xi     MS_U32 u32MIUAddr)
1425*53ee8cc1Swenshuai.xi {
1426*53ee8cc1Swenshuai.xi     return bSCSI_Read_10(0, lun, u32BlockAddr, u32BlockNum, (U8*) u32MIUAddr);
1427*53ee8cc1Swenshuai.xi }
1428*53ee8cc1Swenshuai.xi 
MDrv_UsbBlockReadToMIUEx(MS_U8 uPort,MS_U8 lun,MS_U32 u32BlockAddr,MS_U32 u32BlockNum,MS_U32 u32MIUAddr)1429*53ee8cc1Swenshuai.xi MS_BOOL MDrv_UsbBlockReadToMIUEx(
1430*53ee8cc1Swenshuai.xi     MS_U8 uPort,
1431*53ee8cc1Swenshuai.xi     MS_U8 lun,
1432*53ee8cc1Swenshuai.xi     MS_U32 u32BlockAddr,
1433*53ee8cc1Swenshuai.xi     MS_U32 u32BlockNum,
1434*53ee8cc1Swenshuai.xi     MS_U32 u32MIUAddr)
1435*53ee8cc1Swenshuai.xi {
1436*53ee8cc1Swenshuai.xi     return bSCSI_Read_10(uPort, lun, u32BlockAddr, u32BlockNum, (U8*) u32MIUAddr);
1437*53ee8cc1Swenshuai.xi }
1438*53ee8cc1Swenshuai.xi 
MDrv_UsbBlockWriteFromMIU(MS_U8 lun,MS_U32 u32BlockAddr,MS_U32 u32BlockNum,MS_U32 u32MIUAddr)1439*53ee8cc1Swenshuai.xi MS_BOOL MDrv_UsbBlockWriteFromMIU(
1440*53ee8cc1Swenshuai.xi     MS_U8 lun,
1441*53ee8cc1Swenshuai.xi     MS_U32 u32BlockAddr,
1442*53ee8cc1Swenshuai.xi     MS_U32 u32BlockNum,
1443*53ee8cc1Swenshuai.xi     MS_U32 u32MIUAddr)
1444*53ee8cc1Swenshuai.xi {
1445*53ee8cc1Swenshuai.xi     return bSCSI_Write_10(0, lun, u32BlockAddr, u32BlockNum, (U8*) u32MIUAddr);
1446*53ee8cc1Swenshuai.xi }
1447*53ee8cc1Swenshuai.xi 
MDrv_UsbBlockWriteFromMIUEx(MS_U8 uPort,MS_U8 lun,MS_U32 u32BlockAddr,MS_U32 u32BlockNum,MS_U32 u32MIUAddr)1448*53ee8cc1Swenshuai.xi MS_BOOL MDrv_UsbBlockWriteFromMIUEx(
1449*53ee8cc1Swenshuai.xi     MS_U8 uPort,
1450*53ee8cc1Swenshuai.xi     MS_U8 lun,
1451*53ee8cc1Swenshuai.xi     MS_U32 u32BlockAddr,
1452*53ee8cc1Swenshuai.xi     MS_U32 u32BlockNum,
1453*53ee8cc1Swenshuai.xi     MS_U32 u32MIUAddr)
1454*53ee8cc1Swenshuai.xi {
1455*53ee8cc1Swenshuai.xi     return bSCSI_Write_10(uPort, lun, u32BlockAddr, u32BlockNum, (U8*) u32MIUAddr);
1456*53ee8cc1Swenshuai.xi }
1457*53ee8cc1Swenshuai.xi 
MDrv_UsbIsLunConnected(MS_U8 uPort,MS_U8 lun)1458*53ee8cc1Swenshuai.xi MS_BOOL MDrv_UsbIsLunConnected(MS_U8 uPort, MS_U8 lun)
1459*53ee8cc1Swenshuai.xi {
1460*53ee8cc1Swenshuai.xi     struct LUN_Device* LunDevice;
1461*53ee8cc1Swenshuai.xi 
1462*53ee8cc1Swenshuai.xi     if (Mass_stor_us[uPort] == NULL)
1463*53ee8cc1Swenshuai.xi         return FALSE;
1464*53ee8cc1Swenshuai.xi 
1465*53ee8cc1Swenshuai.xi     LunDevice = Mass_stor_us[uPort]->Mass_stor_device;
1466*53ee8cc1Swenshuai.xi 
1467*53ee8cc1Swenshuai.xi     if (lun <= Mass_stor_us[uPort]->max_lun)
1468*53ee8cc1Swenshuai.xi         return (LunDevice[lun].bFSInit);
1469*53ee8cc1Swenshuai.xi     else
1470*53ee8cc1Swenshuai.xi         return FALSE;
1471*53ee8cc1Swenshuai.xi 
1472*53ee8cc1Swenshuai.xi }
1473*53ee8cc1Swenshuai.xi 
1474*53ee8cc1Swenshuai.xi // ------------------------------------------------------------------------
1475*53ee8cc1Swenshuai.xi 
1476*53ee8cc1Swenshuai.xi 
1477*53ee8cc1Swenshuai.xi extern MS_U8 u8HubStackBuffer_Port2[HUB_STACK_SIZE];
1478*53ee8cc1Swenshuai.xi 
1479*53ee8cc1Swenshuai.xi struct s_gVar4UsbPort gVar4UsbPort0 =
1480*53ee8cc1Swenshuai.xi {
1481*53ee8cc1Swenshuai.xi     "USB Hub Task",
1482*53ee8cc1Swenshuai.xi     0,
1483*53ee8cc1Swenshuai.xi     { 0*MAX_USTOR, 1*MAX_USTOR},
1484*53ee8cc1Swenshuai.xi     "cpe_ehci",
1485*53ee8cc1Swenshuai.xi     "CPE_AMBA EHCI",
1486*53ee8cc1Swenshuai.xi     {CPE_DEVID_USB, "CPE_EHCI HC"},
1487*53ee8cc1Swenshuai.xi     u8HubStackBuffer,
1488*53ee8cc1Swenshuai.xi };
1489*53ee8cc1Swenshuai.xi 
1490*53ee8cc1Swenshuai.xi struct s_gVar4UsbPort gVar4UsbPort2 =
1491*53ee8cc1Swenshuai.xi {
1492*53ee8cc1Swenshuai.xi     "USB Hub Task 2",
1493*53ee8cc1Swenshuai.xi     2,
1494*53ee8cc1Swenshuai.xi     { 2*MAX_USTOR, 3*MAX_USTOR}, // TODO: re-arrange
1495*53ee8cc1Swenshuai.xi     "cpe_ehci_2",
1496*53ee8cc1Swenshuai.xi     "CPE_AMBA EHCI 2",
1497*53ee8cc1Swenshuai.xi     {CPE_DEVID_USB_PORT2, "CPE_EHCI HC 2"},
1498*53ee8cc1Swenshuai.xi     u8HubStackBuffer_Port2,
1499*53ee8cc1Swenshuai.xi };
1500*53ee8cc1Swenshuai.xi 
1501*53ee8cc1Swenshuai.xi #ifndef  MS_NOSAPI
1502*53ee8cc1Swenshuai.xi static MS_U8 u8HubStackBuffer_Port1[HUB_STACK_SIZE];
1503*53ee8cc1Swenshuai.xi #endif
1504*53ee8cc1Swenshuai.xi struct s_gVar4UsbPort gVar4UsbPort1 =
1505*53ee8cc1Swenshuai.xi {
1506*53ee8cc1Swenshuai.xi     "USB Hub Task 1",
1507*53ee8cc1Swenshuai.xi     1,
1508*53ee8cc1Swenshuai.xi     { MAX_USTOR, 2*MAX_USTOR},
1509*53ee8cc1Swenshuai.xi     "cpe_ehci_1",
1510*53ee8cc1Swenshuai.xi     "CPE_AMBA EHCI 1",
1511*53ee8cc1Swenshuai.xi     {CPE_DEVID_USB_PORT1, "CPE_EHCI HC 1"},
1512*53ee8cc1Swenshuai.xi     u8HubStackBuffer_Port1,
1513*53ee8cc1Swenshuai.xi };
1514*53ee8cc1Swenshuai.xi 
1515*53ee8cc1Swenshuai.xi #ifndef  MS_NOSAPI
1516*53ee8cc1Swenshuai.xi static MS_U8 u8HubStackBuffer_Port3[HUB_STACK_SIZE];
1517*53ee8cc1Swenshuai.xi #endif
1518*53ee8cc1Swenshuai.xi struct s_gVar4UsbPort gVar4UsbPort3 =
1519*53ee8cc1Swenshuai.xi {
1520*53ee8cc1Swenshuai.xi     "USB Hub Task 3",
1521*53ee8cc1Swenshuai.xi     3,
1522*53ee8cc1Swenshuai.xi     { 3*MAX_USTOR, 4*MAX_USTOR},
1523*53ee8cc1Swenshuai.xi     "cpe_ehci_3",
1524*53ee8cc1Swenshuai.xi     "CPE_AMBA EHCI 3",
1525*53ee8cc1Swenshuai.xi     {CPE_DEVID_USB_PORT3, "CPE_EHCI HC 3"},
1526*53ee8cc1Swenshuai.xi     u8HubStackBuffer_Port3,
1527*53ee8cc1Swenshuai.xi };
1528*53ee8cc1Swenshuai.xi 
1529*53ee8cc1Swenshuai.xi /* USB host declaration by chip ID */
1530*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipURANUS4 =
1531*53ee8cc1Swenshuai.xi {
1532*53ee8cc1Swenshuai.xi     CHIPID_URANUS4,
1533*53ee8cc1Swenshuai.xi     "URANUS4",
1534*53ee8cc1Swenshuai.xi     3,
1535*53ee8cc1Swenshuai.xi     {
1536*53ee8cc1Swenshuai.xi     {0, BASE_UTMI0, BASE_UHC0, BASE_USBC0, E_IRQ_UHC, E_IRQ_USBC},
1537*53ee8cc1Swenshuai.xi     {0, BASE_UTMI1, BASE_UHC1, BASE_USBC1, E_IRQ_UHC1, E_IRQ_USBC1},
1538*53ee8cc1Swenshuai.xi     {EHCFLAG_DPDM_SWAP, BASE_UTMI2, BASE_UHC2, BASE_USBC2, E_IRQ_UHC2, E_IRQ_USBC2},
1539*53ee8cc1Swenshuai.xi     },
1540*53ee8cc1Swenshuai.xi     {&gVar4UsbPort0, &gVar4UsbPort1, &gVar4UsbPort2}
1541*53ee8cc1Swenshuai.xi };
1542*53ee8cc1Swenshuai.xi 
1543*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipKRONUS =
1544*53ee8cc1Swenshuai.xi {
1545*53ee8cc1Swenshuai.xi     CHIPID_KRONUS,
1546*53ee8cc1Swenshuai.xi     "KRONUS",
1547*53ee8cc1Swenshuai.xi     2,
1548*53ee8cc1Swenshuai.xi     {
1549*53ee8cc1Swenshuai.xi     {EHCFLAG_DPDM_SWAP, BASE_UTMI0, BASE_UHC0, BASE_USBC0, E_IRQ_UHC, E_IRQ_USBC},
1550*53ee8cc1Swenshuai.xi     {EHCFLAG_DPDM_SWAP, BASE_UTMI2, BASE_UHC2, BASE_USBC2, E_IRQ_UHC2, E_IRQ_USBC2},
1551*53ee8cc1Swenshuai.xi     },
1552*53ee8cc1Swenshuai.xi     {&gVar4UsbPort0, &gVar4UsbPort1, }
1553*53ee8cc1Swenshuai.xi };
1554*53ee8cc1Swenshuai.xi 
1555*53ee8cc1Swenshuai.xi struct s_ChipUsbHostDef chipKAISERIN  =
1556*53ee8cc1Swenshuai.xi {
1557*53ee8cc1Swenshuai.xi     CHIPID_KAISERIN,
1558*53ee8cc1Swenshuai.xi     "KAISERIN",
1559*53ee8cc1Swenshuai.xi     4,
1560*53ee8cc1Swenshuai.xi     {
1561*53ee8cc1Swenshuai.xi     {0, BASE_UTMI0, BASE_UHC0, BASE_USBC0, E_IRQ_UHC, E_IRQ_USBC},
1562*53ee8cc1Swenshuai.xi     {0, BASE_UTMI1, BASE_UHC1, BASE_USBC1, E_IRQ_UHC1, E_IRQ_USBC1},
1563*53ee8cc1Swenshuai.xi     {0, BASE_UTMI2, BASE_UHC2, BASE_USBC2, E_IRQ_UHC2, E_IRQ_USBC2},
1564*53ee8cc1Swenshuai.xi     {0, BASE_UTMI3, BASE_UHC3, BASE_USBC3, E_IRQ_UHC3, E_IRQ_USBC3},
1565*53ee8cc1Swenshuai.xi     },
1566*53ee8cc1Swenshuai.xi     {&gVar4UsbPort0, &gVar4UsbPort1, &gVar4UsbPort2, &gVar4UsbPort3}
1567*53ee8cc1Swenshuai.xi };
1568*53ee8cc1Swenshuai.xi 
1569*53ee8cc1Swenshuai.xi // any new chip added here ^^^
1570*53ee8cc1Swenshuai.xi //
1571*53ee8cc1Swenshuai.xi 
_DrvUSB_OnInterrupt_EX(InterruptNum eIntNum)1572*53ee8cc1Swenshuai.xi static void _DrvUSB_OnInterrupt_EX(InterruptNum eIntNum)
1573*53ee8cc1Swenshuai.xi {
1574*53ee8cc1Swenshuai.xi     // TODO: check if there is any alternative
1575*53ee8cc1Swenshuai.xi     struct s_ChipUsbHostDef *pChip = pCurrentChip;
1576*53ee8cc1Swenshuai.xi     struct usb_hcd *hcd;
1577*53ee8cc1Swenshuai.xi     MS_U8 p;
1578*53ee8cc1Swenshuai.xi 
1579*53ee8cc1Swenshuai.xi     if (pChip == NULL)
1580*53ee8cc1Swenshuai.xi         return;
1581*53ee8cc1Swenshuai.xi     MsOS_DisableInterrupt(eIntNum);
1582*53ee8cc1Swenshuai.xi     for (p = 0; p < pChip->nRootHub; p++)
1583*53ee8cc1Swenshuai.xi     {
1584*53ee8cc1Swenshuai.xi         if (eIntNum == pChip->reg[p].uhcIRQ)
1585*53ee8cc1Swenshuai.xi             break;
1586*53ee8cc1Swenshuai.xi     }
1587*53ee8cc1Swenshuai.xi     hcd = pChip->p_roothub[p]->cpe_ehci_dev.dev.driver_data;
1588*53ee8cc1Swenshuai.xi     hcd->driver->irq(hcd, NULL);
1589*53ee8cc1Swenshuai.xi     MsOS_EnableInterrupt(eIntNum);
1590*53ee8cc1Swenshuai.xi }
1591*53ee8cc1Swenshuai.xi 
InitUSBIntr_EX(struct usb_hcd * hcd)1592*53ee8cc1Swenshuai.xi void InitUSBIntr_EX(struct usb_hcd * hcd)
1593*53ee8cc1Swenshuai.xi {
1594*53ee8cc1Swenshuai.xi     struct ehci_hcd  *ehci = hcd_to_ehci (hcd);
1595*53ee8cc1Swenshuai.xi     U32 temp;
1596*53ee8cc1Swenshuai.xi 
1597*53ee8cc1Swenshuai.xi     //diag_printf("InitUSBIntr_EX enter\n");
1598*53ee8cc1Swenshuai.xi     temp = (HOST20_USBINTR_IntOnAsyncAdvance |
1599*53ee8cc1Swenshuai.xi                                             HOST20_USBINTR_SystemError |
1600*53ee8cc1Swenshuai.xi #ifdef ROOTHUB_INTERRUPT_MODE
1601*53ee8cc1Swenshuai.xi                                             HOST20_USBINTR_PortChangeDetect |
1602*53ee8cc1Swenshuai.xi #endif
1603*53ee8cc1Swenshuai.xi                                             HOST20_USBINTR_USBError |
1604*53ee8cc1Swenshuai.xi                                             HOST20_USBINTR_CompletionOfTransaction);
1605*53ee8cc1Swenshuai.xi     ehci_writel (temp, (U32)&ehci->regs->intr_enable);
1606*53ee8cc1Swenshuai.xi 
1607*53ee8cc1Swenshuai.xi     temp = ehci_readb((U32)&ehci->regs->status);
1608*53ee8cc1Swenshuai.xi     ehci_writel (temp, (U32)&ehci->regs->status); //clear all pending interrupt
1609*53ee8cc1Swenshuai.xi     //  diag_printf("usb int status:%x\n",mwHost20_USBSTS_Rd());
1610*53ee8cc1Swenshuai.xi 
1611*53ee8cc1Swenshuai.xi     temp = ehci_readb((U32)&ehci->regs->bus_control);
1612*53ee8cc1Swenshuai.xi     temp|= INT_POLAR;
1613*53ee8cc1Swenshuai.xi     ehci_writel (temp, (U32)&ehci->regs->bus_control);
1614*53ee8cc1Swenshuai.xi 
1615*53ee8cc1Swenshuai.xi #ifndef  MS_NOSAPI
1616*53ee8cc1Swenshuai.xi 	MsOS_AttachInterrupt(hcd->irq, _DrvUSB_OnInterrupt_EX);
1617*53ee8cc1Swenshuai.xi     //diag_printf("enable usb int\n");
1618*53ee8cc1Swenshuai.xi 	MsOS_EnableInterrupt(hcd->irq);
1619*53ee8cc1Swenshuai.xi     //diag_printf("ok");
1620*53ee8cc1Swenshuai.xi #endif
1621*53ee8cc1Swenshuai.xi }
1622*53ee8cc1Swenshuai.xi 
Usb_host_Init_EX(struct usb_hcd * hcd)1623*53ee8cc1Swenshuai.xi MS_BOOL Usb_host_Init_EX(struct usb_hcd *hcd)
1624*53ee8cc1Swenshuai.xi {
1625*53ee8cc1Swenshuai.xi     MS_U8 wValue;
1626*53ee8cc1Swenshuai.xi     MS_U16 wTimer_ms;
1627*53ee8cc1Swenshuai.xi     struct ehci_hcd  *ehci = hcd_to_ehci (hcd);
1628*53ee8cc1Swenshuai.xi     U32 temp, temp2;
1629*53ee8cc1Swenshuai.xi     const struct device_s *__mptr = hcd->controller;
1630*53ee8cc1Swenshuai.xi     struct cpe_dev *cdev;
1631*53ee8cc1Swenshuai.xi 
1632*53ee8cc1Swenshuai.xi     diag_printf("Usb_host_Init_EX......\thcd %x, port %d\n", hcd, hcd->host_id);
1633*53ee8cc1Swenshuai.xi 
1634*53ee8cc1Swenshuai.xi    //<1>.Waiting for the Device connect
1635*53ee8cc1Swenshuai.xi     temp = ehci_readl((U32)&ehci->regs->command);
1636*53ee8cc1Swenshuai.xi     temp |= CMD_RESET;
1637*53ee8cc1Swenshuai.xi     ehci_writel (temp, (U32)&ehci->regs->command); //host controller reset
1638*53ee8cc1Swenshuai.xi     while(ehci_readb((U32)&ehci->regs->command) & CMD_RESET);
1639*53ee8cc1Swenshuai.xi       //mbHost20_USBCMD_HCReset_Set();            //host controller reset
1640*53ee8cc1Swenshuai.xi       //while(mbHost20_USBCMD_HCReset_Rd()>0);
1641*53ee8cc1Swenshuai.xi 
1642*53ee8cc1Swenshuai.xi    wValue=0;
1643*53ee8cc1Swenshuai.xi    wTimer_ms=0;
1644*53ee8cc1Swenshuai.xi    do
1645*53ee8cc1Swenshuai.xi    {
1646*53ee8cc1Swenshuai.xi         wValue = ehci_readb((U32)&ehci->regs->port_status[0]) & PORT_CONNECT;
1647*53ee8cc1Swenshuai.xi       //wValue=mwHost20_PORTSC_ConnectStatus_Rd();
1648*53ee8cc1Swenshuai.xi             //diag_printf("wValue:%x\n",wValue);
1649*53ee8cc1Swenshuai.xi 
1650*53ee8cc1Swenshuai.xi       if (wValue==0) {
1651*53ee8cc1Swenshuai.xi          USB_DELAY(1);//10, wait 1 ms
1652*53ee8cc1Swenshuai.xi          wTimer_ms++;
1653*53ee8cc1Swenshuai.xi       }
1654*53ee8cc1Swenshuai.xi       //if (mwHost20_PORTSC_ConnectStatus_Rd()==0) return 0;
1655*53ee8cc1Swenshuai.xi       if (wTimer_ms>9500)          // Case1:Waiting for 10 sec=10000
1656*53ee8cc1Swenshuai.xi       {                                           // Case2:Waiting for 100 ms =100
1657*53ee8cc1Swenshuai.xi          diag_printf("??? Waiting for Peripheral Connecting Fail...\n");
1658*53ee8cc1Swenshuai.xi          return (0);
1659*53ee8cc1Swenshuai.xi       }
1660*53ee8cc1Swenshuai.xi    }while(wValue==0);
1661*53ee8cc1Swenshuai.xi 
1662*53ee8cc1Swenshuai.xi     cdev = (struct cpe_dev *)( (char *)__mptr - (char *)offsetof(struct cpe_dev,dev) );
1663*53ee8cc1Swenshuai.xi 
1664*53ee8cc1Swenshuai.xi     //if (PortReset(UTMIBaseAddr, UHC_BASE)>0)
1665*53ee8cc1Swenshuai.xi     if (PortReset(cdev->utmibase, (U32)hcd->regs)>0)
1666*53ee8cc1Swenshuai.xi         return(2);
1667*53ee8cc1Swenshuai.xi 
1668*53ee8cc1Swenshuai.xi     temp = (ehci_readl((U32)&ehci->regs->bus_control) >> 9) & 0x3;
1669*53ee8cc1Swenshuai.xi     diag_printf("speed: %x\n", temp);
1670*53ee8cc1Swenshuai.xi 
1671*53ee8cc1Swenshuai.xi     //diag_printf("speed: %x\n", mwOTG20_Control_HOST_SPD_TYP_Rd());
1672*53ee8cc1Swenshuai.xi 
1673*53ee8cc1Swenshuai.xi     temp2 = ehci_readl((U32)&ehci->regs->hcmisc) & 0xfffffff3;
1674*53ee8cc1Swenshuai.xi     if (temp == 2) // high speed
1675*53ee8cc1Swenshuai.xi     //if (mwOTG20_Control_HOST_SPD_TYP_Rd()==2)                //high speed
1676*53ee8cc1Swenshuai.xi     {
1677*53ee8cc1Swenshuai.xi       UTMI_ORXBYTE_EX(0x09, 0x80, cdev->utmibase);                            //HS rx robust enable
1678*53ee8cc1Swenshuai.xi       temp2 |= (3 << 2);
1679*53ee8cc1Swenshuai.xi       //mwHost20_Misc_EOF1Time_Set(3);
1680*53ee8cc1Swenshuai.xi     }
1681*53ee8cc1Swenshuai.xi     else                 //full speed, low speed
1682*53ee8cc1Swenshuai.xi     {
1683*53ee8cc1Swenshuai.xi       UTMI_ANDXBYTE_EX(0x09, 0x7F, cdev->utmibase);
1684*53ee8cc1Swenshuai.xi       temp2 |= (2 << 2);
1685*53ee8cc1Swenshuai.xi       //mwHost20_Misc_EOF1Time_Set(2);
1686*53ee8cc1Swenshuai.xi     }
1687*53ee8cc1Swenshuai.xi     ehci_writel (temp2, (U32)&ehci->regs->hcmisc); // misc, EOF1
1688*53ee8cc1Swenshuai.xi 
1689*53ee8cc1Swenshuai.xi     temp = ehci_readl((U32)&ehci->regs->command) & 0xfffffff3;
1690*53ee8cc1Swenshuai.xi     temp |= (HOST20_USBCMD_FrameListSize_256 << 2);
1691*53ee8cc1Swenshuai.xi     ehci_writel (temp, (U32)&ehci->regs->command);
1692*53ee8cc1Swenshuai.xi 
1693*53ee8cc1Swenshuai.xi     temp = (HOST20_USBINTR_IntOnAsyncAdvance |
1694*53ee8cc1Swenshuai.xi                                             HOST20_USBINTR_SystemError |
1695*53ee8cc1Swenshuai.xi #ifdef ROOTHUB_INTERRUPT_MODE
1696*53ee8cc1Swenshuai.xi                                             HOST20_USBINTR_PortChangeDetect |
1697*53ee8cc1Swenshuai.xi #endif
1698*53ee8cc1Swenshuai.xi                                             HOST20_USBINTR_USBError |
1699*53ee8cc1Swenshuai.xi                                             HOST20_USBINTR_CompletionOfTransaction);
1700*53ee8cc1Swenshuai.xi     ehci_writel (temp, (U32)&ehci->regs->intr_enable);
1701*53ee8cc1Swenshuai.xi     //mwHost20_USBINTR_Set(HOST20_USBINTR_IntOnAsyncAdvance |
1702*53ee8cc1Swenshuai.xi     //                                        HOST20_USBINTR_SystemError |
1703*53ee8cc1Swenshuai.xi     //                                        HOST20_USBINTR_USBError |
1704*53ee8cc1Swenshuai.xi     //                                        HOST20_USBINTR_CompletionOfTransaction);
1705*53ee8cc1Swenshuai.xi 
1706*53ee8cc1Swenshuai.xi    return (1);
1707*53ee8cc1Swenshuai.xi 
1708*53ee8cc1Swenshuai.xi }
1709*53ee8cc1Swenshuai.xi 
1710*53ee8cc1Swenshuai.xi extern void ResetMstarUsb(struct ehci_hcd *ehci);
MDrv_UsbDeviceConnect_EX(struct usb_hcd * hcd)1711*53ee8cc1Swenshuai.xi MS_BOOL MDrv_UsbDeviceConnect_EX(struct usb_hcd *hcd)
1712*53ee8cc1Swenshuai.xi {
1713*53ee8cc1Swenshuai.xi     struct ehci_hcd *ehci = hcd_to_ehci(hcd);
1714*53ee8cc1Swenshuai.xi     MS_U8 temp_s;
1715*53ee8cc1Swenshuai.xi     MS_U32 temp;
1716*53ee8cc1Swenshuai.xi     static MS_U32 usbStartTime = 0;
1717*53ee8cc1Swenshuai.xi 
1718*53ee8cc1Swenshuai.xi     temp_s = ehci_readb((U32)&ehci->regs->port_status[0]);
1719*53ee8cc1Swenshuai.xi     //temp=mwHost20_PORTSC_ConnectStatus_Rd_Port2();
1720*53ee8cc1Swenshuai.xi     //diag_printf("ConnectStatus:%02bx\n",temp);
1721*53ee8cc1Swenshuai.xi     //MsOS_DelayTask(10);
1722*53ee8cc1Swenshuai.xi     if (temp_s & PORT_CONNECT)
1723*53ee8cc1Swenshuai.xi     {
1724*53ee8cc1Swenshuai.xi         return TRUE;
1725*53ee8cc1Swenshuai.xi     }
1726*53ee8cc1Swenshuai.xi     else
1727*53ee8cc1Swenshuai.xi     {
1728*53ee8cc1Swenshuai.xi #ifndef MS_NOSAPI
1729*53ee8cc1Swenshuai.xi         if (MsOS_GetSystemTime()-usbStartTime > 1000 )
1730*53ee8cc1Swenshuai.xi         {
1731*53ee8cc1Swenshuai.xi             usbStartTime=MsOS_GetSystemTime();
1732*53ee8cc1Swenshuai.xi 
1733*53ee8cc1Swenshuai.xi             temp = ehci_readl((U32)&ehci->regs->bus_control);
1734*53ee8cc1Swenshuai.xi             temp &= ~0x80;
1735*53ee8cc1Swenshuai.xi             ehci_writel(temp, (U32)&ehci->regs->bus_control);
1736*53ee8cc1Swenshuai.xi             //UHC2_ANDXBYTE(0x40, 0x7F);//disable force enter FSmode
1737*53ee8cc1Swenshuai.xi             ResetMstarUsb(ehci);
1738*53ee8cc1Swenshuai.xi         }
1739*53ee8cc1Swenshuai.xi #endif
1740*53ee8cc1Swenshuai.xi         hcd->isRootHubPortReset = TRUE;
1741*53ee8cc1Swenshuai.xi         hcd->isBadDevice = FALSE;
1742*53ee8cc1Swenshuai.xi         hcd->badDeviceCnt = 0;
1743*53ee8cc1Swenshuai.xi         return FALSE;
1744*53ee8cc1Swenshuai.xi     }
1745*53ee8cc1Swenshuai.xi }
1746*53ee8cc1Swenshuai.xi 
1747*53ee8cc1Swenshuai.xi extern BOOL has_hub_events_EX(U16 *pPortStatus, struct s_gVar4UsbPort *gVar);
1748*53ee8cc1Swenshuai.xi extern void hub_poll_EX(struct s_gVar4UsbPort *gVar);
1749*53ee8cc1Swenshuai.xi extern struct cpe_dev cpe_ehci_dev_Port2; // for HID support
1750*53ee8cc1Swenshuai.xi extern struct list_head hub_event_list_Port2;
1751*53ee8cc1Swenshuai.xi extern struct list_head hub_event_list_Port1;
1752*53ee8cc1Swenshuai.xi extern struct list_head hub_event_list_Port3;
UsbTask_EX(MS_U32 argc,VOID * argv)1753*53ee8cc1Swenshuai.xi void  UsbTask_EX(MS_U32 argc, VOID *argv)
1754*53ee8cc1Swenshuai.xi {
1755*53ee8cc1Swenshuai.xi     MS_U16	    PortStatus;
1756*53ee8cc1Swenshuai.xi     MS_BOOL     isExtHubConnect, isFirstEvent, isConnect;
1757*53ee8cc1Swenshuai.xi     int		    DevState;
1758*53ee8cc1Swenshuai.xi     MS_U8       DevClass, ii, kk;
1759*53ee8cc1Swenshuai.xi     MS_U8       LunSts[MAX_USB_STOR_LUNS];
1760*53ee8cc1Swenshuai.xi     MS_U8       LunPreSts[MAX_USB_STOR_LUNS];
1761*53ee8cc1Swenshuai.xi     MS_BOOL     isMSCPlugIn;
1762*53ee8cc1Swenshuai.xi     #if USB_HID_SUPPORT
1763*53ee8cc1Swenshuai.xi     MS_U8       jj;
1764*53ee8cc1Swenshuai.xi     MS_BOOL     isHIDPlugIn, isHIDPlugIntoSamePort;
1765*53ee8cc1Swenshuai.xi     MS_U8       isHIDPlugIn_IntfCnt;
1766*53ee8cc1Swenshuai.xi     #endif
1767*53ee8cc1Swenshuai.xi     MS_U8       us_id; // for MSC
1768*53ee8cc1Swenshuai.xi     struct s_gVar4UsbPort *gVar = (struct s_gVar4UsbPort *) argc;
1769*53ee8cc1Swenshuai.xi     struct ehci_hcd *ehci = hcd_to_ehci(gVar->p_UsbHcd);
1770*53ee8cc1Swenshuai.xi 
1771*53ee8cc1Swenshuai.xi     diag_printf("UsbTask EX ... port %d\n", gVar->portNum);
1772*53ee8cc1Swenshuai.xi     diag_printf("gVar = %x\n", gVar);
1773*53ee8cc1Swenshuai.xi     while (1)
1774*53ee8cc1Swenshuai.xi     {
1775*53ee8cc1Swenshuai.xi         isExtHubConnect = FALSE;
1776*53ee8cc1Swenshuai.xi         isMSCPlugIn = FALSE;
1777*53ee8cc1Swenshuai.xi         #if USB_HID_SUPPORT
1778*53ee8cc1Swenshuai.xi         isHIDPlugIn = FALSE;
1779*53ee8cc1Swenshuai.xi         #endif
1780*53ee8cc1Swenshuai.xi 
1781*53ee8cc1Swenshuai.xi         // Waiting for USB port connection
1782*53ee8cc1Swenshuai.xi         while(1)
1783*53ee8cc1Swenshuai.xi         {
1784*53ee8cc1Swenshuai.xi             USBCriticalSectionIn(gVar->portNum);
1785*53ee8cc1Swenshuai.xi             isConnect = MDrv_UsbDeviceConnect_EX(gVar->p_UsbHcd);
1786*53ee8cc1Swenshuai.xi             USBCriticalSectionOut(gVar->portNum);
1787*53ee8cc1Swenshuai.xi 
1788*53ee8cc1Swenshuai.xi             #if USBC_IP_SUPPORT // USBC IP control
1789*53ee8cc1Swenshuai.xi             if ((pCurrentChip->usbc_ip[gVar->portNum].portNum == gVar->portNum) && (pCurrentChip->usbc_ip[gVar->portNum].eventFlag))
1790*53ee8cc1Swenshuai.xi                         if (_DrvUSBC_CBFun)
1791*53ee8cc1Swenshuai.xi                         {
1792*53ee8cc1Swenshuai.xi                             if (pCurrentChip->usbc_ip[gVar->portNum].eventType)
1793*53ee8cc1Swenshuai.xi                                 _DrvUSBC_CBFun(USBC_NON_OVER_CURRENT, gVar->portNum, NULL);
1794*53ee8cc1Swenshuai.xi                             else
1795*53ee8cc1Swenshuai.xi                                 _DrvUSBC_CBFun(USBC_OVER_CURRENT, gVar->portNum, NULL);
1796*53ee8cc1Swenshuai.xi                             pCurrentChip->usbc_ip[gVar->portNum].eventFlag = 0;
1797*53ee8cc1Swenshuai.xi                         }
1798*53ee8cc1Swenshuai.xi             #endif
1799*53ee8cc1Swenshuai.xi             if(isConnect)
1800*53ee8cc1Swenshuai.xi                 break;
1801*53ee8cc1Swenshuai.xi             MsOS_DelayTask(100);
1802*53ee8cc1Swenshuai.xi         }
1803*53ee8cc1Swenshuai.xi 
1804*53ee8cc1Swenshuai.xi         // removing any delay before USB bus reset
1805*53ee8cc1Swenshuai.xi         //MsOS_DelayTask(1000);
1806*53ee8cc1Swenshuai.xi         //diag_printf("USB Port %d is connect\n", gVar->portNum);
1807*53ee8cc1Swenshuai.xi 
1808*53ee8cc1Swenshuai.xi         while (1)
1809*53ee8cc1Swenshuai.xi         {
1810*53ee8cc1Swenshuai.xi             if (gVar->p_UsbHcd->isBadDevice)
1811*53ee8cc1Swenshuai.xi             {
1812*53ee8cc1Swenshuai.xi                 diag_printf("A bad device found on port %d\n", gVar->portNum);
1813*53ee8cc1Swenshuai.xi                 break;
1814*53ee8cc1Swenshuai.xi             }
1815*53ee8cc1Swenshuai.xi 
1816*53ee8cc1Swenshuai.xi             kk = 0;
1817*53ee8cc1Swenshuai.xi             while(kk<HUB_DEBOUNCE_STABLE)
1818*53ee8cc1Swenshuai.xi             {
1819*53ee8cc1Swenshuai.xi                 USBCriticalSectionIn(gVar->portNum);
1820*53ee8cc1Swenshuai.xi                 isConnect = MDrv_UsbDeviceConnect_EX(gVar->p_UsbHcd);
1821*53ee8cc1Swenshuai.xi                 USBCriticalSectionOut(gVar->portNum);
1822*53ee8cc1Swenshuai.xi                 if ( !isConnect )
1823*53ee8cc1Swenshuai.xi                     goto PORT_DISCONNECT_EX;
1824*53ee8cc1Swenshuai.xi                 kk++;
1825*53ee8cc1Swenshuai.xi                 MsOS_DelayTask(HUB_DEBOUNCE_STEP);
1826*53ee8cc1Swenshuai.xi             }
1827*53ee8cc1Swenshuai.xi 
1828*53ee8cc1Swenshuai.xi             // Device is connecting to the port
1829*53ee8cc1Swenshuai.xi             isFirstEvent = FALSE;
1830*53ee8cc1Swenshuai.xi             if (has_hub_events_EX(&PortStatus, gVar))
1831*53ee8cc1Swenshuai.xi             {
1832*53ee8cc1Swenshuai.xi                 diag_printf("EX**hub event %d\n", gVar->portNum);
1833*53ee8cc1Swenshuai.xi                 isFirstEvent = TRUE;
1834*53ee8cc1Swenshuai.xi                 hub_poll_EX(gVar);
1835*53ee8cc1Swenshuai.xi             }
1836*53ee8cc1Swenshuai.xi 
1837*53ee8cc1Swenshuai.xi             if (isExtHubConnect)
1838*53ee8cc1Swenshuai.xi                 hub_poll_EX(gVar);
1839*53ee8cc1Swenshuai.xi 
1840*53ee8cc1Swenshuai.xi             isMSCPlugIn = FALSE;
1841*53ee8cc1Swenshuai.xi             for (us_id=gVar->vPortRange.vPortStart; us_id<gVar->vPortRange.vPortEnd; us_id++)
1842*53ee8cc1Swenshuai.xi             {
1843*53ee8cc1Swenshuai.xi                 if (Is_Stor_Dev_Info_Valid(us_id))   // Check if we found a Mass Stoarge device.
1844*53ee8cc1Swenshuai.xi                 {
1845*53ee8cc1Swenshuai.xi                     isMSCPlugIn = TRUE;
1846*53ee8cc1Swenshuai.xi                     if (!Is_Stor_Dev_Init(us_id))    // First time after connected
1847*53ee8cc1Swenshuai.xi                     {
1848*53ee8cc1Swenshuai.xi                         diag_printf("found a Mass Storage device @ port %d, try to init it\n", gVar->portNum);
1849*53ee8cc1Swenshuai.xi 
1850*53ee8cc1Swenshuai.xi                         if (bInit_USB_Disk(us_id))
1851*53ee8cc1Swenshuai.xi                         {
1852*53ee8cc1Swenshuai.xi                             for (ii=0; ii<=Get_Stor_Max_Lun(us_id); ii++)
1853*53ee8cc1Swenshuai.xi                             {
1854*53ee8cc1Swenshuai.xi                                 LunSts[ii] = LunPreSts[ii] = bIsDevValid(us_id, ii);
1855*53ee8cc1Swenshuai.xi                                 if (LunSts[ii])
1856*53ee8cc1Swenshuai.xi                                 {
1857*53ee8cc1Swenshuai.xi                                     diag_printf("LUN %d is init ok\n", ii);
1858*53ee8cc1Swenshuai.xi                                 }
1859*53ee8cc1Swenshuai.xi                             }
1860*53ee8cc1Swenshuai.xi                             Set_Stor_Dev_Init(us_id, TRUE);
1861*53ee8cc1Swenshuai.xi                             diag_printf("MSC plug in\n");
1862*53ee8cc1Swenshuai.xi                         }
1863*53ee8cc1Swenshuai.xi                     }
1864*53ee8cc1Swenshuai.xi                     else
1865*53ee8cc1Swenshuai.xi                     {
1866*53ee8cc1Swenshuai.xi                         vChk_USB_LUNs(us_id);
1867*53ee8cc1Swenshuai.xi 
1868*53ee8cc1Swenshuai.xi                         for (ii=0; ii<=Get_Stor_Max_Lun(us_id); ii++)
1869*53ee8cc1Swenshuai.xi                         {
1870*53ee8cc1Swenshuai.xi                             LunSts[ii] = bIsDevValid(us_id, ii);
1871*53ee8cc1Swenshuai.xi                             if ( LunSts[ii] && (LunSts[ii] != LunPreSts[ii]) )
1872*53ee8cc1Swenshuai.xi                             {
1873*53ee8cc1Swenshuai.xi                                 diag_printf("Chk LUN %d is init ok\n", ii);
1874*53ee8cc1Swenshuai.xi                             }
1875*53ee8cc1Swenshuai.xi                             LunPreSts[ii] = LunSts[ii];
1876*53ee8cc1Swenshuai.xi                         }
1877*53ee8cc1Swenshuai.xi                     }
1878*53ee8cc1Swenshuai.xi                 }
1879*53ee8cc1Swenshuai.xi                 else
1880*53ee8cc1Swenshuai.xi                 {
1881*53ee8cc1Swenshuai.xi                 }
1882*53ee8cc1Swenshuai.xi 
1883*53ee8cc1Swenshuai.xi             }
1884*53ee8cc1Swenshuai.xi 
1885*53ee8cc1Swenshuai.xi 
1886*53ee8cc1Swenshuai.xi #if USB_HID_SUPPORT
1887*53ee8cc1Swenshuai.xi             if (Is_Any_Hid_Dev_Info_Valid_EX())
1888*53ee8cc1Swenshuai.xi             {
1889*53ee8cc1Swenshuai.xi                 for (ii=0; ii<MAX_HID_DEV_COUNT; ii++)	//find the port index
1890*53ee8cc1Swenshuai.xi                 {
1891*53ee8cc1Swenshuai.xi                     isHIDPlugIntoSamePort = FALSE;		//a bool value to indicate that the interface enumeration below is for the same port
1892*53ee8cc1Swenshuai.xi 		            isHIDPlugIn_IntfCnt = 0;
1893*53ee8cc1Swenshuai.xi                     for (jj=0; jj<MAX_HID_INTF_COUNT; jj++)	//find the interface index
1894*53ee8cc1Swenshuai.xi                     {
1895*53ee8cc1Swenshuai.xi                         if(isHIDPlugIntoSamePort==FALSE)
1896*53ee8cc1Swenshuai.xi 			                isHIDPlugIntoSamePort = TRUE;	//for multiple interfaces, using same port
1897*53ee8cc1Swenshuai.xi 
1898*53ee8cc1Swenshuai.xi                         if ( Is_Hid_Dev_Info_Valid_EX(ii,jj) &&
1899*53ee8cc1Swenshuai.xi 				  (HID_us[ii][jj]->pusb_dev->bus->hcpriv == cpe_ehci_dev_Port2.dev.driver_data) )
1900*53ee8cc1Swenshuai.xi                         {
1901*53ee8cc1Swenshuai.xi                             if (!Is_Hid_Dev_Init_EX(ii,jj))
1902*53ee8cc1Swenshuai.xi                             {
1903*53ee8cc1Swenshuai.xi 	                        if ((Invalid_HidDevs & ((1 << jj)<<(ii*MAX_HID_INTF_COUNT))) != 0)
1904*53ee8cc1Swenshuai.xi                                 {
1905*53ee8cc1Swenshuai.xi 			            continue;;
1906*53ee8cc1Swenshuai.xi 				}
1907*53ee8cc1Swenshuai.xi 
1908*53ee8cc1Swenshuai.xi                                if (usb_get_report_descriptor_EX(ii, jj, Hid_Report_Desc, 0x65) == ENOERR)
1909*53ee8cc1Swenshuai.xi                                 {
1910*53ee8cc1Swenshuai.xi                    	    /* index 3 of id_Report_Desc is for Local Usage type: 1(Unknown), 2(Mouse),4(Joystick),6(Keyboard)
1911*53ee8cc1Swenshuai.xi                    	    *  e.g. of Joystick: 5 1 9 "4" a1 1 85 ...
1912*53ee8cc1Swenshuai.xi                    	    */
1913*53ee8cc1Swenshuai.xi                    	    if(Hid_Report_Desc[3]==Usage_Unkown)
1914*53ee8cc1Swenshuai.xi                                     {
1915*53ee8cc1Swenshuai.xi        			        Invalid_HidDevs |= ((1 << jj)<<(ii * MAX_HID_INTF_COUNT));
1916*53ee8cc1Swenshuai.xi                        		diag_printf("Invalid_HidDevs=%lx\n",Invalid_HidDevs);
1917*53ee8cc1Swenshuai.xi                        		continue;
1918*53ee8cc1Swenshuai.xi                                    }
1919*53ee8cc1Swenshuai.xi 
1920*53ee8cc1Swenshuai.xi                                     //hid_parse_report(Hid_Report_Desc, 0x65);
1921*53ee8cc1Swenshuai.xi                                    usb_hid_parse_report(Hid_Report_Desc, 0x65, &HID_us[ii][jj]->buttons, HID_us[ii][jj]->axis, &HID_us[ii][jj]->keys);
1922*53ee8cc1Swenshuai.xi                                     diag_printf("HID finished\n");
1923*53ee8cc1Swenshuai.xi                                    Set_Hid_Dev_Init_EX(ii, jj, TRUE);
1924*53ee8cc1Swenshuai.xi 
1925*53ee8cc1Swenshuai.xi        			    #if 1  //RCC
1926*53ee8cc1Swenshuai.xi        			        if ((isHIDPlugIn_IntfCnt < MAX_HID_INTF_COUNT)&& (isHIDPlugIntoSamePort == TRUE))
1927*53ee8cc1Swenshuai.xi                                        {
1928*53ee8cc1Swenshuai.xi                                            isHIDPlugIn = TRUE;
1929*53ee8cc1Swenshuai.xi                                            isHIDPlugIn_IntfCnt++;
1930*53ee8cc1Swenshuai.xi                                            diag_printf("HID plug into Port(%d) Intf(%d)\n", ii, jj);
1931*53ee8cc1Swenshuai.xi                                            if ( _DrvUSB_CBFun != NULL )
1932*53ee8cc1Swenshuai.xi                                                _DrvUSB_CBFun(USB_PLUG_IN, USB_EVENT_DEV_TYPE_HID, NULL);
1933*53ee8cc1Swenshuai.xi                                        }
1934*53ee8cc1Swenshuai.xi                    	    #else
1935*53ee8cc1Swenshuai.xi                                         if (!isHIDPlugIn)
1936*53ee8cc1Swenshuai.xi                                         {
1937*53ee8cc1Swenshuai.xi                                             isHIDPlugIn = TRUE;
1938*53ee8cc1Swenshuai.xi                                             diag_printf("HID plug in\n");
1939*53ee8cc1Swenshuai.xi                                             if ( _DrvUSB_CBFun != NULL )
1940*53ee8cc1Swenshuai.xi                                                 _DrvUSB_CBFun(USB_PLUG_IN, USB_EVENT_DEV_TYPE_HID, NULL);
1941*53ee8cc1Swenshuai.xi                                         }
1942*53ee8cc1Swenshuai.xi        			    #endif
1943*53ee8cc1Swenshuai.xi                                 //usb_hid_get_int_ex(0, HID_us[0]->IntPipeBuf, 8);
1944*53ee8cc1Swenshuai.xi                                 //MsOS_StartTimer(g_Hid_Timer_ID);
1945*53ee8cc1Swenshuai.xi                                 }
1946*53ee8cc1Swenshuai.xi                             }
1947*53ee8cc1Swenshuai.xi                         }
1948*53ee8cc1Swenshuai.xi                     }
1949*53ee8cc1Swenshuai.xi                 }
1950*53ee8cc1Swenshuai.xi             }
1951*53ee8cc1Swenshuai.xi             else
1952*53ee8cc1Swenshuai.xi             {
1953*53ee8cc1Swenshuai.xi                 if (isHIDPlugIn)
1954*53ee8cc1Swenshuai.xi                 {
1955*53ee8cc1Swenshuai.xi                     diag_printf("HID plug out\n");
1956*53ee8cc1Swenshuai.xi                     isHIDPlugIn = FALSE;
1957*53ee8cc1Swenshuai.xi                     if ( _DrvUSB_CBFun != NULL )
1958*53ee8cc1Swenshuai.xi                         _DrvUSB_CBFun(USB_PLUG_OUT, USB_EVENT_DEV_TYPE_HID, NULL);
1959*53ee8cc1Swenshuai.xi                 }
1960*53ee8cc1Swenshuai.xi             }
1961*53ee8cc1Swenshuai.xi #endif
1962*53ee8cc1Swenshuai.xi 
1963*53ee8cc1Swenshuai.xi 
1964*53ee8cc1Swenshuai.xi             if ( (isMSCPlugIn == FALSE)
1965*53ee8cc1Swenshuai.xi                 #if USB_HID_SUPPORT
1966*53ee8cc1Swenshuai.xi                     && !Is_Any_Hid_Dev_Info_Valid_EX()
1967*53ee8cc1Swenshuai.xi                 #endif
1968*53ee8cc1Swenshuai.xi                     && isFirstEvent )
1969*53ee8cc1Swenshuai.xi             {
1970*53ee8cc1Swenshuai.xi                 if ( PortStatus & USB_PORT_STAT_CONNECTION )
1971*53ee8cc1Swenshuai.xi                 {
1972*53ee8cc1Swenshuai.xi                     //if ( usb_get_connected_dev_state(&DevState, &DevClass) && (DevState < USB_STATE_CONFIGURED) )
1973*53ee8cc1Swenshuai.xi                     if ( usb_get_connected_dev_state(&DevState, &DevClass, gVar->p_UsbHcd) )
1974*53ee8cc1Swenshuai.xi                     {
1975*53ee8cc1Swenshuai.xi                         if (DevState < USB_STATE_CONFIGURED)
1976*53ee8cc1Swenshuai.xi                         {
1977*53ee8cc1Swenshuai.xi                             diag_printf("EX> Usb device no responding\n");
1978*53ee8cc1Swenshuai.xi                         }
1979*53ee8cc1Swenshuai.xi                         else
1980*53ee8cc1Swenshuai.xi                         {
1981*53ee8cc1Swenshuai.xi                             if (DevClass == 0x09)
1982*53ee8cc1Swenshuai.xi                             {
1983*53ee8cc1Swenshuai.xi                                 diag_printf("EX> External Hub is connected\n");
1984*53ee8cc1Swenshuai.xi                                 isExtHubConnect = TRUE;
1985*53ee8cc1Swenshuai.xi                             }
1986*53ee8cc1Swenshuai.xi                             else
1987*53ee8cc1Swenshuai.xi                             {
1988*53ee8cc1Swenshuai.xi                                 diag_printf("EX> Usb device not supported\n");
1989*53ee8cc1Swenshuai.xi                                 if ( _DrvUSB_CBFun != NULL )
1990*53ee8cc1Swenshuai.xi                                     _DrvUSB_CBFun(USB_PLUG_IN, USB_EVENT_DEV_TYPE_UNKNOW, NULL);
1991*53ee8cc1Swenshuai.xi                             }
1992*53ee8cc1Swenshuai.xi                         }
1993*53ee8cc1Swenshuai.xi                     }
1994*53ee8cc1Swenshuai.xi                 }
1995*53ee8cc1Swenshuai.xi 
1996*53ee8cc1Swenshuai.xi             }
1997*53ee8cc1Swenshuai.xi 
1998*53ee8cc1Swenshuai.xi             #if USBC_IP_SUPPORT // USBC IP control
1999*53ee8cc1Swenshuai.xi             if ((pCurrentChip->usbc_ip[gVar->portNum].portNum == gVar->portNum) && (pCurrentChip->usbc_ip[gVar->portNum].eventFlag))
2000*53ee8cc1Swenshuai.xi                     if ( PortStatus & USB_PORT_STAT_CONNECTION)
2001*53ee8cc1Swenshuai.xi                         if (_DrvUSBC_CBFun)
2002*53ee8cc1Swenshuai.xi                         {
2003*53ee8cc1Swenshuai.xi                             if (pCurrentChip->usbc_ip[gVar->portNum].eventType)
2004*53ee8cc1Swenshuai.xi                                 _DrvUSBC_CBFun(USBC_NON_OVER_CURRENT, gVar->portNum, NULL);
2005*53ee8cc1Swenshuai.xi                             else
2006*53ee8cc1Swenshuai.xi                                 _DrvUSBC_CBFun(USBC_OVER_CURRENT, gVar->portNum, NULL);
2007*53ee8cc1Swenshuai.xi                             pCurrentChip->usbc_ip[gVar->portNum].eventFlag = 0;
2008*53ee8cc1Swenshuai.xi                         }
2009*53ee8cc1Swenshuai.xi             #endif
2010*53ee8cc1Swenshuai.xi 
2011*53ee8cc1Swenshuai.xi             //MsOS_DelayTask(1000);
2012*53ee8cc1Swenshuai.xi         }
2013*53ee8cc1Swenshuai.xi 
2014*53ee8cc1Swenshuai.xi PORT_DISCONNECT_EX:
2015*53ee8cc1Swenshuai.xi         diag_printf("USB port %d disconnect\n", gVar->portNum);
2016*53ee8cc1Swenshuai.xi         MsOS_DelayTask(600);  //By Jonas! for hub event!
2017*53ee8cc1Swenshuai.xi         hub_poll_EX(gVar); //for disconnect hub event
2018*53ee8cc1Swenshuai.xi 
2019*53ee8cc1Swenshuai.xi         #if USB_HID_SUPPORT
2020*53ee8cc1Swenshuai.xi         for (ii=0; ii<MAX_HID_DEV_COUNT; ii++)
2021*53ee8cc1Swenshuai.xi         {
2022*53ee8cc1Swenshuai.xi             for (jj=0; jj<MAX_HID_INTF_COUNT; jj++)		//find the interface index
2023*53ee8cc1Swenshuai.xi             {
2024*53ee8cc1Swenshuai.xi                 if (Is_Hid_Dev_Info_Valid_EX(ii,jj))
2025*53ee8cc1Swenshuai.xi                 {
2026*53ee8cc1Swenshuai.xi                     if (HID_us[ii][jj]->pusb_dev->bus->hcpriv == cpe_ehci_dev_Port2.dev.driver_data)
2027*53ee8cc1Swenshuai.xi                     {
2028*53ee8cc1Swenshuai.xi                         diag_printf("Set HID Port(%d) Intf(%d) not init\n", ii, jj);
2029*53ee8cc1Swenshuai.xi                         Set_Hid_Dev_Init_EX(ii, jj, FALSE);
2030*53ee8cc1Swenshuai.xi                     }
2031*53ee8cc1Swenshuai.xi                 }
2032*53ee8cc1Swenshuai.xi             }
2033*53ee8cc1Swenshuai.xi         }
2034*53ee8cc1Swenshuai.xi         #endif
2035*53ee8cc1Swenshuai.xi 
2036*53ee8cc1Swenshuai.xi         #if USB_HID_SUPPORT
2037*53ee8cc1Swenshuai.xi         if (isHIDPlugIn)
2038*53ee8cc1Swenshuai.xi         {
2039*53ee8cc1Swenshuai.xi             diag_printf("HID plug out\n");
2040*53ee8cc1Swenshuai.xi             if ( _DrvUSB_CBFun != NULL )
2041*53ee8cc1Swenshuai.xi                 _DrvUSB_CBFun(USB_PLUG_OUT, USB_EVENT_DEV_TYPE_HID, NULL);
2042*53ee8cc1Swenshuai.xi         }
2043*53ee8cc1Swenshuai.xi         #endif
2044*53ee8cc1Swenshuai.xi         //if get any Hub device, enter Hub handler
2045*53ee8cc1Swenshuai.xi 
2046*53ee8cc1Swenshuai.xi         //if get any MSC device, enter MSC handler
2047*53ee8cc1Swenshuai.xi 
2048*53ee8cc1Swenshuai.xi         //device is disconnected
2049*53ee8cc1Swenshuai.xi 
2050*53ee8cc1Swenshuai.xi         USBCriticalSectionIn(gVar->portNum);
2051*53ee8cc1Swenshuai.xi         ResetMstarUsb(ehci);
2052*53ee8cc1Swenshuai.xi         USBCriticalSectionOut(gVar->portNum);
2053*53ee8cc1Swenshuai.xi 
2054*53ee8cc1Swenshuai.xi     }
2055*53ee8cc1Swenshuai.xi }
2056*53ee8cc1Swenshuai.xi 
Create_USB_Mutex(U8 port)2057*53ee8cc1Swenshuai.xi S32 Create_USB_Mutex(U8 port)
2058*53ee8cc1Swenshuai.xi {
2059*53ee8cc1Swenshuai.xi     S32 temp = -1;
2060*53ee8cc1Swenshuai.xi 
2061*53ee8cc1Swenshuai.xi     if (port == 0)
2062*53ee8cc1Swenshuai.xi         temp = _s32MutexUSB = MsOS_CreateMutex(E_MSOS_FIFO, "USB_MUTEX", MSOS_PROCESS_SHARED);
2063*53ee8cc1Swenshuai.xi     else if (port == 2)
2064*53ee8cc1Swenshuai.xi        temp =  _s32MutexUSB_Port2 = MsOS_CreateMutex(E_MSOS_FIFO, "USB_MUTEX_PORT2", MSOS_PROCESS_SHARED);
2065*53ee8cc1Swenshuai.xi     else if (port == 1)
2066*53ee8cc1Swenshuai.xi         temp = _s32MutexUSB_Port1 = MsOS_CreateMutex(E_MSOS_FIFO, "USB_MUTEX_PORT1", MSOS_PROCESS_SHARED);
2067*53ee8cc1Swenshuai.xi     else if (port == 3)
2068*53ee8cc1Swenshuai.xi         temp = _s32MutexUSB_Port3 = MsOS_CreateMutex(E_MSOS_FIFO, "USB_MUTEX_PORT3", MSOS_PROCESS_SHARED);
2069*53ee8cc1Swenshuai.xi     return temp;
2070*53ee8cc1Swenshuai.xi }
2071*53ee8cc1Swenshuai.xi 
Delete_USB_Mutex(U8 port)2072*53ee8cc1Swenshuai.xi void Delete_USB_Mutex(U8 port)
2073*53ee8cc1Swenshuai.xi {
2074*53ee8cc1Swenshuai.xi     if (port == 0)
2075*53ee8cc1Swenshuai.xi         MsOS_DeleteMutex(_s32MutexUSB);
2076*53ee8cc1Swenshuai.xi     else if (port == 2)
2077*53ee8cc1Swenshuai.xi        MsOS_DeleteMutex(_s32MutexUSB_Port2);
2078*53ee8cc1Swenshuai.xi     else if (port == 1)
2079*53ee8cc1Swenshuai.xi         MsOS_DeleteMutex(_s32MutexUSB_Port1);
2080*53ee8cc1Swenshuai.xi     else if (port == 3)
2081*53ee8cc1Swenshuai.xi         MsOS_DeleteMutex(_s32MutexUSB_Port3);
2082*53ee8cc1Swenshuai.xi }
2083*53ee8cc1Swenshuai.xi 
USB_Start_EX(struct s_gVar4UsbPort * gVar)2084*53ee8cc1Swenshuai.xi void USB_Start_EX(struct s_gVar4UsbPort *gVar)
2085*53ee8cc1Swenshuai.xi {
2086*53ee8cc1Swenshuai.xi #ifndef  MS_NOSAPI
2087*53ee8cc1Swenshuai.xi     MS_U8 *HubStack;
2088*53ee8cc1Swenshuai.xi     int pid;
2089*53ee8cc1Swenshuai.xi #endif
2090*53ee8cc1Swenshuai.xi 
2091*53ee8cc1Swenshuai.xi     diag_printf("\nUsb start EX..., gVar = %x\n\n", gVar);
2092*53ee8cc1Swenshuai.xi 
2093*53ee8cc1Swenshuai.xi #ifndef  MS_NOSAPI
2094*53ee8cc1Swenshuai.xi     HubStack = gVar->u8pHubStackBuffer;
2095*53ee8cc1Swenshuai.xi 
2096*53ee8cc1Swenshuai.xi     if (Create_USB_Mutex(gVar->portNum) < 0)
2097*53ee8cc1Swenshuai.xi     {
2098*53ee8cc1Swenshuai.xi         GEN_EXCEP;
2099*53ee8cc1Swenshuai.xi         return;
2100*53ee8cc1Swenshuai.xi     }
2101*53ee8cc1Swenshuai.xi 
2102*53ee8cc1Swenshuai.xi     //Create Task
2103*53ee8cc1Swenshuai.xi     pid = MsOS_CreateTask((TaskEntry) UsbTask_EX,
2104*53ee8cc1Swenshuai.xi                          (MS_U32)gVar,
2105*53ee8cc1Swenshuai.xi                          E_TASK_PRI_HIGH,
2106*53ee8cc1Swenshuai.xi                          TRUE,
2107*53ee8cc1Swenshuai.xi                          HubStack,
2108*53ee8cc1Swenshuai.xi                          HUB_STACK_SIZE,
2109*53ee8cc1Swenshuai.xi                          gVar->name);
2110*53ee8cc1Swenshuai.xi     if (pid < 0)
2111*53ee8cc1Swenshuai.xi     {
2112*53ee8cc1Swenshuai.xi         GEN_EXCEP;
2113*53ee8cc1Swenshuai.xi         Delete_USB_Mutex(gVar->portNum);
2114*53ee8cc1Swenshuai.xi         return;
2115*53ee8cc1Swenshuai.xi     }
2116*53ee8cc1Swenshuai.xi #else
2117*53ee8cc1Swenshuai.xi     //UsbTask();
2118*53ee8cc1Swenshuai.xi #endif //MS_NOSAPI
2119*53ee8cc1Swenshuai.xi }
2120*53ee8cc1Swenshuai.xi 
2121*53ee8cc1Swenshuai.xi extern int __init ehci_cpe_dev_init_EX(struct cpe_dev * dev);
2122*53ee8cc1Swenshuai.xi extern struct list_head hub_event_list;
2123*53ee8cc1Swenshuai.xi extern int __init ehci_hcd_cpe_driver_init_EX(void);
MDrv_USB_Port_Init_EX(MS_U8 u8PortNum)2124*53ee8cc1Swenshuai.xi MS_BOOL MDrv_USB_Port_Init_EX(MS_U8 u8PortNum)
2125*53ee8cc1Swenshuai.xi {
2126*53ee8cc1Swenshuai.xi     struct s_ChipUsbHostDef *pChip = pCurrentChip;
2127*53ee8cc1Swenshuai.xi 
2128*53ee8cc1Swenshuai.xi     if (pChip->nRootHub <= u8PortNum)
2129*53ee8cc1Swenshuai.xi     {
2130*53ee8cc1Swenshuai.xi         diag_printf("Chip %s does not not support port %d\n", pChip->name, u8PortNum);
2131*53ee8cc1Swenshuai.xi         return FALSE;
2132*53ee8cc1Swenshuai.xi     }
2133*53ee8cc1Swenshuai.xi     else
2134*53ee8cc1Swenshuai.xi     {
2135*53ee8cc1Swenshuai.xi         diag_printf("Init chip %s, port %d\n", pChip->name, u8PortNum);
2136*53ee8cc1Swenshuai.xi         // bind chip reg definition with cpe_dev
2137*53ee8cc1Swenshuai.xi         pChip->p_roothub[u8PortNum]->cpe_ehci_dev.mapbase = pChip->reg[u8PortNum].baseUHC;
2138*53ee8cc1Swenshuai.xi         pChip->p_roothub[u8PortNum]->cpe_ehci_dev.utmibase = pChip->reg[u8PortNum].baseUTMI;
2139*53ee8cc1Swenshuai.xi         pChip->p_roothub[u8PortNum]->cpe_ehci_dev.usbcbase = pChip->reg[u8PortNum].baseUSBC;
2140*53ee8cc1Swenshuai.xi         pChip->p_roothub[u8PortNum]->cpe_ehci_dev.intNum = pChip->reg[u8PortNum].uhcIRQ;
2141*53ee8cc1Swenshuai.xi         if (u8PortNum == 0)
2142*53ee8cc1Swenshuai.xi             pChip->p_roothub[u8PortNum]->p_hub_event = &hub_event_list;
2143*53ee8cc1Swenshuai.xi         else if (u8PortNum == 1)
2144*53ee8cc1Swenshuai.xi             pChip->p_roothub[u8PortNum]->p_hub_event = &hub_event_list_Port1;
2145*53ee8cc1Swenshuai.xi         else if (u8PortNum == 2)
2146*53ee8cc1Swenshuai.xi             pChip->p_roothub[u8PortNum]->p_hub_event = &hub_event_list_Port2;
2147*53ee8cc1Swenshuai.xi         else if (u8PortNum == 3)
2148*53ee8cc1Swenshuai.xi             pChip->p_roothub[u8PortNum]->p_hub_event = &hub_event_list_Port3;
2149*53ee8cc1Swenshuai.xi     }
2150*53ee8cc1Swenshuai.xi 
2151*53ee8cc1Swenshuai.xi     // do Usb Host initial
2152*53ee8cc1Swenshuai.xi     U4_series_usb_init(pChip->reg[u8PortNum].baseUTMI, pChip->reg[u8PortNum].baseUSBC, pChip->reg[u8PortNum].baseUHC, pChip->reg[u8PortNum].iFlag);
2153*53ee8cc1Swenshuai.xi 
2154*53ee8cc1Swenshuai.xi     //ehci_hcd_cpe_driver_init_EX(); // register cpe_driver
2155*53ee8cc1Swenshuai.xi 
2156*53ee8cc1Swenshuai.xi     ehci_cpe_dev_init_EX(&pChip->p_roothub[u8PortNum]->cpe_ehci_dev); // initial cpe_dev
2157*53ee8cc1Swenshuai.xi     if (pChip->p_roothub[u8PortNum]->cpe_ehci_dev.dev.driver_data == NULL)
2158*53ee8cc1Swenshuai.xi     {
2159*53ee8cc1Swenshuai.xi         diag_printf("port %d hcd not allocated!!!\n", u8PortNum);
2160*53ee8cc1Swenshuai.xi         return FALSE;
2161*53ee8cc1Swenshuai.xi     }
2162*53ee8cc1Swenshuai.xi     pChip->p_roothub[u8PortNum]->p_UsbHcd = pChip->p_roothub[u8PortNum]->cpe_ehci_dev.dev.driver_data; // for MDrv_UsbDeviceConnect()
2163*53ee8cc1Swenshuai.xi 
2164*53ee8cc1Swenshuai.xi     USB_Start_EX(pChip->p_roothub[u8PortNum]);
2165*53ee8cc1Swenshuai.xi 
2166*53ee8cc1Swenshuai.xi     return TRUE;
2167*53ee8cc1Swenshuai.xi }
2168*53ee8cc1Swenshuai.xi 
2169*53ee8cc1Swenshuai.xi extern struct usb_hcd *g_pUsbHcd_Port2;
msc_get_hcd(U8 host_id)2170*53ee8cc1Swenshuai.xi struct usb_hcd *msc_get_hcd(U8 host_id)
2171*53ee8cc1Swenshuai.xi {
2172*53ee8cc1Swenshuai.xi     if ( (MDrv_USBGetChipID()== CHIPID_KRONUS) || (MDrv_USBGetChipID()== CHIPID_URANUS4))
2173*53ee8cc1Swenshuai.xi     {
2174*53ee8cc1Swenshuai.xi         if (host_id == 0)
2175*53ee8cc1Swenshuai.xi             return g_pUsbHcd;
2176*53ee8cc1Swenshuai.xi         else
2177*53ee8cc1Swenshuai.xi             return g_pUsbHcd_Port2;
2178*53ee8cc1Swenshuai.xi     }
2179*53ee8cc1Swenshuai.xi     else
2180*53ee8cc1Swenshuai.xi     {
2181*53ee8cc1Swenshuai.xi         return pCurrentChip->p_roothub[host_id]->p_UsbHcd;
2182*53ee8cc1Swenshuai.xi     }
2183*53ee8cc1Swenshuai.xi }
2184*53ee8cc1Swenshuai.xi 
2185*53ee8cc1Swenshuai.xi extern void init_usbc_intr(MS_U8 p);
MDrv_OverCurrentDetect_RegisterCallBack(USBCallback pCallbackFn,MS_U8 port_mask)2186*53ee8cc1Swenshuai.xi void MDrv_OverCurrentDetect_RegisterCallBack (USBCallback pCallbackFn, MS_U8 port_mask)
2187*53ee8cc1Swenshuai.xi {
2188*53ee8cc1Swenshuai.xi #if USBC_IP_SUPPORT // USBC IP control
2189*53ee8cc1Swenshuai.xi     struct s_ChipUsbHostDef *pChip = pCurrentChip;
2190*53ee8cc1Swenshuai.xi     MS_U8 p;
2191*53ee8cc1Swenshuai.xi 
2192*53ee8cc1Swenshuai.xi     diag_printf("<MDrv_OverCurrentDetect_RegisterCallBack> %p, port_mask(%x)\n", pCallbackFn, port_mask);
2193*53ee8cc1Swenshuai.xi     _DrvUSBC_CBFun = pCallbackFn;
2194*53ee8cc1Swenshuai.xi     for (p = 0; p < pChip->nRootHub; p++)
2195*53ee8cc1Swenshuai.xi         if (port_mask & (1<<p))
2196*53ee8cc1Swenshuai.xi             init_usbc_intr(p);
2197*53ee8cc1Swenshuai.xi #else
2198*53ee8cc1Swenshuai.xi     diag_printf("<MDrv_OverCurrentDetect_RegisterCallBack> NOT support!!! Please turn on USBC_IP_SUPPORT in drvUSB.h\n");
2199*53ee8cc1Swenshuai.xi #endif
2200*53ee8cc1Swenshuai.xi }
2201