Adding sense code from Steve Evans
authorBrian Dickman <brian.dickman@gmail.com>
Sat, 5 May 2012 04:51:30 +0000 (21:51 -0700)
committerBrian Dickman <brian.dickman@gmail.com>
Mon, 28 May 2012 21:21:30 +0000 (14:21 -0700)
OS X really hates it when MSC doesn't report sense info

src/libs/USBCDCMSC/USBCDCMSC.cpp
src/libs/USBCDCMSC/USBCDCMSC.h

index 8fbb333..07f3190 100644 (file)
@@ -70,6 +70,20 @@ static uint8_t cdc_line_coding[7]= {0x80, 0x25, 0x00, 0x00, 0x00, 0x00, 0x08};
 \r
 #define DEFAULT_CONFIGURATION (1)\r
 \r
+// Sense codes\r
+#define SENSE_NO_SENSE          0x00\r
+#define SENSE_RECOVERED_ERROR   0x01\r
+#define SENSE_NOT_READY         0x02\r
+#define SENSE_MEDIUM_ERROR      0x03\r
+#define SENSE_HARDWARE_ERROR    0x04\r
+#define SENSE_ILLEGAL_REQUEST   0x05\r
+#define SENSE_UNIT_ATTENTION    0x06\r
+#define SENSE_DATA_PROTECT      0x07\r
+#define SENSE_BLANK_CHECK       0x08\r
+#define SENSE_ABORTED_COMMAND   0x0B\r
+#define SENSE_VOLUME_OVERFLOW   0x0D\r
+#define SENSE_MISCOMPARE        0x0E\r
+\r
 // max packet size\r
 #define MAX_PACKET  MAX_PACKET_SIZE_EPBULK\r
 \r
@@ -86,6 +100,7 @@ USBCDCMSC::USBCDCMSC(SDFileSystem *sd, uint16_t vendor_id, uint16_t product_id,
     _status = NO_INIT;\r
     connect();\r
 //    USBDevice::connect();\r
+       setSense(SENSE_NO_SENSE, 0x00, 0x00);\r
     USBHAL::connect();\r
 }\r
 \r
@@ -646,35 +661,27 @@ void USBCDCMSC::sendCSW() {
     stage = WAIT_CSW;\r
 }\r
 \r
-bool USBCDCMSC::requestSense (void) {\r
-    uint8_t request_sense[] = {\r
-        0x70,\r
-        0x00,\r
-        0x05,   // Sense Key: illegal request\r
-        0x00,\r
-        0x00,\r
-        0x00,\r
-        0x00,\r
-        0x0A,\r
-        0x00,\r
-        0x00,\r
-        0x00,\r
-        0x00,\r
-        0x30,\r
-        0x01,\r
-        0x00,\r
-        0x00,\r
-        0x00,\r
-        0x00,\r
-    };\r
+void USBCDCMSC::setSense (uint8_t sense_key, uint8_t asc, uint8_t ascq) {\r
+    sense.error = 0x70;\r
+    sense.sense_key = sense_key;\r
+    sense.additional_sense_length = 0x0a;\r
+    sense.asc = asc;\r
+    sense.ascq = ascq;    \r
+}\r
 \r
-    if (!msd_write(request_sense, sizeof(request_sense))) {\r
+bool USBCDCMSC::requestSense (void) {\r
+    if (!msd_write((uint8_t *)&sense, sizeof(sense))) {\r
         return false;\r
     }\r
-\r
+       \r
     return true;\r
 }\r
 \r
+void USBCDCMSC::mediaRemoval() {\r
+        csw.Status = CSW_PASSED;\r
+        sendCSW();\r
+}\r
+\r
 void USBCDCMSC::fail() {\r
     csw.Status = CSW_FAILED;\r
     sendCSW();\r
@@ -706,6 +713,9 @@ void USBCDCMSC::CBWDecode(uint8_t * buf, uint16_t size) {
                     case READ_FORMAT_CAPACITIES:\r
                         readFormatCapacity();\r
                         break;\r
+                       case MEDIA_REMOVAL:\r
+                           mediaRemoval();\r
+                                               break;\r
                     case READ_CAPACITY:\r
                         readCapacity();\r
                         break;\r
index b77f5d4..affb88e 100644 (file)
@@ -253,7 +253,18 @@ private:
         uint8_t  Status;\r
     } PACK_STRUCT_STRUCT CSW;\r
 \r
-\r
+       // sense\r
+    typedef PACK_STRUCT_BEGIN struct {\r
+        uint8_t error;\r
+        uint8_t resvd;\r
+        uint8_t sense_key;\r
+        uint8_t information[4];\r
+        uint8_t additional_sense_length;\r
+        uint8_t resvd2[4];\r
+        uint8_t asc;\r
+        uint8_t ascq;\r
+        uint8_t resvd3[4];\r
+    } PACK_STRUCT_STRUCT SENSE;\r
 \r
     //state of the bulk-only state machine\r
     Stage stage;\r
@@ -263,6 +274,9 @@ private:
 \r
     // CSW which will be sent\r
     CSW csw;\r
+       \r
+       // Current sense\r
+       SENSE sense;\r
 \r
     // addr where will be read or written data\r
     uint32_t addr;\r
@@ -294,8 +308,10 @@ private:
     bool modeSense6 (void);\r
     void testUnitReady (void);\r
     bool requestSense (void);\r
+       void setSense (uint8_t sense_key, uint8_t asc, uint8_t ascq);\r
     void memoryVerify (uint8_t * buf, uint16_t size);\r
     void memoryWrite (uint8_t * buf, uint16_t size);\r
+    void mediaRemoval(void);\r
     void reset();\r
     void fail();\r
 \r