Prechádzať zdrojové kódy

rename some scsi command struct, add SCSI_CMD_MODE_SENSE_6 to built-in support command

hathach 7 rokov pred
rodič
commit
e362f5fd64

+ 2 - 18
examples/device/nrf52840/src/msc_device_app.c

@@ -39,20 +39,10 @@
 #include "msc_device_app.h"
 
 #if CFG_TUD_MSC
-//--------------------------------------------------------------------+
-// INCLUDE
-//--------------------------------------------------------------------+
 
 //--------------------------------------------------------------------+
 // MACRO CONSTANT TYPEDEF
 //--------------------------------------------------------------------+
-static scsi_mode_parameters_t const msc_dev_mode_para =
-{
-    .mode_data_length        = 3,
-    .medium_type             = 0,
-    .device_specific_para    = 0,
-    .block_descriptor_length = 0
-};
 
 //--------------------------------------------------------------------+
 // tinyusb callbacks
@@ -79,11 +69,6 @@ int32_t tud_msc_scsi_cb (uint8_t lun, uint8_t const scsi_cmd[16], void* buffer,
 
   switch (scsi_cmd[0])
   {
-    case SCSI_CMD_MODE_SENSE_6:
-      ptr = &msc_dev_mode_para;
-      len = sizeof(msc_dev_mode_para);
-    break;
-
     case SCSI_CMD_TEST_UNIT_READY:
       // Command that host uses to check our readiness before sending other commands
       len = 0;
@@ -100,9 +85,8 @@ int32_t tud_msc_scsi_cb (uint8_t lun, uint8_t const scsi_cmd[16], void* buffer,
       len = 0;
     break;
 
-    default:
-      // negative is error -> Data stage is STALL, status = failed
-      return -1;
+    // negative is error -> Data stage is STALL, status = failed
+    default: return -1;
   }
 
   // return len must not larger than bufsize

+ 8 - 76
examples/obsolete/device/src/msc_device_app.c

@@ -39,52 +39,11 @@
 #include "msc_device_app.h"
 
 #if CFG_TUD_MSC
-//--------------------------------------------------------------------+
-// INCLUDE
-//--------------------------------------------------------------------+
 #include "app_os_prio.h"
 
 //--------------------------------------------------------------------+
 // MACRO CONSTANT TYPEDEF
 //--------------------------------------------------------------------+
-static scsi_inquiry_data_t const mscd_inquiry_data =
-{
-    .is_removable         = 1,
-    .version              = 2,
-    .response_data_format = 2,
-    .vendor_id            = "tinyusb",
-    .product_id           = "MSC Example",
-    .product_revision     = "0.01"
-};
-
-static scsi_read_capacity10_data_t const mscd_read_capacity10_data =
-{
-    .last_lba   = ENDIAN_BE(DISK_BLOCK_NUM-1), // Big Endian
-    .block_size = ENDIAN_BE(DISK_BLOCK_SIZE)   // Big Endian
-};
-
-static scsi_sense_fixed_data_t mscd_sense_data =
-{
-    .response_code        = 0x70,
-    .sense_key            = 0, // no errors
-    .add_sense_len = sizeof(scsi_sense_fixed_data_t) - 8
-};
-
-static scsi_read_format_capacity_data_t const mscd_format_capacity_data =
-{
-    .list_length     = 8,
-    .block_num       = ENDIAN_BE(DISK_BLOCK_NUM), // write capacity
-    .descriptor_type = 2, // TODO formatted media, refractor to const
-    .block_size_u16  = ENDIAN_BE16(DISK_BLOCK_SIZE)
-};
-
-static scsi_mode_parameters_t const msc_dev_mode_para =
-{
-    .mode_data_length        = 3,
-    .medium_type             = 0,
-    .device_specific_para    = 0,
-    .block_descriptor_length = 0
-};
 
 //--------------------------------------------------------------------+
 // tinyusb callbacks
@@ -111,38 +70,19 @@ int32_t tud_msc_scsi_cb (uint8_t lun, uint8_t const scsi_cmd[16], void* buffer,
 
   switch (scsi_cmd[0])
   {
-    case SCSI_CMD_INQUIRY:
-      ptr = &mscd_inquiry_data;
-      len = sizeof(scsi_inquiry_data_t);
-    break;
-
-    case SCSI_CMD_READ_CAPACITY_10:
-      ptr = &mscd_read_capacity10_data;
-      len = sizeof(scsi_read_capacity10_data_t);
-    break;
-
-    case SCSI_CMD_REQUEST_SENSE:
-      ptr = &mscd_sense_data;
-      len = sizeof(scsi_sense_fixed_data_t);
-    break;
-
-    case SCSI_CMD_READ_FORMAT_CAPACITY:
-      ptr = &mscd_format_capacity_data;
-      len = sizeof(scsi_read_format_capacity_data_t);
-    break;
-
-    case SCSI_CMD_MODE_SENSE_6:
-      ptr = &msc_dev_mode_para;
-      len = sizeof(msc_dev_mode_para);
-    break;
-
     case SCSI_CMD_TEST_UNIT_READY:
-      ptr = NULL;
+      // Command that host uses to check our readiness before sending other commands
       len = 0;
     break;
 
     case SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL:
-      ptr = NULL;
+      // Host is about to read/write etc ... better not to disconnect disk
+      len = 0;
+    break;
+
+    case SCSI_CMD_START_STOP_UNIT:
+      // Host try to eject/safe remove/powerof us. We could safely disconnect with disk storage, or go into lower power
+      // scsi_start_stop_unit_t const * cmd_start_stop = (scsi_start_stop_unit_t const *) scsi_cmd
       len = 0;
     break;
 
@@ -165,14 +105,6 @@ int32_t tud_msc_scsi_cb (uint8_t lun, uint8_t const scsi_cmd[16], void* buffer,
     }
   }
 
-  //------------- clear sense data if it is not request sense command -------------//
-  if ( SCSI_CMD_REQUEST_SENSE != scsi_cmd[0] )
-  {
-    mscd_sense_data.sense_key                  = SCSI_SENSEKEY_NONE;
-    mscd_sense_data.add_sense_code      = 0;
-    mscd_sense_data.add_sense_qualifier = 0;
-  }
-
   return len;
 }
 

+ 12 - 12
src/class/msc/msc.h

@@ -230,9 +230,9 @@ typedef struct ATTR_PACKED
   uint8_t vendor_id[8]  ; ///< 8 bytes of ASCII data identifying the vendor of the product.
   uint8_t product_id[16]; ///< 16 bytes of ASCII data defined by the vendor.
   uint8_t product_rev[4]; ///< 4 bytes of ASCII data defined by the vendor.
-} scsi_inquiry_data_t;
+} scsi_inquiry_resp_t;
 
-VERIFY_STATIC(sizeof(scsi_inquiry_data_t) == 36, "size is not correct");
+VERIFY_STATIC(sizeof(scsi_inquiry_resp_t) == 36, "size is not correct");
 
 
 typedef struct ATTR_PACKED
@@ -257,9 +257,9 @@ typedef struct ATTR_PACKED
 
   uint8_t  sense_key_specific[3]; ///< sense key specific valid bit is bit 7 of key[0], aka MSB in Big Endian layout
 
-} scsi_sense_fixed_data_t;
+} scsi_sense_fixed_resp_t;
 
-VERIFY_STATIC(sizeof(scsi_sense_fixed_data_t) == 18, "size is not correct");
+VERIFY_STATIC(sizeof(scsi_sense_fixed_resp_t) == 18, "size is not correct");
 
 typedef struct ATTR_PACKED
 {
@@ -275,19 +275,19 @@ typedef struct ATTR_PACKED
   uint8_t subpage_code;
   uint8_t alloc_length;
   uint8_t control;
-} scsi_mode_sense_6_t;
+} scsi_mode_sense6_t;
 
-VERIFY_STATIC( sizeof(scsi_mode_sense_6_t) == 6, "size is not correct");
+VERIFY_STATIC( sizeof(scsi_mode_sense6_t) == 6, "size is not correct");
 
 typedef struct ATTR_PACKED
 {
-  uint8_t mode_data_length;
+  uint8_t data_len;
   uint8_t medium_type;
   uint8_t device_specific_para;
-  uint8_t block_descriptor_length;
-} scsi_mode_parameters_t;
+  uint8_t block_descriptor_len;
+} scsi_mode_sense6_resp_t;
 
-VERIFY_STATIC( sizeof(scsi_mode_parameters_t) == 4, "size is not correct");
+VERIFY_STATIC( sizeof(scsi_mode_sense6_resp_t) == 4, "size is not correct");
 
 typedef struct ATTR_PACKED
 {
@@ -372,9 +372,9 @@ VERIFY_STATIC(sizeof(scsi_read_capacity10_t) == 10, "size is not correct");
 typedef struct {
   uint32_t last_lba   ; ///< The last Logical Block Address of the device
   uint32_t block_size ; ///< Block size in bytes
-} scsi_read_capacity10_data_t;
+} scsi_read_capacity10_resp_t;
 
-VERIFY_STATIC(sizeof(scsi_read_capacity10_data_t) == 8, "size is not correct");
+VERIFY_STATIC(sizeof(scsi_read_capacity10_resp_t) == 8, "size is not correct");
 
 /// SCSI Read 10 Command
 typedef struct ATTR_PACKED

+ 19 - 4
src/class/msc/msc_device.c

@@ -202,7 +202,7 @@ int32_t proc_builtin_scsi(msc_cbw_t const * p_cbw, uint8_t* buffer, uint32_t buf
   {
     case SCSI_CMD_READ_CAPACITY_10:
     {
-      scsi_read_capacity10_data_t read_capa10 =
+      scsi_read_capacity10_resp_t read_capa10 =
       {
           .last_lba   = ENDIAN_BE(CFG_TUD_MSC_BLOCK_NUM-1), // read capacity
           .block_size = ENDIAN_BE(CFG_TUD_MSC_BLOCK_SZ)
@@ -230,7 +230,7 @@ int32_t proc_builtin_scsi(msc_cbw_t const * p_cbw, uint8_t* buffer, uint32_t buf
 
     case SCSI_CMD_INQUIRY:
     {
-      scsi_inquiry_data_t inquiry_rsp =
+      scsi_inquiry_resp_t inquiry_rsp =
       {
           .is_removable         = 1,
           .version              = 2,
@@ -249,15 +249,30 @@ int32_t proc_builtin_scsi(msc_cbw_t const * p_cbw, uint8_t* buffer, uint32_t buf
     }
     break;
 
+    case SCSI_CMD_MODE_SENSE_6:
+    {
+      scsi_mode_sense6_resp_t const mode_resp =
+      {
+          .data_len             = 3,
+          .medium_type          = 0,
+          .device_specific_para = 0,
+          .block_descriptor_len = 0  // no block descriptor are included
+      };
+
+      ret = sizeof(mode_resp);
+      memcpy(buffer, &mode_resp, ret);
+    }
+    break;
+
     case SCSI_CMD_REQUEST_SENSE:
     {
-      scsi_sense_fixed_data_t sense_rsp =
+      scsi_sense_fixed_resp_t sense_rsp =
       {
           .response_code = 0x70,
           .valid         = 1
       };
 
-      sense_rsp.add_sense_len = sizeof(scsi_sense_fixed_data_t) - 8;
+      sense_rsp.add_sense_len = sizeof(scsi_sense_fixed_resp_t) - 8;
 
       sense_rsp.sense_key           = _mscd_itf.sense_key;
       sense_rsp.add_sense_code      = _mscd_itf.add_sense_code;