\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
_status = NO_INIT;\r
connect();\r
// USBDevice::connect();\r
+ setSense(SENSE_NO_SENSE, 0x00, 0x00);\r
USBHAL::connect();\r
}\r
\r
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
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
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
\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
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