dev_sd.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869
  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. * 2011-07-25 weety first version
  9. * 2024-05-26 HPMicro add UHS-I support
  10. */
  11. #include <drivers/dev_mmcsd_core.h>
  12. #include <drivers/dev_sd.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. static rt_int32_t mmcsd_parse_csd(struct rt_mmcsd_card *card)
  54. {
  55. struct rt_mmcsd_csd *csd = &card->csd;
  56. rt_uint32_t *resp = card->resp_csd;
  57. csd->csd_structure = GET_BITS(resp, 126, 2);
  58. switch (csd->csd_structure)
  59. {
  60. case 0:
  61. csd->taac = GET_BITS(resp, 112, 8);
  62. csd->nsac = GET_BITS(resp, 104, 8);
  63. csd->tran_speed = GET_BITS(resp, 96, 8);
  64. csd->card_cmd_class = GET_BITS(resp, 84, 12);
  65. csd->rd_blk_len = GET_BITS(resp, 80, 4);
  66. csd->rd_blk_part = GET_BITS(resp, 79, 1);
  67. csd->wr_blk_misalign = GET_BITS(resp, 78, 1);
  68. csd->rd_blk_misalign = GET_BITS(resp, 77, 1);
  69. csd->dsr_imp = GET_BITS(resp, 76, 1);
  70. csd->c_size = GET_BITS(resp, 62, 12);
  71. csd->c_size_mult = GET_BITS(resp, 47, 3);
  72. csd->r2w_factor = GET_BITS(resp, 26, 3);
  73. csd->wr_blk_len = GET_BITS(resp, 22, 4);
  74. csd->wr_blk_partial = GET_BITS(resp, 21, 1);
  75. csd->csd_crc = GET_BITS(resp, 1, 7);
  76. card->card_blksize = 1 << csd->rd_blk_len;
  77. card->card_capacity = (csd->c_size + 1) << (csd->c_size_mult + 2);
  78. card->card_capacity *= card->card_blksize;
  79. card->card_capacity >>= 10; /* unit:KB */
  80. card->tacc_clks = csd->nsac * 100;
  81. card->tacc_ns = (tacc_uint[csd->taac&0x07] * tacc_value[(csd->taac&0x78)>>3] + 9) / 10;
  82. card->max_data_rate = tran_unit[csd->tran_speed&0x07] * tran_value[(csd->tran_speed&0x78)>>3];
  83. break;
  84. case 1:
  85. card->flags |= CARD_FLAG_SDHC;
  86. /*This field is fixed to 0Eh, which indicates 1 ms.
  87. The host should not use TAAC, NSAC, and R2W_FACTOR
  88. to calculate timeout and should uses fixed timeout
  89. values for read and write operations*/
  90. csd->taac = GET_BITS(resp, 112, 8);
  91. csd->nsac = GET_BITS(resp, 104, 8);
  92. csd->tran_speed = GET_BITS(resp, 96, 8);
  93. csd->card_cmd_class = GET_BITS(resp, 84, 12);
  94. csd->rd_blk_len = GET_BITS(resp, 80, 4);
  95. csd->rd_blk_part = GET_BITS(resp, 79, 1);
  96. csd->wr_blk_misalign = GET_BITS(resp, 78, 1);
  97. csd->rd_blk_misalign = GET_BITS(resp, 77, 1);
  98. csd->dsr_imp = GET_BITS(resp, 76, 1);
  99. csd->c_size = GET_BITS(resp, 48, 22);
  100. csd->r2w_factor = GET_BITS(resp, 26, 3);
  101. csd->wr_blk_len = GET_BITS(resp, 22, 4);
  102. csd->wr_blk_partial = GET_BITS(resp, 21, 1);
  103. csd->csd_crc = GET_BITS(resp, 1, 7);
  104. card->card_blksize = 512;
  105. card->card_capacity = (csd->c_size + 1) * 512; /* unit:KB */
  106. card->card_sec_cnt = card->card_capacity * 2;
  107. card->tacc_clks = 0;
  108. card->tacc_ns = 0;
  109. card->max_data_rate = tran_unit[csd->tran_speed&0x07] * tran_value[(csd->tran_speed&0x78)>>3];
  110. break;
  111. default:
  112. LOG_E("unrecognised CSD structure version %d!", csd->csd_structure);
  113. return -RT_ERROR;
  114. }
  115. LOG_I("SD card capacity %d KB.", card->card_capacity);
  116. return 0;
  117. }
  118. static rt_int32_t mmcsd_parse_scr(struct rt_mmcsd_card *card)
  119. {
  120. struct rt_sd_scr *scr = &card->scr;
  121. rt_uint32_t resp[4];
  122. resp[3] = card->resp_scr[1];
  123. resp[2] = card->resp_scr[0];
  124. scr->sd_version = GET_BITS(resp, 56, 4);
  125. scr->sd_bus_widths = GET_BITS(resp, 48, 4);
  126. return 0;
  127. }
  128. static rt_int32_t mmcsd_switch(struct rt_mmcsd_card *card)
  129. {
  130. rt_int32_t err;
  131. struct rt_mmcsd_host *host = card->host;
  132. struct rt_mmcsd_req req;
  133. struct rt_mmcsd_cmd cmd;
  134. struct rt_mmcsd_data data;
  135. rt_uint8_t *buf;
  136. buf = (rt_uint8_t*)rt_malloc(64);
  137. if (!buf)
  138. {
  139. LOG_E("alloc memory failed!");
  140. return -RT_ENOMEM;
  141. }
  142. if (card->card_type != CARD_TYPE_SD)
  143. goto err;
  144. if (card->scr.sd_version < SCR_SPEC_VER_1)
  145. goto err;
  146. rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
  147. cmd.cmd_code = SD_SWITCH;
  148. cmd.arg = 0x00FFFFF1;
  149. cmd.flags = RESP_R1 | CMD_ADTC;
  150. rt_memset(&data, 0, sizeof(struct rt_mmcsd_data));
  151. mmcsd_set_data_timeout(&data, card);
  152. data.blksize = 64;
  153. data.blks = 1;
  154. data.flags = DATA_DIR_READ;
  155. data.buf = (rt_uint32_t *)buf;
  156. rt_memset(&req, 0, sizeof(struct rt_mmcsd_req));
  157. req.cmd = &cmd;
  158. req.data = &data;
  159. mmcsd_send_request(host, &req);
  160. if (cmd.err || data.err)
  161. {
  162. goto err1;
  163. }
  164. if (buf[13] & 0x02)
  165. card->hs_max_data_rate = 50000000;
  166. rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
  167. cmd.cmd_code = SD_SWITCH;
  168. rt_uint32_t switch_func_timing;
  169. if ((card->flags & CARD_FLAG_SDR104) && (card->host->flags & MMCSD_SUP_SDR104))
  170. {
  171. switch_func_timing = SD_SWITCH_FUNC_TIMING_SDR104;
  172. }
  173. else if ((card->flags & CARD_FLAG_SDR50) && (card->host->flags & MMCSD_SUP_SDR50))
  174. {
  175. switch_func_timing = SD_SWITCH_FUNC_TIMING_SDR50;
  176. }
  177. else if ((card->flags & CARD_FLAG_DDR50) && (card->host->flags & MMCSD_SUP_DDR50))
  178. {
  179. switch_func_timing = SD_SWITCH_FUNC_TIMING_DDR50;
  180. }
  181. else
  182. {
  183. switch_func_timing = SD_SWITCH_FUNC_TIMING_HS;
  184. }
  185. cmd.arg = 0x80FFFFF0 | switch_func_timing;
  186. cmd.flags = RESP_R1 | CMD_ADTC;
  187. rt_memset(&data, 0, sizeof(struct rt_mmcsd_data));
  188. mmcsd_set_data_timeout(&data, card);
  189. data.blksize = 64;
  190. data.blks = 1;
  191. data.flags = DATA_DIR_READ;
  192. data.buf = (rt_uint32_t *)buf;
  193. rt_memset(&req, 0, sizeof(struct rt_mmcsd_req));
  194. req.cmd = &cmd;
  195. req.data = &data;
  196. mmcsd_send_request(host, &req);
  197. if (cmd.err || data.err)
  198. {
  199. goto err1;
  200. }
  201. if ((buf[16] & 0xF) != switch_func_timing)
  202. {
  203. LOG_E("switching card to timing mode %d failed!", switch_func_timing);
  204. goto err;
  205. }
  206. switch(switch_func_timing)
  207. {
  208. case SD_SWITCH_FUNC_TIMING_SDR104:
  209. card->flags |= CARD_FLAG_SDR104;
  210. break;
  211. case SD_SWITCH_FUNC_TIMING_SDR50:
  212. card->flags |= CARD_FLAG_SDR50;
  213. break;
  214. case SD_SWITCH_FUNC_TIMING_DDR50:
  215. card->flags |= CARD_FLAG_DDR50;
  216. break;
  217. case SD_SWITCH_FUNC_TIMING_HS:
  218. card->flags |= CARD_FLAG_HIGHSPEED;
  219. break;
  220. default:
  221. /* Default speed */
  222. break;
  223. }
  224. card->max_data_rate = 50000000;
  225. if (switch_func_timing == SD_SWITCH_FUNC_TIMING_SDR104)
  226. {
  227. LOG_I("sd: switch to SDR104 mode\n");
  228. mmcsd_set_timing(card->host, MMCSD_TIMING_UHS_SDR104);
  229. mmcsd_set_clock(card->host, 208000000);
  230. err = mmcsd_excute_tuning(card);
  231. card->max_data_rate = 208000000;
  232. }
  233. else if (switch_func_timing == SD_SWITCH_FUNC_TIMING_SDR50)
  234. {
  235. LOG_I("sd: switch to SDR50 mode\n");
  236. mmcsd_set_timing(card->host, MMCSD_TIMING_UHS_SDR50);
  237. mmcsd_set_clock(card->host, 100000000);
  238. err = mmcsd_excute_tuning(card);
  239. card->max_data_rate = 10000000;
  240. }
  241. else if (switch_func_timing == SD_SWITCH_FUNC_TIMING_DDR50)
  242. {
  243. LOG_I("sd: switch to DDR50 mode\n");
  244. mmcsd_set_timing(card->host, MMCSD_TIMING_UHS_DDR50);
  245. mmcsd_set_clock(card->host, 50000000);
  246. }
  247. else
  248. {
  249. LOG_I("sd: switch to High Speed / SDR25 mode \n");
  250. mmcsd_set_timing(card->host, MMCSD_TIMING_SD_HS);
  251. mmcsd_set_clock(card->host, 50000000);
  252. }
  253. err:
  254. rt_free(buf);
  255. return 0;
  256. err1:
  257. if (cmd.err)
  258. err = cmd.err;
  259. if (data.err)
  260. err = data.err;
  261. return err;
  262. }
  263. static rt_err_t mmcsd_app_cmd(struct rt_mmcsd_host *host,
  264. struct rt_mmcsd_card *card)
  265. {
  266. rt_err_t err;
  267. struct rt_mmcsd_cmd cmd = {0};
  268. cmd.cmd_code = APP_CMD;
  269. if (card)
  270. {
  271. cmd.arg = card->rca << 16;
  272. cmd.flags = RESP_R1 | CMD_AC;
  273. }
  274. else
  275. {
  276. cmd.arg = 0;
  277. cmd.flags = RESP_R1 | CMD_BCR;
  278. }
  279. err = mmcsd_send_cmd(host, &cmd, 0);
  280. if (err)
  281. return err;
  282. /* Check that card supported application commands */
  283. if (!controller_is_spi(host) && !(cmd.resp[0] & R1_APP_CMD))
  284. return -RT_ERROR;
  285. return RT_EOK;
  286. }
  287. rt_err_t mmcsd_send_app_cmd(struct rt_mmcsd_host *host,
  288. struct rt_mmcsd_card *card,
  289. struct rt_mmcsd_cmd *cmd,
  290. int retry)
  291. {
  292. struct rt_mmcsd_req req;
  293. int i;
  294. rt_err_t err;
  295. err = -RT_ERROR;
  296. /*
  297. * We have to resend MMC_APP_CMD for each attempt so
  298. * we cannot use the retries field in mmc_command.
  299. */
  300. for (i = 0; i <= retry; i++)
  301. {
  302. rt_memset(&req, 0, sizeof(struct rt_mmcsd_req));
  303. err = mmcsd_app_cmd(host, card);
  304. if (err)
  305. {
  306. /* no point in retrying; no APP commands allowed */
  307. if (controller_is_spi(host))
  308. {
  309. if (cmd->resp[0] & R1_SPI_ILLEGAL_COMMAND)
  310. break;
  311. }
  312. continue;
  313. }
  314. rt_memset(&req, 0, sizeof(struct rt_mmcsd_req));
  315. rt_memset(cmd->resp, 0, sizeof(cmd->resp));
  316. req.cmd = cmd;
  317. //cmd->data = NULL;
  318. mmcsd_send_request(host, &req);
  319. err = cmd->err;
  320. if (!cmd->err)
  321. break;
  322. /* no point in retrying illegal APP commands */
  323. if (controller_is_spi(host))
  324. {
  325. if (cmd->resp[0] & R1_SPI_ILLEGAL_COMMAND)
  326. break;
  327. }
  328. }
  329. return err;
  330. }
  331. rt_err_t mmcsd_app_set_bus_width(struct rt_mmcsd_card *card, rt_int32_t width)
  332. {
  333. rt_err_t err;
  334. struct rt_mmcsd_cmd cmd;
  335. rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
  336. cmd.cmd_code = SD_APP_SET_BUS_WIDTH;
  337. cmd.flags = RESP_R1 | CMD_AC;
  338. switch (width)
  339. {
  340. case MMCSD_BUS_WIDTH_1:
  341. cmd.arg = MMCSD_BUS_WIDTH_1;
  342. break;
  343. case MMCSD_BUS_WIDTH_4:
  344. cmd.arg = MMCSD_BUS_WIDTH_4;
  345. break;
  346. default:
  347. return -RT_ERROR;
  348. }
  349. err = mmcsd_send_app_cmd(card->host, card, &cmd, 3);
  350. if (err)
  351. return err;
  352. return RT_EOK;
  353. }
  354. rt_err_t mmcsd_send_app_op_cond(struct rt_mmcsd_host *host,
  355. rt_uint32_t ocr,
  356. rt_uint32_t *rocr)
  357. {
  358. struct rt_mmcsd_cmd cmd;
  359. rt_uint32_t i;
  360. rt_err_t err = RT_EOK;
  361. rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
  362. cmd.cmd_code = SD_APP_OP_COND;
  363. if (controller_is_spi(host))
  364. cmd.arg = ocr & (1 << 30); /* SPI only defines one bit */
  365. else
  366. cmd.arg = ocr;
  367. cmd.flags = RESP_SPI_R1 | RESP_R3 | CMD_BCR;
  368. for (i = 1000; i; i--)
  369. {
  370. err = mmcsd_send_app_cmd(host, RT_NULL, &cmd, 3);
  371. if (err)
  372. break;
  373. /* if we're just probing, do a single pass */
  374. if (ocr == 0)
  375. break;
  376. /* otherwise wait until reset completes */
  377. if (controller_is_spi(host))
  378. {
  379. if (!(cmd.resp[0] & R1_SPI_IDLE))
  380. break;
  381. }
  382. else
  383. {
  384. if (cmd.resp[0] & CARD_BUSY)
  385. break;
  386. }
  387. err = -RT_ETIMEOUT;
  388. rt_thread_mdelay(10); //delay 10ms
  389. }
  390. if (rocr && !controller_is_spi(host))
  391. *rocr = cmd.resp[0];
  392. return err;
  393. }
  394. /*
  395. * To support SD 2.0 cards, we must always invoke SD_SEND_IF_COND
  396. * before SD_APP_OP_COND. This command will harmlessly fail for
  397. * SD 1.0 cards.
  398. */
  399. rt_err_t mmcsd_send_if_cond(struct rt_mmcsd_host *host, rt_uint32_t ocr)
  400. {
  401. struct rt_mmcsd_cmd cmd;
  402. rt_err_t err;
  403. rt_uint8_t pattern;
  404. cmd.cmd_code = SD_SEND_IF_COND;
  405. cmd.arg = ((ocr & 0xFF8000) != 0) << 8 | 0xAA;
  406. cmd.flags = RESP_SPI_R7 | RESP_R7 | CMD_BCR;
  407. err = mmcsd_send_cmd(host, &cmd, 0);
  408. if (err)
  409. return err;
  410. if (controller_is_spi(host))
  411. pattern = cmd.resp[1] & 0xFF;
  412. else
  413. pattern = cmd.resp[0] & 0xFF;
  414. if (pattern != 0xAA)
  415. return -RT_ERROR;
  416. return RT_EOK;
  417. }
  418. rt_err_t mmcsd_get_card_addr(struct rt_mmcsd_host *host, rt_uint32_t *rca)
  419. {
  420. rt_err_t err;
  421. struct rt_mmcsd_cmd cmd;
  422. rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
  423. cmd.cmd_code = SD_SEND_RELATIVE_ADDR;
  424. cmd.arg = 0;
  425. cmd.flags = RESP_R6 | CMD_BCR;
  426. err = mmcsd_send_cmd(host, &cmd, 3);
  427. if (err)
  428. return err;
  429. *rca = cmd.resp[0] >> 16;
  430. return RT_EOK;
  431. }
  432. #define be32_to_cpu(x) ((rt_uint32_t)( \
  433. (((rt_uint32_t)(x) & (rt_uint32_t)0x000000ffUL) << 24) | \
  434. (((rt_uint32_t)(x) & (rt_uint32_t)0x0000ff00UL) << 8) | \
  435. (((rt_uint32_t)(x) & (rt_uint32_t)0x00ff0000UL) >> 8) | \
  436. (((rt_uint32_t)(x) & (rt_uint32_t)0xff000000UL) >> 24)))
  437. rt_int32_t mmcsd_get_scr(struct rt_mmcsd_card *card, rt_uint32_t *scr)
  438. {
  439. rt_int32_t err;
  440. struct rt_mmcsd_req req;
  441. struct rt_mmcsd_cmd cmd;
  442. struct rt_mmcsd_data data;
  443. err = mmcsd_app_cmd(card->host, card);
  444. if (err)
  445. return err;
  446. rt_memset(&req, 0, sizeof(struct rt_mmcsd_req));
  447. rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
  448. rt_memset(&data, 0, sizeof(struct rt_mmcsd_data));
  449. req.cmd = &cmd;
  450. req.data = &data;
  451. cmd.cmd_code = SD_APP_SEND_SCR;
  452. cmd.arg = 0;
  453. cmd.flags = RESP_SPI_R1 | RESP_R1 | CMD_ADTC;
  454. data.blksize = 8;
  455. data.blks = 1;
  456. data.flags = DATA_DIR_READ;
  457. data.buf = scr;
  458. mmcsd_set_data_timeout(&data, card);
  459. mmcsd_send_request(card->host, &req);
  460. if (cmd.err)
  461. return cmd.err;
  462. if (data.err)
  463. return data.err;
  464. scr[0] = be32_to_cpu(scr[0]);
  465. scr[1] = be32_to_cpu(scr[1]);
  466. return 0;
  467. }
  468. static rt_err_t mmcsd_read_sd_status(struct rt_mmcsd_card *card, rt_uint32_t *sd_status)
  469. {
  470. rt_int32_t err;
  471. struct rt_mmcsd_req req;
  472. struct rt_mmcsd_cmd cmd;
  473. struct rt_mmcsd_data data;
  474. err = mmcsd_app_cmd(card->host, card);
  475. if (err)
  476. return err;
  477. rt_memset(&req, 0, sizeof(struct rt_mmcsd_req));
  478. rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
  479. rt_memset(&data, 0, sizeof(struct rt_mmcsd_data));
  480. req.cmd = &cmd;
  481. req.data = &data;
  482. cmd.cmd_code = SEND_STATUS;
  483. cmd.arg = 0;
  484. cmd.flags = RESP_SPI_R1 | RESP_R1 | CMD_ADTC;
  485. data.blksize = 64;
  486. data.blks = 1;
  487. data.flags = DATA_DIR_READ;
  488. data.buf = sd_status;
  489. mmcsd_set_data_timeout(&data, card);
  490. mmcsd_send_request(card->host, &req);
  491. if (cmd.err)
  492. return cmd.err;
  493. if (data.err)
  494. return data.err;
  495. /* Convert endian */
  496. for (uint32_t i=0; i < 8; i++)
  497. {
  498. uint32_t tmp = sd_status[i];
  499. sd_status[i] = sd_status[15 - i];
  500. sd_status[15 - i] = tmp;
  501. }
  502. for (uint32_t i=0; i < 16; i++)
  503. {
  504. sd_status[i] = be32_to_cpu(sd_status[i]);
  505. }
  506. return 0;
  507. }
  508. static rt_err_t sd_switch_voltage(struct rt_mmcsd_host *host)
  509. {
  510. rt_err_t err;
  511. struct rt_mmcsd_cmd cmd = { 0 };
  512. cmd.cmd_code = VOLTAGE_SWITCH;
  513. cmd.arg = 0;
  514. cmd.flags = RESP_R1 | CMD_AC;
  515. err = mmcsd_send_cmd(host, &cmd, 0);
  516. if (err)
  517. return err;
  518. return RT_EOK;
  519. }
  520. static rt_err_t sd_switch_uhs_voltage(struct rt_mmcsd_host *host)
  521. {
  522. if (host->ops->switch_uhs_voltage != RT_NULL)
  523. {
  524. return host->ops->switch_uhs_voltage(host);
  525. }
  526. return -ENOSYS;
  527. }
  528. static rt_int32_t mmcsd_sd_init_card(struct rt_mmcsd_host *host,
  529. rt_uint32_t ocr)
  530. {
  531. struct rt_mmcsd_card *card;
  532. rt_int32_t err;
  533. rt_uint32_t resp[4];
  534. rt_uint32_t max_data_rate;
  535. mmcsd_go_idle(host);
  536. /*
  537. * If SD_SEND_IF_COND indicates an SD 2.0
  538. * compliant card and we should set bit 30
  539. * of the ocr to indicate that we can handle
  540. * block-addressed SDHC cards.
  541. */
  542. err = mmcsd_send_if_cond(host, ocr);
  543. if (!err)
  544. ocr |= 1 << 30;
  545. /* Switch to UHS voltage if both Host and the Card support this feature */
  546. if (((host->valid_ocr & VDD_165_195) != 0) && (host->ops->switch_uhs_voltage != RT_NULL))
  547. {
  548. ocr |= OCR_S18R;
  549. }
  550. err = mmcsd_send_app_op_cond(host, ocr, &ocr);
  551. if (err)
  552. goto err2;
  553. /* Select voltage */
  554. if (ocr & OCR_S18R)
  555. {
  556. ocr = VDD_165_195;
  557. err = sd_switch_voltage(host);
  558. if (err)
  559. goto err2;
  560. err = sd_switch_uhs_voltage(host);
  561. if (err)
  562. goto err2;
  563. }
  564. if (controller_is_spi(host))
  565. err = mmcsd_get_cid(host, resp);
  566. else
  567. err = mmcsd_all_get_cid(host, resp);
  568. if (err)
  569. goto err2;
  570. card = rt_malloc(sizeof(struct rt_mmcsd_card));
  571. if (!card)
  572. {
  573. LOG_E("malloc card failed!");
  574. err = -RT_ENOMEM;
  575. goto err2;
  576. }
  577. rt_memset(card, 0, sizeof(struct rt_mmcsd_card));
  578. card->card_type = CARD_TYPE_SD;
  579. card->host = host;
  580. rt_memcpy(card->resp_cid, resp, sizeof(card->resp_cid));
  581. /*
  582. * For native busses: get card RCA and quit open drain mode.
  583. */
  584. if (!controller_is_spi(host))
  585. {
  586. err = mmcsd_get_card_addr(host, &card->rca);
  587. if (err)
  588. goto err1;
  589. mmcsd_set_bus_mode(host, MMCSD_BUSMODE_PUSHPULL);
  590. }
  591. err = mmcsd_get_csd(card, card->resp_csd);
  592. if (err)
  593. goto err1;
  594. err = mmcsd_parse_csd(card);
  595. if (err)
  596. goto err1;
  597. if (!controller_is_spi(host))
  598. {
  599. err = mmcsd_select_card(card);
  600. if (err)
  601. goto err1;
  602. }
  603. err = mmcsd_get_scr(card, card->resp_scr);
  604. if (err)
  605. goto err1;
  606. mmcsd_parse_scr(card);
  607. if (controller_is_spi(host))
  608. {
  609. err = mmcsd_spi_use_crc(host, 1);
  610. if (err)
  611. goto err1;
  612. }
  613. mmcsd_set_timing(host, MMCSD_TIMING_LEGACY);
  614. mmcsd_set_clock(host, 25000000);
  615. /*switch bus width*/
  616. if ((host->flags & MMCSD_BUSWIDTH_4) && (card->scr.sd_bus_widths & SD_SCR_BUS_WIDTH_4))
  617. {
  618. err = mmcsd_app_set_bus_width(card, MMCSD_BUS_WIDTH_4);
  619. if (err)
  620. goto err1;
  621. mmcsd_set_bus_width(host, MMCSD_BUS_WIDTH_4);
  622. }
  623. /* Read and decode SD Status and check whether UHS mode is supported */
  624. union rt_sd_status sd_status;
  625. err = mmcsd_read_sd_status(card, sd_status.status_words);
  626. if (err)
  627. goto err1;
  628. if ((sd_status.uhs_speed_grade > 0) && (ocr & VDD_165_195))
  629. {
  630. /* Assume the card supports all UHS-I modes because we cannot find any mainstreaming card
  631. * that can support only part of the following modes.
  632. */
  633. card->flags |= CARD_FLAG_SDR50 | CARD_FLAG_SDR104 | CARD_FLAG_DDR50;
  634. }
  635. /*
  636. * change SD card to the highest supported speed
  637. */
  638. err = mmcsd_switch(card);
  639. if (err)
  640. goto err1;
  641. /* set bus speed */
  642. max_data_rate = 0U;
  643. if (max_data_rate < card->hs_max_data_rate)
  644. {
  645. max_data_rate = card->hs_max_data_rate;
  646. }
  647. if (max_data_rate < card->max_data_rate)
  648. {
  649. max_data_rate = card->max_data_rate;
  650. }
  651. mmcsd_set_clock(host, max_data_rate);
  652. host->card = card;
  653. return 0;
  654. err1:
  655. rt_free(card);
  656. err2:
  657. return err;
  658. }
  659. /*
  660. * Starting point for SD card init.
  661. */
  662. rt_int32_t init_sd(struct rt_mmcsd_host *host, rt_uint32_t ocr)
  663. {
  664. rt_int32_t err = -RT_EINVAL;
  665. rt_uint32_t current_ocr;
  666. /*
  667. * We need to get OCR a different way for SPI.
  668. */
  669. if (controller_is_spi(host))
  670. {
  671. mmcsd_go_idle(host);
  672. err = mmcsd_spi_read_ocr(host, 0, &ocr);
  673. if (err)
  674. goto _err;
  675. }
  676. current_ocr = mmcsd_select_voltage(host, ocr);
  677. /*
  678. * Can we support the voltage(s) of the card(s)?
  679. */
  680. if (!current_ocr)
  681. {
  682. err = -RT_ERROR;
  683. goto _err;
  684. }
  685. /*
  686. * Detect and init the card.
  687. */
  688. err = mmcsd_sd_init_card(host, current_ocr);
  689. if (err)
  690. goto _err;
  691. mmcsd_host_unlock(host);
  692. err = rt_mmcsd_blk_probe(host->card);
  693. if (err)
  694. goto remove_card;
  695. mmcsd_host_lock(host);
  696. return 0;
  697. remove_card:
  698. mmcsd_host_lock(host);
  699. rt_mmcsd_blk_remove(host->card);
  700. rt_free(host->card);
  701. host->card = RT_NULL;
  702. _err:
  703. LOG_D("init SD card failed!");
  704. return err;
  705. }