xref: /utopia/UTPA2-700.0.x/modules/usb/drv/usbhost/source/usb_hid_p1/drvintpipe.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 #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