drv_sdio.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-02-08 RT-Thread the first version
  9. */
  10. #include <rtthread.h>
  11. #include <rthw.h>
  12. #include <rtdevice.h>
  13. #include <string.h>
  14. #include "drv_sdio.h"
  15. #include "interrupt.h"
  16. #include "mmu.h"
  17. #include "drv_gpio.h"
  18. #include "drv_clock.h"
  19. #define DBG_TAG "MMC"
  20. // #define DBG_LVL DBG_LOG
  21. // #define DBG_LVL DBG_INFO
  22. #define DBG_LVL DBG_WARNING
  23. // #define DBG_LVL DBG_ERROR
  24. #include <rtdbg.h>
  25. #ifdef RT_USING_SDIO
  26. #define CONFIG_MMC_USE_DMA
  27. #define DMA_ALIGN (32U)
  28. struct mmc_xfe_des
  29. {
  30. rt_uint32_t size; /* block size */
  31. rt_uint32_t num; /* block num */
  32. rt_uint8_t *buff; /* buff addr */
  33. rt_uint32_t flag; /* write or read or stream */
  34. #define MMC_DATA_WRITE (1 << 0)
  35. #define MMC_DATA_READ (1 << 1)
  36. #define MMC_DATA_STREAM (1 << 2)
  37. };
  38. struct mmc_flag
  39. {
  40. volatile rt_uint32_t risr;
  41. volatile rt_uint32_t idst;
  42. };
  43. struct sdio_drv
  44. {
  45. struct rt_mmcsd_host *host;
  46. struct rt_mmcsd_req *req;
  47. struct rt_semaphore rt_sem;
  48. struct mmc_xfe_des xfe;
  49. struct mmc_flag flag;
  50. tina_mmc_t mmc_des;
  51. rt_uint8_t *mmc_buf;
  52. rt_uint8_t usedma;
  53. };
  54. #ifdef CONFIG_MMC_USE_DMA
  55. #ifdef TINA_USING_SDIO0
  56. rt_align(32) static rt_uint8_t dma_buffer[64 * 1024];
  57. #endif
  58. #endif
  59. static void mmc_request_end(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req);
  60. static void mmc_delay_us(int us)
  61. {
  62. volatile unsigned int temp;
  63. while (us--)
  64. {
  65. temp = 0x2f;
  66. while (temp--)
  67. {
  68. temp = temp;
  69. };
  70. }
  71. }
  72. static void mmc_dump_errinfo(unsigned int err)
  73. {
  74. LOG_E("[err]:0x%08x, %s%s%s%s%s%s%s%s%s%s%s",
  75. err,
  76. err & SDXC_RespErr ? " RE" : "",
  77. err & SDXC_RespCRCErr ? " RCE" : "",
  78. err & SDXC_DataCRCErr ? " DCE" : "",
  79. err & SDXC_RespTimeout ? " RTO" : "",
  80. err & SDXC_DataTimeout ? " DTO" : "",
  81. err & SDXC_DataStarve ? " DS" : "",
  82. err & SDXC_FIFORunErr ? " FE" : "",
  83. err & SDXC_HardWLocked ? " HL" : "",
  84. err & SDXC_StartBitErr ? " SBE" : "",
  85. err & SDXC_EndBitErr ? " EBE" : "",
  86. err == 0 ? " STO" : ""
  87. );
  88. }
  89. static int mmc_update_clk(tina_mmc_t mmc)
  90. {
  91. rt_uint32_t cmd;
  92. rt_uint32_t timeout = 2000000;
  93. /* cmd load */
  94. cmd = SDXC_LOAD_CMD | SDXC_UPDATE_CLOCK_CMD | SDXC_WAIT_OVER_CMD;
  95. mmc->cmdr_reg = cmd;
  96. /* while load success */
  97. while ((mmc->cmdr_reg & SDXC_LOAD_CMD) && (--timeout))
  98. {
  99. mmc_delay_us(1);
  100. }
  101. if (!timeout)
  102. {
  103. LOG_E("mmc update clk failed");
  104. return -RT_ERROR;
  105. }
  106. /* clean interrupt */
  107. mmc->risr_reg = mmc->risr_reg;
  108. return RT_EOK;
  109. }
  110. static rt_err_t mmc_trans_data_by_dma(tina_mmc_t mmc, struct mmc_xfe_des *xfe)
  111. {
  112. rt_align(32) static struct mmc_des_v4p1 pdes[128];
  113. unsigned i, rval;
  114. unsigned des_idx;
  115. unsigned length = xfe->size * xfe->num;
  116. unsigned buff_frag_num = length >> SDXC_DES_NUM_SHIFT;
  117. unsigned remain = length & (SDXC_DES_BUFFER_MAX_LEN - 1);
  118. if (remain)
  119. {
  120. buff_frag_num ++;
  121. }
  122. else
  123. {
  124. remain = SDXC_DES_BUFFER_MAX_LEN;
  125. }
  126. memset(pdes, 0, sizeof(pdes));
  127. mmu_clean_dcache((rt_uint32_t)(xfe->buff), length);
  128. for (i = 0, des_idx = 0; i < buff_frag_num; i++, des_idx++)
  129. {
  130. // memset((void*)&pdes[des_idx], 0, sizeof(struct mmc_v4p1));
  131. pdes[des_idx].des_chain = 1;
  132. pdes[des_idx].own = 1;
  133. pdes[des_idx].dic = 1;
  134. if ((buff_frag_num > 1) && (i != buff_frag_num - 1))
  135. {
  136. pdes[des_idx].data_buf1_sz = SDXC_DES_BUFFER_MAX_LEN;
  137. }
  138. else
  139. {
  140. pdes[des_idx].data_buf1_sz = remain;
  141. }
  142. pdes[des_idx].buf_addr_ptr1 = (unsigned long)(xfe->buff) + i * SDXC_DES_BUFFER_MAX_LEN;
  143. if (i == 0)
  144. {
  145. pdes[des_idx].first_des = 1;
  146. }
  147. if (i == (buff_frag_num - 1))
  148. {
  149. pdes[des_idx].dic = 0;
  150. pdes[des_idx].last_des = 1;
  151. pdes[des_idx].end_of_ring = 1;
  152. pdes[des_idx].buf_addr_ptr2 = 0;
  153. }
  154. else
  155. {
  156. pdes[des_idx].buf_addr_ptr2 = (unsigned long)&pdes[des_idx+1];
  157. }
  158. LOG_D("frag %d, remain %d, des[%d](%08x): " \
  159. "[0] = %08x, [1] = %08x, [2] = %08x, [3] = %08x", \
  160. i, remain, des_idx, (unsigned int)&pdes[des_idx],
  161. (unsigned int)((unsigned int*)&pdes[des_idx])[0], (unsigned int)((unsigned int*)&pdes[des_idx])[1],
  162. (unsigned int)((unsigned int*)&pdes[des_idx])[2], (unsigned int)((unsigned int*)&pdes[des_idx])[3]);
  163. }
  164. mmu_clean_dcache((rt_uint32_t)pdes, sizeof(struct mmc_des_v4p1) * (des_idx + 1));
  165. /*
  166. * GCTRLREG
  167. * GCTRL[2] : DMA reset
  168. * GCTRL[5] : DMA enable
  169. *
  170. * IDMACREG
  171. * IDMAC[0] : IDMA soft reset
  172. * IDMAC[1] : IDMA fix burst flag
  173. * IDMAC[7] : IDMA on
  174. *
  175. * IDIECREG
  176. * IDIE[0] : IDMA transmit interrupt flag
  177. * IDIE[1] : IDMA receive interrupt flag
  178. */
  179. rval = mmc->gctl_reg;
  180. mmc->gctl_reg = rval | (1 << 5) | (1 << 2); /* dma enable */
  181. mmc->dmac_reg = (1 << 0); /* idma reset */
  182. while(mmc->dmac_reg & 0x1) {}; /* wait idma reset done */
  183. mmc->dmac_reg = (1 << 1) | (1 << 7); /* idma on */
  184. rval = mmc->idie_reg & (~3);
  185. if (xfe->flag == MMC_DATA_WRITE)
  186. rval |= (1 << 0);
  187. else
  188. rval |= (1 << 1);
  189. mmc->idie_reg = rval;
  190. mmc->dlba_reg = (unsigned long)pdes;
  191. mmc->fwlr_reg = (2U << 28) | (7U << 16) | 8;
  192. return 0;
  193. }
  194. static rt_err_t mmc_trans_data_by_cpu(tina_mmc_t mmc, struct mmc_xfe_des *xfe)
  195. {
  196. unsigned i;
  197. unsigned byte_cnt = xfe->size * xfe->num;
  198. unsigned *buff = (unsigned *)(xfe->buff);
  199. volatile unsigned timeout = 2000000;
  200. if (xfe->flag == MMC_DATA_WRITE)
  201. {
  202. for (i = 0; i < (byte_cnt >> 2); i++)
  203. {
  204. while(--timeout && (mmc->star_reg & (1 << 3)));
  205. if (timeout <= 0)
  206. {
  207. LOG_E("write data by cpu failed status:0x%08x", mmc->star_reg);
  208. return -RT_ERROR;
  209. }
  210. mmc->fifo_reg = buff[i];
  211. timeout = 2000000;
  212. }
  213. }
  214. else
  215. {
  216. for (i = 0; i < (byte_cnt >> 2); i++)
  217. {
  218. while(--timeout && (mmc->star_reg & (1 << 2)));
  219. if (timeout <= 0)
  220. {
  221. LOG_E("read data by cpu failed status:0x%08x", mmc->star_reg);
  222. return -RT_ERROR;
  223. }
  224. buff[i] = mmc->fifo_reg;
  225. timeout = 2000000;
  226. }
  227. }
  228. return RT_EOK;
  229. }
  230. static rt_err_t mmc_config_clock(tina_mmc_t mmc, int clk)
  231. {
  232. rt_uint32_t rval = 0;
  233. /* disable card clock */
  234. rval = mmc->ckcr_reg;
  235. rval &= ~(1 << 16);
  236. mmc->ckcr_reg = rval;
  237. if (mmc_update_clk(mmc) != RT_EOK)
  238. {
  239. LOG_E("clk update fail line:%d", __LINE__);
  240. return -RT_ERROR;
  241. }
  242. if (mmc == MMC0)
  243. {
  244. mmc_set_clk(SDMMC0, clk);
  245. }
  246. else
  247. {
  248. mmc_set_clk(SDMMC1, clk);
  249. }
  250. /* Re-enable card clock */
  251. rval = mmc->ckcr_reg;
  252. rval |= (0x1 << 16); //(3 << 16);
  253. mmc->ckcr_reg = rval;
  254. if(mmc_update_clk(mmc) != RT_EOK)
  255. {
  256. LOG_E("clk update fail line:%d", __LINE__);
  257. return -RT_ERROR;
  258. }
  259. return RT_EOK;
  260. }
  261. static rt_err_t mmc_set_ios(tina_mmc_t mmc, int clk, int bus_width)
  262. {
  263. LOG_D("mmc set io bus width:%d clock:%d", \
  264. (bus_width == MMCSD_BUS_WIDTH_8 ? 8 : (bus_width == MMCSD_BUS_WIDTH_4 ? 4 : 1)), clk);
  265. /* change clock */
  266. if (clk && (mmc_config_clock(mmc, clk) != RT_EOK))
  267. {
  268. LOG_E("update clock failed");
  269. return -RT_ERROR;
  270. }
  271. /* Change bus width */
  272. if (bus_width == MMCSD_BUS_WIDTH_8)
  273. {
  274. mmc->bwdr_reg = 2;
  275. }
  276. else if (bus_width == MMCSD_BUS_WIDTH_4)
  277. {
  278. mmc->bwdr_reg = 1;
  279. }
  280. else
  281. {
  282. mmc->bwdr_reg = 0;
  283. }
  284. return RT_EOK;
  285. }
  286. static int mmc_send_cmd(struct rt_mmcsd_host *host, struct rt_mmcsd_cmd *cmd)
  287. {
  288. unsigned int cmdval = 0x80000000;
  289. signed int timeout = 0;
  290. int err = 0;
  291. unsigned int status = 0;
  292. struct rt_mmcsd_data *data = cmd->data;
  293. unsigned int bytecnt = 0;
  294. struct sdio_drv *sdio_des = (struct sdio_drv *)host->private_data;
  295. tina_mmc_t mmc = sdio_des->mmc_des;
  296. timeout = 5000 * 1000;
  297. status = mmc->star_reg;
  298. while (status & (1 << 9))
  299. {
  300. LOG_D("note: check card busy");
  301. status = mmc->star_reg;
  302. if (!timeout--)
  303. {
  304. err = -1;
  305. LOG_E("mmc cmd12 busy timeout data:0x%08x", status);
  306. return err;
  307. }
  308. mmc_delay_us(1);
  309. }
  310. /*
  311. * CMDREG
  312. * CMD[5:0] : Command index
  313. * CMD[6] : Has response
  314. * CMD[7] : Long response
  315. * CMD[8] : Check response CRC
  316. * CMD[9] : Has data
  317. * CMD[10] : Write
  318. * CMD[11] : Steam mode
  319. * CMD[12] : Auto stop
  320. * CMD[13] : Wait previous over
  321. * CMD[14] : About cmd
  322. * CMD[15] : Send initialization
  323. * CMD[21] : Update clock
  324. * CMD[31] : Load cmd
  325. */
  326. if (!cmd->cmd_code)
  327. cmdval |= (1 << 15);
  328. if (resp_type(cmd) != RESP_NONE)
  329. cmdval |= (1 << 6);
  330. if (resp_type(cmd) == RESP_R2)
  331. cmdval |= (1 << 7);
  332. if ((resp_type(cmd) != RESP_R3) && (resp_type(cmd) != RESP_R4))
  333. cmdval |= (1 << 8);
  334. if (data)
  335. {
  336. cmdval |= (1 << 9) | (1 << 13);
  337. if (data->flags & DATA_DIR_WRITE)
  338. cmdval |= (1 << 10);
  339. if (data->blks > 1)
  340. cmdval |= (1 << 12);
  341. mmc->bksr_reg = data->blksize;
  342. bytecnt = data->blksize * data->blks;
  343. mmc->bycr_reg = bytecnt;
  344. }
  345. LOG_D("cmd %d(0x%08x), arg 0x%08x", cmd->cmd_code, cmdval | cmd->cmd_code, cmd->arg);
  346. mmc->cagr_reg = cmd->arg;
  347. if (!data)
  348. {
  349. mmc->cmdr_reg = cmdval | cmd->cmd_code;
  350. mmc->imkr_reg |= 0x1 << 2;
  351. }
  352. /*
  353. * transfer data and check status
  354. * STATREG[2] : FIFO empty
  355. * STATREG[3] : FIFO full
  356. */
  357. if (data)
  358. {
  359. LOG_D("mmc trans data %d bytes addr:0x%08x", bytecnt, data);
  360. #ifdef CONFIG_MMC_USE_DMA
  361. if (bytecnt > 64)
  362. {
  363. #else
  364. if (0)
  365. {
  366. #endif
  367. sdio_des->usedma = 1;
  368. mmc->gctl_reg = mmc->gctl_reg & (~0x80000000);
  369. mmc_trans_data_by_dma(mmc, &sdio_des->xfe);
  370. mmc->cmdr_reg = cmdval | cmd->cmd_code;
  371. }
  372. else
  373. {
  374. sdio_des->usedma = 0;
  375. mmc->gctl_reg = mmc->gctl_reg | 0x80000000;
  376. mmc->cmdr_reg = cmdval | cmd->cmd_code;
  377. mmc_trans_data_by_cpu(mmc, &sdio_des->xfe);
  378. }
  379. if (data->blks > 1)
  380. {
  381. mmc->imkr_reg |= (0x1 << 14);
  382. }
  383. else
  384. {
  385. mmc->imkr_reg |= (0x1 << 3);
  386. }
  387. }
  388. mmc->imkr_reg |= 0xbfc2;
  389. if (data)
  390. {
  391. //TODO:2 * bytecnt * 4?
  392. timeout = sdio_des->usedma ? (2 * bytecnt * 4) : 100; //0.04us(25M)*2(4bit width)*25()
  393. if (timeout < 10)
  394. {
  395. timeout = 10;
  396. }
  397. }
  398. else
  399. {
  400. timeout = 200;
  401. }
  402. if (rt_sem_take(&sdio_des->rt_sem, timeout) != RT_EOK)
  403. {
  404. err = (mmc->risr_reg | sdio_des->flag.risr) & 0xbfc2;
  405. goto out;
  406. }
  407. err = (mmc->risr_reg | sdio_des->flag.risr) & 0xbfc2;
  408. if (err)
  409. {
  410. cmd->err = -RT_ETIMEOUT;
  411. goto out;
  412. }
  413. if (resp_type(cmd) == RESP_R2)
  414. {
  415. cmd->resp[3] = mmc->resp0_reg;
  416. cmd->resp[2] = mmc->resp1_reg;
  417. cmd->resp[1] = mmc->resp2_reg;
  418. cmd->resp[0] = mmc->resp3_reg;
  419. LOG_D("mmc resp 0x%08x 0x%08x 0x%08x 0x%08x",
  420. cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3]);
  421. }
  422. else
  423. {
  424. cmd->resp[0] = mmc->resp0_reg;
  425. LOG_D("mmc resp 0x%08x", cmd->resp[0]);
  426. }
  427. out:
  428. if (err)
  429. {
  430. mmc_dump_errinfo(err & 0xbfc2);
  431. }
  432. if (data && sdio_des->usedma)
  433. {
  434. /* IDMASTAREG
  435. * IDST[0] : idma tx int
  436. * IDST[1] : idma rx int
  437. * IDST[2] : idma fatal bus error
  438. * IDST[4] : idma descriptor invalid
  439. * IDST[5] : idma error summary
  440. * IDST[8] : idma normal interrupt sumary
  441. * IDST[9] : idma abnormal interrupt sumary
  442. */
  443. status = mmc->idst_reg;
  444. mmc->idst_reg = status;
  445. mmc->idie_reg = 0;
  446. mmc->dmac_reg = 0;
  447. mmc->gctl_reg = mmc->gctl_reg & (~(1 << 5));
  448. }
  449. if (err)
  450. {
  451. if (data && (data->flags & DATA_DIR_READ) && (bytecnt == 512))
  452. {
  453. mmc->gctl_reg = mmc->gctl_reg | 0x80000000;
  454. mmc->dbgc_reg = 0xdeb;
  455. timeout = 1000;
  456. LOG_D("Read remain data");
  457. while (mmc->bbcr_reg < 512)
  458. {
  459. unsigned int tmp = mmc->fifo_reg;
  460. tmp = tmp;
  461. LOG_D("Read data 0x%08x, bbcr 0x%04x", tmp, mmc->bbcr_reg);
  462. mmc_delay_us(1);
  463. if (!(timeout--))
  464. {
  465. LOG_E("Read remain data timeout");
  466. break;
  467. }
  468. }
  469. }
  470. mmc->gctl_reg = 0x7;
  471. while (mmc->gctl_reg & 0x7) { };
  472. mmc_update_clk(mmc);
  473. cmd->err = -RT_ETIMEOUT;
  474. LOG_E("mmc cmd %d err", cmd->cmd_code);
  475. }
  476. mmc->gctl_reg &= ~(0x1 << 4);
  477. mmc->imkr_reg &= ~0xffff;
  478. mmc->risr_reg = 0xffffffff;
  479. mmc->gctl_reg |= 0x1 << 4;
  480. while (!rt_sem_take(&sdio_des->rt_sem, 0)) {}
  481. mmc_request_end(sdio_des->host, sdio_des->req);
  482. return err;
  483. }
  484. static void mmc_request_end(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req)
  485. {
  486. struct rt_mmcsd_data *data;
  487. unsigned byte_cnt;
  488. struct sdio_drv *sdio = (struct sdio_drv *)host->private_data;
  489. #ifdef CONFIG_MMC_USE_DMA
  490. data = req->cmd->data;
  491. if (data)
  492. {
  493. byte_cnt = data->blksize * data->blks;
  494. if ((byte_cnt > 64) && (data->flags & DATA_DIR_READ))
  495. {
  496. mmu_invalidate_dcache((rt_uint32_t)sdio->xfe.buff, (rt_uint32_t)byte_cnt);
  497. if (((rt_uint32_t)data->buf) & (DMA_ALIGN - 1))
  498. {
  499. memcpy(data->buf, sdio->xfe.buff, byte_cnt);
  500. }
  501. }
  502. }
  503. #endif
  504. mmcsd_req_complete(host);
  505. }
  506. static void sdio_request_send(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req)
  507. {
  508. struct rt_mmcsd_data *data;
  509. int byte_cnt;
  510. struct sdio_drv *sdio;
  511. sdio = (struct sdio_drv *)host->private_data;
  512. sdio->req = req;
  513. data = req->cmd->data;
  514. if (data)
  515. {
  516. sdio->xfe.size = data->blksize;
  517. sdio->xfe.num = data->blks;
  518. sdio->xfe.buff = (rt_uint8_t *)data->buf;
  519. sdio->xfe.flag = (data->flags & DATA_DIR_WRITE) ? \
  520. MMC_DATA_WRITE : MMC_DATA_READ;
  521. #ifdef CONFIG_MMC_USE_DMA
  522. byte_cnt = data->blksize * data->blks;
  523. if ((byte_cnt > 64) && (((rt_uint32_t)data->buf) & (DMA_ALIGN - 1)))
  524. {
  525. sdio->xfe.buff = (rt_uint8_t *)sdio->mmc_buf;
  526. if (data->flags & DATA_DIR_WRITE)
  527. {
  528. memcpy(sdio->mmc_buf, data->buf, byte_cnt);
  529. mmu_clean_dcache((rt_uint32_t)sdio->mmc_buf, (rt_uint32_t)byte_cnt);
  530. }
  531. }
  532. #endif
  533. }
  534. memset(&sdio->flag, 0, sizeof(struct mmc_flag));
  535. mmc_send_cmd(host, req->cmd);
  536. return;
  537. }
  538. static void sdio_set_iocfg(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io_cfg)
  539. {
  540. int clk = io_cfg->clock;
  541. int width = io_cfg->bus_width;
  542. struct sdio_drv *sdio_des = (struct sdio_drv *)host->private_data;
  543. tina_mmc_t mmc = sdio_des->mmc_des;
  544. mmc_set_ios(mmc, clk, width);
  545. }
  546. static const struct rt_mmcsd_host_ops ops =
  547. {
  548. sdio_request_send,
  549. sdio_set_iocfg,
  550. RT_NULL,
  551. RT_NULL,
  552. };
  553. static void sdio_interrupt_handle(int irqno, void *param)
  554. {
  555. rt_uint32_t risr, idst;
  556. rt_uint32_t status;
  557. struct sdio_drv *sdio_des = (struct sdio_drv *)param;
  558. struct rt_mmcsd_data *data = sdio_des->req->cmd->data;
  559. tina_mmc_t mmc = sdio_des->mmc_des;
  560. risr = mmc->risr_reg;
  561. idst = mmc->idst_reg;
  562. mmc->risr_reg = risr & mmc->imkr_reg;
  563. mmc->idst_reg = idst & mmc->idie_reg;
  564. sdio_des->flag.risr |= risr;
  565. sdio_des->flag.idst |= idst;
  566. if (data)
  567. {
  568. int done = 0;
  569. status = sdio_des->flag.risr | mmc->risr_reg;
  570. if (data->blks > 1)//not wait auto stop when MMC_CMD_MANUAL is set
  571. {
  572. if (sdio_des->usedma)
  573. done = ((status & (1 << 14)) && (sdio_des->flag.idst & 0x3)) ? 1 : 0;
  574. else
  575. done = status & (1 << 14);
  576. }
  577. else
  578. {
  579. if (sdio_des->usedma)
  580. done = ((status & (1 << 3)) && (sdio_des->flag.idst & 0x3)) ? 1 : 0;
  581. else
  582. done = status & (1 << 3);
  583. }
  584. if (done)
  585. {
  586. rt_sem_release(&sdio_des->rt_sem);
  587. }
  588. }
  589. else
  590. {
  591. rt_sem_release(&sdio_des->rt_sem);
  592. }
  593. }
  594. static void sdio_gpio_init(struct sdio_drv *sdio_des)
  595. {
  596. int pin;
  597. if ((rt_uint32_t)sdio_des->mmc_des == MMC0_BASE_ADDR)
  598. {
  599. /* SDC0: PF0-PF5 */
  600. for (pin = GPIO_PIN_0; pin <= GPIO_PIN_5; pin++)
  601. {
  602. gpio_set_func(GPIO_PORT_F, pin, IO_FUN_1);
  603. gpio_set_pull_mode(GPIO_PORT_F, pin, PULL_UP);
  604. gpio_set_drive_level(GPIO_PORT_F, pin, DRV_LEVEL_2);
  605. }
  606. }
  607. else if ((rt_uint32_t)sdio_des->mmc_des == MMC1_BASE_ADDR)
  608. {
  609. //todo: config gpio port
  610. RT_ASSERT(0);
  611. }
  612. }
  613. static void sdio_clk_io_on(struct sdio_drv *sdio_des)
  614. {
  615. if ((rt_uint32_t)sdio_des->mmc_des == MMC0_BASE_ADDR)
  616. {
  617. CCU->bus_clk_gating0 |= 0x1 << 8;
  618. CCU->bus_soft_rst0 |= 0x1 << 8;
  619. }
  620. else if ((rt_uint32_t)sdio_des->mmc_des == MMC1_BASE_ADDR)
  621. {
  622. CCU->bus_clk_gating0 |= 0x1 << 9;
  623. CCU->bus_soft_rst0 |= 0x1 << 9;
  624. }
  625. mmc_set_clk(SDMMC0, 24000000);
  626. }
  627. static void sdio_irq_init(void *param)
  628. {
  629. struct sdio_drv *sdio_des = (struct sdio_drv *)param;
  630. if ((rt_uint32_t)sdio_des->mmc_des == MMC0_BASE_ADDR)
  631. {
  632. rt_hw_interrupt_install(SDC0_INTERRUPT, sdio_interrupt_handle, param, "mmc0_irq");
  633. rt_hw_interrupt_umask(SDC0_INTERRUPT);
  634. }
  635. else if ((rt_uint32_t)sdio_des->mmc_des == MMC1_BASE_ADDR)
  636. {
  637. rt_hw_interrupt_install(SDC1_INTERRUPT, sdio_interrupt_handle, param, "mmc1_irq");
  638. rt_hw_interrupt_umask(SDC1_INTERRUPT);
  639. }
  640. sdio_des->mmc_des->gctl_reg |= (0x1 << 4);
  641. }
  642. int tina_sdio_init(void)
  643. {
  644. struct rt_mmcsd_host *host;
  645. #ifdef TINA_USING_SDIO0
  646. {
  647. static struct sdio_drv _sdio_drv;
  648. host = mmcsd_alloc_host();
  649. if (!host)
  650. {
  651. LOG_E("alloc host failed");
  652. goto err;
  653. }
  654. if (rt_sem_init(&_sdio_drv.rt_sem, "sdio_sem", RT_NULL, RT_IPC_FLAG_FIFO))
  655. {
  656. LOG_E("sem init failed");
  657. goto err;
  658. }
  659. _sdio_drv.mmc_des = (tina_mmc_t)MMC0_BASE_ADDR;
  660. _sdio_drv.mmc_buf = dma_buffer;
  661. //init gpio pin
  662. sdio_gpio_init(&_sdio_drv);
  663. //clk is on
  664. sdio_clk_io_on(&_sdio_drv);
  665. //irq init
  666. sdio_irq_init(&_sdio_drv);
  667. host->ops = &ops;
  668. host->freq_min = 400 * 1000;
  669. host->freq_max = 50 * 1000 * 1000;
  670. host->valid_ocr = VDD_26_27 | VDD_27_28 | VDD_28_29 | VDD_29_30 | VDD_30_31 | VDD_31_32 |
  671. VDD_32_33 | VDD_33_34 | VDD_34_35 | VDD_35_36;
  672. host->flags = MMCSD_BUSWIDTH_4 | MMCSD_MUTBLKWRITE | MMCSD_SUP_SDIO_IRQ | MMCSD_SUP_HIGHSPEED;
  673. host->max_seg_size = 2048;
  674. host->max_dma_segs = 10;
  675. host->max_blk_size = 512;
  676. host->max_blk_count = 4096;
  677. host->private_data = &_sdio_drv;
  678. _sdio_drv.host = host;
  679. mmcsd_change(host);
  680. }
  681. #endif
  682. return RT_EOK;
  683. err:
  684. if (host)
  685. {
  686. rt_free(host);
  687. }
  688. return -RT_ERROR;
  689. }
  690. INIT_APP_EXPORT(tina_sdio_init);
  691. #endif