dev_mmc.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883
  1. /*
  2. * Copyright (c) 2006-2026, 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. * Send Status.
  240. */
  241. static int mmc_send_status(struct rt_mmcsd_card *card, rt_uint32_t *status, unsigned retries)
  242. {
  243. int err;
  244. struct rt_mmcsd_cmd cmd = (struct rt_mmcsd_cmd){ 0 };
  245. cmd.busy_timeout = 0;
  246. cmd.cmd_code = SEND_STATUS;
  247. cmd.arg = card->rca << 16;
  248. cmd.flags = RESP_R1 | CMD_AC;
  249. err = mmcsd_send_cmd(card->host, &cmd, retries);
  250. if (err)
  251. return err;
  252. if (status)
  253. *status = cmd.resp[0];
  254. return 0;
  255. }
  256. /*
  257. * Poll Busy.
  258. */
  259. static int mmc_poll_for_busy(struct rt_mmcsd_card *card, rt_uint32_t timeout_ms, unsigned retries)
  260. {
  261. int timeout = rt_tick_from_millisecond(timeout_ms);
  262. int err = 0;
  263. rt_uint32_t status;
  264. rt_tick_t start;
  265. start = rt_tick_get();
  266. do
  267. {
  268. rt_bool_t out = (int)(rt_tick_get() - start) >= timeout;
  269. if (out)
  270. {
  271. LOG_E("wait card busy timeout");
  272. return -RT_ETIMEOUT;
  273. }
  274. rt_thread_mdelay(1);
  275. err = mmc_send_status(card, &status, retries);
  276. if (R1_STATUS(err))
  277. {
  278. LOG_E("error %d requesting status", err);
  279. return err;
  280. }
  281. }
  282. while (!(status & R1_READY_FOR_DATA) ||
  283. (R1_CURRENT_STATE(status) == R1_STATE_PRG));
  284. return err;
  285. }
  286. /**
  287. * mmc_switch - modify EXT_CSD register
  288. * @card: the MMC card associated with the data transfer
  289. * @set: cmd set values
  290. * @index: EXT_CSD register index
  291. * @value: value to program into EXT_CSD register
  292. *
  293. * Modifies the EXT_CSD register for selected card.
  294. */
  295. static int mmc_switch(struct rt_mmcsd_card *card, rt_uint8_t set,
  296. rt_uint8_t index, rt_uint8_t value)
  297. {
  298. int err;
  299. struct rt_mmcsd_host *host = card->host;
  300. struct rt_mmcsd_cmd cmd = { 0 };
  301. cmd.cmd_code = SWITCH;
  302. cmd.arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) |
  303. (index << 16) | (value << 8) | set;
  304. cmd.flags = RESP_R1B | CMD_AC;
  305. err = mmcsd_send_cmd(host, &cmd, 3);
  306. if (err)
  307. return err;
  308. /*
  309. * Poll the card status using CMD13 with a timeout of 500ms and a polling interval of 1ms.
  310. */
  311. err = mmc_poll_for_busy(card, 500, 3);
  312. if (err)
  313. return err;
  314. return 0;
  315. }
  316. static int mmc_compare_ext_csds(struct rt_mmcsd_card *card,
  317. rt_uint8_t *ext_csd, rt_uint32_t bus_width)
  318. {
  319. rt_uint8_t *bw_ext_csd;
  320. int err;
  321. if (bus_width == MMCSD_BUS_WIDTH_1)
  322. return 0;
  323. err = mmc_get_ext_csd(card, &bw_ext_csd);
  324. if (err || bw_ext_csd == RT_NULL)
  325. {
  326. err = -RT_ERROR;
  327. goto out;
  328. }
  329. /* only compare read only fields */
  330. err = !((ext_csd[EXT_CSD_PARTITION_SUPPORT] == bw_ext_csd[EXT_CSD_PARTITION_SUPPORT]) &&
  331. (ext_csd[EXT_CSD_ERASED_MEM_CONT] == bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) &&
  332. (ext_csd[EXT_CSD_REV] == bw_ext_csd[EXT_CSD_REV]) &&
  333. (ext_csd[EXT_CSD_STRUCTURE] == bw_ext_csd[EXT_CSD_STRUCTURE]) &&
  334. (ext_csd[EXT_CSD_CARD_TYPE] == bw_ext_csd[EXT_CSD_CARD_TYPE]) &&
  335. (ext_csd[EXT_CSD_S_A_TIMEOUT] == bw_ext_csd[EXT_CSD_S_A_TIMEOUT]) &&
  336. (ext_csd[EXT_CSD_HC_WP_GRP_SIZE] == bw_ext_csd[EXT_CSD_HC_WP_GRP_SIZE]) &&
  337. (ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT] == bw_ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT]) &&
  338. (ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] == bw_ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]) &&
  339. (ext_csd[EXT_CSD_SEC_TRIM_MULT] == bw_ext_csd[EXT_CSD_SEC_TRIM_MULT]) &&
  340. (ext_csd[EXT_CSD_SEC_ERASE_MULT] == bw_ext_csd[EXT_CSD_SEC_ERASE_MULT]) &&
  341. (ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT] == bw_ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]) &&
  342. (ext_csd[EXT_CSD_TRIM_MULT] == bw_ext_csd[EXT_CSD_TRIM_MULT]) &&
  343. (ext_csd[EXT_CSD_SEC_CNT + 0] == bw_ext_csd[EXT_CSD_SEC_CNT + 0]) &&
  344. (ext_csd[EXT_CSD_SEC_CNT + 1] == bw_ext_csd[EXT_CSD_SEC_CNT + 1]) &&
  345. (ext_csd[EXT_CSD_SEC_CNT + 2] == bw_ext_csd[EXT_CSD_SEC_CNT + 2]) &&
  346. (ext_csd[EXT_CSD_SEC_CNT + 3] == bw_ext_csd[EXT_CSD_SEC_CNT + 3]) &&
  347. (ext_csd[EXT_CSD_PWR_CL_52_195] == bw_ext_csd[EXT_CSD_PWR_CL_52_195]) &&
  348. (ext_csd[EXT_CSD_PWR_CL_26_195] == bw_ext_csd[EXT_CSD_PWR_CL_26_195]) &&
  349. (ext_csd[EXT_CSD_PWR_CL_52_360] == bw_ext_csd[EXT_CSD_PWR_CL_52_360]) &&
  350. (ext_csd[EXT_CSD_PWR_CL_26_360] == bw_ext_csd[EXT_CSD_PWR_CL_26_360]) &&
  351. (ext_csd[EXT_CSD_PWR_CL_200_195] == bw_ext_csd[EXT_CSD_PWR_CL_200_195]) &&
  352. (ext_csd[EXT_CSD_PWR_CL_200_360] == bw_ext_csd[EXT_CSD_PWR_CL_200_360]) &&
  353. (ext_csd[EXT_CSD_PWR_CL_DDR_52_195] == bw_ext_csd[EXT_CSD_PWR_CL_DDR_52_195]) &&
  354. (ext_csd[EXT_CSD_PWR_CL_DDR_52_360] == bw_ext_csd[EXT_CSD_PWR_CL_DDR_52_360]) &&
  355. (ext_csd[EXT_CSD_PWR_CL_DDR_200_360] == bw_ext_csd[EXT_CSD_PWR_CL_DDR_200_360]));
  356. if (err)
  357. err = -RT_ERROR;
  358. out:
  359. rt_free(bw_ext_csd);
  360. return err;
  361. }
  362. /*
  363. * Select the bus width among 4-bit and 8-bit(SDR).
  364. * If the bus width is changed successfully, return the selected width value.
  365. * Zero is returned instead of error value if the wide width is not supported.
  366. */
  367. static int mmc_select_bus_width(struct rt_mmcsd_card *card, rt_uint8_t *ext_csd)
  368. {
  369. rt_uint32_t ext_csd_bits[][2] = {
  370. { EXT_CSD_BUS_WIDTH_8, EXT_CSD_DDR_BUS_WIDTH_8 },
  371. { EXT_CSD_BUS_WIDTH_4, EXT_CSD_DDR_BUS_WIDTH_4 },
  372. { EXT_CSD_BUS_WIDTH_1, EXT_CSD_BUS_WIDTH_1 },
  373. };
  374. rt_uint32_t bus_widths[] = {
  375. MMCSD_BUS_WIDTH_8,
  376. MMCSD_BUS_WIDTH_4,
  377. MMCSD_BUS_WIDTH_1
  378. };
  379. struct rt_mmcsd_host *host = card->host;
  380. unsigned idx, bus_width = 0;
  381. int err = 0, ddr = 0;
  382. if (GET_BITS(card->resp_csd, 122, 4) < 4)
  383. return 0;
  384. if (card->flags & CARD_FLAG_HIGHSPEED_DDR)
  385. {
  386. ddr = 2;
  387. }
  388. /*
  389. * Unlike SD, MMC cards don't have a configuration register to notify
  390. * supported bus width. So bus test command should be run to identify
  391. * the supported bus width or compare the EXT_CSD values of current
  392. * bus width and EXT_CSD values of 1 bit mode read earlier.
  393. */
  394. for (idx = 0; idx < sizeof(bus_widths) / sizeof(rt_uint32_t); idx++)
  395. {
  396. /*
  397. * Determine BUS WIDTH mode according to the capability of host
  398. */
  399. if (((ext_csd_bits[idx][0] == EXT_CSD_BUS_WIDTH_8) && ((host->flags & MMCSD_BUSWIDTH_8) == 0)) ||
  400. ((ext_csd_bits[idx][0] == EXT_CSD_BUS_WIDTH_4) && ((host->flags & MMCSD_BUSWIDTH_4) == 0)))
  401. {
  402. continue;
  403. }
  404. bus_width = bus_widths[idx];
  405. if (bus_width == MMCSD_BUS_WIDTH_1)
  406. {
  407. ddr = 0;
  408. }
  409. err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
  410. EXT_CSD_BUS_WIDTH,
  411. ext_csd_bits[idx][0]);
  412. if (err)
  413. continue;
  414. mmcsd_set_bus_width(host, bus_width);
  415. err = mmc_compare_ext_csds(card, ext_csd, bus_width);
  416. if (!err)
  417. {
  418. break;
  419. }
  420. else
  421. {
  422. switch (ext_csd_bits[idx][0])
  423. {
  424. case 0:
  425. LOG_E("switch to bus width 1 bit failed!");
  426. break;
  427. case 1:
  428. LOG_E("switch to bus width 4 bit failed!");
  429. break;
  430. case 2:
  431. LOG_E("switch to bus width 8 bit failed!");
  432. break;
  433. default:
  434. break;
  435. }
  436. }
  437. }
  438. if (!err)
  439. {
  440. if (card->flags & (CARD_FLAG_HIGHSPEED | CARD_FLAG_HIGHSPEED_DDR))
  441. {
  442. err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
  443. EXT_CSD_HS_TIMING,
  444. 1);
  445. }
  446. }
  447. if (!err && ddr)
  448. {
  449. err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
  450. EXT_CSD_BUS_WIDTH,
  451. ext_csd_bits[idx][1]);
  452. }
  453. return err;
  454. }
  455. rt_err_t mmc_send_op_cond(struct rt_mmcsd_host *host,
  456. rt_uint32_t ocr, rt_uint32_t *rocr)
  457. {
  458. struct rt_mmcsd_cmd cmd;
  459. rt_uint32_t i;
  460. rt_err_t err = RT_EOK;
  461. rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
  462. cmd.cmd_code = SEND_OP_COND;
  463. cmd.arg = controller_is_spi(host) ? 0 : ocr;
  464. cmd.flags = RESP_SPI_R1 | RESP_R3 | CMD_BCR;
  465. for (i = 100; i; i--)
  466. {
  467. err = mmcsd_send_cmd(host, &cmd, 3);
  468. if (err)
  469. break;
  470. /* if we're just probing, do a single pass */
  471. if (ocr == 0)
  472. break;
  473. /* otherwise wait until reset completes */
  474. if (controller_is_spi(host))
  475. {
  476. if (!(cmd.resp[0] & R1_SPI_IDLE))
  477. break;
  478. }
  479. else
  480. {
  481. if (cmd.resp[0] & CARD_BUSY)
  482. break;
  483. }
  484. err = -RT_ETIMEOUT;
  485. rt_thread_mdelay(10); /* delay 10ms */
  486. }
  487. if (rocr && !controller_is_spi(host))
  488. *rocr = cmd.resp[0];
  489. return err;
  490. }
  491. static rt_err_t mmc_set_card_addr(struct rt_mmcsd_host *host, rt_uint32_t rca)
  492. {
  493. rt_err_t err;
  494. struct rt_mmcsd_cmd cmd;
  495. rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
  496. cmd.cmd_code = SET_RELATIVE_ADDR;
  497. cmd.arg = rca << 16;
  498. cmd.flags = RESP_R1 | CMD_AC;
  499. err = mmcsd_send_cmd(host, &cmd, 3);
  500. if (err)
  501. return err;
  502. return 0;
  503. }
  504. static int mmc_select_hs200(struct rt_mmcsd_card *card)
  505. {
  506. int ret;
  507. ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
  508. EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS200);
  509. if (ret)
  510. return ret;
  511. mmcsd_set_timing(card->host, MMCSD_TIMING_MMC_HS200);
  512. mmcsd_set_clock(card->host, card->max_data_rate);
  513. ret = mmcsd_excute_tuning(card);
  514. return ret;
  515. }
  516. static int mmc_switch_to_hs400(struct rt_mmcsd_card *card)
  517. {
  518. struct rt_mmcsd_host *host = card->host;
  519. int err;
  520. rt_uint8_t ext_csd_bus_width;
  521. rt_uint32_t hs_timing;
  522. /* Switch to HS_TIMING to 0x01 (High Speed) */
  523. err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
  524. EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS);
  525. if (err != RT_EOK)
  526. {
  527. return err;
  528. }
  529. mmcsd_set_timing(card->host, MMCSD_TIMING_MMC_HS);
  530. /* Host changes frequency to <= 52MHz */
  531. mmcsd_set_clock(card->host, 52000000);
  532. rt_bool_t support_enhanced_ds = ((card->ext_csd.enhanced_data_strobe != 0) &&
  533. ((host->flags & MMCSD_SUP_ENH_DS) != 0));
  534. /* Set the bus width to:
  535. * 0x86 if enhanced data strobe is supported, or
  536. * 0x06 if enhanced data strobe is not supported
  537. */
  538. ext_csd_bus_width = support_enhanced_ds ? EXT_CSD_DDR_BUS_WIDTH_8_EH_DS : EXT_CSD_DDR_BUS_WIDTH_8;
  539. err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
  540. EXT_CSD_BUS_WIDTH,
  541. ext_csd_bus_width);
  542. if (err != RT_EOK)
  543. {
  544. return err;
  545. }
  546. /* Set HS_TIMING to 0x03 (HS400) */
  547. err = mmc_switch(card,
  548. EXT_CSD_CMD_SET_NORMAL,
  549. EXT_CSD_HS_TIMING,
  550. EXT_CSD_TIMING_HS400);
  551. if (err != RT_EOK)
  552. {
  553. return err;
  554. }
  555. /* Change the Host timing accordingly */
  556. hs_timing = support_enhanced_ds ? MMCSD_TIMING_MMC_HS400_ENH_DS : MMCSD_TIMING_MMC_HS400;
  557. mmcsd_set_timing(host, hs_timing);
  558. /* Host may changes frequency to <= 200MHz */
  559. mmcsd_set_clock(card->host, card->max_data_rate);
  560. return RT_EOK;
  561. }
  562. static int mmc_select_hs400(struct rt_mmcsd_card *card)
  563. {
  564. int ret;
  565. struct rt_mmcsd_host *host = card->host;
  566. /* if the card or host doesn't support enhanced data strobe, switch to HS200 and perform tuning process first */
  567. if ((card->ext_csd.enhanced_data_strobe == 0) || ((host->flags & MMCSD_SUP_ENH_DS) == 0))
  568. {
  569. ret = mmc_select_hs200(card);
  570. if (ret != RT_EOK)
  571. {
  572. return ret;
  573. }
  574. }
  575. return mmc_switch_to_hs400(card);
  576. }
  577. static int mmc_select_timing(struct rt_mmcsd_card *card)
  578. {
  579. int ret = 0;
  580. if (card->flags & CARD_FLAG_HS400)
  581. {
  582. LOG_I("emmc: switch to HS400 mode\n");
  583. ret = mmc_select_hs400(card);
  584. }
  585. else if (card->flags & CARD_FLAG_HS200)
  586. {
  587. LOG_I("emmc: switch to HS200 mode\n");
  588. ret = mmc_select_hs200(card);
  589. }
  590. else if (card->flags & CARD_FLAG_HIGHSPEED_DDR)
  591. {
  592. LOG_I("emmc: switch to HIGH Speed DDR mode\n");
  593. mmcsd_set_timing(card->host, MMCSD_TIMING_MMC_DDR52);
  594. mmcsd_set_clock(card->host, card->hs_max_data_rate);
  595. }
  596. else
  597. {
  598. LOG_I("emmc: switch to HIGH Speed mode\n");
  599. mmcsd_set_timing(card->host, MMCSD_TIMING_MMC_HS);
  600. mmcsd_set_clock(card->host, card->hs_max_data_rate);
  601. }
  602. return ret;
  603. }
  604. static rt_int32_t mmcsd_mmc_init_card(struct rt_mmcsd_host *host,
  605. rt_uint32_t ocr)
  606. {
  607. rt_int32_t err;
  608. rt_uint32_t resp[4];
  609. rt_uint32_t rocr = 0;
  610. rt_uint8_t *ext_csd = RT_NULL;
  611. struct rt_mmcsd_card *card = RT_NULL;
  612. mmcsd_go_idle(host);
  613. /* The extra bit indicates that we support high capacity */
  614. err = mmc_send_op_cond(host, ocr | (1 << 30), &rocr);
  615. if (err)
  616. goto err;
  617. if (controller_is_spi(host))
  618. {
  619. err = mmcsd_spi_use_crc(host, 1);
  620. if (err)
  621. goto err1;
  622. }
  623. if (controller_is_spi(host))
  624. err = mmcsd_get_cid(host, resp);
  625. else
  626. err = mmcsd_all_get_cid(host, resp);
  627. if (err)
  628. goto err;
  629. card = rt_malloc(sizeof(struct rt_mmcsd_card));
  630. if (!card)
  631. {
  632. LOG_E("malloc card failed!");
  633. err = -RT_ENOMEM;
  634. goto err;
  635. }
  636. rt_memset(card, 0, sizeof(struct rt_mmcsd_card));
  637. card->card_type = CARD_TYPE_MMC;
  638. card->host = host;
  639. card->rca = 1;
  640. rt_memcpy(card->resp_cid, resp, sizeof(card->resp_cid));
  641. /*
  642. * For native busses: get card RCA and quit open drain mode.
  643. */
  644. if (!controller_is_spi(host))
  645. {
  646. err = mmc_set_card_addr(host, card->rca);
  647. if (err)
  648. goto err1;
  649. mmcsd_set_bus_mode(host, MMCSD_BUSMODE_PUSHPULL);
  650. }
  651. err = mmcsd_get_csd(card, card->resp_csd);
  652. if (err)
  653. goto err1;
  654. err = mmcsd_parse_csd(card);
  655. if (err)
  656. goto err1;
  657. if (!controller_is_spi(host))
  658. {
  659. err = mmcsd_select_card(card);
  660. if (err)
  661. goto err1;
  662. }
  663. /*
  664. * Fetch and process extended CSD.
  665. */
  666. err = mmc_get_ext_csd(card, &ext_csd);
  667. if (err)
  668. goto err1;
  669. err = mmc_parse_ext_csd(card, ext_csd);
  670. if (err)
  671. goto err1;
  672. /* If doing byte addressing, check if required to do sector
  673. * addressing. Handle the case of <2GB cards needing sector
  674. * addressing. See section 8.1 JEDEC Standard JED84-A441;
  675. * ocr register has bit 30 set for sector addressing.
  676. */
  677. if (!(card->flags & CARD_FLAG_SDHC) && (rocr & (1 << 30)))
  678. card->flags |= CARD_FLAG_SDHC;
  679. /*switch bus width and bus mode*/
  680. err = mmc_select_bus_width(card, ext_csd);
  681. if (err)
  682. {
  683. LOG_E("mmc select buswidth fail");
  684. goto err0;
  685. }
  686. err = mmc_select_timing(card);
  687. if (err)
  688. {
  689. LOG_E("mmc select timing fail");
  690. goto err0;
  691. }
  692. if (card->ext_csd.cache_size > 0)
  693. {
  694. mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
  695. EXT_CSD_CACHE_CTRL, 1);
  696. }
  697. host->card = card;
  698. rt_free(ext_csd);
  699. return 0;
  700. err0:
  701. rt_free(ext_csd);
  702. err1:
  703. rt_free(card);
  704. err:
  705. return err;
  706. }
  707. /*
  708. * Starting point for mmc card init.
  709. */
  710. rt_int32_t init_mmc(struct rt_mmcsd_host *host, rt_uint32_t ocr)
  711. {
  712. rt_int32_t err;
  713. rt_uint32_t current_ocr;
  714. /*
  715. * We need to get OCR a different way for SPI.
  716. */
  717. if (controller_is_spi(host))
  718. {
  719. err = mmcsd_spi_read_ocr(host, 0, &ocr);
  720. if (err)
  721. goto err;
  722. }
  723. current_ocr = mmcsd_select_voltage(host, ocr);
  724. /*
  725. * Can we support the voltage(s) of the card(s)?
  726. */
  727. if (!current_ocr)
  728. {
  729. err = -RT_ERROR;
  730. goto err;
  731. }
  732. /*
  733. * Detect and init the card.
  734. */
  735. err = mmcsd_mmc_init_card(host, current_ocr);
  736. if (err)
  737. goto err;
  738. mmcsd_host_unlock(host);
  739. err = rt_mmcsd_blk_probe(host->card);
  740. if (err)
  741. goto remove_card;
  742. mmcsd_host_lock(host);
  743. return 0;
  744. remove_card:
  745. mmcsd_host_lock(host);
  746. rt_mmcsd_blk_remove(host->card);
  747. rt_free(host->card);
  748. host->card = RT_NULL;
  749. err:
  750. LOG_E("init MMC card failed!");
  751. return err;
  752. }