|
1 // Copyright (c) 1999-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 // Generic MMC controller types and standard classes for MMC manipulation |
|
15 // This controller follows MMC spec V2.1 |
|
16 // |
|
17 // |
|
18 |
|
19 /** |
|
20 @file |
|
21 @internalComponent |
|
22 */ |
|
23 |
|
24 #if !defined(__MMC_H__) |
|
25 #define __MMC_H__ |
|
26 |
|
27 #include <drivers/pbus.h> |
|
28 #include <d32locd.h> |
|
29 |
|
30 // MMC Card maximum system settings |
|
31 |
|
32 const TInt KMaxMmcSockets = KMaxPBusSockets; |
|
33 |
|
34 // Forward type declarations |
|
35 |
|
36 class TMMC; |
|
37 class TCID; |
|
38 class TCSD; |
|
39 class TExtendedCSD; |
|
40 class TRCA; |
|
41 class TDSR; |
|
42 class TMMCStatus; |
|
43 class TMMCArgument; |
|
44 class TMMCard; |
|
45 class TMMCCommandDesc; |
|
46 class TMMCBusConfig; |
|
47 class TMMCStackConfig; |
|
48 class TMMCRCAPool; |
|
49 class TMMCSessRing; |
|
50 class TMMCStateMachine; |
|
51 class DMMCSocket; |
|
52 class DMMCSession; |
|
53 class DMMCStack; |
|
54 class TMMCMachineInfo; |
|
55 class TMapping; |
|
56 class TMMCPasswordStore; |
|
57 class TMMCEraseInfo; |
|
58 class TMMCMachineInfoV4; |
|
59 typedef TPckg<TMMCMachineInfoV4> TMMCMachineInfoV4Pckg; |
|
60 |
|
61 enum TMMCAppCommand {EMMCNormalCmd,EMMCApplicationCmd}; |
|
62 |
|
63 // Typedefs |
|
64 |
|
65 /** |
|
66 @publishedPartner |
|
67 @released |
|
68 |
|
69 Represents the MultiMediaCard error code bit set. |
|
70 |
|
71 MultiMediaCard error codes are defined as bit masks, mainly for use with |
|
72 the state machine where the error trap mask may be used. |
|
73 The function DMMCSession::EpocErrorCode() converts these error bit values |
|
74 into standard Symbian OS error values. |
|
75 |
|
76 @see KMMCErrNone |
|
77 @see KMMCErrResponseTimeOut |
|
78 @see KMMCErrDataTimeOut |
|
79 @see KMMCErrBusyTimeOut |
|
80 @see KMMCErrBusTimeOut |
|
81 @see KMMCErrTooManyCards |
|
82 @see KMMCErrResponseCRC |
|
83 @see KMMCErrDataCRC |
|
84 @see KMMCErrCommandCRC |
|
85 @see KMMCErrStatus |
|
86 @see KMMCErrNoCard |
|
87 @see KMMCErrBrokenLock |
|
88 @see KMMCErrPowerDown |
|
89 @see KMMCErrAbort |
|
90 @see KMMCErrStackNotReady |
|
91 @see KMMCErrNotSupported |
|
92 @see KMMCErrHardware |
|
93 @see KMMCErrBusInconsistent |
|
94 @see KMMCErrBypass |
|
95 @see KMMCErrInitContext |
|
96 @see KMMCErrArgument |
|
97 @see KMMCErrSingleBlock |
|
98 @see KMMCErrLocked |
|
99 @see KMMCErrNotFound |
|
100 @see KMMCErrAlreadyExists |
|
101 @see KMMCErrGeneral |
|
102 @see KMMCErrAll |
|
103 @see KMMCErrBasic |
|
104 */ |
|
105 typedef TUint32 TMMCErr; |
|
106 |
|
107 // MMC Enums and inline functions |
|
108 |
|
109 |
|
110 |
|
111 |
|
112 /** |
|
113 @publishedPartner |
|
114 @released |
|
115 |
|
116 Defines a set of symbols corresponding to the MultiMediaCard bus commands. |
|
117 |
|
118 A command is one of the parameter values inserted into a TMMCCommandDesc object. |
|
119 The commands themselves are defined by the MultiMediaCard specification. |
|
120 |
|
121 @see TMMCCommandDesc |
|
122 */ |
|
123 enum TMMCCommandEnum |
|
124 { |
|
125 /** |
|
126 CMD0; reset all cards to idle state. |
|
127 */ |
|
128 ECmdGoIdleState =0, |
|
129 |
|
130 |
|
131 /** |
|
132 CMD1; all cards in the idle state send their operating conditions. |
|
133 */ |
|
134 ECmdSendOpCond =1, |
|
135 |
|
136 |
|
137 /** |
|
138 CMD2; all cards send their CID number. |
|
139 */ |
|
140 ECmdAllSendCID =2, |
|
141 |
|
142 |
|
143 /** |
|
144 CMD3; assign relative address to a card. |
|
145 */ |
|
146 ECmdSetRelativeAddr =3, |
|
147 |
|
148 |
|
149 /** |
|
150 CMD4; program the DSR register of all cards. |
|
151 */ |
|
152 ECmdSetDSR =4, |
|
153 |
|
154 |
|
155 /** |
|
156 CMD5; toggle device between Sleep and Awake states. |
|
157 */ |
|
158 ECmd5 =5, |
|
159 ECmdSleepAwake =5, |
|
160 |
|
161 |
|
162 /** |
|
163 CMD6; Switch |
|
164 */ |
|
165 ECmd6 =6, |
|
166 ECmdSwitch =6, |
|
167 |
|
168 |
|
169 /** |
|
170 CMD7; toggle a card between standby and transfer state, or between |
|
171 programming and disconnected state. |
|
172 |
|
173 The card is selected by its RCA and deselected by any other address. |
|
174 */ |
|
175 ECmdSelectCard =7, |
|
176 |
|
177 |
|
178 /** |
|
179 CMD8; addressed card sends its extended CSD. |
|
180 */ |
|
181 ECmd8 =8, |
|
182 ECmdSendExtendedCSD =8, |
|
183 |
|
184 |
|
185 /** |
|
186 CMD9; addressed card sends its CSD. |
|
187 */ |
|
188 ECmdSendCSD =9, |
|
189 |
|
190 |
|
191 /** |
|
192 CMD10; addressed card sends its CID. |
|
193 */ |
|
194 ECmdSendCID =10, |
|
195 |
|
196 |
|
197 /** |
|
198 CMD11; read data stream from the card starting at the given address until |
|
199 an ECmdStopTransmission follows. |
|
200 |
|
201 @see ECmdStopTransmission |
|
202 */ |
|
203 ECmdReadDatUntilStop =11, |
|
204 |
|
205 |
|
206 /** |
|
207 CMD12; force the card to stop transmission. |
|
208 */ |
|
209 ECmdStopTransmission =12, |
|
210 |
|
211 |
|
212 /** |
|
213 CMD13; addressed card sends its status register. |
|
214 */ |
|
215 ECmdSendStatus =13, |
|
216 |
|
217 |
|
218 /** |
|
219 CMD14; BUSTEST_R - Reads the reversed bus testing data pattern from the card. |
|
220 |
|
221 @see ECmdBustest_W |
|
222 */ |
|
223 ECmd14 =14, |
|
224 ECmdBustest_R =14, |
|
225 |
|
226 |
|
227 /** |
|
228 CMD15; set the card to the inactive state. |
|
229 */ |
|
230 ECmdGoInactiveState =15, |
|
231 |
|
232 |
|
233 /** |
|
234 CMD16; set the block length for all following block commands. |
|
235 */ |
|
236 ECmdSetBlockLen =16, |
|
237 |
|
238 |
|
239 /** |
|
240 CMD17; read a single data block from the card. |
|
241 */ |
|
242 ECmdReadSingleBlock =17, |
|
243 |
|
244 |
|
245 /** |
|
246 CMD18; continuously transfer data blocks from the card until interrupted |
|
247 by ECmdStopTransmission. |
|
248 |
|
249 @see ECmdStopTransmission |
|
250 */ |
|
251 ECmdReadMultipleBlock =18, |
|
252 |
|
253 |
|
254 /** |
|
255 CMD19; BUSTEST_W - Sends a test data pattern to the card to determine the bus characteristics |
|
256 |
|
257 @see ECmdBustest_R |
|
258 */ |
|
259 ECmd19 =19, |
|
260 ECmdBustest_W =19, |
|
261 |
|
262 |
|
263 /** |
|
264 CMD20; write data stream from the host starting at the given address |
|
265 until interrupted by ECmdStopTransmission. |
|
266 |
|
267 @see ECmdStopTransmission |
|
268 */ |
|
269 ECmdWriteDatUntilStop =20, |
|
270 |
|
271 |
|
272 /** |
|
273 CMD21; reserved for future use. |
|
274 */ |
|
275 ECmd21 =21, |
|
276 |
|
277 |
|
278 /** |
|
279 CMD22; reserved for future use. |
|
280 */ |
|
281 ECmd22 =22, |
|
282 |
|
283 |
|
284 /** |
|
285 CMD23; define the number of blocks to be transferred in the following |
|
286 multiple block read or write command. |
|
287 */ |
|
288 ECmdSetBlockCount =23, |
|
289 |
|
290 |
|
291 /** |
|
292 CMD24; write a single block to the card. |
|
293 */ |
|
294 ECmdWriteBlock =24, |
|
295 |
|
296 |
|
297 /** |
|
298 CMD25; continuously transfer data blocks to the card until interrupted |
|
299 by ECmdStopTransmission. |
|
300 |
|
301 @see ECmdStopTransmission |
|
302 */ |
|
303 ECmdWriteMultipleBlock =25, |
|
304 |
|
305 |
|
306 /** |
|
307 CMD26; programming of the CID. |
|
308 |
|
309 This is issued once per card, and is normally reserved for |
|
310 the manufacturer. |
|
311 */ |
|
312 ECmdProgramCID =26, |
|
313 |
|
314 |
|
315 /** |
|
316 CMD27; programming of the programmable bits of the CSD. |
|
317 */ |
|
318 ECmdProgramCSD =27, |
|
319 |
|
320 |
|
321 /** |
|
322 CMD28; set the write protect bit of the addressed group, if the card has |
|
323 write protection features. |
|
324 */ |
|
325 ECmdSetWriteProt =28, |
|
326 |
|
327 |
|
328 /** |
|
329 CMD29; clear the write protect bit of the addressed group, if the card has |
|
330 write protection features. |
|
331 */ |
|
332 ECmdClearWriteProt =29, |
|
333 |
|
334 |
|
335 /** |
|
336 CMD30; ask the card to send the status of the write protect bit, if |
|
337 the card has write protection features. |
|
338 */ |
|
339 ECmdSendWriteProt =30, |
|
340 |
|
341 |
|
342 /** |
|
343 CMD31; reserved for future use. |
|
344 */ |
|
345 ECmd31 =31, |
|
346 |
|
347 |
|
348 /** |
|
349 CMD32; set the address of the first sector of the erase group. |
|
350 */ |
|
351 ECmdTagSectorStart =32, |
|
352 |
|
353 |
|
354 /** |
|
355 CMD33; set the address of the last sector in a continuous range within |
|
356 the selected erase group, or the address of a single sector to be |
|
357 selected for erase. |
|
358 */ |
|
359 ECmdTagSectorEnd =33, |
|
360 |
|
361 |
|
362 /** |
|
363 CMD34; remove one previously selected sector from the erase selection. |
|
364 */ |
|
365 ECmdUntagSector =34, |
|
366 |
|
367 |
|
368 /** |
|
369 CMD35; set the the address of the first erase group within a continuous |
|
370 range to be selected for erase. |
|
371 */ |
|
372 ECmdTagEraseGroupStart =35, |
|
373 |
|
374 |
|
375 /** |
|
376 CMD36; set the address of the last erase group within a continuous range |
|
377 to be selected for erase. |
|
378 */ |
|
379 ECmdTagEraseGroupEnd =36, |
|
380 |
|
381 |
|
382 /** |
|
383 CMD37; removes one previously selected erase group from the erase selection. |
|
384 */ |
|
385 ECmdUntagEraseGroup =37, |
|
386 |
|
387 |
|
388 /** |
|
389 CMD38; erase all previously selected sectors. |
|
390 */ |
|
391 ECmdErase =38, |
|
392 |
|
393 |
|
394 /** |
|
395 CMD39; read and write 8 bit (register) data fields. |
|
396 */ |
|
397 ECmdFastIO =39, |
|
398 |
|
399 |
|
400 /** |
|
401 CMD40; set the system into interrupt mode. |
|
402 */ |
|
403 ECmdGoIRQState =40, |
|
404 |
|
405 |
|
406 /** |
|
407 CMD41; reserved for future use. |
|
408 */ |
|
409 ECmd41 =41, |
|
410 |
|
411 |
|
412 /** |
|
413 CMD42; set/reset the password or lock/unlock the card. |
|
414 */ |
|
415 ECmdLockUnlock =42, |
|
416 |
|
417 |
|
418 /** |
|
419 CMD43; reserved for future use. |
|
420 */ |
|
421 ECmd43 =43, |
|
422 |
|
423 |
|
424 /** |
|
425 CMD44; reserved for future use. |
|
426 */ |
|
427 ECmd44 =44, |
|
428 |
|
429 |
|
430 /** |
|
431 CMD45; reserved for future use. |
|
432 */ |
|
433 ECmd45 =45, |
|
434 |
|
435 |
|
436 /** |
|
437 CMD46; reserved for future use. |
|
438 */ |
|
439 ECmd46 =46, |
|
440 |
|
441 |
|
442 /** |
|
443 CMD47; reserved for future use. |
|
444 */ |
|
445 ECmd47 =47, |
|
446 |
|
447 |
|
448 /** |
|
449 CMD48; reserved for future use. |
|
450 */ |
|
451 ECmd48 =48, |
|
452 |
|
453 |
|
454 /** |
|
455 CMD49; reserved for future use. |
|
456 */ |
|
457 ECmd49 =49, |
|
458 |
|
459 |
|
460 /** |
|
461 CMD50; reserved for future use. |
|
462 */ |
|
463 ECmd50 =50, |
|
464 |
|
465 |
|
466 /** |
|
467 CMD51; reserved for future use. |
|
468 */ |
|
469 ECmd51 =51, |
|
470 |
|
471 |
|
472 /** |
|
473 CMD52; reserved for future use. |
|
474 */ |
|
475 ECmd52 =52, |
|
476 |
|
477 |
|
478 /** |
|
479 CMD53; reserved for future use. |
|
480 */ |
|
481 ECmd53 =53, |
|
482 |
|
483 |
|
484 /** |
|
485 CMD54; reserved for future use. |
|
486 */ |
|
487 ECmd54 =54, |
|
488 |
|
489 |
|
490 /** |
|
491 CMD55; indicate to the card that the next command is an application |
|
492 specific command rather than a standard command. |
|
493 */ |
|
494 ECmdAppCmd =55, |
|
495 |
|
496 |
|
497 /** |
|
498 CMD56; transfer a data block to the card, or get a data block from the card, |
|
499 for general purpose/application specific commands. |
|
500 */ |
|
501 ECmdGenCmd =56, |
|
502 |
|
503 |
|
504 /** |
|
505 CMD57; reserved for future use. |
|
506 */ |
|
507 ECmd57 =57, |
|
508 |
|
509 |
|
510 /** |
|
511 CMD58; reserved for future use. |
|
512 */ |
|
513 ECmd58 =58, |
|
514 |
|
515 |
|
516 /** |
|
517 CMD59; reserved for future use. |
|
518 */ |
|
519 ECmd59 =59, |
|
520 |
|
521 |
|
522 /** |
|
523 CMD60; reserved for future use. |
|
524 */ |
|
525 ECmd60 =60, |
|
526 |
|
527 |
|
528 /** |
|
529 CMD61; reserved for future use. |
|
530 */ |
|
531 ECmd61 =61, |
|
532 |
|
533 |
|
534 /** |
|
535 CMD62; reserved for future use. |
|
536 */ |
|
537 ECmd62 =62, |
|
538 |
|
539 |
|
540 /** |
|
541 CMD63; reserved for future use. |
|
542 */ |
|
543 ECmd63 =63 |
|
544 }; |
|
545 |
|
546 enum TMMCCommandTypeEnum |
|
547 { |
|
548 ECmdTypeUK, // UnKnown command type |
|
549 ECmdTypeBC, // Broadcast Command |
|
550 ECmdTypeBCR, // Broadcast Command with Response |
|
551 ECmdTypeAC, // Addressed Command |
|
552 ECmdTypeACS, // Addressed Command to a Selected card |
|
553 ECmdTypeADTCS, // Addressed Data Transfer Command to a Selected card |
|
554 ECmdTypeADC // Addressed Direct Command to a Selected card |
|
555 }; |
|
556 |
|
557 enum TMMCResponseTypeEnum |
|
558 { |
|
559 ERespTypeNone, |
|
560 ERespTypeUnknown, |
|
561 ERespTypeR1, // 32 bits Status |
|
562 ERespTypeR1B, // 32 bits Status with possible busy signal |
|
563 ERespTypeR2, // 128 bits CID or CSD register |
|
564 ERespTypeR3, // 32 bits OCR register |
|
565 ERespTypeR4, // 32 bits Fast I/O |
|
566 ERespTypeR5, // 32 bits IRQ |
|
567 ERespTypeR6, |
|
568 ERespTypeR7 // not currently defined for MMC |
|
569 }; |
|
570 |
|
571 |
|
572 /** |
|
573 @publishedPartner |
|
574 @released |
|
575 |
|
576 Defines the set of media types for a MultiMediaCard. |
|
577 */ |
|
578 enum TMMCMediaTypeEnum |
|
579 { |
|
580 /** |
|
581 A read only card. |
|
582 */ |
|
583 EMultiMediaROM, |
|
584 |
|
585 |
|
586 /** |
|
587 A writable card. |
|
588 */ |
|
589 EMultiMediaFlash, |
|
590 |
|
591 |
|
592 /** |
|
593 An I/O card. |
|
594 */ |
|
595 EMultiMediaIO, |
|
596 |
|
597 |
|
598 /** |
|
599 A card type that is neither read only, writable nor I/O. |
|
600 */ |
|
601 EMultiMediaOther, |
|
602 |
|
603 |
|
604 /** |
|
605 A card type that is not supported. |
|
606 */ |
|
607 EMultiMediaNotSupported |
|
608 }; |
|
609 |
|
610 enum TMMCSessionTypeEnum |
|
611 { |
|
612 ECIMNakedSession =0, |
|
613 ECIMUpdateAcq =1, |
|
614 ECIMInitStack =2, |
|
615 ECIMCheckStack =3, |
|
616 ECIMSetupCard =4, |
|
617 ECIMReadBlock =5, |
|
618 ECIMWriteBlock =6, |
|
619 ECIMReadMBlock =7, |
|
620 ECIMWriteMBlock =8, |
|
621 ECIMEraseSector =9, |
|
622 ECIMEraseGroup =10, |
|
623 ECIMReadIO =11, |
|
624 ECIMWriteIO =12, |
|
625 ECIMLockUnlock =13, |
|
626 ECIMLockStack =14, |
|
627 ECIMInitStackAfterUnlock =15, |
|
628 ECIMAutoUnlock =16, |
|
629 ECIMSleep =17 |
|
630 }; |
|
631 |
|
632 const TUint KMMCMaxSessionTypeNumber = 18; |
|
633 const TUint KMMCMinCustomSession = 1024; |
|
634 |
|
635 const TUint KMMCCmdDirDirBitPosition= KBit0; //fixed - dont change it |
|
636 const TUint KMMCCmdDirIndBitPosition= (KBit5-KBit0); //fixed - dont change it |
|
637 const TUint KMMCCmdDirWBitArgument= KBit5; |
|
638 const TUint KMMCCmdDirNegate= KBit6; |
|
639 const TUint KMMCCmdDirWBitDirect= KBit7; |
|
640 |
|
641 const TUint KMMCCmdReliableWrite = KBit31; |
|
642 |
|
643 |
|
644 /** |
|
645 @publishedPartner |
|
646 @released |
|
647 |
|
648 An enum whose values specify the data transfer direction. |
|
649 |
|
650 @see TMMCCommandSpec |
|
651 */ |
|
652 enum TMMCCmdDirEnum |
|
653 { |
|
654 EDirNone = 0, |
|
655 EDirRead = KMMCCmdDirWBitDirect, |
|
656 EDirWrite = KMMCCmdDirWBitDirect|KMMCCmdDirDirBitPosition, |
|
657 EDirWBit0 = KMMCCmdDirWBitArgument + 0, |
|
658 EDirRBit0 = (KMMCCmdDirWBitArgument|KMMCCmdDirNegate) + 0 |
|
659 }; |
|
660 |
|
661 |
|
662 |
|
663 |
|
664 /** |
|
665 @publishedPartner |
|
666 @released |
|
667 |
|
668 An enum whose values specify the width of the data bus |
|
669 |
|
670 This enum is used by the DMMCStack::SetBusWidth() and TMMCMachineInfo.iMaxBusWidth. |
|
671 */ |
|
672 enum TBusWidth |
|
673 { |
|
674 EBusWidth1 = 0x00, |
|
675 EBusWidth4 = 0x02, |
|
676 EBusWidth8 = 0x03, |
|
677 EBusWidthInvalid = KMaxTUint32 |
|
678 }; |
|
679 |
|
680 /** |
|
681 @publishedPartner |
|
682 @released |
|
683 */ |
|
684 const TUint8 KMMCLockUnlockErase = KBit3; // In first byte of CMD42 data block |
|
685 |
|
686 /** |
|
687 @publishedPartner |
|
688 @released |
|
689 */ |
|
690 const TUint8 KMMCLockUnlockLockUnlock = KBit2; |
|
691 |
|
692 /** |
|
693 @publishedPartner |
|
694 @released |
|
695 */ |
|
696 const TUint8 KMMCLockUnlockClrPwd = KBit1; |
|
697 |
|
698 /** |
|
699 @publishedPartner |
|
700 @released |
|
701 */ |
|
702 const TUint8 KMMCLockUnlockSetPwd = KBit0; |
|
703 |
|
704 |
|
705 |
|
706 |
|
707 /** |
|
708 @publishedPartner |
|
709 @released |
|
710 |
|
711 A utility class that contains convenience functions to handle conversion |
|
712 to and from big-endian format. |
|
713 */ |
|
714 class TMMC |
|
715 { |
|
716 public: |
|
717 static inline TUint32 BigEndian32(const TUint8*); |
|
718 static inline void BigEndian4Bytes(TUint8* aPtr, TUint32 aVal); |
|
719 }; |
|
720 |
|
721 |
|
722 // Generic MMC layer constants |
|
723 |
|
724 const TInt KMaxMMCStacks=1; // Number of separate MMC buses |
|
725 const TUint KMaxMMCardsPerStack=4; // Limits the number of cards in each stack |
|
726 |
|
727 const TUint KBroadcastToAllCards=0xFFFFFFFF; |
|
728 |
|
729 // MMC Spec related constants |
|
730 |
|
731 const TUint KMMCMaxResponseLength=16; // in bytes |
|
732 const TUint KMMCCIDLength=16; |
|
733 const TUint KMMCCSDLength=16; |
|
734 const TUint KMMCExtendedCSDLength=512; |
|
735 const TUint KMMCBusClockFOD=400; // Identification clock in kiloherz |
|
736 const TUint KMMCCommandMask = 63; // Size of TMMCCommandEnum enumerator |
|
737 |
|
738 // Command Classes Bit Set |
|
739 |
|
740 /** |
|
741 @publishedPartner |
|
742 @released |
|
743 */ |
|
744 const TUint32 KMMCCmdClassNone= 0; |
|
745 |
|
746 /** |
|
747 @publishedPartner |
|
748 @released |
|
749 */ |
|
750 const TUint32 KMMCCmdClassBasic= KBit0; |
|
751 |
|
752 /** |
|
753 @publishedPartner |
|
754 @released |
|
755 */ |
|
756 const TUint32 KMMCCmdClassStreamRead= KBit1; |
|
757 |
|
758 /** |
|
759 @publishedPartner |
|
760 @released |
|
761 */ |
|
762 const TUint32 KMMCCmdClassBlockRead= KBit2; |
|
763 |
|
764 /** |
|
765 @publishedPartner |
|
766 @released |
|
767 */ |
|
768 const TUint32 KMMCCmdClassStreamWrite= KBit3; |
|
769 |
|
770 /** |
|
771 @publishedPartner |
|
772 @released |
|
773 */ |
|
774 const TUint32 KMMCCmdClassBlockWrite= KBit4; |
|
775 |
|
776 /** |
|
777 @publishedPartner |
|
778 @released |
|
779 */ |
|
780 const TUint32 KMMCCmdClassErase= KBit5; |
|
781 |
|
782 /** |
|
783 @publishedPartner |
|
784 @released |
|
785 */ |
|
786 const TUint32 KMMCCmdClassWriteProtection=KBit6; |
|
787 |
|
788 /** |
|
789 @publishedPartner |
|
790 @released |
|
791 */ |
|
792 const TUint32 KMMCCmdClassLockCard= KBit7; |
|
793 |
|
794 /** |
|
795 @publishedPartner |
|
796 @released |
|
797 */ |
|
798 const TUint32 KMMCCmdClassApplication= KBit8; |
|
799 |
|
800 /** |
|
801 @publishedPartner |
|
802 @released |
|
803 */ |
|
804 const TUint32 KMMCCmdClassIOMode= KBit9; |
|
805 |
|
806 /** |
|
807 @publishedPartner |
|
808 @released |
|
809 */ |
|
810 const TUint32 KMMCCmdClassReserved10= KBit10; |
|
811 const TUint32 KMMCCmdClassSwitch= KBit10; |
|
812 |
|
813 /** |
|
814 @publishedPartner |
|
815 @released |
|
816 */ |
|
817 const TUint32 KMMCCmdClassReserved11= KBit11; |
|
818 |
|
819 // Specific MMC implementation constants |
|
820 |
|
821 const TUint KMaxMMCMachineStackDepth=20; // TMMCStateMachine stack depth |
|
822 const TUint KMaxMMCCommandStackDepth=9; // Session TMMCCommandDesc stack depth |
|
823 const TUint KMMCIdleCommandsAtRestart=2; // Number of CMD0s to be issued at initialisation |
|
824 const TUint KMMCMaxJobsInStackWorkSet=8; // Number of sessions simultaneously served |
|
825 const TUint KMMCPollGapInMilliseconds=40; |
|
826 const TUint KMMCMaxPollAttempts=5; // 40*5 = 200ms |
|
827 const TUint KMMCRetryGapInMilliseconds=10; |
|
828 const TUint KMMCMaxTimeOutRetries=1; |
|
829 const TUint KMMCMaxCRCRetries=1; |
|
830 const TUint16 KMMCMaxUnlockRetries=4; |
|
831 const TUint16 KMMCMaxAutoUnlockRetries=25; |
|
832 const TUint KMMCMaxGlobalRetries=1; |
|
833 const TUint16 KMMCSpecOpCondBusyTimeout=100 ; //MMC/SD Standard OCR timeout 1 second |
|
834 const TUint16 KMMCMaxOpCondBusyTimeout=150; // 10*150 = 1500ms |
|
835 const TUint KMMCLowVoltagePowerUpTimeoutInMilliseconds=2; // 1ms + 74 400KHz clock cycles |
|
836 const TUint KMMCUnlockRetryGapInMilliseconds = 200; // Unlock retry gap |
|
837 |
|
838 // DMMCStack Modes Bit Set |
|
839 const TUint32 KMMCModeEnableClientConfig = KBit0; // Merge with session iConfig |
|
840 const TUint32 KMMCModeEnableTimeOutRetry = KBit1; // Auto retry on response time-outs |
|
841 const TUint32 KMMCModeTimeOutRetryGap = KBit2; // Force timer delay between retries |
|
842 const TUint32 KMMCModeEnableCRCRetry = KBit3; // Command or response CRC errors |
|
843 const TUint32 KMMCModeCRCRetryGap = KBit4; |
|
844 const TUint32 KMMCModeDataCRCRetry = KBit5; // Repeat data transaction from the last valid position |
|
845 const TUint32 KMMCModeEnableUnlockRetry = KBit6; // Resend CMD42 for unreliable cards |
|
846 const TUint32 KMMCModeEnablePreemption = KBit7; // Allow sessions to share the MMC bus |
|
847 const TUint32 KMMCModePreemptOnBusy = KBit8; // Release bus control if busy |
|
848 const TUint32 KMMCModePreemptOnRetry = KBit9; // Release bus control before timeout/crc retries |
|
849 const TUint32 KMMCModePreemptInGaps = KBit10; // Preempt whenever gap timer is invoked |
|
850 const TUint32 KMMCModeEnqueIfLocked = KBit11; // Enque session if DMMCStack is locked |
|
851 const TUint32 KMMCModeCardControlled = KBit12; // Use Session CardP to get RCAs etc. |
|
852 const TUint32 KMMCModeCompleteInStackDFC = KBit13; // Run DMMCStack in DFC when completing |
|
853 const TUint32 KMMCModeEnableBusyPoll = KBit14; // Enables mechanism recovering from busy timeouts |
|
854 const TUint32 KMMCModeBusyPollGap = KBit15; |
|
855 const TUint32 KMMCModeEnableRetries = KBit16; // This mode removed disables all retries/polls |
|
856 const TUint32 KMMCModeMask = KBit17 - KBit0; |
|
857 |
|
858 // The following modes are effective for MasterConfig only |
|
859 const TUint32 KMMCModeClientPollAttempts = KBit20; |
|
860 const TUint32 KMMCModeClientTimeOutRetries = KBit21; |
|
861 const TUint32 KMMCModeClientCRCRetries = KBit22; |
|
862 const TUint32 KMMCModeClientUnlockRetries = KBit23; |
|
863 const TUint32 KMMCModeClientBusClock = KBit24; |
|
864 const TUint32 KMMCModeClientClockIn = KBit25; |
|
865 const TUint32 KMMCModeClientClockOut = KBit26; |
|
866 const TUint32 KMMCModeClientResponseTimeOut = KBit27; |
|
867 const TUint32 KMMCModeClientDataTimeOut = KBit28; |
|
868 const TUint32 KMMCModeClientBusyTimeOut = KBit29; |
|
869 const TUint32 KMMCModeClientiOpCondBusyTimeout = KBit30; |
|
870 const TUint32 KMMCModeClientMask = KBit31 - KBit20; |
|
871 |
|
872 // The following modes cannot be enabled by a client if disabled in MasterConfig |
|
873 const TUint32 KMMCModeMasterOverrides= |
|
874 KMMCModeEnableClientConfig | |
|
875 KMMCModeEnablePreemption | |
|
876 KMMCModeEnqueIfLocked | |
|
877 KMMCModeClientMask; |
|
878 |
|
879 // The following modes are always effective, even if the ClientConfig is disabled |
|
880 const TUint32 KMMCModeClientOverrides= |
|
881 KMMCModeEnableClientConfig | |
|
882 KMMCModeCardControlled; |
|
883 |
|
884 |
|
885 // The default MasterConfig modes |
|
886 const TUint32 KMMCModeDefault= KMMCModeEnableClientConfig | |
|
887 KMMCModeEnableRetries | |
|
888 KMMCModeEnableTimeOutRetry | |
|
889 KMMCModeTimeOutRetryGap | |
|
890 KMMCModeEnableCRCRetry | |
|
891 KMMCModeCRCRetryGap | |
|
892 KMMCModeDataCRCRetry | |
|
893 KMMCModeEnableUnlockRetry | |
|
894 KMMCModeEnablePreemption | |
|
895 KMMCModePreemptInGaps | |
|
896 KMMCModeEnqueIfLocked | |
|
897 KMMCModeCardControlled | |
|
898 KMMCModeClientMask; |
|
899 |
|
900 |
|
901 // MMC Error Code Bit Set |
|
902 |
|
903 /** |
|
904 @publishedPartner |
|
905 @released |
|
906 |
|
907 A MultiMediaCard error code. |
|
908 |
|
909 Indicates no error. |
|
910 |
|
911 @see TMMCErr |
|
912 */ |
|
913 const TUint32 KMMCErrNone=0; |
|
914 |
|
915 |
|
916 /** |
|
917 @publishedPartner |
|
918 @released |
|
919 |
|
920 A MultiMediaCard error code. |
|
921 |
|
922 Timed out waiting for a response from the card after issuing a command. |
|
923 |
|
924 @see TMMCErr |
|
925 */ |
|
926 const TUint32 KMMCErrResponseTimeOut=KBit0; |
|
927 |
|
928 |
|
929 /** |
|
930 @publishedPartner |
|
931 @released |
|
932 |
|
933 A MultiMediaCard error code. |
|
934 |
|
935 Timed out waiting for a data block to be received during a data read command. |
|
936 |
|
937 @see TMMCErr |
|
938 */ |
|
939 const TUint32 KMMCErrDataTimeOut= KBit1; |
|
940 |
|
941 |
|
942 /** |
|
943 @publishedPartner |
|
944 @released |
|
945 |
|
946 A MultiMediaCard error code. |
|
947 |
|
948 Timed out waiting for a data block to be requested during a data write command. |
|
949 |
|
950 @see TMMCErr |
|
951 */ |
|
952 const TUint32 KMMCErrBusyTimeOut= KBit2; |
|
953 |
|
954 |
|
955 /** |
|
956 @publishedPartner |
|
957 @released |
|
958 |
|
959 A MultiMediaCard error code. |
|
960 |
|
961 Timed out during the CIM_UPDATE_ACQ macro waiting for a card to power up. |
|
962 Cards that are still powering up return busy in response to a SEND_OP_COND command. |
|
963 |
|
964 @see TMMCErr |
|
965 */ |
|
966 const TUint32 KMMCErrBusTimeOut= KBit3; |
|
967 |
|
968 |
|
969 /** |
|
970 @publishedPartner |
|
971 @released |
|
972 |
|
973 A MultiMediaCard error code. |
|
974 |
|
975 The host has detected more cards in a stack that it can handle, or it has |
|
976 detected more cards than it was expecting, for example, more cards than physical slots. |
|
977 |
|
978 @see TMMCErr |
|
979 */ |
|
980 const TUint32 KMMCErrTooManyCards= KBit4; |
|
981 |
|
982 |
|
983 /** |
|
984 @publishedPartner |
|
985 @released |
|
986 |
|
987 A MultiMediaCard error code. |
|
988 |
|
989 The host has detected a CRC error in a response received from a card. |
|
990 |
|
991 @see TMMCErr |
|
992 */ |
|
993 const TUint32 KMMCErrResponseCRC= KBit5; |
|
994 |
|
995 |
|
996 /** |
|
997 @publishedPartner |
|
998 @released |
|
999 |
|
1000 A MultiMediaCard error code. |
|
1001 |
|
1002 The host has detected a CRC error in a data block received from a card. |
|
1003 |
|
1004 @see TMMCErr |
|
1005 */ |
|
1006 const TUint32 KMMCErrDataCRC= KBit6; |
|
1007 |
|
1008 |
|
1009 /** |
|
1010 @publishedPartner |
|
1011 @released |
|
1012 |
|
1013 A MultiMediaCard error code. |
|
1014 |
|
1015 The card has detected a CRC error in a command received from the host. |
|
1016 |
|
1017 @see TMMCErr |
|
1018 */ |
|
1019 const TUint32 KMMCErrCommandCRC= KBit7; |
|
1020 |
|
1021 |
|
1022 /** |
|
1023 @publishedPartner |
|
1024 @released |
|
1025 |
|
1026 A MultiMediaCard error code. |
|
1027 |
|
1028 An R1 response was received from the card with one or more of the error flags |
|
1029 set in the card status field. |
|
1030 |
|
1031 @see TMMCErr |
|
1032 */ |
|
1033 const TUint32 KMMCErrStatus= KBit8; |
|
1034 |
|
1035 |
|
1036 /** |
|
1037 @publishedPartner |
|
1038 @released |
|
1039 |
|
1040 A MultiMediaCard error code. |
|
1041 |
|
1042 A session was submitted without first being set-up with a card object, |
|
1043 or was set-up with a card object that is no longer present. |
|
1044 |
|
1045 @see TMMCErr |
|
1046 */ |
|
1047 const TUint32 KMMCErrNoCard= KBit9; |
|
1048 |
|
1049 |
|
1050 /** |
|
1051 @publishedPartner |
|
1052 @released |
|
1053 |
|
1054 A MultiMediaCard error code. |
|
1055 |
|
1056 The session had the stack locked but the MultiMediaCard controller had |
|
1057 to override the lock to perform some other bus activity. |
|
1058 |
|
1059 @see TMMCErr |
|
1060 */ |
|
1061 const TUint32 KMMCErrBrokenLock= KBit10; |
|
1062 |
|
1063 |
|
1064 /** |
|
1065 @publishedPartner |
|
1066 @released |
|
1067 |
|
1068 A MultiMediaCard error code. |
|
1069 |
|
1070 The card was powered down. |
|
1071 |
|
1072 @see TMMCErr |
|
1073 */ |
|
1074 const TUint32 KMMCErrPowerDown= KBit11; |
|
1075 |
|
1076 |
|
1077 /** |
|
1078 @publishedPartner |
|
1079 @released |
|
1080 |
|
1081 A MultiMediaCard error code. |
|
1082 |
|
1083 The session was stopped. |
|
1084 |
|
1085 @see TMMCErr |
|
1086 */ |
|
1087 const TUint32 KMMCErrAbort= KBit12; |
|
1088 |
|
1089 |
|
1090 /** |
|
1091 @publishedPartner |
|
1092 @released |
|
1093 |
|
1094 A MultiMediaCard error code. |
|
1095 |
|
1096 The stack has not yet been initialised. |
|
1097 |
|
1098 @see TMMCErr |
|
1099 */ |
|
1100 const TUint32 KMMCErrStackNotReady= KBit13; |
|
1101 |
|
1102 |
|
1103 /** |
|
1104 @publishedPartner |
|
1105 @released |
|
1106 |
|
1107 A MultiMediaCard error code. |
|
1108 |
|
1109 The session requested a service or feature that is not supported. |
|
1110 |
|
1111 @see TMMCErr |
|
1112 */ |
|
1113 const TUint32 KMMCErrNotSupported= KBit14; |
|
1114 |
|
1115 |
|
1116 /** |
|
1117 @publishedPartner |
|
1118 @released |
|
1119 |
|
1120 A MultiMediaCard error code. |
|
1121 |
|
1122 Indicates a general hardware related error. |
|
1123 |
|
1124 @see TMMCErr |
|
1125 */ |
|
1126 const TUint32 KMMCErrHardware= KBit15; |
|
1127 |
|
1128 |
|
1129 /** |
|
1130 @publishedPartner |
|
1131 @released |
|
1132 |
|
1133 A MultiMediaCard error code. |
|
1134 |
|
1135 An unexpected or inconsistent bus state has been detected. |
|
1136 |
|
1137 @see TMMCErr |
|
1138 */ |
|
1139 const TUint32 KMMCErrBusInconsistent=KBit16; |
|
1140 |
|
1141 |
|
1142 |
|
1143 |
|
1144 // SM control error codes |
|
1145 |
|
1146 /** |
|
1147 @publishedPartner |
|
1148 @released |
|
1149 |
|
1150 A MultiMediaCard error code. |
|
1151 |
|
1152 This is used interally by the MultiMediaCard controller. |
|
1153 |
|
1154 @see TMMCErr |
|
1155 */ |
|
1156 const TUint32 KMMCErrBypass= KBit17; |
|
1157 |
|
1158 |
|
1159 /** |
|
1160 @publishedPartner |
|
1161 @released |
|
1162 |
|
1163 A MultiMediaCard error code. |
|
1164 |
|
1165 This is used internally by the MultiMediaCard controller in the process |
|
1166 of re-initialising a card to recover from an inconsistent bus state. |
|
1167 |
|
1168 @see TMMCErr |
|
1169 */ |
|
1170 const TUint32 KMMCErrInitContext= KBit18; |
|
1171 |
|
1172 |
|
1173 /** |
|
1174 @publishedPartner |
|
1175 @released |
|
1176 |
|
1177 A MultiMediaCard error code. |
|
1178 |
|
1179 Indicates a bad argument. |
|
1180 |
|
1181 @see TMMCErr |
|
1182 */ |
|
1183 const TUint32 KMMCErrArgument= KBit19; |
|
1184 |
|
1185 |
|
1186 /** |
|
1187 @publishedPartner |
|
1188 @released |
|
1189 |
|
1190 A MultiMediaCard error code. |
|
1191 |
|
1192 A multiple block operation was requested, but the length specified was |
|
1193 less than that of a block. |
|
1194 |
|
1195 @see TMMCErr |
|
1196 */ |
|
1197 const TUint32 KMMCErrSingleBlock= KBit20; |
|
1198 |
|
1199 |
|
1200 |
|
1201 /** |
|
1202 @internalComponent |
|
1203 */ |
|
1204 const TUint32 KMMCErrUpdPswd= KBit21; |
|
1205 |
|
1206 |
|
1207 |
|
1208 |
|
1209 // General error codes |
|
1210 |
|
1211 /** |
|
1212 @publishedPartner |
|
1213 @released |
|
1214 |
|
1215 A MultiMediaCard error code. |
|
1216 |
|
1217 The card is locked. |
|
1218 |
|
1219 @see TMMCErr |
|
1220 */ |
|
1221 const TUint32 KMMCErrLocked= KBit22; |
|
1222 |
|
1223 |
|
1224 /** |
|
1225 @publishedPartner |
|
1226 @released |
|
1227 |
|
1228 A MultiMediaCard error code. |
|
1229 |
|
1230 Indicates a general 'not found' type error. |
|
1231 |
|
1232 @see TMMCErr |
|
1233 */ |
|
1234 const TUint32 KMMCErrNotFound= KBit23; |
|
1235 |
|
1236 |
|
1237 /** |
|
1238 @publishedPartner |
|
1239 @released |
|
1240 |
|
1241 An MultiMediaCard error code: |
|
1242 |
|
1243 Indicates a general already 'exists type' error. |
|
1244 |
|
1245 @see TMMCErr |
|
1246 */ |
|
1247 const TUint32 KMMCErrAlreadyExists= KBit24; |
|
1248 |
|
1249 |
|
1250 /** |
|
1251 @publishedPartner |
|
1252 @released |
|
1253 |
|
1254 An MultiMediaCard error code: |
|
1255 |
|
1256 Indicates an unspecified error. |
|
1257 |
|
1258 @see TMMCErr |
|
1259 */ |
|
1260 const TUint32 KMMCErrGeneral= KBit25; |
|
1261 |
|
1262 |
|
1263 /** |
|
1264 @publishedPartner |
|
1265 @released |
|
1266 |
|
1267 A bitmask of all MultiMediaCard error codes. |
|
1268 */ |
|
1269 const TUint32 KMMCErrAll = (KBit26 - KBit0); |
|
1270 |
|
1271 /** |
|
1272 @publishedPartner |
|
1273 @released |
|
1274 |
|
1275 A subset of MultiMediaCard error codes. |
|
1276 */ |
|
1277 const TUint32 KMMCErrBasic = (KMMCErrAll & ~( |
|
1278 KMMCErrBypass | |
|
1279 KMMCErrUpdPswd | |
|
1280 KMMCErrInitContext | |
|
1281 KMMCErrArgument | |
|
1282 KMMCErrSingleBlock | |
|
1283 KMMCErrLocked | |
|
1284 KMMCErrNotFound | |
|
1285 KMMCErrAlreadyExists| |
|
1286 KMMCErrGeneral)); |
|
1287 |
|
1288 // DMMC Stack and Session control bits |
|
1289 |
|
1290 // Stack State bits |
|
1291 const TUint32 KMMCStackStateRunning= KBit0; // Stack scheduler active |
|
1292 const TUint32 KMMCStackStateWaitingToLock= KBit1; // |
|
1293 const TUint32 KMMCStackStateLocked= KBit2; // |
|
1294 const TUint32 KMMCStackStateWaitingDFC= KBit3; |
|
1295 const TUint32 KMMCStackStateInitInProgress= KBit4; |
|
1296 const TUint32 KMMCStackStateReScheduled= KBit5; |
|
1297 const TUint32 KMMCStackStateJobChooser= KBit6; |
|
1298 const TUint32 KMMCStackStateDoDeselect= KBit7; |
|
1299 const TUint32 KMMCStackStateBusInconsistent=KBit8; |
|
1300 const TUint32 KMMCStackStateInitPending= KBit9; |
|
1301 const TUint32 KMMCStackStateCardRemoved= KBit10; |
|
1302 const TUint32 KMMCStackStateSleepinProgress=KBit11; |
|
1303 const TUint32 KMMCStackStateSleep= KBit12; |
|
1304 const TUint32 KMMCStackStateYielding= KBit13; |
|
1305 |
|
1306 // Session Blocking bits definition |
|
1307 |
|
1308 /** |
|
1309 @publishedPartner |
|
1310 @released |
|
1311 |
|
1312 A bit, which when set in a call to DMMCStack::BlockCurrentSession(), indicates |
|
1313 that the current session is to be blocked, awaiting an event that is to |
|
1314 be handled at the platform specific level. |
|
1315 |
|
1316 For example, the session may be waiting for: |
|
1317 |
|
1318 - a response following a command |
|
1319 - an interrupt indicating that data transfer is required |
|
1320 - a platform specific layer specific timer. |
|
1321 |
|
1322 @see DMMCStack::BlockCurrentSession() |
|
1323 */ |
|
1324 const TUint32 KMMCBlockOnASSPFunction= KBit0; |
|
1325 |
|
1326 const TUint32 KMMCBlockOnPollTimer = KBit1; |
|
1327 const TUint32 KMMCBlockOnRetryTimer = KBit2; |
|
1328 const TUint32 KMMCBlockOnNoRun = KBit3; |
|
1329 const TUint32 KMMCBlockOnDoor = KBit4; |
|
1330 const TUint32 KMMCBlockOnWaitToLock = KBit5; |
|
1331 const TUint32 KMMCBlockOnCardInUse = KBit6; |
|
1332 const TUint32 KMMCBlockOnPgmTimer = KBit7; |
|
1333 const TUint32 KMMCBlockOnInterrupt = KBit8; |
|
1334 const TUint32 KMMCBlockOnDataTransfer = KBit9; |
|
1335 const TUint32 KMMCBlockOnMoreData = KBit10; |
|
1336 const TUint32 KMMCBlockOnYielding = KBit11; // Yielding to other commands |
|
1337 |
|
1338 const TUint32 KMMCBlockOnAsynchMask = KMMCBlockOnASSPFunction | |
|
1339 KMMCBlockOnPollTimer | |
|
1340 KMMCBlockOnRetryTimer | |
|
1341 KMMCBlockOnPgmTimer | |
|
1342 KMMCBlockOnInterrupt | |
|
1343 KMMCBlockOnDataTransfer | |
|
1344 KMMCBlockOnMoreData; |
|
1345 |
|
1346 const TUint32 KMMCBlockOnGapTimersMask = KMMCBlockOnPollTimer | |
|
1347 KMMCBlockOnRetryTimer | |
|
1348 KMMCBlockOnPgmTimer; |
|
1349 |
|
1350 // Session State bits definition |
|
1351 const TUint32 KMMCSessStateEngaged = KBit0; // Processed by DMMCStack |
|
1352 const TUint32 KMMCSessStateInProgress = KBit1; // No longer safe to restart |
|
1353 const TUint32 KMMCSessStateCritical = KBit2; // Re-initialise the stack if aborted |
|
1354 const TUint32 KMMCSessStateSafeInGaps = KBit3; |
|
1355 const TUint32 KMMCSessStateDoReSchedule= KBit4; |
|
1356 |
|
1357 /** |
|
1358 @publishedPartner |
|
1359 @released |
|
1360 |
|
1361 A bit that when set into DMMCSession::iState before calling |
|
1362 DMMCStack::UnBlockCurrentSession(), causes a DFC to be queued in order |
|
1363 to resume the state machine at some later stage. |
|
1364 */ |
|
1365 const TUint32 KMMCSessStateDoDFC = KBit5; |
|
1366 const TUint32 KMMCSessStateBlockOnDoor = KBit6; |
|
1367 const TUint32 KMMCSessStateCardIsGone = KBit7; |
|
1368 const TUint32 KMMCSessStateASSPEngaged = KBit8; |
|
1369 const TUint32 KMMCSessStateAllowDirectCommands = KBit9; // Allow Direct Commands (Using CMD) during Data Transfer |
|
1370 |
|
1371 class TCID |
|
1372 /** |
|
1373 CID class |
|
1374 |
|
1375 @publishedPartner |
|
1376 @released |
|
1377 */ |
|
1378 { |
|
1379 public: |
|
1380 inline TCID() {} // Default constructor |
|
1381 inline TCID(const TUint8*); |
|
1382 inline TCID& operator=(const TCID&); |
|
1383 inline TCID& operator=(const TUint8*); |
|
1384 inline TBool operator==(const TCID&) const; |
|
1385 inline TBool operator==(const TUint8*) const; |
|
1386 inline void Copy(TUint8*) const; // Copies big endian 16 bytes CID |
|
1387 inline TUint8 At(TUint anIndex) const; // Byte from CID at anIndex |
|
1388 private: |
|
1389 TUint8 iData[KMMCCIDLength]; // Big endian 128 bit bitfield representing CID |
|
1390 }; |
|
1391 |
|
1392 |
|
1393 class TCSD |
|
1394 /** |
|
1395 CSD class |
|
1396 |
|
1397 @publishedPartner |
|
1398 @released |
|
1399 */ |
|
1400 { |
|
1401 public: |
|
1402 inline TCSD() {memclr(this, sizeof(*this));} // Default constructor |
|
1403 inline TCSD(const TUint8*); |
|
1404 inline TCSD& operator=(const TCSD&); |
|
1405 inline TCSD& operator=(const TUint8*); |
|
1406 inline void Copy(TUint8*) const; // Copies big endian 16 bytes CSD |
|
1407 inline TUint8 At(TUint anIndex) const; // Byte from CSD at anIndex |
|
1408 public: |
|
1409 inline TUint CSDStructure() const; |
|
1410 inline TUint SpecVers() const; |
|
1411 inline TUint Reserved120() const; |
|
1412 inline TUint TAAC() const; |
|
1413 inline TUint NSAC() const; |
|
1414 inline TUint TranSpeed() const; |
|
1415 inline TUint CCC() const; |
|
1416 inline TUint ReadBlLen() const; |
|
1417 inline TBool ReadBlPartial() const; |
|
1418 inline TBool WriteBlkMisalign() const; |
|
1419 inline TBool ReadBlkMisalign() const; |
|
1420 inline TBool DSRImp() const; |
|
1421 inline TUint Reserved74() const; |
|
1422 inline TUint CSize() const; |
|
1423 inline TUint VDDRCurrMin() const; |
|
1424 inline TUint VDDRCurrMax() const; |
|
1425 inline TUint VDDWCurrMin() const; |
|
1426 inline TUint VDDWCurrMax() const; |
|
1427 inline TUint CSizeMult() const; |
|
1428 inline TUint EraseGrpSize() const; |
|
1429 inline TUint EraseGrpMult() const; |
|
1430 inline TUint WPGrpSize() const; |
|
1431 inline TBool WPGrpEnable() const; |
|
1432 inline TUint DefaultECC() const; |
|
1433 inline TUint R2WFactor() const; |
|
1434 inline TUint WriteBlLen() const; |
|
1435 inline TBool WriteBlPartial() const; |
|
1436 inline TUint Reserved16() const; |
|
1437 inline TBool FileFormatGrp() const; |
|
1438 inline TBool Copy() const; |
|
1439 inline TBool PermWriteProtect() const; |
|
1440 inline TBool TmpWriteProtect() const; |
|
1441 inline TUint FileFormat() const; |
|
1442 inline TUint ECC() const; |
|
1443 inline TUint CRC() const; |
|
1444 public: |
|
1445 IMPORT_C TUint DeviceSize() const; // Uses functions above to calculate device capacity |
|
1446 IMPORT_C TMMCMediaTypeEnum MediaType() const; |
|
1447 IMPORT_C TUint ReadBlockLength() const; // Read Block Length in bytes |
|
1448 IMPORT_C TUint WriteBlockLength() const;// Write Block Length in bytes |
|
1449 IMPORT_C TUint EraseSectorSize() const; // Erase sector size (default 512 bytes) |
|
1450 IMPORT_C TUint EraseGroupSize() const; // Erase group size (default 16*<sector size> bytes) |
|
1451 IMPORT_C TUint MinReadCurrentInMilliamps() const; |
|
1452 IMPORT_C TUint MinWriteCurrentInMilliamps() const; |
|
1453 IMPORT_C TUint MaxReadCurrentInMilliamps() const; |
|
1454 IMPORT_C TUint MaxWriteCurrentInMilliamps() const; |
|
1455 IMPORT_C TUint MaxTranSpeedInKilohertz() const; |
|
1456 public: |
|
1457 IMPORT_C TUint CSDField(const TUint& aTopBit, const TUint& aBottomBit) const; /**< @internalComponent */ |
|
1458 TUint8 iData[KMMCCSDLength]; /**< @internalComponent */ // Big endian 128 bit bitfield representing CSD |
|
1459 }; |
|
1460 |
|
1461 |
|
1462 class TExtendedCSD |
|
1463 /** |
|
1464 Extended CSD register class. |
|
1465 For more information about this register, see the MultimediaCard System |
|
1466 Specification, Version 4.1+ |
|
1467 |
|
1468 @publishedPartner |
|
1469 @released |
|
1470 */ |
|
1471 { |
|
1472 public: |
|
1473 /** |
|
1474 An enum used by TExtendedCSD::GetWriteArg() to construct a TMMCArgument object. |
|
1475 The value chosen defines how the register or command set is to be modified. |
|
1476 */ |
|
1477 enum TExtCSDAccessBits |
|
1478 { |
|
1479 /** Change the card's command set */ |
|
1480 ECmdSet, |
|
1481 /** Set the specified bits */ |
|
1482 ESetBits, |
|
1483 /** Clear the specified bits */ |
|
1484 EClearBits, |
|
1485 /** Write the specified byte */ |
|
1486 EWriteByte |
|
1487 }; |
|
1488 /** |
|
1489 This enum defines various field offsets into the Modes Segment (i.e. |
|
1490 the writable part) of the Extended CSD register. |
|
1491 */ |
|
1492 enum TExtCSDModesFieldIndex |
|
1493 { |
|
1494 /** Offset of the CMD_SET field */ |
|
1495 ECmdSetIndex = 191, |
|
1496 /** Offset of the CMD_SET_REV field */ |
|
1497 ECmdSetRevIndex = 189, |
|
1498 /** Offset of the POWER_CLASS field */ |
|
1499 EPowerClassIndex = 187, |
|
1500 /** Offset of the HS_TIMING field */ |
|
1501 EHighSpeedInterfaceTimingIndex = 185, |
|
1502 /** Offset of the BUS_WIDTH field */ |
|
1503 EBusWidthModeIndex = 183, |
|
1504 /** Offset of the BOOT_CONFIG field */ |
|
1505 EBootConfigIndex = 179, |
|
1506 /** Offset of the BOOT_BUS_WIDTH field */ |
|
1507 EBootBusWidthIndex = 177, |
|
1508 /** Offset of the ERASE_GROUP_DEF field */ |
|
1509 EEraseGroupDefIndex = 175 |
|
1510 }; |
|
1511 |
|
1512 /** |
|
1513 This enum defines various field offsets into the Properties Segment (i.e. |
|
1514 the read-only part) of the Extended CSD register. |
|
1515 */ |
|
1516 enum TExtCSDPropertiesFieldIndex |
|
1517 { |
|
1518 /** Offset of the EXT_CSD_REV field */ |
|
1519 EExtendedCSDRevIndex = 192, |
|
1520 /** Offset of the CARD_TYPE field */ |
|
1521 ECardTypeIndex = 196, |
|
1522 /** Offset of the ACC_SIZE field */ |
|
1523 EAccessSizeIndex = 225, |
|
1524 /** Offset of the HC_ERASE_GRP_SIZE field */ |
|
1525 EHighCapacityEraseGroupSizeIndex = 224 |
|
1526 }; |
|
1527 |
|
1528 /** This enum defines the bus width encoding used by the BUS_WIDTH field */ |
|
1529 enum TExtCSDBusWidths |
|
1530 { |
|
1531 EExtCsdBusWidth1 = 0x00, |
|
1532 EExtCsdBusWidth4 = 0x01, |
|
1533 EExtCsdBusWidth8 = 0x02 |
|
1534 }; |
|
1535 |
|
1536 /** |
|
1537 This enum defines the different MMCV4.x card types available as defined |
|
1538 in the CARD_TYPE field |
|
1539 */ |
|
1540 enum TCardTypes |
|
1541 { |
|
1542 EHighSpeedCard26Mhz = 0x01, |
|
1543 EHighSpeedCard52Mhz = 0x02 |
|
1544 }; |
|
1545 |
|
1546 /** |
|
1547 This enum defines the boot config encoding used by the BOOT_CONFIG field |
|
1548 */ |
|
1549 enum TExtCSDBootConfig |
|
1550 { |
|
1551 ESelectUserArea = 0x00, |
|
1552 ESelectBootPartition1 = 0x01, |
|
1553 ESelectBootPartition2 = 0x02, |
|
1554 EEnableBootPartition1forBoot = 0x08, |
|
1555 EEnableBootPartition2forBoot = 0x10, |
|
1556 EEnableUserAreaforBoot = 0x38, |
|
1557 EEnableBootAck = 0x40 |
|
1558 }; |
|
1559 |
|
1560 /** |
|
1561 This enum defines the Boot Bus Width encoding used by the BOOT_BUS_WIDTH field |
|
1562 */ |
|
1563 enum TExtCSDBootBusWidth |
|
1564 { |
|
1565 EBootBusWidth1Bit = 0x00, |
|
1566 EBootBusWidth4Bit = 0x01, |
|
1567 EBootBusWidth8Bit = 0x02, |
|
1568 EResetBusWidthafterBoot = 0x08 |
|
1569 }; |
|
1570 |
|
1571 /** |
|
1572 This enum defines the Erase Group Definition encoding |
|
1573 used by the ERASE_GROUP_DEF field |
|
1574 */ |
|
1575 enum TExtCSDEraseGroupDef |
|
1576 { |
|
1577 |
|
1578 EEraseGrpDefEnableOldSizes = 0x00, |
|
1579 EEraseGrpDefEnableHighCapSizes = 0x01 |
|
1580 }; |
|
1581 |
|
1582 public: |
|
1583 /** Default constructor */ |
|
1584 inline TExtendedCSD(); |
|
1585 /** |
|
1586 Constructor |
|
1587 @param aPtr a byte buffer containing the contents of the register |
|
1588 */ |
|
1589 inline TExtendedCSD(const TUint8* aPtr); |
|
1590 /** |
|
1591 Copy constructor |
|
1592 @param aCSD a reference to another instance of the same class |
|
1593 */ |
|
1594 inline TExtendedCSD& operator=(const TExtendedCSD& aCSD); |
|
1595 /** |
|
1596 Copy constructor |
|
1597 @param aPtr a byte buffer containing the contents of the register |
|
1598 */ |
|
1599 inline TExtendedCSD& operator=(const TUint8* aPtr); |
|
1600 |
|
1601 /** Returns the byte at a particular offset into the register |
|
1602 @param anIndex the offset into the register |
|
1603 */ |
|
1604 inline TUint8 At(TUint anIndex) const; |
|
1605 |
|
1606 /** returns a pointer to the raw data */ |
|
1607 inline TUint8* Ptr(); |
|
1608 |
|
1609 /** |
|
1610 Constructs and then returns a TMMCArgument which can be used to |
|
1611 write to the register using the SWITCH command (CMD6) |
|
1612 @param aAccess specifies how the register or command set is to be modified. |
|
1613 @param aIndex the offset into the register |
|
1614 @param aValue the value to write to the field in the register |
|
1615 @param aCmdSet The command set to write. Valid if aAccess = ECmdSet |
|
1616 */ |
|
1617 inline static TMMCArgument GetWriteArg(TExtCSDAccessBits aAccess, TExtCSDModesFieldIndex aIndex, TUint aValue, TUint aCmdSet); |
|
1618 |
|
1619 /** returns the contents of the CMD_SET field */ |
|
1620 inline TUint SupportedCmdSet() const; |
|
1621 |
|
1622 /** returns the contents of the SEC_COUNT field */ |
|
1623 inline TUint SectorCount() const; |
|
1624 |
|
1625 /** returns the contents of the MIN_PERF_W_8_52 field */ |
|
1626 inline TUint MinPerfWrite8Bit52Mhz() const; |
|
1627 |
|
1628 /** returns the contents of the MIN_PERF_R_8_52 field */ |
|
1629 inline TUint MinPerfRead8Bit52Mhz() const; |
|
1630 |
|
1631 /** returns the contents of the MIN_PERF_W_8_26_4_52 field */ |
|
1632 inline TUint MinPerfWrite8Bit26Mhz_4Bit52Mhz() const; |
|
1633 |
|
1634 /** returns the contents of the MIN_PERF_R_8_26_4_52 field */ |
|
1635 inline TUint MinPerfRead8Bit26Mhz_4Bit52Mhz() const; |
|
1636 |
|
1637 /** returns the contents of the MIN_PERF_W_4_26 field */ |
|
1638 inline TUint MinPerfWrite4Bit26Mhz() const; |
|
1639 |
|
1640 /** returns the contents of the MIN_PERF_R_4_26 field */ |
|
1641 inline TUint MinPerfRead4Bit26Mhz() const; |
|
1642 |
|
1643 /** returns the contents of the PWR_CL_26_360 field */ |
|
1644 inline TUint PowerClass26Mhz360V() const; |
|
1645 |
|
1646 /** returns the contents of the PWR_CL_52_360 field */ |
|
1647 inline TUint PowerClass52Mhz360V() const; |
|
1648 |
|
1649 /** returns the contents of the PWR_CL_26_195 field */ |
|
1650 inline TUint PowerClass26Mhz195V() const; |
|
1651 |
|
1652 /** returns the contents of the PWR_CL_52_195 field */ |
|
1653 inline TUint PowerClass52Mhz195V() const; |
|
1654 |
|
1655 /** returns the contents of the CARD_TYPE field */ |
|
1656 inline TUint CardType() const; |
|
1657 |
|
1658 /** returns the contents of the CSD_STRUCTURE field */ |
|
1659 inline TUint CSDStructureVer() const; |
|
1660 |
|
1661 /** returns the contents of the EXT_CSD_REV field */ |
|
1662 inline TUint ExtendedCSDRev() const; |
|
1663 |
|
1664 /** returns the contents of the CMD_SET field */ |
|
1665 inline TUint CmdSet() const; |
|
1666 |
|
1667 /** returns the contents of the CMD_SET_REV field */ |
|
1668 inline TUint CmdSetRev() const; |
|
1669 |
|
1670 /** returns the contents of the POWER_CLASS field */ |
|
1671 inline TUint PowerClass() const; |
|
1672 |
|
1673 /** returns the contents of the HS_TIMING field */ |
|
1674 inline TUint HighSpeedTiming() const; |
|
1675 |
|
1676 /** returns the contents of the BUS_WIDTH field */ |
|
1677 inline TUint BusWidthMode() const; |
|
1678 |
|
1679 /** returns the contents of the BOOT_CONFIG field */ |
|
1680 inline TUint BootConfig() const; |
|
1681 |
|
1682 /** returns the contents of the BOOT_BUS_WIDTH field */ |
|
1683 inline TUint BootBusWidth() const; |
|
1684 |
|
1685 /** returns the contents of the ERASE_GROUP_DEF field */ |
|
1686 inline TUint EraseGroupDef() const; |
|
1687 |
|
1688 /** returns the contents of the ACC_SIZE field */ |
|
1689 inline TUint AccessSize() const; |
|
1690 |
|
1691 /** returns the contents of the HC_ERASE_GRP_SIZE field */ |
|
1692 inline TUint HighCapacityEraseGroupSize() const; |
|
1693 |
|
1694 /** returns the contents of the BOOT_INFO field */ |
|
1695 inline TUint BootInfo() const; |
|
1696 |
|
1697 /** returns the contents of the BOOT_SIZE_MUTLI field */ |
|
1698 inline TUint BootSizeMultiple() const; |
|
1699 |
|
1700 /** returns the contents of the ERASE_TIMEOUT_MULT field */ |
|
1701 inline TUint EraseTimeoutMultiple() const; |
|
1702 |
|
1703 /** returns the contents of the REL_WR_SEC_C field */ |
|
1704 inline TUint ReliableWriteSector() const; |
|
1705 |
|
1706 /** returns the contents of the HC_WP_GRP_SIZE field */ |
|
1707 inline TUint HighCapacityWriteProtectGroupSize() const; |
|
1708 |
|
1709 /** returns the contents of the S_C_VCC field */ |
|
1710 inline TUint SleepCurrentVcc() const; |
|
1711 |
|
1712 /** returns the contents of the S_C_VCCQ field */ |
|
1713 inline TUint SleepCurrentVccQ() const; |
|
1714 |
|
1715 /** returns the contents of the S_A_TIMEOUT field */ |
|
1716 inline TUint SleepAwakeTimeout() const; |
|
1717 |
|
1718 private: |
|
1719 /** |
|
1720 @internalComponent little endian 512 byte field representing extended CSD |
|
1721 */ |
|
1722 TUint8 iData[KMMCExtendedCSDLength]; |
|
1723 }; |
|
1724 |
|
1725 |
|
1726 // 32 bit MMC card status field (response R1) |
|
1727 |
|
1728 const TUint32 KMMCStatAppCmd= KBit5; |
|
1729 const TUint32 KMMCStatSwitchError= KBit7; |
|
1730 const TUint32 KMMCStatReadyForData= KBit8; |
|
1731 const TUint32 KMMCStatCurrentStateMask= (KBit13-KBit9); |
|
1732 const TUint32 KMMCStatEraseReset= KBit13; |
|
1733 const TUint32 KMMCStatCardECCDisabled= KBit14; |
|
1734 const TUint32 KMMCStatWPEraseSkip= KBit15; |
|
1735 const TUint32 KMMCStatErrCSDOverwrite= KBit16; |
|
1736 const TUint32 KMMCStatErrOverrun= KBit17; |
|
1737 const TUint32 KMMCStatErrUnderrun= KBit18; |
|
1738 const TUint32 KMMCStatErrUnknown= KBit19; |
|
1739 const TUint32 KMMCStatErrCCError= KBit20; |
|
1740 const TUint32 KMMCStatErrCardECCFailed= KBit21; |
|
1741 const TUint32 KMMCStatErrIllegalCommand=KBit22; |
|
1742 const TUint32 KMMCStatErrComCRCError= KBit23; |
|
1743 const TUint32 KMMCStatErrLockUnlock= KBit24; |
|
1744 const TUint32 KMMCStatCardIsLocked= KBit25; |
|
1745 const TUint32 KMMCStatErrWPViolation= KBit26; |
|
1746 const TUint32 KMMCStatErrEraseParam= KBit27; |
|
1747 const TUint32 KMMCStatErrEraseSeqError= KBit28; |
|
1748 const TUint32 KMMCStatErrBlockLenError= KBit29; |
|
1749 const TUint32 KMMCStatErrAddressError= KBit30; |
|
1750 const TUint32 KMMCStatErrOutOfRange= KBit31; |
|
1751 |
|
1752 const TUint32 KMMCStatErrorMask= KMMCStatErrOutOfRange | |
|
1753 KMMCStatErrAddressError | |
|
1754 KMMCStatErrBlockLenError| |
|
1755 KMMCStatErrEraseSeqError| |
|
1756 KMMCStatErrEraseParam | |
|
1757 KMMCStatErrWPViolation | |
|
1758 KMMCStatErrLockUnlock | |
|
1759 KMMCStatErrCardECCFailed| |
|
1760 KMMCStatErrCCError | |
|
1761 KMMCStatErrUnknown | |
|
1762 KMMCStatErrUnderrun | |
|
1763 KMMCStatErrOverrun | |
|
1764 KMMCStatErrCSDOverwrite; |
|
1765 |
|
1766 |
|
1767 const TUint32 KMMCStatClearByReadMask= KMMCStatErrOutOfRange | |
|
1768 KMMCStatErrAddressError | |
|
1769 KMMCStatErrBlockLenError| |
|
1770 KMMCStatErrEraseSeqError| |
|
1771 KMMCStatErrEraseParam | |
|
1772 KMMCStatErrWPViolation | |
|
1773 KMMCStatErrLockUnlock | |
|
1774 KMMCStatErrCardECCFailed| |
|
1775 KMMCStatErrCCError | |
|
1776 KMMCStatErrUnknown | |
|
1777 KMMCStatErrUnderrun | |
|
1778 KMMCStatErrOverrun | |
|
1779 KMMCStatErrCSDOverwrite | |
|
1780 KMMCStatWPEraseSkip | |
|
1781 KMMCStatEraseReset | |
|
1782 KMMCStatAppCmd; |
|
1783 |
|
1784 enum TMMCardStateEnum |
|
1785 { |
|
1786 ECardStateIdle = 0, |
|
1787 ECardStateReady = (1 << 9), |
|
1788 ECardStateIdent = (2 << 9), |
|
1789 ECardStateStby = (3 << 9), |
|
1790 ECardStateTran = (4 << 9), |
|
1791 ECardStateData = (5 << 9), |
|
1792 ECardStateRcv = (6 << 9), |
|
1793 ECardStatePrg = (7 << 9), |
|
1794 ECardStateDis = (8 << 9), |
|
1795 ECardStateBtst = (9 << 9), |
|
1796 ECardStateSlp = (10 << 9) |
|
1797 }; |
|
1798 |
|
1799 class TMMCStatus |
|
1800 /** |
|
1801 MMC Status class. |
|
1802 This class can be used to get the MMC card state machine and response status. |
|
1803 For the details of MMC card state machine and command response refer to MMC card specification. |
|
1804 |
|
1805 @see DMMCStack |
|
1806 @publishedPartner |
|
1807 @released |
|
1808 */ |
|
1809 { |
|
1810 public: |
|
1811 /** |
|
1812 * Default constructor. |
|
1813 */ |
|
1814 inline TMMCStatus() {} |
|
1815 inline TMMCStatus(const TUint8*); |
|
1816 inline TMMCStatus(const TUint32&); |
|
1817 inline operator TUint32() const; |
|
1818 inline TUint32 Error() const; |
|
1819 inline TMMCardStateEnum State() const; |
|
1820 inline void UpdateState(TMMCardStateEnum aState); |
|
1821 private: |
|
1822 TUint32 iData; // 32 bit bitfield representing status register |
|
1823 }; |
|
1824 |
|
1825 |
|
1826 |
|
1827 const TUint32 KMMCOCRBusy = KBit31; // OCR Busy Bit (Response R3) |
|
1828 const TUint32 KMMCOCRAccessModeHCS = KBit30; // OCR Access Mode + SD HCS Bit (Response R3) |
|
1829 const TUint32 KMMCOCRLowVoltage = KBit7; // 1.65 - 1.95 volt support |
|
1830 const TUint32 KMMCOCRAccessModeMask = KBit30 | KBit29; // OCR Access Mode : [00 : Byte], [10 : Block] |
|
1831 |
|
1832 |
|
1833 |
|
1834 /** |
|
1835 Defines the bit value that can be used in TPBusPsuInfo::iVoltageSupported |
|
1836 to indicate that the MultiMediaCard PSU supports voltage adjustment. |
|
1837 |
|
1838 @publishedPartner |
|
1839 @released |
|
1840 */ |
|
1841 #define KMMCAdjustableOpVoltage KMMCOCRBusy // Use same bit to flag ASSP PSU supports voltage adjustment. |
|
1842 |
|
1843 |
|
1844 class TMMCArgument |
|
1845 /** |
|
1846 MMC Argument class |
|
1847 |
|
1848 @publishedPartner |
|
1849 @released |
|
1850 */ |
|
1851 { |
|
1852 public: |
|
1853 inline TMMCArgument(); |
|
1854 inline TMMCArgument(const TUint32&); |
|
1855 inline TMMCArgument(TRCA); |
|
1856 inline TMMCArgument(TDSR); |
|
1857 inline operator TUint32() const; |
|
1858 inline void SetRCA(TRCA); |
|
1859 private: |
|
1860 TUint32 iData; // 32 bit bitfield representing the argument |
|
1861 }; |
|
1862 |
|
1863 |
|
1864 class TRCA |
|
1865 /** |
|
1866 MMC RCA (Relative Card Address) class |
|
1867 */ |
|
1868 { |
|
1869 public: |
|
1870 inline TRCA() {} |
|
1871 inline TRCA(TUint16); |
|
1872 inline TRCA(TInt); |
|
1873 inline TRCA(TMMCArgument); |
|
1874 inline operator TUint16() const; |
|
1875 private: |
|
1876 TUint16 iData; // 16 bit bitfield representing MultiMedia Card's RCA |
|
1877 }; |
|
1878 |
|
1879 |
|
1880 class TDSR |
|
1881 /** |
|
1882 MMC DSR (Driver Stage Register) class |
|
1883 */ |
|
1884 { |
|
1885 public: |
|
1886 inline TDSR(); |
|
1887 inline TDSR(TUint16); |
|
1888 inline operator TUint16() const; |
|
1889 private: |
|
1890 TUint16 iData; // 16 bit bitfield representing MultiMedia Card's DSR |
|
1891 }; |
|
1892 |
|
1893 |
|
1894 // Card specific information and context |
|
1895 |
|
1896 /** |
|
1897 @publishedPartner |
|
1898 @released |
|
1899 */ |
|
1900 const TUint32 KMMCardHasPassword= KBit0; |
|
1901 |
|
1902 /** |
|
1903 @publishedPartner |
|
1904 @released |
|
1905 */ |
|
1906 const TUint32 KMMCardIsWriteProtected= KBit1; |
|
1907 |
|
1908 /** |
|
1909 @publishedPartner |
|
1910 @released |
|
1911 */ |
|
1912 const TUint32 KMMCardIsLockable= KBit2; |
|
1913 const TUint32 KMMCardIsHighCapacity= KBit3; |
|
1914 const TUint32 KMMCardIsHighSpeed= KBit4; |
|
1915 |
|
1916 const TUint32 KMMCardMMCFlagMask= 0x0000ffff; |
|
1917 |
|
1918 const TUint32 KMMCardFirstCustomFlag= KBit16; |
|
1919 const TUint32 KMMCardCustomFlagMask= 0xffff0000; |
|
1920 |
|
1921 const TUint32 KMMCardHighCapBlockSize= 512; |
|
1922 const TUint32 KMMCardHighCapBlockSizeLog2= 9; |
|
1923 |
|
1924 NONSHARABLE_CLASS(TMMCard) |
|
1925 /** |
|
1926 MMC card class |
|
1927 */ |
|
1928 { |
|
1929 public: |
|
1930 inline TBool IsHighCapacity() const; |
|
1931 |
|
1932 /** @publishedPartner |
|
1933 @released */ |
|
1934 TMMCard(); |
|
1935 |
|
1936 /** @publishedPartner |
|
1937 @released */ |
|
1938 inline TBool IsPresent() const; |
|
1939 |
|
1940 /** @publishedPartner |
|
1941 @released */ |
|
1942 IMPORT_C TBool IsReady() const; |
|
1943 |
|
1944 /** @publishedPartner |
|
1945 @released */ |
|
1946 IMPORT_C TBool IsLocked() const; |
|
1947 |
|
1948 /** @publishedPartner |
|
1949 @released */ |
|
1950 inline TMMCMediaTypeEnum MediaType() const; |
|
1951 |
|
1952 /** @publishedPartner |
|
1953 @released */ |
|
1954 inline TUint DeviceSize() const; |
|
1955 |
|
1956 /** @publishedPartner |
|
1957 @released */ |
|
1958 inline const TCID& CID() const; |
|
1959 |
|
1960 /** @publishedPartner |
|
1961 @released */ |
|
1962 inline const TCSD& CSD() const; |
|
1963 |
|
1964 /** @publishedPartner |
|
1965 @released */ |
|
1966 inline const TExtendedCSD& ExtendedCSD() const; |
|
1967 |
|
1968 /** @publishedPartner |
|
1969 @released */ |
|
1970 inline TRCA RCA() const; |
|
1971 |
|
1972 /** @publishedPartner |
|
1973 @released */ |
|
1974 inline TBool HasPassword() const; |
|
1975 |
|
1976 /** @publishedPartner |
|
1977 @released */ |
|
1978 inline TBool IsWriteProtected() const; // Always EFalse in MMC build |
|
1979 |
|
1980 /** @publishedPartner |
|
1981 @released */ |
|
1982 inline TInt BusWidth() const; |
|
1983 |
|
1984 /** @publishedPartner |
|
1985 @released */ |
|
1986 inline void SetBusWidth(TInt aBusWidth); |
|
1987 |
|
1988 /** @internalTechnology */ |
|
1989 inline void SetHighSpeedClock(TUint32 aHighSpeedClock); |
|
1990 |
|
1991 /** @internalTechnology */ |
|
1992 inline TUint32 HighSpeedClock() const; |
|
1993 |
|
1994 /** @publishedPartner |
|
1995 @released */ |
|
1996 virtual TUint32 PreferredWriteGroupLength() const; |
|
1997 |
|
1998 /** @publishedPartner |
|
1999 @released */ |
|
2000 virtual TInt GetFormatInfo(TLDFormatInfo& aFormatInfo) const; |
|
2001 |
|
2002 /** @publishedPartner |
|
2003 @released */ |
|
2004 virtual TUint32 MinEraseSectorSize() const; |
|
2005 |
|
2006 /** @publishedPartner |
|
2007 @released */ |
|
2008 virtual TUint32 EraseSectorSize() const; |
|
2009 |
|
2010 virtual TUint MaxTranSpeedInKilohertz() const; |
|
2011 |
|
2012 virtual TInt GetEraseInfo(TMMCEraseInfo& anEraseInfo) const; |
|
2013 |
|
2014 /** @publishedPartner |
|
2015 @released |
|
2016 |
|
2017 Returns the maximum block length supported by the card encoded as a logarithm. |
|
2018 This may be less than the READ_BL_LEN field in the CSD |
|
2019 register depending on the type of card and it's capacity. |
|
2020 */ |
|
2021 virtual TInt MaxReadBlLen() const; |
|
2022 |
|
2023 /** @publishedPartner |
|
2024 @released |
|
2025 |
|
2026 Returns the maximum write block length supported by the card encoded as a logarithm. |
|
2027 This may be less than the WRITE_BL_LEN field in the CSD |
|
2028 register depending on the type of card and it's capacity. |
|
2029 */ |
|
2030 virtual TInt MaxWriteBlLen() const; |
|
2031 |
|
2032 /** @publishedPartner |
|
2033 @released */ |
|
2034 virtual TInt64 DeviceSize64() const; |
|
2035 |
|
2036 private: |
|
2037 inline TInt Number() const; |
|
2038 public: |
|
2039 TInt iIndex; |
|
2040 TMMCStatus iStatus; // last card's status |
|
2041 TUint32 iSetBlockLen; // current block length set for the card |
|
2042 TMMCCommandEnum iLastCommand; // Last Command code issued for the card |
|
2043 TCID iCID; |
|
2044 TCSD iCSD; |
|
2045 TRCA iRCA; |
|
2046 DMMCSession* iUsingSessionP; // session which has this card attached |
|
2047 TUint32 iFlags; |
|
2048 TExtendedCSD iExtendedCSD; |
|
2049 private: |
|
2050 TUint32 iHighSpeedClock; |
|
2051 TInt iSpare[4]; |
|
2052 TInt iBusWidth; |
|
2053 friend class DMMCStack; |
|
2054 friend class TMMCardArray; |
|
2055 }; |
|
2056 |
|
2057 class TMMCardArray |
|
2058 /** |
|
2059 MMC card array class |
|
2060 */ |
|
2061 { |
|
2062 public: |
|
2063 inline TMMCardArray(DMMCStack* anOwningStack); |
|
2064 |
|
2065 /** @publishedPartner |
|
2066 @released */ |
|
2067 IMPORT_C virtual TInt AllocCards(); |
|
2068 |
|
2069 void InitNewCardScan(); |
|
2070 |
|
2071 /** @publishedPartner |
|
2072 @released */ |
|
2073 IMPORT_C void AddNewCard(const TUint8* aCID,TRCA* aNewRCA); |
|
2074 |
|
2075 inline TUint NewCardCount(); |
|
2076 inline TInt CardsPresent(); |
|
2077 inline TMMCard* NewCardP(TUint aNewCardNumber); |
|
2078 inline TMMCard* CardP(TUint aCardNumber); |
|
2079 inline TMMCard& Card(TUint aCardNumber); |
|
2080 inline TMMCard& NewCard(TUint aCardNumber); |
|
2081 TInt MergeCards(TBool aFirstPass); |
|
2082 void UpdateAcquisitions(TUint* aMaxClock); |
|
2083 |
|
2084 /** @internalTechnology */ |
|
2085 TInt CardIndex(const TMMCard* aCard); |
|
2086 |
|
2087 /** @publishedPartner |
|
2088 @released */ |
|
2089 IMPORT_C virtual void DeclareCardAsGone(TUint aCardNumber); |
|
2090 |
|
2091 protected: // initialized by AllocCards() |
|
2092 void MoveCardAndLockRCA(TMMCard& aSrc,TMMCard& aDest,TInt aDestIndex); |
|
2093 DMMCStack* iOwningStack; |
|
2094 TInt iCardsPresent; |
|
2095 TUint iNewCardsCount; |
|
2096 TMMCard* iCards[KMaxMMCardsPerStack]; |
|
2097 TMMCard* iNewCards[KMaxMMCardsPerStack]; |
|
2098 }; |
|
2099 |
|
2100 // MMC Command descriptor |
|
2101 |
|
2102 const TUint32 KMMCCmdFlagBytesValid= KBit0; // iBytesDone has a valid data |
|
2103 const TUint32 KMMCCmdFlagTransStopped= KBit1; // CMD12 has been successfully issued |
|
2104 const TUint32 KMMCCmdFlagStatusReceived=KBit2; // Raised by ASSP layer, cleared by ExecCommandSM() |
|
2105 const TUint32 KMMCCmdFlagExecTopBusy= KBit3; // ExecCommandSM() flag |
|
2106 const TUint32 KMMCCmdFlagExecSelBusy= KBit4; // ExecCommandSM() flag |
|
2107 const TUint32 KMMCCmdFlagBlockAddress= KBit5; // Block addressing mode |
|
2108 const TUint32 KMMCCmdFlagDMARamValid= KBit6; // Memory is DMA'able flag |
|
2109 const TUint32 KMMCCmdFlagDoubleBuffer= KBit7; // The current DT command is double-buffered |
|
2110 const TUint32 KMMCCmdFlagPhysAddr= KBit8; // Address is a physical address |
|
2111 const TUint32 KMMCCmdFlagReliableWrite= KBit9; // Current command is Reliable Write |
|
2112 |
|
2113 const TUint32 KMMCCmdFlagASSPFlags= KMMCCmdFlagBytesValid | |
|
2114 KMMCCmdFlagTransStopped | |
|
2115 KMMCCmdFlagStatusReceived; |
|
2116 |
|
2117 |
|
2118 |
|
2119 |
|
2120 /** |
|
2121 The MultiMediaCard command specification. |
|
2122 |
|
2123 @publishedPartner |
|
2124 @released |
|
2125 */ |
|
2126 class TMMCCommandSpec |
|
2127 { |
|
2128 public: |
|
2129 /** |
|
2130 The command class as defined by the MultiMediaCard System Specification. |
|
2131 */ |
|
2132 TUint32 iCommandClass; |
|
2133 |
|
2134 /** |
|
2135 The command type as defined by the MultiMediaCard System Specification. |
|
2136 */ |
|
2137 TMMCCommandTypeEnum iCommandType; |
|
2138 |
|
2139 /** |
|
2140 The data transfer direction. |
|
2141 */ |
|
2142 TMMCCmdDirEnum iDirection; |
|
2143 |
|
2144 /** |
|
2145 ETrue indicates more than one data block is to be tranferred. |
|
2146 */ |
|
2147 TBool iMultipleBlocks; |
|
2148 |
|
2149 /** |
|
2150 ETrue indicates use standard stop transmission mode. |
|
2151 */ |
|
2152 TBool iUseStopTransmission; // CMD12 has to be used in the end |
|
2153 |
|
2154 /** |
|
2155 The expected response type. |
|
2156 |
|
2157 Note: |
|
2158 |
|
2159 - if this is EResponseTypeNone, then no response is expected. |
|
2160 - if this is ERespTypeR2, then a long (128-bit) response is expected. |
|
2161 - for all other types, a standard (32-bit) response is expected. |
|
2162 */ |
|
2163 TMMCResponseTypeEnum iResponseType; |
|
2164 |
|
2165 /** |
|
2166 Expected response length (currently 4 or 16 bytes). |
|
2167 */ |
|
2168 TUint iResponseLength; |
|
2169 }; |
|
2170 |
|
2171 class TMMCIdxCommandSpec |
|
2172 /** |
|
2173 MMC Index command spec class |
|
2174 */ |
|
2175 { |
|
2176 public: |
|
2177 TInt iIdx; |
|
2178 TMMCCommandSpec iSpec; |
|
2179 }; |
|
2180 |
|
2181 |
|
2182 |
|
2183 |
|
2184 /** |
|
2185 MMC command description. |
|
2186 |
|
2187 When issuing an individual command over the bus, the MultiMediaCard |
|
2188 controller uses an object of this type to specify the parameters |
|
2189 for the command, and to receive back any response. |
|
2190 |
|
2191 Commands are issued by passing an object of this type to |
|
2192 the DMMCStack::IssueMMCCommandSM() function, which is implemented by |
|
2193 the platform specific layer. |
|
2194 |
|
2195 @publishedPartner |
|
2196 @released |
|
2197 */ |
|
2198 class TMMCCommandDesc |
|
2199 { |
|
2200 public: |
|
2201 IMPORT_C TInt Direction() const; // returns -1/0/+1 for read/none/write |
|
2202 |
|
2203 inline TBool IsBlockCmd() const; |
|
2204 inline TUint32 NumBlocks() const; |
|
2205 inline TInt64 Arg64() const; |
|
2206 inline TBool IsDoubleBuffered() const; |
|
2207 inline TUint32 BufferLength() const; |
|
2208 inline TUint32 BlockLength() const; |
|
2209 inline TBool IsPhysicalAddress() const; |
|
2210 TBool AdjustForBlockOrByteAccess(const DMMCSession& aSession); |
|
2211 |
|
2212 void Dump(TUint8* aResponseP, TMMCErr aErr); |
|
2213 |
|
2214 public: |
|
2215 /** |
|
2216 @internalComponent |
|
2217 */ |
|
2218 TUint32 iFlags; |
|
2219 |
|
2220 /** |
|
2221 The command code. |
|
2222 |
|
2223 This can be written directly to the MMC controller hardware. |
|
2224 */ |
|
2225 TMMCCommandEnum iCommand; |
|
2226 |
|
2227 /** |
|
2228 The argument to be supplied with the command. |
|
2229 |
|
2230 This can be written directly to the MMC controller hardware. |
|
2231 */ |
|
2232 TMMCArgument iArgument; |
|
2233 |
|
2234 /** |
|
2235 The total length of the data to be tranferred. |
|
2236 */ |
|
2237 TUint32 iTotalLength; |
|
2238 |
|
2239 /** |
|
2240 A pointer to the location from where the data is to be read, or written. |
|
2241 */ |
|
2242 TUint8* iDataMemoryP; |
|
2243 |
|
2244 /** |
|
2245 The block length to be used in a data transaction. |
|
2246 */ |
|
2247 TUint32 iBlockLength; |
|
2248 |
|
2249 /** |
|
2250 The MultiMediaCard command specification. |
|
2251 */ |
|
2252 TMMCCommandSpec iSpec; |
|
2253 |
|
2254 /** |
|
2255 The number of bytes transferred since the last time the card was selected. |
|
2256 */ |
|
2257 TUint32 iBytesDone; |
|
2258 |
|
2259 /** |
|
2260 @internalComponent |
|
2261 */ |
|
2262 TUint iPollAttempts; // Retry counters |
|
2263 |
|
2264 /** |
|
2265 @internalComponent |
|
2266 */ |
|
2267 TUint iTimeOutRetries; |
|
2268 |
|
2269 /** |
|
2270 @internalComponent |
|
2271 */ |
|
2272 TUint iCRCRetries; |
|
2273 |
|
2274 /** |
|
2275 @internalComponent |
|
2276 */ |
|
2277 TUint16 iUnlockRetries; |
|
2278 |
|
2279 /** |
|
2280 @internalComponent |
|
2281 */ |
|
2282 TUint16 iOpCondBusyTimeout; // Units of 10mS |
|
2283 |
|
2284 /** |
|
2285 @internalComponent |
|
2286 */ |
|
2287 TUint iCustomRetries; |
|
2288 |
|
2289 /** |
|
2290 @internalComponent |
|
2291 */ |
|
2292 TUint32 iExecNotHandle; // error codes to not handle in ExecCommandSM() |
|
2293 |
|
2294 /** |
|
2295 The area into which the command response is put. |
|
2296 |
|
2297 This is in big-endian format. |
|
2298 */ |
|
2299 TUint8 iResponse[KMMCMaxResponseLength]; |
|
2300 }; |
|
2301 |
|
2302 |
|
2303 |
|
2304 |
|
2305 /** |
|
2306 MMC bus configuration. |
|
2307 |
|
2308 An object of this type is passed to the Variant implementation |
|
2309 of DMMCStack::SetBusConfigDefaults(), which should fill the public data |
|
2310 members with appropriate information and values. |
|
2311 |
|
2312 @publishedPartner |
|
2313 @released |
|
2314 */ |
|
2315 class TMMCBusConfig |
|
2316 { |
|
2317 public: |
|
2318 /** |
|
2319 The hardware interface clock, in KHz. |
|
2320 */ |
|
2321 TUint iBusClock; |
|
2322 |
|
2323 |
|
2324 /** |
|
2325 The bus clock when clocking in data, in KHz. |
|
2326 */ |
|
2327 TUint iClockIn; |
|
2328 |
|
2329 |
|
2330 /** |
|
2331 The bus clock when clocking out data, in KHz. |
|
2332 */ |
|
2333 TUint iClockOut; |
|
2334 |
|
2335 |
|
2336 /** |
|
2337 The response timeout value, in uS. |
|
2338 */ |
|
2339 TUint iResponseTimeOut; |
|
2340 |
|
2341 |
|
2342 /** |
|
2343 The data timeout value, in uS. |
|
2344 */ |
|
2345 TUint iDataTimeOut; |
|
2346 |
|
2347 |
|
2348 /** |
|
2349 The busy timeout value, in uS. |
|
2350 */ |
|
2351 TUint iBusyTimeOut; |
|
2352 }; |
|
2353 |
|
2354 |
|
2355 class TMMCStackConfig |
|
2356 /** |
|
2357 @publishedPartner |
|
2358 @released |
|
2359 |
|
2360 Holds the stack configuration settings on behalf of a session. |
|
2361 |
|
2362 Each DMMCSession object contains the public member DMMCSession::iConfig - an instance of the TMMCStackConfig class. |
|
2363 By changing these settings, the client can override the master (i.e. default) stack configuration settings. |
|
2364 |
|
2365 However, these changes only remain in effect for the period that the session remains the current session. |
|
2366 In this way, the client is able to change the settings employed by the Controller (e.g. bus clock, enable retries, |
|
2367 change time-out values, restore defaults etc) while it performs that client's request. |
|
2368 |
|
2369 The client would generally set-up the stack configuration it requires prior to submitting the session. |
|
2370 */ |
|
2371 { |
|
2372 public: |
|
2373 inline TMMCStackConfig(); |
|
2374 inline void SetMode(TUint32 aMask); |
|
2375 inline void RemoveMode(TUint32 aMask); |
|
2376 inline void UseDefault(TUint32 aMask); |
|
2377 inline void SetPollAttempts(TUint aData); |
|
2378 inline void SetTimeOutRetries(TUint aData); |
|
2379 inline void SetCRCRetries(TUint aData); |
|
2380 inline void SetBusClockInKhz(TUint aParam); // In kilohertz |
|
2381 inline void SetTicksClockIn(TUint aParam); // Number of clock ticks in ClockIn phase |
|
2382 inline void SetTicksClockOut(TUint aParam); // Number of clock ticks in ClockOut phase |
|
2383 inline void SetResponseTimeOutInTicks(TUint aParam); // Timeout in bus clock ticks |
|
2384 inline void SetDataTimeOutInMcs(TUint aParam); // in microseconds |
|
2385 inline void SetBusyTimeOutInMcs(TUint aParam); // in microseconds |
|
2386 inline void SetOpCondBusyTimeout(TUint16 aData); // Units of 10mS |
|
2387 inline TInt OpCondBusyTimeout(); |
|
2388 TUint iPollAttempts; |
|
2389 private: |
|
2390 TUint32 iModes; |
|
2391 TUint32 iUpdateMask; |
|
2392 TUint32 iClientMask; |
|
2393 TUint iTimeOutRetries; |
|
2394 TUint iCRCRetries; |
|
2395 TUint16 iUnlockRetries; |
|
2396 TUint16 iOpCondBusyTimeout; // Units of 10mS |
|
2397 TMMCBusConfig iBusConfig; |
|
2398 friend class DMMCStack; |
|
2399 }; |
|
2400 |
|
2401 |
|
2402 class TMMCRCAPool |
|
2403 /** |
|
2404 MMC RCA Pool |
|
2405 */ |
|
2406 { |
|
2407 public: |
|
2408 inline TMMCRCAPool(); |
|
2409 TRCA GetFreeRCA(); |
|
2410 inline void LockRCA(TRCA); |
|
2411 inline void UnlockRCA(TRCA); |
|
2412 inline void ReleaseUnlocked(); |
|
2413 private: |
|
2414 TUint32 iPool; |
|
2415 TUint32 iLocked; |
|
2416 }; |
|
2417 |
|
2418 |
|
2419 class TMMCSessRing |
|
2420 /** |
|
2421 MMC session ring |
|
2422 */ |
|
2423 { |
|
2424 public: |
|
2425 TMMCSessRing(); |
|
2426 inline TBool IsEmpty() const; |
|
2427 void Erase(); |
|
2428 inline void SetMarker(); // Sets Marker into Point position |
|
2429 inline void AdvanceMarker(); // Moves Marker one position forward |
|
2430 inline void Point(); // Sets Point into Marker position |
|
2431 TBool Point(DMMCSession* aSessP); // Finds aSessP and sets Point to it |
|
2432 void Add(DMMCSession* aSessP); // Inserts aSessP before the Marker; Point moves to Marker |
|
2433 void Add(TMMCSessRing& aRing); |
|
2434 DMMCSession* Remove(); // Removes at Point; Point moves forward |
|
2435 void Remove(DMMCSession* aSessP); // Points aSessP first, then remove() |
|
2436 inline TUint Size() const; |
|
2437 inline operator DMMCSession*() const; |
|
2438 DMMCSession* operator++(TInt); // returns Point and moves it forward; stops at Marker |
|
2439 private: |
|
2440 DMMCSession* iPMark; |
|
2441 DMMCSession* iPoint; |
|
2442 DMMCSession* iPrevP; |
|
2443 TUint iSize; |
|
2444 }; |
|
2445 |
|
2446 |
|
2447 // |
|
2448 // DMMCStack State Machine Functions are supported by TMMCStateMachine class |
|
2449 // |
|
2450 // The structure of state machine functions is assumed to be as follows |
|
2451 // |
|
2452 // TMMCErr DMMCStack::FunctionNameSMST( TAny* aPtr ) |
|
2453 // { return( STATIC_CAST(DMMCStack*,aPtr)->FunctionNameSM() ); } |
|
2454 // |
|
2455 // TMMCErr DMMCStack::FunctionNameSM() |
|
2456 // { |
|
2457 // enum states {EStBegin=0, ..., EStEnd }; |
|
2458 // DMMCSession& s = Session(); |
|
2459 // TMMCStateMachine& m = Machine(); |
|
2460 // const TMMCErr err = m.SetExitCode( 0 ); |
|
2461 // |
|
2462 // for(;;) |
|
2463 // { |
|
2464 // switch(m.State()) |
|
2465 // { |
|
2466 // case EStBegin: |
|
2467 // { |
|
2468 // .... |
|
2469 // } |
|
2470 // case EStNext: |
|
2471 // { |
|
2472 // ..... |
|
2473 // } |
|
2474 // case EStEnd: break; |
|
2475 // default: Panic(...); |
|
2476 // } |
|
2477 // break; |
|
2478 // } |
|
2479 // return(m.Pop()); |
|
2480 // } |
|
2481 // |
|
2482 // State Machine remembers the next state number and function name and goes there as soon |
|
2483 // as the control is returned to the session. To release the control and wait for the next |
|
2484 // re-entrance (which will happen immediately if the session is not blocked or, as soon as |
|
2485 // an asynchronous event removes the blocking condition), a state machine function has to |
|
2486 // return( 0 ); Returning non-zero exit code will result in the session being completed with |
|
2487 // that error code unless a caller state machine function has explicitly intercepted such |
|
2488 // an error with m.SetTraps( TMMCErr aMask ). |
|
2489 // |
|
2490 // To make a state machine function code more readable, the following macros are provided: |
|
2491 // |
|
2492 // SMF_NEXTS(nexts) - set the next state to "nexts" |
|
2493 // SMF_CALL(func) - invoke SM function "func", then go to the next state |
|
2494 // SMF_CALLWAIT(func) - the same as above, but sleep at the entry point |
|
2495 // SMF_CALLMYS(nexts,retst) - invoke current SM function at "nexts" entry point |
|
2496 // SMF_CALLMEWR(retst) - invoke me right here with return state retst |
|
2497 // SMF_INVOKES(func,nexts) - invoke SM function "func", then go to the state "nexts" |
|
2498 // SMF_INVOKEWAITS(func,nexts) - the same as above, but sleep at the entry point |
|
2499 // SMF_WAIT - sleep at the next state |
|
2500 // SMF_WAITS(nexts) - set next state to "nexts", then sleep |
|
2501 // SMF_RETURN(value) - return an error to the caller SM function |
|
2502 // SMF_EXIT - return to the caller SM function |
|
2503 // SMF_EXITWAIT - the same as above, but sleep at the exit point |
|
2504 // SMF_JUMP(func) - transfer the control to SM function "func" |
|
2505 // SMF_JUMPWAIT(func) - the same as above, but sleep at the entry point |
|
2506 // SMF_GOTONEXTS - goto the next state |
|
2507 // SMF_GOTOS(nexts) - set the next state to "nexts", then go to it |
|
2508 // SMF_STATE(sname) - declare the state name "sname" |
|
2509 // SMF_BPOINT(sname) - declare the state "sname" and sleep here if blocked statically |
|
2510 // |
|
2511 |
|
2512 /** |
|
2513 @publishedPartner |
|
2514 @released |
|
2515 |
|
2516 Declares the start of a state machine case switch statement. |
|
2517 |
|
2518 The macro assumes that the first state defined by the state machine |
|
2519 function is EStBegin. |
|
2520 |
|
2521 NOTES: |
|
2522 |
|
2523 - the code generates an opening curly brace that must be matched by |
|
2524 a closing curly brace. Typically, this is provided by the SMF_STATE or |
|
2525 the SMF_END macros. |
|
2526 |
|
2527 @see SMF_STATE |
|
2528 @see SMF_END |
|
2529 */ |
|
2530 #define SMF_BEGIN TMMCStateMachine& m=Machine();const TMMCErr err=m.SetExitCode(0);\ |
|
2531 for(;;){switch(m.State()){case EStBegin:{if(err) (void)0; |
|
2532 |
|
2533 /** |
|
2534 @publishedPartner |
|
2535 @released |
|
2536 |
|
2537 Declares the end of a state machine case switch statement. |
|
2538 |
|
2539 The macro assumes that the last state defined by the state machine |
|
2540 function is EStEnd. |
|
2541 |
|
2542 NOTES: |
|
2543 |
|
2544 - the code generated assumes that there are earlier calls to SMF_BEGIN, |
|
2545 and zero or more calls to SMF_STATE. |
|
2546 |
|
2547 @see SMF_BEGIN |
|
2548 @see SMF_STATE |
|
2549 */ |
|
2550 #define SMF_END }case EStEnd:break;default:DMMCSocket::Panic(DMMCSocket::EMMCMachineState);}break;}\ |
|
2551 return(m.Pop()); |
|
2552 |
|
2553 |
|
2554 /** |
|
2555 @publishedPartner |
|
2556 @released |
|
2557 |
|
2558 Sets the next state when the current state machine |
|
2559 function is re-entered. |
|
2560 |
|
2561 @param nexts The next state to be entered in the current state machine. |
|
2562 */ |
|
2563 #define SMF_NEXTS(nexts) m.SetState(nexts); |
|
2564 |
|
2565 |
|
2566 /** |
|
2567 @publishedPartner |
|
2568 @released |
|
2569 |
|
2570 Pushes a state machine entry onto the stack, specifying the child state machine |
|
2571 function to be invoked. |
|
2572 |
|
2573 The child function will be entered at state 0 (EStBegin), when the state machine |
|
2574 is next dispatched. |
|
2575 |
|
2576 Control returns from this state machine function after completion of |
|
2577 all functions coded by this macro. |
|
2578 |
|
2579 @param func The child state machine function to be invoked. |
|
2580 */ |
|
2581 #define SMF_CALL(func) return(m.Push(func)); |
|
2582 |
|
2583 |
|
2584 /** |
|
2585 @publishedPartner |
|
2586 @released |
|
2587 |
|
2588 Pushes a state machine entry onto the stack, specifying the child state machine |
|
2589 function to be invoked. |
|
2590 |
|
2591 The state machine is blocked before entry to the child function, but when |
|
2592 it becomes unblocked, the child function will be entered at state 0 (EStBegin) |
|
2593 when the state machine is next dispatched. |
|
2594 |
|
2595 Control returns from this state machine function after completion of |
|
2596 all functions coded by this macro. |
|
2597 |
|
2598 @param func The child state machine function to be invoked. |
|
2599 */ |
|
2600 #define SMF_CALLWAIT(func) return(m.Push(func,ETrue)); |
|
2601 |
|
2602 |
|
2603 /** |
|
2604 @publishedPartner |
|
2605 @released |
|
2606 |
|
2607 Sets the next state for the current state machine function - control will |
|
2608 flow to this state on completion of all functions coded by this macro. |
|
2609 |
|
2610 The macro also pushes a state machine entry onto the stack, specifying |
|
2611 the CURRENT state machine function as the child state machine function to be |
|
2612 invoked, and sets the state in which this child state machine function will |
|
2613 be entered, when it gains control. |
|
2614 |
|
2615 NOTES: |
|
2616 |
|
2617 - the child function is the same as the parent function. |
|
2618 - the state machine is blocked on return from the current state machine function. |
|
2619 |
|
2620 @param nexts The state in which the child state machine function will |
|
2621 gain control. |
|
2622 @param retst The next state for the current state machine function. |
|
2623 */ |
|
2624 #define SMF_CALLMYS(nexts,retst) {m.SetState(retst);m.PushMe();m.SetState(nexts);continue;} |
|
2625 |
|
2626 |
|
2627 /** |
|
2628 @publishedPartner |
|
2629 @released |
|
2630 |
|
2631 Sets the next state for the current state machine function - control flows to |
|
2632 the next instruction on completion of all functions coded by this macro. |
|
2633 |
|
2634 The macro also pushes a state machine entry onto the stack, specifying |
|
2635 the CURRENT state machine function as the child state machine function to be |
|
2636 invoked. The child function will be entered at state 0 (EStBegin), when the state machine |
|
2637 is next dispatched. |
|
2638 |
|
2639 NOTES: |
|
2640 |
|
2641 - the child function is the same as the parent function. |
|
2642 - the state machine is blocked on return from the current state machine function. |
|
2643 |
|
2644 @param retst The next state for the current state machine function. |
|
2645 */ |
|
2646 #define SMF_CALLMEWR(retst) {m.SetState(retst);m.PushMe();} |
|
2647 |
|
2648 |
|
2649 /** |
|
2650 @publishedPartner |
|
2651 @released |
|
2652 |
|
2653 Sets the next state for the current state machine function. |
|
2654 |
|
2655 The macro also pushes a state machine entry onto the stack, specifying |
|
2656 the child state machine function to be |
|
2657 invoked. The child function will be entered at state 0 (EStBegin), when the state machine |
|
2658 is next dispatched. |
|
2659 |
|
2660 Control returns from the current state machine function after completion of |
|
2661 all functions coded by this macro. |
|
2662 |
|
2663 @param func The child state machine function to be invoked. |
|
2664 @param nexts The next state for the current state machine function. |
|
2665 */ |
|
2666 #define SMF_INVOKES(func,nexts) {m.SetState(nexts);return(m.Push(func));} |
|
2667 |
|
2668 |
|
2669 /** |
|
2670 @publishedPartner |
|
2671 @released |
|
2672 |
|
2673 Sets the next state for the current state machine function. |
|
2674 |
|
2675 The macro also pushes a state machine entry onto the stack, specifying |
|
2676 the child state machine function to be |
|
2677 invoked. The child function will be entered at state 0 (EStBegin), when the state machine |
|
2678 is next dispatched. |
|
2679 |
|
2680 Control returns from the current state machine function after completion of |
|
2681 all functions coded by this macro. |
|
2682 |
|
2683 NOTES: |
|
2684 |
|
2685 - the state machine is blocked on return from the current state machine function. |
|
2686 |
|
2687 @param func The child state machine function to be invoked. |
|
2688 @param nexts The next state for the current state machine function. |
|
2689 */ |
|
2690 #define SMF_INVOKEWAITS(func,nexts) {m.SetState(nexts);return(m.Push(func,ETrue));} |
|
2691 |
|
2692 |
|
2693 /** |
|
2694 @publishedPartner |
|
2695 @released |
|
2696 |
|
2697 Returns from the current state machine function, and the state machine then blocks (waits). |
|
2698 */ |
|
2699 #define SMF_WAIT return(0); |
|
2700 |
|
2701 |
|
2702 /** |
|
2703 @publishedPartner |
|
2704 @released |
|
2705 |
|
2706 Sets the next state for the current state machine function; control then returns |
|
2707 from the current state machine function, and the state machine blocks (waits). |
|
2708 |
|
2709 @param nexts The next state for the current state machine function. |
|
2710 */ |
|
2711 #define SMF_WAITS(nexts) return(m.SetState(nexts)); |
|
2712 |
|
2713 |
|
2714 /** |
|
2715 @publishedPartner |
|
2716 @released |
|
2717 |
|
2718 Returns the specified error value to the calling (parent) state machine function. |
|
2719 |
|
2720 @param value The error value to be returned. |
|
2721 */ |
|
2722 #define SMF_RETURN(value) {m.Pop();return(value);} |
|
2723 |
|
2724 |
|
2725 /** |
|
2726 @publishedPartner |
|
2727 @released |
|
2728 |
|
2729 Returns to the calling state machine function. |
|
2730 */ |
|
2731 #define SMF_EXIT break; |
|
2732 |
|
2733 |
|
2734 /** |
|
2735 @publishedPartner |
|
2736 @released |
|
2737 |
|
2738 Returns to the calling state machine function, and the state machine blocks (waits). |
|
2739 */ |
|
2740 #define SMF_EXITWAIT return(m.Pop(ETrue)); |
|
2741 |
|
2742 |
|
2743 /** |
|
2744 @publishedPartner |
|
2745 @released |
|
2746 |
|
2747 Transfers control to the specified state machine function. |
|
2748 |
|
2749 NOTES: |
|
2750 |
|
2751 - this function is executed at the same stack entry level as the current state machine function. |
|
2752 |
|
2753 @param func The state machine function to which control is to be transferred. |
|
2754 */ |
|
2755 #define SMF_JUMP(func) return(m.Jump(func)); |
|
2756 |
|
2757 |
|
2758 /** |
|
2759 @publishedPartner |
|
2760 @released |
|
2761 |
|
2762 Transfers control to the specified state machine function, and waits |
|
2763 at its entry point. |
|
2764 |
|
2765 @param func The state machine function to which control is to be transferred. |
|
2766 */ |
|
2767 #define SMF_JUMPWAIT(func) return(m.Jump(func,ETrue)); |
|
2768 |
|
2769 |
|
2770 /** |
|
2771 @publishedPartner |
|
2772 @released |
|
2773 |
|
2774 Goes to the next state. |
|
2775 */ |
|
2776 #define SMF_GOTONEXTS continue; |
|
2777 |
|
2778 |
|
2779 /** |
|
2780 @publishedPartner |
|
2781 @released |
|
2782 |
|
2783 Sets the next state and then goes to that state. |
|
2784 |
|
2785 @param nexts The next state. |
|
2786 */ |
|
2787 #define SMF_GOTOS(nexts) {m.SetState(nexts);continue;} |
|
2788 |
|
2789 |
|
2790 /** |
|
2791 @publishedPartner |
|
2792 @released |
|
2793 |
|
2794 Declares the name of a state. |
|
2795 |
|
2796 This is used to generate a case statement based on the state name. |
|
2797 |
|
2798 @param sname The state name. |
|
2799 */ |
|
2800 #define SMF_STATE(sname) }case sname:{ |
|
2801 |
|
2802 |
|
2803 /** |
|
2804 @publishedPartner |
|
2805 @released |
|
2806 |
|
2807 Declares the name of a state, and sleeps here |
|
2808 if blocked statically. |
|
2809 |
|
2810 @param sname The state name. |
|
2811 */ |
|
2812 #define SMF_BPOINT(sname) }case sname: if(StaticBlocks()) return(m.SetState(sname));{ |
|
2813 |
|
2814 |
|
2815 |
|
2816 |
|
2817 class TMMCStateMachine |
|
2818 /** |
|
2819 The MultiMediaCard state machine. |
|
2820 |
|
2821 @publishedPartner |
|
2822 @released |
|
2823 */ |
|
2824 { |
|
2825 public: |
|
2826 inline void Setup(TMMCErr (*anEntry)(TAny*), TAny* aContextP); |
|
2827 IMPORT_C void Reset(); |
|
2828 IMPORT_C TMMCErr Dispatch(); |
|
2829 inline TMMCErr ExitCode(); |
|
2830 inline TMMCErr SetExitCode(TMMCErr aCode); |
|
2831 inline TUint State(); |
|
2832 inline TMMCErr SetState(TUint aState); |
|
2833 inline void SuppressSuspension(); |
|
2834 inline void SetTraps(TMMCErr aMask); |
|
2835 inline void ResetTraps(); |
|
2836 inline void Abort(); |
|
2837 inline TMMCErr Pop(TBool aSuspend=EFalse); |
|
2838 inline TMMCErr PushMe(); |
|
2839 IMPORT_C TMMCErr Push(TMMCErr (*anEntry)(TAny*), TBool aSuspend=EFalse); |
|
2840 IMPORT_C TMMCErr Jump(TMMCErr (*anEntry)(TAny*), TBool aSuspend=EFalse); |
|
2841 private: |
|
2842 class TMMCMachineStackEntry |
|
2843 { |
|
2844 public: |
|
2845 TMMCErr (*iFunction)(TAny*); |
|
2846 TUint iState; |
|
2847 TMMCErr iTrapMask; |
|
2848 }; |
|
2849 TBool iAbort; |
|
2850 TBool iSuspend; |
|
2851 TAny* iContextP; |
|
2852 TMMCErr iExitCode; |
|
2853 TInt iSP; |
|
2854 TMMCMachineStackEntry iStack[KMaxMMCMachineStackDepth]; |
|
2855 }; |
|
2856 |
|
2857 class TMMCCallBack |
|
2858 /** |
|
2859 This class is used to notify the request completion as a callback function for the clients of DMMCSession. |
|
2860 The callback function will be called on session completion. |
|
2861 Callback function is used to indicate Asynchronous Completion. |
|
2862 |
|
2863 @see DMMCSession |
|
2864 @publishedPartner |
|
2865 @released |
|
2866 */ |
|
2867 { |
|
2868 public: |
|
2869 inline TMMCCallBack(); |
|
2870 inline TMMCCallBack(void (*aFunction)(TAny* aPtr)); |
|
2871 inline TMMCCallBack(void (*aFunction)(TAny* aPtr), TAny* aPtr); |
|
2872 inline void CallBack() const; |
|
2873 public: |
|
2874 /** |
|
2875 A pointer to the callback function. |
|
2876 */ |
|
2877 void (*iFunction)(TAny* aPtr); |
|
2878 |
|
2879 /** |
|
2880 A pointer that is passed to the callback function when |
|
2881 the callback function is called. |
|
2882 */ |
|
2883 TAny* iPtr; |
|
2884 }; |
|
2885 |
|
2886 // DMMCStack serves an incoming queue of session requests. |
|
2887 // Each queue element is represented by an instance of the following class |
|
2888 |
|
2889 typedef TMMCErr (*TMMCSMSTFunc)(TAny*); |
|
2890 |
|
2891 class DMMCSession : public DBase |
|
2892 /** |
|
2893 Provides the main interface between the client and the MMC Socket, allowing commands and responses |
|
2894 to be processed asynchronously on the stack. |
|
2895 |
|
2896 Each client creates it own instance of this class. It is then able to make MultiMediaCard requests |
|
2897 on the selected stack by configuring the DMMCSession object with relevant information for the request |
|
2898 and then submitting (or engaging) this session object. |
|
2899 |
|
2900 The session is used to pass commands either to the entire stack (a broadcast command), or to individual |
|
2901 cards in the stack. The class contains functions for initiating macro functions as laid down by the |
|
2902 MultiMediaCard Association (MMCA) as well as lower level functions allowing a client to control the |
|
2903 stack in a more explicit manner. |
|
2904 |
|
2905 All requests on the MultiMediaCard stack which involve bus activity are inherently asynchronous. When |
|
2906 creating a DMMCSession object, a client supplies a call-back function as part of the constructor. |
|
2907 Once a client has engaged a session on the stack, it is informed of the completion of the request by |
|
2908 the Controller calling this call-back function. |
|
2909 |
|
2910 @publishedPartner |
|
2911 @released |
|
2912 */ |
|
2913 { |
|
2914 public: |
|
2915 IMPORT_C virtual ~DMMCSession(); |
|
2916 IMPORT_C DMMCSession(const TMMCCallBack& aCallBack); |
|
2917 |
|
2918 // Object initialisation |
|
2919 inline void SetStack(DMMCStack* aStackP); |
|
2920 IMPORT_C void SetCard(TMMCard* aCardP); |
|
2921 |
|
2922 // Control macros setup |
|
2923 inline void SetupCIMUpdateAcq(); |
|
2924 inline void SetupCIMInitStack(); |
|
2925 inline void SetupCIMCheckStack(); |
|
2926 inline void SetupCIMSetupCard(); |
|
2927 inline void SetupCIMLockStack(); |
|
2928 inline void SetupCIMInitStackAfterUnlock(); |
|
2929 inline void SetupCIMAutoUnlock(); |
|
2930 |
|
2931 // Data transfer macros setup |
|
2932 IMPORT_C void SetupCIMReadBlock(TMMCArgument aDevAddr, TUint32 aLength, TUint8* aMemoryP); |
|
2933 IMPORT_C void SetupCIMWriteBlock(TMMCArgument aDevAddr, TUint32 aLength, TUint8* aMemoryP); |
|
2934 IMPORT_C void SetupCIMReadMBlock(TMMCArgument aDevAddr, TUint32 aLength, TUint8* aMemoryP, TUint32 aBlkLen); |
|
2935 IMPORT_C void SetupCIMWriteMBlock(TMMCArgument aDevAddr, TUint32 aLength, TUint8* aMemoryP, TUint32 aBlkLen); |
|
2936 IMPORT_C void SetupCIMEraseSector(TMMCArgument aDevAddr, TUint32 aLength); |
|
2937 IMPORT_C void SetupCIMEraseGroup(TMMCArgument aDevAddr, TUint32 aLength); |
|
2938 IMPORT_C void SetupCIMReadIO(TUint8 aRegAddr, TUint32 aLength, TUint8* aMemoryP); |
|
2939 IMPORT_C void SetupCIMWriteIO(TUint8 aRegAddr, TUint32 aLength, TUint8* aMemoryP); |
|
2940 IMPORT_C void SetupCIMLockUnlock(TUint32 aLength, TUint8* aMemoryP); |
|
2941 |
|
2942 // Data transfer macros setup (block mode) |
|
2943 inline void SetupCIMReadBlock(TMMCArgument aBlockAddr, TUint8* aMemoryP, TUint32 aBlocks = 1); |
|
2944 inline void SetupCIMWriteBlock(TMMCArgument aBlockAddr, TUint8* aMemoryP, TUint32 aBlocks = 1); |
|
2945 inline void SetupCIMEraseMSector(TMMCArgument aBlockAddr, TUint32 aBlocks = 1); |
|
2946 inline void SetupCIMEraseMGroup(TMMCArgument aBlockAddr, TUint32 aBlocks = 1); |
|
2947 |
|
2948 // Raw commands (must be used in the locked bus state only) |
|
2949 // Known commands with or without (with a default) argument |
|
2950 IMPORT_C void SetupCommand(TMMCCommandEnum aCommand, TMMCArgument anArgument=0); |
|
2951 |
|
2952 // Generic unknown command with unknown response type |
|
2953 IMPORT_C void SetupRSCommand(TMMCCommandEnum aCommand, TMMCArgument anArgument, |
|
2954 TUint32 aResponseLength, TMMCCommandTypeEnum aCommandType=ECmdTypeUK, |
|
2955 TMMCResponseTypeEnum aResponseType=ERespTypeUnknown, |
|
2956 TUint32 aCommandClass=KMMCCmdClassNone); |
|
2957 |
|
2958 // Generic data transfer command |
|
2959 IMPORT_C void SetupDTCommand(TMMCCommandEnum aCommand, TMMCArgument anArgument, |
|
2960 TUint32 aTotalLength, TUint8* aMemoryAddress, TUint32 aBlockLength=0, |
|
2961 TBool aStopTransmission=EFalse, TMMCCmdDirEnum aDir=EDirNone, |
|
2962 TUint32 aCommandClass=KMMCCmdClassNone); |
|
2963 // Actions |
|
2964 IMPORT_C TInt Engage(); // Enque session for execution |
|
2965 inline void UnlockStack(); // Unlock the bus |
|
2966 inline void Stop(); // Signal session to complete (stop and complete) |
|
2967 inline void Abort(); // Abort only (no completion) |
|
2968 |
|
2969 // Info retrieval |
|
2970 IMPORT_C TInt EpocErrorCode() const; // Derived from MMCExitCode and LastStatus |
|
2971 inline TMMCSessionTypeEnum SessionID() const; |
|
2972 inline DMMCStack* StackP() const; // DMMCStack serving this session |
|
2973 inline TMMCard* CardP() const; // The current card pointer |
|
2974 inline TBool IsEngaged() const; // Session is being served by DMMCStack |
|
2975 inline TMMCErr MMCExitCode() const; // MMC specific error code returned by DMMCStack |
|
2976 inline TMMCStatus LastStatus() const; // Last R1 response received from the card |
|
2977 inline TUint32 BytesTransferred() const;// The actual amount of data transferred in this session |
|
2978 inline TUint8* ResponseP(); // Current command response (&iCommand[iCmdSP].iResponse) |
|
2979 inline TUint32 EffectiveModes() const; // Modes which DMMCStack will consider as effective |
|
2980 // |
|
2981 inline void ResetCommandStack(); |
|
2982 private: |
|
2983 void SetupCIMControl(TInt aSessNum); |
|
2984 protected: |
|
2985 IMPORT_C virtual TMMCSMSTFunc GetMacro(TInt aSessNum) const; |
|
2986 inline void Block(TUint32 aFlag); |
|
2987 inline void UnBlock(TUint32 aFlag, TMMCErr anExitCode); |
|
2988 private: |
|
2989 #ifdef __EPOC32__ |
|
2990 static void PollTimerCallBack(TAny* aSessP); |
|
2991 static void RetryTimerCallBack(TAny* aSessP); |
|
2992 static void ProgramTimerCallBack(TAny* aSessP); |
|
2993 #endif |
|
2994 inline void SwapMe(); |
|
2995 void SynchBlock(TUint32 aFlag); |
|
2996 void SynchUnBlock(TUint32 aFlag); |
|
2997 public: |
|
2998 static const TMMCCommandSpec& FindCommandSpec(const TMMCIdxCommandSpec aSpecs[], TInt aIdx); |
|
2999 IMPORT_C void FillCommandDesc(); |
|
3000 IMPORT_C void FillCommandDesc(TMMCCommandEnum aCommand); |
|
3001 IMPORT_C void FillCommandDesc(TMMCCommandEnum aCommand, TMMCArgument anArgument); |
|
3002 IMPORT_C void FillCommandArgs(TMMCArgument anArgument, TUint32 aLength, TUint8* aMemoryP, TUint32 aBlkLen); |
|
3003 inline TMMCCommandDesc& Command(); // The current command descriptor |
|
3004 |
|
3005 inline void PushCommandStack(); |
|
3006 inline void PopCommandStack(); |
|
3007 |
|
3008 // Methods for double-buffered data transfer: |
|
3009 inline TBool RequestMoreData(); |
|
3010 inline void EnableDoubleBuffering(TUint32 aNumBlocks); /**< @internalTechnology */ |
|
3011 inline void SetDataTransferCallback(TMMCCallBack& aCallback); /**< @internalTechnology */ |
|
3012 inline void MoreDataAvailable(TUint32 aNumBlocks, TUint8* aMemoryP, TInt aError); /**< @internalTechnology */ |
|
3013 public: |
|
3014 /** |
|
3015 The last R1 response. |
|
3016 */ |
|
3017 TMMCStatus iLastStatus; |
|
3018 |
|
3019 /** |
|
3020 A pointer to the card object. |
|
3021 */ |
|
3022 TMMCard* iCardP; // Pointer to Card Info object |
|
3023 IMPORT_C TRCA CardRCA(); // Checks that card is still ready - otherwise returns 0 |
|
3024 TMMCSessionTypeEnum iSessionID; |
|
3025 private: |
|
3026 DMMCSession* iLinkP; // |
|
3027 protected: |
|
3028 TMMCCallBack iCallBack; // Where to report the completion |
|
3029 private: |
|
3030 DMMCStack* iStackP; // Pointer to Stack Controller |
|
3031 TCID iCID; // Card ID to ensure we are still talking to the same card |
|
3032 TUint32 iBytesTransferred; // The actual amount of data transferred in this session |
|
3033 TMMCErr iMMCExitCode; // State Machine exit code (MMC specific) |
|
3034 public: |
|
3035 /** |
|
3036 Session state flags (synchronous). |
|
3037 */ |
|
3038 TUint32 iState; |
|
3039 private: |
|
3040 TUint iInitContext; // Stack Initialiser pass number |
|
3041 TUint iGlobalRetries; // Global retry counter |
|
3042 |
|
3043 // Asynchronous flags analysed by scheduler |
|
3044 TBool volatile iDoAbort; // Marks the session for abort |
|
3045 TBool volatile iDoStop; // Stop the session as soon as it's safe |
|
3046 TBool volatile iDoComplete; // Completion callback is now to be invoked |
|
3047 TBool iBrokenLock; // Stack lock is broken by force major |
|
3048 // |
|
3049 TUint32 iBlockOn; // blocking reasons |
|
3050 TInt iCmdSP; // Current Command stack index |
|
3051 |
|
3052 TMMCCommandDesc iCommand[KMaxMMCCommandStackDepth]; // Command stack |
|
3053 |
|
3054 TMMCCallBack iDataTransferCallback; // A callback function, used to request more data when performing double-buffering |
|
3055 |
|
3056 TUint32 iSpare[22]; // Spare data (stolen from iCommand) |
|
3057 |
|
3058 TMMCStateMachine iMachine; // State Machine context |
|
3059 #ifdef __EPOC32__ |
|
3060 NTimer iPollTimer; |
|
3061 NTimer iRetryTimer; |
|
3062 NTimer iProgramTimer; |
|
3063 #endif |
|
3064 public: |
|
3065 TMMCStackConfig iConfig; // Client configuration parameters |
|
3066 friend class DMMCStack; |
|
3067 friend class TMMCSessRing; |
|
3068 friend class TMMCardArray; |
|
3069 }; |
|
3070 |
|
3071 |
|
3072 class DMMCStack : public DBase |
|
3073 /** |
|
3074 This object controls access to the MultiMediaCard stack. |
|
3075 The DMMCSocket owns an instance of this class for the MultiMediaCard stack that it manages. |
|
3076 |
|
3077 @publishedPartner |
|
3078 @released |
|
3079 */ |
|
3080 { |
|
3081 public: |
|
3082 /** extension interfaces Ids */ |
|
3083 enum TInterfaceId |
|
3084 { |
|
3085 KInterfaceMachineInfo, |
|
3086 KInterfaceSwitchToLowVoltageSM, |
|
3087 KInterfaceSetBusWidth, |
|
3088 KInterfaceDemandPagingInfo, |
|
3089 KInterfaceCancelSession, |
|
3090 KInterfaceDoWakeUpSM |
|
3091 }; |
|
3092 |
|
3093 /** generic interface */ |
|
3094 class MInterface |
|
3095 { |
|
3096 public: |
|
3097 virtual TInt Function() = 0; |
|
3098 }; |
|
3099 |
|
3100 /** |
|
3101 Demand paging support |
|
3102 @see KInterfaceDemandPagingInfo |
|
3103 */ |
|
3104 class TDemandPagingInfo |
|
3105 { |
|
3106 public: |
|
3107 const TInt* iPagingDriveList; |
|
3108 TInt iDriveCount; |
|
3109 TUint iPagingType; |
|
3110 TInt iReadShift; |
|
3111 TUint iNumPages; |
|
3112 TBool iWriteProtected; |
|
3113 TInt iSlotNumber; |
|
3114 TUint iSpare[2]; |
|
3115 } ; |
|
3116 /** |
|
3117 * An optional interface implemented by the PSL for returning demand-paging information. |
|
3118 * @see KInterfaceDemandPagingInfo |
|
3119 */ |
|
3120 class MDemandPagingInfo |
|
3121 { |
|
3122 public: |
|
3123 virtual TInt DemandPagingInfo(TDemandPagingInfo& aInfo) = 0; |
|
3124 }; |
|
3125 |
|
3126 /** |
|
3127 * An optional interface State machine implemented by the PSL for handling asynchronous VccCore powerup |
|
3128 * @see KInterfaceDoWakeUpSM |
|
3129 */ |
|
3130 class MDoWakeUp |
|
3131 { |
|
3132 public: |
|
3133 virtual TMMCErr DoWakeUpSM()=0; |
|
3134 }; |
|
3135 |
|
3136 |
|
3137 public: |
|
3138 IMPORT_C DMMCStack(TInt aBus, DMMCSocket* aSocket); |
|
3139 IMPORT_C virtual TInt Init(); |
|
3140 // |
|
3141 // Actions |
|
3142 inline void ReportPowerUp(); |
|
3143 inline void ReportPowerDown(); |
|
3144 inline void Reset(); // Discard all requests and clear up |
|
3145 inline void CompleteAll(TMMCErr aCode); // Complete all operations with an error |
|
3146 inline void CancelSession(DMMCSession* aSession); |
|
3147 |
|
3148 IMPORT_C void PowerUpStack(); |
|
3149 IMPORT_C void PowerDownStack(); |
|
3150 void QSleepStack(); |
|
3151 IMPORT_C TInt Stop(TMMCard* aCardP); |
|
3152 // |
|
3153 // Inquiries |
|
3154 inline TUint MaxCardsInStack() const; |
|
3155 inline TMMCard* CardP(TUint aCardNumber); |
|
3156 inline DMMCSocket* MMCSocket() const; |
|
3157 inline TMMCPasswordStore* PasswordStore() const; |
|
3158 inline TBool InitStackInProgress() const; |
|
3159 inline TBool HasSessionsQueued() const; |
|
3160 inline TBool HasCardsPresent(); |
|
3161 inline void BufferInfo(TUint8*& aBuf, TInt& aBufLen, TInt& aMinorBufLen); |
|
3162 inline TInt DemandPagingInfo(TDemandPagingInfo& aInfo); |
|
3163 inline TBool StackRunning() const; |
|
3164 |
|
3165 |
|
3166 #ifdef __EPOC32__ |
|
3167 |
|
3168 /** |
|
3169 Defines the period for the poll timer. |
|
3170 |
|
3171 The poll timer is used by the generic layer for platforms |
|
3172 that do not provide an interrupt to indicate |
|
3173 when programming mode is finished. |
|
3174 |
|
3175 @return The poll timer period, in milliseconds. |
|
3176 */ |
|
3177 virtual TInt ProgramPeriodInMilliSeconds() const =0; |
|
3178 #endif |
|
3179 |
|
3180 /** |
|
3181 * Calculates the minimum range that must be read off a card, an optimisation that takes advantage |
|
3182 * of the partial read feature found on some cards. It takes the logical range that the media driver |
|
3183 * wants to read from the card, and increases it to take into account factors such as FIFO width and |
|
3184 * minimum DMA transfer size. |
|
3185 * @param aCard A pointer to the MMC Card |
|
3186 * @param aStart The required start position |
|
3187 * @param aEnd The required end position |
|
3188 * @param aPhysStart The adjusted start position |
|
3189 * @param aPhysEnd The adjusted end position |
|
3190 */ |
|
3191 virtual void AdjustPartialRead(const TMMCard* aCard, TUint32 aStart, TUint32 aEnd, TUint32* aPhysStart, TUint32* aPhysEnd) const =0; |
|
3192 |
|
3193 /** |
|
3194 * Returns the details of the buffer allocated by the socket for data transfer operations. The buffer |
|
3195 * is allocated and configured at the variant layer to allow , for example, contiguous pages to be |
|
3196 * allocated for DMA transfers. |
|
3197 * @param aMDBuf A pointer to the allocated buffer |
|
3198 * @param aMDBufLen The length of the allocated buffer |
|
3199 */ |
|
3200 virtual void GetBufferInfo(TUint8** aMDBuf, TInt* aMDBufLen) =0; |
|
3201 |
|
3202 /** |
|
3203 * Gets the platform specific configuration information. |
|
3204 * @see TMMCMachineInfo |
|
3205 */ |
|
3206 virtual void MachineInfo(TMMCMachineInfo& aMachineInfo) =0; |
|
3207 |
|
3208 /** |
|
3209 * Creates the session object |
|
3210 */ |
|
3211 IMPORT_C virtual DMMCSession* AllocSession(const TMMCCallBack& aCallBack) const; |
|
3212 |
|
3213 protected: |
|
3214 // Platform layer service |
|
3215 inline TMMCBusConfig& BusConfig(); |
|
3216 inline TMMCBusConfig& MasterBusConfig(); |
|
3217 inline DMMCSession& Session(); // Current session |
|
3218 inline TMMCCommandDesc& Command(); // Current command descriptor of current session |
|
3219 inline TMMCStateMachine& Machine(); // State machine of current session |
|
3220 inline void BlockCurrentSession(TUint32 aFlag); |
|
3221 inline void UnBlockCurrentSession(TUint32 aFlag, TMMCErr anExitCode); |
|
3222 inline void ReportInconsistentBusState(); |
|
3223 inline void ReportASSPEngaged(); |
|
3224 inline void ReportASSPDisengaged(); |
|
3225 inline TRCA CurrentSessCardRCA(); // Checks that card is still ready - otherwise returns 0 |
|
3226 inline void CurrentSessPushCmdStack(); |
|
3227 inline void CurrentSessPopCmdStack(); |
|
3228 inline void CurrentSessFillCmdDesc(TMMCCommandEnum aCommand); |
|
3229 inline void CurrentSessFillCmdDesc(TMMCCommandEnum aCommand,TMMCArgument anArgument); |
|
3230 inline void CurrentSessFillCmdArgs(TMMCArgument anArgument,TUint32 aLength,TUint8* aMemoryP,TUint32 aBlkLen); |
|
3231 inline TRCA SelectedCard() const; |
|
3232 inline void YieldStack(TMMCCommandTypeEnum aCommand); |
|
3233 |
|
3234 void DoSetClock(TUint32 aClock); |
|
3235 void DoSetBusWidth(TUint32 aBusWidth); |
|
3236 TBusWidth BusWidthEncoding(TInt aBusWidth) const; |
|
3237 TUint MaxTranSpeedInKilohertz(const TMMCard& aCard) const; |
|
3238 |
|
3239 // Stack service provided by platform/variant layer. |
|
3240 |
|
3241 /** |
|
3242 * Returns the default master settings for the platform. |
|
3243 * @param aConfig A TMMCBusConfig reference to be filled in with the default settings. |
|
3244 * @param aClock The requested clock frequency (may be ignored if the hardware cannot support it). |
|
3245 */ |
|
3246 virtual void SetBusConfigDefaults(TMMCBusConfig& aConfig, TUint aClock)=0; |
|
3247 |
|
3248 /** |
|
3249 * Switches from identification mode of operation to data transfer mode operation. |
|
3250 * |
|
3251 * Note that at this point the clock information in iBusConfig will not have been updated |
|
3252 * to the new data transfer rate. This function should generally just switch from open drain |
|
3253 * to push-pull bus mode - with the clock rate being changed at the start of IssueMMCCommandSM, |
|
3254 * where iBusConfig will be valid. |
|
3255 */ |
|
3256 virtual void InitClockOff()=0; |
|
3257 |
|
3258 /** |
|
3259 * Stop all activities on the host stack. |
|
3260 * |
|
3261 * This will generally perform the same operations as for ASSPDisengage() but this will additionally |
|
3262 * turn off the clock to the hardware interface and release any requested power requirements made on |
|
3263 * the power model. (That is release any power requirements made as part of the InitClockOnSM() function). |
|
3264 * |
|
3265 * Called from the platform independent layer when it is required to immediately cancel any PSL asynchronous |
|
3266 * activity because the current session has been aborted. |
|
3267 * |
|
3268 * This function should normally include a call to ReportAsspDisengaged() at the end, to report to the PIL |
|
3269 * that the PSL level resources have been disengaged. |
|
3270 */ |
|
3271 virtual void ASSPReset()=0; |
|
3272 |
|
3273 /** |
|
3274 * Called each time a session which has engaged PSL resources has completed or has been aborted. |
|
3275 * |
|
3276 * This should disable any activities which were required to perform the session just completed/aborted. |
|
3277 * It shouldn't however turn off the clock to the hardware interface (which will be turned off instead |
|
3278 * by the inactivity timer). This typically disables DMA and interface interrupts and forces the hardware |
|
3279 * interface into idle. |
|
3280 * |
|
3281 * This function should normally include a call to ReportAsspDisengaged() at the end, to report to the PIL |
|
3282 * that the PSL level resources have been disengaged. |
|
3283 */ |
|
3284 virtual void ASSPDisengage()=0; |
|
3285 |
|
3286 /** |
|
3287 * Called as part of the bus power down sequence. It stops all activities on the host stack, turns off the clock |
|
3288 * to the hardware interface and releases any requested power requirements made on the power model |
|
3289 * (i.e. very often a straight call of ASSPReset()). |
|
3290 * |
|
3291 * This shouldn't turn off the MMC PSU as this will be performed immediately afterwards by the PSU class. |
|
3292 */ |
|
3293 virtual void DoPowerDown()=0; |
|
3294 |
|
3295 IMPORT_C virtual TBool CardDetect(TUint aCardNumber); |
|
3296 IMPORT_C virtual TBool WriteProtected(TUint aCardNumber); |
|
3297 // |
|
3298 // State Machine functions implemented in platform layer. |
|
3299 |
|
3300 /** |
|
3301 * Called as a child function at the start of the CIM_UPDATE_ACQ macro state machine. |
|
3302 * |
|
3303 * It should perform the necessary PSL level actions associated with powering up the bus. This includes |
|
3304 * turning on the MMC PSU. However, the hardware interface clock should not be turned on as part of this function. |
|
3305 * |
|
3306 * If the Controller has to request power resources from the power model (e.g a fast system clock required all the |
|
3307 * time the bus is powered) then this state machine function can be used to asynchronously wait for this resource |
|
3308 * to become available. |
|
3309 * |
|
3310 * Upon completion, DMMCStack::ReportPowerUp() should be called. |
|
3311 * |
|
3312 * @return KMMCErrNone if completed successfully or standard TMMCErr code otherwise |
|
3313 */ |
|
3314 virtual TMMCErr DoPowerUpSM()=0; |
|
3315 |
|
3316 /** |
|
3317 * Turns on the clock to the hardware interface. |
|
3318 * |
|
3319 * This state machine function is called as a child function as part of the CIM_UPDATE_ACQ macro state machine. |
|
3320 * |
|
3321 * It is implemented as a state machine function since it may be necessary to include a short delay after the |
|
3322 * clock has been turned on to allow it to stabilise, or in some cases it may be necessary to wait for a power |
|
3323 * resource to become available. |
|
3324 * |
|
3325 * This function should normally include a call to ReportAsspEngaged() at the start, to report to the PIL that the PSL |
|
3326 * level resources have been engaged. |
|
3327 * |
|
3328 * @return KMMCErrNone if completed successfully or standard TMMCErr code otherwise |
|
3329 */ |
|
3330 virtual TMMCErr InitClockOnSM()=0; |
|
3331 |
|
3332 /** |
|
3333 * Executes a single command over the bus. |
|
3334 * |
|
3335 * The input parameters are passed via the current command descriptor on the session's command stack |
|
3336 * (TMMCCommandDesc class), which specifies the type of command, response type, arguments etc.. |
|
3337 * |
|
3338 * @return KMMCErrNone if completed successfully or standard TMMCErr code otherwise |
|
3339 */ |
|
3340 IMPORT_C virtual TMMCErr IssueMMCCommandSM()=0; |
|
3341 |
|
3342 TBool StaticBlocks(); |
|
3343 |
|
3344 /** |
|
3345 * Indicates that the PSL should change the bus width. |
|
3346 * Must be implemented by the Platform Specific Layer if MMCV4 4/8-bit bus mode is required |
|
3347 */ |
|
3348 IMPORT_C virtual void SetBusWidth(TUint32 aBusWidth); |
|
3349 |
|
3350 /** |
|
3351 * Retrieves a TMMCMachineInfoV4 from the PSL |
|
3352 * Must be implemented by the Platform Specific Layer if MMCV4 support is required |
|
3353 */ |
|
3354 public: |
|
3355 IMPORT_C virtual void MachineInfo(TDes8& aMachineInfo); |
|
3356 |
|
3357 protected: |
|
3358 /** |
|
3359 * Switches the MMC bus to low voltage mode |
|
3360 */ |
|
3361 TMMCErr SwitchToLowVoltageSM(); |
|
3362 |
|
3363 |
|
3364 private: |
|
3365 // |
|
3366 // Session service |
|
3367 void Add(DMMCSession* aSessP); |
|
3368 void Abort(DMMCSession* aSessP); |
|
3369 void Stop(DMMCSession* aSessP); |
|
3370 void UnlockStack(DMMCSession* aSessP); |
|
3371 void MarkComplete(DMMCSession* aSessP, TMMCErr anExitCode); |
|
3372 // |
|
3373 // Stack control and operations support |
|
3374 // Scheduler and its supplementary functions |
|
3375 enum TMMCStackSchedStateEnum |
|
3376 { |
|
3377 ESchedContinue=0, |
|
3378 ESchedLoop=1, |
|
3379 ESchedExit, |
|
3380 ESchedChooseJob |
|
3381 }; |
|
3382 void Scheduler(volatile TBool& aFlag); |
|
3383 void DoSchedule(); |
|
3384 TMMCStackSchedStateEnum SchedGetOnDFC(); |
|
3385 void SchedSetContext(DMMCSession* aSessP); |
|
3386 void SchedDoAbort(DMMCSession* aSessP); |
|
3387 TMMCStackSchedStateEnum SchedResolveStatBlocks(DMMCSession* aSessP); |
|
3388 TMMCStackSchedStateEnum SchedGroundDown(DMMCSession* aSessP, TMMCErr aReason); |
|
3389 TMMCStackSchedStateEnum SchedEnqueStackSession(TMMCSessionTypeEnum aSessID); |
|
3390 void SchedGrabEntries(); |
|
3391 void SchedDisengage(); |
|
3392 TBool SchedAllowDirectCommands(DMMCSession* aSessP); |
|
3393 TBool SchedYielding(DMMCSession* aSessP); |
|
3394 inline TMMCStackSchedStateEnum SchedAbortPass(); |
|
3395 inline TMMCStackSchedStateEnum SchedCompletionPass(); |
|
3396 inline TMMCStackSchedStateEnum SchedInitStack(); |
|
3397 inline TMMCStackSchedStateEnum SchedSleepStack(); |
|
3398 inline TBool SchedPreemptable(); |
|
3399 inline TMMCStackSchedStateEnum SchedSession(); |
|
3400 inline TMMCStackSchedStateEnum SchedChooseJob(); |
|
3401 // |
|
3402 // Miscellaneous SM function service |
|
3403 protected: |
|
3404 void MergeConfig(DMMCSession* aSessP); |
|
3405 private: |
|
3406 inline void DeselectsToIssue(TUint aNumber); |
|
3407 |
|
3408 // Static Completion routines. |
|
3409 static void StackDFC(TAny* aStackP); |
|
3410 static void StackSessionCBST(TAny* aStackP); |
|
3411 TInt StackSessionCB(); |
|
3412 static void AutoUnlockCBST(TAny *aStackP); |
|
3413 TInt AutoUnlockCB(); |
|
3414 |
|
3415 protected: |
|
3416 IMPORT_C void Block(DMMCSession* aSessP, TUint32 aFlag); |
|
3417 IMPORT_C void UnBlock(DMMCSession* aSessP, TUint32 aFlag, TMMCErr anExitCode); |
|
3418 |
|
3419 protected: |
|
3420 // State machines. The adapter functions just call the non-static versions. |
|
3421 // Top-level state machines. |
|
3422 static TMMCErr NakedSessionSMST(TAny* aStackP); // ECIMNakedSession |
|
3423 inline TMMCErr NakedSessionSM(); |
|
3424 static TMMCErr CIMUpdateAcqSMST(TAny* aStackP); // ECIMUpdateAcq |
|
3425 TMMCErr CIMUpdateAcqSM(); |
|
3426 static TMMCErr CIMInitStackSMST(TAny* aStackP); // ECIMInitStack |
|
3427 inline TMMCErr CIMInitStackSM(); |
|
3428 static TMMCErr CIMCheckStackSMST(TAny* aStackP); // ECIMCheckStack |
|
3429 inline TMMCErr CIMCheckStackSM(); |
|
3430 static TMMCErr CIMSetupCardSMST(TAny* aStackP); // ECIMSetupCard |
|
3431 inline TMMCErr CIMSetupCardSM(); |
|
3432 IMPORT_C static TMMCErr CIMReadWriteBlocksSMST(TAny* aStackP); // ECIMReadBlock, ECIMWriteBlock, ECIMReadMBlock, ECIMWriteMBlock |
|
3433 IMPORT_C virtual TMMCErr CIMReadWriteBlocksSM(); |
|
3434 static TMMCErr CIMEraseSMST(TAny* aStackP); // ECIMEraseSector, ECIMEraseGroup |
|
3435 inline TMMCErr CIMEraseSM(); |
|
3436 static TMMCErr CIMReadWriteIOSMST(TAny* aStackP); // ECIMReadIO, ECIMWriteIO |
|
3437 inline TMMCErr CIMReadWriteIOSM(); |
|
3438 static TMMCErr CIMLockUnlockSMST(TAny *aStackP); // ECIMLockUnlock |
|
3439 inline TMMCErr CIMLockUnlockSM(); |
|
3440 static TMMCErr NoSessionSMST(TAny* aStackP); // ECIMLockStack |
|
3441 inline TMMCErr NoSessionSM(); |
|
3442 static TMMCErr AcquireStackSMST(TAny* aStackP); |
|
3443 IMPORT_C virtual TMMCErr AcquireStackSM(); |
|
3444 static TMMCErr CheckStackSMST(TAny* aStackP); // ECIMCheckStack |
|
3445 inline TMMCErr CheckStackSM(); |
|
3446 static TMMCErr CheckLockStatusSMST(TAny* aStackP); |
|
3447 inline TMMCErr CheckLockStatusSM(); |
|
3448 static TMMCErr ModifyCardCapabilitySMST(TAny* aStackP); |
|
3449 IMPORT_C virtual TMMCErr ModifyCardCapabilitySM(); |
|
3450 static TMMCErr BaseModifyCardCapabilitySMST(TAny* aStackP); |
|
3451 static TMMCErr DoPowerUpSMST(TAny* aStackP); |
|
3452 static TMMCErr InitClockOnSMST(TAny* aStackP); |
|
3453 IMPORT_C static TMMCErr IssueMMCCommandSMST(TAny* aStackP); |
|
3454 |
|
3455 static TMMCErr CIMAutoUnlockSMST(TAny* aStackP); |
|
3456 inline TMMCErr CIMAutoUnlockSM(); |
|
3457 |
|
3458 static TMMCErr InitStackAfterUnlockSMST(TAny* aStackP); // ECIMInitStackAfterUnlock |
|
3459 IMPORT_C virtual TMMCErr InitStackAfterUnlockSM(); |
|
3460 |
|
3461 static TMMCErr InitCurrentCardAfterUnlockSMST(TAny* aStackP); |
|
3462 |
|
3463 static TMMCErr AttachCardSMST(TAny* aStackP); |
|
3464 inline TMMCErr AttachCardSM(); |
|
3465 static TMMCErr ExecCommandSMST(TAny* aStackP); |
|
3466 inline TMMCErr ExecCommandSM(); |
|
3467 static TMMCErr IssueCommandCheckResponseSMST(TAny* aStackP); |
|
3468 inline TMMCErr IssueCommandCheckResponseSM(); |
|
3469 static TMMCErr PollGapTimerSMST(TAny* aStackP); |
|
3470 inline TMMCErr PollGapTimerSM(); |
|
3471 static TMMCErr RetryGapTimerSMST(TAny* aStackP); |
|
3472 inline TMMCErr RetryGapTimerSM(); |
|
3473 static TMMCErr ProgramTimerSMST(TAny *aStackP); |
|
3474 inline TMMCErr ProgramTimerSM(); |
|
3475 static TMMCErr GoIdleSMST(TAny* aStackP); |
|
3476 inline TMMCErr GoIdleSM(); |
|
3477 |
|
3478 static TMMCErr SwitchToLowVoltageSMST(TAny* aStackP); |
|
3479 |
|
3480 static TMMCErr DoWakeUpSMST(TAny* aStackP); |
|
3481 |
|
3482 |
|
3483 private: |
|
3484 static TMMCErr ConfigureHighSpeedSMST(TAny* aStackP); |
|
3485 inline TMMCErr ConfigureHighSpeedSM(); |
|
3486 |
|
3487 static TMMCErr DetermineBusWidthAndClockSMST(TAny* aStackP); |
|
3488 inline TMMCErr DetermineBusWidthAndClockSM(); |
|
3489 |
|
3490 static TMMCErr ExecSwitchCommandST(TAny* aStackP); |
|
3491 inline TMMCErr ExecSwitchCommand(); |
|
3492 |
|
3493 static TMMCErr ExecSleepCommandSMST(TAny* aStackP); |
|
3494 inline TMMCErr ExecSleepCommandSM(); |
|
3495 |
|
3496 static TMMCErr ExecAwakeCommandSMST(TAny* aStackP); |
|
3497 inline TMMCErr ExecAwakeCommandSM(); |
|
3498 |
|
3499 static TMMCErr LowVoltagePowerupTimerSMST(TAny *aStackP); |
|
3500 TMMCErr LowVoltagePowerupTimerSM(); |
|
3501 |
|
3502 static TMMCErr ExecBusTestSMST(TAny* aStackP); |
|
3503 inline TMMCErr ExecBusTestSM(); |
|
3504 |
|
3505 enum TBusWidthAndClock |
|
3506 { |
|
3507 E1Bit20Mhz = 0x0000, |
|
3508 |
|
3509 E4Bits26Mhz = 0x0001, |
|
3510 E4Bits52Mhz = 0x0002, |
|
3511 |
|
3512 E8Bits26Mhz = 0x0004, |
|
3513 E8Bits52Mhz = 0x0008, |
|
3514 }; |
|
3515 enum TBusWidthAndClockMasks |
|
3516 { |
|
3517 E4BitMask = E4Bits26Mhz | E4Bits52Mhz, |
|
3518 E8BitMask = E8Bits26Mhz | E8Bits52Mhz, |
|
3519 E26MhzMask = E4Bits26Mhz | E8Bits26Mhz, |
|
3520 E52MhzMask = E4Bits52Mhz | E8Bits52Mhz |
|
3521 }; |
|
3522 |
|
3523 void DetermineBusWidthAndClock(const TMMCard& aCard, TBool aLowVoltage, TUint& aPowerClass, TBusWidthAndClock& aBusWidthAndClock); |
|
3524 TUint GetPowerClass(const TMMCard& aCard, TBusWidthAndClock aWidthAndClock, TBool aLowVoltage); |
|
3525 |
|
3526 |
|
3527 // ----------- Data Members ------------- |
|
3528 private: |
|
3529 // |
|
3530 // Synchronous status, data structures and control info. |
|
3531 TUint32 iStackState; |
|
3532 TUint iInitContext; // Stack Initialiser pass number |
|
3533 DMMCSession* iLockingSessionP; |
|
3534 TMMCSessRing iWorkSet; |
|
3535 TMMCSessRing iReadyQueue; |
|
3536 TMMCSessRing iEntryQueue; |
|
3537 TDfc iStackDFC; |
|
3538 TRCA iSelectedCard; |
|
3539 DMMCSocket* iSocket; |
|
3540 DMMCSession* iStackSession; |
|
3541 DMMCSession iAutoUnlockSession; |
|
3542 TInt iAutoUnlockIndex; // index into iCards |
|
3543 protected: |
|
3544 TUint8* iPSLBuf; |
|
3545 private: |
|
3546 TInt iPSLBufLen; |
|
3547 TInt iMinorBufLen; |
|
3548 TUint8 iSpare[2]; |
|
3549 TBool volatile iSleep; |
|
3550 DThread* iNotifierThread; |
|
3551 TRequestStatus* iNotifierReqStat; |
|
3552 enum TInitState {EISPending, EISDone}; |
|
3553 TInitState iInitState; |
|
3554 // |
|
3555 // Stack and Scheduler control |
|
3556 // Asynchronous sheduler attention flags |
|
3557 TBool volatile iAttention; // There are ready sessions |
|
3558 TBool volatile iAbortReq; // There are sessions marked for abort |
|
3559 TBool volatile iCompReq; // There are sessions to complete |
|
3560 TBool volatile iInitialise; // Enforce InitStack (after enforced PowerDown) |
|
3561 TBool volatile iUpdate; // Enque InitStack into iWorkSet |
|
3562 // Other asynchronous flags |
|
3563 TBool volatile iPoweredUp; |
|
3564 TBool volatile iDFCRunning; |
|
3565 TBool volatile iAbortAll; |
|
3566 TMMCErr volatile iCompleteAllExitCode; |
|
3567 // |
|
3568 // Session context |
|
3569 protected: |
|
3570 DMMCSession* iSessionP; |
|
3571 private: |
|
3572 // |
|
3573 // Bus control |
|
3574 TDSR iCurrentDSR; |
|
3575 // |
|
3576 // Stack data structures and Session/StateMachine miscellaneous |
|
3577 TUint iDeselectsToIssue; |
|
3578 TInt iCxDeselectCount; |
|
3579 TUint8 iCMD42CmdByte; |
|
3580 TMediaPassword iMPTgt; |
|
3581 public: |
|
3582 IMPORT_C TUint32 EffectiveModes(const TMMCStackConfig& aClientConfig); |
|
3583 TUint32 iCurrentOpRange; |
|
3584 TInt iCxCardCount; |
|
3585 TInt iCxPollRetryCount; |
|
3586 TMMCStackConfig iConfig; |
|
3587 TUint iMaxCardsInStack; |
|
3588 TMMCRCAPool iRCAPool; |
|
3589 TMMCardArray* iCardArray; |
|
3590 TMMCStackConfig iMasterConfig; |
|
3591 friend class DMMCSocket; |
|
3592 friend class DMMCSession; |
|
3593 friend class TMMCardArray; |
|
3594 |
|
3595 private: |
|
3596 // |
|
3597 // Dummy functions to maintain binary compatibility |
|
3598 IMPORT_C virtual void Dummy1(); |
|
3599 |
|
3600 protected: |
|
3601 /** |
|
3602 Gets an interface from a derived class |
|
3603 replaces reserved virtual Dummy4() |
|
3604 */ |
|
3605 IMPORT_C virtual void GetInterface(TInterfaceId aInterfaceId, MInterface*& aInterfacePtr); |
|
3606 |
|
3607 private: |
|
3608 TBusWidthAndClock iBusWidthAndClock; |
|
3609 TInt iSelectedCardIndex; |
|
3610 // |
|
3611 // Reserved members to maintain binary compatibility |
|
3612 protected: |
|
3613 TBool iMultiplexedBus; // ETrue if cards are individually selectable. EFalse if stacked on a common bus. |
|
3614 private: |
|
3615 TMMCCommandTypeEnum iYieldCommandType; |
|
3616 TInt iReserved; |
|
3617 |
|
3618 protected: |
|
3619 // Pointer to protected utility class which allows class to grow while maintining BC |
|
3620 // replaces fourth element of iReserved[] |
|
3621 class DBody; |
|
3622 friend class DBody; |
|
3623 DBody* iBody; |
|
3624 }; |
|
3625 |
|
3626 |
|
3627 |
|
3628 |
|
3629 class TMMCMachineInfo |
|
3630 /** |
|
3631 Platform-specific configuration information for the |
|
3632 MultiMediaCard stack. |
|
3633 |
|
3634 An object of this type is passed to the Variant implementation |
|
3635 of DMMCStack::MachineInfo(), which should fill the public data |
|
3636 members with appropriate information and values. |
|
3637 |
|
3638 @publishedPartner |
|
3639 @released |
|
3640 */ |
|
3641 { |
|
3642 |
|
3643 public: |
|
3644 enum THardwareConfig |
|
3645 { |
|
3646 /** |
|
3647 Set this bit in iFlags if hardware supports SPI mode (not currently supported - set this bit to zero) |
|
3648 */ |
|
3649 ESupportsSPIMode = 0x01, |
|
3650 |
|
3651 /** |
|
3652 Set this bit in iFlags if the PSL is enabled for double-buffered data transfers |
|
3653 */ |
|
3654 ESupportsDoubleBuffering = 0x02, |
|
3655 |
|
3656 /** |
|
3657 Set this bit in iFlags if the PSL supports response type R7 |
|
3658 */ |
|
3659 ESupportsR7 = 0x04, |
|
3660 |
|
3661 /** |
|
3662 Set this bit in iFlags if the hardware DMA controller utilises 8-Bit Addressing |
|
3663 */ |
|
3664 EDma8BitAddressing = 0x08, |
|
3665 |
|
3666 /** |
|
3667 Set this bit in iFlags if the hardware DMA controller utilises 16-Bit Addressing |
|
3668 */ |
|
3669 EDma16BitAddressing = 0x10, |
|
3670 |
|
3671 /** |
|
3672 Set this bit in iFlags if the hardware DMA controller utilises 32-Bit Addressing |
|
3673 */ |
|
3674 EDma32BitAddressing = 0x20, |
|
3675 |
|
3676 /** |
|
3677 Set this bit in iFlags if the hardware DMA controller utilises 64-Bit Addressing |
|
3678 */ |
|
3679 EDma64BitAddressing = 0x40, |
|
3680 |
|
3681 /** |
|
3682 Set this in iFlags if the hardware supports DMA and can cope with being given a physical address. |
|
3683 This also sets the ESupportsDoubleBuffering flag, physical addressing is dependent on |
|
3684 doublebuffering functionality. |
|
3685 @see ESupportsDoubleBuffering |
|
3686 @see KMMCCmdFlagPhysAddr flag |
|
3687 */ |
|
3688 ESupportsDMA = 0x082, |
|
3689 |
|
3690 /** |
|
3691 Set this in iFlags if the hardware is unable to perform data transfers of more than 256K |
|
3692 - Transfers greater than 256K will be split into multiple transactions. |
|
3693 */ |
|
3694 EMaxTransferLength_256K = 0x100, |
|
3695 |
|
3696 /** |
|
3697 Set this in iFlags if the hardware is unable to perform data transfers of more than 512K |
|
3698 - Transfers greater than 512K will be split into multiple transactions. |
|
3699 */ |
|
3700 EMaxTransferLength_512K = 0x200, |
|
3701 |
|
3702 /** |
|
3703 Set this in iFlags if the hardware is unable to perform data transfers of more than 1M |
|
3704 - Transfers greater than 1M will be split into multiple transactions. |
|
3705 */ |
|
3706 EMaxTransferLength_1M = 0x300, |
|
3707 |
|
3708 /** |
|
3709 Set this in iFlags if the hardware is unable to perform data transfers of more than 2M |
|
3710 - Transfers greater than 2M will be split into multiple transactions. |
|
3711 */ |
|
3712 EMaxTransferLength_2M = 0x400, |
|
3713 |
|
3714 /** |
|
3715 Set this in iFlags if the hardware is unable to perform data transfers of more than 4M |
|
3716 - Transfers greater than 4M will be split into multiple transactions. |
|
3717 */ |
|
3718 EMaxTransferLength_4M = 0x500, |
|
3719 |
|
3720 /** |
|
3721 Set this in iFlags if the hardware is unable to perform data transfers of more than 8M |
|
3722 - Transfers greater than 8M will be split into multiple transactions. |
|
3723 */ |
|
3724 EMaxTransferLength_8M = 0x600, |
|
3725 |
|
3726 /** |
|
3727 Set this in iFlags if the hardware is unable to perform data transfers of more than 16M |
|
3728 - Transfers greater than 16M will be split into multiple transactions. |
|
3729 */ |
|
3730 EMaxTransferLength_16M = 0x700, |
|
3731 |
|
3732 /** |
|
3733 The card in slot 1 is internal, i.e. not removable |
|
3734 */ |
|
3735 ESlot1Internal = 0x0800, |
|
3736 |
|
3737 /** |
|
3738 The card in slot 2 is internal, i.e. not removable |
|
3739 */ |
|
3740 ESlot2Internal = 0x1000, |
|
3741 }; |
|
3742 |
|
3743 public: |
|
3744 /** |
|
3745 The total number of MultiMediaCard slots for this stack. |
|
3746 |
|
3747 Be aware that this refers to the stack, and NOT to the platform; |
|
3748 a platform can have multiple stacks. |
|
3749 */ |
|
3750 TInt iTotalSockets; |
|
3751 |
|
3752 /** |
|
3753 Not currently used. |
|
3754 |
|
3755 Set this value to zero. |
|
3756 */ |
|
3757 TInt iTotalMediaChanges; |
|
3758 |
|
3759 /** |
|
3760 Not currently used. |
|
3761 |
|
3762 Set this value to zero. |
|
3763 */ |
|
3764 TInt iTotalPrimarySupplies; |
|
3765 |
|
3766 union |
|
3767 { |
|
3768 /** |
|
3769 Indicates whether the SPI protocol is being used or not. |
|
3770 |
|
3771 SPI not currently supported; set this to EFalse. |
|
3772 */ |
|
3773 TBool iSPIMode; // SPI mode not yet supported |
|
3774 /** |
|
3775 Hardware configuration flags |
|
3776 */ |
|
3777 TUint32 iFlags; |
|
3778 }; |
|
3779 |
|
3780 /** |
|
3781 The number of the first peripheral bus slot claimed by the |
|
3782 MultiMediaCard controller. |
|
3783 |
|
3784 Symbian OS supports 4, so set this to a value in the range 0-3. |
|
3785 */ |
|
3786 TInt iBaseBusNumber; |
|
3787 }; |
|
3788 |
|
3789 |
|
3790 |
|
3791 |
|
3792 typedef TPckg<TMMCMachineInfo> TMMCardMachineInfoPckg; |
|
3793 |
|
3794 /** |
|
3795 Platform-specific configuration information for the |
|
3796 MultiMediaCard stack. Contains information pertinent to |
|
3797 MMC specification version 4.0/4.1 |
|
3798 |
|
3799 An object of this type is passed to the Variant implementation |
|
3800 of DMMCStack::MachineInfo(), which should fill the public data |
|
3801 members with appropriate information and values. |
|
3802 |
|
3803 @internalComponent |
|
3804 */ |
|
3805 class TMMCMachineInfoV4 : public TMMCMachineInfo |
|
3806 { |
|
3807 public: |
|
3808 inline TMMCMachineInfoV4() {memclr(this, sizeof(*this));} |
|
3809 |
|
3810 /** |
|
3811 The version of the structure returned by the PSL in a call to DMMStack::MachineInfo() |
|
3812 The fields defined in TMMCMachineInfoV4 are only valid if the version is EVersion4 or higher |
|
3813 */ |
|
3814 enum TVersion {EVersion3, EVersion4}; |
|
3815 TVersion iVersion; |
|
3816 |
|
3817 /** |
|
3818 The maximum bus width supported. |
|
3819 */ |
|
3820 TBusWidth iMaxBusWidth; |
|
3821 |
|
3822 /** |
|
3823 Maximum clock frequency supported, |
|
3824 N.B. if the controller's maximum clock rate is only slightly less than one of the |
|
3825 "high-speed" clock frequencies defined in MMC spec 4.0 (i.e 26 Mhz and 52 Mhz), then |
|
3826 it can still report that it is supported and then run at the slightly lower clock rate. |
|
3827 */ |
|
3828 enum THighSpeedClocks {EClockSpeed26Mhz = 26, EClockSpeed52Mhz = 52}; |
|
3829 TUint iMaxClockSpeedInMhz; |
|
3830 |
|
3831 /** |
|
3832 The power class supported for 3.6V (high voltage). |
|
3833 This is a 4-bit value encoded in the same way as the POWER_CLASS field in the EXT_CSD |
|
3834 register. i.e. 0=100mA, 1=120mA, ... 10=450mA. |
|
3835 See MMC sepcification version 4.1, EXT_CSD register. |
|
3836 */ |
|
3837 enum THiVoltagePowerClasses {EHi100mA, EHi120mA, EHi150mA, EHi180mA, EHi200mA, EHi220mA, EHi250mA, EHi300mA, EHi350mA, EHi400mA, EHi450mA }; |
|
3838 TUint iHighVoltagePowerClass; |
|
3839 |
|
3840 /** |
|
3841 The power class supported for 1.95V (low voltage). |
|
3842 This is a 4-bit value encoded in the same way as the POWER_CLASS field in the EXT_CSD |
|
3843 register. i.e. 0=65mA, 1=70mA, ... 10=250mA. |
|
3844 See MMC sepcification version 4.1, EXT_CSD register. |
|
3845 */ |
|
3846 enum TLoVoltagePowerClasses {ELo065mA, ELo070mA, ELo080mA, ELo090mA, ELo100mA, ELo120mA, ELo140mA, ELo160mA, ELo180mA, ELo200mA, ELo250mA }; |
|
3847 TUint iLowVoltagePowerClass; |
|
3848 }; |
|
3849 |
|
3850 |
|
3851 class DMMCPsu : public DPBusPsuBase |
|
3852 /** |
|
3853 DPBusPsuBase derived abstract class to control the MMC socket's power supply. |
|
3854 |
|
3855 This class is intended for derivation at the variant layer, which handles the |
|
3856 variant specific functionality of the power supply. |
|
3857 |
|
3858 @publishedPartner |
|
3859 @released |
|
3860 */ |
|
3861 { |
|
3862 public: |
|
3863 IMPORT_C DMMCPsu(TInt aPsuNum, TInt aMediaChangedNum); |
|
3864 |
|
3865 // Re-declaring virtual and pure-virtual interface defined in DPBusPsuBase for clarity... |
|
3866 |
|
3867 IMPORT_C virtual TInt DoCreate(); |
|
3868 |
|
3869 /** |
|
3870 * Controls the power supply. |
|
3871 * Implemented by the variant, directly controls the power to the MMC stack. |
|
3872 * @param aState A TPBusPsuState enumeration specifying the required state |
|
3873 * (EPsuOnFull, EPsuOff, EPsuOnCurLimit) |
|
3874 */ |
|
3875 virtual void DoSetState(TPBusPsuState aState)=0; |
|
3876 |
|
3877 /** |
|
3878 * Checks the PSU's voltage. |
|
3879 * Implemented by the variant, uses a mechanism such as a comparator to check |
|
3880 * the PSU's voltage level. Upon reciept of the voltage level (the process may |
|
3881 * be asynchronous), the variant calls ReceiveVoltageCheckResult() with KErrNone |
|
3882 * if the voltage is OK, KErrGeneral if there is a problem, or KErrNotReady if the |
|
3883 * hardware has not yet powered up. |
|
3884 */ |
|
3885 virtual void DoCheckVoltage()=0; |
|
3886 |
|
3887 /** |
|
3888 * Fills in the supplied TPBusPsuInfo object with the characteristics of the platform. |
|
3889 * Provided at the variant layer. |
|
3890 * @param anInfo A reference to a TPBusPsuInfo to be filled in with the PSU characteristics. |
|
3891 */ |
|
3892 virtual void PsuInfo(TPBusPsuInfo &anInfo)=0; |
|
3893 |
|
3894 inline void SetVoltage(TUint32 aVoltage); |
|
3895 |
|
3896 static void SleepCheck(TAny* aPtr); |
|
3897 |
|
3898 protected: |
|
3899 /** |
|
3900 * The current voltage setting, in OCR register format |
|
3901 */ |
|
3902 TUint32 iVoltageSetting; |
|
3903 }; |
|
3904 |
|
3905 class DMMCMediaChange : public DMediaChangeBase |
|
3906 /** |
|
3907 DMediaChangeBase derived abstract class to handle the isertion and removal of removable media. |
|
3908 |
|
3909 This class is intended for derivation at the variant layer, which handles the variant specific |
|
3910 functionality such as interrupt detection, and calls functions of the DMediaChangeBase class |
|
3911 to pass notifications of media change to the socket layers. |
|
3912 |
|
3913 @publishedPartner |
|
3914 @released |
|
3915 */ |
|
3916 { |
|
3917 public: |
|
3918 IMPORT_C DMMCMediaChange(TInt aMediaChangeNum); |
|
3919 |
|
3920 // Re-declaring virtual and pure-virtual interface defined in DMediaChangeBase for clarity... |
|
3921 |
|
3922 IMPORT_C virtual TInt Create(); |
|
3923 |
|
3924 /** |
|
3925 * Forces a media change, executing the same actions as if a door open has occurred. |
|
3926 * @see DoDoorOpen |
|
3927 */ |
|
3928 virtual void ForceMediaChange()=0; |
|
3929 |
|
3930 /** |
|
3931 * Called by DMediaChangeBase when the door is opened. |
|
3932 * Implemented at the variant layer, DoDoorOpen is invoked in response to the variant |
|
3933 * calling ::DoDoorOpenService upon detection of a door open event. |
|
3934 * DoDoorOpen may queue a debounce timer which masks further events until it expires. |
|
3935 * @see DoDoorClosed |
|
3936 */ |
|
3937 virtual void DoDoorOpen()=0; |
|
3938 |
|
3939 /** |
|
3940 * Called by DMediaChangeBase when the door is closed. |
|
3941 * Implemented at the variant layer, DoDoorClosed is invoked in response to the variant |
|
3942 * calling ::DoorOpenService upon detection of a door closed event. |
|
3943 * Systems without a door should perform this sequence when the debounce timer has |
|
3944 * expired after a door open event has been detected. |
|
3945 * @see DoDoorOpen |
|
3946 */ |
|
3947 virtual void DoDoorClosed()=0; |
|
3948 |
|
3949 /** |
|
3950 * Returns the current state of the door. |
|
3951 * Implemented at the variant layer to provide information as to the state of the door. |
|
3952 * @return TMediaState enumeration descibing the state of door (EDoorOpen, EDoorClosed). |
|
3953 */ |
|
3954 virtual TMediaState MediaState() = 0; |
|
3955 }; |
|
3956 |
|
3957 |
|
3958 /*===========================================================================*/ |
|
3959 /* CLASS : DMMCEmbeddedMediaChange */ |
|
3960 /*===========================================================================*/ |
|
3961 NONSHARABLE_CLASS(DMMCEmbeddedMediaChange) : public DMMCMediaChange |
|
3962 /** |
|
3963 * This class looks after the processing to be carried out when the media door |
|
3964 * is opened or closed. It may be queried without the interrupt being enabled. |
|
3965 * |
|
3966 */ |
|
3967 { |
|
3968 public: |
|
3969 DMMCEmbeddedMediaChange(TInt aMediaChangeNum) : DMMCMediaChange(aMediaChangeNum){}; |
|
3970 |
|
3971 /// Directly calls the media change event |
|
3972 virtual void ForceMediaChange() {return;}; |
|
3973 |
|
3974 /// Handle media door open (called on media door open interrupt). |
|
3975 virtual void DoDoorOpen() {return;}; |
|
3976 |
|
3977 /// Handle media door closing (called on media door open interrupt). |
|
3978 virtual void DoDoorClosed() {return;}; |
|
3979 |
|
3980 /// Return status of media changed signal. |
|
3981 virtual TMediaState MediaState() {return EDoorClosed;}; |
|
3982 }; |
|
3983 |
|
3984 |
|
3985 |
|
3986 class TMapping |
|
3987 /** |
|
3988 MMC Mapping |
|
3989 */ |
|
3990 { |
|
3991 public: |
|
3992 TBuf8<KMMCCIDLength> iCID; |
|
3993 TMediaPassword iPWD; |
|
3994 enum TState {EStPending, EStValid, EStInvalid}; |
|
3995 TState iState; |
|
3996 }; |
|
3997 |
|
3998 NONSHARABLE_CLASS(TMMCPasswordStore) : public TPasswordStore |
|
3999 /** |
|
4000 MMC Password Store |
|
4001 */ |
|
4002 { |
|
4003 public: |
|
4004 TMMCPasswordStore(); |
|
4005 |
|
4006 // Pure virtual... |
|
4007 TInt Init(); |
|
4008 TInt ReadPasswordData(TDes8 &aBuf); |
|
4009 TInt WritePasswordData(TDesC8 &aBuf); |
|
4010 TInt PasswordStoreLengthInBytes(); |
|
4011 |
|
4012 public: |
|
4013 TMapping *FindMappingInStore(const TCID &aCID); |
|
4014 TInt InsertMapping(const TCID &aCID, const TMediaPassword &aPWD, TMapping::TState aState); |
|
4015 IMPORT_C TBool IsMappingIncorrect(const TCID& aCID, const TMediaPassword& aPWD); |
|
4016 |
|
4017 static TInt CompareCID(const TMapping& aLeft, const TMapping& aRight); |
|
4018 TIdentityRelation<TMapping> iIdentityRelation; |
|
4019 |
|
4020 private: |
|
4021 RArray<TMapping> *iStore; |
|
4022 |
|
4023 friend class DMMCSocket; |
|
4024 }; |
|
4025 |
|
4026 class DMMCSocket : public DPBusSocket |
|
4027 /** |
|
4028 This DPBusSocket derived object oversees the power supplies |
|
4029 and media change functionality of DMMCStack Objects. A socket |
|
4030 directly corresponds to a single stack, which may support multiple cards. |
|
4031 |
|
4032 @publishedPartner |
|
4033 @released |
|
4034 */ |
|
4035 { |
|
4036 public: |
|
4037 IMPORT_C DMMCSocket(TInt aSocketNumber, TMMCPasswordStore* aPasswordStore); |
|
4038 |
|
4039 // Functions inherited from DPBusSocket |
|
4040 virtual TInt Init(); |
|
4041 virtual void InitiatePowerUpSequence(); |
|
4042 virtual TBool CardIsPresent(); |
|
4043 virtual void Reset1(); |
|
4044 virtual void Reset2(); |
|
4045 |
|
4046 TInt TotalSupportedCards(); |
|
4047 |
|
4048 // MMC specific functions |
|
4049 inline DMMCStack* Stack(TInt aBus); |
|
4050 inline void ResetInactivity(TInt aBus); |
|
4051 inline const TMMCMachineInfo& MachineInfo() const; |
|
4052 |
|
4053 virtual void AdjustPartialRead(const TMMCard* aCard, TUint32 aStart, TUint32 aEnd, TUint32* aPhysStart, TUint32* aPhysEnd) const; |
|
4054 virtual void GetBufferInfo(TUint8** aMDBuf, TInt* aMDBufLen); |
|
4055 virtual TInt PrepareStore(TInt aBus, TInt aFunc, TLocalDrivePasswordData &aData); |
|
4056 |
|
4057 inline TBool SupportsDoubleBuffering(); |
|
4058 inline TUint32 MaxDataTransferLength(); |
|
4059 inline TUint32 DmaAlignment(); |
|
4060 |
|
4061 protected: |
|
4062 // MMC specific functions |
|
4063 virtual void GetMachineInfo(); |
|
4064 |
|
4065 private: |
|
4066 // Password Store Control Functions |
|
4067 TInt PasswordControlStart(const TCID &aCID, const TMediaPassword *aPWD); |
|
4068 void PasswordControlEnd(DMMCSession *aSessP, TInt aResult); |
|
4069 TBool RefreshStore(); |
|
4070 |
|
4071 protected: |
|
4072 TMMCMachineInfo iMachineInfo; |
|
4073 TMMCPasswordStore* iPasswordStore; |
|
4074 |
|
4075 public: |
|
4076 DMMCStack* iStack; |
|
4077 DMMCPsu* iVccCore; |
|
4078 |
|
4079 private: |
|
4080 TUint32 iReserved[4]; |
|
4081 |
|
4082 public: |
|
4083 enum TMMCPanic |
|
4084 { |
|
4085 EMMCMachineStack =0, |
|
4086 EMMCMachineState =1, |
|
4087 EMMCSessRingNoSession =2, |
|
4088 EMMCStackSessionEngaged =3, |
|
4089 EMMCInitStackBlocked =4, |
|
4090 EMMCNoFreeRCA =5, |
|
4091 EMMCCommandStack =6, |
|
4092 EMMCRWSessionID =7, |
|
4093 EMMCEraseSessionID =8, |
|
4094 EMMCIOSessionID =9, |
|
4095 EMMCSessionNoPswdCard =10, |
|
4096 EMMCSessionPswdCmd =11, |
|
4097 EMMCSessionBadSessionID =12, |
|
4098 EMMCSetBusWidthNotImplemented =13, |
|
4099 EMMCInvalidNumberOfCardSlots =14, |
|
4100 EMMCBadBusWidth =15, |
|
4101 EMMCInvalidDBCommand =16, |
|
4102 EMMCInvalidDBBlockLength =17, |
|
4103 EMMCUnblockingInWrongContext =18, |
|
4104 EMMCInvalidCardNumber =19, |
|
4105 EMMCNotInDfcContext =20, |
|
4106 }; |
|
4107 IMPORT_C static void Panic(TMMCPanic aPanic); |
|
4108 friend class DMMCStack; |
|
4109 friend class DMMCSession; |
|
4110 friend class DMMCMediaChange; |
|
4111 }; |
|
4112 |
|
4113 const TUint32 KMMCEraseClassCmdsSupported= KBit0; |
|
4114 const TUint32 KMMCEraseGroupCmdsSupported= KBit1; |
|
4115 NONSHARABLE_CLASS(TMMCEraseInfo) |
|
4116 { |
|
4117 public: |
|
4118 inline TBool EraseClassCmdsSupported() const; |
|
4119 inline TBool EraseGroupCmdsSupported() const; |
|
4120 public: |
|
4121 TUint32 iEraseFlags; |
|
4122 TUint32 iPreferredEraseUnitSize; |
|
4123 TUint32 iMinEraseSectorSize; |
|
4124 }; |
|
4125 |
|
4126 #include <drivers/mmc.inl> |
|
4127 |
|
4128 #endif // __MMC_H__ |
|
4129 |