1 /*
2 * Copyright 2022 NXP
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <zephyr/drivers/sdhc.h>
8 #include <zephyr/kernel.h>
9 #include <zephyr/logging/log.h>
10 #include <zephyr/sd/mmc.h>
11 #include <zephyr/sd/sd.h>
12 #include <zephyr/sd/sd_spec.h>
13
14 #include "sd_ops.h"
15 #include "sd_utils.h"
16
17 /* These are used as specific arguments to commands */
18 /* For switch commands, the argument structure is:
19 * [31:26] : Set to 0
20 * [25:24] : Access
21 * [23:16] : Index (byte address in EXT_CSD)
22 * [15:8] : Value (data)
23 * [7:3] : Set to 0
24 * [2:0] : Cmd Set
25 */
26 #define MMC_SWITCH_8_BIT_DDR_BUS_ARG \
27 (0xFC000000 & (0U << 26)) + (0x03000000 & (0b11 << 24)) + (0x00FF0000 & (183U << 16)) + \
28 (0x0000FF00 & (6U << 8)) + (0x000000F7 & (0U << 3)) + (0x00000000 & (3U << 0))
29 #define MMC_SWITCH_8_BIT_BUS_ARG \
30 (0xFC000000 & (0U << 26)) + (0x03000000 & (0b11 << 24)) + (0x00FF0000 & (183U << 16)) + \
31 (0x0000FF00 & (2U << 8)) + (0x000000F7 & (0U << 3)) + (0x00000000 & (3U << 0))
32 #define MMC_SWITCH_4_BIT_BUS_ARG \
33 (0xFC000000 & (0U << 26)) + (0x03000000 & (0b11 << 24)) + (0x00FF0000 & (183U << 16)) + \
34 (0x0000FF00 & (1U << 8)) + (0x000000F7 & (0U << 3)) + (0x00000000 & (3U << 0))
35 #define MMC_SWITCH_HS_TIMING_ARG \
36 (0xFC000000 & (0U << 26)) + (0x03000000 & (0b11 << 24)) + (0x00FF0000 & (185U << 16)) + \
37 (0x0000FF00 & (1U << 8)) + (0x000000F7 & (0U << 3)) + (0x00000000 & (3U << 0))
38 #define MMC_SWITCH_HS400_TIMING_ARG \
39 (0xFC000000 & (0U << 26)) + (0x03000000 & (0b11 << 24)) + (0x00FF0000 & (185U << 16)) + \
40 (0x0000FF00 & (3U << 8)) + (0x000000F7 & (0U << 3)) + (0x00000000 & (3U << 0))
41 #define MMC_SWITCH_HS200_TIMING_ARG \
42 (0xFC000000 & (0U << 26)) + (0x03000000 & (0b11 << 24)) + (0x00FF0000 & (185U << 16)) + \
43 (0x0000FF00 & (2U << 8)) + (0x000000F7 & (0U << 3)) + (0x00000000 & (3U << 0))
44 #define MMC_RCA_ARG (CONFIG_MMC_RCA << 16U)
45 #define MMC_REL_ADR_ARG (card->relative_addr << 16U)
46 #define MMC_SWITCH_PWR_CLASS_ARG \
47 (0xFC000000 & (0U << 26)) + (0x03000000 & (0b11 << 24)) + (0x00FF0000 & (187U << 16)) + \
48 (0x0000FF00 & (0U << 8)) + (0x000000F7 & (0U << 3)) + (0x00000000 & (3U << 0))
49 #define MMC_SWITCH_CACHE_ON_ARG \
50 (0xFC000000 & (0U << 26)) + (0x03000000 & (0b11 << 24)) + (0x00FF0000 & (33U << 16)) + \
51 (0x0000FF00 & (1U << 8)) + (0x000000F7 & (0U << 3)) + (0x00000000 & (3U << 0))
52
53 LOG_MODULE_DECLARE(sd, CONFIG_SD_LOG_LEVEL);
54
mmc_write_blocks(struct sd_card * card,const uint8_t * wbuf,uint32_t start_block,uint32_t num_blocks)55 inline int mmc_write_blocks(struct sd_card *card, const uint8_t *wbuf, uint32_t start_block,
56 uint32_t num_blocks)
57 {
58 return card_write_blocks(card, wbuf, start_block, num_blocks);
59 }
60
mmc_read_blocks(struct sd_card * card,uint8_t * rbuf,uint32_t start_block,uint32_t num_blocks)61 inline int mmc_read_blocks(struct sd_card *card, uint8_t *rbuf, uint32_t start_block,
62 uint32_t num_blocks)
63 {
64 return card_read_blocks(card, rbuf, start_block, num_blocks);
65 }
66
mmc_ioctl(struct sd_card * card,uint8_t cmd,void * buf)67 inline int mmc_ioctl(struct sd_card *card, uint8_t cmd, void *buf)
68 {
69 return card_ioctl(card, cmd, buf);
70 }
71
72 /* Sends CMD1 */
73 static int mmc_send_op_cond(struct sd_card *card, int ocr);
74
75 /* Sends CMD3 */
76 static int mmc_set_rca(struct sd_card *card);
77
78 /* Sends CMD9 */
79 static int mmc_read_csd(struct sd_card *card, struct sd_csd *card_csd);
80 static inline void mmc_decode_csd(struct sd_csd *csd, uint32_t *raw_csd);
81
82 /* Sends CMD8 */
83 static int mmc_read_ext_csd(struct sd_card *card, struct mmc_ext_csd *card_ext_csd);
84 static inline void mmc_decode_ext_csd(struct mmc_ext_csd *ext_csd, uint8_t *raw);
85
86 /* Sets SDHC max frequency in legacy timing */
87 static inline int mmc_set_max_freq(struct sd_card *card, struct sd_csd *card_csd);
88
89 /* Sends CMD6 to switch bus width*/
90 static int mmc_set_bus_width(struct sd_card *card);
91
92 /* Sets card to the fastest timing mode (using CMD6) and SDHC to max frequency */
93 static int mmc_set_timing(struct sd_card *card, struct mmc_ext_csd *card_ext_csd);
94
95 /* Enable cache for emmc if applicable */
96 static int mmc_set_cache(struct sd_card *card, struct mmc_ext_csd *card_ext_csd);
97
98 /*
99 * Initialize MMC card for use with subsystem
100 */
mmc_card_init(struct sd_card * card)101 int mmc_card_init(struct sd_card *card)
102 {
103 int ret = 0;
104 uint32_t ocr_arg = 0U;
105 /* Keep CSDs on stack for reduced RAM usage */
106 struct sd_csd card_csd = {0};
107 struct mmc_ext_csd card_ext_csd = {0};
108
109 /* SPI is not supported for MMC */
110 if (card->host_props.is_spi) {
111 return -EINVAL;
112 }
113
114 /* Set OCR Arguments */
115 if (card->host_props.host_caps.vol_180_support) {
116 ocr_arg |= MMC_OCR_VDD170_195FLAG;
117 }
118 if (card->host_props.host_caps.vol_330_support ||
119 card->host_props.host_caps.vol_300_support) {
120 ocr_arg |= MMC_OCR_VDD27_36FLAG;
121 }
122 /* Modern SDHC always at least supports 512 byte block sizes,
123 * which is enough to support sectors
124 */
125 ocr_arg |= MMC_OCR_SECTOR_MODE;
126
127 /* CMD1 */
128 ret = mmc_send_op_cond(card, ocr_arg);
129 if (ret) {
130 LOG_DBG("Failed to query card OCR");
131 return ret;
132 }
133
134 /* CMD2 */
135 ret = card_read_cid(card);
136 if (ret) {
137 return ret;
138 }
139
140 /* CMD3 */
141 ret = mmc_set_rca(card);
142 if (ret) {
143 LOG_ERR("Failed on sending RCA to card");
144 return ret;
145 }
146
147 /* CMD9 */
148 ret = mmc_read_csd(card, &card_csd);
149 if (ret) {
150 return ret;
151 }
152
153 /* Set max bus clock in legacy timing to speed up initialization
154 * Currently only eMMC is supported for this command
155 * Legacy MMC cards will initialize slowly
156 */
157 ret = mmc_set_max_freq(card, &card_csd);
158 if (ret) {
159 return ret;
160 }
161
162 /* CMD7 */
163 ret = sdmmc_select_card(card);
164 if (ret) {
165 return ret;
166 }
167
168 /* CMD6: Set bus width to max supported*/
169 ret = mmc_set_bus_width(card);
170 if (ret) {
171 return ret;
172 }
173
174 /* CMD8 */
175 ret = mmc_read_ext_csd(card, &card_ext_csd);
176 if (ret) {
177 return ret;
178 }
179
180 /* Set timing to fastest supported */
181 ret = mmc_set_timing(card, &card_ext_csd);
182 if (ret) {
183 return ret;
184 }
185
186 /* Turn on cache if it exists */
187 ret = mmc_set_cache(card, &card_ext_csd);
188 if (ret) {
189 return ret;
190 }
191
192 return 0;
193 }
194
mmc_send_op_cond(struct sd_card * card,int ocr)195 static int mmc_send_op_cond(struct sd_card *card, int ocr)
196 {
197 struct sdhc_command cmd = {0};
198 int ret = 0;
199 int retries;
200
201 cmd.opcode = MMC_SEND_OP_COND;
202 cmd.arg = ocr;
203 cmd.response_type = SD_RSP_TYPE_R3;
204 cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT;
205
206 for (retries = 0;
207 retries < CONFIG_SD_OCR_RETRY_COUNT && !(cmd.response[0] & SD_OCR_PWR_BUSY_FLAG);
208 retries++) {
209 ret = sdhc_request(card->sdhc, &cmd, NULL);
210 if (ret) {
211 /* OCR failed */
212 return ret;
213 }
214 if (retries == 0) {
215 /* Card is MMC card if no error
216 * (Only MMC protocol supports CMD1)
217 */
218 card->type = CARD_MMC;
219 }
220 sd_delay(10);
221 }
222 if (retries >= CONFIG_SD_OCR_RETRY_COUNT) {
223 /* OCR timed out */
224 LOG_ERR("Card never left busy state");
225 return -ETIMEDOUT;
226 }
227 LOG_DBG("MMC responded to CMD1 after %d attempts", retries);
228
229 if (cmd.response[0] & MMC_OCR_VDD170_195FLAG) {
230 card->flags |= SD_1800MV_FLAG;
231 }
232 if (cmd.response[0] & MMC_OCR_VDD27_36FLAG) {
233 card->flags |= SD_3000MV_FLAG;
234 }
235
236 /* Switch to 1.8V */
237 if (card->host_props.host_caps.vol_180_support && (card->flags & SD_1800MV_FLAG)) {
238 card->bus_io.signal_voltage = SD_VOL_1_8_V;
239 ret = sdhc_set_io(card->sdhc, &card->bus_io);
240 if (ret) {
241 LOG_DBG("Failed to switch MMC host to 1.8V");
242 return ret;
243 }
244 sd_delay(10);
245
246 card->card_voltage = SD_VOL_1_8_V;
247 LOG_INF("Card switched to 1.8V signaling");
248 }
249
250 /* SD high Capacity is >2GB, the same as sector supporting MMC cards. */
251 if (cmd.response[0] & MMC_OCR_SECTOR_MODE) {
252 card->flags |= SD_HIGH_CAPACITY_FLAG;
253 }
254
255 return 0;
256 }
257
mmc_set_rca(struct sd_card * card)258 static int mmc_set_rca(struct sd_card *card)
259 {
260 struct sdhc_command cmd = {0};
261 int ret;
262
263 cmd.opcode = MMC_SEND_RELATIVE_ADDR;
264 cmd.arg = MMC_RCA_ARG;
265 cmd.response_type = SD_RSP_TYPE_R1;
266 cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT;
267
268 ret = sdhc_request(card->sdhc, &cmd, NULL);
269 if (ret) {
270 return ret;
271 }
272 ret = sd_check_response(&cmd);
273 if (ret) {
274 return ret;
275 }
276
277 card->relative_addr = CONFIG_MMC_RCA;
278
279 return 0;
280 }
281
mmc_read_csd(struct sd_card * card,struct sd_csd * card_csd)282 static int mmc_read_csd(struct sd_card *card, struct sd_csd *card_csd)
283 {
284 int ret;
285 struct sdhc_command cmd = {0};
286
287 cmd.opcode = SD_SEND_CSD;
288 cmd.arg = MMC_REL_ADR_ARG;
289 cmd.response_type = SD_RSP_TYPE_R2;
290 cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT;
291
292 ret = sdhc_request(card->sdhc, &cmd, NULL);
293 if (ret) {
294 LOG_DBG("CMD9 failed: %d", ret);
295 return ret;
296 }
297
298 mmc_decode_csd(card_csd, cmd.response);
299 if (card_csd->csd_structure < 2) {
300 LOG_ERR("Legacy MMC cards are not supported.");
301 return -ENOTSUP;
302 }
303
304 return 0;
305 }
306
mmc_decode_csd(struct sd_csd * csd,uint32_t * raw_csd)307 static inline void mmc_decode_csd(struct sd_csd *csd, uint32_t *raw_csd)
308 {
309 csd->csd_structure = (uint8_t)((raw_csd[3U] & 0xC0000000U) >> 30U);
310 csd->read_time1 = (uint8_t)((raw_csd[3U] & 0xFF0000U) >> 16U);
311 csd->read_time2 = (uint8_t)((raw_csd[3U] & 0xFF00U) >> 8U);
312 csd->xfer_rate = (uint8_t)(raw_csd[3U] & 0xFFU);
313 csd->cmd_class = (uint16_t)((raw_csd[2U] & 0xFFF00000U) >> 20U);
314 csd->read_blk_len = (uint8_t)((raw_csd[2U] & 0xF0000U) >> 16U);
315 if (raw_csd[2U] & 0x8000U) {
316 csd->flags |= SD_CSD_READ_BLK_PARTIAL_FLAG;
317 }
318 if (raw_csd[2U] & 0x4000U) {
319 csd->flags |= SD_CSD_READ_BLK_PARTIAL_FLAG;
320 }
321 if (raw_csd[2U] & 0x2000U) {
322 csd->flags |= SD_CSD_READ_BLK_MISALIGN_FLAG;
323 }
324 if (raw_csd[2U] & 0x1000U) {
325 csd->flags |= SD_CSD_DSR_IMPLEMENTED_FLAG;
326 }
327 csd->device_size =
328 (uint16_t)(((raw_csd[2U] & 0x3FFU) << 2U) + ((raw_csd[1U] & 0xC0000000U) >> 30U));
329 csd->read_current_min = (uint8_t)((raw_csd[1U] & 0x38000000U) >> 27U);
330 csd->read_current_max = (uint8_t)((raw_csd[1U] & 0x07000000U) >> 24U);
331 csd->write_current_min = (uint8_t)((raw_csd[1U] & 0x00E00000U) >> 21U);
332 csd->write_current_max = (uint8_t)((raw_csd[1U] & 0x001C0000U) >> 18U);
333 csd->dev_size_mul = (uint8_t)((raw_csd[1U] & 0x00038000U) >> 15U);
334 csd->erase_size = (uint8_t)((raw_csd[1U] & 0x00007C00U) >> 10U);
335 csd->write_prtect_size = (uint8_t)(raw_csd[1U] & 0x0000001FU);
336 csd->write_speed_factor = (uint8_t)((raw_csd[0U] & 0x1C000000U) >> 26U);
337 csd->write_blk_len = (uint8_t)((raw_csd[0U] & 0x03C00000U) >> 22U);
338 csd->file_fmt = (uint8_t)((raw_csd[0U] & 0x00000C00U) >> 10U);
339 }
340
mmc_set_max_freq(struct sd_card * card,struct sd_csd * card_csd)341 static inline int mmc_set_max_freq(struct sd_card *card, struct sd_csd *card_csd)
342 {
343 int ret;
344 enum mmc_csd_freq frequency_code = (card_csd->xfer_rate & 0x7);
345 enum mmc_csd_freq multiplier_code = (card_csd->xfer_rate & 0x78);
346
347 /* 4.3 - 5.1 emmc spec says 26 MHz */
348 if (frequency_code == MMC_MAXFREQ_10MHZ && multiplier_code == MMC_MAXFREQ_MULT_26) {
349 card->bus_io.clock = 26000000U;
350 card->bus_io.timing = SDHC_TIMING_LEGACY;
351 }
352 /* 4.0 - 4.2 emmc spec says 20 MHz */
353 else if (frequency_code == MMC_MAXFREQ_10MHZ && multiplier_code == MMC_MAXFREQ_MULT_20) {
354 card->bus_io.clock = 20000000U;
355 card->bus_io.timing = SDHC_TIMING_LEGACY;
356 } else {
357 LOG_INF("Using Legacy MMC will have slow initialization");
358 return 0;
359 }
360
361 ret = sdhc_set_io(card->sdhc, &card->bus_io);
362 if (ret) {
363 LOG_ERR("Error seetting initial clock frequency");
364 return ret;
365 }
366
367 return 0;
368 }
369
mmc_set_bus_width(struct sd_card * card)370 static int mmc_set_bus_width(struct sd_card *card)
371 {
372 int ret;
373 struct sdhc_command cmd = {0};
374
375 if (card->host_props.host_caps.bus_8_bit_support && card->bus_width == 8) {
376 cmd.arg = MMC_SWITCH_8_BIT_BUS_ARG;
377 card->bus_io.bus_width = SDHC_BUS_WIDTH8BIT;
378 } else if (card->host_props.host_caps.bus_4_bit_support && card->bus_width >= 4) {
379 cmd.arg = MMC_SWITCH_4_BIT_BUS_ARG;
380 card->bus_io.bus_width = SDHC_BUS_WIDTH4BIT;
381 } else {
382 /* If only 1 bit bus is supported, nothing to be done */
383 return 0;
384 }
385
386 /* Set Card Bus Width */
387 cmd.opcode = SD_SWITCH;
388 cmd.response_type = SD_RSP_TYPE_R1b;
389 cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT;
390 ret = sdhc_request(card->sdhc, &cmd, NULL);
391 sdmmc_wait_ready(card);
392 if (ret) {
393 LOG_ERR("Setting card data bus width failed: %d", ret);
394 return ret;
395 }
396
397 /* Set host controller bus width */
398 ret = sdhc_set_io(card->sdhc, &card->bus_io);
399 if (ret) {
400 LOG_ERR("Setting SDHC data bus width failed: %d", ret);
401 return ret;
402 }
403
404 return ret;
405 }
406
mmc_set_hs_timing(struct sd_card * card)407 static int mmc_set_hs_timing(struct sd_card *card)
408 {
409 int ret = 0;
410 struct sdhc_command cmd = {0};
411
412 /* Change Card Timing Mode */
413 cmd.opcode = SD_SWITCH;
414 cmd.arg = MMC_SWITCH_HS_TIMING_ARG;
415 cmd.response_type = SD_RSP_TYPE_R1b;
416 cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT;
417 ret = sdhc_request(card->sdhc, &cmd, NULL);
418 if (ret) {
419 LOG_DBG("Error setting bus timing: %d", ret);
420 return ret;
421 }
422 sdmmc_wait_ready(card);
423
424 /* Max frequency in HS mode is 52 MHz */
425 card->bus_io.clock = MMC_CLOCK_52MHZ;
426 card->bus_io.timing = SDHC_TIMING_HS;
427 /* Change SDHC bus timing */
428 ret = sdhc_set_io(card->sdhc, &card->bus_io);
429 if (ret) {
430 return ret;
431 }
432
433 return ret;
434 }
435
mmc_set_power_class_HS200(struct sd_card * card,struct mmc_ext_csd * ext)436 static int mmc_set_power_class_HS200(struct sd_card *card, struct mmc_ext_csd *ext)
437 {
438 int ret = 0;
439 struct sdhc_command cmd = {0};
440
441 cmd.opcode = SD_SWITCH;
442 cmd.arg = ((MMC_SWITCH_PWR_CLASS_ARG) | (ext->pwr_class_200MHZ_VCCQ195 << 8));
443 cmd.response_type = SD_RSP_TYPE_R1b;
444 cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT;
445 ret = sdhc_request(card->sdhc, &cmd, NULL);
446 sdmmc_wait_ready(card);
447 return ret;
448 }
449
mmc_set_timing(struct sd_card * card,struct mmc_ext_csd * ext)450 static int mmc_set_timing(struct sd_card *card, struct mmc_ext_csd *ext)
451 {
452 int ret = 0;
453 struct sdhc_command cmd = {0};
454
455 /* Timing depends on EXT_CSD register information */
456 if ((ext->device_type.MMC_HS200_SDR_1200MV || ext->device_type.MMC_HS200_SDR_1800MV) &&
457 (card->host_props.host_caps.hs200_support) &&
458 (card->bus_io.signal_voltage == SD_VOL_1_8_V) &&
459 (card->bus_io.bus_width >= SDHC_BUS_WIDTH4BIT)) {
460 ret = mmc_set_hs_timing(card);
461 if (ret) {
462 return ret;
463 }
464 cmd.arg = MMC_SWITCH_HS200_TIMING_ARG;
465 card->bus_io.clock = MMC_CLOCK_HS200;
466 card->bus_io.timing = SDHC_TIMING_HS200;
467 } else if (ext->device_type.MMC_HS_52_DV) {
468 return mmc_set_hs_timing(card);
469 } else if (ext->device_type.MMC_HS_26_DV) {
470 /* Nothing to do, card is already configured for this */
471 return 0;
472 } else {
473 return -ENOTSUP;
474 }
475
476 /* Set card timing mode */
477 cmd.opcode = SD_SWITCH;
478 cmd.response_type = SD_RSP_TYPE_R1b;
479 cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT;
480 ret = sdhc_request(card->sdhc, &cmd, NULL);
481 if (ret) {
482 LOG_DBG("Error setting bus timing: %d", ret);
483 return ret;
484 }
485 ret = sdmmc_wait_ready(card);
486 if (ret) {
487 return ret;
488 }
489 card->card_speed = ((cmd.arg & 0xFF << 8) >> 8);
490
491 /* Set power class to match timing mode */
492 if (card->card_speed == MMC_HS200_TIMING) {
493 ret = mmc_set_power_class_HS200(card, ext);
494 if (ret) {
495 return ret;
496 }
497 }
498
499 /* Set SDHC bus io parameters */
500 ret = sdhc_set_io(card->sdhc, &card->bus_io);
501 if (ret) {
502 return ret;
503 }
504
505 /* Execute Tuning for HS200 */
506 if (card->card_speed == MMC_HS200_TIMING) {
507 ret = sdhc_execute_tuning(card->sdhc);
508 if (ret) {
509 LOG_ERR("MMC Tuning failed: %d", ret);
510 return ret;
511 }
512 }
513
514 /* Switch to HS400 if applicable */
515 if ((ext->device_type.MMC_HS400_DDR_1200MV || ext->device_type.MMC_HS400_DDR_1800MV) &&
516 (card->host_props.host_caps.hs400_support) &&
517 (card->bus_io.bus_width == SDHC_BUS_WIDTH8BIT)) {
518 /* Switch back to regular HS timing */
519 ret = mmc_set_hs_timing(card);
520 if (ret) {
521 LOG_ERR("Switching MMC back to HS from HS200 during HS400 init failed.");
522 return ret;
523 }
524 /* Set bus width to DDR 8 bit */
525 cmd.opcode = SD_SWITCH;
526 cmd.arg = MMC_SWITCH_8_BIT_DDR_BUS_ARG;
527 cmd.response_type = SD_RSP_TYPE_R1b;
528 cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT;
529 ret = sdhc_request(card->sdhc, &cmd, NULL);
530 sdmmc_wait_ready(card);
531 if (ret) {
532 LOG_ERR("Setting DDR data bus width failed during HS400 init: %d", ret);
533 return ret;
534 }
535 /* Set card timing mode to HS400 */
536 cmd.opcode = SD_SWITCH;
537 cmd.arg = MMC_SWITCH_HS400_TIMING_ARG;
538 cmd.response_type = SD_RSP_TYPE_R1b;
539 cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT;
540 ret = sdhc_request(card->sdhc, &cmd, NULL);
541 if (ret) {
542 LOG_DBG("Error setting card to HS400 bus timing: %d", ret);
543 return ret;
544 }
545 ret = sdmmc_wait_ready(card);
546 if (ret) {
547 return ret;
548 }
549 /* Set SDHC bus io parameters */
550 card->bus_io.clock = MMC_CLOCK_HS400;
551 card->bus_io.timing = SDHC_TIMING_HS400;
552 ret = sdhc_set_io(card->sdhc, &card->bus_io);
553 if (ret) {
554 return ret;
555 }
556 card->card_speed = ((cmd.arg & 0xFF << 8) >> 8);
557 }
558 return ret;
559 }
560
mmc_read_ext_csd(struct sd_card * card,struct mmc_ext_csd * card_ext_csd)561 static int mmc_read_ext_csd(struct sd_card *card, struct mmc_ext_csd *card_ext_csd)
562 {
563 int ret;
564 struct sdhc_command cmd = {0};
565 struct sdhc_data data = {0};
566
567 cmd.opcode = MMC_SEND_EXT_CSD;
568 cmd.arg = 0;
569 cmd.response_type = SD_RSP_TYPE_R1;
570 cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT;
571
572 data.block_size = MMC_EXT_CSD_BYTES;
573 data.blocks = 1;
574 data.data = card->card_buffer;
575 data.timeout_ms = CONFIG_SD_DATA_TIMEOUT;
576
577 ret = sdhc_request(card->sdhc, &cmd, &data);
578 if (ret) {
579 LOG_ERR("CMD8 (send_ext_csd) failed: %d", ret);
580 return ret;
581 }
582
583 mmc_decode_ext_csd(card_ext_csd, card->card_buffer);
584 card->block_count = card_ext_csd->sec_count;
585 card->block_size = SDMMC_DEFAULT_BLOCK_SIZE;
586
587 LOG_INF("Card block count is %d, block size is %d", card->block_count, card->block_size);
588
589 return 0;
590 }
591
mmc_decode_ext_csd(struct mmc_ext_csd * ext,uint8_t * raw)592 static inline void mmc_decode_ext_csd(struct mmc_ext_csd *ext, uint8_t *raw)
593 {
594 ext->sec_count =
595 (raw[215U] << 24U) + (raw[214U] << 16U) + (raw[213U] << 8U) + (raw[212U] << 0U);
596 ext->bus_width = raw[183U];
597 ext->hs_timing = raw[185U];
598 ext->device_type.MMC_HS400_DDR_1200MV = ((1 << 7U) & raw[196U]);
599 ext->device_type.MMC_HS400_DDR_1800MV = ((1 << 6U) & raw[196U]);
600 ext->device_type.MMC_HS200_SDR_1200MV = ((1 << 5U) & raw[196U]);
601 ext->device_type.MMC_HS200_SDR_1800MV = ((1 << 4U) & raw[196U]);
602 ext->device_type.MMC_HS_DDR_1200MV = ((1 << 3U) & raw[196U]);
603 ext->device_type.MMC_HS_DDR_1800MV = ((1 << 2U) & raw[196U]);
604 ext->device_type.MMC_HS_52_DV = ((1 << 1U) & raw[196U]);
605 ext->device_type.MMC_HS_26_DV = ((1 << 0U) & raw[196U]);
606 ext->rev = raw[192U];
607 ext->power_class = (raw[187] & 0x0F);
608 ext->mmc_driver_strengths = raw[197U];
609 ext->pwr_class_200MHZ_VCCQ195 = raw[237U];
610 ext->cache_size =
611 (raw[252] << 24U) + (raw[251] << 16U) + (raw[250] << 8U) + (raw[249] << 0U);
612 }
613
mmc_set_cache(struct sd_card * card,struct mmc_ext_csd * card_ext_csd)614 static int mmc_set_cache(struct sd_card *card, struct mmc_ext_csd *card_ext_csd)
615 {
616 int ret = 0;
617 struct sdhc_command cmd = {0};
618
619 /* If there is no cache, don't use cache */
620 if (card_ext_csd->cache_size == 0) {
621 return 0;
622 }
623 /* CMD6 to write to EXT CSD to turn on cache */
624 cmd.opcode = SD_SWITCH;
625 cmd.arg = MMC_SWITCH_CACHE_ON_ARG;
626 cmd.response_type = SD_RSP_TYPE_R1b;
627 cmd.timeout_ms = CONFIG_SD_CMD_TIMEOUT;
628 ret = sdhc_request(card->sdhc, &cmd, NULL);
629 if (ret) {
630 LOG_DBG("Error turning on card cache: %d", ret);
631 return ret;
632 }
633 ret = sdmmc_wait_ready(card);
634 return ret;
635 }
636