From 4314be9aebff009f5dd626d59142459edea5c8a2 Mon Sep 17 00:00:00 2001 From: hathach Date: Thu, 22 Nov 2018 12:11:06 +0700 Subject: msc device block count and block num - replace CFG_TUD_MSC_BLOCK_NUM & CFG_TUD_MSC_BLOCK_SZ by tud_msc_capacity_cb() (mandatory callback) --- src/class/msc/msc_device.c | 31 +++++++++++++------------------ src/class/msc/msc_device.h | 14 ++++++++++---- 2 files changed, 23 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/class/msc/msc_device.c b/src/class/msc/msc_device.c index 92bc4c6c8..bfe708f42 100644 --- a/src/class/msc/msc_device.c +++ b/src/class/msc/msc_device.c @@ -205,16 +205,6 @@ bool mscd_control_request_complete(uint8_t rhport, tusb_control_request_t const return true; } -// For backwards compatibility we support static block counts. -#if defined(CFG_TUD_MSC_BLOCK_NUM) && defined(CFG_TUD_MSC_BLOCK_SZ) -ATTR_WEAK bool tud_lun_capacity_cb(uint8_t lun, uint32_t* last_valid_sector, uint16_t* block_size) { - (void) lun; - *last_valid_sector = CFG_TUD_MSC_BLOCK_NUM-1; - *block_size = CFG_TUD_MSC_BLOCK_SZ; - return true; -} -#endif - // return length of response (copied to buffer), -1 if it is not an built-in commands int32_t proc_builtin_scsi(msc_cbw_t const * p_cbw, uint8_t* buffer, uint32_t bufsize) { @@ -226,10 +216,14 @@ int32_t proc_builtin_scsi(msc_cbw_t const * p_cbw, uint8_t* buffer, uint32_t buf { scsi_read_capacity10_resp_t read_capa10; - uint32_t last_valid_sector; - uint16_t block_size; - tud_lun_capacity_cb(p_cbw->lun, &last_valid_sector, &block_size); - read_capa10.last_lba = ENDIAN_BE(last_valid_sector); // read capacity + uint32_t block_count; + uint32_t block_size; + uint16_t block_size_u16; + + tud_msc_capacity_cb(p_cbw->lun, &block_count, &block_size_u16); + block_size = (uint32_t) block_size_u16; + + read_capa10.last_lba = ENDIAN_BE(block_count-1); read_capa10.block_size = ENDIAN_BE(block_size); ret = sizeof(read_capa10); @@ -243,14 +237,15 @@ int32_t proc_builtin_scsi(msc_cbw_t const * p_cbw, uint8_t* buffer, uint32_t buf { .list_length = 8, .block_num = 0, - .descriptor_type = 2, // formatted media + .descriptor_type = 2, // formatted media .block_size_u16 = 0 }; - uint32_t last_valid_sector; + uint32_t block_count; uint16_t block_size; - tud_lun_capacity_cb(p_cbw->lun, &last_valid_sector, &block_size); - read_fmt_capa.block_num = ENDIAN_BE(last_valid_sector+1); + + tud_msc_capacity_cb(p_cbw->lun, &block_count, &block_size); + read_fmt_capa.block_num = ENDIAN_BE(block_count); read_fmt_capa.block_size_u16 = ENDIAN_BE16(block_size); ret = sizeof(read_fmt_capa); diff --git a/src/class/msc/msc_device.h b/src/class/msc/msc_device.h index d08d9f9cb..c1c51255a 100644 --- a/src/class/msc/msc_device.h +++ b/src/class/msc/msc_device.h @@ -132,6 +132,9 @@ int32_t tud_msc_read10_cb (uint8_t lun, uint32_t lba, uint32_t offset, void* buf */ int32_t tud_msc_write10_cb (uint8_t lun, uint32_t lba, uint32_t offset, uint8_t* buffer, uint32_t bufsize); +// Invoked to determine the disk size +void tud_msc_capacity_cb(uint8_t lun, uint32_t* block_count, uint16_t* block_size); + /** * Callback invoked when received an SCSI command not in built-in list below. * \param[in] lun Logical unit number @@ -152,16 +155,19 @@ int32_t tud_msc_write10_cb (uint8_t lun, uint32_t lba, uint32_t offset, uint8_t* int32_t tud_msc_scsi_cb (uint8_t lun, uint8_t const scsi_cmd[16], void* buffer, uint16_t bufsize); /*------------- Optional callbacks : Could be used by application to free up resources -------------*/ + +// Invoked when Read10 command is complete ATTR_WEAK void tud_msc_read10_complete_cb(uint8_t lun); + +// Invoke when Write10 command is complete ATTR_WEAK void tud_msc_write10_complete_cb(uint8_t lun); + +// Invoked when command in tud_msc_scsi_cb is complete ATTR_WEAK void tud_msc_scsi_complete_cb(uint8_t lun, uint8_t const scsi_cmd[16]); -// Hook to make a mass storage device read-only. +// Hook to make a mass storage device read-only. TODO remove ATTR_WEAK bool tud_msc_is_writable_cb(uint8_t lun); -// Override for dynamic LUN sizes. -ATTR_WEAK bool tud_lun_capacity_cb(uint8_t lun, uint32_t* last_valid_sector, uint16_t* block_size); - /** @} */ /** @} */ -- cgit v1.3.1