mmc_spi.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. /*
  2. * generic mmc spi driver
  3. *
  4. * Copyright (C) 2010 Thomas Chou <thomas@wytron.com.tw>
  5. * Licensed under the GPL-2 or later.
  6. */
  7. #include <common.h>
  8. #include <errno.h>
  9. #include <malloc.h>
  10. #include <part.h>
  11. #include <mmc.h>
  12. #include <spi.h>
  13. #include <crc.h>
  14. #include <linux/crc7.h>
  15. #include <asm/byteorder.h>
  16. /* MMC/SD in SPI mode reports R1 status always */
  17. #define R1_SPI_IDLE (1 << 0)
  18. #define R1_SPI_ERASE_RESET (1 << 1)
  19. #define R1_SPI_ILLEGAL_COMMAND (1 << 2)
  20. #define R1_SPI_COM_CRC (1 << 3)
  21. #define R1_SPI_ERASE_SEQ (1 << 4)
  22. #define R1_SPI_ADDRESS (1 << 5)
  23. #define R1_SPI_PARAMETER (1 << 6)
  24. /* R1 bit 7 is always zero, reuse this bit for error */
  25. #define R1_SPI_ERROR (1 << 7)
  26. /* Response tokens used to ack each block written: */
  27. #define SPI_MMC_RESPONSE_CODE(x) ((x) & 0x1f)
  28. #define SPI_RESPONSE_ACCEPTED ((2 << 1)|1)
  29. #define SPI_RESPONSE_CRC_ERR ((5 << 1)|1)
  30. #define SPI_RESPONSE_WRITE_ERR ((6 << 1)|1)
  31. /* Read and write blocks start with these tokens and end with crc;
  32. * on error, read tokens act like a subset of R2_SPI_* values.
  33. */
  34. #define SPI_TOKEN_SINGLE 0xfe /* single block r/w, multiblock read */
  35. #define SPI_TOKEN_MULTI_WRITE 0xfc /* multiblock write */
  36. #define SPI_TOKEN_STOP_TRAN 0xfd /* terminate multiblock write */
  37. /* MMC SPI commands start with a start bit "0" and a transmit bit "1" */
  38. #define MMC_SPI_CMD(x) (0x40 | (x & 0x3f))
  39. /* bus capability */
  40. #define MMC_SPI_VOLTAGE (MMC_VDD_32_33 | MMC_VDD_33_34)
  41. #define MMC_SPI_MIN_CLOCK 400000 /* 400KHz to meet MMC spec */
  42. /* timeout value */
  43. #define CTOUT 8
  44. #define RTOUT 3000000 /* 1 sec */
  45. #define WTOUT 3000000 /* 1 sec */
  46. static uint mmc_spi_sendcmd(struct mmc *mmc, ushort cmdidx, u32 cmdarg)
  47. {
  48. struct spi_slave *spi = mmc->priv;
  49. u8 cmdo[7];
  50. u8 r1;
  51. int i;
  52. cmdo[0] = 0xff;
  53. cmdo[1] = MMC_SPI_CMD(cmdidx);
  54. cmdo[2] = cmdarg >> 24;
  55. cmdo[3] = cmdarg >> 16;
  56. cmdo[4] = cmdarg >> 8;
  57. cmdo[5] = cmdarg;
  58. cmdo[6] = (crc7(0, &cmdo[1], 5) << 1) | 0x01;
  59. spi_xfer(spi, sizeof(cmdo) * 8, cmdo, NULL, 0);
  60. for (i = 0; i < CTOUT; i++) {
  61. spi_xfer(spi, 1 * 8, NULL, &r1, 0);
  62. if (i && (r1 & 0x80) == 0) /* r1 response */
  63. break;
  64. }
  65. debug("%s:cmd%d resp%d %x\n", __func__, cmdidx, i, r1);
  66. return r1;
  67. }
  68. static uint mmc_spi_readdata(struct mmc *mmc, void *xbuf,
  69. u32 bcnt, u32 bsize)
  70. {
  71. struct spi_slave *spi = mmc->priv;
  72. u8 *buf = xbuf;
  73. u8 r1;
  74. u16 crc;
  75. int i;
  76. while (bcnt--) {
  77. for (i = 0; i < RTOUT; i++) {
  78. spi_xfer(spi, 1 * 8, NULL, &r1, 0);
  79. if (r1 != 0xff) /* data token */
  80. break;
  81. }
  82. debug("%s:tok%d %x\n", __func__, i, r1);
  83. if (r1 == SPI_TOKEN_SINGLE) {
  84. spi_xfer(spi, bsize * 8, NULL, buf, 0);
  85. spi_xfer(spi, 2 * 8, NULL, &crc, 0);
  86. #ifdef CONFIG_MMC_SPI_CRC_ON
  87. if (be_to_cpu16(crc16_ccitt(0, buf, bsize)) != crc) {
  88. debug("%s: CRC error\n", mmc->cfg->name);
  89. r1 = R1_SPI_COM_CRC;
  90. break;
  91. }
  92. #endif
  93. r1 = 0;
  94. } else {
  95. r1 = R1_SPI_ERROR;
  96. break;
  97. }
  98. buf += bsize;
  99. }
  100. return r1;
  101. }
  102. static uint mmc_spi_writedata(struct mmc *mmc, const void *xbuf,
  103. u32 bcnt, u32 bsize, int multi)
  104. {
  105. struct spi_slave *spi = mmc->priv;
  106. const u8 *buf = xbuf;
  107. u8 r1;
  108. u16 crc;
  109. u8 tok[2];
  110. int i;
  111. tok[0] = 0xff;
  112. tok[1] = multi ? SPI_TOKEN_MULTI_WRITE : SPI_TOKEN_SINGLE;
  113. while (bcnt--) {
  114. #ifdef CONFIG_MMC_SPI_CRC_ON
  115. crc = cpu_to_be16(crc16_ccitt(0, (u8 *)buf, bsize));
  116. #endif
  117. spi_xfer(spi, 2 * 8, tok, NULL, 0);
  118. spi_xfer(spi, bsize * 8, buf, NULL, 0);
  119. spi_xfer(spi, 2 * 8, &crc, NULL, 0);
  120. for (i = 0; i < CTOUT; i++) {
  121. spi_xfer(spi, 1 * 8, NULL, &r1, 0);
  122. if ((r1 & 0x10) == 0) /* response token */
  123. break;
  124. }
  125. debug("%s:tok%d %x\n", __func__, i, r1);
  126. if (SPI_MMC_RESPONSE_CODE(r1) == SPI_RESPONSE_ACCEPTED) {
  127. for (i = 0; i < WTOUT; i++) { /* wait busy */
  128. spi_xfer(spi, 1 * 8, NULL, &r1, 0);
  129. if (i && r1 == 0xff) {
  130. r1 = 0;
  131. break;
  132. }
  133. }
  134. if (i == WTOUT) {
  135. debug("%s:wtout %x\n", __func__, r1);
  136. r1 = R1_SPI_ERROR;
  137. break;
  138. }
  139. } else {
  140. debug("%s: err %x\n", __func__, r1);
  141. r1 = R1_SPI_COM_CRC;
  142. break;
  143. }
  144. buf += bsize;
  145. }
  146. if (multi && bcnt == -1) { /* stop multi write */
  147. tok[1] = SPI_TOKEN_STOP_TRAN;
  148. spi_xfer(spi, 2 * 8, tok, NULL, 0);
  149. for (i = 0; i < WTOUT; i++) { /* wait busy */
  150. spi_xfer(spi, 1 * 8, NULL, &r1, 0);
  151. if (i && r1 == 0xff) {
  152. r1 = 0;
  153. break;
  154. }
  155. }
  156. if (i == WTOUT) {
  157. debug("%s:wstop %x\n", __func__, r1);
  158. r1 = R1_SPI_ERROR;
  159. }
  160. }
  161. return r1;
  162. }
  163. static int mmc_spi_request(struct mmc *mmc, struct mmc_cmd *cmd,
  164. struct mmc_data *data)
  165. {
  166. struct spi_slave *spi = mmc->priv;
  167. u8 r1;
  168. int i;
  169. int ret = 0;
  170. debug("%s:cmd%d %x %x\n", __func__,
  171. cmd->cmdidx, cmd->resp_type, cmd->cmdarg);
  172. spi_claim_bus(spi);
  173. spi_cs_activate(spi);
  174. r1 = mmc_spi_sendcmd(mmc, cmd->cmdidx, cmd->cmdarg);
  175. if (r1 == 0xff) { /* no response */
  176. ret = -ENOMEDIUM;
  177. goto done;
  178. } else if (r1 & R1_SPI_COM_CRC) {
  179. ret = -ECOMM;
  180. goto done;
  181. } else if (r1 & ~R1_SPI_IDLE) { /* other errors */
  182. ret = -ETIMEDOUT;
  183. goto done;
  184. } else if (cmd->resp_type == MMC_RSP_R2) {
  185. r1 = mmc_spi_readdata(mmc, cmd->response, 1, 16);
  186. for (i = 0; i < 4; i++)
  187. cmd->response[i] = be32_to_cpu(cmd->response[i]);
  188. debug("r128 %x %x %x %x\n", cmd->response[0], cmd->response[1],
  189. cmd->response[2], cmd->response[3]);
  190. } else if (!data) {
  191. switch (cmd->cmdidx) {
  192. case SD_CMD_APP_SEND_OP_COND:
  193. case MMC_CMD_SEND_OP_COND:
  194. cmd->response[0] = (r1 & R1_SPI_IDLE) ? 0 : OCR_BUSY;
  195. break;
  196. case SD_CMD_SEND_IF_COND:
  197. case MMC_CMD_SPI_READ_OCR:
  198. spi_xfer(spi, 4 * 8, NULL, cmd->response, 0);
  199. cmd->response[0] = be32_to_cpu(cmd->response[0]);
  200. debug("r32 %x\n", cmd->response[0]);
  201. break;
  202. case MMC_CMD_SEND_STATUS:
  203. spi_xfer(spi, 1 * 8, NULL, cmd->response, 0);
  204. cmd->response[0] = (cmd->response[0] & 0xff) ?
  205. MMC_STATUS_ERROR : MMC_STATUS_RDY_FOR_DATA;
  206. break;
  207. }
  208. } else {
  209. debug("%s:data %x %x %x\n", __func__,
  210. data->flags, data->blocks, data->blocksize);
  211. if (data->flags == MMC_DATA_READ)
  212. r1 = mmc_spi_readdata(mmc, data->dest,
  213. data->blocks, data->blocksize);
  214. else if (data->flags == MMC_DATA_WRITE)
  215. r1 = mmc_spi_writedata(mmc, data->src,
  216. data->blocks, data->blocksize,
  217. (cmd->cmdidx == MMC_CMD_WRITE_MULTIPLE_BLOCK));
  218. if (r1 & R1_SPI_COM_CRC)
  219. ret = -ECOMM;
  220. else if (r1) /* other errors */
  221. ret = -ETIMEDOUT;
  222. }
  223. done:
  224. spi_cs_deactivate(spi);
  225. spi_release_bus(spi);
  226. return ret;
  227. }
  228. static int mmc_spi_set_ios(struct mmc *mmc)
  229. {
  230. struct spi_slave *spi = mmc->priv;
  231. debug("%s: clock %u\n", __func__, mmc->clock);
  232. if (mmc->clock)
  233. spi_set_speed(spi, mmc->clock);
  234. return 0;
  235. }
  236. static int mmc_spi_init_p(struct mmc *mmc)
  237. {
  238. struct spi_slave *spi = mmc->priv;
  239. spi_set_speed(spi, MMC_SPI_MIN_CLOCK);
  240. spi_claim_bus(spi);
  241. /* cs deactivated for 100+ clock */
  242. spi_xfer(spi, 18 * 8, NULL, NULL, 0);
  243. spi_release_bus(spi);
  244. return 0;
  245. }
  246. static const struct mmc_ops mmc_spi_ops = {
  247. .send_cmd = mmc_spi_request,
  248. .set_ios = mmc_spi_set_ios,
  249. .init = mmc_spi_init_p,
  250. };
  251. static struct mmc_config mmc_spi_cfg = {
  252. .name = "MMC_SPI",
  253. .ops = &mmc_spi_ops,
  254. .host_caps = MMC_MODE_SPI,
  255. .voltages = MMC_SPI_VOLTAGE,
  256. .f_min = MMC_SPI_MIN_CLOCK,
  257. .part_type = PART_TYPE_DOS,
  258. .b_max = CONFIG_SYS_MMC_MAX_BLK_COUNT,
  259. };
  260. struct mmc *mmc_spi_init(uint bus, uint cs, uint speed, uint mode)
  261. {
  262. struct mmc *mmc;
  263. struct spi_slave *spi;
  264. spi = spi_setup_slave(bus, cs, speed, mode);
  265. if (spi == NULL)
  266. return NULL;
  267. mmc_spi_cfg.f_max = speed;
  268. mmc = mmc_create(&mmc_spi_cfg, spi);
  269. if (mmc == NULL) {
  270. spi_free_slave(spi);
  271. return NULL;
  272. }
  273. return mmc;
  274. }