author | Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> |
Mon, 04 Oct 2010 02:35:35 +0300 | |
changeset 281 | 13fbfa31d2ba |
parent 0 | a41df078684a |
child 286 | 48e57fb1237e |
permissions | -rw-r--r-- |
0 | 1 |
// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). |
2 |
// All rights reserved. |
|
3 |
// This component and the accompanying materials are made available |
|
4 |
// under the terms of the License "Eclipse Public License v1.0" |
|
5 |
// which accompanies this distribution, and is available |
|
6 |
// at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
7 |
// |
|
8 |
// Initial Contributors: |
|
9 |
// Nokia Corporation - initial contribution. |
|
10 |
// |
|
11 |
// Contributors: |
|
12 |
// |
|
13 |
// Description: |
|
14 |
// |
|
15 |
||
281
13fbfa31d2ba
Revision: 201039
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
16 |
#define __E32TEST_EXTENSION__ |
0 | 17 |
#include <e32std.h> |
18 |
#include <e32test.h> |
|
19 |
#include <testusbc.h> |
|
20 |
#include "t_gml_tur_protocol.h" |
|
21 |
#include "t_gml_tur_controller.h" |
|
281
13fbfa31d2ba
Revision: 201039
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
22 |
#include "protocol.h" |
0 | 23 |
#include "cbulkonlytransport.h" |
24 |
||
25 |
LOCAL_D RTest test(_L("t_gml_tur")); |
|
26 |
||
27 |
_LIT(KDriverFileName,"TESTUSBC.LDD"); |
|
28 |
_LIT(KLddName,"usbc"); |
|
29 |
_LIT(KTransportThreadName,"TransportThread"); |
|
30 |
_LIT(KTransportSemName,"TransportThreadSem"); |
|
31 |
||
32 |
LOCAL_D const TInt KFiveDrives = 5; |
|
33 |
LOCAL_D const TEndpointNumber KOutEp = EEndpoint1; |
|
34 |
||
35 |
GLDEF_D CUsbMassStorageController* gController = NULL; |
|
36 |
||
37 |
LOCAL_C void SetCBWHeader(TDes8& cbwData, TInt32 aDataTransferLength, TBool aDataIn, TUint8 aLun, TUint8 aCBLength) |
|
38 |
{ |
|
39 |
//dCBWSignature |
|
40 |
cbwData[0] = 0x55; |
|
41 |
cbwData[1] = 0x53; |
|
42 |
cbwData[2] = 0x42; |
|
43 |
cbwData[3] = 0x43; |
|
44 |
//dCBWTag |
|
45 |
cbwData[4] = 0x01; |
|
46 |
cbwData[5] = 0x00; |
|
47 |
cbwData[6] = 0x00; |
|
48 |
cbwData[7] = 0x00; |
|
49 |
//dCBWDataTransferLength |
|
50 |
cbwData[8] = TUint8((aDataTransferLength & 0x000000FF)); |
|
51 |
cbwData[9] = TUint8((aDataTransferLength & 0x0000FF00) >> 8); |
|
52 |
cbwData[10] = TUint8((aDataTransferLength & 0x00FF0000) >> 16); |
|
53 |
cbwData[11] = TUint8((aDataTransferLength & 0xFF000000) >> 24); |
|
54 |
//bmCBWFlags |
|
55 |
if (aDataIn) |
|
56 |
{ |
|
57 |
cbwData[12] = 0x80; |
|
58 |
} |
|
59 |
else |
|
60 |
{ |
|
61 |
cbwData[12] = 0x00; |
|
62 |
} |
|
63 |
//bCBWLUN |
|
64 |
cbwData[13] = aLun; |
|
65 |
//bCBWCBLength |
|
66 |
cbwData[14] = aCBLength; |
|
67 |
} |
|
68 |
||
69 |
LOCAL_C TInt TransportThreadEntry(TAny* aPtr) |
|
70 |
{ |
|
71 |
TInt err = KErrNone; |
|
72 |
TInt numDrives = KFiveDrives; |
|
73 |
||
74 |
//Create and install cleanup trap and active scheduler |
|
75 |
CTrapCleanup* cleanup = CTrapCleanup::New(); |
|
76 |
if (cleanup == NULL) |
|
77 |
{ |
|
78 |
return KErrNoMemory; |
|
79 |
} |
|
80 |
||
81 |
CActiveScheduler* sched = new CActiveScheduler; |
|
82 |
if (sched == NULL) |
|
83 |
{ |
|
84 |
return KErrNoMemory; |
|
85 |
} |
|
86 |
CActiveScheduler::Install(sched); |
|
87 |
||
88 |
//Start transport |
|
89 |
CScsiProtocol* protocol = NULL; |
|
90 |
TRAP(err, protocol = CScsiProtocol::NewL()); |
|
91 |
if (err != KErrNone) |
|
92 |
{ |
|
93 |
return err; |
|
94 |
} |
|
95 |
||
96 |
CUsbMassStorageController* controller = (CUsbMassStorageController*)aPtr; |
|
97 |
gController = controller; |
|
98 |
controller->CreateL(0); |
|
99 |
||
281
13fbfa31d2ba
Revision: 201039
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
100 |
MTransportBase* transport = NULL; |
0 | 101 |
TRAP(err, transport = CBulkOnlyTransport::NewL(numDrives, *controller)); |
102 |
if (err != KErrNone) |
|
103 |
{ |
|
104 |
return err; |
|
105 |
} |
|
106 |
||
107 |
controller->SetTransport(transport); |
|
108 |
TRAP(err, transport->InitialiseTransportL(1)); |
|
109 |
||
110 |
transport->RegisterProtocol(*protocol); |
|
111 |
transport->Start(); |
|
112 |
||
113 |
//Synchronize with test thread |
|
114 |
RSemaphore gSemThreadReady; |
|
115 |
gSemThreadReady.OpenGlobal(KTransportSemName); |
|
116 |
gSemThreadReady.Signal(); |
|
117 |
gSemThreadReady.Close(); |
|
118 |
||
119 |
CActiveScheduler::Start(); |
|
120 |
||
121 |
delete transport; |
|
122 |
delete controller; |
|
123 |
delete protocol; |
|
124 |
delete sched; |
|
125 |
delete cleanup; |
|
126 |
||
127 |
return KErrNone; |
|
128 |
} |
|
129 |
||
130 |
GLDEF_C TInt E32Main() |
|
131 |
{ |
|
132 |
test.Title(); |
|
133 |
||
134 |
TInt err; |
|
135 |
||
136 |
test.Start(_L("Loading ldd")); |
|
137 |
err = User::LoadLogicalDevice(KDriverFileName); |
|
138 |
test(err == KErrNone || err == KErrAlreadyExists); |
|
139 |
||
140 |
RDevTestUsbcClient ldd; |
|
141 |
err = ldd.Open(0); |
|
142 |
test(err == KErrNone); |
|
143 |
||
144 |
//ldd.ResetEndpoints(); |
|
145 |
||
146 |
RSemaphore gSemThreadReady; |
|
147 |
err = gSemThreadReady.CreateGlobal(KTransportSemName, 0); |
|
148 |
||
149 |
CUsbMassStorageController* controller = new CUsbMassStorageController(); |
|
150 |
test(controller != NULL); |
|
151 |
||
152 |
//Start transport thread. |
|
153 |
RThread transportThread; |
|
154 |
test.Next(_L("Creating transport thread, Max Lun = 4")); |
|
155 |
err = transportThread.Create(KTransportThreadName, TransportThreadEntry, KDefaultStackSize, NULL, (void*)controller); |
|
156 |
test(err == KErrNone); |
|
157 |
transportThread.Resume(); |
|
158 |
||
159 |
//Synchronize with transport thread. |
|
160 |
gSemThreadReady.Wait(); |
|
161 |
gSemThreadReady.Close(); |
|
162 |
test(gController != NULL); |
|
163 |
||
164 |
TRequestStatus status; |
|
165 |
||
166 |
test.Next(_L("Writing GetMaxLun request to endpoint 0")); |
|
167 |
//Write GetMaxLun request to endpoint 0 |
|
168 |
TBuf8<KRequestHdrSize> controlData; |
|
169 |
controlData.SetLength(KRequestHdrSize); |
|
170 |
controlData.FillZ(); |
|
171 |
controlData[0] = 0xA1; |
|
172 |
controlData[1] = 0xFE; |
|
173 |
controlData[6] = 0x01; |
|
174 |
ldd.HostWrite(status, EEndpoint0, controlData, KRequestHdrSize); |
|
175 |
||
176 |
User::WaitForRequest(status); |
|
177 |
test.Printf(_L("status = %d"), status.Int()); |
|
178 |
test(status.Int() == KErrNone); |
|
179 |
||
180 |
//Read request response |
|
181 |
controlData.SetLength(1); |
|
182 |
ldd.HostRead(status, EEndpoint0, controlData, 1); |
|
183 |
||
184 |
User::WaitForRequest(status); |
|
185 |
test(status.Int() == KErrNone); |
|
186 |
||
187 |
test.Printf(_L("Max LUN: %d\n"), controlData[0]); |
|
188 |
test(controlData[0] == KFiveDrives - 1); |
|
189 |
||
190 |
//Send TEST UNIT READY command |
|
191 |
TBuf8<KCbwLength> cbwData; |
|
192 |
cbwData.SetLength(KCbwLength); |
|
193 |
cbwData.FillZ(); |
|
194 |
SetCBWHeader(cbwData, 6, ETrue, 0, 6); |
|
195 |
ldd.HostWrite(status, KOutEp, cbwData, KCbwLength); |
|
196 |
User::WaitForRequest(status); |
|
197 |
test(status.Int() == KErrNone); |
|
198 |
||
199 |
test.Next(_L("Writing Reset request to endpoint 0")); |
|
200 |
//Write Reset request to endpoint 0 |
|
201 |
controlData.SetLength(KRequestHdrSize); |
|
202 |
controlData.FillZ(); |
|
203 |
controlData[0] = 0x21; |
|
204 |
controlData[1] = 0xFF; |
|
205 |
ldd.HostWrite(status, EEndpoint0, controlData, KRequestHdrSize); |
|
206 |
||
207 |
User::WaitForRequest(status); |
|
208 |
test(status.Int() == KErrNone); |
|
209 |
||
210 |
User::After(3000000); //3 seconds |
|
211 |
test(gController->IsReset()); |
|
212 |
test.Printf(_L("Controller got reset request\n")); |
|
213 |
||
214 |
TRequestStatus logonStatus; |
|
215 |
transportThread.Logon(logonStatus); |
|
216 |
TRequestStatus* statusPtr = &(controller->iStatus); |
|
217 |
transportThread.RequestComplete(statusPtr, KErrNone); |
|
218 |
//Wait for thread to die |
|
219 |
test.Printf(_L("Waiting for controller thread to die\n")); |
|
220 |
User::WaitForRequest(logonStatus); |
|
281
13fbfa31d2ba
Revision: 201039
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
221 |
transportThread.Close(); |
13fbfa31d2ba
Revision: 201039
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
222 |
|
0 | 223 |
test.Printf(_L("The thread is dead, long live the thread\n")); |
281
13fbfa31d2ba
Revision: 201039
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
224 |
|
0 | 225 |
ldd.Close(); |
226 |
||
227 |
test.Printf(_L("Unloading ldd")); |
|
228 |
err = User::FreeLogicalDevice(KLddName); |
|
281
13fbfa31d2ba
Revision: 201039
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
229 |
test_KErrNone(err); |
0 | 230 |
|
231 |
test.End(); |
|
232 |
||
233 |
return 0; |
|
234 |
} |