diff options
| author | Ha Thach <[email protected]> | 2020-01-07 16:26:58 +0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2020-01-07 16:26:58 +0700 |
| commit | 130250a2be309ecfe5cd68764a6f4b7a9cc4dfc7 (patch) | |
| tree | 4e05aa80345fb803946e47a68896c21bff0aba63 /src/class | |
| parent | 5c5f876461e81ff7c2937978e4e6855e0208ebfb (diff) | |
| parent | d6a8d42bd6ed5ee1d9ea2e58128a3903dcd88d79 (diff) | |
Merge branch 'master' into nuc121
Diffstat (limited to 'src/class')
| -rw-r--r-- | src/class/msc/msc_device.c | 55 |
1 files changed, 50 insertions, 5 deletions
diff --git a/src/class/msc/msc_device.c b/src/class/msc/msc_device.c index bf2b5bb8c..bef5d599b 100644 --- a/src/class/msc/msc_device.c +++ b/src/class/msc/msc_device.c @@ -39,7 +39,8 @@ enum {
MSC_STAGE_CMD = 0,
MSC_STAGE_DATA,
- MSC_STAGE_STATUS
+ MSC_STAGE_STATUS,
+ MSC_STAGE_STATUS_SENT
};
typedef struct
@@ -98,6 +99,34 @@ static inline uint16_t rdwr10_get_blockcount(uint8_t const command[]) }
//--------------------------------------------------------------------+
+// Debug
+//--------------------------------------------------------------------+
+#if CFG_TUSB_DEBUG >= 2
+
+static lookup_entry_t const _msc_scsi_cmd_lookup[] =
+{
+ { .key = SCSI_CMD_TEST_UNIT_READY , .data = "Test Unit Ready" },
+ { .key = SCSI_CMD_INQUIRY , .data = "Inquiry" },
+ { .key = SCSI_CMD_MODE_SELECT_6 , .data = "Mode_Select 6" },
+ { .key = SCSI_CMD_MODE_SENSE_6 , .data = "Mode_Sense 6" },
+ { .key = SCSI_CMD_START_STOP_UNIT , .data = "Start Stop Unit" },
+ { .key = SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL , .data = "Prevent Allow Medium Removal" },
+ { .key = SCSI_CMD_READ_CAPACITY_10 , .data = "Read Capacity10" },
+ { .key = SCSI_CMD_REQUEST_SENSE , .data = "Request Sense" },
+ { .key = SCSI_CMD_READ_FORMAT_CAPACITY , .data = "Read Format Capacity" },
+ { .key = SCSI_CMD_READ_10 , .data = "Read10" },
+ { .key = SCSI_CMD_WRITE_10 , .data = "Write10" }
+};
+
+static lookup_table_t const _msc_scsi_cmd_table =
+{
+ .count = TU_ARRAY_SIZE(_msc_scsi_cmd_lookup),
+ .items = _msc_scsi_cmd_lookup
+};
+
+#endif
+
+//--------------------------------------------------------------------+
// APPLICATION API
//--------------------------------------------------------------------+
bool tud_msc_set_sense(uint8_t lun, uint8_t sense_key, uint8_t add_sense_code, uint8_t add_sense_qualifier)
@@ -378,6 +407,9 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t TU_ASSERT( event == XFER_RESULT_SUCCESS &&
xferred_bytes == sizeof(msc_cbw_t) && p_cbw->signature == MSC_CBW_SIGNATURE );
+ TU_LOG2(" SCSI Command: %s\n", lookup_find(&_msc_scsi_cmd_table, p_cbw->command[0]));
+ // TU_LOG2_MEM(p_cbw, xferred_bytes, 2);
+
p_csw->signature = MSC_CSW_SIGNATURE;
p_csw->tag = p_cbw->tag;
p_csw->data_residue = 0;
@@ -448,6 +480,9 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t break;
case MSC_STAGE_DATA:
+ TU_LOG2(" SCSI Data\n");
+ //TU_LOG2_MEM(_mscd_buf, xferred_bytes, 2);
+
// OUT transfer, invoke callback if needed
if ( !tu_bit_test(p_cbw->dir, 7) )
{
@@ -535,9 +570,16 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t break;
case MSC_STAGE_STATUS:
- // Wait for the command status wrapper complete event
+ // processed immediately after this switch, supposedly to be empty
+ break;
+
+ case MSC_STAGE_STATUS_SENT:
+ // Wait for the Status phase to complete
if( (ep_addr == p_msc->ep_in) && (xferred_bytes == sizeof(msc_csw_t)) )
{
+ TU_LOG2(" SCSI Status: %u\n", p_csw->status);
+ // TU_LOG2_MEM(p_csw, xferred_bytes, 2);
+
// Move to default CMD stage
p_msc->stage = MSC_STAGE_CMD;
@@ -561,9 +603,6 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t }
else
{
- // Send SCSI Status
- TU_ASSERT(usbd_edpt_xfer(rhport, p_msc->ep_in , (uint8_t*) &p_msc->csw, sizeof(msc_csw_t)));
-
// Invoke complete callback if defined
switch(p_cbw->command[0])
{
@@ -579,6 +618,12 @@ bool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t if ( tud_msc_scsi_complete_cb ) tud_msc_scsi_complete_cb(p_cbw->lun, p_cbw->command);
break;
}
+
+ // Move to Status Sent stage
+ p_msc->stage = MSC_STAGE_STATUS_SENT;
+
+ // Send SCSI Status
+ TU_ASSERT(usbd_edpt_xfer(rhport, p_msc->ep_in , (uint8_t*) &p_msc->csw, sizeof(msc_csw_t)));
}
}
|
