USBMSD SD card Hello World for Mbed platforms

Dependencies:   mbed USBMSD_SD USBDevice

Files at this revision

API Documentation at this revision

Comitter:
samux
Date:
Sun Nov 13 12:30:43 2011 +0000
Parent:
4:980e6470dcce
Child:
6:126c4d980196
Commit message:
rename things and introduce an ERROR state

Changed in this revision

USBDevice/USBMSD/USBMSD.cpp Show annotated file Show diff for this revision Revisions of this file
USBDevice/USBMSD/USBMSD.h Show annotated file Show diff for this revision Revisions of this file
--- a/USBDevice/USBMSD/USBMSD.cpp	Sat Nov 12 17:53:04 2011 +0000
+++ b/USBDevice/USBMSD/USBMSD.cpp	Sun Nov 13 12:30:43 2011 +0000
@@ -45,9 +45,9 @@
 
 // CSW Status
 enum Status {
-    SCSI_PASSED,
-    SCSI_FAILED,
-    SCSI_PHASE_ERROR,
+    CSW_PASSED,
+    CSW_FAILED,
+    CSW_ERROR,
 };
 
 
@@ -82,7 +82,7 @@
 
 void USBMSD::reset()
 {
-    stage = STATE_READ_CBW;
+    stage = READ_CBW;
 }
 
 uint8_t * USBMSD::getMaxLUN()
@@ -97,10 +97,13 @@
     uint8_t buf[MAX_PACKET_SIZE_EPBULK];
     read(EPBULK_OUT, buf, &size, MAX_PACKET_SIZE_EPBULK);
     switch (stage) {
-        case STATE_READ_CBW:
+        // the device has to decode the CBW received
+        case READ_CBW:
             CBWDecode(buf, size);
             break;
-        case STATE_PROCESS_CBW:
+        
+        // the device has to receive data from the host
+        case PROCESS_CBW:
             switch (cbw.CB[0]) {
                 case WRITE10:
                 case WRITE12:
@@ -111,10 +114,11 @@
                     break;
             }
             break;
-        case STATE_WAIT_CSW:
-            break;
+        
+        // an error has occured: stall endpoint and send CSW
         default:
-            csw.Status = SCSI_PHASE_ERROR;
+            stallEndpoint(EPBULK_OUT);
+            csw.Status = CSW_ERROR;
             sendCSW();
             break;
     }
@@ -127,7 +131,9 @@
 // Called in ISR context when a data has been transferred
 bool USBMSD::EP2_IN_callback() {
     switch (stage) {
-        case STATE_PROCESS_CBW:
+    
+        // the device has to send data to the host
+        case PROCESS_CBW:
             switch (cbw.CB[0]) {
                 case READ10:
                 case READ12:
@@ -135,15 +141,21 @@
                     break;
             }
             break;
-        case STATE_SEND_CSW:
+            
+        //the device has to send a CSW
+        case SEND_CSW:
             sendCSW();
             break;
-        case STATE_ERROR:
+            
+        // an error has occured
+        case ERROR:
             stallEndpoint(EPBULK_IN);
             sendCSW();
             break;
-        case STATE_WAIT_CSW:
-            stage = STATE_READ_CBW;
+            
+        // the host has received the CSW -> we wait a CBW
+        case WAIT_CSW:
+            stage = READ_CBW;
             break;
     }
     return true;
@@ -154,7 +166,7 @@
 
     if ((addr + size) > MemorySize) {
         size = MemorySize - addr;
-        stage = STATE_WAIT_CSW;
+        stage = ERROR;
         stallEndpoint(EPBULK_OUT);
     }
 
@@ -170,8 +182,8 @@
     length -= size;
     csw.DataResidue -= size;
 
-    if ((!length) || (stage == STATE_WAIT_CSW)) {
-        csw.Status = SCSI_PASSED;
+    if ((!length) || (stage != PROCESS_CBW)) {
+        csw.Status = (stage == ERROR) ? CSW_FAILED : CSW_PASSED;
         sendCSW();
     }
 }
@@ -181,7 +193,7 @@
 
     if ((addr + size) > MemorySize) {
         size = MemorySize - addr;
-        stage = STATE_WAIT_CSW;
+        stage = ERROR;
         stallEndpoint(EPBULK_OUT);
     }
 
@@ -201,8 +213,8 @@
     length -= size;
     csw.DataResidue -= size;
 
-    if ( !length || (stage == STATE_WAIT_CSW)) {
-        csw.Status = (memOK) ? SCSI_PASSED : SCSI_FAILED;
+    if ( !length || (stage != PROCESS_CBW)) {
+        csw.Status = (memOK && (stage == PROCESS_CBW)) ? CSW_PASSED : CSW_FAILED;
         sendCSW();
     }
 }
@@ -265,14 +277,14 @@
     if (size >= cbw.DataLength) {
         size = cbw.DataLength;
     }
-    stage = STATE_SEND_CSW;
+    stage = SEND_CSW;
 
     if (!writeNB(EPBULK_IN, buf, size, MAX_PACKET_SIZE_EPBULK)) {
         return false;
     }
 
     csw.DataResidue -= size;
-    csw.Status = SCSI_PASSED;
+    csw.Status = CSW_PASSED;
     return true;
 }
 
@@ -288,7 +300,7 @@
 void USBMSD::sendCSW() {
     csw.Signature = CSW_Signature;
     writeNB(EPBULK_IN, (uint8_t *)&csw, sizeof(CSW), MAX_PACKET_SIZE_EPBULK);
-    stage = STATE_WAIT_CSW;
+    stage = WAIT_CSW;
 }
 
 bool USBMSD::requestSense (void) {
@@ -321,7 +333,7 @@
 }
 
 void USBMSD::fail() {
-    csw.Status = SCSI_FAILED;
+    csw.Status = CSW_FAILED;
     sendCSW();
 }
 
@@ -357,11 +369,11 @@
                     case READ12:
                         if (infoTransfer()) {
                             if ((cbw.Flags & 0x80)) {
-                                stage = STATE_PROCESS_CBW;
+                                stage = PROCESS_CBW;
                                 memoryRead();
                             } else {
                                 stallEndpoint(EPBULK_OUT);
-                                csw.Status = SCSI_PHASE_ERROR;
+                                csw.Status = CSW_ERROR;
                                 sendCSW();
                             }
                         }
@@ -370,27 +382,27 @@
                     case WRITE12:
                         if (infoTransfer()) {
                             if (!(cbw.Flags & 0x80)) {
-                                stage = STATE_PROCESS_CBW;
+                                stage = PROCESS_CBW;
                             } else {
                                 stallEndpoint(EPBULK_IN);
-                                csw.Status = SCSI_PHASE_ERROR;
+                                csw.Status = CSW_ERROR;
                                 sendCSW();
                             }
                         }
                         break;
                     case VERIFY10:
                         if (!(cbw.CB[1] & 0x02)) {
-                            csw.Status = SCSI_PASSED;
+                            csw.Status = CSW_PASSED;
                             sendCSW();
                             break;
                         }
                         if (infoTransfer()) {
                             if (!(cbw.Flags & 0x80)) {
-                                stage = STATE_PROCESS_CBW;
+                                stage = PROCESS_CBW;
                                 memOK = true;
                             } else {
                                 stallEndpoint(EPBULK_IN);
-                                csw.Status = SCSI_PHASE_ERROR;
+                                csw.Status = CSW_ERROR;
                                 sendCSW();
                             }
                         }
@@ -414,7 +426,7 @@
         }
     }
 
-    csw.Status = SCSI_PASSED;
+    csw.Status = CSW_PASSED;
     sendCSW();
 }
 
@@ -426,12 +438,14 @@
 
     if ((addr + n) > MemorySize) {
         n = MemorySize - addr;
-        stage = STATE_ERROR;
+        stage = ERROR;
     }
 
+    // we read an entire block
     if (!(addr%BlockSize))
         blockRead(page, addr/BlockSize);
 
+    // write data which are in RAM
     writeNB(EPBULK_IN, &page[addr%BlockSize], n, MAX_PACKET_SIZE_EPBULK);
 
     addr += n;
@@ -440,11 +454,11 @@
     csw.DataResidue -= n;
 
     if (!length) {
-        stage = STATE_SEND_CSW;
+        stage = SEND_CSW;
     }
 
-    if (stage != STATE_PROCESS_CBW) {
-        csw.Status = SCSI_PASSED;
+    if (stage != PROCESS_CBW) {
+        csw.Status = (stage == ERROR) ? CSW_FAILED : CSW_PASSED;
     }
 }
 
@@ -474,7 +488,7 @@
     length = n * BlockSize;
 
     if (!cbw.DataLength) {              // host requests no data
-        csw.Status = SCSI_FAILED;
+        csw.Status = CSW_FAILED;
         sendCSW();
         return false;
     }
@@ -486,7 +500,7 @@
             stallEndpoint(EPBULK_OUT);
         }
 
-        csw.Status = SCSI_FAILED;
+        csw.Status = CSW_FAILED;
         sendCSW();
         return false;
     }
--- a/USBDevice/USBMSD/USBMSD.h	Sat Nov 12 17:53:04 2011 +0000
+++ b/USBDevice/USBMSD/USBMSD.h	Sun Nov 13 12:30:43 2011 +0000
@@ -32,11 +32,11 @@
 
 // MSC Bulk-only Stage
 enum Stage {
-    STATE_READ_CBW,     // wait a CBW
-    STATE_PROCESS_CBW,  // process a CBW request
-    STATE_SEND_CSW,     // send a CSW
-    STATE_ERROR,        // error: out of memory
-    STATE_WAIT_CSW,     // wait that a CSW has been effectively sent
+    READ_CBW,     // wait a CBW
+    PROCESS_CBW,  // process a CBW request
+    SEND_CSW,     // send a CSW
+    ERROR,        // error
+    WAIT_CSW,     // wait that a CSW has been effectively sent
 };
 
 // Bulk-only CBW