Explorar el Código

update msc app

hathach hace 8 años
padre
commit
14471f3154

+ 8 - 6
examples/device/nrf52840/src/msc_device_ramdisk.c

@@ -91,17 +91,19 @@ uint8_t msc_device_ramdisk[DISK_BLOCK_NUM][DISK_BLOCK_SIZE] =
 //--------------------------------------------------------------------+
 // IMPLEMENTATION
 //--------------------------------------------------------------------+
-uint16_t tud_msc_read10_cb (uint8_t rhport, uint8_t lun, uint32_t lba, uint16_t block_count, void** pp_buffer)
+uint32_t tud_msc_read10_cb (uint8_t rhport, uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)
 {
-  (*pp_buffer) = msc_device_ramdisk[lba];
+  uint8_t* addr = msc_device_ramdisk[lba] + offset;
+  memcpy(buffer, addr, bufsize);
 
-  return min16_of(block_count, DISK_BLOCK_NUM);
+  return bufsize;
 }
-uint16_t tud_msc_write10_cb(uint8_t rhport, uint8_t lun, uint32_t lba, uint16_t block_count, void** pp_buffer)
+uint32_t tud_msc_write10_cb (uint8_t rhport, uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)
 {
-  (*pp_buffer) = msc_device_ramdisk[lba];
+  uint8_t* addr = msc_device_ramdisk[lba] + offset;
+  memcpy(addr, buffer, bufsize);
 
-  return min16_of(block_count, DISK_BLOCK_NUM);
+  return bufsize;
 }
 
 //--------------------------------------------------------------------+

+ 5 - 0
examples/device/nrf52840/src/tusb_config.h

@@ -78,6 +78,11 @@
 // If not enabled, application must call tud_cdc_flush() periodically
 #define CFG_TUD_CDC_FLUSH_ON_SOF    1
 
+// Number of supported Logical Unit Number
+#define CFG_TUD_MSC_MAXLUN        1
+
+// Buffer size of Device Mass storage
+#define CFG_TUD_MSC_BUFSIZE       512
 
 //--------------------------------------------------------------------+
 // USB RAM PLACEMENT

+ 34 - 26
examples/obsolete/device/src/msc_device_app.c

@@ -99,62 +99,70 @@ void msc_app_umount(uint8_t rhport)
 
 }
 
-bool tud_msc_scsi_cb (uint8_t rhport, uint8_t lun, uint8_t scsi_cmd[16], void* buffer, uint16_t* p_len)
+int32_t tud_msc_scsi_cb (uint8_t rhport, uint8_t lun, uint8_t scsi_cmd[16], void* buffer, uint16_t bufsize)
 {
   // read10 & write10 has their own callback and MUST not be handled here
 
-  void* bufptr = NULL;
-  uint16_t buflen = 0;
+  void const* ptr = NULL;
+  uint16_t len = 0;
+
+  // most scsi handled is input
+  bool in_xfer = true;
 
   switch (scsi_cmd[0])
   {
     case SCSI_CMD_INQUIRY:
-      bufptr = &mscd_inquiry_data;
-      buflen = sizeof(scsi_inquiry_data_t);
+      ptr = &mscd_inquiry_data;
+      len = sizeof(scsi_inquiry_data_t);
     break;
 
     case SCSI_CMD_READ_CAPACITY_10:
-      bufptr = &mscd_read_capacity10_data;
-      buflen = sizeof(scsi_read_capacity10_data_t);
+      ptr = &mscd_read_capacity10_data;
+      len = sizeof(scsi_read_capacity10_data_t);
     break;
 
     case SCSI_CMD_REQUEST_SENSE:
-      bufptr = &mscd_sense_data;
-      buflen = sizeof(scsi_sense_fixed_data_t);
+      ptr = &mscd_sense_data;
+      len = sizeof(scsi_sense_fixed_data_t);
     break;
 
     case SCSI_CMD_READ_FORMAT_CAPACITY:
-      bufptr = &mscd_format_capacity_data;
-      buflen = sizeof(scsi_read_format_capacity_data_t);
+      ptr = &mscd_format_capacity_data;
+      len = sizeof(scsi_read_format_capacity_data_t);
     break;
 
     case SCSI_CMD_MODE_SENSE_6:
-      bufptr = &msc_dev_mode_para;
-      buflen = sizeof(msc_dev_mode_para);
+      ptr = &msc_dev_mode_para;
+      len = sizeof(msc_dev_mode_para);
     break;
 
     case SCSI_CMD_TEST_UNIT_READY:
-      bufptr = NULL;
-      buflen= 0;
+      ptr = NULL;
+      len = 0;
     break;
 
     case SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL:
-      bufptr = NULL;
-      buflen= 0;
+      ptr = NULL;
+      len = 0;
     break;
 
     default:
-      (*p_len) = 0;
-      return false;
+      // negative is error -> Data stage is STALL, status = failed
+      return -1;
   }
 
-  if ( bufptr && buflen )
-  {
-    // Response len must not larger than expected from host
-    TU_ASSERT( (*p_len) >= buflen );
+  // return len must not larger than bufsize
+  TU_ASSERT( bufsize >= len );
 
-    memcpy(buffer, bufptr, buflen);
-    (*p_len) = buflen;
+  if ( ptr && len )
+  {
+    if(in_xfer)
+    {
+      memcpy(buffer, ptr, len);
+    }else
+    {
+      // SCSI output
+    }
   }
 
   //------------- clear sense data if it is not request sense command -------------//
@@ -165,7 +173,7 @@ bool tud_msc_scsi_cb (uint8_t rhport, uint8_t lun, uint8_t scsi_cmd[16], void* b
     mscd_sense_data.additional_sense_qualifier = 0;
   }
 
-  return true;
+  return len;
 }
 
 //--------------------------------------------------------------------+

+ 8 - 3
examples/obsolete/device/src/msc_device_ramdisk.c

@@ -91,15 +91,20 @@ uint8_t msc_device_ramdisk[DISK_BLOCK_NUM][DISK_BLOCK_SIZE] =
 //--------------------------------------------------------------------+
 // IMPLEMENTATION
 //--------------------------------------------------------------------+
-uint32_t tud_msc_read10_cb (uint8_t rhport, uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)
+int32_t tud_msc_read10_cb (uint8_t rhport, uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)
 {
+  (void) rhport; (void) lun;
+
   uint8_t* addr = msc_device_ramdisk[lba] + offset;
-  memcpy(buffer, addr, bufsize);
+  memcpy(buffer, (uint8_t*) addr, bufsize);
 
   return bufsize;
 }
-uint32_t tud_msc_write10_cb (uint8_t rhport, uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)
+
+int32_t tud_msc_write10_cb (uint8_t rhport, uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)
 {
+  (void) rhport; (void) lun;
+
   uint8_t* addr = msc_device_ramdisk[lba] + offset;
   memcpy(addr, buffer, bufsize);
 

+ 8 - 3
examples/obsolete/device/src/msc_device_romdisk.c

@@ -94,17 +94,22 @@ const uint8_t msc_device_app_rommdisk[DISK_BLOCK_NUM][DISK_BLOCK_SIZE] =
 //--------------------------------------------------------------------+
 // IMPLEMENTATION
 //--------------------------------------------------------------------+
-uint32_t tud_msc_read10_cb (uint8_t rhport, uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)
+int32_t tud_msc_read10_cb (uint8_t rhport, uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)
 {
+  (void) rhport; (void) lun;
+
   uint8_t* addr = msc_device_ramdisk[lba] + offset;
-  memcpy(buffer, addr, bufsize);
+  memcpy(buffer, (uint8_t*) addr, bufsize);
 
   return bufsize;
 }
 
+
 // Stall write10 by return 0, as this is readonly disk
-uint32_t tud_msc_write10_cb (uint8_t rhport, uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)
+int32_t tud_msc_write10_cb (uint8_t rhport, uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)
 {
+  (void) rhport; (void) lun;
+
   // let host know that this is read-only disk
   mscd_sense_data.sense_key = SCSI_SENSEKEY_DATA_PROTECT;
   return 0;

+ 1 - 1
examples/obsolete/device/src/tusb_config.h

@@ -87,7 +87,7 @@
 // Number of supported Logical Unit Number
 #define CFG_TUD_MSC_MAXLUN        1
 
-
+// Buffer size of Device Mass storage
 #define CFG_TUD_MSC_BUFSIZE       512
 
 //--------------------------------------------------------------------+