sdmmc_common.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. /*
  2. * Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org>
  3. * Adaptations to ESP-IDF Copyright (c) 2016-2018 Espressif Systems (Shanghai) PTE LTD
  4. *
  5. * Permission to use, copy, modify, and distribute this software for any
  6. * purpose with or without fee is hereby granted, provided that the above
  7. * copyright notice and this permission notice appear in all copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  10. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  11. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  12. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  13. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  14. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  15. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  16. */
  17. #include <inttypes.h>
  18. #include "sdmmc_common.h"
  19. static const char* TAG = "sdmmc_common";
  20. esp_err_t sdmmc_init_ocr(sdmmc_card_t* card)
  21. {
  22. esp_err_t err;
  23. /* In SPI mode, READ_OCR (CMD58) command is used to figure out which voltage
  24. * ranges the card can support. This step is skipped since 1.8V isn't
  25. * supported on the ESP32.
  26. */
  27. uint32_t host_ocr = get_host_ocr(card->host.io_voltage);
  28. if ((card->ocr & SD_OCR_SDHC_CAP) != 0) {
  29. host_ocr |= SD_OCR_SDHC_CAP;
  30. }
  31. /* Send SEND_OP_COND (ACMD41) command to the card until it becomes ready. */
  32. err = sdmmc_send_cmd_send_op_cond(card, host_ocr, &card->ocr);
  33. /* If time-out, re-try send_op_cond as MMC */
  34. if (err == ESP_ERR_TIMEOUT && !host_is_spi(card)) {
  35. ESP_LOGD(TAG, "send_op_cond timeout, trying MMC");
  36. card->is_mmc = 1;
  37. err = sdmmc_send_cmd_send_op_cond(card, host_ocr, &card->ocr);
  38. }
  39. if (err != ESP_OK) {
  40. ESP_LOGE(TAG, "%s: send_op_cond (1) returned 0x%x", __func__, err);
  41. return err;
  42. }
  43. if (host_is_spi(card)) {
  44. err = sdmmc_send_cmd_read_ocr(card, &card->ocr);
  45. if (err != ESP_OK) {
  46. ESP_LOGE(TAG, "%s: read_ocr returned 0x%x", __func__, err);
  47. return err;
  48. }
  49. }
  50. ESP_LOGD(TAG, "host_ocr=0x%" PRIx32 " card_ocr=0x%" PRIx32, host_ocr, card->ocr);
  51. /* Clear all voltage bits in host's OCR which the card doesn't support.
  52. * Don't touch CCS bit because in SPI mode cards don't report CCS in ACMD41
  53. * response.
  54. */
  55. host_ocr &= (card->ocr | (~SD_OCR_VOL_MASK));
  56. ESP_LOGD(TAG, "sdmmc_card_init: host_ocr=%08" PRIx32 ", card_ocr=%08" PRIx32, host_ocr, card->ocr);
  57. return ESP_OK;
  58. }
  59. esp_err_t sdmmc_init_cid(sdmmc_card_t* card)
  60. {
  61. esp_err_t err;
  62. sdmmc_response_t raw_cid;
  63. if (!host_is_spi(card)) {
  64. err = sdmmc_send_cmd_all_send_cid(card, &raw_cid);
  65. if (err != ESP_OK) {
  66. ESP_LOGE(TAG, "%s: all_send_cid returned 0x%x", __func__, err);
  67. return err;
  68. }
  69. if (!card->is_mmc) {
  70. err = sdmmc_decode_cid(raw_cid, &card->cid);
  71. if (err != ESP_OK) {
  72. ESP_LOGE(TAG, "%s: decoding CID failed (0x%x)", __func__, err);
  73. return err;
  74. }
  75. } else {
  76. /* For MMC, need to know CSD to decode CID. But CSD can only be read
  77. * in data transfer mode, and it is not possible to read CID in data
  78. * transfer mode. We temporiliy store the raw cid and do the
  79. * decoding after the RCA is set and the card is in data transfer
  80. * mode.
  81. */
  82. memcpy(card->raw_cid, raw_cid, sizeof(sdmmc_response_t));
  83. }
  84. } else {
  85. err = sdmmc_send_cmd_send_cid(card, &card->cid);
  86. if (err != ESP_OK) {
  87. ESP_LOGE(TAG, "%s: send_cid returned 0x%x", __func__, err);
  88. return err;
  89. }
  90. }
  91. return ESP_OK;
  92. }
  93. esp_err_t sdmmc_init_rca(sdmmc_card_t* card)
  94. {
  95. esp_err_t err;
  96. err = sdmmc_send_cmd_set_relative_addr(card, &card->rca);
  97. if (err != ESP_OK) {
  98. ESP_LOGE(TAG, "%s: set_relative_addr returned 0x%x", __func__, err);
  99. return err;
  100. }
  101. return ESP_OK;
  102. }
  103. esp_err_t sdmmc_init_mmc_decode_cid(sdmmc_card_t* card)
  104. {
  105. esp_err_t err;
  106. sdmmc_response_t raw_cid;
  107. memcpy(raw_cid, card->raw_cid, sizeof(raw_cid));
  108. err = sdmmc_mmc_decode_cid(card->csd.mmc_ver, raw_cid, &card->cid);
  109. if (err != ESP_OK) {
  110. ESP_LOGE(TAG, "%s: decoding CID failed (0x%x)", __func__, err);
  111. return err;
  112. }
  113. return ESP_OK;
  114. }
  115. esp_err_t sdmmc_init_csd(sdmmc_card_t* card)
  116. {
  117. assert(card->is_mem == 1);
  118. /* Get and decode the contents of CSD register. Determine card capacity. */
  119. esp_err_t err = sdmmc_send_cmd_send_csd(card, &card->csd);
  120. if (err != ESP_OK) {
  121. ESP_LOGE(TAG, "%s: send_csd returned 0x%x", __func__, err);
  122. return err;
  123. }
  124. const size_t max_sdsc_capacity = UINT32_MAX / card->csd.sector_size + 1;
  125. if (!(card->ocr & SD_OCR_SDHC_CAP) &&
  126. card->csd.capacity > max_sdsc_capacity) {
  127. ESP_LOGW(TAG, "%s: SDSC card reports capacity=%u. Limiting to %u.",
  128. __func__, card->csd.capacity, max_sdsc_capacity);
  129. card->csd.capacity = max_sdsc_capacity;
  130. }
  131. return ESP_OK;
  132. }
  133. esp_err_t sdmmc_init_select_card(sdmmc_card_t* card)
  134. {
  135. assert(!host_is_spi(card));
  136. esp_err_t err = sdmmc_send_cmd_select_card(card, card->rca);
  137. if (err != ESP_OK) {
  138. ESP_LOGE(TAG, "%s: select_card returned 0x%x", __func__, err);
  139. return err;
  140. }
  141. return ESP_OK;
  142. }
  143. esp_err_t sdmmc_init_card_hs_mode(sdmmc_card_t* card)
  144. {
  145. esp_err_t err = ESP_ERR_NOT_SUPPORTED;
  146. if (card->is_mem && !card->is_mmc) {
  147. err = sdmmc_enable_hs_mode_and_check(card);
  148. } else if (card->is_sdio) {
  149. err = sdmmc_io_enable_hs_mode(card);
  150. } else if (card->is_mmc){
  151. err = sdmmc_mmc_enable_hs_mode(card);
  152. }
  153. if (err == ESP_ERR_NOT_SUPPORTED) {
  154. ESP_LOGD(TAG, "%s: host supports HS mode, but card doesn't", __func__);
  155. card->max_freq_khz = SDMMC_FREQ_DEFAULT;
  156. } else if (err != ESP_OK) {
  157. return err;
  158. }
  159. return ESP_OK;
  160. }
  161. esp_err_t sdmmc_init_host_bus_width(sdmmc_card_t* card)
  162. {
  163. int bus_width = 1;
  164. if ((card->host.flags & SDMMC_HOST_FLAG_4BIT) &&
  165. (card->log_bus_width == 2)) {
  166. bus_width = 4;
  167. } else if ((card->host.flags & SDMMC_HOST_FLAG_8BIT) &&
  168. (card->log_bus_width == 3)) {
  169. bus_width = 8;
  170. }
  171. ESP_LOGD(TAG, "%s: using %d-bit bus", __func__, bus_width);
  172. if (bus_width > 1) {
  173. esp_err_t err = (*card->host.set_bus_width)(card->host.slot, bus_width);
  174. if (err != ESP_OK) {
  175. ESP_LOGE(TAG, "host.set_bus_width failed (0x%x)", err);
  176. return err;
  177. }
  178. }
  179. return ESP_OK;
  180. }
  181. esp_err_t sdmmc_init_host_frequency(sdmmc_card_t* card)
  182. {
  183. esp_err_t err;
  184. assert(card->max_freq_khz <= card->host.max_freq_khz);
  185. if (card->max_freq_khz > SDMMC_FREQ_PROBING) {
  186. err = (*card->host.set_card_clk)(card->host.slot, card->max_freq_khz);
  187. if (err != ESP_OK) {
  188. ESP_LOGE(TAG, "failed to switch bus frequency (0x%x)", err);
  189. return err;
  190. }
  191. }
  192. if (card->host.input_delay_phase != SDMMC_DELAY_PHASE_0) {
  193. if (card->host.set_input_delay) {
  194. err = (*card->host.set_input_delay)(card->host.slot, card->host.input_delay_phase);
  195. if (err != ESP_OK) {
  196. ESP_LOGE(TAG, "host.set_input_delay failed (0x%x)", err);
  197. return err;
  198. }
  199. } else {
  200. ESP_LOGE(TAG, "input phase delay feature isn't supported");
  201. return ESP_ERR_NOT_SUPPORTED;
  202. }
  203. }
  204. err = (*card->host.get_real_freq)(card->host.slot, &(card->real_freq_khz));
  205. if (err != ESP_OK) {
  206. ESP_LOGE(TAG, "failed to get real working frequency (0x%x)", err);
  207. return err;
  208. }
  209. if (card->is_ddr) {
  210. if (card->host.set_bus_ddr_mode == NULL) {
  211. ESP_LOGE(TAG, "host doesn't support DDR mode or voltage switching");
  212. return ESP_ERR_NOT_SUPPORTED;
  213. }
  214. err = (*card->host.set_bus_ddr_mode)(card->host.slot, true);
  215. if (err != ESP_OK) {
  216. ESP_LOGE(TAG, "failed to switch bus to DDR mode (0x%x)", err);
  217. return err;
  218. }
  219. }
  220. return ESP_OK;
  221. }
  222. void sdmmc_flip_byte_order(uint32_t* response, size_t size)
  223. {
  224. assert(size % (2 * sizeof(uint32_t)) == 0);
  225. const size_t n_words = size / sizeof(uint32_t);
  226. for (int i = 0; i < n_words / 2; ++i) {
  227. uint32_t left = __builtin_bswap32(response[i]);
  228. uint32_t right = __builtin_bswap32(response[n_words - i - 1]);
  229. response[i] = right;
  230. response[n_words - i - 1] = left;
  231. }
  232. }
  233. void sdmmc_card_print_info(FILE* stream, const sdmmc_card_t* card)
  234. {
  235. bool print_scr = false;
  236. bool print_csd = false;
  237. const char* type;
  238. fprintf(stream, "Name: %s\n", card->cid.name);
  239. if (card->is_sdio) {
  240. type = "SDIO";
  241. print_scr = true;
  242. print_csd = true;
  243. } else if (card->is_mmc) {
  244. type = "MMC";
  245. print_csd = true;
  246. } else {
  247. type = (card->ocr & SD_OCR_SDHC_CAP) ? "SDHC/SDXC" : "SDSC";
  248. print_csd = true;
  249. }
  250. fprintf(stream, "Type: %s\n", type);
  251. if (card->real_freq_khz == 0) {
  252. fprintf(stream, "Speed: N/A\n");
  253. } else {
  254. const char *freq_unit = card->real_freq_khz < 1000 ? "kHz" : "MHz";
  255. const float freq = card->real_freq_khz < 1000 ? card->real_freq_khz : card->real_freq_khz / 1000.0;
  256. const char *max_freq_unit = card->max_freq_khz < 1000 ? "kHz" : "MHz";
  257. const float max_freq = card->max_freq_khz < 1000 ? card->max_freq_khz : card->max_freq_khz / 1000.0;
  258. fprintf(stream, "Speed: %.2f %s (limit: %.2f %s)%s\n", freq, freq_unit, max_freq, max_freq_unit, card->is_ddr ? ", DDR" : "");
  259. }
  260. fprintf(stream, "Size: %lluMB\n", ((uint64_t) card->csd.capacity) * card->csd.sector_size / (1024 * 1024));
  261. if (print_csd) {
  262. fprintf(stream, "CSD: ver=%d, sector_size=%d, capacity=%d read_bl_len=%d\n",
  263. (int) (card->is_mmc ? card->csd.csd_ver : card->csd.csd_ver + 1),
  264. card->csd.sector_size, card->csd.capacity, card->csd.read_block_len);
  265. if (card->is_mmc) {
  266. fprintf(stream, "EXT CSD: bus_width=%" PRIu32 "\n", (uint32_t) (1 << card->log_bus_width));
  267. } else if (!card->is_sdio){ // make sure card is SD
  268. fprintf(stream, "SSR: bus_width=%" PRIu32 "\n", (uint32_t) (card->ssr.cur_bus_width ? 4 : 1));
  269. }
  270. }
  271. if (print_scr) {
  272. fprintf(stream, "SCR: sd_spec=%d, bus_width=%d\n", card->scr.sd_spec, card->scr.bus_width);
  273. }
  274. }
  275. esp_err_t sdmmc_fix_host_flags(sdmmc_card_t* card)
  276. {
  277. const uint32_t width_1bit = SDMMC_HOST_FLAG_1BIT;
  278. const uint32_t width_4bit = SDMMC_HOST_FLAG_4BIT;
  279. const uint32_t width_8bit = SDMMC_HOST_FLAG_8BIT;
  280. const uint32_t width_mask = width_1bit | width_4bit | width_8bit;
  281. int slot_bit_width = card->host.get_bus_width(card->host.slot);
  282. if (slot_bit_width == 1 &&
  283. (card->host.flags & (width_4bit | width_8bit))) {
  284. card->host.flags &= ~width_mask;
  285. card->host.flags |= width_1bit;
  286. } else if (slot_bit_width == 4 && (card->host.flags & width_8bit)) {
  287. if ((card->host.flags & width_4bit) == 0) {
  288. ESP_LOGW(TAG, "slot width set to 4, but host flags don't have 4 line mode enabled; using 1 line mode");
  289. card->host.flags &= ~width_mask;
  290. card->host.flags |= width_1bit;
  291. } else {
  292. card->host.flags &= ~width_mask;
  293. card->host.flags |= width_4bit;
  294. }
  295. }
  296. return ESP_OK;
  297. }
  298. uint32_t sdmmc_get_erase_timeout_ms(const sdmmc_card_t* card, int arg, size_t erase_size_kb)
  299. {
  300. if (card->is_mmc) {
  301. return sdmmc_mmc_get_erase_timeout_ms(card, arg, erase_size_kb);
  302. } else {
  303. return sdmmc_sd_get_erase_timeout_ms(card, arg, erase_size_kb);
  304. }
  305. }