#include "sd.h"\r
#include "led.h"\r
#include "time.h"\r
+#include "trace.h"\r
\r
#include "scsiPhy.h"\r
\r
static uint8_t sdSpiByte(uint8_t value)\r
{\r
SDCard_WriteTxData(value);\r
+ trace(trace_spinSpiByte);\r
while (!(SDCard_ReadRxStatus() & SDCard_STS_RX_FIFO_NOT_EMPTY)) {}\r
+ trace(trace_sdSpiByte);\r
return SDCard_ReadRxData();\r
}\r
\r
// reads.\r
if (waitWhileBusy)\r
{\r
+ trace(trace_spinSDRxFIFO);\r
while (!(SDCard_ReadRxStatus() & SDCard_STS_RX_FIFO_NOT_EMPTY)) {}\r
int busy = SDCard_ReadRxData() != 0xFF;\r
if (unlikely(busy))\r
{\r
+ trace(trace_spinSDBusy);\r
while (sdSpiByte(0xFF) != 0xFF) {}\r
}\r
}\r
CyDmaChEnable(sdDMARxChan, 1);\r
CyDmaChEnable(sdDMATxChan, 1);\r
\r
+ trace(trace_spinSDDMA);\r
while (!(sdTxDMAComplete && sdRxDMAComplete)) { __WFI(); }\r
\r
uint16_t response = discardBuffer;\r
}\r
\r
uint32_t start = getTime_ms();\r
+\r
+ trace(trace_spinSDBusy);\r
while ((response & 0x80) && likely(elapsedTime_ms(start) <= 200))\r
{\r
response = sdSpiByte(0xFF);\r
// Don't wait more than 200ms. The standard recommends 100ms.\r
uint32_t start = getTime_ms();\r
uint8_t token = sdSpiByte(0xFF);\r
+ trace(trace_spinSDBusy);\r
while (token != 0xFE && likely(elapsedTime_ms(start) <= 200))\r
{\r
if (unlikely(token && ((token & 0xE0) == 0)))\r
// Not much choice but to wait until we've completed the transfer.\r
// Cancelling the transfer can't be done as we have no way to reset\r
// the SD card.\r
+ trace(trace_spinSDCompleteRead);\r
while (!sdReadSectorDMAPoll()) { /* spin */ }\r
}\r
\r
// Not much choice but to wait until we've completed the transfer.\r
// Cancelling the transfer can't be done as we have no way to reset\r
// the SD card.\r
+ trace(trace_spinSDCompleteWrite);\r
while (!sdWriteSectorDMAPoll(1)) { /* spin */ }\r
}\r
\r