SWV tracing for diagnosing hangs.
[SCSI2SD.git] / software / SCSI2SD / src / sd.c
index 00163f3..fdc2b7d 100755 (executable)
@@ -24,6 +24,7 @@
 #include "sd.h"\r
 #include "led.h"\r
 #include "time.h"\r
 #include "sd.h"\r
 #include "led.h"\r
 #include "time.h"\r
+#include "trace.h"\r
 \r
 #include "scsiPhy.h"\r
 \r
 \r
 #include "scsiPhy.h"\r
 \r
@@ -86,7 +87,9 @@ static uint8 sdCrc7(uint8* chr, uint8 cnt, uint8 crc)
 static uint8_t sdSpiByte(uint8_t value)\r
 {\r
        SDCard_WriteTxData(value);\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
        while (!(SDCard_ReadRxStatus() & SDCard_STS_RX_FIFO_NOT_EMPTY)) {}\r
+       trace(trace_sdSpiByte);\r
        return SDCard_ReadRxData();\r
 }\r
 \r
        return SDCard_ReadRxData();\r
 }\r
 \r
@@ -145,10 +148,12 @@ static uint16_t sdDoCommand(
        // reads.\r
        if (waitWhileBusy)\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
                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
                        while (sdSpiByte(0xFF) != 0xFF) {}\r
                }\r
        }\r
@@ -164,6 +169,7 @@ static uint16_t sdDoCommand(
        CyDmaChEnable(sdDMARxChan, 1);\r
        CyDmaChEnable(sdDMATxChan, 1);\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
        while (!(sdTxDMAComplete && sdRxDMAComplete)) { __WFI(); }\r
 \r
        uint16_t response = discardBuffer;\r
@@ -177,6 +183,8 @@ static uint16_t sdDoCommand(
        }\r
 \r
        uint32_t start = getTime_ms();\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
        while ((response & 0x80) && likely(elapsedTime_ms(start) <= 200))\r
        {\r
                response = sdSpiByte(0xFF);\r
@@ -246,6 +254,7 @@ dmaReadSector(uint8_t* outputBuffer)
        // Don't wait more than 200ms.  The standard recommends 100ms.\r
        uint32_t start = getTime_ms();\r
        uint8_t token = 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
        while (token != 0xFE && likely(elapsedTime_ms(start) <= 200))\r
        {\r
                if (unlikely(token && ((token & 0xE0) == 0)))\r
@@ -367,6 +376,7 @@ void sdCompleteRead()
                // 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
                // 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
                while (!sdReadSectorDMAPoll()) { /* spin */ }\r
        }\r
        \r
@@ -536,6 +546,7 @@ void sdCompleteWrite()
                // 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
                // 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
                while (!sdWriteSectorDMAPoll(1)) { /* spin */ }\r
        }\r
 \r