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 #if defined(MSOS_TYPE_NOS)
79*53ee8cc1Swenshuai.xi #include "../USBHostConfig.h"
80*53ee8cc1Swenshuai.xi #include "../../include/datatype.h"
81*53ee8cc1Swenshuai.xi #include "../drvHost200.h"
82*53ee8cc1Swenshuai.xi #include "../drvHostLib.h"
83*53ee8cc1Swenshuai.xi #include "../drvUsbMain.h"
84*53ee8cc1Swenshuai.xi
85*53ee8cc1Swenshuai.xi #include "../../include/_drvUSB.h"
86*53ee8cc1Swenshuai.xi #include "../../include/hal_arch.h"
87*53ee8cc1Swenshuai.xi #include "../../include/hal_cache.h"
88*53ee8cc1Swenshuai.xi #include <string.h>
89*53ee8cc1Swenshuai.xi #include "../drvHostLib.h"
90*53ee8cc1Swenshuai.xi #include "../drvscsi.h"
91*53ee8cc1Swenshuai.xi
92*53ee8cc1Swenshuai.xi #include "MsCommon.h"
93*53ee8cc1Swenshuai.xi #include "MsIRQ.h"
94*53ee8cc1Swenshuai.xi #include "MsOS.h"
95*53ee8cc1Swenshuai.xi
96*53ee8cc1Swenshuai.xi #define USB_HID_INT_DBG(x) // x
97*53ee8cc1Swenshuai.xi #define USB_HID_INT_MSG(x) MS_CRITICAL_MSG(x)
98*53ee8cc1Swenshuai.xi
99*53ee8cc1Swenshuai.xi extern void msAPI_Timer_ResetWDT(void);
100*53ee8cc1Swenshuai.xi
101*53ee8cc1Swenshuai.xi #define FRAME_LIST_SIZE (256*4)
102*53ee8cc1Swenshuai.xi
103*53ee8cc1Swenshuai.xi Periodic_Frame_List_Structure Host20_FramList __attribute__ ((aligned (4096)));
104*53ee8cc1Swenshuai.xi Periodic_Frame_List_Structure *pHost20_FramList;
105*53ee8cc1Swenshuai.xi qHD_Structure Host20_qHD_List_Intr __attribute__ ((aligned (32)));
106*53ee8cc1Swenshuai.xi qHD_Structure *pHost20_qHD_List_Intr;
107*53ee8cc1Swenshuai.xi extern Host20_Attach_Device_Structure sAttachDevice;
108*53ee8cc1Swenshuai.xi extern UINT8 gSpeed;
109*53ee8cc1Swenshuai.xi extern U8 gUsbStatus;
110*53ee8cc1Swenshuai.xi
111*53ee8cc1Swenshuai.xi extern UINT8 flib_Host20_CheckingForResult_QHD(qHD_Structure *spTempqHD);
112*53ee8cc1Swenshuai.xi extern void ResetUsbHardware(void);
113*53ee8cc1Swenshuai.xi extern U8 usb_temp_buf[Scsi_Max_Transfer_Len];
114*53ee8cc1Swenshuai.xi
SetFrameList(UINT8 i)115*53ee8cc1Swenshuai.xi void SetFrameList(UINT8 i)
116*53ee8cc1Swenshuai.xi {
117*53ee8cc1Swenshuai.xi pHost20_FramList->sCell[i].bTerminal=0;
118*53ee8cc1Swenshuai.xi pHost20_FramList->sCell[i].bType=HOST20_HD_Type_QH;
119*53ee8cc1Swenshuai.xi //SetPointer(&(Host20_FramList.sCell[i].bLinkPointer3),VirtoPhyAddr((UINT16)pHost20_qHD_List_Intr));
120*53ee8cc1Swenshuai.xi pHost20_FramList->sCell[i].bLinkPointer = (VirtoPhyAddr((U32)pHost20_qHD_List_Intr)>>5);
121*53ee8cc1Swenshuai.xi }
122*53ee8cc1Swenshuai.xi
123*53ee8cc1Swenshuai.xi //====================================================================
124*53ee8cc1Swenshuai.xi // * Function Name: flib_Host20_Interrupt_Init
125*53ee8cc1Swenshuai.xi // * Description:
126*53ee8cc1Swenshuai.xi // //Reserve=> <1>.If Periodic Enable => Disable Periodic
127*53ee8cc1Swenshuai.xi // <2>.Disable all the Frame List (Terminal=1)
128*53ee8cc1Swenshuai.xi // <3>.Hang the Interrupt-qHD-1 to Frame List
129*53ee8cc1Swenshuai.xi //
130*53ee8cc1Swenshuai.xi // * Input: wInterval=1~16 => Full Speed => 1ms ~ 32 sec
131*53ee8cc1Swenshuai.xi // High Speed => 125us ~ 40.96 sec
132*53ee8cc1Swenshuai.xi // * OutPut:
133*53ee8cc1Swenshuai.xi //====================================================================
flib_Host20_Interrupt_Init(UINT8 bAddr)134*53ee8cc1Swenshuai.xi void flib_Host20_Interrupt_Init(UINT8 bAddr)
135*53ee8cc1Swenshuai.xi {
136*53ee8cc1Swenshuai.xi UINT32 i,j;
137*53ee8cc1Swenshuai.xi // UINT32 wSize;
138*53ee8cc1Swenshuai.xi UINT8 *pData;
139*53ee8cc1Swenshuai.xi //UINT16 wForceInterval=0;
140*53ee8cc1Swenshuai.xi UINT8 EndPaddr;
141*53ee8cc1Swenshuai.xi //struct usb_interface_descriptor *ip;
142*53ee8cc1Swenshuai.xi
143*53ee8cc1Swenshuai.xi // ip=&dev->config.if_desc[0];
144*53ee8cc1Swenshuai.xi
145*53ee8cc1Swenshuai.xi //<1>.Disable the Periodic
146*53ee8cc1Swenshuai.xi flib_Host20_Periodic_Setting(HOST20_Disable);
147*53ee8cc1Swenshuai.xi
148*53ee8cc1Swenshuai.xi //<2>.Init qHD for Interrupt(7~9) Scan the ED
149*53ee8cc1Swenshuai.xi
150*53ee8cc1Swenshuai.xi mbHost20_USBCMD_FrameListSize_Set(HOST20_USBCMD_FrameListSize_256);
151*53ee8cc1Swenshuai.xi pHost20_qHD_List_Intr=(qHD_Structure*)KSEG02KSEG1(&Host20_qHD_List_Intr);
152*53ee8cc1Swenshuai.xi pHost20_FramList = (Periodic_Frame_List_Structure*) KSEG02KSEG1(&Host20_FramList);
153*53ee8cc1Swenshuai.xi //printf("pHost20_qHD_List_Intr: %X\n", pHost20_qHD_List_Intr);
154*53ee8cc1Swenshuai.xi MY_HAL_DCACHE_FLUSH((U32)&Host20_qHD_List_Intr, sizeof(qHD_Structure));
155*53ee8cc1Swenshuai.xi MY_HAL_DCACHE_FLUSH((U32)&Host20_FramList, sizeof(Periodic_Frame_List_Structure));
156*53ee8cc1Swenshuai.xi
157*53ee8cc1Swenshuai.xi pData=(UINT8*)pHost20_qHD_List_Intr;
158*53ee8cc1Swenshuai.xi for (j=0;j<sizeof(qHD_Structure);j++)
159*53ee8cc1Swenshuai.xi *(pData+j)=0;
160*53ee8cc1Swenshuai.xi
161*53ee8cc1Swenshuai.xi // printf("battribute:%02bx\n", sAttachDevice.saCD[0].sInterface[0].sED[0].bED_bmAttributes);
162*53ee8cc1Swenshuai.xi EndPaddr= sAttachDevice.saCD[0].sInterface[0].sED[0].bED_EndpointAddress & 0x7f;
163*53ee8cc1Swenshuai.xi USB_HID_INT_DBG(printf("interrupt addr:%02x\n",EndPaddr));
164*53ee8cc1Swenshuai.xi flib_Host20_Allocate_QHD(pHost20_qHD_List_Intr,HOST20_HD_Type_QH,bAddr,0,EndPaddr,8);//Address=0,Head=1,EndPt=0,Size
165*53ee8cc1Swenshuai.xi
166*53ee8cc1Swenshuai.xi pHost20_qHD_List_Intr->bHighBandwidth=1;
167*53ee8cc1Swenshuai.xi pHost20_qHD_List_Intr->bInterruptScheduleMask=1;
168*53ee8cc1Swenshuai.xi pHost20_qHD_List_Intr->bEdSpeed= gSpeed;
169*53ee8cc1Swenshuai.xi pHost20_qHD_List_Intr->bDataToggleControl=0;
170*53ee8cc1Swenshuai.xi
171*53ee8cc1Swenshuai.xi //SetPointer(&(pHost20_qHD_List_Intr->bNextQHDPointer3),VirtoPhyAddr((UINT16)pHost20_qHD_List_Intr));
172*53ee8cc1Swenshuai.xi pHost20_qHD_List_Intr->bNextQHDPointer=(VirtoPhyAddr((U32)pHost20_qHD_List_Intr)>>5);
173*53ee8cc1Swenshuai.xi
174*53ee8cc1Swenshuai.xi //pHost20_qHD_List_Control1->bNextQHDPointer=(((U32)pHost20_qHD_List_Intr)>>5);
175*53ee8cc1Swenshuai.xi //pHost20_qHD_List_Intr->bNextQHDPointer=(((U32)pHost20_qHD_List_Control0)>>5);
176*53ee8cc1Swenshuai.xi
177*53ee8cc1Swenshuai.xi // pHost20_qHD_List_Intr->bNextQHDPointer=(((UINT32)pHost20_qHD_List_Intr)>>5); //point to itself
178*53ee8cc1Swenshuai.xi pHost20_qHD_List_Intr->bTerminate=1; //terminated
179*53ee8cc1Swenshuai.xi
180*53ee8cc1Swenshuai.xi
181*53ee8cc1Swenshuai.xi // psHost20_FramList=&Host20_FramList;
182*53ee8cc1Swenshuai.xi //<3>.Link qHD to the FameListCell by wInterval
183*53ee8cc1Swenshuai.xi // printf("clear frame list data \n");
184*53ee8cc1Swenshuai.xi
185*53ee8cc1Swenshuai.xi pData=(UINT8 *)pHost20_FramList;
186*53ee8cc1Swenshuai.xi for (j=0;j<sizeof(Periodic_Frame_List_Structure);j++)
187*53ee8cc1Swenshuai.xi *(pData+j)=0;
188*53ee8cc1Swenshuai.xi
189*53ee8cc1Swenshuai.xi // printf("OK\n");
190*53ee8cc1Swenshuai.xi
191*53ee8cc1Swenshuai.xi for (i=0;i< Host20_Preiodic_Frame_List_MAX ;i++)
192*53ee8cc1Swenshuai.xi pHost20_FramList->sCell[i].bTerminal=1;
193*53ee8cc1Swenshuai.xi //Find the Interval-X
194*53ee8cc1Swenshuai.xi // Host20_FramList.sCell[0].bLinkPointer=((UINT32)(pHost20_qHD_List_Intr))>>5;
195*53ee8cc1Swenshuai.xi
196*53ee8cc1Swenshuai.xi
197*53ee8cc1Swenshuai.xi SetFrameList(0);
198*53ee8cc1Swenshuai.xi SetFrameList(50);
199*53ee8cc1Swenshuai.xi SetFrameList(100);
200*53ee8cc1Swenshuai.xi SetFrameList(150);
201*53ee8cc1Swenshuai.xi SetFrameList(200);
202*53ee8cc1Swenshuai.xi
203*53ee8cc1Swenshuai.xi
204*53ee8cc1Swenshuai.xi // printf("FrameList:%x\n",FRAME_LIST_DATA);
205*53ee8cc1Swenshuai.xi // printf("first QH:%lx\n",VirtoPhyAddr((UINT16)pHost20_qHD_List_Intr));
206*53ee8cc1Swenshuai.xi
207*53ee8cc1Swenshuai.xi //while (1){}
208*53ee8cc1Swenshuai.xi #if 0
209*53ee8cc1Swenshuai.xi x=0;
210*53ee8cc1Swenshuai.xi while(waIntervalMap[x]<wForceInterval)
211*53ee8cc1Swenshuai.xi {
212*53ee8cc1Swenshuai.xi x++;
213*53ee8cc1Swenshuai.xi if (x>10)
214*53ee8cc1Swenshuai.xi {
215*53ee8cc1Swenshuai.xi printf("Interval Input Error...\n");
216*53ee8cc1Swenshuai.xi return;
217*53ee8cc1Swenshuai.xi }
218*53ee8cc1Swenshuai.xi };
219*53ee8cc1Swenshuai.xi
220*53ee8cc1Swenshuai.xi for (i=0;i<Host20_Preiodic_Frame_List_MAX;i=i+waIntervalMap[x])
221*53ee8cc1Swenshuai.xi {
222*53ee8cc1Swenshuai.xi Host20_FramList.sCell[i].bLinkPointer=((UINT32)(pHost20_qHD_List_Intr))>>5;
223*53ee8cc1Swenshuai.xi Host20_FramList.sCell[i].bTerminal=0;
224*53ee8cc1Swenshuai.xi Host20_FramList.sCell[i].bType=HOST20_HD_Type_QH;
225*53ee8cc1Swenshuai.xi }
226*53ee8cc1Swenshuai.xi #endif
227*53ee8cc1Swenshuai.xi
228*53ee8cc1Swenshuai.xi //<4>.Set Periodic Base Address
229*53ee8cc1Swenshuai.xi // printf("FrameListPhy:%lx\n",VirtoPhyAddr((UINT16)&Host20_FramList));
230*53ee8cc1Swenshuai.xi
231*53ee8cc1Swenshuai.xi USB_HID_INT_DBG(printf("pHost20_FramList: %lx\n", (U32)pHost20_FramList));
232*53ee8cc1Swenshuai.xi mwHost20_PeriodicBaseAddr_Set(VirtoPhyAddr((U32)pHost20_FramList));
233*53ee8cc1Swenshuai.xi
234*53ee8cc1Swenshuai.xi
235*53ee8cc1Swenshuai.xi //<5>.Enable the periodic
236*53ee8cc1Swenshuai.xi flib_Host20_Periodic_Setting(HOST20_Enable);
237*53ee8cc1Swenshuai.xi
238*53ee8cc1Swenshuai.xi }
239*53ee8cc1Swenshuai.xi //====================================================================
240*53ee8cc1Swenshuai.xi // * Function Name: flib_Host20_Periodic_Setting
241*53ee8cc1Swenshuai.xi // * Description:
242*53ee8cc1Swenshuai.xi // * Input:
243*53ee8cc1Swenshuai.xi // * OutPut:
244*53ee8cc1Swenshuai.xi //====================================================================
flib_Host20_Periodic_Setting(UINT8 bOption)245*53ee8cc1Swenshuai.xi void flib_Host20_Periodic_Setting(UINT8 bOption)
246*53ee8cc1Swenshuai.xi {
247*53ee8cc1Swenshuai.xi if (bOption==HOST20_Enable)
248*53ee8cc1Swenshuai.xi {
249*53ee8cc1Swenshuai.xi //<1>.If Already enable => return
250*53ee8cc1Swenshuai.xi if (mwHost20_USBSTS_PeriodicStatus_Rd()>0)
251*53ee8cc1Swenshuai.xi return ;
252*53ee8cc1Swenshuai.xi
253*53ee8cc1Swenshuai.xi //<2>.Disable Periodic
254*53ee8cc1Swenshuai.xi mbHost20_USBCMD_PeriodicEnable_Set();
255*53ee8cc1Swenshuai.xi
256*53ee8cc1Swenshuai.xi //<3>.Polling Status
257*53ee8cc1Swenshuai.xi // while(mwHost20_USBSTS_PeriodicStatus_Rd()==0);
258*53ee8cc1Swenshuai.xi
259*53ee8cc1Swenshuai.xi }
260*53ee8cc1Swenshuai.xi else if (bOption==HOST20_Disable)
261*53ee8cc1Swenshuai.xi {
262*53ee8cc1Swenshuai.xi //<1>.If Already Disable => return
263*53ee8cc1Swenshuai.xi if (mwHost20_USBSTS_PeriodicStatus_Rd()==0)
264*53ee8cc1Swenshuai.xi return ;
265*53ee8cc1Swenshuai.xi
266*53ee8cc1Swenshuai.xi //<2>.Enable Periodic
267*53ee8cc1Swenshuai.xi mbHost20_USBCMD_PeriodicEnable_Clr();
268*53ee8cc1Swenshuai.xi
269*53ee8cc1Swenshuai.xi //<3>.Polling Status
270*53ee8cc1Swenshuai.xi // while(mwHost20_USBSTS_PeriodicStatus_Rd()>0);
271*53ee8cc1Swenshuai.xi
272*53ee8cc1Swenshuai.xi }
273*53ee8cc1Swenshuai.xi // else
274*53ee8cc1Swenshuai.xi // {
275*53ee8cc1Swenshuai.xi // printf("??? Input Error 'flib_Host20_Periodic_Setting'...");
276*53ee8cc1Swenshuai.xi // }
277*53ee8cc1Swenshuai.xi }
278*53ee8cc1Swenshuai.xi
flib_Host20_Send_qTD2(qTD_Structure * spHeadqTD,qHD_Structure * spTempqHD,U16 wTimeOutSec)279*53ee8cc1Swenshuai.xi UINT8 flib_Host20_Send_qTD2(qTD_Structure *spHeadqTD ,qHD_Structure *spTempqHD,U16 wTimeOutSec)
280*53ee8cc1Swenshuai.xi {
281*53ee8cc1Swenshuai.xi UINT8 bExitLoop,bReturnValue;
282*53ee8cc1Swenshuai.xi qTD_Structure *spNewDumyqTD;
283*53ee8cc1Swenshuai.xi qTD_Structure *spOldDumyqTD;
284*53ee8cc1Swenshuai.xi qTD_Structure *spReleaseqTD;
285*53ee8cc1Swenshuai.xi qTD_Structure *spReleaseqTDNext;
286*53ee8cc1Swenshuai.xi qTD_Structure *spLastqTD;
287*53ee8cc1Swenshuai.xi //UINT32 wDummyTemp;
288*53ee8cc1Swenshuai.xi //UINT32 xdata *pwData;
289*53ee8cc1Swenshuai.xi #ifdef ATV_SERISE_USE
290*53ee8cc1Swenshuai.xi UINT32 wTimes;
291*53ee8cc1Swenshuai.xi UINT32 StartTime=0;
292*53ee8cc1Swenshuai.xi #else
293*53ee8cc1Swenshuai.xi UINT16 wTimes;
294*53ee8cc1Swenshuai.xi UINT32 StartTime;
295*53ee8cc1Swenshuai.xi UINT32 LastTime;
296*53ee8cc1Swenshuai.xi UINT16 FrameIdx=0;
297*53ee8cc1Swenshuai.xi
298*53ee8cc1Swenshuai.xi #endif
299*53ee8cc1Swenshuai.xi
300*53ee8cc1Swenshuai.xi #ifdef ATV_SERISE_USE
301*53ee8cc1Swenshuai.xi wTimeOutSec=wTimeOutSec;
302*53ee8cc1Swenshuai.xi #endif
303*53ee8cc1Swenshuai.xi
304*53ee8cc1Swenshuai.xi //if (wTimeOutSec==0)
305*53ee8cc1Swenshuai.xi //{
306*53ee8cc1Swenshuai.xi // DEBUG_USB(printf("error, timeout sec is zero\n"));
307*53ee8cc1Swenshuai.xi //}
308*53ee8cc1Swenshuai.xi spOldDumyqTD=(qTD_Structure*)PhytoVirAddr((( U32)(spTempqHD->bOverlay_NextqTD))<<5);
309*53ee8cc1Swenshuai.xi
310*53ee8cc1Swenshuai.xi //spTempqHD->bOverlay_Status|=HOST20_qTD_STATUS_Halted;
311*53ee8cc1Swenshuai.xi while (mbHost20_USBCMD_PeriodicEnable_Rd())
312*53ee8cc1Swenshuai.xi {
313*53ee8cc1Swenshuai.xi mbHost20_USBCMD_PeriodicEnable_Clr();
314*53ee8cc1Swenshuai.xi }
315*53ee8cc1Swenshuai.xi
316*53ee8cc1Swenshuai.xi //spHeadqTD->bTerminate=1; //set to terminate
317*53ee8cc1Swenshuai.xi memcpy(spOldDumyqTD,spHeadqTD,Host20_qTD_SIZE);
318*53ee8cc1Swenshuai.xi //spOldDumyqTD->bStatus_Halted=1;
319*53ee8cc1Swenshuai.xi
320*53ee8cc1Swenshuai.xi //spOldDumyqTD->bStatus_Active=0;
321*53ee8cc1Swenshuai.xi
322*53ee8cc1Swenshuai.xi //<2>.Prepare new dumy qTD
323*53ee8cc1Swenshuai.xi spNewDumyqTD=spHeadqTD;
324*53ee8cc1Swenshuai.xi memset((void *)spNewDumyqTD ,0, Host20_qTD_SIZE);
325*53ee8cc1Swenshuai.xi spNewDumyqTD->bTerminate=1;
326*53ee8cc1Swenshuai.xi //spNewDumyqTD->bAlternateTerminate=1;
327*53ee8cc1Swenshuai.xi //spNewDumyqTD->bStatus_Halted=1;
328*53ee8cc1Swenshuai.xi //<3>.Find spLastqTD & link spLastqTD to NewDumyqTD & Set NewDumyqTD->T=1
329*53ee8cc1Swenshuai.xi spLastqTD=spOldDumyqTD;
330*53ee8cc1Swenshuai.xi while(spLastqTD->bTerminate==0) {
331*53ee8cc1Swenshuai.xi spLastqTD=(qTD_Structure*)PhytoVirAddr((( U32)(spLastqTD->bNextQTDPointer))<<5);
332*53ee8cc1Swenshuai.xi
333*53ee8cc1Swenshuai.xi };
334*53ee8cc1Swenshuai.xi
335*53ee8cc1Swenshuai.xi spLastqTD->bNextQTDPointer=VirtoPhyAddr((U32)spNewDumyqTD)>>5;
336*53ee8cc1Swenshuai.xi
337*53ee8cc1Swenshuai.xi spLastqTD->bTerminate=0;
338*53ee8cc1Swenshuai.xi
339*53ee8cc1Swenshuai.xi //Link Alternate qTD pointer
340*53ee8cc1Swenshuai.xi spLastqTD->bAlternateQTDPointer=(VirtoPhyAddr(( U32)spNewDumyqTD)>>5);
341*53ee8cc1Swenshuai.xi
342*53ee8cc1Swenshuai.xi spLastqTD->bAlternateTerminate=0;
343*53ee8cc1Swenshuai.xi
344*53ee8cc1Swenshuai.xi
345*53ee8cc1Swenshuai.xi
346*53ee8cc1Swenshuai.xi //<4>.Set OldDumyqTD->Active=1
347*53ee8cc1Swenshuai.xi //gwLastqTDSendOK=0;
348*53ee8cc1Swenshuai.xi //sAttachDevice.psSendLastqTD=spLastqTD;
349*53ee8cc1Swenshuai.xi sAttachDevice.bSendStatusError=0;
350*53ee8cc1Swenshuai.xi
351*53ee8cc1Swenshuai.xi //Dump_QTD(spOldDumyqTD);
352*53ee8cc1Swenshuai.xi //Dump_QTD(spNewDumyqTD);
353*53ee8cc1Swenshuai.xi
354*53ee8cc1Swenshuai.xi while (mwHost20_USBSTS_Rd() & 0x3b)
355*53ee8cc1Swenshuai.xi {
356*53ee8cc1Swenshuai.xi mwHost20_USBSTS_Set(0x3b); //clear interrupt, don't clear port change int
357*53ee8cc1Swenshuai.xi }
358*53ee8cc1Swenshuai.xi //bExitLoop=0;
359*53ee8cc1Swenshuai.xi //spOldDumyqTD->bStatus_Halted=0;
360*53ee8cc1Swenshuai.xi //spOldDumyqTD->bStatus_Halted=0;
361*53ee8cc1Swenshuai.xi
362*53ee8cc1Swenshuai.xi #if 0
363*53ee8cc1Swenshuai.xi printf("spOldDumyqTD: %X\n", spOldDumyqTD);
364*53ee8cc1Swenshuai.xi printf("bTerminate: %X\n", spOldDumyqTD->bTerminate);
365*53ee8cc1Swenshuai.xi printf("bNextQTDPointer: %X\n", spOldDumyqTD->bNextQTDPointer);
366*53ee8cc1Swenshuai.xi printf("bAlternateTerminate: %X\n", spOldDumyqTD->bAlternateTerminate);
367*53ee8cc1Swenshuai.xi printf("bAlternateQTDPointer: %X\n", spOldDumyqTD->bAlternateQTDPointer);
368*53ee8cc1Swenshuai.xi printf("bStatus_PingState: %X\n", spOldDumyqTD->bStatus_PingState);
369*53ee8cc1Swenshuai.xi printf("bStatus_SplitState: %X\n", spOldDumyqTD->bStatus_SplitState);
370*53ee8cc1Swenshuai.xi printf("bStatus_MissMicroFrame: %X\n", spOldDumyqTD->bStatus_MissMicroFrame);
371*53ee8cc1Swenshuai.xi printf("bStatus_Transaction_Err: %X\n", spOldDumyqTD->bStatus_Transaction_Err);
372*53ee8cc1Swenshuai.xi printf("bStatus_Babble: %X\n", spOldDumyqTD->bStatus_Babble);
373*53ee8cc1Swenshuai.xi printf("bStatus_Buffer_Err: %X\n", spOldDumyqTD->bStatus_Buffer_Err);
374*53ee8cc1Swenshuai.xi printf("bStatus_Halted: %X\n", spOldDumyqTD->bStatus_Halted);
375*53ee8cc1Swenshuai.xi printf("bStatus_Active: %X\n", spOldDumyqTD->bStatus_Active);
376*53ee8cc1Swenshuai.xi printf("bPID: %X\n", spOldDumyqTD->bPID);
377*53ee8cc1Swenshuai.xi printf("bErrorCounter: %X\n", spOldDumyqTD->bErrorCounter);
378*53ee8cc1Swenshuai.xi printf("CurrentPage: %X\n", spOldDumyqTD->CurrentPage);
379*53ee8cc1Swenshuai.xi printf("bInterruptOnComplete: %X\n", spOldDumyqTD->bInterruptOnComplete);
380*53ee8cc1Swenshuai.xi printf("bTotalBytes: %X\n", spOldDumyqTD->bTotalBytes);
381*53ee8cc1Swenshuai.xi printf("bDataToggle: %X\n", spOldDumyqTD->bDataToggle);
382*53ee8cc1Swenshuai.xi printf("ArrayBufferPointer_Word: %X\n", spOldDumyqTD->ArrayBufferPointer_Word[0]);
383*53ee8cc1Swenshuai.xi #endif
384*53ee8cc1Swenshuai.xi //flib_Host20_StopRun_Setting(HOST20_Enable);
385*53ee8cc1Swenshuai.xi //printf("RunStop: %X\n", mbHost20_USBCMD_RunStop_Rd());
386*53ee8cc1Swenshuai.xi spOldDumyqTD->bStatus_Active=1;
387*53ee8cc1Swenshuai.xi
388*53ee8cc1Swenshuai.xi while (mbHost20_USBCMD_PeriodicEnable_Rd()==0)
389*53ee8cc1Swenshuai.xi {
390*53ee8cc1Swenshuai.xi mbHost20_USBCMD_PeriodicEnable_Set();
391*53ee8cc1Swenshuai.xi }
392*53ee8cc1Swenshuai.xi //spTempqHD->bOverlay_Status&=~HOST20_qTD_STATUS_Halted;
393*53ee8cc1Swenshuai.xi
394*53ee8cc1Swenshuai.xi //wait until asynchronous scheduler is idle
395*53ee8cc1Swenshuai.xi
396*53ee8cc1Swenshuai.xi //mbHost20_USBCMD_RunStop_Set();
397*53ee8cc1Swenshuai.xi
398*53ee8cc1Swenshuai.xi //spTempqHD->bOverlay_Status&=~0x40; //clr HALT bit, start this queue head
399*53ee8cc1Swenshuai.xi //XBYTE[0x2410]|=1;//start run
400*53ee8cc1Swenshuai.xi //wDummyTemp=0;
401*53ee8cc1Swenshuai.xi wTimes=0;
402*53ee8cc1Swenshuai.xi #ifndef ATV_SERISE_USE
403*53ee8cc1Swenshuai.xi StartTime=MsOS_GetSystemTime();
404*53ee8cc1Swenshuai.xi LastTime=StartTime;
405*53ee8cc1Swenshuai.xi FrameIdx=mwHost20_FrameIndex_Rd();
406*53ee8cc1Swenshuai.xi msAPI_Timer_ResetWDT();
407*53ee8cc1Swenshuai.xi #endif
408*53ee8cc1Swenshuai.xi //<5>.Waiting for result
409*53ee8cc1Swenshuai.xi //EAL=0;
410*53ee8cc1Swenshuai.xi while (1)
411*53ee8cc1Swenshuai.xi {
412*53ee8cc1Swenshuai.xi #ifdef ATV_SERISE_USE
413*53ee8cc1Swenshuai.xi wTimes++;
414*53ee8cc1Swenshuai.xi #endif
415*53ee8cc1Swenshuai.xi if ((spOldDumyqTD->bStatus_Active==0) &&
416*53ee8cc1Swenshuai.xi ( mwHost20_USBSTS_Rd()& HOST20_USBINTR_CompletionOfTransaction)) //wait until Status_Active become 0
417*53ee8cc1Swenshuai.xi {
418*53ee8cc1Swenshuai.xi bReturnValue=HOST20_OK;
419*53ee8cc1Swenshuai.xi
420*53ee8cc1Swenshuai.xi break;
421*53ee8cc1Swenshuai.xi //bExitLoop=1;
422*53ee8cc1Swenshuai.xi //printf("bReturn:%02bx\n", bReturnValue);
423*53ee8cc1Swenshuai.xi }
424*53ee8cc1Swenshuai.xi //if (bExitLoop) break;
425*53ee8cc1Swenshuai.xi #if 1
426*53ee8cc1Swenshuai.xi if (mwHost20_USBSTS_Rd()&(HOST20_USBINTR_SystemError+HOST20_USBINTR_USBError))
427*53ee8cc1Swenshuai.xi {
428*53ee8cc1Swenshuai.xi bReturnValue=HOST20_OK;
429*53ee8cc1Swenshuai.xi //if (spOldDumyqTD->bStatus_Active==1)
430*53ee8cc1Swenshuai.xi //{
431*53ee8cc1Swenshuai.xi // printf("something wrong..USBINTR:%02bx\n",mwHost20_USBSTS_Rd());
432*53ee8cc1Swenshuai.xi // printf("QH status:%02bx\n",spTempqHD->bOverlay_Status);
433*53ee8cc1Swenshuai.xi //}
434*53ee8cc1Swenshuai.xi break; //USB interrupt happened
435*53ee8cc1Swenshuai.xi }
436*53ee8cc1Swenshuai.xi #endif
437*53ee8cc1Swenshuai.xi #if 1
438*53ee8cc1Swenshuai.xi //if (gwOTG_Timer_Counter>wTimeOutSec)
439*53ee8cc1Swenshuai.xi // wTimes++;
440*53ee8cc1Swenshuai.xi //if (wTimes > wTimeOutSec*400)
441*53ee8cc1Swenshuai.xi if (mwHost20_PORTSC_ConnectStatus_Rd()==0)
442*53ee8cc1Swenshuai.xi {
443*53ee8cc1Swenshuai.xi //return HOST20_FATAL;
444*53ee8cc1Swenshuai.xi bReturnValue = HOST20_FATAL;
445*53ee8cc1Swenshuai.xi break;
446*53ee8cc1Swenshuai.xi }
447*53ee8cc1Swenshuai.xi //if (mwHost20_PORTSC_ConnectChange_Rd())
448*53ee8cc1Swenshuai.xi //{
449*53ee8cc1Swenshuai.xi // gDeviceFatalError=TRUE;
450*53ee8cc1Swenshuai.xi // mwHost20_PORTSC_ConnectChange_Set();
451*53ee8cc1Swenshuai.xi // return HOST20_FATAL; //usb has been plug out and in
452*53ee8cc1Swenshuai.xi //}
453*53ee8cc1Swenshuai.xi #ifndef ATV_SERISE_USE
454*53ee8cc1Swenshuai.xi #if 1
455*53ee8cc1Swenshuai.xi if (MsOS_Timer_DiffTimeFromNow(LastTime) >(U32)300) //over 1 mini sec
456*53ee8cc1Swenshuai.xi {
457*53ee8cc1Swenshuai.xi
458*53ee8cc1Swenshuai.xi if (mwHost20_FrameIndex_Rd()==FrameIdx)
459*53ee8cc1Swenshuai.xi {
460*53ee8cc1Swenshuai.xi USB_HID_INT_MSG(printf("1C stop,timeout !!\n"));
461*53ee8cc1Swenshuai.xi gUsbStatus=USB_TIMEOUT; //ESD , USB hang,should be timeout
462*53ee8cc1Swenshuai.xi bReturnValue=HOST20_FATAL;
463*53ee8cc1Swenshuai.xi break;
464*53ee8cc1Swenshuai.xi }
465*53ee8cc1Swenshuai.xi FrameIdx=mwHost20_FrameIndex_Rd();
466*53ee8cc1Swenshuai.xi LastTime=MsOS_GetSystemTime();
467*53ee8cc1Swenshuai.xi
468*53ee8cc1Swenshuai.xi }
469*53ee8cc1Swenshuai.xi #endif
470*53ee8cc1Swenshuai.xi if (MsOS_Timer_DiffTimeFromNow(StartTime) > (U32)wTimeOutSec *1000)
471*53ee8cc1Swenshuai.xi #else
472*53ee8cc1Swenshuai.xi if(wTimes>0x80000)
473*53ee8cc1Swenshuai.xi #endif
474*53ee8cc1Swenshuai.xi {
475*53ee8cc1Swenshuai.xi #if 0
476*53ee8cc1Swenshuai.xi printf("\nQH1:\n");
477*53ee8cc1Swenshuai.xi Dump_Data(0xf800,0x30);
478*53ee8cc1Swenshuai.xi printf("\nQH2:\n");
479*53ee8cc1Swenshuai.xi Dump_Data(0xf840,0x30);
480*53ee8cc1Swenshuai.xi printf("\nQH3:\n");
481*53ee8cc1Swenshuai.xi Dump_Data(0xf880,0x30);
482*53ee8cc1Swenshuai.xi printf("\nQH4:\n");
483*53ee8cc1Swenshuai.xi Dump_Data(0xf8c0,0x30);
484*53ee8cc1Swenshuai.xi printf("\n");
485*53ee8cc1Swenshuai.xi Dump_Data(0xfa80,0x20);
486*53ee8cc1Swenshuai.xi printf("\n");
487*53ee8cc1Swenshuai.xi Dump_Data(0xfb00,0x20);
488*53ee8cc1Swenshuai.xi printf("\n");
489*53ee8cc1Swenshuai.xi Dump_Data(0xfae0,0x20);
490*53ee8cc1Swenshuai.xi printf("\n");
491*53ee8cc1Swenshuai.xi Dump_Data(0xfaa0,0x20);
492*53ee8cc1Swenshuai.xi printf("\n");
493*53ee8cc1Swenshuai.xi Dump_Data(0xfac0,0x20);
494*53ee8cc1Swenshuai.xi
495*53ee8cc1Swenshuai.xi printf("\nQH->%x\n",(U16)spTempqHD);
496*53ee8cc1Swenshuai.xi //Dump_Data((U16)spTempqHD,0x30);
497*53ee8cc1Swenshuai.xi
498*53ee8cc1Swenshuai.xi printf("\nqtd->\n");
499*53ee8cc1Swenshuai.xi Dump_Data((U16)spOldDumyqTD,0x20);
500*53ee8cc1Swenshuai.xi printf("\nEHCI REG:\n");
501*53ee8cc1Swenshuai.xi Dump_Data(0x2400,0x50);
502*53ee8cc1Swenshuai.xi #endif
503*53ee8cc1Swenshuai.xi bExitLoop=2;
504*53ee8cc1Swenshuai.xi bReturnValue=HOST20_FATAL;
505*53ee8cc1Swenshuai.xi gUsbStatus=USB_TIMEOUT;
506*53ee8cc1Swenshuai.xi USB_HID_INT_MSG(printf("USB_TIMEOUT\n"));
507*53ee8cc1Swenshuai.xi //gDeviceFatalError=TRUE;
508*53ee8cc1Swenshuai.xi
509*53ee8cc1Swenshuai.xi //MINI_DEBUG2(printf("Time Out:%02bx\n",XBYTE[gUHC_BASE+30]));
510*53ee8cc1Swenshuai.xi break;
511*53ee8cc1Swenshuai.xi }
512*53ee8cc1Swenshuai.xi
513*53ee8cc1Swenshuai.xi #endif
514*53ee8cc1Swenshuai.xi //}
515*53ee8cc1Swenshuai.xi }
516*53ee8cc1Swenshuai.xi #ifndef ATV_SERISE_USE
517*53ee8cc1Swenshuai.xi msAPI_Timer_ResetWDT(); //in case spend too much time at polling
518*53ee8cc1Swenshuai.xi #endif
519*53ee8cc1Swenshuai.xi while (mbHost20_USBCMD_PeriodicEnable_Rd())
520*53ee8cc1Swenshuai.xi {
521*53ee8cc1Swenshuai.xi mbHost20_USBCMD_PeriodicEnable_Clr();
522*53ee8cc1Swenshuai.xi }
523*53ee8cc1Swenshuai.xi
524*53ee8cc1Swenshuai.xi //<6>.Checking the Result
525*53ee8cc1Swenshuai.xi if (bReturnValue!=HOST20_FATAL)
526*53ee8cc1Swenshuai.xi bReturnValue=flib_Host20_CheckingForResult_QHD(spTempqHD);
527*53ee8cc1Swenshuai.xi if (bReturnValue==HOST20_TRANSACTION_ERROR)
528*53ee8cc1Swenshuai.xi {
529*53ee8cc1Swenshuai.xi //printf("Transaction Error\n");
530*53ee8cc1Swenshuai.xi
531*53ee8cc1Swenshuai.xi spTempqHD->bOverlay_Status=0; //clear halt status
532*53ee8cc1Swenshuai.xi spTempqHD->bOverlay_CurrentqTD=VirtoPhyAddr((U32)spNewDumyqTD)>>5;
533*53ee8cc1Swenshuai.xi }
534*53ee8cc1Swenshuai.xi
535*53ee8cc1Swenshuai.xi //<5>.Release the all the qTD (Not include spNewDumyqTD)
536*53ee8cc1Swenshuai.xi #if 1
537*53ee8cc1Swenshuai.xi spReleaseqTD=spOldDumyqTD;
538*53ee8cc1Swenshuai.xi do {
539*53ee8cc1Swenshuai.xi //spReleaseqTDNext=((UINT32)(spReleaseqTD->bNextQTDPointerL))<<5 + ((UINT32)(spReleaseqTD->bNextQTDPointerH))<<16 ;
540*53ee8cc1Swenshuai.xi spReleaseqTDNext=(qTD_Structure*)PhytoVirAddr(((U32)(spReleaseqTD->bNextQTDPointer))<<5);
541*53ee8cc1Swenshuai.xi
542*53ee8cc1Swenshuai.xi flib_Host20_ReleaseStructure(Host20_MEM_TYPE_qTD,(U32)spReleaseqTD);
543*53ee8cc1Swenshuai.xi
544*53ee8cc1Swenshuai.xi spReleaseqTD=spReleaseqTDNext;
545*53ee8cc1Swenshuai.xi } while(((UINT32)spReleaseqTD)!=((UINT32)spNewDumyqTD));
546*53ee8cc1Swenshuai.xi #endif
547*53ee8cc1Swenshuai.xi
548*53ee8cc1Swenshuai.xi return (bReturnValue);
549*53ee8cc1Swenshuai.xi }
550*53ee8cc1Swenshuai.xi #if 1
551*53ee8cc1Swenshuai.xi //====================================================================
552*53ee8cc1Swenshuai.xi // * Function Name: flib_Host20_Issue_Interrupt
553*53ee8cc1Swenshuai.xi // * Description:
554*53ee8cc1Swenshuai.xi // * Input:
555*53ee8cc1Swenshuai.xi // * OutPut:
556*53ee8cc1Swenshuai.xi //====================================================================
flib_Host20_Issue_Interrupt(U32 buf,U32 hwSize)557*53ee8cc1Swenshuai.xi U8 flib_Host20_Issue_Interrupt(U32 buf,U32 hwSize)
558*53ee8cc1Swenshuai.xi {
559*53ee8cc1Swenshuai.xi qTD_Structure *spTempqTD;
560*53ee8cc1Swenshuai.xi U32 mybuf =0, workbuf;
561*53ee8cc1Swenshuai.xi U8 bResult;
562*53ee8cc1Swenshuai.xi
563*53ee8cc1Swenshuai.xi if ( buf !=(U32) KSEG02KSEG1(buf) )
564*53ee8cc1Swenshuai.xi {
565*53ee8cc1Swenshuai.xi if (buf & 0x7) //flush should be 8 bytes aligned
566*53ee8cc1Swenshuai.xi {
567*53ee8cc1Swenshuai.xi // printf(" buf ");
568*53ee8cc1Swenshuai.xi #if 0
569*53ee8cc1Swenshuai.xi mybuf=(U32)msAPI_Memory_Allocate((hwSize+0xf)&~0xf, BUF_ID_USB_HOST );
570*53ee8cc1Swenshuai.xi {
571*53ee8cc1Swenshuai.xi printf("Memory allocate failed\n");
572*53ee8cc1Swenshuai.xi return HOST20_FATAL;
573*53ee8cc1Swenshuai.xi }
574*53ee8cc1Swenshuai.xi MY_HAL_DCACHE_FLUSH((U32)mybuf,(U32)((hwSize+0xf)&~0xf));
575*53ee8cc1Swenshuai.xi mybuf = (U32)KSEG02KSEG1(mybuf);
576*53ee8cc1Swenshuai.xi #else
577*53ee8cc1Swenshuai.xi mybuf = (U32)KSEG02KSEG1(usb_temp_buf);
578*53ee8cc1Swenshuai.xi #endif
579*53ee8cc1Swenshuai.xi }
580*53ee8cc1Swenshuai.xi else
581*53ee8cc1Swenshuai.xi {
582*53ee8cc1Swenshuai.xi //printf(" fuh ");
583*53ee8cc1Swenshuai.xi MY_HAL_DCACHE_FLUSH((U32)buf,(U32)hwSize); //flush buffer to uncached buffer
584*53ee8cc1Swenshuai.xi buf=(U32)KSEG02KSEG1(buf);
585*53ee8cc1Swenshuai.xi }
586*53ee8cc1Swenshuai.xi }
587*53ee8cc1Swenshuai.xi else
588*53ee8cc1Swenshuai.xi {
589*53ee8cc1Swenshuai.xi if (buf & 0xf)
590*53ee8cc1Swenshuai.xi {
591*53ee8cc1Swenshuai.xi // printf(" buf ");
592*53ee8cc1Swenshuai.xi #if 0
593*53ee8cc1Swenshuai.xi mybuf=(U32)msAPI_Memory_Allocate((hwSize+0xf)&~0xf, BUF_ID_USB_HOST );
594*53ee8cc1Swenshuai.xi if ( mybuf == 0 )
595*53ee8cc1Swenshuai.xi {
596*53ee8cc1Swenshuai.xi printf("Memory allocate failed\n");
597*53ee8cc1Swenshuai.xi return HOST20_FATAL;
598*53ee8cc1Swenshuai.xi }
599*53ee8cc1Swenshuai.xi MY_HAL_DCACHE_FLUSH((U32)mybuf,(U32)((hwSize+0xf)&~0xf));
600*53ee8cc1Swenshuai.xi mybuf = (U32)KSEG02KSEG1(mybuf);
601*53ee8cc1Swenshuai.xi #else
602*53ee8cc1Swenshuai.xi mybuf = (U32)KSEG02KSEG1(usb_temp_buf);
603*53ee8cc1Swenshuai.xi #endif
604*53ee8cc1Swenshuai.xi }
605*53ee8cc1Swenshuai.xi }
606*53ee8cc1Swenshuai.xi
607*53ee8cc1Swenshuai.xi if (mybuf==0)
608*53ee8cc1Swenshuai.xi workbuf=buf; //use original buf
609*53ee8cc1Swenshuai.xi else
610*53ee8cc1Swenshuai.xi workbuf=mybuf;
611*53ee8cc1Swenshuai.xi
612*53ee8cc1Swenshuai.xi //<1>.Fill TD
613*53ee8cc1Swenshuai.xi spTempqTD =flib_Host20_GetStructure(Host20_MEM_TYPE_qTD); //The qTD will be release in the function "Send"
614*53ee8cc1Swenshuai.xi spTempqTD->bTotalBytes=hwSize;
615*53ee8cc1Swenshuai.xi spTempqTD->ArrayBufferPointer_Word[0] = VirtoPhyAddr(workbuf);
616*53ee8cc1Swenshuai.xi
617*53ee8cc1Swenshuai.xi //<2>.Analysis the Direction
618*53ee8cc1Swenshuai.xi spTempqTD->bPID=HOST20_qTD_PID_IN;
619*53ee8cc1Swenshuai.xi
620*53ee8cc1Swenshuai.xi //<3>.Send TD
621*53ee8cc1Swenshuai.xi bResult = flib_Host20_Send_qTD2(spTempqTD ,pHost20_qHD_List_Intr,3);
622*53ee8cc1Swenshuai.xi
623*53ee8cc1Swenshuai.xi if (mybuf)
624*53ee8cc1Swenshuai.xi {
625*53ee8cc1Swenshuai.xi memcpy((void*)buf,(void*)mybuf,hwSize); //copy buffer
626*53ee8cc1Swenshuai.xi #if 0
627*53ee8cc1Swenshuai.xi mybuf = (U32)KSEG12KSEG0(mybuf);
628*53ee8cc1Swenshuai.xi msAPI_Memory_Free((void*)mybuf,BUF_ID_USB_HOST);
629*53ee8cc1Swenshuai.xi #endif
630*53ee8cc1Swenshuai.xi }
631*53ee8cc1Swenshuai.xi
632*53ee8cc1Swenshuai.xi return bResult;
633*53ee8cc1Swenshuai.xi }
634*53ee8cc1Swenshuai.xi #endif
635*53ee8cc1Swenshuai.xi #endif //#if defined(MSOS_TYPE_NOS)
636*53ee8cc1Swenshuai.xi
637