diff --git a/examples/device/nrf52840/src/msc_device_ramdisk.c b/examples/device/nrf52840/src/msc_device_ramdisk.c index 8e34942d..eb617ea5 100644 --- a/examples/device/nrf52840/src/msc_device_ramdisk.c +++ b/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; } //--------------------------------------------------------------------+ diff --git a/examples/device/nrf52840/src/tusb_config.h b/examples/device/nrf52840/src/tusb_config.h index 86e3698f..476ff4be 100644 --- a/examples/device/nrf52840/src/tusb_config.h +++ b/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 diff --git a/examples/obsolete/device/src/msc_device_app.c b/examples/obsolete/device/src/msc_device_app.c index b522d847..ae4b3714 100644 --- a/examples/obsolete/device/src/msc_device_app.c +++ b/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; } //--------------------------------------------------------------------+ diff --git a/examples/obsolete/device/src/msc_device_ramdisk.c b/examples/obsolete/device/src/msc_device_ramdisk.c index fbcd04f5..cb36548e 100644 --- a/examples/obsolete/device/src/msc_device_ramdisk.c +++ b/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); diff --git a/examples/obsolete/device/src/msc_device_romdisk.c b/examples/obsolete/device/src/msc_device_romdisk.c index 2c65d0f8..0dd84bdf 100644 --- a/examples/obsolete/device/src/msc_device_romdisk.c +++ b/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; diff --git a/examples/obsolete/device/src/tusb_config.h b/examples/obsolete/device/src/tusb_config.h index 4db29baa..bdadb211 100644 --- a/examples/obsolete/device/src/tusb_config.h +++ b/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 //--------------------------------------------------------------------+