1 // Copyright (c) 2002-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 "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 // e32test\dmav2\d_dma2.h |
|
15 // User-side API for LDD used to test DMAv2 framework. |
|
16 // |
|
17 // |
|
18 |
|
19 #ifndef __D_DMA2_H__ |
|
20 #define __D_DMA2_H__ |
|
21 |
|
22 #include <e32cmn.h> |
|
23 #include <drivers/dmadefs.h> |
|
24 |
|
25 |
|
26 #define ARRAY_LENGTH(ARRAY) sizeof(ARRAY)/sizeof(ARRAY[0]) |
|
27 |
|
28 #ifdef __KERNEL_MODE__ |
|
29 #include <nkern.h> |
|
30 #include <kernel.h> |
|
31 #define TEST_FAULT FAULT(); |
|
32 #define PRINT(N) Kern::Printf("%s = 0x%08x (%d)", #N, (N), (N)) |
|
33 #else |
|
34 #include <e32std.h> |
|
35 #include <e32debug.h> |
|
36 #define TEST_FAULT RDebug::Printf("Assertion failure in %s, %d", __FILE__, __LINE__); User::Invariant() |
|
37 #define PRINT(N) RDebug::Printf("%s = 0x%08x (%d)", #N, (N), (N)) |
|
38 #endif |
|
39 |
|
40 #define TEST_ASSERT(C) if(!(C)) {TEST_FAULT;} |
|
41 |
|
42 const TUint KPhysAddrInvalidUser=0xFFFFFFFFu; // KPhysAddrInvalid is not defined on the user side |
|
43 #ifdef __KERNEL_MODE__ |
|
44 //if this fails then KPhysAddrInvalidUser must be updated to match |
|
45 //KPhysAddrInvalid |
|
46 __ASSERT_COMPILE(KPhysAddrInvalidUser == KPhysAddrInvalid); |
|
47 #endif |
|
48 |
|
49 |
|
50 _LIT(KTestDmaLddName, "TestDmaV2"); |
|
51 |
|
52 inline TVersion TestDmaLddVersion() { return TVersion(1, 0, 1); } |
|
53 |
|
54 TInt Log2(TInt aNum); |
|
55 |
|
56 /** |
|
57 Indicates the number of each type of call back received |
|
58 and their context |
|
59 |
|
60 TODO as yet, it does not indicate the context of each callback, only |
|
61 the final one |
|
62 */ |
|
63 const TInt KNumberOfCallbacks = 12; |
|
64 |
|
65 class TCallbackRecord |
|
66 { |
|
67 public: |
|
68 enum TCbContext |
|
69 { EInvalid, EThread, EIsr }; |
|
70 |
|
71 TCallbackRecord( |
|
72 TCbContext aContext = EThread, |
|
73 TInt aReq = 0, |
|
74 TInt aReqSrc = 0, |
|
75 TInt aReqDst = 0, |
|
76 |
|
77 TInt aDes = 0, |
|
78 TInt aDesSrc = 0, |
|
79 TInt aDesDst = 0, |
|
80 |
|
81 TInt aFrame = 0, |
|
82 TInt aFrameSrc = 0, |
|
83 TInt aFrameDst = 0, |
|
84 |
|
85 TInt aPause = 0, |
|
86 TInt aPauseSrc = 0, |
|
87 TInt aPauseDst = 0, |
|
88 TDmaResult aResult = EDmaResultOK |
|
89 ); |
|
90 |
|
91 static TCallbackRecord Empty(); |
|
92 |
|
93 void Reset(); |
|
94 |
|
95 /** |
|
96 Allows 2 callback records to be compared |
|
97 */ |
|
98 TBool operator == (const TCallbackRecord aOther) const; |
|
99 void Print() const; |
|
100 |
|
101 /** |
|
102 Get the number of callbacks for callback aCbType |
|
103 */ |
|
104 TInt GetCount(TDmaCallbackType aCbType) const; |
|
105 |
|
106 void SetCount(TDmaCallbackType aCbType, TInt aCount); |
|
107 |
|
108 /** |
|
109 Set the result (expected or actual) from |
|
110 TDmaChannel::IsrRedoRequest |
|
111 */ |
|
112 inline TCallbackRecord& IsrRedoResult(TInt aResult) {iIsrRedoRequestResult = aResult; return *this;} |
|
113 |
|
114 /** |
|
115 Reports the context in which the callback occurred. |
|
116 */ |
|
117 inline TCbContext GetContext() |
|
118 {return iContext;} |
|
119 |
|
120 /** |
|
121 Updates data based on callback mask aCallbackMask |
|
122 @param aCallbackMask Bitmask of callback events @see TDmaCallbackType |
|
123 @oaram aResult The result reported by the current callback |
|
124 */ |
|
125 void ProcessCallback(TUint aCallbackMask, TDmaResult aResultaContext); |
|
126 |
|
127 static void SelfTest(); |
|
128 |
|
129 // The below methods are setters, which may be chained together |
|
130 // ie. The Named Parameter Idiom |
|
131 // @see http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.18 |
|
132 TCallbackRecord& Context(TCbContext aContext) {iContext = aContext; return *this;} |
|
133 |
|
134 private: |
|
135 TInt BitToIndex(TDmaCallbackType aCbType) const; |
|
136 |
|
137 TCbContext CurrentContext() const; |
|
138 |
|
139 TInt iCallbackLog[KNumberOfCallbacks]; |
|
140 |
|
141 TDmaResult iResult; |
|
142 TCbContext iContext; |
|
143 /** Result of the most recent redo request call */ |
|
144 TInt iIsrRedoRequestResult; |
|
145 }; |
|
146 |
|
147 /** |
|
148 Extends SDmacCaps to contain the DMA PIL |
|
149 version being used |
|
150 */ |
|
151 struct TDmacTestCaps : public SDmacCaps |
|
152 { |
|
153 TDmacTestCaps(); |
|
154 TDmacTestCaps(const SDmacCaps& aDmacCaps, TInt aVersion = 2); |
|
155 |
|
156 TInt iPILVersion; |
|
157 }; |
|
158 |
|
159 |
|
160 class TDmaChannel; |
|
161 |
|
162 struct TAddrRange |
|
163 { |
|
164 TAddrRange(TUint aStart, TUint aLength); |
|
165 inline TUint End() const {return (iStart + iLength -1);} |
|
166 inline TUint Start() const {return iStart;} |
|
167 |
|
168 inline TBool Contains(TUint aValue) const {return Rng(iStart, aValue, End());} |
|
169 TBool Contains(TAddrRange aRange) const; |
|
170 |
|
171 TBool Overlaps(const TAddrRange& aRange) const; |
|
172 static void SelfTest(); |
|
173 |
|
174 private: |
|
175 TUint iStart; |
|
176 TUint iLength; |
|
177 }; |
|
178 |
|
179 |
|
180 struct TAddressParms |
|
181 { |
|
182 TAddressParms(TUint32 aSrcAddr=0, TUint32 aDstAddr=0, TUint aTransferCount=0) |
|
183 :iSrcAddr(aSrcAddr), iDstAddr(aDstAddr), iTransferCount(aTransferCount) |
|
184 {} |
|
185 |
|
186 TAddressParms(const TDmaTransferArgs& aArgs) |
|
187 :iSrcAddr(aArgs.iSrcConfig.iAddr), |
|
188 iDstAddr(aArgs.iDstConfig.iAddr), |
|
189 iTransferCount(aArgs.iTransferCount) |
|
190 {} |
|
191 |
|
192 /** |
|
193 If any src, dst, or transfer count are zero, substitute the values from |
|
194 aTransferArgs in their place |
|
195 */ |
|
196 void Substitute(const TDmaTransferArgs& aTransferArgs); |
|
197 |
|
198 /** |
|
199 When recieved by the test driver, src and dst |
|
200 addresses will be offsets from the dma test session's |
|
201 chunk base. They must be converted to absolute, *physical* addresses |
|
202 */ |
|
203 void Fixup(TLinAddr aChunkBase); |
|
204 |
|
205 /** |
|
206 Check that both the src and destination lie within the area |
|
207 defined by aStart and aSize |
|
208 */ |
|
209 TBool CheckRange(TLinAddr aStart, TUint aSize); |
|
210 |
|
211 TAddrRange SourceRange() const; |
|
212 TAddrRange DestRange() const; |
|
213 |
|
214 TBool Overlaps(const TAddrRange aRange) const; |
|
215 TBool Overlaps(const TAddressParms aParm) const; |
|
216 |
|
217 TBool operator==(const TAddressParms& aOther) const; |
|
218 |
|
219 static void SelfTest(); |
|
220 |
|
221 TUint32 iSrcAddr; |
|
222 TUint32 iDstAddr; |
|
223 TUint iTransferCount; |
|
224 }; |
|
225 |
|
226 // These functions can be used for accessing TDmaTransferArgs in |
|
227 // terms of TAddressParms. (TAddressParms would be a natural base |
|
228 // class for TDmaTransferArgs but changing the production code |
|
229 // is undesirable) |
|
230 TAddressParms GetAddrParms(const TDmaTransferArgs&); |
|
231 void SetAddrParms(TDmaTransferArgs&, const TAddressParms&); |
|
232 |
|
233 /** |
|
234 This struct holds the arguments which can be used with TDmaChannel::IsrRedoRequest |
|
235 */ |
|
236 struct TIsrRequeArgs : public TAddressParms |
|
237 { |
|
238 TIsrRequeArgs(TUint32 aSrcAddr=KPhysAddrInvalidUser, TUint32 aDstAddr=KPhysAddrInvalidUser, |
|
239 TUint aTransferCount=0, TUint32 aPslRequestInfo=0, |
|
240 TBool aIsrCb=ETrue) |
|
241 : TAddressParms(aSrcAddr, aDstAddr, aTransferCount), iPslRequestInfo(aPslRequestInfo), iIsrCb(aIsrCb) |
|
242 {} |
|
243 |
|
244 |
|
245 TInt Call(TDmaChannel& aChannel); |
|
246 |
|
247 TBool CheckRange(TLinAddr aStart, TUint aSize) const; |
|
248 |
|
249 TUint32 iPslRequestInfo; |
|
250 TBool iIsrCb; |
|
251 }; |
|
252 class CISrRequeTest; |
|
253 /** |
|
254 A collection of TIsrRequeArgs |
|
255 */ |
|
256 struct TIsrRequeArgsSet |
|
257 { |
|
258 |
|
259 friend class CIsrRequeTest; //TODO see line 394 t_dma2.cpp |
|
260 TIsrRequeArgsSet(TIsrRequeArgs* aRequeueArgs=NULL, TInt aCount =0) |
|
261 :iCount(aCount), iIndex(0) |
|
262 { |
|
263 TEST_ASSERT(iCount <= MaxCount); |
|
264 for(TInt i=0; i<iCount; i++) |
|
265 { |
|
266 iRequeArgs[i] = aRequeueArgs[i]; |
|
267 } |
|
268 |
|
269 } |
|
270 |
|
271 TBool IsEmpty() const |
|
272 {return iCount == 0;} |
|
273 |
|
274 TIsrRequeArgs GetArgs(); |
|
275 |
|
276 void Substitute(const TDmaTransferArgs& aTransferArgs); |
|
277 void Fixup(TLinAddr aChunkBase); |
|
278 TBool CheckRange(TLinAddr aAddr, TUint aSize) const; |
|
279 |
|
280 private: |
|
281 enum {MaxCount=6}; |
|
282 TInt iCount; |
|
283 TInt iIndex; |
|
284 TIsrRequeArgs iRequeArgs[MaxCount]; |
|
285 }; |
|
286 |
|
287 class DDmaTestSession; |
|
288 class RDmaSession : public RBusLogicalChannel |
|
289 { |
|
290 friend class DDmaTestSession; |
|
291 public: |
|
292 #ifndef __KERNEL_MODE__ |
|
293 TInt ChannelIsQueueEmpty(TUint aDriverCookie,TBool& aQueueEmpty) |
|
294 { |
|
295 return DoControl(EIsQueueEmpty, reinterpret_cast<TAny*>(aDriverCookie), &aQueueEmpty); |
|
296 } |
|
297 |
|
298 TInt ChannelIsOpened(TUint aDriverCookie,TBool &aChannelOpen) |
|
299 { |
|
300 return DoControl(EIsOpened, reinterpret_cast<TAny*>(aDriverCookie), &aChannelOpen); |
|
301 } |
|
302 |
|
303 TInt ChannelIsrRedoRequest(TUint aDriverCookie,TUint32 aSrcAddr,TUint32 aDstAddr,TInt aTransferCount,TUint32 aPslRequestInfo,TBool aIsrCb) |
|
304 { |
|
305 TIsrRedoReqArgs args(aDriverCookie,aSrcAddr,aDstAddr,aTransferCount,aPslRequestInfo,aIsrCb); |
|
306 TPckgC<TIsrRedoReqArgs> package(args); |
|
307 return DoControl(EIsrRedoRequest,&package); |
|
308 } |
|
309 |
|
310 TInt ChannelCancelAll(TUint aDriverCookie) |
|
311 { |
|
312 return DoControl(ECancelAllChannel, reinterpret_cast<TAny*>(aDriverCookie)); |
|
313 } |
|
314 |
|
315 TInt ChannelOpen(TUint aPslCookie, TUint& aDriverCookie) |
|
316 { |
|
317 return DoControl(EOpenChannel, reinterpret_cast<TAny*>(aPslCookie), &aDriverCookie); |
|
318 } |
|
319 |
|
320 TInt ChannelClose(TUint aDriverCookie) |
|
321 { |
|
322 return DoControl(ECloseChannel, reinterpret_cast<TAny*>(aDriverCookie)); |
|
323 } |
|
324 |
|
325 TInt ChannelPause(TUint aDriverCookie) |
|
326 { |
|
327 return DoControl(EPauseChannel, reinterpret_cast<TAny*>(aDriverCookie)); |
|
328 } |
|
329 |
|
330 TInt ChannelResume(TUint aDriverCookie) |
|
331 { |
|
332 return DoControl(EResumeChannel, reinterpret_cast<TAny*>(aDriverCookie)); |
|
333 } |
|
334 |
|
335 TInt ChannelCaps(TUint aDriverCookie, SDmacCaps& aChannelCaps) |
|
336 { |
|
337 TDmacTestCaps caps; |
|
338 TInt r = ChannelCaps(aDriverCookie, caps); |
|
339 aChannelCaps = caps; |
|
340 return r; |
|
341 } |
|
342 |
|
343 TInt ChannelCaps(TUint aDriverCookie, TDmacTestCaps& aChannelCaps) |
|
344 { |
|
345 TPckg<TDmacTestCaps> package(aChannelCaps); |
|
346 return DoControl(EChannelCaps, reinterpret_cast<TAny*>(aDriverCookie), &package); |
|
347 } |
|
348 |
|
349 TInt Open() |
|
350 {// TO DO: Add Info , this class is just to test the opening of channels |
|
351 //TPckgBuf<TOpenInfo> infoBuf; |
|
352 //infoBuf().iWhat = TOpenInfo::EOpen; |
|
353 //infoBuf().U.iOpen.iId = aId; |
|
354 //infoBuf().U.iOpen.iDesCount = aDesCount; |
|
355 //infoBuf().U.iOpen.iMaxTransferSize = aMaxTransferSize; |
|
356 return DoCreate(KTestDmaLddName,TestDmaLddVersion(), 0, NULL, NULL, EOwnerThread); |
|
357 } |
|
358 |
|
359 //TODO rename this (append "old") |
|
360 TInt RequestCreate(TUint aChannelCookie, TUint& aRequestCookie, TUint aMaxTransferSize=0) |
|
361 { |
|
362 return DoRequestCreate(aChannelCookie, EFalse, aMaxTransferSize, aRequestCookie); |
|
363 } |
|
364 |
|
365 //TODO rename this (get rid of "new" |
|
366 TInt RequestCreateNew(TUint aChannelCookie, TUint& aRequestCookie, TUint aMaxTransferSize=0) |
|
367 { |
|
368 return DoRequestCreate(aChannelCookie, ETrue, aMaxTransferSize, aRequestCookie); |
|
369 } |
|
370 |
|
371 TInt RequestDestroy(TUint aRequestCookie) |
|
372 { |
|
373 return DoControl(ERequestClose, reinterpret_cast<TAny*>(aRequestCookie)); |
|
374 } |
|
375 |
|
376 TInt RequestFragmentCount(TUint aRequestCookie) |
|
377 { |
|
378 return DoControl(EFragmentCount, reinterpret_cast<TAny*>(aRequestCookie)); |
|
379 } |
|
380 |
|
381 /** |
|
382 Will fragment a DMA request using the legacy API |
|
383 */ |
|
384 TInt FragmentRequestOld(TUint aRequestCookie, const TDmaTransferArgs& aTransferArgs, TUint64* aDurationMicroSecs=NULL) |
|
385 { |
|
386 const TFragmentArgs args(aRequestCookie, aTransferArgs, aDurationMicroSecs); |
|
387 TPckgC<TFragmentArgs> package(args); |
|
388 return DoControl(EFragmentLegacy, &package); |
|
389 } |
|
390 |
|
391 /** |
|
392 Will fragment a DMA request using the new API |
|
393 */ |
|
394 TInt FragmentRequest(TUint aRequestCookie, const TDmaTransferArgs& aTransferArgs, TUint64* aDurationMicroSecs=NULL) |
|
395 { |
|
396 const TFragmentArgs args(aRequestCookie, aTransferArgs, aDurationMicroSecs); |
|
397 TPckgC<TFragmentArgs> package(args); |
|
398 return DoControl(EFragment, &package); |
|
399 } |
|
400 |
|
401 TInt QueueRequest(TUint aRequestCookie, TRequestStatus& aStatus, TCallbackRecord* aRecord = NULL, TUint64* aDurationMicroSecs=NULL) |
|
402 { |
|
403 //These dummy values can accept the writeback from the driver |
|
404 //if the client does not want them. |
|
405 //(TClientDataRequest can not be programmed with a NULL to |
|
406 //indicate that an argument is unwanted) |
|
407 TCallbackRecord dummyRec; |
|
408 TUint64 dummyTime=0; |
|
409 |
|
410 TQueueArgs args(aRequestCookie, &aStatus, aRecord ? aRecord : &dummyRec, aDurationMicroSecs ? aDurationMicroSecs : &dummyTime); |
|
411 TPckgC<TQueueArgs> package(args); |
|
412 return DoControl(EQueueRequest, &package); |
|
413 } |
|
414 |
|
415 /** |
|
416 Synchronous version of QueueRequest |
|
417 */ |
|
418 TInt QueueRequest(TUint aRequestCookie, TCallbackRecord* aRecord = NULL, TUint64* aDurationMicroSecs=NULL) |
|
419 { |
|
420 TRequestStatus status; |
|
421 TInt r = QueueRequest(aRequestCookie, status, aRecord, aDurationMicroSecs); |
|
422 User::WaitForRequest(status); |
|
423 return r; |
|
424 } |
|
425 |
|
426 /** |
|
427 Queue a previously fragmented request. |
|
428 Additional request parameters are included in iRequeueArgs, these will be |
|
429 transferred from ISR context callback using the TDmaChannel::IsrRedoRequest function |
|
430 |
|
431 @pre Isr callback for completion must have been requested at request fragmentation time |
|
432 */ |
|
433 TInt QueueRequestWithRequeue(TUint aRequestCookie, TIsrRequeArgs* aRequeueArgs, TInt aCount, TRequestStatus& aStatus, TCallbackRecord* aRecord = NULL, TUint64* aDurationMicroSecs=NULL) |
|
434 { |
|
435 //These dummy values can accept the writeback from the driver |
|
436 //if the client does not want them. |
|
437 //(TClientDataRequest can not be programmed with a NULL to |
|
438 //indicate that an argument is unwanted) |
|
439 TCallbackRecord dummyRec; |
|
440 TUint64 dummyTime=0; |
|
441 |
|
442 TQueueArgsWithReque args(aRequeueArgs, aCount, aRequestCookie, &aStatus, aRecord ? aRecord : &dummyRec, aDurationMicroSecs ? aDurationMicroSecs : &dummyTime); |
|
443 TPckgC<TQueueArgsWithReque> package(args); |
|
444 return DoControl(EQueueRequestWithReque, &package); |
|
445 } |
|
446 |
|
447 /** |
|
448 Synchronous version of QueueRequestWithRequeue |
|
449 */ |
|
450 TInt QueueRequestWithRequeue(TUint aRequestCookie, TIsrRequeArgs* aRequeueArgs, TInt aCount, TCallbackRecord* aRecord = NULL, TUint64* aDurationMicroSecs=NULL) |
|
451 { |
|
452 TRequestStatus status; |
|
453 TInt r = QueueRequestWithRequeue(aRequestCookie, aRequeueArgs, aCount, status, aRecord, aDurationMicroSecs); |
|
454 User::WaitForRequest(status); |
|
455 return r; |
|
456 } |
|
457 |
|
458 TInt OpenSharedChunk(RChunk& aChunk) |
|
459 { |
|
460 TUint chunkHandle = DoControl(EOpenSharedChunk); |
|
461 return aChunk.SetReturnedHandle(chunkHandle); |
|
462 } |
|
463 |
|
464 TInt GetTestInfo(TDmaV2TestInfo& aInfo) |
|
465 { |
|
466 TPckg<TDmaV2TestInfo> package(aInfo); |
|
467 return DoControl(EGetTestInfo, &package); |
|
468 } |
|
469 |
|
470 static void SelfTest(); |
|
471 |
|
472 static void ApiTest(); |
|
473 #endif // __KERNEL_MODE__ |
|
474 |
|
475 private: |
|
476 |
|
477 TInt DoRequestCreate(TUint aChannelCookie, TBool aNewStyle, TUint aMaxTransferSize, TUint& aRequestCookie) |
|
478 { |
|
479 TRequestCreateArgs args(aChannelCookie, aNewStyle, aMaxTransferSize); |
|
480 TPckgC<TRequestCreateArgs> package(args); |
|
481 return DoControl(ERequestOpen, &package, &aRequestCookie); |
|
482 } |
|
483 |
|
484 |
|
485 struct TRequestCreateArgs |
|
486 { |
|
487 TRequestCreateArgs(TUint aChannelCookie, TBool aNewStyle, TUint aMaxFragmentSize) |
|
488 :iChannelCookie(aChannelCookie), iNewStyle(aNewStyle), iMaxFragmentSize(aMaxFragmentSize) |
|
489 {} |
|
490 |
|
491 TUint iChannelCookie; |
|
492 TBool iNewStyle; |
|
493 TUint iMaxFragmentSize; |
|
494 }; |
|
495 |
|
496 struct TFragmentArgs |
|
497 { |
|
498 TFragmentArgs() |
|
499 :iRequestCookie(0), iTransferArgs(), iDurationMicroSecs(NULL) |
|
500 {} |
|
501 TFragmentArgs(TUint aRequestCookie, const TDmaTransferArgs& aTransferArgs, TUint64* aDurationMicroSecs = NULL) |
|
502 :iRequestCookie(aRequestCookie), iTransferArgs(aTransferArgs), iDurationMicroSecs(aDurationMicroSecs) |
|
503 {} |
|
504 |
|
505 const TUint iRequestCookie; |
|
506 const TDmaTransferArgs iTransferArgs; |
|
507 TUint64* const iDurationMicroSecs; |
|
508 }; |
|
509 |
|
510 struct TQueueArgs |
|
511 { |
|
512 TQueueArgs(TUint aRequestCookie=0, TRequestStatus* aStatus=NULL, TCallbackRecord* aCallbackRecord=NULL, TUint64* aDurationMicroSecs=NULL) |
|
513 :iRequestCookie(aRequestCookie), iStatus(aStatus), iCallbackRecord(aCallbackRecord), iDurationMicroSecs(aDurationMicroSecs) |
|
514 {} |
|
515 TUint iRequestCookie; |
|
516 TRequestStatus* iStatus; |
|
517 TCallbackRecord* iCallbackRecord; |
|
518 TUint64* iDurationMicroSecs; |
|
519 }; |
|
520 |
|
521 struct TIsrRedoReqArgs |
|
522 { |
|
523 TIsrRedoReqArgs(TUint aDriverCookie=0,TUint32 aSrcAddr=0, TUint32 aDstAddr=0, TInt aTransferCount=0, TUint32 aPslRequestInfo=0,TBool aIsrCb=ETrue) |
|
524 :iDriverCookie(aDriverCookie),iSrcAddr(aSrcAddr),iDstAddr(aDstAddr),iTransferCount(aTransferCount),iPslRequestInfo(aPslRequestInfo),iIsrCb(aIsrCb) |
|
525 {} |
|
526 TUint iDriverCookie; |
|
527 TUint32 iSrcAddr; |
|
528 TUint32 iDstAddr; |
|
529 TInt iTransferCount; |
|
530 TUint32 iPslRequestInfo; |
|
531 TBool iIsrCb; |
|
532 }; |
|
533 |
|
534 /** |
|
535 This struct is used for queing and including a set of transfers |
|
536 to be setup from ISR context callback |
|
537 */ |
|
538 struct TQueueArgsWithReque : public TQueueArgs |
|
539 { |
|
540 TQueueArgsWithReque(TIsrRequeArgs* aRequeueArgs=NULL, TInt aCount=0, |
|
541 TUint aRequestCookie=0, TRequestStatus* aStatus=NULL, TCallbackRecord* aCallbackRecord=NULL, TUint64* aDurationMicroSecs=NULL) |
|
542 :TQueueArgs(aRequestCookie, aStatus, aCallbackRecord, aDurationMicroSecs), iRequeSet(aRequeueArgs, aCount) |
|
543 { |
|
544 } |
|
545 |
|
546 TIsrRequeArgsSet iRequeSet; |
|
547 }; |
|
548 |
|
549 |
|
550 enum TControl |
|
551 { |
|
552 EOpenChannel, |
|
553 ECloseChannel, |
|
554 EPauseChannel, |
|
555 EResumeChannel, |
|
556 EChannelCaps, |
|
557 ERequestOpen, |
|
558 ERequestClose, |
|
559 EOpenSharedChunk, |
|
560 EFragmentLegacy, |
|
561 EFragment, |
|
562 EFragmentCount, |
|
563 EQueueRequest, |
|
564 EGetTestInfo, |
|
565 EIsQueueEmpty, |
|
566 EIsOpened, |
|
567 EIsrRedoRequest, |
|
568 ECancelAllChannel, |
|
569 EQueueRequestWithReque |
|
570 }; |
|
571 }; |
|
572 #endif // __D_DMA2_H__ |
|