SDCard: implement busy flag
authorMichael Moon <triffid.hunter@gmail.com>
Wed, 6 Feb 2013 00:16:22 +0000 (11:16 +1100)
committerMichael Moon <triffid.hunter@gmail.com>
Wed, 6 Feb 2013 00:16:22 +0000 (11:16 +1100)
src/libs/USBDevice/USBMSD/SDCard.cpp
src/libs/USBDevice/USBMSD/SDCard.h
src/libs/USBDevice/USBMSD/disk.h

index 4cba21c..2f21639 100644 (file)
@@ -130,6 +130,7 @@ SDCard::SDCard(PinName mosi, PinName miso, PinName sclk, PinName cs) :
   _spi(mosi, miso, sclk), _cs(cs) {\r
     _cs.output();\r
     _cs = 1;\r
+    busyflag = false;\r
 }\r
 \r
 #define R1_IDLE_STATE           (1 << 0)\r
@@ -255,11 +256,14 @@ SDCard::CARD_TYPE SDCard::initialise_card_v2() {
 \r
 int SDCard::disk_initialize()\r
 {\r
+    busyflag = true;\r
+\r
     _sectors = 0;\r
 \r
     CARD_TYPE i = initialise_card();\r
 \r
     if (i == SDCARD_FAIL) {\r
+        busyflag = false;\r
         return 1;\r
     }\r
 \r
@@ -268,15 +272,24 @@ int SDCard::disk_initialize()
     // Set block length to 512 (CMD16)\r
     if(_cmd(SDCMD_SET_BLOCKLEN, 512) != 0) {\r
         fprintf(stderr, "Set 512-byte block timed out\n");\r
+        busyflag = false;\r
         return 1;\r
     }\r
 \r
     _spi.frequency(2500000); // Set to 2.5MHz for data transfer\r
+\r
+    busyflag = false;\r
+\r
     return 0;\r
 }\r
 \r
 int SDCard::disk_write(const char *buffer, uint32_t block_number)\r
 {\r
+    if (busyflag)\r
+        return 0;\r
+\r
+    busyflag = true;\r
+\r
     if (cardtype == SDCARD_FAIL)\r
         return -1;\r
     // set write address for single block (CMD24)\r
@@ -286,11 +299,19 @@ int SDCard::disk_write(const char *buffer, uint32_t block_number)
 \r
     // send the data block\r
     _write(buffer, 512);\r
+\r
+    busyflag = false;\r
+\r
     return 0;\r
 }\r
 \r
 int SDCard::disk_read(char *buffer, uint32_t block_number)\r
 {\r
+    if (busyflag)\r
+        return 0;\r
+\r
+    busyflag = true;\r
+\r
     if (cardtype == SDCARD_FAIL)\r
         return -1;\r
     // set read address for single block (CMD17)\r
@@ -301,6 +322,8 @@ int SDCard::disk_read(char *buffer, uint32_t block_number)
     // receive the data\r
     _read(buffer, 512);\r
 \r
+    busyflag = false;\r
+\r
     return 0;\r
 }\r
 \r
@@ -554,3 +577,8 @@ uint32_t SDCard::_sd_sectors() {
     fprintf(stderr, "This disk tastes funny! (%d) I only know about type 0 or 1 CSD structures\n", csd_structure);\r
     return 0;\r
 }\r
+\r
+bool SDCard::busy()\r
+{\r
+    return busyflag;\r
+}\r
index 26191e2..2a7906c 100644 (file)
@@ -81,7 +81,7 @@ public:
 \r
     void on_main_loop(void);\r
 \r
-    int busy();\r
+    bool busy();\r
 \r
 protected:\r
 \r
@@ -102,6 +102,8 @@ protected:
     SPI _spi;\r
     GPIO _cs;\r
 \r
+    volatile bool busyflag;\r
+\r
     CARD_TYPE cardtype;\r
 };\r
 \r
index 5930c55..a79b44f 100644 (file)
@@ -57,6 +57,8 @@ public:
     virtual bool disk_canDMA() { return 0; };
 
     virtual int disk_sync() { return 0; };
+
+    virtual bool busy() = 0;
 };
 
 #endif /* _DISK_H */