From b50aad09c8cea3074cafffd2b88883cf253ef386 Mon Sep 17 00:00:00 2001 From: Michael McMaster Date: Mon, 9 Dec 2013 22:00:49 +1000 Subject: [PATCH] Reliability improvements for SD init and reads. --- .../Generated_Source/PSoC5/cydevice.h | 2 +- .../Generated_Source/PSoC5/cydevice_trm.h | 2 +- .../Generated_Source/PSoC5/cydevicegnu.inc | 2 +- .../PSoC5/cydevicegnu_trm.inc | 2 +- .../Generated_Source/PSoC5/cydeviceiar.inc | 2 +- .../PSoC5/cydeviceiar_trm.inc | 2 +- .../Generated_Source/PSoC5/cydevicerv.inc | 2 +- .../Generated_Source/PSoC5/cydevicerv_trm.inc | 2 +- .../Generated_Source/PSoC5/cyfitter_cfg.c | 2 +- .../Generated_Source/PSoC5/cyfitter_cfg.h | 2 +- .../Generated_Source/PSoC5/cymetadata.c | 2 +- .../Generated_Source/PSoC5/project.h | 2 +- software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cyfit | Bin 228957 -> 228955 bytes software/SCSI2SD/SCSI2SD.cydsn/disk.c | 2 +- software/SCSI2SD/SCSI2SD.cydsn/scsi.c | 14 +- software/SCSI2SD/SCSI2SD.cydsn/sd.c | 210 ++++++++++-------- software/SCSI2SD/SCSI2SD.cydsn/sd.h | 1 + 17 files changed, 140 insertions(+), 111 deletions(-) mode change 100644 => 100755 software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter_cfg.h diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevice.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevice.h index 8263e30..5f1b198 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevice.h +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevice.h @@ -1,7 +1,7 @@ /******************************************************************************* * FILENAME: cydevice.h * OBSOLETE: Do not use this file. Use the _trm version instead. -* PSoC Creator 3.0 +* PSoC Creator 3.0 Component Pack 7 * * DESCRIPTION: * This file provides all of the address values for the entire PSoC device. diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevice_trm.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevice_trm.h index 08d77aa..e2c0687 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevice_trm.h +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevice_trm.h @@ -1,7 +1,7 @@ /******************************************************************************* * FILENAME: cydevice_trm.h * -* PSoC Creator 3.0 +* PSoC Creator 3.0 Component Pack 7 * * DESCRIPTION: * This file provides all of the address values for the entire PSoC device. diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevicegnu.inc b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevicegnu.inc index 833c2b6..1776ef9 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevicegnu.inc +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevicegnu.inc @@ -1,7 +1,7 @@ /******************************************************************************* * FILENAME: cydevicegnu.inc * OBSOLETE: Do not use this file. Use the _trm version instead. -* PSoC Creator 3.0 +* PSoC Creator 3.0 Component Pack 7 * * DESCRIPTION: * This file provides all of the address values for the entire PSoC device. diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevicegnu_trm.inc b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevicegnu_trm.inc index ffbe68b..3c24869 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevicegnu_trm.inc +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevicegnu_trm.inc @@ -1,7 +1,7 @@ /******************************************************************************* * FILENAME: cydevicegnu_trm.inc * -* PSoC Creator 3.0 +* PSoC Creator 3.0 Component Pack 7 * * DESCRIPTION: * This file provides all of the address values for the entire PSoC device. diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydeviceiar.inc b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydeviceiar.inc index 8556d0a..e4f1a44 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydeviceiar.inc +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydeviceiar.inc @@ -1,7 +1,7 @@ ; ; FILENAME: cydeviceiar.inc ; OBSOLETE: Do not use this file. Use the _trm version instead. -; PSoC Creator 3.0 +; PSoC Creator 3.0 Component Pack 7 ; ; DESCRIPTION: ; This file provides all of the address values for the entire PSoC device. diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydeviceiar_trm.inc b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydeviceiar_trm.inc index ea4e01d..ebd1b1d 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydeviceiar_trm.inc +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydeviceiar_trm.inc @@ -1,7 +1,7 @@ ; ; FILENAME: cydeviceiar_trm.inc ; -; PSoC Creator 3.0 +; PSoC Creator 3.0 Component Pack 7 ; ; DESCRIPTION: ; This file provides all of the address values for the entire PSoC device. diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevicerv.inc b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevicerv.inc index 4c8a537..4ed74ed 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevicerv.inc +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevicerv.inc @@ -1,7 +1,7 @@ ; ; FILENAME: cydevicerv.inc ; OBSOLETE: Do not use this file. Use the _trm version instead. -; PSoC Creator 3.0 +; PSoC Creator 3.0 Component Pack 7 ; ; DESCRIPTION: ; This file provides all of the address values for the entire PSoC device. diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevicerv_trm.inc b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevicerv_trm.inc index 232c2fc..d4d800c 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevicerv_trm.inc +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cydevicerv_trm.inc @@ -1,7 +1,7 @@ ; ; FILENAME: cydevicerv_trm.inc ; -; PSoC Creator 3.0 +; PSoC Creator 3.0 Component Pack 7 ; ; DESCRIPTION: ; This file provides all of the address values for the entire PSoC device. diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter_cfg.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter_cfg.c index 200bad6..6c7544e 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter_cfg.c +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter_cfg.c @@ -1,6 +1,6 @@ /******************************************************************************* * FILENAME: cyfitter_cfg.c -* PSoC Creator 3.0 +* PSoC Creator 3.0 Component Pack 7 * * Description: * This file is automatically generated by PSoC Creator with device diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter_cfg.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter_cfg.h old mode 100644 new mode 100755 index 02880d0..9481fd3 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter_cfg.h +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cyfitter_cfg.h @@ -1,6 +1,6 @@ /******************************************************************************* * FILENAME: cyfitter_cfg.h -* PSoC Creator 3.0 +* PSoC Creator 3.0 Component Pack 7 * * Description: * This file is automatically generated by PSoC Creator. diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cymetadata.c b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cymetadata.c index 7498391..c2a969d 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cymetadata.c +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/cymetadata.c @@ -1,7 +1,7 @@ /******************************************************************************* * FILENAME: cymetadata.c * -* PSoC Creator 3.0 +* PSoC Creator 3.0 Component Pack 7 * * DESCRIPTION: * This file defines all extra memory spaces that need to be included. diff --git a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/project.h b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/project.h index 4f8d256..3b9f84b 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/project.h +++ b/software/SCSI2SD/SCSI2SD.cydsn/Generated_Source/PSoC5/project.h @@ -1,6 +1,6 @@ /******************************************************************************* * File Name: project.h - * PSoC Creator 3.0 + * PSoC Creator 3.0 Component Pack 7 * * Description: * This file is automatically generated by PSoC Creator and should not diff --git a/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cyfit b/software/SCSI2SD/SCSI2SD.cydsn/SCSI2SD.cyfit index 9cb0e8a8537b6dccc8d62d5cee5754b378e7487f..2ffb942d2710a570a3718964665c655df06903eb 100755 GIT binary patch delta 33869 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 0x20 && scsiDev.msgOut <= 0x2F) diff --git a/software/SCSI2SD/SCSI2SD.cydsn/sd.c b/software/SCSI2SD/SCSI2SD.cydsn/sd.c index 1d239ba..2d31294 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/sd.c +++ b/software/SCSI2SD/SCSI2SD.cydsn/sd.c @@ -20,6 +20,7 @@ #include "config.h" #include "disk.h" #include "sd.h" +#include "led.h" #include @@ -47,9 +48,7 @@ static uint8 sdCrc7(uint8* chr, uint8 cnt, uint8 crc) static uint8 sdSpiByte(uint8 value) { SDCard_WriteTxData(value); - while(!(SDCard_ReadTxStatus() & SDCard_STS_SPI_DONE)) - {} - while (!SDCard_GetRxBufferSize()) {} + while (!(SDCard_ReadRxStatus() & SDCard_STS_RX_FIFO_NOT_EMPTY)) {} return SDCard_ReadRxData(); } @@ -88,7 +87,7 @@ static void sdSendCommand(uint8 cmd, uint32 param) sdSpiByte(send[cmd]); } // Allow command to process before reading result code. - sdSpiByte(0xFF); + sdSpiByte(0xFF); } static uint8 sdReadResp() @@ -98,25 +97,12 @@ static uint8 sdReadResp() do { v = sdSpiByte(0xFF); - } while(i-- && (v == 0xFF)); - return v; -} - -static uint8 sdWaitResp() -{ - uint8 v; - uint8 i = 255; - do - { - v = sdSpiByte(0xFF); - } while(i-- && (v != 0xFE)); + } while(i-- && (v & 0x80)); return v; } - static uint8 sdCommandAndResponse(uint8 cmd, uint32 param) { - SDCard_ClearRxBuffer(); sdSpiByte(0xFF); sdSendCommand(cmd, param); return sdReadResp(); @@ -124,12 +110,19 @@ static uint8 sdCommandAndResponse(uint8 cmd, uint32 param) static uint8 sdCRCCommandAndResponse(uint8 cmd, uint32 param) { - SDCard_ClearRxBuffer(); sdSpiByte(0xFF); sdSendCRCCommand(cmd, param); return sdReadResp(); } +// Clear the sticky status bits on error. +static void sdClearStatus() +{ + uint8 r2hi = sdCRCCommandAndResponse(SD_SEND_STATUS, 0); + uint8 r2lo = sdSpiByte(0xFF); + (void) r2hi; (void) r2lo; +} + void sdPrepareRead() { @@ -142,6 +135,7 @@ void sdPrepareRead() if (v) { scsiDiskReset(); + sdClearStatus(); scsiDev.status = CHECK_CONDITION; scsiDev.sense.code = HARDWARE_ERROR; @@ -200,20 +194,31 @@ void sdReadSector() void sdCompleteRead() { - int counter = 512; - uint8 r1b; - do - { - r1b = sdCommandAndResponse(SD_STOP_TRANSMISSION, 0); - } while (r1b && (counter-- > 0)); + // We cannot send even a single "padding" byte, as we normally would when + // sending a command. If we've just finished reading the very last block + // on the card, then reading an additional dummy byte will just trigger + // an error condition as we're trying to read past-the-end of the storage + // device. + // ie. do not use sdCommandAndResponse here. + sdSendCommand(SD_STOP_TRANSMISSION, 0); + uint8 r1b = sdReadResp(); + if (r1b) { + // Try very hard to make sure the transmission stops + int retries = 255; + while (r1b && retries) + { + r1b = sdCommandAndResponse(SD_STOP_TRANSMISSION, 0); + retries--; + } + scsiDev.status = CHECK_CONDITION; scsiDev.sense.code = HARDWARE_ERROR; scsiDev.sense.asc = UNRECOVERED_READ_ERROR; scsiDev.phase = STATUS; } - + // R1b has an optional trailing "busy" signal. uint8 busy; do @@ -237,68 +242,62 @@ int sdWriteSector() // Wait for a previously-written sector to complete. sdWaitWriteBusy(); - sdSpiByte(0xFC); // MULTIPLE byte start token - int i; - for (i = 0; i < SCSI_BLOCK_SIZE; i++) - { - while(!(SDCard_ReadTxStatus() & SDCard_STS_TX_FIFO_NOT_FULL)) - {} - SDCard_WriteTxData(scsiDev.data[i]); - } - while(!(SDCard_ReadTxStatus() & SDCard_STS_SPI_DONE)) + sdSpiByte(0xFC); // MULTIPLE byte start token + int i; + for (i = 0; i < SCSI_BLOCK_SIZE; i++) + { + while(!(SDCard_ReadTxStatus() & SDCard_STS_TX_FIFO_NOT_FULL)) {} - SDCard_ReadRxData(); - SDCard_ReadRxData(); - SDCard_ReadRxData(); - SDCard_ReadRxData(); - SDCard_ReadRxData(); - - sdSpiByte(0x00); // CRC - sdSpiByte(0x00); // CRC - - // Don't wait more than 1000ms. - // My 2g Kingston micro-sd card doesn't respond immediately. - // My 16Gb card does. - int maxWait = 1000; - uint8 dataToken = sdSpiByte(0xFF); // Response - while (dataToken == 0xFF && maxWait-- > 0) - { - CyDelay(1); // 1ms. - dataToken = sdSpiByte(0xFF); - } - if (((dataToken & 0x1F) >> 1) != 0x2) // Accepted. - { - sdWaitWriteBusy(); - - int counter = 512; - uint8 r1b; - do - { - r1b = sdCommandAndResponse(SD_STOP_TRANSMISSION, 0); - } while (r1b && (counter-- > 0)); - // R1b has an optional trailing "busy" signal. - uint8 busy; - do - { - busy = sdSpiByte(0xFF); - } while (busy == 0); - - // Wait for the card to come out of busy. - sdWaitWriteBusy(); - - scsiDiskReset(); + SDCard_WriteTxData(scsiDev.data[i]); + } + while(!(SDCard_ReadTxStatus() & SDCard_STS_SPI_DONE)) {} + SDCard_ClearFIFO(); + + sdSpiByte(0x00); // CRC + sdSpiByte(0x00); // CRC + + // Don't wait more than 1000ms. + // My 2g Kingston micro-sd card doesn't respond immediately. + // My 16Gb card does. + int maxWait = 1000; + uint8 dataToken = sdSpiByte(0xFF); // Response + while (dataToken == 0xFF && maxWait-- > 0) + { + CyDelay(1); // 1ms. + dataToken = sdSpiByte(0xFF); + } + if (((dataToken & 0x1F) >> 1) != 0x2) // Accepted. + { + sdWaitWriteBusy(); - scsiDev.status = CHECK_CONDITION; - scsiDev.sense.code = HARDWARE_ERROR; - scsiDev.sense.asc = LOGICAL_UNIT_COMMUNICATION_FAILURE; - scsiDev.phase = STATUS; - result = 0; - } - else + uint8 r1b = sdCommandAndResponse(SD_STOP_TRANSMISSION, 0); + (void) r1b; + sdSpiByte(0xFF); + + // R1b has an optional trailing "busy" signal. + uint8 busy; + do { - // The card is probably in the busy state. - // Don't wait, as we could read the SCSI interface instead. - result = 1; + busy = sdSpiByte(0xFF); + } while (busy == 0); + + // Wait for the card to come out of busy. + sdWaitWriteBusy(); + + scsiDiskReset(); + sdClearStatus(); + + scsiDev.status = CHECK_CONDITION; + scsiDev.sense.code = HARDWARE_ERROR; + scsiDev.sense.asc = LOGICAL_UNIT_COMMUNICATION_FAILURE; + scsiDev.phase = STATUS; + result = 0; + } + else + { + // The card is probably in the busy state. + // Don't wait, as we could read the SCSI interface instead. + result = 1; } return result; @@ -312,11 +311,12 @@ void sdCompleteWrite() sdSpiByte(0xFD); // STOP TOKEN // Wait for the card to come out of busy. sdWaitWriteBusy(); - + uint8 r1 = sdCommandAndResponse(13, 0); // send status uint8 r2 = sdSpiByte(0xFF); if (r1 || r2) { + sdClearStatus(); scsiDev.status = CHECK_CONDITION; scsiDev.sense.code = HARDWARE_ERROR; scsiDev.sense.asc = WRITE_ERROR_AUTO_REALLOCATION_FAILED; @@ -350,8 +350,11 @@ static int sendIfCond() { // Version 1 card. sdDev.version = 1; + sdClearStatus(); break; } + + sdClearStatus(); } while (--retries > 0); return retries > 0; @@ -369,6 +372,8 @@ static int sdOpCond() sdCRCCommandAndResponse(SD_APP_CMD, 0); // Host Capacity Support = 1 (SDHC/SDXC supported) status = sdCRCCommandAndResponse(SD_APP_SEND_OP_COND, 0x40000000); + + sdClearStatus(); } while ((status != 0) && (--retries > 0)); return retries > 0; @@ -397,8 +402,14 @@ static int sdReadCSD() { uint8 status = sdCRCCommandAndResponse(SD_SEND_CSD, 0); if(status){goto bad;} - status = sdWaitResp(); - if (status != 0xFE) { goto bad; } + + uint8 startToken; + int maxWait = 1023; + do + { + startToken = sdSpiByte(0xFF); + } while(maxWait-- && (startToken != 0xFE)); + if (startToken != 0xFE) { goto bad; } uint8 buf[16]; int i; @@ -440,7 +451,7 @@ bad: } int sdInit() -{ +{ sdDev.version = 0; sdDev.ccs = 0; sdDev.capacity = 0; @@ -464,6 +475,7 @@ int sdInit() uint8 v = sdCRCCommandAndResponse(SD_GO_IDLE_STATE, 0); if(v != 1){goto bad;} + ledOn(); if (!sendIfCond()) goto bad; // Sets V1 or V2 flag if (!sdOpCond()) goto bad; if (!sdReadOCR()) goto bad; @@ -476,9 +488,25 @@ int sdInit() if(v){goto bad;} // now set the sd card up for full speed + // The SD Card spec says we can run SPI @ 25MHz + // But the PSoC 5LP SPIM datasheet says the most we can do is 18MHz. + // I've confirmed that no data is ever put into the RX FIFO when run at + // 20MHz or 25MHz. + // ... and then we get timing analysis failures if the BUS_CLK is over 62MHz. + // So we run the MASTER_CLK and BUS_CLK at 60MHz, and run the SPI clock at 30MHz + // (15MHz SPI transfer clock). + SDCard_Stop(); SD_Data_Clk_Start(); // Turn on the fast clock SD_Clk_Ctl_Write(1); // Select the fast clock source. SD_Init_Clk_Stop(); // Stop the slow clock. + CyDelayUs(1); + SDCard_Start(); + + // Clear out rubbish data through clock change + CyDelayUs(1); + SDCard_ReadRxStatus(); + SDCard_ReadTxStatus(); + SDCard_ClearFIFO(); if (!sdReadCSD()) goto bad; @@ -489,6 +517,8 @@ bad: sdDev.capacity = 0; out: + sdClearStatus(); + ledOff(); return result; } @@ -512,7 +542,7 @@ void sdPrepareWrite() if (v) { scsiDiskReset(); - + sdClearStatus(); scsiDev.status = CHECK_CONDITION; scsiDev.sense.code = HARDWARE_ERROR; scsiDev.sense.asc = LOGICAL_UNIT_COMMUNICATION_FAILURE; diff --git a/software/SCSI2SD/SCSI2SD.cydsn/sd.h b/software/SCSI2SD/SCSI2SD.cydsn/sd.h index 5fa61c0..b8e3c31 100755 --- a/software/SCSI2SD/SCSI2SD.cydsn/sd.h +++ b/software/SCSI2SD/SCSI2SD.cydsn/sd.h @@ -24,6 +24,7 @@ typedef enum SD_SEND_IF_COND = 8, // SD V2 SD_SEND_CSD = 9, SD_STOP_TRANSMISSION = 12, + SD_SEND_STATUS = 13, SD_SET_BLOCKLEN = 16, SD_READ_MULTIPLE_BLOCK = 18, SD_APP_SET_WR_BLK_ERASE_COUNT = 23, -- 2.38.5