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 //
80*53ee8cc1Swenshuai.xi // Copyright (c) 2006-2008 MStar Semiconductor, Inc.
81*53ee8cc1Swenshuai.xi // All rights reserved.
82*53ee8cc1Swenshuai.xi //
83*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
84*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
85*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
86*53ee8cc1Swenshuai.xi // (��MStar Confidential Information��) by the recipient.
87*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
88*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
89*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
90*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
91*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
92*53ee8cc1Swenshuai.xi //
93*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
94*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_NOS)
95*53ee8cc1Swenshuai.xi #include "../USBHostConfig.h"
96*53ee8cc1Swenshuai.xi #include <stdlib.h>
97*53ee8cc1Swenshuai.xi #ifndef ATV_SERISE_USE
98*53ee8cc1Swenshuai.xi #include <stdio.h>
99*53ee8cc1Swenshuai.xi #endif
100*53ee8cc1Swenshuai.xi #include <string.h>
101*53ee8cc1Swenshuai.xi #ifndef ATV_SERISE_USE
102*53ee8cc1Swenshuai.xi #include "../../include/datatype.h"
103*53ee8cc1Swenshuai.xi #else
104*53ee8cc1Swenshuai.xi #include "UsbHostDataDef.h"
105*53ee8cc1Swenshuai.xi #endif
106*53ee8cc1Swenshuai.xi #include "../drvHostLib.h"
107*53ee8cc1Swenshuai.xi #include "../drvHost200.h"
108*53ee8cc1Swenshuai.xi #include "../drvscsi.h"
109*53ee8cc1Swenshuai.xi #include "../drvMassStorage.h"
110*53ee8cc1Swenshuai.xi #ifdef ATV_SERISE_USE
111*53ee8cc1Swenshuai.xi #include "Board.h"
112*53ee8cc1Swenshuai.xi #include "common.h"
113*53ee8cc1Swenshuai.xi #include "uart.h"
114*53ee8cc1Swenshuai.xi #endif
115*53ee8cc1Swenshuai.xi #include "../drvUsbMain.h"
116*53ee8cc1Swenshuai.xi #include "../../include/_drvUSB.h"
117*53ee8cc1Swenshuai.xi #include "MsCommon.h"
118*53ee8cc1Swenshuai.xi #include "MsIRQ.h"
119*53ee8cc1Swenshuai.xi #include "MsOS.h"
120*53ee8cc1Swenshuai.xi
121*53ee8cc1Swenshuai.xi extern void msAPI_Timer_ResetWDT(void);
122*53ee8cc1Swenshuai.xi
123*53ee8cc1Swenshuai.xi #define DRV_SCSI_DBG(x) // x;
124*53ee8cc1Swenshuai.xi
125*53ee8cc1Swenshuai.xi //struct us_data xdata *Mass_stor_us;
126*53ee8cc1Swenshuai.xi #define MAX_LUN_SUPPORT 5
127*53ee8cc1Swenshuai.xi
128*53ee8cc1Swenshuai.xi struct us_data Mass_stor_us1;
129*53ee8cc1Swenshuai.xi #if 1
130*53ee8cc1Swenshuai.xi struct LUN_Device Mass_stor_device[MAX_LUN_SUPPORT]; //support 4 LUN
131*53ee8cc1Swenshuai.xi #else
132*53ee8cc1Swenshuai.xi struct LUN_Device Mass_stor_device_1; //support 4 LUN
133*53ee8cc1Swenshuai.xi struct LUN_Device Mass_stor_device_2;
134*53ee8cc1Swenshuai.xi struct LUN_Device Mass_stor_device_3;
135*53ee8cc1Swenshuai.xi struct LUN_Device Mass_stor_device_4;
136*53ee8cc1Swenshuai.xi struct LUN_Device Mass_stor_device_5;
137*53ee8cc1Swenshuai.xi #endif
138*53ee8cc1Swenshuai.xi
139*53ee8cc1Swenshuai.xi extern UINT8 pUsbData[1024];
140*53ee8cc1Swenshuai.xi Scsi_Cmnd srb_data;
141*53ee8cc1Swenshuai.xi
142*53ee8cc1Swenshuai.xi UINT8 u8Drive = 0;
143*53ee8cc1Swenshuai.xi extern U8 gUsbStatus;
144*53ee8cc1Swenshuai.xi extern U8 gSpeed;
145*53ee8cc1Swenshuai.xi
146*53ee8cc1Swenshuai.xi struct stForceModeSense1A
147*53ee8cc1Swenshuai.xi {
148*53ee8cc1Swenshuai.xi U16 VID;
149*53ee8cc1Swenshuai.xi U16 PID;
150*53ee8cc1Swenshuai.xi } stForceModeSense1A;
151*53ee8cc1Swenshuai.xi
152*53ee8cc1Swenshuai.xi struct stForceModeSense1A gForceModeSense1A[] =
153*53ee8cc1Swenshuai.xi {
154*53ee8cc1Swenshuai.xi {0x0DD8, 0x1448},
155*53ee8cc1Swenshuai.xi {0x1AA6, 0x0201},
156*53ee8cc1Swenshuai.xi {0x0DD8, 0x1414},
157*53ee8cc1Swenshuai.xi {0x0DD8, 0x1400},
158*53ee8cc1Swenshuai.xi {0x0DD8, 0xE203},
159*53ee8cc1Swenshuai.xi {0x8644, 0x800a}, //alan.yu add on 2010.08.13 (�Ϲ� ����)
160*53ee8cc1Swenshuai.xi {0x0DD8, 0xD202}, //alan.yu add on 2010.08.16 (�ʿ�Netac)
161*53ee8cc1Swenshuai.xi {0x18A5,0x302}, //alan.yu add on 2011.08.01
162*53ee8cc1Swenshuai.xi {0, 0}
163*53ee8cc1Swenshuai.xi };
164*53ee8cc1Swenshuai.xi
165*53ee8cc1Swenshuai.xi extern void MDrv_USBGetVIDPID(U16 *pVID, U16 *pPID);
166*53ee8cc1Swenshuai.xi
167*53ee8cc1Swenshuai.xi //BOOLEAN gDeviceFatalError=FALSE;
Init_Mass_Storage_Structure(void)168*53ee8cc1Swenshuai.xi void Init_Mass_Storage_Structure(void)
169*53ee8cc1Swenshuai.xi {
170*53ee8cc1Swenshuai.xi U16 uVID, uPID;
171*53ee8cc1Swenshuai.xi //Mass_stor_us=&Mass_stor_us1;
172*53ee8cc1Swenshuai.xi memset(&Mass_stor_device[0], 0, sizeof(Mass_stor_device[0]));
173*53ee8cc1Swenshuai.xi Mass_stor_us1.Mass_stor_device=&Mass_stor_device[0];
174*53ee8cc1Swenshuai.xi #ifdef ENABLE_CBI_HOST
175*53ee8cc1Swenshuai.xi if ( (sAttachDevice.saCD[0].sInterface[0].bInterfaceProtocol==0x00)||
176*53ee8cc1Swenshuai.xi (sAttachDevice.saCD[0].sInterface[0].bInterfaceProtocol==0x01) )
177*53ee8cc1Swenshuai.xi Mass_stor_us1.max_lun=0;
178*53ee8cc1Swenshuai.xi else
179*53ee8cc1Swenshuai.xi #endif
180*53ee8cc1Swenshuai.xi {
181*53ee8cc1Swenshuai.xi MDrv_USBGetVIDPID(&uVID, &uPID);
182*53ee8cc1Swenshuai.xi //printf("MAXLUN VID: %x, PID: %x\n", uVID, uPID);
183*53ee8cc1Swenshuai.xi if ( ((uVID == 0x8564) && (uPID == 0x1000)) ||
184*53ee8cc1Swenshuai.xi ((uVID == 0xFCA) && (uPID == 0x8004)) ) //20130301, for blackberry phone
185*53ee8cc1Swenshuai.xi Mass_stor_us1.max_lun = 0;
186*53ee8cc1Swenshuai.xi else
187*53ee8cc1Swenshuai.xi Mass_stor_us1.max_lun= Host20_MSCD_GetMaxLUN();
188*53ee8cc1Swenshuai.xi }
189*53ee8cc1Swenshuai.xi
190*53ee8cc1Swenshuai.xi if (Mass_stor_us1.max_lun > (MAX_LUN_SUPPORT-1) )
191*53ee8cc1Swenshuai.xi Mass_stor_us1.max_lun = MAX_LUN_SUPPORT-1;
192*53ee8cc1Swenshuai.xi
193*53ee8cc1Swenshuai.xi //printf("Max Lun:%02bx\n",Mass_stor_us1.max_lun);
194*53ee8cc1Swenshuai.xi }
195*53ee8cc1Swenshuai.xi //***************************************************************************************
196*53ee8cc1Swenshuai.xi // Function Name: vSCSICmd_READ_10
197*53ee8cc1Swenshuai.xi // Description:
198*53ee8cc1Swenshuai.xi // Input:
199*53ee8cc1Swenshuai.xi // Output:
200*53ee8cc1Swenshuai.xi // Status:S
201*53ee8cc1Swenshuai.xi //***************************************************************************************
vSCSICmd_READ_WRITE_10(BOOLEAN DoWrite,struct us_data * us,Scsi_Cmnd * srb,INT8U u8LunNum,INT32U u32BlockAddr,INT16U u16BlockNum,U32 u8Buffer)202*53ee8cc1Swenshuai.xi void vSCSICmd_READ_WRITE_10(BOOLEAN DoWrite,struct us_data *us, Scsi_Cmnd *srb, INT8U u8LunNum,
203*53ee8cc1Swenshuai.xi INT32U u32BlockAddr, INT16U u16BlockNum, U32 u8Buffer)
204*53ee8cc1Swenshuai.xi {
205*53ee8cc1Swenshuai.xi
206*53ee8cc1Swenshuai.xi
207*53ee8cc1Swenshuai.xi /* set the command and the LUN */
208*53ee8cc1Swenshuai.xi #if 0
209*53ee8cc1Swenshuai.xi memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
210*53ee8cc1Swenshuai.xi srb->cmnd[0] = READ_10;
211*53ee8cc1Swenshuai.xi
212*53ee8cc1Swenshuai.xi srb->cmnd[2] = (INT8U)(u32BlockAddr >> 24);
213*53ee8cc1Swenshuai.xi srb->cmnd[3] = (INT8U)(u32BlockAddr >> 16);
214*53ee8cc1Swenshuai.xi srb->cmnd[4] = (INT8U)(u32BlockAddr >> 8);
215*53ee8cc1Swenshuai.xi srb->cmnd[5] = (INT8U)(u32BlockAddr);
216*53ee8cc1Swenshuai.xi
217*53ee8cc1Swenshuai.xi srb->cmnd[7] = (INT8U)(u16BlockNum >> 8);
218*53ee8cc1Swenshuai.xi srb->cmnd[8] = (INT8U)(u16BlockNum );
219*53ee8cc1Swenshuai.xi #endif
220*53ee8cc1Swenshuai.xi if (DoWrite)
221*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[0]=WRITE_10;
222*53ee8cc1Swenshuai.xi else
223*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[0]=READ_10;
224*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[1]=0;
225*53ee8cc1Swenshuai.xi
226*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[2]= (INT8U)(u32BlockAddr >> 24);
227*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[3]= (INT8U)(u32BlockAddr >> 16);
228*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[4]= (INT8U)(u32BlockAddr >> 8);
229*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[5]= (INT8U)(u32BlockAddr);
230*53ee8cc1Swenshuai.xi
231*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[7] = (INT8U)(u16BlockNum >> 8);
232*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[8] = (INT8U)(u16BlockNum );
233*53ee8cc1Swenshuai.xi
234*53ee8cc1Swenshuai.xi
235*53ee8cc1Swenshuai.xi /* FIXME: we must do the protocol translation here */
236*53ee8cc1Swenshuai.xi /*
237*53ee8cc1Swenshuai.xi if (us->subclass == US_SC_RBC || us->subclass == US_SC_SCSI)
238*53ee8cc1Swenshuai.xi srb->cmd_len = 6;
239*53ee8cc1Swenshuai.xi else
240*53ee8cc1Swenshuai.xi srb->cmd_len = 12;
241*53ee8cc1Swenshuai.xi */
242*53ee8cc1Swenshuai.xi srb->cmd_len = 10;
243*53ee8cc1Swenshuai.xi
244*53ee8cc1Swenshuai.xi /* set the transfer direction */
245*53ee8cc1Swenshuai.xi if (DoWrite)
246*53ee8cc1Swenshuai.xi srb->sc_data_direction = SCSI_DATA_WRITE;
247*53ee8cc1Swenshuai.xi else
248*53ee8cc1Swenshuai.xi srb->sc_data_direction = SCSI_DATA_READ;
249*53ee8cc1Swenshuai.xi
250*53ee8cc1Swenshuai.xi /* use the new buffer we have */
251*53ee8cc1Swenshuai.xi srb->request_buffer= u8Buffer;
252*53ee8cc1Swenshuai.xi
253*53ee8cc1Swenshuai.xi /* set the buffer length for transfer */
254*53ee8cc1Swenshuai.xi srb->request_bufflen = (us->Mass_stor_device[u8LunNum].u32BlockSize)*u16BlockNum;
255*53ee8cc1Swenshuai.xi
256*53ee8cc1Swenshuai.xi /* set up for no scatter-gather use */
257*53ee8cc1Swenshuai.xi //srb->use_sg = 0;
258*53ee8cc1Swenshuai.xi
259*53ee8cc1Swenshuai.xi /* change the serial number -- toggle the high bit*/
260*53ee8cc1Swenshuai.xi //srb->serial_number ^= 0x80000000;
261*53ee8cc1Swenshuai.xi
262*53ee8cc1Swenshuai.xi /* set Lun number*/
263*53ee8cc1Swenshuai.xi srb->lun= u8LunNum;
264*53ee8cc1Swenshuai.xi
265*53ee8cc1Swenshuai.xi //srb->scsi_done = vScsi_SendCmd_Done;
266*53ee8cc1Swenshuai.xi
267*53ee8cc1Swenshuai.xi
268*53ee8cc1Swenshuai.xi
269*53ee8cc1Swenshuai.xi }
270*53ee8cc1Swenshuai.xi #if 0
271*53ee8cc1Swenshuai.xi //***************************************************************************************
272*53ee8cc1Swenshuai.xi // Function Name:
273*53ee8cc1Swenshuai.xi // Description:
274*53ee8cc1Swenshuai.xi // Input:
275*53ee8cc1Swenshuai.xi // Output:
276*53ee8cc1Swenshuai.xi // Status:S
277*53ee8cc1Swenshuai.xi //***************************************************************************************
278*53ee8cc1Swenshuai.xi void vSCSICmd_WRITE_10(struct us_data *us, Scsi_Cmnd *srb, INT8U u8LunNum,
279*53ee8cc1Swenshuai.xi INT32U u32BlockAddr, INT16U u16BlockNum, U32 u8Buffer)
280*53ee8cc1Swenshuai.xi {
281*53ee8cc1Swenshuai.xi
282*53ee8cc1Swenshuai.xi
283*53ee8cc1Swenshuai.xi /* set the command and the LUN */
284*53ee8cc1Swenshuai.xi #if 0
285*53ee8cc1Swenshuai.xi memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
286*53ee8cc1Swenshuai.xi srb->cmnd[0] = WRITE_10;
287*53ee8cc1Swenshuai.xi
288*53ee8cc1Swenshuai.xi srb->cmnd[2] = (INT8U)(u32BlockAddr >> 24);
289*53ee8cc1Swenshuai.xi srb->cmnd[3] = (INT8U)(u32BlockAddr >> 16);
290*53ee8cc1Swenshuai.xi srb->cmnd[4] = (INT8U)(u32BlockAddr >> 8);
291*53ee8cc1Swenshuai.xi srb->cmnd[5] = (INT8U)(u32BlockAddr);
292*53ee8cc1Swenshuai.xi
293*53ee8cc1Swenshuai.xi srb->cmnd[7] = (INT8U)(u16BlockNum >> 8);
294*53ee8cc1Swenshuai.xi srb->cmnd[8] = (INT8U)(u16BlockNum );
295*53ee8cc1Swenshuai.xi #endif
296*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[0]=WRITE_10;
297*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[1]=0;
298*53ee8cc1Swenshuai.xi
299*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[2]= (INT8U)(u32BlockAddr >> 24);
300*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[3]= (INT8U)(u32BlockAddr >> 16);
301*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[4]= (INT8U)(u32BlockAddr >> 8);
302*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[5]= (INT8U)(u32BlockAddr);
303*53ee8cc1Swenshuai.xi
304*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[7] = (INT8U)(u16BlockNum >> 8);
305*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[8] = (INT8U)(u16BlockNum );
306*53ee8cc1Swenshuai.xi
307*53ee8cc1Swenshuai.xi /* FIXME: we must do the protocol translation here */
308*53ee8cc1Swenshuai.xi /*
309*53ee8cc1Swenshuai.xi if (us->subclass == US_SC_RBC || us->subclass == US_SC_SCSI)
310*53ee8cc1Swenshuai.xi srb->cmd_len = 6;
311*53ee8cc1Swenshuai.xi else
312*53ee8cc1Swenshuai.xi srb->cmd_len = 12;
313*53ee8cc1Swenshuai.xi */
314*53ee8cc1Swenshuai.xi srb->cmd_len = CB_LENGTH_WRITE_10;
315*53ee8cc1Swenshuai.xi
316*53ee8cc1Swenshuai.xi /* set the transfer direction */
317*53ee8cc1Swenshuai.xi srb->sc_data_direction = SCSI_DATA_WRITE;
318*53ee8cc1Swenshuai.xi
319*53ee8cc1Swenshuai.xi /* use the new buffer we have */
320*53ee8cc1Swenshuai.xi srb->phy_buf_adr=u8Buffer;
321*53ee8cc1Swenshuai.xi srb->buffer_type=BUFFER_PHY;
322*53ee8cc1Swenshuai.xi
323*53ee8cc1Swenshuai.xi /* set the buffer length for transfer */
324*53ee8cc1Swenshuai.xi srb->request_bufflen = us->Mass_stor_device[u8LunNum].u32BlockSize*u16BlockNum;
325*53ee8cc1Swenshuai.xi
326*53ee8cc1Swenshuai.xi /* set up for no scatter-gather use */
327*53ee8cc1Swenshuai.xi //srb->use_sg = 0;
328*53ee8cc1Swenshuai.xi
329*53ee8cc1Swenshuai.xi /* change the serial number -- toggle the high bit*/
330*53ee8cc1Swenshuai.xi //srb->serial_number ^= 0x80000000;
331*53ee8cc1Swenshuai.xi
332*53ee8cc1Swenshuai.xi /* set Lun number*/
333*53ee8cc1Swenshuai.xi srb->lun= u8LunNum;
334*53ee8cc1Swenshuai.xi
335*53ee8cc1Swenshuai.xi //srb->scsi_done = vScsi_SendCmd_Done;
336*53ee8cc1Swenshuai.xi
337*53ee8cc1Swenshuai.xi
338*53ee8cc1Swenshuai.xi }
339*53ee8cc1Swenshuai.xi #endif
340*53ee8cc1Swenshuai.xi //***************************************************************************************
341*53ee8cc1Swenshuai.xi // Function Name:
342*53ee8cc1Swenshuai.xi // Description:
343*53ee8cc1Swenshuai.xi // Input:
344*53ee8cc1Swenshuai.xi // Output:
345*53ee8cc1Swenshuai.xi // Status:S
346*53ee8cc1Swenshuai.xi //***************************************************************************************
vSCSICmd_INQUIRY(Scsi_Cmnd * srb,INT8U * u8Buffer)347*53ee8cc1Swenshuai.xi void vSCSICmd_INQUIRY( Scsi_Cmnd *srb, INT8U *u8Buffer)
348*53ee8cc1Swenshuai.xi {
349*53ee8cc1Swenshuai.xi
350*53ee8cc1Swenshuai.xi
351*53ee8cc1Swenshuai.xi /* set the command and the LUN */
352*53ee8cc1Swenshuai.xi //memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
353*53ee8cc1Swenshuai.xi //srb->cmnd[0] = INQUIRY;
354*53ee8cc1Swenshuai.xi //srb->cmnd[4] = DATA_LENGTH_INQUIRY;
355*53ee8cc1Swenshuai.xi memset(&OTGH_PT_BLK.sCBW.u8CB[0], 0, 16);
356*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[0]= INQUIRY;
357*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[4]= DATA_LENGTH_INQUIRY;
358*53ee8cc1Swenshuai.xi
359*53ee8cc1Swenshuai.xi /* FIXME: we must do the protocol translation here */
360*53ee8cc1Swenshuai.xi /*
361*53ee8cc1Swenshuai.xi if (us->subclass == US_SC_RBC || us->subclass == US_SC_SCSI)
362*53ee8cc1Swenshuai.xi srb->cmd_len = 6;
363*53ee8cc1Swenshuai.xi else
364*53ee8cc1Swenshuai.xi srb->cmd_len = 12;
365*53ee8cc1Swenshuai.xi */
366*53ee8cc1Swenshuai.xi srb->cmd_len = CB_LENGTH_INQUIRY;
367*53ee8cc1Swenshuai.xi
368*53ee8cc1Swenshuai.xi /* set the transfer direction */
369*53ee8cc1Swenshuai.xi srb->sc_data_direction = SCSI_DATA_READ;
370*53ee8cc1Swenshuai.xi
371*53ee8cc1Swenshuai.xi /* use the new buffer we have */
372*53ee8cc1Swenshuai.xi srb->request_buffer = (U32)u8Buffer;
373*53ee8cc1Swenshuai.xi
374*53ee8cc1Swenshuai.xi /* set the buffer length for transfer */
375*53ee8cc1Swenshuai.xi srb->request_bufflen = DATA_LENGTH_INQUIRY;
376*53ee8cc1Swenshuai.xi
377*53ee8cc1Swenshuai.xi /* set up for no scatter-gather use */
378*53ee8cc1Swenshuai.xi //srb->use_sg = 0;
379*53ee8cc1Swenshuai.xi
380*53ee8cc1Swenshuai.xi /* change the serial number -- toggle the high bit*/
381*53ee8cc1Swenshuai.xi //srb->serial_number ^= 0x80000000;
382*53ee8cc1Swenshuai.xi
383*53ee8cc1Swenshuai.xi /* set Lun number*/
384*53ee8cc1Swenshuai.xi //srb->lun= u8Drive;//0;
385*53ee8cc1Swenshuai.xi
386*53ee8cc1Swenshuai.xi //srb->scsi_done = vScsi_SendCmd_Done;
387*53ee8cc1Swenshuai.xi
388*53ee8cc1Swenshuai.xi
389*53ee8cc1Swenshuai.xi }
390*53ee8cc1Swenshuai.xi //***************************************************************************************
391*53ee8cc1Swenshuai.xi // Function Name:
392*53ee8cc1Swenshuai.xi // Description:
393*53ee8cc1Swenshuai.xi // Input:
394*53ee8cc1Swenshuai.xi // Output:
395*53ee8cc1Swenshuai.xi // Status:S
396*53ee8cc1Swenshuai.xi //***************************************************************************************
vSCSICmd_READ_CAPACITY(Scsi_Cmnd * srb,INT8U * u8Buffer)397*53ee8cc1Swenshuai.xi void vSCSICmd_READ_CAPACITY( Scsi_Cmnd *srb, INT8U *u8Buffer)
398*53ee8cc1Swenshuai.xi {
399*53ee8cc1Swenshuai.xi
400*53ee8cc1Swenshuai.xi /* set the command and the LUN */
401*53ee8cc1Swenshuai.xi //memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
402*53ee8cc1Swenshuai.xi //srb->cmnd[0] = READ_CAPACITY;
403*53ee8cc1Swenshuai.xi memset(&OTGH_PT_BLK.sCBW.u8CB[0], 0, 16);
404*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[0]= READ_CAPACITY;
405*53ee8cc1Swenshuai.xi
406*53ee8cc1Swenshuai.xi /* FIXME: we must do the protocol translation here */
407*53ee8cc1Swenshuai.xi /*
408*53ee8cc1Swenshuai.xi if (us->subclass == US_SC_RBC || us->subclass == US_SC_SCSI)
409*53ee8cc1Swenshuai.xi srb->cmd_len = 6;
410*53ee8cc1Swenshuai.xi else
411*53ee8cc1Swenshuai.xi srb->cmd_len = 12;
412*53ee8cc1Swenshuai.xi */
413*53ee8cc1Swenshuai.xi srb->cmd_len = CB_LENGTH_READ_CAPACITY;
414*53ee8cc1Swenshuai.xi
415*53ee8cc1Swenshuai.xi /* set the transfer direction */
416*53ee8cc1Swenshuai.xi srb->sc_data_direction = SCSI_DATA_READ;
417*53ee8cc1Swenshuai.xi
418*53ee8cc1Swenshuai.xi /* use the new buffer we have */
419*53ee8cc1Swenshuai.xi srb->request_buffer = (U32)u8Buffer;
420*53ee8cc1Swenshuai.xi
421*53ee8cc1Swenshuai.xi /* set the buffer length for transfer */
422*53ee8cc1Swenshuai.xi srb->request_bufflen = DATA_LENGTH_READ_CAPACITY;
423*53ee8cc1Swenshuai.xi
424*53ee8cc1Swenshuai.xi /* set up for no scatter-gather use */
425*53ee8cc1Swenshuai.xi //srb->use_sg = 0;
426*53ee8cc1Swenshuai.xi
427*53ee8cc1Swenshuai.xi /* change the serial number -- toggle the high bit*/
428*53ee8cc1Swenshuai.xi //srb->serial_number ^= 0x80000000;
429*53ee8cc1Swenshuai.xi
430*53ee8cc1Swenshuai.xi /* set Lun number*/
431*53ee8cc1Swenshuai.xi //srb->lun= u8Drive;
432*53ee8cc1Swenshuai.xi
433*53ee8cc1Swenshuai.xi //srb->scsi_done = vScsi_SendCmd_Done;
434*53ee8cc1Swenshuai.xi
435*53ee8cc1Swenshuai.xi
436*53ee8cc1Swenshuai.xi }
437*53ee8cc1Swenshuai.xi
vSCSICmd_READ_FORMAT_CAPACITY(Scsi_Cmnd * srb,INT8U * u8Buffer)438*53ee8cc1Swenshuai.xi void vSCSICmd_READ_FORMAT_CAPACITY( Scsi_Cmnd *srb, INT8U *u8Buffer)
439*53ee8cc1Swenshuai.xi {
440*53ee8cc1Swenshuai.xi
441*53ee8cc1Swenshuai.xi /* set the command and the LUN */
442*53ee8cc1Swenshuai.xi //memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
443*53ee8cc1Swenshuai.xi //srb->cmnd[0] = READ_CAPACITY;
444*53ee8cc1Swenshuai.xi memset(&OTGH_PT_BLK.sCBW.u8CB[0], 0, 16);
445*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[0]= READ_FORMAT_CAPACITY;
446*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[8]= 12; //Length
447*53ee8cc1Swenshuai.xi
448*53ee8cc1Swenshuai.xi /* FIXME: we must do the protocol translation here */
449*53ee8cc1Swenshuai.xi /*
450*53ee8cc1Swenshuai.xi if (us->subclass == US_SC_RBC || us->subclass == US_SC_SCSI)
451*53ee8cc1Swenshuai.xi srb->cmd_len = 6;
452*53ee8cc1Swenshuai.xi else
453*53ee8cc1Swenshuai.xi srb->cmd_len = 12;
454*53ee8cc1Swenshuai.xi */
455*53ee8cc1Swenshuai.xi srb->cmd_len = CB_LENGTH_READ_CAPACITY;
456*53ee8cc1Swenshuai.xi
457*53ee8cc1Swenshuai.xi /* set the transfer direction */
458*53ee8cc1Swenshuai.xi srb->sc_data_direction = SCSI_DATA_READ;
459*53ee8cc1Swenshuai.xi
460*53ee8cc1Swenshuai.xi /* use the new buffer we have */
461*53ee8cc1Swenshuai.xi srb->request_buffer = (U32)u8Buffer;
462*53ee8cc1Swenshuai.xi
463*53ee8cc1Swenshuai.xi /* set the buffer length for transfer */
464*53ee8cc1Swenshuai.xi srb->request_bufflen = 12;
465*53ee8cc1Swenshuai.xi
466*53ee8cc1Swenshuai.xi /* set up for no scatter-gather use */
467*53ee8cc1Swenshuai.xi //srb->use_sg = 0;
468*53ee8cc1Swenshuai.xi
469*53ee8cc1Swenshuai.xi /* change the serial number -- toggle the high bit*/
470*53ee8cc1Swenshuai.xi //srb->serial_number ^= 0x80000000;
471*53ee8cc1Swenshuai.xi
472*53ee8cc1Swenshuai.xi /* set Lun number*/
473*53ee8cc1Swenshuai.xi //srb->lun= u8Drive;
474*53ee8cc1Swenshuai.xi
475*53ee8cc1Swenshuai.xi //srb->scsi_done = vScsi_SendCmd_Done;
476*53ee8cc1Swenshuai.xi
477*53ee8cc1Swenshuai.xi
478*53ee8cc1Swenshuai.xi }
479*53ee8cc1Swenshuai.xi
480*53ee8cc1Swenshuai.xi //***************************************************************************************
481*53ee8cc1Swenshuai.xi // Function Name:vSCSICmd_MODE_SENSE
482*53ee8cc1Swenshuai.xi // Description:
483*53ee8cc1Swenshuai.xi // Input:
484*53ee8cc1Swenshuai.xi // Output:
485*53ee8cc1Swenshuai.xi // Status:
486*53ee8cc1Swenshuai.xi //***************************************************************************************
vSCSICmd_MODE_SENSE(Scsi_Cmnd * srb,INT8U u8PageCode,INT8U * u8Buffer)487*53ee8cc1Swenshuai.xi void vSCSICmd_MODE_SENSE( Scsi_Cmnd *srb,INT8U u8PageCode,INT8U *u8Buffer)
488*53ee8cc1Swenshuai.xi {
489*53ee8cc1Swenshuai.xi
490*53ee8cc1Swenshuai.xi /* set the command and the LUN */
491*53ee8cc1Swenshuai.xi //memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
492*53ee8cc1Swenshuai.xi //srb->cmnd[0] = MODE_SENSE;
493*53ee8cc1Swenshuai.xi //srb->cmnd[2] = u8PageCode;
494*53ee8cc1Swenshuai.xi //srb->cmnd[4] = DATA_LENGTH_MODE_SENSE;
495*53ee8cc1Swenshuai.xi memset(&OTGH_PT_BLK.sCBW.u8CB[0], 0, 16);
496*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[0]= MODE_SENSE;
497*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[2]= u8PageCode;
498*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[4]= DATA_LENGTH_MODE_SENSE;
499*53ee8cc1Swenshuai.xi
500*53ee8cc1Swenshuai.xi /* FIXME: we must do the protocol translation here */
501*53ee8cc1Swenshuai.xi /*
502*53ee8cc1Swenshuai.xi if (us->subclass == US_SC_RBC || us->subclass == US_SC_SCSI)
503*53ee8cc1Swenshuai.xi srb->cmd_len = 6;
504*53ee8cc1Swenshuai.xi else
505*53ee8cc1Swenshuai.xi srb->cmd_len = 12;
506*53ee8cc1Swenshuai.xi */
507*53ee8cc1Swenshuai.xi srb->cmd_len = CB_LENGTH_MODE_SENSE;
508*53ee8cc1Swenshuai.xi
509*53ee8cc1Swenshuai.xi /* set the transfer direction */
510*53ee8cc1Swenshuai.xi srb->sc_data_direction = SCSI_DATA_READ;
511*53ee8cc1Swenshuai.xi
512*53ee8cc1Swenshuai.xi /* use the new buffer we have */
513*53ee8cc1Swenshuai.xi srb->request_buffer = (U32)u8Buffer;
514*53ee8cc1Swenshuai.xi /* set the buffer length for transfer */
515*53ee8cc1Swenshuai.xi srb->request_bufflen = DATA_LENGTH_MODE_SENSE;
516*53ee8cc1Swenshuai.xi
517*53ee8cc1Swenshuai.xi /* set up for no scatter-gather use */
518*53ee8cc1Swenshuai.xi //srb->use_sg = 0;
519*53ee8cc1Swenshuai.xi
520*53ee8cc1Swenshuai.xi /* change the serial number -- toggle the high bit*/
521*53ee8cc1Swenshuai.xi //srb->serial_number ^= 0x80000000;
522*53ee8cc1Swenshuai.xi
523*53ee8cc1Swenshuai.xi /* set Lun number*/
524*53ee8cc1Swenshuai.xi //srb->lun= u8Drive;
525*53ee8cc1Swenshuai.xi
526*53ee8cc1Swenshuai.xi //srb->scsi_done = vScsi_SendCmd_Done;
527*53ee8cc1Swenshuai.xi
528*53ee8cc1Swenshuai.xi
529*53ee8cc1Swenshuai.xi }
530*53ee8cc1Swenshuai.xi
531*53ee8cc1Swenshuai.xi //***************************************************************************************
532*53ee8cc1Swenshuai.xi // Function Name:vSCSICmd_MODE_SENSE_OperCode5A
533*53ee8cc1Swenshuai.xi // Description:
534*53ee8cc1Swenshuai.xi // Input:
535*53ee8cc1Swenshuai.xi // Output:
536*53ee8cc1Swenshuai.xi // Status:
537*53ee8cc1Swenshuai.xi //***************************************************************************************
vSCSICmd_MODE_SENSE_OperCode5A(Scsi_Cmnd * srb,INT8U u8PageCode,INT8U * u8Buffer)538*53ee8cc1Swenshuai.xi void vSCSICmd_MODE_SENSE_OperCode5A( Scsi_Cmnd *srb,INT8U u8PageCode,INT8U *u8Buffer)
539*53ee8cc1Swenshuai.xi {
540*53ee8cc1Swenshuai.xi
541*53ee8cc1Swenshuai.xi /* set the command and the LUN */
542*53ee8cc1Swenshuai.xi //memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
543*53ee8cc1Swenshuai.xi //srb->cmnd[0] = MODE_SENSE;
544*53ee8cc1Swenshuai.xi //srb->cmnd[2] = u8PageCode;
545*53ee8cc1Swenshuai.xi //srb->cmnd[4] = DATA_LENGTH_MODE_SENSE;
546*53ee8cc1Swenshuai.xi memset(&OTGH_PT_BLK.sCBW.u8CB[0], 0, 16);
547*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[0]= MODE_SENSE_5A;
548*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[2]= u8PageCode;
549*53ee8cc1Swenshuai.xi #if 0
550*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[4]= DATA_LENGTH_MODE_SENSE_OperCode5A; //RCC?
551*53ee8cc1Swenshuai.xi #else
552*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[7] = (INT8U)(DATA_LENGTH_MODE_SENSE_OperCode5A >> 8);
553*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[8] = (INT8U)(DATA_LENGTH_MODE_SENSE_OperCode5A );
554*53ee8cc1Swenshuai.xi #endif
555*53ee8cc1Swenshuai.xi /* FIXME: we must do the protocol translation here */
556*53ee8cc1Swenshuai.xi /*
557*53ee8cc1Swenshuai.xi if (us->subclass == US_SC_RBC || us->subclass == US_SC_SCSI)
558*53ee8cc1Swenshuai.xi srb->cmd_len = 6;
559*53ee8cc1Swenshuai.xi else
560*53ee8cc1Swenshuai.xi srb->cmd_len = 12;
561*53ee8cc1Swenshuai.xi */
562*53ee8cc1Swenshuai.xi srb->cmd_len = CB_LENGTH_MODE_SENSE_OperCode5A;
563*53ee8cc1Swenshuai.xi
564*53ee8cc1Swenshuai.xi /* set the transfer direction */
565*53ee8cc1Swenshuai.xi srb->sc_data_direction = SCSI_DATA_READ;
566*53ee8cc1Swenshuai.xi
567*53ee8cc1Swenshuai.xi /* use the new buffer we have */
568*53ee8cc1Swenshuai.xi srb->request_buffer = (U32)u8Buffer;
569*53ee8cc1Swenshuai.xi /* set the buffer length for transfer */
570*53ee8cc1Swenshuai.xi srb->request_bufflen = DATA_LENGTH_MODE_SENSE_OperCode5A;
571*53ee8cc1Swenshuai.xi
572*53ee8cc1Swenshuai.xi /* set up for no scatter-gather use */
573*53ee8cc1Swenshuai.xi //srb->use_sg = 0;
574*53ee8cc1Swenshuai.xi
575*53ee8cc1Swenshuai.xi /* change the serial number -- toggle the high bit*/
576*53ee8cc1Swenshuai.xi //srb->serial_number ^= 0x80000000;
577*53ee8cc1Swenshuai.xi
578*53ee8cc1Swenshuai.xi /* set Lun number*/
579*53ee8cc1Swenshuai.xi //srb->lun= u8Drive;
580*53ee8cc1Swenshuai.xi
581*53ee8cc1Swenshuai.xi //srb->scsi_done = vScsi_SendCmd_Done;
582*53ee8cc1Swenshuai.xi
583*53ee8cc1Swenshuai.xi
584*53ee8cc1Swenshuai.xi }
585*53ee8cc1Swenshuai.xi
586*53ee8cc1Swenshuai.xi //***************************************************************************************
587*53ee8cc1Swenshuai.xi // Function Name:vSCSICmd_REQUEST_SENSE
588*53ee8cc1Swenshuai.xi // Description:
589*53ee8cc1Swenshuai.xi // Input:
590*53ee8cc1Swenshuai.xi // Output:
591*53ee8cc1Swenshuai.xi // Status:
592*53ee8cc1Swenshuai.xi //***************************************************************************************
vSCSICmd_REQUEST_SENSE(Scsi_Cmnd * srb,INT8U * u8Buffer)593*53ee8cc1Swenshuai.xi void vSCSICmd_REQUEST_SENSE( Scsi_Cmnd *srb, INT8U *u8Buffer)
594*53ee8cc1Swenshuai.xi {
595*53ee8cc1Swenshuai.xi
596*53ee8cc1Swenshuai.xi
597*53ee8cc1Swenshuai.xi /* set the command and the LUN */
598*53ee8cc1Swenshuai.xi //memset(srb->cmnd, 0, MAX_COMMAND_SIZE);
599*53ee8cc1Swenshuai.xi //srb->cmnd[0] = REQUEST_SENSE;
600*53ee8cc1Swenshuai.xi //srb->cmnd[4] = 18;
601*53ee8cc1Swenshuai.xi memset(&OTGH_PT_BLK.sCBW.u8CB[0], 0, 16);
602*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[0]= REQUEST_SENSE;
603*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[4]= 18;
604*53ee8cc1Swenshuai.xi
605*53ee8cc1Swenshuai.xi /* FIXME: we must do the protocol translation here */
606*53ee8cc1Swenshuai.xi /*
607*53ee8cc1Swenshuai.xi if (us->subclass == US_SC_RBC || us->subclass == US_SC_SCSI)
608*53ee8cc1Swenshuai.xi srb->cmd_len = 6;
609*53ee8cc1Swenshuai.xi else
610*53ee8cc1Swenshuai.xi srb->cmd_len = 12;
611*53ee8cc1Swenshuai.xi */
612*53ee8cc1Swenshuai.xi srb->cmd_len = CB_LENGTH_REQUEST_SENSE;
613*53ee8cc1Swenshuai.xi
614*53ee8cc1Swenshuai.xi /* set the transfer direction */
615*53ee8cc1Swenshuai.xi srb->sc_data_direction = SCSI_DATA_READ;
616*53ee8cc1Swenshuai.xi
617*53ee8cc1Swenshuai.xi /* use the new buffer we have */
618*53ee8cc1Swenshuai.xi srb->request_buffer = (U32)u8Buffer;
619*53ee8cc1Swenshuai.xi /* set the buffer length for transfer */
620*53ee8cc1Swenshuai.xi srb->request_bufflen = 18;
621*53ee8cc1Swenshuai.xi
622*53ee8cc1Swenshuai.xi /* set up for no scatter-gather use */
623*53ee8cc1Swenshuai.xi //srb->use_sg = 0;
624*53ee8cc1Swenshuai.xi
625*53ee8cc1Swenshuai.xi /* change the serial number -- toggle the high bit*/
626*53ee8cc1Swenshuai.xi //srb->serial_number ^= 0x80000000;
627*53ee8cc1Swenshuai.xi
628*53ee8cc1Swenshuai.xi /* set Lun number*/
629*53ee8cc1Swenshuai.xi //srb->lun= u8Drive;
630*53ee8cc1Swenshuai.xi
631*53ee8cc1Swenshuai.xi //srb->scsi_done = vScsi_SendCmd_Done;
632*53ee8cc1Swenshuai.xi
633*53ee8cc1Swenshuai.xi
634*53ee8cc1Swenshuai.xi }
635*53ee8cc1Swenshuai.xi #if 0
636*53ee8cc1Swenshuai.xi //***************************************************************************************
637*53ee8cc1Swenshuai.xi // Function Name:vSCSICmd_TEST_UNIT_READY
638*53ee8cc1Swenshuai.xi // Description:
639*53ee8cc1Swenshuai.xi // Input:
640*53ee8cc1Swenshuai.xi // Output:
641*53ee8cc1Swenshuai.xi // Status:S
642*53ee8cc1Swenshuai.xi //***************************************************************************************
643*53ee8cc1Swenshuai.xi void vSCSICmd_TEST_UNIT_READY( Scsi_Cmnd *srb)
644*53ee8cc1Swenshuai.xi {
645*53ee8cc1Swenshuai.xi
646*53ee8cc1Swenshuai.xi memset(&OTGH_PT_BLK.sCBW.u8CB[0], 0, 16);
647*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[0]= TEST_UNIT_READY;
648*53ee8cc1Swenshuai.xi
649*53ee8cc1Swenshuai.xi srb->cmd_len = CB_LENGTH_TEST_UNIT_READY;
650*53ee8cc1Swenshuai.xi
651*53ee8cc1Swenshuai.xi
652*53ee8cc1Swenshuai.xi /* set the transfer direction */
653*53ee8cc1Swenshuai.xi srb->sc_data_direction = SCSI_DATA_READ;
654*53ee8cc1Swenshuai.xi
655*53ee8cc1Swenshuai.xi /* set the buffer length for transfer */
656*53ee8cc1Swenshuai.xi srb->request_bufflen = 0;
657*53ee8cc1Swenshuai.xi
658*53ee8cc1Swenshuai.xi }
659*53ee8cc1Swenshuai.xi #endif
660*53ee8cc1Swenshuai.xi
vSCSICmd_Prepare(Scsi_Cmnd * srb,U8 cmd)661*53ee8cc1Swenshuai.xi void vSCSICmd_Prepare(Scsi_Cmnd *srb, U8 cmd)
662*53ee8cc1Swenshuai.xi {
663*53ee8cc1Swenshuai.xi memset(&OTGH_PT_BLK.sCBW.u8CB[0], 0, 16);
664*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[0]= cmd;
665*53ee8cc1Swenshuai.xi
666*53ee8cc1Swenshuai.xi srb->cmd_len = 6;
667*53ee8cc1Swenshuai.xi /* set the transfer direction */
668*53ee8cc1Swenshuai.xi srb->sc_data_direction = SCSI_DATA_READ;
669*53ee8cc1Swenshuai.xi /* set the buffer length for transfer */
670*53ee8cc1Swenshuai.xi srb->request_bufflen = 0;
671*53ee8cc1Swenshuai.xi }
672*53ee8cc1Swenshuai.xi
673*53ee8cc1Swenshuai.xi
674*53ee8cc1Swenshuai.xi
675*53ee8cc1Swenshuai.xi
vSCSI_EJECT_DEVICE(U8 lun)676*53ee8cc1Swenshuai.xi BOOLEAN vSCSI_EJECT_DEVICE(U8 lun)
677*53ee8cc1Swenshuai.xi {
678*53ee8cc1Swenshuai.xi BOOLEAN result;
679*53ee8cc1Swenshuai.xi
680*53ee8cc1Swenshuai.xi Mass_stor_us1.srb =&srb_data;
681*53ee8cc1Swenshuai.xi memset(Mass_stor_us1.srb, 0, sizeof(struct scsi_cmnd ));
682*53ee8cc1Swenshuai.xi
683*53ee8cc1Swenshuai.xi vSCSICmd_Prepare(Mass_stor_us1.srb,START_STOP);
684*53ee8cc1Swenshuai.xi Mass_stor_us1.srb->lun=lun;
685*53ee8cc1Swenshuai.xi OTGH_PT_BLK.sCBW.u8CB[4]= 2; //stop the device
686*53ee8cc1Swenshuai.xi
687*53ee8cc1Swenshuai.xi //result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
688*53ee8cc1Swenshuai.xi //if (result==FALSE) return result;
689*53ee8cc1Swenshuai.xi //OTGH_PT_BLK.sCBW.u8CB[0]= START_STOP;
690*53ee8cc1Swenshuai.xi //OTGH_PT_BLK.sCBW.u8CB[4]= 2; //stop the device
691*53ee8cc1Swenshuai.xi //printf("lun:%02bx\n",lun);
692*53ee8cc1Swenshuai.xi result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
693*53ee8cc1Swenshuai.xi return result;
694*53ee8cc1Swenshuai.xi }
695*53ee8cc1Swenshuai.xi
696*53ee8cc1Swenshuai.xi
697*53ee8cc1Swenshuai.xi
698*53ee8cc1Swenshuai.xi
699*53ee8cc1Swenshuai.xi
700*53ee8cc1Swenshuai.xi //=======================================================================================
701*53ee8cc1Swenshuai.xi //=======================================================================================
702*53ee8cc1Swenshuai.xi //=======================================================================================
703*53ee8cc1Swenshuai.xi //=======================================================================================
704*53ee8cc1Swenshuai.xi //***************************************************************************************
705*53ee8cc1Swenshuai.xi // Function Name:vSCSI_REQUEST_SENSE
706*53ee8cc1Swenshuai.xi // Description: Reserved.
707*53ee8cc1Swenshuai.xi // If Device do not support the command-A
708*53ee8cc1Swenshuai.xi // ,Host should issue command "vSCSI_REQUEST_SENSE" to ask "why not support".
709*53ee8cc1Swenshuai.xi // Input:
710*53ee8cc1Swenshuai.xi // Output:
711*53ee8cc1Swenshuai.xi // Status:P-OK
712*53ee8cc1Swenshuai.xi //***************************************************************************************
vSCSI_REQUEST_SENSE(U8 lun)713*53ee8cc1Swenshuai.xi BOOLEAN vSCSI_REQUEST_SENSE(U8 lun)
714*53ee8cc1Swenshuai.xi {
715*53ee8cc1Swenshuai.xi INT8U *u8RequestSenseData;
716*53ee8cc1Swenshuai.xi //Scsi_Cmnd srb_data;
717*53ee8cc1Swenshuai.xi BOOLEAN result;
718*53ee8cc1Swenshuai.xi
719*53ee8cc1Swenshuai.xi u8RequestSenseData=pUsbData;
720*53ee8cc1Swenshuai.xi Mass_stor_us1.srb = &srb_data;
721*53ee8cc1Swenshuai.xi memset(Mass_stor_us1.srb, 0, sizeof(struct scsi_cmnd ));
722*53ee8cc1Swenshuai.xi
723*53ee8cc1Swenshuai.xi // Build SCSI command.
724*53ee8cc1Swenshuai.xi vSCSICmd_REQUEST_SENSE( Mass_stor_us1.srb,u8RequestSenseData);
725*53ee8cc1Swenshuai.xi
726*53ee8cc1Swenshuai.xi Mass_stor_us1.srb->lun=lun;
727*53ee8cc1Swenshuai.xi
728*53ee8cc1Swenshuai.xi //call mass storage function to send CBW
729*53ee8cc1Swenshuai.xi //and get REQUEST_SENSE Data. Return CSW to check status.
730*53ee8cc1Swenshuai.xi result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
731*53ee8cc1Swenshuai.xi return result;
732*53ee8cc1Swenshuai.xi
733*53ee8cc1Swenshuai.xi
734*53ee8cc1Swenshuai.xi
735*53ee8cc1Swenshuai.xi }
736*53ee8cc1Swenshuai.xi
737*53ee8cc1Swenshuai.xi //***************************************************************************************
738*53ee8cc1Swenshuai.xi // Function Name:bSCSI_INQUIRY
739*53ee8cc1Swenshuai.xi // Description:To ask the device u8DeviceType/u8ProductID/u8ProductVer... information
740*53ee8cc1Swenshuai.xi // Input:
741*53ee8cc1Swenshuai.xi // Output:
742*53ee8cc1Swenshuai.xi // Status:P-OK
743*53ee8cc1Swenshuai.xi //***************************************************************************************
744*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
745*53ee8cc1Swenshuai.xi // bSCSI_INQUIRY()
746*53ee8cc1Swenshuai.xi // Description:
747*53ee8cc1Swenshuai.xi // 1. scsi inquiry command.
748*53ee8cc1Swenshuai.xi // input: none
749*53ee8cc1Swenshuai.xi // output: TRUE or FALSE (BOOLEAN)
750*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
751*53ee8cc1Swenshuai.xi //INT8U xdata u8InquiryData[DATA_LENGTH_INQUIRY] _at_ Host20_TEMP_DATA;
bSCSI_INQUIRY(U8 lun)752*53ee8cc1Swenshuai.xi BOOLEAN bSCSI_INQUIRY(U8 lun)
753*53ee8cc1Swenshuai.xi {
754*53ee8cc1Swenshuai.xi INT8U u8i, u8j;
755*53ee8cc1Swenshuai.xi //Scsi_Cmnd srb_data;
756*53ee8cc1Swenshuai.xi U8 *u8InquiryData;
757*53ee8cc1Swenshuai.xi BOOLEAN result;
758*53ee8cc1Swenshuai.xi
759*53ee8cc1Swenshuai.xi u8InquiryData=pUsbData;
760*53ee8cc1Swenshuai.xi //printf("INQUIRY\n");
761*53ee8cc1Swenshuai.xi for(u8j =0; u8j< ScsiCmd_Fail_Retry ;u8j++)
762*53ee8cc1Swenshuai.xi {
763*53ee8cc1Swenshuai.xi
764*53ee8cc1Swenshuai.xi Mass_stor_us1.srb =&srb_data;
765*53ee8cc1Swenshuai.xi memset(Mass_stor_us1.srb, 0, sizeof(struct scsi_cmnd ));
766*53ee8cc1Swenshuai.xi
767*53ee8cc1Swenshuai.xi //Build SCSI command.
768*53ee8cc1Swenshuai.xi vSCSICmd_INQUIRY( Mass_stor_us1.srb, u8InquiryData);
769*53ee8cc1Swenshuai.xi Mass_stor_us1.srb->lun=lun;
770*53ee8cc1Swenshuai.xi
771*53ee8cc1Swenshuai.xi //call mass storage function to send CBW
772*53ee8cc1Swenshuai.xi //and get INQUIRY Data. Return CSW to check status.
773*53ee8cc1Swenshuai.xi result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
774*53ee8cc1Swenshuai.xi if (result==FALSE) continue;
775*53ee8cc1Swenshuai.xi
776*53ee8cc1Swenshuai.xi if(Mass_stor_us1.srb->result == SAM_STAT_GOOD)
777*53ee8cc1Swenshuai.xi {
778*53ee8cc1Swenshuai.xi //save all INQUIRY data
779*53ee8cc1Swenshuai.xi Mass_stor_us1.device.u8DeviceType = (u8InquiryData[0] & 0x1F);
780*53ee8cc1Swenshuai.xi
781*53ee8cc1Swenshuai.xi Mass_stor_us1.Mass_stor_device[lun].bRMB = (u8InquiryData[1] & 0x80) >> 7;
782*53ee8cc1Swenshuai.xi //printf("Removable: %d\n", Mass_stor_us1.Mass_stor_device[lun].bRMB);
783*53ee8cc1Swenshuai.xi
784*53ee8cc1Swenshuai.xi for(u8i =0; u8i <8; u8i++)
785*53ee8cc1Swenshuai.xi Mass_stor_us1.Mass_stor_device[lun].u8VendorID[u8i] = u8InquiryData[u8i+8];
786*53ee8cc1Swenshuai.xi for(u8i =0; u8i <16; u8i++)
787*53ee8cc1Swenshuai.xi Mass_stor_us1.Mass_stor_device[lun].u8ProductID[u8i] = u8InquiryData[u8i+16];
788*53ee8cc1Swenshuai.xi for(u8i =0; u8i <4; u8i++)
789*53ee8cc1Swenshuai.xi Mass_stor_us1.Mass_stor_device[lun].u8ProductVer[u8i] = u8InquiryData[u8i+32];
790*53ee8cc1Swenshuai.xi
791*53ee8cc1Swenshuai.xi if(Mass_stor_us1.device.u8DeviceType != TYPE_DISK)
792*53ee8cc1Swenshuai.xi {
793*53ee8cc1Swenshuai.xi DRV_SCSI_DBG(printf("Device type unsuport, it's not a scsi disk%s","\n"));
794*53ee8cc1Swenshuai.xi
795*53ee8cc1Swenshuai.xi return FALSE;
796*53ee8cc1Swenshuai.xi }
797*53ee8cc1Swenshuai.xi else
798*53ee8cc1Swenshuai.xi {
799*53ee8cc1Swenshuai.xi
800*53ee8cc1Swenshuai.xi DRV_SCSI_DBG(SCSI_DbgPrint("SCSI INQUIRY : SCSI Device ID <%s>\n",&Mass_stor_us1.Mass_stor_device[lun].u8VendorID));
801*53ee8cc1Swenshuai.xi //SCSI_DbgPrint("SCSI INQUIRY : SCSI Product ID <%s>\n",&Mass_stor_us1.device.u8ProductID);
802*53ee8cc1Swenshuai.xi //SCSI_DbgPrint("SCSI INQUIRY : SCSI Product ver <%s>\n",&Mass_stor_us1.device.u8ProductVer);
803*53ee8cc1Swenshuai.xi return TRUE;
804*53ee8cc1Swenshuai.xi }
805*53ee8cc1Swenshuai.xi
806*53ee8cc1Swenshuai.xi
807*53ee8cc1Swenshuai.xi }
808*53ee8cc1Swenshuai.xi
809*53ee8cc1Swenshuai.xi }
810*53ee8cc1Swenshuai.xi return FALSE;
811*53ee8cc1Swenshuai.xi }
812*53ee8cc1Swenshuai.xi //***************************************************************************************
813*53ee8cc1Swenshuai.xi // Function Name:bSCSI_MODE_SENSE
814*53ee8cc1Swenshuai.xi // Description:To know the mode of device <1>.Write Protect => Y/N
815*53ee8cc1Swenshuai.xi // Input:
816*53ee8cc1Swenshuai.xi // Output:
817*53ee8cc1Swenshuai.xi // Status:P-OK
818*53ee8cc1Swenshuai.xi //***************************************************************************************
819*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
820*53ee8cc1Swenshuai.xi // bSCSI_MODE_SENSE()
821*53ee8cc1Swenshuai.xi // Description:
822*53ee8cc1Swenshuai.xi // 1. scsi mode sense command.
823*53ee8cc1Swenshuai.xi // input: none
824*53ee8cc1Swenshuai.xi // output: TRUE or FALSE (BOOLEAN)
825*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
bSCSI_MODE_SENSE(U8 lun)826*53ee8cc1Swenshuai.xi BOOLEAN bSCSI_MODE_SENSE(U8 lun)
827*53ee8cc1Swenshuai.xi {
828*53ee8cc1Swenshuai.xi INT8U u8j;
829*53ee8cc1Swenshuai.xi INT8U *u8ModeSenseData;
830*53ee8cc1Swenshuai.xi BOOLEAN result;
831*53ee8cc1Swenshuai.xi //Scsi_Cmnd srb_data;
832*53ee8cc1Swenshuai.xi
833*53ee8cc1Swenshuai.xi u8ModeSenseData=pUsbData;
834*53ee8cc1Swenshuai.xi
835*53ee8cc1Swenshuai.xi Mass_stor_us1.srb = &srb_data;
836*53ee8cc1Swenshuai.xi
837*53ee8cc1Swenshuai.xi for(u8j =0; u8j< ScsiCmd_Fail_Retry ;u8j++)
838*53ee8cc1Swenshuai.xi {
839*53ee8cc1Swenshuai.xi memset(Mass_stor_us1.srb, 0, sizeof(struct scsi_cmnd ));
840*53ee8cc1Swenshuai.xi //Build SCSI command.
841*53ee8cc1Swenshuai.xi vSCSICmd_MODE_SENSE( Mass_stor_us1.srb,0x3F, u8ModeSenseData);
842*53ee8cc1Swenshuai.xi Mass_stor_us1.srb->lun=lun;
843*53ee8cc1Swenshuai.xi
844*53ee8cc1Swenshuai.xi //call mass storage function to send CBW
845*53ee8cc1Swenshuai.xi //and get Mode Sense Data. Return CSW to check status.
846*53ee8cc1Swenshuai.xi result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
847*53ee8cc1Swenshuai.xi if (result==FALSE) return FALSE;
848*53ee8cc1Swenshuai.xi
849*53ee8cc1Swenshuai.xi if(Mass_stor_us1.srb->result == SAM_STAT_GOOD)
850*53ee8cc1Swenshuai.xi {
851*53ee8cc1Swenshuai.xi //save all Mode Sense(page code=0x3F) data
852*53ee8cc1Swenshuai.xi //Now we only use u8ModeSenseData[2], this byte save device
853*53ee8cc1Swenshuai.xi //write protection information
854*53ee8cc1Swenshuai.xi Mass_stor_us1.Mass_stor_device[lun].bWriteProtect = (u8ModeSenseData[2]==0x80)?
855*53ee8cc1Swenshuai.xi TRUE:FALSE;
856*53ee8cc1Swenshuai.xi
857*53ee8cc1Swenshuai.xi
858*53ee8cc1Swenshuai.xi return TRUE;
859*53ee8cc1Swenshuai.xi }
860*53ee8cc1Swenshuai.xi }
861*53ee8cc1Swenshuai.xi Mass_stor_us1.Mass_stor_device[lun].bWriteProtect=FALSE; //not support this command
862*53ee8cc1Swenshuai.xi return FALSE;
863*53ee8cc1Swenshuai.xi }
864*53ee8cc1Swenshuai.xi
865*53ee8cc1Swenshuai.xi //***************************************************************************************
866*53ee8cc1Swenshuai.xi // Function Name:bSCSI_MODE_SENSE_OperCode5A
867*53ee8cc1Swenshuai.xi // Description:To know the mode of device <1>.Write Protect => Y/N
868*53ee8cc1Swenshuai.xi // Input:
869*53ee8cc1Swenshuai.xi // Output:
870*53ee8cc1Swenshuai.xi // Status:P-OK
871*53ee8cc1Swenshuai.xi //***************************************************************************************
872*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
873*53ee8cc1Swenshuai.xi // bSCSI_MODE_SENSE_OperCode5A()
874*53ee8cc1Swenshuai.xi // Description:
875*53ee8cc1Swenshuai.xi // 1. scsi mode sense command.
876*53ee8cc1Swenshuai.xi // input: none
877*53ee8cc1Swenshuai.xi // output: TRUE or FALSE (BOOLEAN)
878*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
bSCSI_MODE_SENSE_OperCode5A(U8 lun)879*53ee8cc1Swenshuai.xi BOOLEAN bSCSI_MODE_SENSE_OperCode5A(U8 lun)
880*53ee8cc1Swenshuai.xi {
881*53ee8cc1Swenshuai.xi INT8U u8j;
882*53ee8cc1Swenshuai.xi INT8U *u8ModeSenseData;
883*53ee8cc1Swenshuai.xi BOOLEAN result;
884*53ee8cc1Swenshuai.xi //Scsi_Cmnd srb_data;
885*53ee8cc1Swenshuai.xi
886*53ee8cc1Swenshuai.xi u8ModeSenseData=pUsbData;
887*53ee8cc1Swenshuai.xi
888*53ee8cc1Swenshuai.xi Mass_stor_us1.srb = &srb_data;
889*53ee8cc1Swenshuai.xi
890*53ee8cc1Swenshuai.xi for(u8j =0; u8j< ScsiCmd_Fail_Retry ;u8j++)
891*53ee8cc1Swenshuai.xi {
892*53ee8cc1Swenshuai.xi memset(Mass_stor_us1.srb, 0, sizeof(struct scsi_cmnd ));
893*53ee8cc1Swenshuai.xi //Build SCSI command.
894*53ee8cc1Swenshuai.xi vSCSICmd_MODE_SENSE_OperCode5A( Mass_stor_us1.srb,0x3F, u8ModeSenseData);
895*53ee8cc1Swenshuai.xi Mass_stor_us1.srb->lun=lun;
896*53ee8cc1Swenshuai.xi
897*53ee8cc1Swenshuai.xi //call mass storage function to send CBW
898*53ee8cc1Swenshuai.xi //and get Mode Sense Data. Return CSW to check status.
899*53ee8cc1Swenshuai.xi result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
900*53ee8cc1Swenshuai.xi if (result==FALSE) return FALSE;
901*53ee8cc1Swenshuai.xi
902*53ee8cc1Swenshuai.xi if(Mass_stor_us1.srb->result == SAM_STAT_GOOD)
903*53ee8cc1Swenshuai.xi {
904*53ee8cc1Swenshuai.xi //save all Mode Sense(page code=0x3F) data
905*53ee8cc1Swenshuai.xi //Now we only use u8ModeSenseData[2], this byte save device
906*53ee8cc1Swenshuai.xi //write protection information
907*53ee8cc1Swenshuai.xi Mass_stor_us1.Mass_stor_device[lun].bWriteProtect = (u8ModeSenseData[3]==0x80)? //RCC?
908*53ee8cc1Swenshuai.xi TRUE:FALSE;
909*53ee8cc1Swenshuai.xi return TRUE;
910*53ee8cc1Swenshuai.xi }
911*53ee8cc1Swenshuai.xi }
912*53ee8cc1Swenshuai.xi Mass_stor_us1.Mass_stor_device[lun].bWriteProtect=FALSE; //not support this command
913*53ee8cc1Swenshuai.xi return FALSE;
914*53ee8cc1Swenshuai.xi }
915*53ee8cc1Swenshuai.xi
916*53ee8cc1Swenshuai.xi //***************************************************************************************
917*53ee8cc1Swenshuai.xi // Function Name:bSCSI_READ_CAPACITY
918*53ee8cc1Swenshuai.xi // Description:To get the CAPACITY
919*53ee8cc1Swenshuai.xi // Input:
920*53ee8cc1Swenshuai.xi // Output:
921*53ee8cc1Swenshuai.xi // Status:S
922*53ee8cc1Swenshuai.xi //***************************************************************************************
923*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
924*53ee8cc1Swenshuai.xi // bSCSI_READ_CAPACITY()
925*53ee8cc1Swenshuai.xi // Description:
926*53ee8cc1Swenshuai.xi // 1. scsi READ_CAPACITY command.
927*53ee8cc1Swenshuai.xi // input: none
928*53ee8cc1Swenshuai.xi // output: TRUE or FALSE (BOOLEAN)
929*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
bSCSI_READ_CAPACITY(U8 lun)930*53ee8cc1Swenshuai.xi BOOLEAN bSCSI_READ_CAPACITY(U8 lun)
931*53ee8cc1Swenshuai.xi {
932*53ee8cc1Swenshuai.xi //INT8U u8j;
933*53ee8cc1Swenshuai.xi INT8U *u8ReadCapacityData;
934*53ee8cc1Swenshuai.xi BOOLEAN result;
935*53ee8cc1Swenshuai.xi //Scsi_Cmnd srb_data;
936*53ee8cc1Swenshuai.xi
937*53ee8cc1Swenshuai.xi u8ReadCapacityData=pUsbData;
938*53ee8cc1Swenshuai.xi //for(u8j =0; u8j< ScsiCmd_Fail_Retry ;u8j++)
939*53ee8cc1Swenshuai.xi {
940*53ee8cc1Swenshuai.xi Mass_stor_us1.srb = &srb_data;
941*53ee8cc1Swenshuai.xi memset(Mass_stor_us1.srb, 0, sizeof(struct scsi_cmnd ));
942*53ee8cc1Swenshuai.xi
943*53ee8cc1Swenshuai.xi //Build SCSI command.
944*53ee8cc1Swenshuai.xi vSCSICmd_READ_CAPACITY(Mass_stor_us1.srb, u8ReadCapacityData);
945*53ee8cc1Swenshuai.xi Mass_stor_us1.srb->lun=lun;
946*53ee8cc1Swenshuai.xi
947*53ee8cc1Swenshuai.xi //call mass storage function to send CBW
948*53ee8cc1Swenshuai.xi //and get CAPACITY Data. Return CSW to check status.
949*53ee8cc1Swenshuai.xi result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
950*53ee8cc1Swenshuai.xi if (result==FALSE) return result;
951*53ee8cc1Swenshuai.xi
952*53ee8cc1Swenshuai.xi if(Mass_stor_us1.srb->result == SAM_STAT_GOOD)
953*53ee8cc1Swenshuai.xi {
954*53ee8cc1Swenshuai.xi //save all CAPACITY data
955*53ee8cc1Swenshuai.xi Mass_stor_us1.Mass_stor_device[lun].u32BlockTotalNum = ((INT32U)u8ReadCapacityData[0] << 24) |
956*53ee8cc1Swenshuai.xi ((INT32U)u8ReadCapacityData[1] << 16) |
957*53ee8cc1Swenshuai.xi ((INT32U)u8ReadCapacityData[2] << 8) |
958*53ee8cc1Swenshuai.xi ((INT32U)u8ReadCapacityData[3] ) ;
959*53ee8cc1Swenshuai.xi
960*53ee8cc1Swenshuai.xi Mass_stor_us1.Mass_stor_device[lun].u32BlockSize = ((INT32U)u8ReadCapacityData[4] << 24) |
961*53ee8cc1Swenshuai.xi ((INT32U)u8ReadCapacityData[5] << 16) |
962*53ee8cc1Swenshuai.xi ((INT32U)u8ReadCapacityData[6] << 8) |
963*53ee8cc1Swenshuai.xi ((INT32U)u8ReadCapacityData[7] ) ;
964*53ee8cc1Swenshuai.xi //if ( Mass_stor_us1.Mass_stor_device[lun].u32BlockSize > 1024)
965*53ee8cc1Swenshuai.xi //{
966*53ee8cc1Swenshuai.xi // printf("Block size over 1024, is %X\n",Mass_stor_us1.Mass_stor_device[lun].u32BlockSize);
967*53ee8cc1Swenshuai.xi // while(1);
968*53ee8cc1Swenshuai.xi //}
969*53ee8cc1Swenshuai.xi
970*53ee8cc1Swenshuai.xi DRV_SCSI_DBG(SCSI_DbgPrint("SCSI CAPACITY : SCSI Device total block <0x%x%x>\n",
971*53ee8cc1Swenshuai.xi (INT16U)(Mass_stor_us1.Mass_stor_device[lun].u32BlockTotalNum >> 16),
972*53ee8cc1Swenshuai.xi (INT16U)Mass_stor_us1.Mass_stor_device[lun].u32BlockTotalNum));
973*53ee8cc1Swenshuai.xi DRV_SCSI_DBG(SCSI_DbgPrint("SCSI CAPACITY : SCSI Product block size <0x%x bytes>\n",(INT16U)Mass_stor_us1.Mass_stor_device[lun].u32BlockSize));
974*53ee8cc1Swenshuai.xi
975*53ee8cc1Swenshuai.xi return TRUE;
976*53ee8cc1Swenshuai.xi }
977*53ee8cc1Swenshuai.xi else
978*53ee8cc1Swenshuai.xi {
979*53ee8cc1Swenshuai.xi vSCSI_REQUEST_SENSE(lun);
980*53ee8cc1Swenshuai.xi #if 0
981*53ee8cc1Swenshuai.xi printf("ReqSense: ");
982*53ee8cc1Swenshuai.xi for (ii=0; ii<18; ii++)
983*53ee8cc1Swenshuai.xi {
984*53ee8cc1Swenshuai.xi printf(" %bx", pUsbData[ii]);
985*53ee8cc1Swenshuai.xi }
986*53ee8cc1Swenshuai.xi printf("\n");
987*53ee8cc1Swenshuai.xi #endif
988*53ee8cc1Swenshuai.xi return FALSE;
989*53ee8cc1Swenshuai.xi }
990*53ee8cc1Swenshuai.xi }
991*53ee8cc1Swenshuai.xi return FALSE;
992*53ee8cc1Swenshuai.xi
993*53ee8cc1Swenshuai.xi }
994*53ee8cc1Swenshuai.xi
bSCSI_READ_FORMAT_CAPACITY(U8 lun)995*53ee8cc1Swenshuai.xi BOOLEAN bSCSI_READ_FORMAT_CAPACITY(U8 lun)
996*53ee8cc1Swenshuai.xi {
997*53ee8cc1Swenshuai.xi INT8U u8j;
998*53ee8cc1Swenshuai.xi INT8U *u8ReadCapacityData;
999*53ee8cc1Swenshuai.xi BOOLEAN result;
1000*53ee8cc1Swenshuai.xi //Scsi_Cmnd srb_data;
1001*53ee8cc1Swenshuai.xi
1002*53ee8cc1Swenshuai.xi u8ReadCapacityData=pUsbData;
1003*53ee8cc1Swenshuai.xi for(u8j =0; u8j< ScsiCmd_Fail_Retry ;u8j++)
1004*53ee8cc1Swenshuai.xi {
1005*53ee8cc1Swenshuai.xi Mass_stor_us1.srb = &srb_data;
1006*53ee8cc1Swenshuai.xi memset(Mass_stor_us1.srb, 0, sizeof(struct scsi_cmnd ));
1007*53ee8cc1Swenshuai.xi
1008*53ee8cc1Swenshuai.xi //Build SCSI command.
1009*53ee8cc1Swenshuai.xi vSCSICmd_READ_FORMAT_CAPACITY(Mass_stor_us1.srb, u8ReadCapacityData);
1010*53ee8cc1Swenshuai.xi Mass_stor_us1.srb->lun=lun;
1011*53ee8cc1Swenshuai.xi
1012*53ee8cc1Swenshuai.xi //call mass storage function to send CBW
1013*53ee8cc1Swenshuai.xi //and get CAPACITY Data. Return CSW to check status.
1014*53ee8cc1Swenshuai.xi result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
1015*53ee8cc1Swenshuai.xi if (result==FALSE) return result;
1016*53ee8cc1Swenshuai.xi
1017*53ee8cc1Swenshuai.xi if(Mass_stor_us1.srb->result == SAM_STAT_GOOD)
1018*53ee8cc1Swenshuai.xi {
1019*53ee8cc1Swenshuai.xi //save all CAPACITY data
1020*53ee8cc1Swenshuai.xi Mass_stor_us1.Mass_stor_device[lun].u32BlockTotalNum = ((INT32U)u8ReadCapacityData[4] << 24) |
1021*53ee8cc1Swenshuai.xi ((INT32U)u8ReadCapacityData[5] << 16) |
1022*53ee8cc1Swenshuai.xi ((INT32U)u8ReadCapacityData[6] << 8) |
1023*53ee8cc1Swenshuai.xi ((INT32U)u8ReadCapacityData[7] ) ;
1024*53ee8cc1Swenshuai.xi
1025*53ee8cc1Swenshuai.xi Mass_stor_us1.Mass_stor_device[lun].u32BlockSize = ((INT32U)u8ReadCapacityData[9] << 16) |
1026*53ee8cc1Swenshuai.xi ((INT32U)u8ReadCapacityData[10] << 8) |
1027*53ee8cc1Swenshuai.xi ((INT32U)u8ReadCapacityData[11] ) ;
1028*53ee8cc1Swenshuai.xi //if ( Mass_stor_us1.Mass_stor_device[lun].u32BlockSize > 1024)
1029*53ee8cc1Swenshuai.xi //{
1030*53ee8cc1Swenshuai.xi // printf("Block size over 1024, is %X\n",Mass_stor_us1.Mass_stor_device[lun].u32BlockSize);
1031*53ee8cc1Swenshuai.xi // while(1);
1032*53ee8cc1Swenshuai.xi //}
1033*53ee8cc1Swenshuai.xi
1034*53ee8cc1Swenshuai.xi DRV_SCSI_DBG(SCSI_DbgPrint("SCSI CAPACITY : SCSI Device total block <0x%x%x>\n",
1035*53ee8cc1Swenshuai.xi (INT16U)(Mass_stor_us1.Mass_stor_device[lun].u32BlockTotalNum >> 16),
1036*53ee8cc1Swenshuai.xi (INT16U)Mass_stor_us1.Mass_stor_device[lun].u32BlockTotalNum));
1037*53ee8cc1Swenshuai.xi DRV_SCSI_DBG(SCSI_DbgPrint("SCSI CAPACITY : SCSI Product block size <0x%x bytes>\n",(INT16U)Mass_stor_us1.Mass_stor_device[lun].u32BlockSize));
1038*53ee8cc1Swenshuai.xi
1039*53ee8cc1Swenshuai.xi return TRUE;
1040*53ee8cc1Swenshuai.xi }
1041*53ee8cc1Swenshuai.xi }
1042*53ee8cc1Swenshuai.xi return FALSE;
1043*53ee8cc1Swenshuai.xi
1044*53ee8cc1Swenshuai.xi }
1045*53ee8cc1Swenshuai.xi
1046*53ee8cc1Swenshuai.xi extern void OTGH_PT_Bulk_Init(void);
1047*53ee8cc1Swenshuai.xi //***************************************************************************************
1048*53ee8cc1Swenshuai.xi // Function Name:bSCSI_TEST_UNIT_READY
1049*53ee8cc1Swenshuai.xi // Description: To know that "device is ready ?"
1050*53ee8cc1Swenshuai.xi // Input:
1051*53ee8cc1Swenshuai.xi // Output:
1052*53ee8cc1Swenshuai.xi // Status:
1053*53ee8cc1Swenshuai.xi //***************************************************************************************
1054*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
1055*53ee8cc1Swenshuai.xi // bSCSI_TEST_UNIT_READY()
1056*53ee8cc1Swenshuai.xi // Description:
1057*53ee8cc1Swenshuai.xi // 1. scsi TEST_UNIT_READY command.
1058*53ee8cc1Swenshuai.xi // input: none
1059*53ee8cc1Swenshuai.xi // output: TRUE or FALSE (BOOLEAN)
1060*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////
bSCSI_TEST_UNIT_READY(U8 lun)1061*53ee8cc1Swenshuai.xi BOOLEAN bSCSI_TEST_UNIT_READY(U8 lun)
1062*53ee8cc1Swenshuai.xi {
1063*53ee8cc1Swenshuai.xi INT8U u8j;
1064*53ee8cc1Swenshuai.xi BOOLEAN result;
1065*53ee8cc1Swenshuai.xi #ifdef ATV_SERISE_USE
1066*53ee8cc1Swenshuai.xi U32 i;
1067*53ee8cc1Swenshuai.xi #endif
1068*53ee8cc1Swenshuai.xi //Scsi_Cmnd srb_data;
1069*53ee8cc1Swenshuai.xi //printf("TUR\n");
1070*53ee8cc1Swenshuai.xi
1071*53ee8cc1Swenshuai.xi for(u8j =0; u8j< TestUnitReady_Fail_Retry ;u8j++)
1072*53ee8cc1Swenshuai.xi {
1073*53ee8cc1Swenshuai.xi //printf("connect status:%02bx\n",mwHost20_PORTSC_ConnectStatus_Rd());
1074*53ee8cc1Swenshuai.xi if (mwHost20_PORTSC_ConnectStatus_Rd()==0)
1075*53ee8cc1Swenshuai.xi return FALSE; //device is not connected
1076*53ee8cc1Swenshuai.xi
1077*53ee8cc1Swenshuai.xi Mass_stor_us1.srb = &srb_data;
1078*53ee8cc1Swenshuai.xi memset((U8 xdata *)Mass_stor_us1.srb, 0, sizeof(struct scsi_cmnd ));
1079*53ee8cc1Swenshuai.xi
1080*53ee8cc1Swenshuai.xi // Build SCSI command.
1081*53ee8cc1Swenshuai.xi vSCSICmd_Prepare(Mass_stor_us1.srb,TEST_UNIT_READY);
1082*53ee8cc1Swenshuai.xi //vSCSICmd_TEST_UNIT_READY(Mass_stor_us1.srb);
1083*53ee8cc1Swenshuai.xi Mass_stor_us1.srb->lun=lun;
1084*53ee8cc1Swenshuai.xi //printf("Mass_stor_us1.srb:%02bx\n",Mass_stor_us1.srb->request_bufflen);
1085*53ee8cc1Swenshuai.xi //call mass storage function to send CBW
1086*53ee8cc1Swenshuai.xi //and get CAPACITY Data. Return CSW to check status.
1087*53ee8cc1Swenshuai.xi
1088*53ee8cc1Swenshuai.xi result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
1089*53ee8cc1Swenshuai.xi //printf("result:%02bx\n",result);
1090*53ee8cc1Swenshuai.xi #if 1
1091*53ee8cc1Swenshuai.xi if (result == FALSE)
1092*53ee8cc1Swenshuai.xi {
1093*53ee8cc1Swenshuai.xi if (gUsbStatus == USB_TIMEOUT)
1094*53ee8cc1Swenshuai.xi {
1095*53ee8cc1Swenshuai.xi DRV_SCSI_DBG(printf("resend TUR\n"));
1096*53ee8cc1Swenshuai.xi if ( MDrv_UsbHost_Init() && (flib_Host20_Enumerate(1,3)!=0) )
1097*53ee8cc1Swenshuai.xi {
1098*53ee8cc1Swenshuai.xi OTGH_PT_Bulk_Init();
1099*53ee8cc1Swenshuai.xi continue;
1100*53ee8cc1Swenshuai.xi }
1101*53ee8cc1Swenshuai.xi }
1102*53ee8cc1Swenshuai.xi else
1103*53ee8cc1Swenshuai.xi return result;
1104*53ee8cc1Swenshuai.xi }
1105*53ee8cc1Swenshuai.xi #else
1106*53ee8cc1Swenshuai.xi if (result==FALSE)
1107*53ee8cc1Swenshuai.xi {
1108*53ee8cc1Swenshuai.xi return result;
1109*53ee8cc1Swenshuai.xi }
1110*53ee8cc1Swenshuai.xi #endif
1111*53ee8cc1Swenshuai.xi if(Mass_stor_us1.srb->result == SAM_STAT_GOOD)
1112*53ee8cc1Swenshuai.xi {
1113*53ee8cc1Swenshuai.xi Mass_stor_us1.Mass_stor_device[lun].bDeviceReady = TRUE;
1114*53ee8cc1Swenshuai.xi //SCSI_DbgPrint("SCSI TEST UNIT READY : Succeed\n",u8Drive);
1115*53ee8cc1Swenshuai.xi
1116*53ee8cc1Swenshuai.xi return TRUE;
1117*53ee8cc1Swenshuai.xi }
1118*53ee8cc1Swenshuai.xi else
1119*53ee8cc1Swenshuai.xi {
1120*53ee8cc1Swenshuai.xi #ifndef ATV_SERISE_USE
1121*53ee8cc1Swenshuai.xi MsOS_DelayTask(10);
1122*53ee8cc1Swenshuai.xi #else
1123*53ee8cc1Swenshuai.xi for(i=0;i<(0x100);i++);
1124*53ee8cc1Swenshuai.xi #endif
1125*53ee8cc1Swenshuai.xi
1126*53ee8cc1Swenshuai.xi result=vSCSI_REQUEST_SENSE(lun);
1127*53ee8cc1Swenshuai.xi if ((pUsbData[12]==0x3a)&&(pUsbData[13]==0)) return FALSE; //no media
1128*53ee8cc1Swenshuai.xi if (result==FALSE) return result;
1129*53ee8cc1Swenshuai.xi }
1130*53ee8cc1Swenshuai.xi #ifndef ATV_SERISE_USE
1131*53ee8cc1Swenshuai.xi MsOS_DelayTask(10);
1132*53ee8cc1Swenshuai.xi #else
1133*53ee8cc1Swenshuai.xi for(i=0;i<0x100;i++);
1134*53ee8cc1Swenshuai.xi #endif
1135*53ee8cc1Swenshuai.xi }
1136*53ee8cc1Swenshuai.xi //SCSI_DbgPrint("SCSI TEST UNIT READY : Failed%s","\n");
1137*53ee8cc1Swenshuai.xi return FALSE;
1138*53ee8cc1Swenshuai.xi }
1139*53ee8cc1Swenshuai.xi extern BOOLEAN MDrv_Usb_Device_Enum(void);
1140*53ee8cc1Swenshuai.xi #ifdef ATV_SERISE_USE
1141*53ee8cc1Swenshuai.xi extern void EnableINT(void);
1142*53ee8cc1Swenshuai.xi #endif
1143*53ee8cc1Swenshuai.xi
bSCSI_TEST_UNIT_READY2(U8 lun)1144*53ee8cc1Swenshuai.xi BOOLEAN bSCSI_TEST_UNIT_READY2(U8 lun)
1145*53ee8cc1Swenshuai.xi {
1146*53ee8cc1Swenshuai.xi INT8U u8j;
1147*53ee8cc1Swenshuai.xi BOOLEAN result;
1148*53ee8cc1Swenshuai.xi U8 RetryCnt=0;
1149*53ee8cc1Swenshuai.xi
1150*53ee8cc1Swenshuai.xi #ifdef ATV_SERISE_USE
1151*53ee8cc1Swenshuai.xi U32 i;
1152*53ee8cc1Swenshuai.xi #endif
1153*53ee8cc1Swenshuai.xi //Scsi_Cmnd srb_data;
1154*53ee8cc1Swenshuai.xi //printf("TUR\n");
1155*53ee8cc1Swenshuai.xi
1156*53ee8cc1Swenshuai.xi for(u8j =0; u8j< TestUnitReady_Fail_Retry ;u8j++)
1157*53ee8cc1Swenshuai.xi {
1158*53ee8cc1Swenshuai.xi //printf("connect status:%02bx\n",mwHost20_PORTSC_ConnectStatus_Rd());
1159*53ee8cc1Swenshuai.xi if (mwHost20_PORTSC_ConnectStatus_Rd()==0)
1160*53ee8cc1Swenshuai.xi return FALSE; //device is not connected
1161*53ee8cc1Swenshuai.xi
1162*53ee8cc1Swenshuai.xi Mass_stor_us1.srb = &srb_data;
1163*53ee8cc1Swenshuai.xi memset((U8 xdata *)Mass_stor_us1.srb, 0, sizeof(struct scsi_cmnd ));
1164*53ee8cc1Swenshuai.xi
1165*53ee8cc1Swenshuai.xi // Build SCSI command.
1166*53ee8cc1Swenshuai.xi vSCSICmd_Prepare(Mass_stor_us1.srb,TEST_UNIT_READY);
1167*53ee8cc1Swenshuai.xi //vSCSICmd_TEST_UNIT_READY(Mass_stor_us1.srb);
1168*53ee8cc1Swenshuai.xi Mass_stor_us1.srb->lun=lun;
1169*53ee8cc1Swenshuai.xi //printf("Mass_stor_us1.srb:%02bx\n",Mass_stor_us1.srb->request_bufflen);
1170*53ee8cc1Swenshuai.xi //call mass storage function to send CBW
1171*53ee8cc1Swenshuai.xi //and get CAPACITY Data. Return CSW to check status.
1172*53ee8cc1Swenshuai.xi
1173*53ee8cc1Swenshuai.xi result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
1174*53ee8cc1Swenshuai.xi //printf("result:%02bx\n",result);
1175*53ee8cc1Swenshuai.xi
1176*53ee8cc1Swenshuai.xi if (result==FALSE)
1177*53ee8cc1Swenshuai.xi {
1178*53ee8cc1Swenshuai.xi RetryCnt++;
1179*53ee8cc1Swenshuai.xi if (gUsbStatus==USB_TIMEOUT)
1180*53ee8cc1Swenshuai.xi {
1181*53ee8cc1Swenshuai.xi if (RetryCnt > 3) return FALSE;
1182*53ee8cc1Swenshuai.xi if ((RetryCnt==2)&&(mwOTG20_Control_HOST_SPD_TYP_Rd()==2) ) //make sure it is hi speed
1183*53ee8cc1Swenshuai.xi {
1184*53ee8cc1Swenshuai.xi DRV_SCSI_DBG( printf("Force FS\n"));
1185*53ee8cc1Swenshuai.xi UHC_ORXBYTE(0x40,0x80);//force enter FSmode
1186*53ee8cc1Swenshuai.xi }
1187*53ee8cc1Swenshuai.xi #ifndef ATV_SERISE_USE
1188*53ee8cc1Swenshuai.xi msAPI_Timer_ResetWDT();
1189*53ee8cc1Swenshuai.xi #else
1190*53ee8cc1Swenshuai.xi #ifdef Enable_Close_INT
1191*53ee8cc1Swenshuai.xi //XBYTE[0x2B00]&=0xFD;
1192*53ee8cc1Swenshuai.xi EnableINT();
1193*53ee8cc1Swenshuai.xi #endif
1194*53ee8cc1Swenshuai.xi #endif
1195*53ee8cc1Swenshuai.xi #ifdef Enable_Low_Temperature_Patch
1196*53ee8cc1Swenshuai.xi if(gSpeed==0)
1197*53ee8cc1Swenshuai.xi {
1198*53ee8cc1Swenshuai.xi //printf("\r\n CDR toggle!!",0);
1199*53ee8cc1Swenshuai.xi UTMI_SETXBYTE(0x0a,UTMI_READXBYTE(0x0a)^0x10); //invert CDR_CLOCK
1200*53ee8cc1Swenshuai.xi UTMI_ORXBYTE(0x06,0x03); //reset UTMI
1201*53ee8cc1Swenshuai.xi UTMI_ANDXBYTE(0x06,0xfc);
1202*53ee8cc1Swenshuai.xi
1203*53ee8cc1Swenshuai.xi }
1204*53ee8cc1Swenshuai.xi #endif
1205*53ee8cc1Swenshuai.xi // MDrv_Usb_Device_Enum();
1206*53ee8cc1Swenshuai.xi if (MDrv_Usb_Device_Enum()==FALSE) return FALSE;
1207*53ee8cc1Swenshuai.xi
1208*53ee8cc1Swenshuai.xi continue;
1209*53ee8cc1Swenshuai.xi }
1210*53ee8cc1Swenshuai.xi else
1211*53ee8cc1Swenshuai.xi return FALSE;
1212*53ee8cc1Swenshuai.xi }
1213*53ee8cc1Swenshuai.xi
1214*53ee8cc1Swenshuai.xi if(Mass_stor_us1.srb->result == SAM_STAT_GOOD)
1215*53ee8cc1Swenshuai.xi {
1216*53ee8cc1Swenshuai.xi Mass_stor_us1.Mass_stor_device[lun].bDeviceReady = TRUE;
1217*53ee8cc1Swenshuai.xi //SCSI_DbgPrint("SCSI TEST UNIT READY : Succeed\n",u8Drive);
1218*53ee8cc1Swenshuai.xi
1219*53ee8cc1Swenshuai.xi return TRUE;
1220*53ee8cc1Swenshuai.xi }
1221*53ee8cc1Swenshuai.xi else
1222*53ee8cc1Swenshuai.xi {
1223*53ee8cc1Swenshuai.xi #ifndef ATV_SERISE_USE
1224*53ee8cc1Swenshuai.xi MsOS_DelayTask(10);
1225*53ee8cc1Swenshuai.xi #else
1226*53ee8cc1Swenshuai.xi for(i=0;i<(0x100);i++);
1227*53ee8cc1Swenshuai.xi #endif
1228*53ee8cc1Swenshuai.xi
1229*53ee8cc1Swenshuai.xi result=vSCSI_REQUEST_SENSE(lun);
1230*53ee8cc1Swenshuai.xi if ((pUsbData[12]==0x3a)&&(pUsbData[13]==0)) return FALSE; //no media
1231*53ee8cc1Swenshuai.xi if ((pUsbData[12]==0x28)&&(pUsbData[13]==0)) return FALSE; //media change
1232*53ee8cc1Swenshuai.xi if (result==FALSE) return result;
1233*53ee8cc1Swenshuai.xi }
1234*53ee8cc1Swenshuai.xi #ifndef ATV_SERISE_USE
1235*53ee8cc1Swenshuai.xi MsOS_DelayTask(10);
1236*53ee8cc1Swenshuai.xi #else
1237*53ee8cc1Swenshuai.xi for(i=0;i<0x100;i++);
1238*53ee8cc1Swenshuai.xi #endif
1239*53ee8cc1Swenshuai.xi }
1240*53ee8cc1Swenshuai.xi //SCSI_DbgPrint("SCSI TEST UNIT READY : Failed%s","\n");
1241*53ee8cc1Swenshuai.xi return FALSE;
1242*53ee8cc1Swenshuai.xi }
1243*53ee8cc1Swenshuai.xi //***************************************************************************************
1244*53ee8cc1Swenshuai.xi // Function Name:bSCSI_Initial
1245*53ee8cc1Swenshuai.xi // Description:
1246*53ee8cc1Swenshuai.xi // Input:
1247*53ee8cc1Swenshuai.xi // Output:
1248*53ee8cc1Swenshuai.xi // Status:P-OK
1249*53ee8cc1Swenshuai.xi //***************************************************************************************
1250*53ee8cc1Swenshuai.xi U8 ValidLunNum;
bSCSI_Initial(void)1251*53ee8cc1Swenshuai.xi BOOLEAN bSCSI_Initial(void)
1252*53ee8cc1Swenshuai.xi {
1253*53ee8cc1Swenshuai.xi //INT8U i=0;
1254*53ee8cc1Swenshuai.xi //iCardSuddenlyRemove = FALSE;
1255*53ee8cc1Swenshuai.xi //iCardReplace = FALSE;
1256*53ee8cc1Swenshuai.xi BOOLEAN bFoundValidDev = FALSE;
1257*53ee8cc1Swenshuai.xi struct LUN_Device* LunDevice = Mass_stor_us1.Mass_stor_device;
1258*53ee8cc1Swenshuai.xi U8 LunIdx;
1259*53ee8cc1Swenshuai.xi
1260*53ee8cc1Swenshuai.xi ValidLunNum=0;
1261*53ee8cc1Swenshuai.xi for ( LunIdx=0; LunIdx<=Mass_stor_us1.max_lun; LunIdx++)
1262*53ee8cc1Swenshuai.xi {
1263*53ee8cc1Swenshuai.xi LunDevice[LunIdx].bDeviceValid=FALSE;
1264*53ee8cc1Swenshuai.xi if (bSCSI_INQUIRY(LunIdx))
1265*53ee8cc1Swenshuai.xi {
1266*53ee8cc1Swenshuai.xi LunDevice[LunIdx].bDeviceValid=TRUE;
1267*53ee8cc1Swenshuai.xi ValidLunNum++;
1268*53ee8cc1Swenshuai.xi }
1269*53ee8cc1Swenshuai.xi //break;
1270*53ee8cc1Swenshuai.xi }
1271*53ee8cc1Swenshuai.xi DRV_SCSI_DBG(printf("ValidLunNum:%02bx\n",ValidLunNum));
1272*53ee8cc1Swenshuai.xi // For some usb harddrive without enough power, may meet following case.
1273*53ee8cc1Swenshuai.xi if (!ValidLunNum)
1274*53ee8cc1Swenshuai.xi {
1275*53ee8cc1Swenshuai.xi if (mwHost20_PORTSC_ConnectChange_Rd()==0)
1276*53ee8cc1Swenshuai.xi MDrv_SetUsbDeviceStatus(BAD_DEVICE);
1277*53ee8cc1Swenshuai.xi return bFoundValidDev;
1278*53ee8cc1Swenshuai.xi }
1279*53ee8cc1Swenshuai.xi
1280*53ee8cc1Swenshuai.xi // Sometime device is failed to initial at first time, but success at last.
1281*53ee8cc1Swenshuai.xi // It set the device status as BAD_DEVICE at first time when it failed.
1282*53ee8cc1Swenshuai.xi // We need to set correct value to device status when successed.
1283*53ee8cc1Swenshuai.xi if (gSpeed==2)
1284*53ee8cc1Swenshuai.xi {
1285*53ee8cc1Swenshuai.xi MDrv_SetUsbDeviceStatus(USB20_DEVICE);
1286*53ee8cc1Swenshuai.xi }
1287*53ee8cc1Swenshuai.xi else
1288*53ee8cc1Swenshuai.xi {
1289*53ee8cc1Swenshuai.xi MDrv_SetUsbDeviceStatus(USB11_DEVICE);
1290*53ee8cc1Swenshuai.xi }
1291*53ee8cc1Swenshuai.xi #ifdef ATV_SERISE_USE
1292*53ee8cc1Swenshuai.xi #ifdef Enable_Close_INT
1293*53ee8cc1Swenshuai.xi EA=0;
1294*53ee8cc1Swenshuai.xi #endif
1295*53ee8cc1Swenshuai.xi #endif
1296*53ee8cc1Swenshuai.xi for ( LunIdx=0; LunIdx<=Mass_stor_us1.max_lun; LunIdx++)
1297*53ee8cc1Swenshuai.xi {
1298*53ee8cc1Swenshuai.xi LunDevice[LunIdx].bDeviceReady = FALSE;
1299*53ee8cc1Swenshuai.xi if (!bInit_USB_LUN(LunIdx))
1300*53ee8cc1Swenshuai.xi continue;
1301*53ee8cc1Swenshuai.xi LunDevice[LunIdx].bDeviceReady = TRUE;
1302*53ee8cc1Swenshuai.xi bFoundValidDev = TRUE;
1303*53ee8cc1Swenshuai.xi
1304*53ee8cc1Swenshuai.xi }
1305*53ee8cc1Swenshuai.xi #ifdef ATV_SERISE_USE
1306*53ee8cc1Swenshuai.xi #ifdef Enable_Close_INT
1307*53ee8cc1Swenshuai.xi EA=1;
1308*53ee8cc1Swenshuai.xi #endif
1309*53ee8cc1Swenshuai.xi #endif
1310*53ee8cc1Swenshuai.xi return bFoundValidDev;
1311*53ee8cc1Swenshuai.xi
1312*53ee8cc1Swenshuai.xi }
GetValidLun(void)1313*53ee8cc1Swenshuai.xi void GetValidLun(void)
1314*53ee8cc1Swenshuai.xi {
1315*53ee8cc1Swenshuai.xi U8 LunIdx;
1316*53ee8cc1Swenshuai.xi struct LUN_Device* LunDevice = Mass_stor_us1.Mass_stor_device;
1317*53ee8cc1Swenshuai.xi
1318*53ee8cc1Swenshuai.xi if (LunDevice == NULL)
1319*53ee8cc1Swenshuai.xi {
1320*53ee8cc1Swenshuai.xi DRV_SCSI_DBG(printf(" LUN structure not initialized!!\n"));
1321*53ee8cc1Swenshuai.xi return;
1322*53ee8cc1Swenshuai.xi }
1323*53ee8cc1Swenshuai.xi
1324*53ee8cc1Swenshuai.xi if ( (Mass_stor_us1.max_lun == 0) && (!LunDevice[0].bRMB) && LunDevice[0].bDeviceReady)
1325*53ee8cc1Swenshuai.xi {
1326*53ee8cc1Swenshuai.xi //20120817, Don't do TUR on this special USB HDD.
1327*53ee8cc1Swenshuai.xi //It returns NOT READY after 30 minutes idle.
1328*53ee8cc1Swenshuai.xi return;
1329*53ee8cc1Swenshuai.xi }
1330*53ee8cc1Swenshuai.xi
1331*53ee8cc1Swenshuai.xi for (LunIdx=0; LunIdx<=Mass_stor_us1.max_lun; LunIdx++)
1332*53ee8cc1Swenshuai.xi {
1333*53ee8cc1Swenshuai.xi if (LunDevice[LunIdx].bDeviceValid)
1334*53ee8cc1Swenshuai.xi {
1335*53ee8cc1Swenshuai.xi if(!bSCSI_TEST_UNIT_READY2(LunIdx))
1336*53ee8cc1Swenshuai.xi {
1337*53ee8cc1Swenshuai.xi LunDevice[LunIdx].bDeviceReady=FALSE;
1338*53ee8cc1Swenshuai.xi LunDevice[LunIdx].u32BlockSize = 0; // 20111110: resolve lun capacity zero if not the first lun
1339*53ee8cc1Swenshuai.xi LunDevice[LunIdx].u32BlockTotalNum = 0;
1340*53ee8cc1Swenshuai.xi }
1341*53ee8cc1Swenshuai.xi else
1342*53ee8cc1Swenshuai.xi {
1343*53ee8cc1Swenshuai.xi LunDevice[LunIdx].bDeviceReady = TRUE;
1344*53ee8cc1Swenshuai.xi if (LunDevice[LunIdx].u32BlockSize == 0) // 20111110: resolve lun capacity zero if not the first lun
1345*53ee8cc1Swenshuai.xi {
1346*53ee8cc1Swenshuai.xi if(!bSCSI_READ_CAPACITY(LunIdx))
1347*53ee8cc1Swenshuai.xi {
1348*53ee8cc1Swenshuai.xi if (!bSCSI_READ_FORMAT_CAPACITY(LunIdx))
1349*53ee8cc1Swenshuai.xi {
1350*53ee8cc1Swenshuai.xi DRV_SCSI_DBG(SCSI_DbgPrint("Read CAPACITY failed.%s","\n"));
1351*53ee8cc1Swenshuai.xi }
1352*53ee8cc1Swenshuai.xi }
1353*53ee8cc1Swenshuai.xi }
1354*53ee8cc1Swenshuai.xi }
1355*53ee8cc1Swenshuai.xi }
1356*53ee8cc1Swenshuai.xi else
1357*53ee8cc1Swenshuai.xi LunDevice[LunIdx].bDeviceReady=FALSE; //not a valid device, so always not ready
1358*53ee8cc1Swenshuai.xi }
1359*53ee8cc1Swenshuai.xi }
bInit_USB_LUN(U8 Lun)1360*53ee8cc1Swenshuai.xi BOOLEAN bInit_USB_LUN(U8 Lun)
1361*53ee8cc1Swenshuai.xi {
1362*53ee8cc1Swenshuai.xi U16 uVID, uPID;
1363*53ee8cc1Swenshuai.xi U8 ii;
1364*53ee8cc1Swenshuai.xi BOOLEAN bIsForceMS1A = FALSE;
1365*53ee8cc1Swenshuai.xi
1366*53ee8cc1Swenshuai.xi MDrv_USBGetVIDPID(&uVID, &uPID);
1367*53ee8cc1Swenshuai.xi if ( (uVID == 0xFCA) && (uPID == 0x8004) ) //20130301, for blackberry phone
1368*53ee8cc1Swenshuai.xi {
1369*53ee8cc1Swenshuai.xi if (!bSCSI_INQUIRY(Lun))
1370*53ee8cc1Swenshuai.xi {
1371*53ee8cc1Swenshuai.xi DRV_SCSI_DBG(SCSI_DbgPrint("Scsi inquiry failed (Lun=%d).\n",u8Drive));
1372*53ee8cc1Swenshuai.xi return FALSE;
1373*53ee8cc1Swenshuai.xi }
1374*53ee8cc1Swenshuai.xi }
1375*53ee8cc1Swenshuai.xi
1376*53ee8cc1Swenshuai.xi if(!bSCSI_TEST_UNIT_READY(Lun))
1377*53ee8cc1Swenshuai.xi {
1378*53ee8cc1Swenshuai.xi DRV_SCSI_DBG(SCSI_DbgPrint("Scsi Device not ready (Lun=%d).\n",Lun));
1379*53ee8cc1Swenshuai.xi return FALSE;
1380*53ee8cc1Swenshuai.xi }
1381*53ee8cc1Swenshuai.xi //bSCSI_INQUIRY();
1382*53ee8cc1Swenshuai.xi if (!bSCSI_INQUIRY(Lun))
1383*53ee8cc1Swenshuai.xi {
1384*53ee8cc1Swenshuai.xi DRV_SCSI_DBG(SCSI_DbgPrint("Scsi inquiry failed (Lun=%d).\n",u8Drive));
1385*53ee8cc1Swenshuai.xi return FALSE;
1386*53ee8cc1Swenshuai.xi }
1387*53ee8cc1Swenshuai.xi if(!bSCSI_READ_CAPACITY(Lun))
1388*53ee8cc1Swenshuai.xi {
1389*53ee8cc1Swenshuai.xi if (!bSCSI_READ_FORMAT_CAPACITY(Lun))
1390*53ee8cc1Swenshuai.xi {
1391*53ee8cc1Swenshuai.xi DRV_SCSI_DBG(SCSI_DbgPrint("Read CAPACITY failed.%s","\n"));
1392*53ee8cc1Swenshuai.xi return FALSE;
1393*53ee8cc1Swenshuai.xi }
1394*53ee8cc1Swenshuai.xi }
1395*53ee8cc1Swenshuai.xi
1396*53ee8cc1Swenshuai.xi #ifdef ENABLE_CBI_HOST
1397*53ee8cc1Swenshuai.xi if ((sAttachDevice.saCD[0].sInterface[0].bInterfaceProtocol==0x00)||(sAttachDevice.saCD[0].sInterface[0].bInterfaceProtocol==0x01))
1398*53ee8cc1Swenshuai.xi {
1399*53ee8cc1Swenshuai.xi //do nothing
1400*53ee8cc1Swenshuai.xi }
1401*53ee8cc1Swenshuai.xi else
1402*53ee8cc1Swenshuai.xi #endif
1403*53ee8cc1Swenshuai.xi {
1404*53ee8cc1Swenshuai.xi MDrv_USBGetVIDPID(&uVID, &uPID);
1405*53ee8cc1Swenshuai.xi DRV_SCSI_DBG(printf("VID: %x, PID: %x\n", uVID, uPID));
1406*53ee8cc1Swenshuai.xi ii = 0;
1407*53ee8cc1Swenshuai.xi while ( (gForceModeSense1A[ii].VID != 0) && (gForceModeSense1A[ii].PID != 0) )
1408*53ee8cc1Swenshuai.xi {
1409*53ee8cc1Swenshuai.xi if ( (uVID == gForceModeSense1A[ii].VID) && (uPID == gForceModeSense1A[ii].PID) )
1410*53ee8cc1Swenshuai.xi {
1411*53ee8cc1Swenshuai.xi DRV_SCSI_DBG(printf("Find a Force Mode Sense 1A device\n"));
1412*53ee8cc1Swenshuai.xi bIsForceMS1A = TRUE;
1413*53ee8cc1Swenshuai.xi }
1414*53ee8cc1Swenshuai.xi
1415*53ee8cc1Swenshuai.xi ii++;
1416*53ee8cc1Swenshuai.xi if (ii >= (sizeof(gForceModeSense1A) / sizeof(struct stForceModeSense1A)))
1417*53ee8cc1Swenshuai.xi break;
1418*53ee8cc1Swenshuai.xi }
1419*53ee8cc1Swenshuai.xi
1420*53ee8cc1Swenshuai.xi if (bIsForceMS1A)
1421*53ee8cc1Swenshuai.xi bSCSI_MODE_SENSE(Lun);
1422*53ee8cc1Swenshuai.xi else
1423*53ee8cc1Swenshuai.xi bSCSI_MODE_SENSE_OperCode5A(Lun);
1424*53ee8cc1Swenshuai.xi
1425*53ee8cc1Swenshuai.xi }
1426*53ee8cc1Swenshuai.xi
1427*53ee8cc1Swenshuai.xi //if (!bSCSI_MODE_SENSE(Lun))
1428*53ee8cc1Swenshuai.xi //{
1429*53ee8cc1Swenshuai.xi // SCSI_DbgPrint("Mode sense failed!\n");
1430*53ee8cc1Swenshuai.xi // return FALSE;
1431*53ee8cc1Swenshuai.xi //}
1432*53ee8cc1Swenshuai.xi
1433*53ee8cc1Swenshuai.xi if(!bSCSI_TEST_UNIT_READY(Lun))
1434*53ee8cc1Swenshuai.xi {
1435*53ee8cc1Swenshuai.xi DRV_SCSI_DBG(SCSI_DbgPrint("Scsi Device not ready (Lun=%d).\n",u8Drive));
1436*53ee8cc1Swenshuai.xi return FALSE;
1437*53ee8cc1Swenshuai.xi }
1438*53ee8cc1Swenshuai.xi return TRUE;
1439*53ee8cc1Swenshuai.xi
1440*53ee8cc1Swenshuai.xi }
1441*53ee8cc1Swenshuai.xi
1442*53ee8cc1Swenshuai.xi
1443*53ee8cc1Swenshuai.xi //***************************************************************************************
1444*53ee8cc1Swenshuai.xi // Function Name:
1445*53ee8cc1Swenshuai.xi // Description:
1446*53ee8cc1Swenshuai.xi // Input:
1447*53ee8cc1Swenshuai.xi // Output:
1448*53ee8cc1Swenshuai.xi // Status:
1449*53ee8cc1Swenshuai.xi //***************************************************************************************
1450*53ee8cc1Swenshuai.xi
1451*53ee8cc1Swenshuai.xi
1452*53ee8cc1Swenshuai.xi
bSCSI_Read_Write10(BOOLEAN DoWrite,U8 lun,INT32U u32BlockAddr,INT32U u32BlockNum,U32 u8Buffer)1453*53ee8cc1Swenshuai.xi BOOLEAN bSCSI_Read_Write10(BOOLEAN DoWrite, U8 lun, INT32U u32BlockAddr, INT32U u32BlockNum,U32 u8Buffer)
1454*53ee8cc1Swenshuai.xi {
1455*53ee8cc1Swenshuai.xi
1456*53ee8cc1Swenshuai.xi //Scsi_Cmnd srb_data;
1457*53ee8cc1Swenshuai.xi BOOLEAN result;
1458*53ee8cc1Swenshuai.xi Mass_stor_us1.srb = &srb_data;
1459*53ee8cc1Swenshuai.xi //memset(Mass_stor_us1.srb, 0, sizeof(struct scsi_cmnd ));
1460*53ee8cc1Swenshuai.xi //printf("read sector:%lx, sz:%lx\n",u32BlockAddr,u32BlockNum);
1461*53ee8cc1Swenshuai.xi
1462*53ee8cc1Swenshuai.xi if (DoWrite)
1463*53ee8cc1Swenshuai.xi {
1464*53ee8cc1Swenshuai.xi if(Mass_stor_us1.Mass_stor_device[lun].bWriteProtect)
1465*53ee8cc1Swenshuai.xi {
1466*53ee8cc1Swenshuai.xi DRV_SCSI_DBG(printf("This device is write protect now\n"));
1467*53ee8cc1Swenshuai.xi return FALSE;
1468*53ee8cc1Swenshuai.xi }
1469*53ee8cc1Swenshuai.xi }
1470*53ee8cc1Swenshuai.xi
1471*53ee8cc1Swenshuai.xi //Build SCSI command.
1472*53ee8cc1Swenshuai.xi vSCSICmd_READ_WRITE_10(DoWrite,&Mass_stor_us1, Mass_stor_us1.srb, lun,
1473*53ee8cc1Swenshuai.xi u32BlockAddr, (INT16U)u32BlockNum, u8Buffer);
1474*53ee8cc1Swenshuai.xi
1475*53ee8cc1Swenshuai.xi
1476*53ee8cc1Swenshuai.xi //call mass storage function to send scsi command
1477*53ee8cc1Swenshuai.xi result=Host20_MSCD_usb_stor_control_thread(&Mass_stor_us1);
1478*53ee8cc1Swenshuai.xi if (result==FALSE) return result;
1479*53ee8cc1Swenshuai.xi
1480*53ee8cc1Swenshuai.xi if(Mass_stor_us1.srb->result != SAM_STAT_GOOD)
1481*53ee8cc1Swenshuai.xi {
1482*53ee8cc1Swenshuai.xi DRV_SCSI_DBG(SCSI_DbgPrint("Scsi ReadWrite_10 command failed.%s","\n"));
1483*53ee8cc1Swenshuai.xi
1484*53ee8cc1Swenshuai.xi return FALSE;
1485*53ee8cc1Swenshuai.xi }
1486*53ee8cc1Swenshuai.xi
1487*53ee8cc1Swenshuai.xi
1488*53ee8cc1Swenshuai.xi //printf("#");
1489*53ee8cc1Swenshuai.xi return TRUE;
1490*53ee8cc1Swenshuai.xi
1491*53ee8cc1Swenshuai.xi
1492*53ee8cc1Swenshuai.xi
1493*53ee8cc1Swenshuai.xi }
1494*53ee8cc1Swenshuai.xi
1495*53ee8cc1Swenshuai.xi #endif //#if defined(MSOS_TYPE_NOS)
1496*53ee8cc1Swenshuai.xi
1497*53ee8cc1Swenshuai.xi
1498*53ee8cc1Swenshuai.xi
1499