dev_mmc.c 22 KB

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