sd_card_sdio.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. // Driver for accessing SD card in SDIO mode on RP2040.
  2. #include "ZuluSCSI_platform.h"
  3. #ifdef SD_USE_SDIO
  4. #include "ZuluSCSI_log.h"
  5. #include "rp2040_sdio.h"
  6. #include <hardware/gpio.h>
  7. #include <SdFat.h>
  8. #include <SdCard/SdCardInfo.h>
  9. bool SdioCard::begin(SdioConfig sdioConfig)
  10. {
  11. uint32_t reply;
  12. rp2040_sdio_init();
  13. delay(1);
  14. rp2040_sdio_command_R1(CMD0, 0, NULL); // GO_IDLE_STATE
  15. rp2040_sdio_command_R1(CMD8, 0x1AA, &reply); // SEND_IF_COND
  16. azdbg("Reply ", reply);
  17. rp2040_sdio_command_R1(CMD0, 0, NULL); // GO_IDLE_STATE
  18. rp2040_sdio_command_R1(CMD8, 0x1AA, &reply); // SEND_IF_COND
  19. azdbg("Reply ", reply);
  20. delay(100);
  21. return false;
  22. }
  23. uint8_t SdioCard::errorCode() const
  24. {
  25. return SD_CARD_ERROR_NONE;
  26. }
  27. uint32_t SdioCard::errorData() const
  28. {
  29. return 0;
  30. }
  31. uint32_t SdioCard::errorLine() const
  32. {
  33. return 0;
  34. }
  35. bool SdioCard::isBusy()
  36. {
  37. return (sio_hw->gpio_in & (1 << SDIO_D0)) == 0;
  38. }
  39. uint32_t SdioCard::kHzSdClk()
  40. {
  41. return 0;
  42. }
  43. bool SdioCard::readCID(cid_t* cid)
  44. {
  45. return true;
  46. }
  47. bool SdioCard::readCSD(csd_t* csd)
  48. {
  49. return true;
  50. }
  51. bool SdioCard::readOCR(uint32_t* ocr)
  52. {
  53. return true;
  54. }
  55. bool SdioCard::readData(uint8_t* dst)
  56. {
  57. azlog("SdioCard::readData() called but not implemented!");
  58. return false;
  59. }
  60. bool SdioCard::readStart(uint32_t sector)
  61. {
  62. azlog("SdioCard::readStart() called but not implemented!");
  63. return false;
  64. }
  65. bool SdioCard::readStop()
  66. {
  67. azlog("SdioCard::readStop() called but not implemented!");
  68. return false;
  69. }
  70. uint32_t SdioCard::sectorCount()
  71. {
  72. // csd_t csd;
  73. // sd_csd_get((uint8_t*)&csd);
  74. // return sdCardCapacity(&csd);
  75. return 0;
  76. }
  77. uint32_t SdioCard::status()
  78. {
  79. // uint32_t status = 0;
  80. // if (!checkReturnOk(sd_cardstatus_get(&status)))
  81. // return 0;
  82. // else
  83. // return status;
  84. return 0;
  85. }
  86. bool SdioCard::stopTransmission(bool blocking)
  87. {
  88. return false;
  89. // if (!checkReturnOk(sd_transfer_stop()))
  90. // return false;
  91. // if (!blocking)
  92. // {
  93. // return true;
  94. // }
  95. // else
  96. // {
  97. // uint32_t end = millis() + 100;
  98. // while (millis() < end && isBusy())
  99. // {
  100. // }
  101. // if (isBusy())
  102. // {
  103. // azlog("SdioCard::stopTransmission() timeout");
  104. // return false;
  105. // }
  106. // else
  107. // {
  108. // return true;
  109. // }
  110. // }
  111. }
  112. bool SdioCard::syncDevice()
  113. {
  114. // if (sd_transfer_state_get() != SD_NO_TRANSFER)
  115. // {
  116. // return stopTransmission(true);
  117. // }
  118. return true;
  119. }
  120. uint8_t SdioCard::type() const
  121. {
  122. // if (g_sdio_card_type == SDIO_HIGH_CAPACITY_SD_CARD)
  123. // return SD_CARD_TYPE_SDHC;
  124. // else if (g_sdio_card_type == SDIO_STD_CAPACITY_SD_CARD_V2_0)
  125. // return SD_CARD_TYPE_SD2;
  126. // else
  127. // return SD_CARD_TYPE_SD1;
  128. }
  129. bool SdioCard::writeData(const uint8_t* src)
  130. {
  131. azlog("SdioCard::writeData() called but not implemented!");
  132. return false;
  133. }
  134. bool SdioCard::writeStart(uint32_t sector)
  135. {
  136. azlog("SdioCard::writeStart() called but not implemented!");
  137. return false;
  138. }
  139. bool SdioCard::writeStop()
  140. {
  141. azlog("SdioCard::writeStop() called but not implemented!");
  142. return false;
  143. }
  144. bool SdioCard::erase(uint32_t firstSector, uint32_t lastSector)
  145. {
  146. // return checkReturnOk(sd_erase(firstSector * 512, lastSector * 512));
  147. }
  148. /* Writing and reading, with progress callback */
  149. // static sd_callback_t m_stream_callback;
  150. // static const uint8_t *m_stream_buffer;
  151. // static uint32_t m_stream_count;
  152. // static uint32_t m_stream_count_start;
  153. // void azplatform_set_sd_callback(sd_callback_t func, const uint8_t *buffer)
  154. // {
  155. // m_stream_callback = func;
  156. // m_stream_buffer = buffer;
  157. // m_stream_count = 0;
  158. // m_stream_count_start = 0;
  159. // }
  160. // static void sdio_callback(uint32_t complete)
  161. // {
  162. // if (m_stream_callback)
  163. // {
  164. // m_stream_callback(m_stream_count_start + complete);
  165. // }
  166. // }
  167. // static sdio_callback_t get_stream_callback(const uint8_t *buf, uint32_t count)
  168. // {
  169. // m_stream_count_start = m_stream_count;
  170. // if (m_stream_callback)
  171. // {
  172. // if (buf == m_stream_buffer + m_stream_count)
  173. // {
  174. // m_stream_count += count;
  175. // return &sdio_callback;
  176. // }
  177. // else
  178. // {
  179. // azdbg("Stream buffer mismatch: ", (uint32_t)buf, " vs. ", (uint32_t)(m_stream_buffer + m_stream_count));
  180. // return NULL;
  181. // }
  182. // }
  183. // return NULL;
  184. // }
  185. bool SdioCard::writeSector(uint32_t sector, const uint8_t* src)
  186. {
  187. // return checkReturnOk(sd_block_write((uint32_t*)src, (uint64_t)sector * 512, 512,
  188. // get_stream_callback(src, 512)));
  189. }
  190. bool SdioCard::writeSectors(uint32_t sector, const uint8_t* src, size_t n)
  191. {
  192. // return checkReturnOk(sd_multiblocks_write((uint32_t*)src, (uint64_t)sector * 512, 512, n,
  193. // get_stream_callback(src, n * 512)));
  194. }
  195. bool SdioCard::readSector(uint32_t sector, uint8_t* dst)
  196. {
  197. // return checkReturnOk(sd_block_read((uint32_t*)dst, (uint64_t)sector * 512, 512,
  198. // get_stream_callback(dst, 512)));
  199. }
  200. bool SdioCard::readSectors(uint32_t sector, uint8_t* dst, size_t n)
  201. {
  202. // return checkReturnOk(sd_multiblocks_read((uint32_t*)dst, (uint64_t)sector * 512, 512, n,
  203. // get_stream_callback(dst, n * 512)));
  204. }
  205. // SDIO configuration for main program
  206. SdioConfig g_sd_sdio_config(DMA_SDIO);
  207. #endif