MmcDebug.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /** @file
  2. *
  3. * Copyright (c) 2011-2013, ARM Limited. All rights reserved.
  4. *
  5. * This program and the accompanying materials
  6. * are licensed and made available under the terms and conditions of the BSD License
  7. * which accompanies this distribution. The full text of the license may be found at
  8. * http://opensource.org/licenses/bsd-license.php
  9. *
  10. * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
  12. *
  13. **/
  14. #include "Mmc.h"
  15. #if !defined(MDEPKG_NDEBUG)
  16. CONST CHAR8* mStrUnit[] = { "100kbit/s", "1Mbit/s", "10Mbit/s", "100MBit/s",
  17. "Unknown", "Unknown", "Unknown", "Unknown" };
  18. CONST CHAR8* mStrValue[] = { "1.0", "1.2", "1.3", "1.5", "2.0", "2.5", "3.0", "3.5", "4.0", "4.5", "5.0",
  19. "Unknown", "Unknown", "Unknown", "Unknown" };
  20. #endif
  21. VOID
  22. PrintCID (
  23. IN UINT32* Cid
  24. )
  25. {
  26. DEBUG ((EFI_D_ERROR, "- PrintCID\n"));
  27. DEBUG ((EFI_D_ERROR, "\t- Manufacturing date: %d/%d\n", (Cid[0] >> 8) & 0xF, (Cid[0] >> 12) & 0xFF));
  28. DEBUG ((EFI_D_ERROR, "\t- Product serial number: 0x%X%X\n", Cid[1] & 0xFFFFFF, (Cid[0] >> 24) & 0xFF));
  29. DEBUG ((EFI_D_ERROR, "\t- Product revision: %d\n", Cid[1] >> 24));
  30. //DEBUG ((EFI_D_ERROR, "\t- Product name: %s\n", (char*)(Cid + 2)));
  31. DEBUG ((EFI_D_ERROR, "\t- OEM ID: %c%c\n", (Cid[3] >> 8) & 0xFF, (Cid[3] >> 16) & 0xFF));
  32. }
  33. VOID
  34. PrintCSD (
  35. IN UINT32* Csd
  36. )
  37. {
  38. UINTN Value;
  39. if (((Csd[2] >> 30) & 0x3) == 0) {
  40. DEBUG ((EFI_D_ERROR, "- PrintCSD Version 1.01-1.10/Version 2.00/Standard Capacity\n"));
  41. } else if (((Csd[2] >> 30) & 0x3) == 1) {
  42. DEBUG ((EFI_D_ERROR, "- PrintCSD Version 2.00/High Capacity\n"));
  43. } else {
  44. DEBUG ((EFI_D_ERROR, "- PrintCSD Version Higher than v3.3\n"));
  45. }
  46. DEBUG ((EFI_D_ERROR, "\t- Supported card command class: 0x%X\n", MMC_CSD_GET_CCC (Csd)));
  47. DEBUG ((EFI_D_ERROR, "\t- Speed: %a %a\n",mStrValue[(MMC_CSD_GET_TRANSPEED (Csd) >> 3) & 0xF],mStrUnit[MMC_CSD_GET_TRANSPEED (Csd) & 7]));
  48. DEBUG ((EFI_D_ERROR, "\t- Maximum Read Data Block: %d\n",2 << (MMC_CSD_GET_READBLLEN (Csd)-1)));
  49. DEBUG ((EFI_D_ERROR, "\t- Maximum Write Data Block: %d\n",2 << (MMC_CSD_GET_WRITEBLLEN (Csd)-1)));
  50. if (!MMC_CSD_GET_FILEFORMATGRP (Csd)) {
  51. Value = MMC_CSD_GET_FILEFORMAT (Csd);
  52. if (Value == 0) {
  53. DEBUG ((EFI_D_ERROR, "\t- Format (0): Hard disk-like file system with partition table\n"));
  54. } else if (Value == 1) {
  55. DEBUG ((EFI_D_ERROR, "\t- Format (1): DOS FAT (floppy-like) with boot sector only (no partition table)\n"));
  56. } else if (Value == 2) {
  57. DEBUG ((EFI_D_ERROR, "\t- Format (2): Universal File Format\n"));
  58. } else {
  59. DEBUG ((EFI_D_ERROR, "\t- Format (3): Others/Unknown\n"));
  60. }
  61. } else {
  62. DEBUG ((EFI_D_ERROR, "\t- Format: Reserved\n"));
  63. }
  64. }
  65. VOID
  66. PrintRCA (
  67. IN UINT32 Rca
  68. )
  69. {
  70. DEBUG ((EFI_D_ERROR, "- PrintRCA: 0x%X\n", Rca));
  71. DEBUG ((EFI_D_ERROR, "\t- Status: 0x%X\n", Rca & 0xFFFF));
  72. DEBUG ((EFI_D_ERROR, "\t- RCA: 0x%X\n", (Rca >> 16) & 0xFFFF));
  73. }
  74. VOID
  75. PrintOCR (
  76. IN UINT32 Ocr
  77. )
  78. {
  79. UINTN MinV;
  80. UINTN MaxV;
  81. UINTN Volts;
  82. UINTN Loop;
  83. MinV = 36; // 3.6
  84. MaxV = 20; // 2.0
  85. Volts = 20; // 2.0
  86. // The MMC register bits [23:8] indicate the working range of the card
  87. for (Loop = 8; Loop < 24; Loop++) {
  88. if (Ocr & (1 << Loop)) {
  89. if (MinV > Volts) {
  90. MinV = Volts;
  91. }
  92. if (MaxV < Volts) {
  93. MaxV = Volts + 1;
  94. }
  95. }
  96. Volts++;
  97. }
  98. DEBUG ((EFI_D_ERROR, "- PrintOCR Ocr (0x%X)\n",Ocr));
  99. DEBUG ((EFI_D_ERROR, "\t- Card operating voltage: %d.%d to %d.%d\n", MinV/10, MinV % 10, MaxV/10, MaxV % 10));
  100. if (((Ocr >> 29) & 3) == 0) {
  101. DEBUG ((EFI_D_ERROR, "\t- AccessMode: Byte Mode\n"));
  102. } else {
  103. DEBUG ((EFI_D_ERROR, "\t- AccessMode: Block Mode (0x%X)\n", ((Ocr >> 29) & 3)));
  104. }
  105. if (Ocr & MMC_OCR_POWERUP) {
  106. DEBUG ((EFI_D_ERROR, "\t- PowerUp\n"));
  107. } else {
  108. DEBUG ((EFI_D_ERROR, "\t- Voltage Not Supported\n"));
  109. }
  110. }
  111. VOID
  112. PrintResponseR1 (
  113. IN UINT32 Response
  114. )
  115. {
  116. DEBUG ((EFI_D_INFO, "Response: 0x%X\n", Response));
  117. if (Response & MMC_R0_READY_FOR_DATA) {
  118. DEBUG ((EFI_D_INFO, "\t- READY_FOR_DATA\n"));
  119. }
  120. switch ((Response >> 9) & 0xF) {
  121. case 0:
  122. DEBUG ((EFI_D_INFO, "\t- State: Idle\n"));
  123. break;
  124. case 1:
  125. DEBUG ((EFI_D_INFO, "\t- State: Ready\n"));
  126. break;
  127. case 2:
  128. DEBUG ((EFI_D_INFO, "\t- State: Ident\n"));
  129. break;
  130. case 3:
  131. DEBUG ((EFI_D_INFO, "\t- State: StandBy\n"));
  132. break;
  133. case 4:
  134. DEBUG ((EFI_D_INFO, "\t- State: Tran\n"));
  135. break;
  136. case 5:
  137. DEBUG ((EFI_D_INFO, "\t- State: Data\n"));
  138. break;
  139. case 6:
  140. DEBUG ((EFI_D_INFO, "\t- State: Rcv\n"));
  141. break;
  142. case 7:
  143. DEBUG ((EFI_D_INFO, "\t- State: Prg\n"));
  144. break;
  145. case 8:
  146. DEBUG ((EFI_D_INFO, "\t- State: Dis\n"));
  147. break;
  148. default:
  149. DEBUG ((EFI_D_INFO, "\t- State: Reserved\n"));
  150. break;
  151. }
  152. }