dev_mmc.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792
  1. /*
  2. * Copyright (c) 2006-2024, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2015-06-15 hichard first version
  9. * 2024-05-25 HPMicro add HS400 support
  10. */
  11. #include <drivers/dev_mmcsd_core.h>
  12. #include <drivers/dev_mmc.h>
  13. #define DBG_TAG "SDIO"
  14. #ifdef RT_SDIO_DEBUG
  15. #define DBG_LVL DBG_LOG
  16. #else
  17. #define DBG_LVL DBG_INFO
  18. #endif /* RT_SDIO_DEBUG */
  19. #include <rtdbg.h>
  20. static const rt_uint32_t tran_unit[] =
  21. {
  22. 10000, 100000, 1000000, 10000000,
  23. 0, 0, 0, 0
  24. };
  25. static const rt_uint8_t tran_value[] =
  26. {
  27. 0, 10, 12, 13, 15, 20, 25, 30,
  28. 35, 40, 45, 50, 55, 60, 70, 80,
  29. };
  30. static const rt_uint32_t tacc_uint[] =
  31. {
  32. 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000,
  33. };
  34. static const rt_uint8_t tacc_value[] =
  35. {
  36. 0, 10, 12, 13, 15, 20, 25, 30,
  37. 35, 40, 45, 50, 55, 60, 70, 80,
  38. };
  39. rt_inline rt_uint32_t GET_BITS(rt_uint32_t *resp,
  40. rt_uint32_t start,
  41. rt_uint32_t size)
  42. {
  43. const rt_int32_t __size = size;
  44. const rt_uint32_t __mask = (__size < 32 ? 1 << __size : 0) - 1;
  45. const rt_int32_t __off = 3 - ((start) / 32);
  46. const rt_int32_t __shft = (start) & 31;
  47. rt_uint32_t __res;
  48. __res = resp[__off] >> __shft;
  49. if (__size + __shft > 32)
  50. __res |= resp[__off - 1] << ((32 - __shft) % 32);
  51. return __res & __mask;
  52. }
  53. /*
  54. * Given a 128-bit response, decode to our card CSD structure.
  55. */
  56. static rt_int32_t mmcsd_parse_csd(struct rt_mmcsd_card *card)
  57. {
  58. rt_uint32_t a, b;
  59. struct rt_mmcsd_csd *csd = &card->csd;
  60. rt_uint32_t *resp = card->resp_csd;
  61. /*
  62. * We only understand CSD structure v1.1 and v1.2.
  63. * v1.2 has extra information in bits 15, 11 and 10.
  64. * We also support eMMC v4.4 & v4.41.
  65. */
  66. csd->csd_structure = GET_BITS(resp, 126, 2);
  67. if (csd->csd_structure == 0)
  68. {
  69. LOG_E("unrecognised CSD structure version %d!", csd->csd_structure);
  70. return -RT_ERROR;
  71. }
  72. csd->taac = GET_BITS(resp, 112, 8);
  73. csd->nsac = GET_BITS(resp, 104, 8);
  74. csd->tran_speed = GET_BITS(resp, 96, 8);
  75. csd->card_cmd_class = GET_BITS(resp, 84, 12);
  76. csd->rd_blk_len = GET_BITS(resp, 80, 4);
  77. csd->rd_blk_part = GET_BITS(resp, 79, 1);
  78. csd->wr_blk_misalign = GET_BITS(resp, 78, 1);
  79. csd->rd_blk_misalign = GET_BITS(resp, 77, 1);
  80. csd->dsr_imp = GET_BITS(resp, 76, 1);
  81. csd->c_size = GET_BITS(resp, 62, 12);
  82. csd->c_size_mult = GET_BITS(resp, 47, 3);
  83. csd->r2w_factor = GET_BITS(resp, 26, 3);
  84. csd->wr_blk_len = GET_BITS(resp, 22, 4);
  85. csd->wr_blk_partial = GET_BITS(resp, 21, 1);
  86. csd->csd_crc = GET_BITS(resp, 1, 7);
  87. card->card_blksize = 1 << csd->rd_blk_len;
  88. card->tacc_clks = csd->nsac * 100;
  89. card->tacc_ns = (tacc_uint[csd->taac & 0x07] * tacc_value[(csd->taac & 0x78) >> 3] + 9) / 10;
  90. card->max_data_rate = tran_unit[csd->tran_speed & 0x07] * tran_value[(csd->tran_speed & 0x78) >> 3];
  91. if (csd->wr_blk_len >= 9)
  92. {
  93. a = GET_BITS(resp, 42, 5);
  94. b = GET_BITS(resp, 37, 5);
  95. card->erase_size = (a + 1) * (b + 1);
  96. card->erase_size <<= csd->wr_blk_len - 9;
  97. }
  98. return 0;
  99. }
  100. /*
  101. * Read extended CSD.
  102. */
  103. static int mmc_get_ext_csd(struct rt_mmcsd_card *card, rt_uint8_t **new_ext_csd)
  104. {
  105. void *ext_csd;
  106. struct rt_mmcsd_req req;
  107. struct rt_mmcsd_cmd cmd;
  108. struct rt_mmcsd_data data;
  109. *new_ext_csd = RT_NULL;
  110. if (GET_BITS(card->resp_csd, 122, 4) < 4)
  111. return 0;
  112. /*
  113. * As the ext_csd is so large and mostly unused, we don't store the
  114. * raw block in mmc_card.
  115. */
  116. ext_csd = rt_malloc(512);
  117. if (!ext_csd)
  118. {
  119. LOG_E("alloc memory failed when get ext csd!");
  120. return -RT_ENOMEM;
  121. }
  122. rt_memset(&req, 0, sizeof(struct rt_mmcsd_req));
  123. rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
  124. rt_memset(&data, 0, sizeof(struct rt_mmcsd_data));
  125. req.cmd = &cmd;
  126. req.data = &data;
  127. cmd.cmd_code = SEND_EXT_CSD;
  128. cmd.arg = 0;
  129. /* NOTE HACK: the RESP_SPI_R1 is always correct here, but we
  130. * rely on callers to never use this with "native" calls for reading
  131. * CSD or CID. Native versions of those commands use the R2 type,
  132. * not R1 plus a data block.
  133. */
  134. cmd.flags = RESP_SPI_R1 | RESP_R1 | CMD_ADTC;
  135. data.blksize = 512;
  136. data.blks = 1;
  137. data.flags = DATA_DIR_READ;
  138. data.buf = ext_csd;
  139. /*
  140. * Some cards require longer data read timeout than indicated in CSD.
  141. * Address this by setting the read timeout to a "reasonably high"
  142. * value. For the cards tested, 300ms has proven enough. If necessary,
  143. * this value can be increased if other problematic cards require this.
  144. */
  145. data.timeout_ns = 300000000;
  146. data.timeout_clks = 0;
  147. mmcsd_send_request(card->host, &req);
  148. if (cmd.err)
  149. return cmd.err;
  150. if (data.err)
  151. return data.err;
  152. *new_ext_csd = ext_csd;
  153. return 0;
  154. }
  155. /*
  156. * Decode extended CSD.
  157. */
  158. static int mmc_parse_ext_csd(struct rt_mmcsd_card *card, rt_uint8_t *ext_csd)
  159. {
  160. rt_uint64_t card_capacity = 0;
  161. struct rt_mmcsd_host *host;
  162. if (card == RT_NULL || ext_csd == RT_NULL)
  163. {
  164. LOG_E("emmc parse ext csd fail, invaild args");
  165. return -1;
  166. }
  167. host = card->host;
  168. uint8_t device_type = ext_csd[EXT_CSD_CARD_TYPE];
  169. if ((host->flags & MMCSD_SUP_HS400) && (device_type & EXT_CSD_CARD_TYPE_HS400))
  170. {
  171. card->flags |= CARD_FLAG_HS400;
  172. card->max_data_rate = 200000000;
  173. }
  174. else if ((host->flags & MMCSD_SUP_HS200) && (device_type & EXT_CSD_CARD_TYPE_HS200))
  175. {
  176. card->flags |= CARD_FLAG_HS200;
  177. card->max_data_rate = 200000000;
  178. }
  179. else if ((host->flags & MMCSD_SUP_HIGHSPEED_DDR) && (device_type & EXT_CSD_CARD_TYPE_DDR_52))
  180. {
  181. card->flags |= CARD_FLAG_HIGHSPEED_DDR;
  182. card->hs_max_data_rate = 52000000;
  183. }
  184. else
  185. {
  186. card->flags |= CARD_FLAG_HIGHSPEED;
  187. card->hs_max_data_rate = 52000000;
  188. }
  189. if (ext_csd[EXT_CSD_STROBE_SUPPORT] != 0)
  190. {
  191. card->ext_csd.enhanced_data_strobe = 1;
  192. }
  193. card->ext_csd.cache_size =
  194. ext_csd[EXT_CSD_CACHE_SIZE + 0] << 0 |
  195. ext_csd[EXT_CSD_CACHE_SIZE + 1] << 8 |
  196. ext_csd[EXT_CSD_CACHE_SIZE + 2] << 16 |
  197. ext_csd[EXT_CSD_CACHE_SIZE + 3] << 24;
  198. card_capacity = *((rt_uint32_t *)&ext_csd[EXT_CSD_SEC_CNT]);
  199. card->card_sec_cnt = card_capacity;
  200. card_capacity *= card->card_blksize;
  201. card_capacity >>= 10; /* unit:KB */
  202. card->card_capacity = card_capacity;
  203. LOG_I("emmc card capacity %d KB, card sec count:%d.", card->card_capacity, card->card_sec_cnt);
  204. return 0;
  205. }
  206. /**
  207. * mmc_switch - modify EXT_CSD register
  208. * @card: the MMC card associated with the data transfer
  209. * @set: cmd set values
  210. * @index: EXT_CSD register index
  211. * @value: value to program into EXT_CSD register
  212. *
  213. * Modifies the EXT_CSD register for selected card.
  214. */
  215. static int mmc_switch(struct rt_mmcsd_card *card, rt_uint8_t set,
  216. rt_uint8_t index, rt_uint8_t value)
  217. {
  218. int err;
  219. struct rt_mmcsd_host *host = card->host;
  220. struct rt_mmcsd_cmd cmd = {0};
  221. cmd.cmd_code = SWITCH;
  222. cmd.arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
  223. (index << 16) | (value << 8) | set;
  224. cmd.flags = RESP_R1B | CMD_AC;
  225. err = mmcsd_send_cmd(host, &cmd, 3);
  226. if (err)
  227. return err;
  228. return 0;
  229. }
  230. static int mmc_compare_ext_csds(struct rt_mmcsd_card *card,
  231. rt_uint8_t *ext_csd, rt_uint32_t bus_width)
  232. {
  233. rt_uint8_t *bw_ext_csd;
  234. int err;
  235. if (bus_width == MMCSD_BUS_WIDTH_1)
  236. return 0;
  237. err = mmc_get_ext_csd(card, &bw_ext_csd);
  238. if (err || bw_ext_csd == RT_NULL)
  239. {
  240. err = -RT_ERROR;
  241. goto out;
  242. }
  243. /* only compare read only fields */
  244. err = !((ext_csd[EXT_CSD_PARTITION_SUPPORT] == bw_ext_csd[EXT_CSD_PARTITION_SUPPORT]) &&
  245. (ext_csd[EXT_CSD_ERASED_MEM_CONT] == bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) &&
  246. (ext_csd[EXT_CSD_REV] == bw_ext_csd[EXT_CSD_REV]) &&
  247. (ext_csd[EXT_CSD_STRUCTURE] == bw_ext_csd[EXT_CSD_STRUCTURE]) &&
  248. (ext_csd[EXT_CSD_CARD_TYPE] == bw_ext_csd[EXT_CSD_CARD_TYPE]) &&
  249. (ext_csd[EXT_CSD_S_A_TIMEOUT] == bw_ext_csd[EXT_CSD_S_A_TIMEOUT]) &&
  250. (ext_csd[EXT_CSD_HC_WP_GRP_SIZE] == bw_ext_csd[EXT_CSD_HC_WP_GRP_SIZE]) &&
  251. (ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT] == bw_ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT]) &&
  252. (ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] == bw_ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]) &&
  253. (ext_csd[EXT_CSD_SEC_TRIM_MULT] == bw_ext_csd[EXT_CSD_SEC_TRIM_MULT]) &&
  254. (ext_csd[EXT_CSD_SEC_ERASE_MULT] == bw_ext_csd[EXT_CSD_SEC_ERASE_MULT]) &&
  255. (ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT] == bw_ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]) &&
  256. (ext_csd[EXT_CSD_TRIM_MULT] == bw_ext_csd[EXT_CSD_TRIM_MULT]) &&
  257. (ext_csd[EXT_CSD_SEC_CNT + 0] == bw_ext_csd[EXT_CSD_SEC_CNT + 0]) &&
  258. (ext_csd[EXT_CSD_SEC_CNT + 1] == bw_ext_csd[EXT_CSD_SEC_CNT + 1]) &&
  259. (ext_csd[EXT_CSD_SEC_CNT + 2] == bw_ext_csd[EXT_CSD_SEC_CNT + 2]) &&
  260. (ext_csd[EXT_CSD_SEC_CNT + 3] == bw_ext_csd[EXT_CSD_SEC_CNT + 3]) &&
  261. (ext_csd[EXT_CSD_PWR_CL_52_195] == bw_ext_csd[EXT_CSD_PWR_CL_52_195]) &&
  262. (ext_csd[EXT_CSD_PWR_CL_26_195] == bw_ext_csd[EXT_CSD_PWR_CL_26_195]) &&
  263. (ext_csd[EXT_CSD_PWR_CL_52_360] == bw_ext_csd[EXT_CSD_PWR_CL_52_360]) &&
  264. (ext_csd[EXT_CSD_PWR_CL_26_360] == bw_ext_csd[EXT_CSD_PWR_CL_26_360]) &&
  265. (ext_csd[EXT_CSD_PWR_CL_200_195] == bw_ext_csd[EXT_CSD_PWR_CL_200_195]) &&
  266. (ext_csd[EXT_CSD_PWR_CL_200_360] == bw_ext_csd[EXT_CSD_PWR_CL_200_360]) &&
  267. (ext_csd[EXT_CSD_PWR_CL_DDR_52_195] == bw_ext_csd[EXT_CSD_PWR_CL_DDR_52_195]) &&
  268. (ext_csd[EXT_CSD_PWR_CL_DDR_52_360] == bw_ext_csd[EXT_CSD_PWR_CL_DDR_52_360]) &&
  269. (ext_csd[EXT_CSD_PWR_CL_DDR_200_360] == bw_ext_csd[EXT_CSD_PWR_CL_DDR_200_360]));
  270. if (err)
  271. err = -RT_ERROR;
  272. out:
  273. rt_free(bw_ext_csd);
  274. return err;
  275. }
  276. /*
  277. * Select the bus width among 4-bit and 8-bit(SDR).
  278. * If the bus width is changed successfully, return the selected width value.
  279. * Zero is returned instead of error value if the wide width is not supported.
  280. */
  281. static int mmc_select_bus_width(struct rt_mmcsd_card *card, rt_uint8_t *ext_csd)
  282. {
  283. rt_uint32_t ext_csd_bits[][2] =
  284. {
  285. {EXT_CSD_BUS_WIDTH_8, EXT_CSD_DDR_BUS_WIDTH_8},
  286. {EXT_CSD_BUS_WIDTH_4, EXT_CSD_DDR_BUS_WIDTH_4},
  287. {EXT_CSD_BUS_WIDTH_1, EXT_CSD_BUS_WIDTH_1},
  288. };
  289. rt_uint32_t bus_widths[] =
  290. {
  291. MMCSD_BUS_WIDTH_8,
  292. MMCSD_BUS_WIDTH_4,
  293. MMCSD_BUS_WIDTH_1
  294. };
  295. struct rt_mmcsd_host *host = card->host;
  296. unsigned idx, bus_width = 0;
  297. int err = 0, ddr = 0;
  298. if (GET_BITS(card->resp_csd, 122, 4) < 4)
  299. return 0;
  300. if (card->flags & CARD_FLAG_HIGHSPEED_DDR)
  301. {
  302. ddr = 2;
  303. }
  304. /*
  305. * Unlike SD, MMC cards don't have a configuration register to notify
  306. * supported bus width. So bus test command should be run to identify
  307. * the supported bus width or compare the EXT_CSD values of current
  308. * bus width and EXT_CSD values of 1 bit mode read earlier.
  309. */
  310. for (idx = 0; idx < sizeof(bus_widths) / sizeof(rt_uint32_t); idx++)
  311. {
  312. /*
  313. * Determine BUS WIDTH mode according to the capability of host
  314. */
  315. if (((ext_csd_bits[idx][0] == EXT_CSD_BUS_WIDTH_8) && ((host->flags & MMCSD_BUSWIDTH_8) == 0)) ||
  316. ((ext_csd_bits[idx][0] == EXT_CSD_BUS_WIDTH_4) && ((host->flags & MMCSD_BUSWIDTH_4) == 0)))
  317. {
  318. continue;
  319. }
  320. bus_width = bus_widths[idx];
  321. if (bus_width == MMCSD_BUS_WIDTH_1)
  322. {
  323. ddr = 0;
  324. }
  325. err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
  326. EXT_CSD_BUS_WIDTH,
  327. ext_csd_bits[idx][0]);
  328. if (err)
  329. continue;
  330. mmcsd_set_bus_width(host, bus_width);
  331. err = mmc_compare_ext_csds(card, ext_csd, bus_width);
  332. if (!err)
  333. {
  334. break;
  335. }
  336. else
  337. {
  338. switch (ext_csd_bits[idx][0])
  339. {
  340. case 0:
  341. LOG_E("switch to bus width 1 bit failed!");
  342. break;
  343. case 1:
  344. LOG_E("switch to bus width 4 bit failed!");
  345. break;
  346. case 2:
  347. LOG_E("switch to bus width 8 bit failed!");
  348. break;
  349. default:
  350. break;
  351. }
  352. }
  353. }
  354. if (!err && ddr)
  355. {
  356. err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
  357. EXT_CSD_BUS_WIDTH,
  358. ext_csd_bits[idx][1]);
  359. }
  360. if (!err)
  361. {
  362. if (card->flags & (CARD_FLAG_HIGHSPEED | CARD_FLAG_HIGHSPEED_DDR))
  363. {
  364. err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
  365. EXT_CSD_HS_TIMING,
  366. 1);
  367. }
  368. }
  369. return err;
  370. }
  371. rt_err_t mmc_send_op_cond(struct rt_mmcsd_host *host,
  372. rt_uint32_t ocr, rt_uint32_t *rocr)
  373. {
  374. struct rt_mmcsd_cmd cmd;
  375. rt_uint32_t i;
  376. rt_err_t err = RT_EOK;
  377. rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
  378. cmd.cmd_code = SEND_OP_COND;
  379. cmd.arg = controller_is_spi(host) ? 0 : ocr;
  380. cmd.flags = RESP_SPI_R1 | RESP_R3 | CMD_BCR;
  381. for (i = 100; i; i--)
  382. {
  383. err = mmcsd_send_cmd(host, &cmd, 3);
  384. if (err)
  385. break;
  386. /* if we're just probing, do a single pass */
  387. if (ocr == 0)
  388. break;
  389. /* otherwise wait until reset completes */
  390. if (controller_is_spi(host))
  391. {
  392. if (!(cmd.resp[0] & R1_SPI_IDLE))
  393. break;
  394. }
  395. else
  396. {
  397. if (cmd.resp[0] & CARD_BUSY)
  398. break;
  399. }
  400. err = -RT_ETIMEOUT;
  401. rt_thread_mdelay(10); //delay 10ms
  402. }
  403. if (rocr && !controller_is_spi(host))
  404. *rocr = cmd.resp[0];
  405. return err;
  406. }
  407. static rt_err_t mmc_set_card_addr(struct rt_mmcsd_host *host, rt_uint32_t rca)
  408. {
  409. rt_err_t err;
  410. struct rt_mmcsd_cmd cmd;
  411. rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
  412. cmd.cmd_code = SET_RELATIVE_ADDR;
  413. cmd.arg = rca << 16;
  414. cmd.flags = RESP_R1 | CMD_AC;
  415. err = mmcsd_send_cmd(host, &cmd, 3);
  416. if (err)
  417. return err;
  418. return 0;
  419. }
  420. static int mmc_select_hs200(struct rt_mmcsd_card *card)
  421. {
  422. int ret;
  423. ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
  424. EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS200);
  425. if (ret)
  426. return ret;
  427. mmcsd_set_timing(card->host, MMCSD_TIMING_MMC_HS200);
  428. mmcsd_set_clock(card->host, card->max_data_rate);
  429. ret = mmcsd_excute_tuning(card);
  430. return ret;
  431. }
  432. static int mmc_switch_to_hs400(struct rt_mmcsd_card *card)
  433. {
  434. struct rt_mmcsd_host *host = card->host;
  435. int err;
  436. rt_uint8_t ext_csd_bus_width;
  437. rt_uint32_t hs_timing;
  438. /* Switch to HS_TIMING to 0x01 (High Speed) */
  439. err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
  440. EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS);
  441. if (err != RT_EOK)
  442. {
  443. return err;
  444. }
  445. mmcsd_set_timing(card->host, MMCSD_TIMING_MMC_HS);
  446. /* Host changes frequency to <= 52MHz */
  447. mmcsd_set_clock(card->host, 52000000);
  448. rt_bool_t support_enhanced_ds = ((card->ext_csd.enhanced_data_strobe != 0) &&
  449. ((host->flags & MMCSD_SUP_ENH_DS) != 0));
  450. /* Set the bus width to:
  451. * 0x86 if enhanced data strobe is supported, or
  452. * 0x06 if enhanced data strobe is not supported
  453. */
  454. ext_csd_bus_width = support_enhanced_ds ?
  455. EXT_CSD_DDR_BUS_WIDTH_8_EH_DS :
  456. EXT_CSD_DDR_BUS_WIDTH_8;
  457. err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
  458. EXT_CSD_BUS_WIDTH,
  459. ext_csd_bus_width);
  460. if (err != RT_EOK)
  461. {
  462. return err;
  463. }
  464. /* Set HS_TIMING to 0x03 (HS400) */
  465. err = mmc_switch(card,
  466. EXT_CSD_CMD_SET_NORMAL,
  467. EXT_CSD_HS_TIMING,
  468. EXT_CSD_TIMING_HS400);
  469. if (err != RT_EOK)
  470. {
  471. return err;
  472. }
  473. /* Change the Host timing accordingly */
  474. hs_timing = support_enhanced_ds ?
  475. MMCSD_TIMING_MMC_HS400_ENH_DS :
  476. MMCSD_TIMING_MMC_HS400;
  477. mmcsd_set_timing(host, hs_timing);
  478. /* Host may changes frequency to <= 200MHz */
  479. mmcsd_set_clock(card->host, card->max_data_rate);
  480. return RT_EOK;
  481. }
  482. static int mmc_select_hs400(struct rt_mmcsd_card *card)
  483. {
  484. int ret;
  485. struct rt_mmcsd_host *host = card->host;
  486. /* if the card or host doesn't support enhanced data strobe, switch to HS200 and perform tuning process first */
  487. if ((card->ext_csd.enhanced_data_strobe == 0) || ((host->flags & MMCSD_SUP_ENH_DS) == 0))
  488. {
  489. ret = mmc_select_hs200(card);
  490. if (ret != RT_EOK)
  491. {
  492. return ret;
  493. }
  494. }
  495. return mmc_switch_to_hs400(card);
  496. }
  497. static int mmc_select_timing(struct rt_mmcsd_card *card)
  498. {
  499. int ret = 0;
  500. if (card->flags & CARD_FLAG_HS400)
  501. {
  502. LOG_I("emmc: switch to HS400 mode\n");
  503. ret = mmc_select_hs400(card);
  504. }
  505. else if (card->flags & CARD_FLAG_HS200)
  506. {
  507. LOG_I("emmc: switch to HS200 mode\n");
  508. ret = mmc_select_hs200(card);
  509. }
  510. else if (card->flags & CARD_FLAG_HIGHSPEED_DDR)
  511. {
  512. LOG_I("emmc: switch to HIGH Speed DDR mode\n");
  513. mmcsd_set_timing(card->host, MMCSD_TIMING_MMC_DDR52);
  514. mmcsd_set_clock(card->host, card->hs_max_data_rate);
  515. }
  516. else
  517. {
  518. LOG_I("emmc: switch to HIGH Speed mode\n");
  519. mmcsd_set_timing(card->host, MMCSD_TIMING_MMC_HS);
  520. mmcsd_set_clock(card->host, card->hs_max_data_rate);
  521. }
  522. return ret;
  523. }
  524. static rt_int32_t mmcsd_mmc_init_card(struct rt_mmcsd_host *host,
  525. rt_uint32_t ocr)
  526. {
  527. rt_int32_t err;
  528. rt_uint32_t resp[4];
  529. rt_uint32_t rocr = 0;
  530. rt_uint8_t *ext_csd = RT_NULL;
  531. struct rt_mmcsd_card *card = RT_NULL;
  532. mmcsd_go_idle(host);
  533. /* The extra bit indicates that we support high capacity */
  534. err = mmc_send_op_cond(host, ocr | (1 << 30), &rocr);
  535. if (err)
  536. goto err;
  537. if (controller_is_spi(host))
  538. {
  539. err = mmcsd_spi_use_crc(host, 1);
  540. if (err)
  541. goto err1;
  542. }
  543. if (controller_is_spi(host))
  544. err = mmcsd_get_cid(host, resp);
  545. else
  546. err = mmcsd_all_get_cid(host, resp);
  547. if (err)
  548. goto err;
  549. card = rt_malloc(sizeof(struct rt_mmcsd_card));
  550. if (!card)
  551. {
  552. LOG_E("malloc card failed!");
  553. err = -RT_ENOMEM;
  554. goto err;
  555. }
  556. rt_memset(card, 0, sizeof(struct rt_mmcsd_card));
  557. card->card_type = CARD_TYPE_MMC;
  558. card->host = host;
  559. card->rca = 1;
  560. rt_memcpy(card->resp_cid, resp, sizeof(card->resp_cid));
  561. /*
  562. * For native busses: get card RCA and quit open drain mode.
  563. */
  564. if (!controller_is_spi(host))
  565. {
  566. err = mmc_set_card_addr(host, card->rca);
  567. if (err)
  568. goto err1;
  569. mmcsd_set_bus_mode(host, MMCSD_BUSMODE_PUSHPULL);
  570. }
  571. err = mmcsd_get_csd(card, card->resp_csd);
  572. if (err)
  573. goto err1;
  574. err = mmcsd_parse_csd(card);
  575. if (err)
  576. goto err1;
  577. if (!controller_is_spi(host))
  578. {
  579. err = mmcsd_select_card(card);
  580. if (err)
  581. goto err1;
  582. }
  583. /*
  584. * Fetch and process extended CSD.
  585. */
  586. err = mmc_get_ext_csd(card, &ext_csd);
  587. if (err)
  588. goto err1;
  589. err = mmc_parse_ext_csd(card, ext_csd);
  590. if (err)
  591. goto err1;
  592. /* If doing byte addressing, check if required to do sector
  593. * addressing. Handle the case of <2GB cards needing sector
  594. * addressing. See section 8.1 JEDEC Standard JED84-A441;
  595. * ocr register has bit 30 set for sector addressing.
  596. */
  597. if (!(card->flags & CARD_FLAG_SDHC) && (rocr & (1 << 30)))
  598. card->flags |= CARD_FLAG_SDHC;
  599. /*switch bus width and bus mode*/
  600. err = mmc_select_bus_width(card, ext_csd);
  601. if (err)
  602. {
  603. LOG_E("mmc select buswidth fail");
  604. goto err0;
  605. }
  606. err = mmc_select_timing(card);
  607. if (err)
  608. {
  609. LOG_E("mmc select timing fail");
  610. goto err0;
  611. }
  612. if (card->ext_csd.cache_size > 0)
  613. {
  614. mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
  615. EXT_CSD_CACHE_CTRL, 1);
  616. }
  617. host->card = card;
  618. rt_free(ext_csd);
  619. return 0;
  620. err0:
  621. rt_free(ext_csd);
  622. err1:
  623. rt_free(card);
  624. err:
  625. return err;
  626. }
  627. /*
  628. * Starting point for mmc card init.
  629. */
  630. rt_int32_t init_mmc(struct rt_mmcsd_host *host, rt_uint32_t ocr)
  631. {
  632. rt_int32_t err;
  633. rt_uint32_t current_ocr;
  634. /*
  635. * We need to get OCR a different way for SPI.
  636. */
  637. if (controller_is_spi(host))
  638. {
  639. err = mmcsd_spi_read_ocr(host, 0, &ocr);
  640. if (err)
  641. goto err;
  642. }
  643. current_ocr = mmcsd_select_voltage(host, ocr);
  644. /*
  645. * Can we support the voltage(s) of the card(s)?
  646. */
  647. if (!current_ocr)
  648. {
  649. err = -RT_ERROR;
  650. goto err;
  651. }
  652. /*
  653. * Detect and init the card.
  654. */
  655. err = mmcsd_mmc_init_card(host, current_ocr);
  656. if (err)
  657. goto err;
  658. mmcsd_host_unlock(host);
  659. err = rt_mmcsd_blk_probe(host->card);
  660. if (err)
  661. goto remove_card;
  662. mmcsd_host_lock(host);
  663. return 0;
  664. remove_card:
  665. mmcsd_host_lock(host);
  666. rt_mmcsd_blk_remove(host->card);
  667. rt_free(host->card);
  668. host->card = RT_NULL;
  669. err:
  670. LOG_E("init MMC card failed!");
  671. return err;
  672. }