sdmmc_common_mh.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  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 "sdmmc_common_mh.h"
  18. bool card_is_mmc = 0;
  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. card_is_mmc = 1;
  38. err = sdmmc_send_cmd_send_op_cond(card, host_ocr, &card->ocr);
  39. }
  40. if (err != ESP_OK) {
  41. ESP_LOGE(TAG, "%s: send_op_cond (1) returned 0x%x", __func__, err);
  42. return err;
  43. }
  44. if (host_is_spi(card)) {
  45. err = sdmmc_send_cmd_read_ocr(card, &card->ocr);
  46. if (err != ESP_OK) {
  47. ESP_LOGE(TAG, "%s: read_ocr returned 0x%x", __func__, err);
  48. return err;
  49. }
  50. }
  51. ESP_LOGD(TAG, "host_ocr=0x%x card_ocr=0x%x", host_ocr, card->ocr);
  52. /* Clear all voltage bits in host's OCR which the card doesn't support.
  53. * Don't touch CCS bit because in SPI mode cards don't report CCS in ACMD41
  54. * response.
  55. */
  56. host_ocr &= (card->ocr | (~SD_OCR_VOL_MASK));
  57. ESP_LOGD(TAG, "sdmmc_card_init: host_ocr=%08x, card_ocr=%08x", host_ocr, card->ocr);
  58. return ESP_OK;
  59. }
  60. esp_err_t sdmmc_init_cid(sdmmc_card_t* card)
  61. {
  62. esp_err_t err;
  63. sdmmc_response_t raw_cid;
  64. if (!host_is_spi(card)) {
  65. err = sdmmc_send_cmd_all_send_cid(card, &raw_cid);
  66. if (err != ESP_OK) {
  67. ESP_LOGE(TAG, "%s: all_send_cid returned 0x%x", __func__, err);
  68. return err;
  69. }
  70. if (!card->is_mmc) {
  71. err = sdmmc_decode_cid(raw_cid, &card->cid);
  72. if (err != ESP_OK) {
  73. ESP_LOGE(TAG, "%s: decoding CID failed (0x%x)", __func__, err);
  74. return err;
  75. }
  76. } else {
  77. /* For MMC, need to know CSD to decode CID. But CSD can only be read
  78. * in data transfer mode, and it is not possible to read CID in data
  79. * transfer mode. We temporiliy store the raw cid and do the
  80. * decoding after the RCA is set and the card is in data transfer
  81. * mode.
  82. */
  83. memcpy(card->raw_cid, raw_cid, sizeof(sdmmc_response_t));
  84. }
  85. } else {
  86. err = sdmmc_send_cmd_send_cid(card, &card->cid);
  87. if (err != ESP_OK) {
  88. ESP_LOGE(TAG, "%s: send_cid returned 0x%x", __func__, err);
  89. return err;
  90. }
  91. }
  92. return ESP_OK;
  93. }
  94. esp_err_t sdmmc_init_rca(sdmmc_card_t* card)
  95. {
  96. esp_err_t err;
  97. err = sdmmc_send_cmd_set_relative_addr(card, &card->rca);
  98. if (err != ESP_OK) {
  99. ESP_LOGE(TAG, "%s: set_relative_addr returned 0x%x", __func__, err);
  100. return err;
  101. }
  102. return ESP_OK;
  103. }
  104. esp_err_t sdmmc_init_mmc_decode_cid(sdmmc_card_t* card)
  105. {
  106. esp_err_t err;
  107. sdmmc_response_t raw_cid;
  108. memcpy(raw_cid, card->raw_cid, sizeof(raw_cid));
  109. err = sdmmc_mmc_decode_cid(card->csd.mmc_ver, raw_cid, &card->cid);
  110. if (err != ESP_OK) {
  111. ESP_LOGE(TAG, "%s: decoding CID failed (0x%x)", __func__, err);
  112. return err;
  113. }
  114. return ESP_OK;
  115. }
  116. esp_err_t sdmmc_init_csd(sdmmc_card_t* card)
  117. {
  118. assert(card->is_mem == 1);
  119. /* Get and decode the contents of CSD register. Determine card capacity. */
  120. esp_err_t err = sdmmc_send_cmd_send_csd(card, &card->csd);
  121. if (err != ESP_OK) {
  122. ESP_LOGE(TAG, "%s: send_csd returned 0x%x", __func__, err);
  123. return err;
  124. }
  125. const size_t max_sdsc_capacity = UINT32_MAX / card->csd.sector_size + 1;
  126. if (!(card->ocr & SD_OCR_SDHC_CAP) &&
  127. card->csd.capacity > max_sdsc_capacity) {
  128. ESP_LOGW(TAG, "%s: SDSC card reports capacity=%u. Limiting to %u.",
  129. __func__, card->csd.capacity, max_sdsc_capacity);
  130. card->csd.capacity = max_sdsc_capacity;
  131. }
  132. return ESP_OK;
  133. }
  134. esp_err_t sdmmc_init_select_card(sdmmc_card_t* card)
  135. {
  136. assert(!host_is_spi(card));
  137. esp_err_t err = sdmmc_send_cmd_select_card(card, card->rca);
  138. if (err != ESP_OK) {
  139. ESP_LOGE(TAG, "%s: select_card returned 0x%x", __func__, err);
  140. return err;
  141. }
  142. return ESP_OK;
  143. }
  144. esp_err_t sdmmc_init_card_hs_mode(sdmmc_card_t* card)
  145. {
  146. esp_err_t err = ESP_ERR_NOT_SUPPORTED;
  147. if (card->is_mem && !card->is_mmc) {
  148. err = sdmmc_enable_hs_mode_and_check(card);
  149. } else if (card->is_sdio) {
  150. err = sdmmc_io_enable_hs_mode(card);
  151. } else if (card->is_mmc){
  152. err = sdmmc_mmc_enable_hs_mode(card);
  153. }
  154. if (err == ESP_ERR_NOT_SUPPORTED) {
  155. ESP_LOGD(TAG, "%s: host supports HS mode, but card doesn't", __func__);
  156. card->max_freq_khz = SDMMC_FREQ_DEFAULT;
  157. } else if (err != ESP_OK) {
  158. return err;
  159. }
  160. return ESP_OK;
  161. }
  162. esp_err_t sdmmc_init_host_bus_width(sdmmc_card_t* card)
  163. {
  164. int bus_width = 1;
  165. if ((card->host.flags & SDMMC_HOST_FLAG_4BIT) &&
  166. (card->log_bus_width == 2)) {
  167. bus_width = 4;
  168. } else if ((card->host.flags & SDMMC_HOST_FLAG_8BIT) &&
  169. (card->log_bus_width == 3)) {
  170. bus_width = 8;
  171. }
  172. ESP_LOGD(TAG, "%s: using %d-bit bus", __func__, bus_width);
  173. if (bus_width > 1) {
  174. esp_err_t err = (*card->host.set_bus_width)(card->host.slot, bus_width);
  175. if (err != ESP_OK) {
  176. ESP_LOGE(TAG, "host.set_bus_width failed (0x%x)", err);
  177. return err;
  178. }
  179. }
  180. return ESP_OK;
  181. }
  182. esp_err_t sdmmc_init_host_frequency(sdmmc_card_t* card)
  183. {
  184. assert(card->max_freq_khz <= card->host.max_freq_khz);
  185. /* Find highest frequency in the following list,
  186. * which is below card->max_freq_khz.
  187. */
  188. const uint32_t freq_values[] = {
  189. SDMMC_FREQ_52M,
  190. SDMMC_FREQ_HIGHSPEED,
  191. SDMMC_FREQ_26M,
  192. SDMMC_FREQ_DEFAULT
  193. //NOTE: in sdspi mode, 20MHz may not work. in that case, add 10MHz here.
  194. };
  195. const int n_freq_values = sizeof(freq_values) / sizeof(freq_values[0]);
  196. uint32_t selected_freq = SDMMC_FREQ_PROBING;
  197. for (int i = 0; i < n_freq_values; ++i) {
  198. uint32_t freq = freq_values[i];
  199. if (card->max_freq_khz >= freq) {
  200. selected_freq = freq;
  201. break;
  202. }
  203. }
  204. ESP_LOGD(TAG, "%s: using %d kHz bus frequency", __func__, selected_freq);
  205. if (selected_freq > SDMMC_FREQ_PROBING) {
  206. esp_err_t err = (*card->host.set_card_clk)(card->host.slot, selected_freq);
  207. if (err != ESP_OK) {
  208. ESP_LOGE(TAG, "failed to switch bus frequency (0x%x)", err);
  209. return err;
  210. }
  211. }
  212. if (card->is_ddr) {
  213. if (card->host.set_bus_ddr_mode == NULL) {
  214. ESP_LOGE(TAG, "host doesn't support DDR mode or voltage switching");
  215. return ESP_ERR_NOT_SUPPORTED;
  216. }
  217. esp_err_t err = (*card->host.set_bus_ddr_mode)(card->host.slot, true);
  218. if (err != ESP_OK) {
  219. ESP_LOGE(TAG, "failed to switch bus to DDR mode (0x%x)", err);
  220. return err;
  221. }
  222. }
  223. return ESP_OK;
  224. }
  225. void sdmmc_flip_byte_order(uint32_t* response, size_t size)
  226. {
  227. assert(size % (2 * sizeof(uint32_t)) == 0);
  228. const size_t n_words = size / sizeof(uint32_t);
  229. for (int i = 0; i < n_words / 2; ++i) {
  230. uint32_t left = __builtin_bswap32(response[i]);
  231. uint32_t right = __builtin_bswap32(response[n_words - i - 1]);
  232. response[i] = right;
  233. response[n_words - i - 1] = left;
  234. }
  235. }
  236. void sdmmc_card_print_info(FILE* stream, const sdmmc_card_t* card)
  237. {
  238. bool print_scr = false;
  239. bool print_csd = false;
  240. const char* type;
  241. fprintf(stream, "Name: %s\n", card->cid.name);
  242. if (card->is_sdio) {
  243. type = "SDIO";
  244. print_scr = true;
  245. print_csd = true;
  246. } else if (card->is_mmc) {
  247. type = "MMC";
  248. print_csd = true;
  249. } else {
  250. type = (card->ocr & SD_OCR_SDHC_CAP) ? "SDHC/SDXC" : "SDSC";
  251. print_csd = true;
  252. }
  253. fprintf(stream, "Type: %s\n", type);
  254. if (card->max_freq_khz < 1000) {
  255. fprintf(stream, "Speed: %d kHz\n", card->max_freq_khz);
  256. } else {
  257. fprintf(stream, "Speed: %d MHz%s\n", card->max_freq_khz / 1000,
  258. 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. (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=%d\n", (1 << card->log_bus_width));
  267. } else if (!card->is_sdio){ // make sure card is SD
  268. fprintf(stream, "SSR: bus_width=%d\n", (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. }