Răsfoiți Sursa

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)
hathach 7 ani în urmă
părinte
comite
4314be9aeb

+ 11 - 3
examples/device/cdc_msc_hid/src/msc_disk_ram.c

@@ -97,6 +97,8 @@ uint8_t msc_device_ramdisk[DISK_BLOCK_NUM][DISK_BLOCK_SIZE] =
 // Copy disk's data to buffer (up to bufsize) and return number of copied bytes.
 int32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)
 {
+  (void) lun;
+
   uint8_t* addr = msc_device_ramdisk[lba] + offset;
   memcpy(buffer, addr, bufsize);
 
@@ -107,14 +109,20 @@ int32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void* buff
 // Process data in buffer to disk's storage and return number of written bytes
 int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t* buffer, uint32_t bufsize)
 {
+  (void) lun;
+
   uint8_t* addr = msc_device_ramdisk[lba] + offset;
   memcpy(addr, buffer, bufsize);
 
   return bufsize;
 }
 
-//--------------------------------------------------------------------+
-// HELPER
-//--------------------------------------------------------------------+
+void tud_msc_capacity_cb(uint8_t lun, uint32_t* block_count, uint16_t* block_size)
+{
+  (void) lun;
+
+  *block_count = DISK_BLOCK_NUM;
+  *block_size  = DISK_BLOCK_SIZE;
+}
 
 #endif

+ 1 - 13
examples/device/cdc_msc_hid/src/tusb_config.h

@@ -55,14 +55,8 @@
 #endif
 
 #define CFG_TUSB_RHPORT0_MODE       OPT_MODE_DEVICE
-
 #define CFG_TUSB_DEBUG              2
-
-/*------------- RTOS -------------*/
-#define CFG_TUSB_OS                 OPT_OS_NONE // be passed from IDE/command line for easy project switching
-//#define CFG_TUD_TASK_PRIO         0
-//#define CFG_TUD_TASK_QUEUE_SZ     16
-//#define CFG_TUD_TASK_STACK_SZ     150
+#define CFG_TUSB_OS                 OPT_OS_NONE
 
 //--------------------------------------------------------------------
 // DEVICE CONFIGURATION
@@ -118,12 +112,6 @@
 // Buffer size of Device Mass storage
 #define CFG_TUD_MSC_BUFSIZE         512
 
-// Number of Blocks
-#define CFG_TUD_MSC_BLOCK_NUM       16
-
-// Block size
-#define CFG_TUD_MSC_BLOCK_SZ        512
-
 // Vendor name included in Inquiry response, max 8 bytes
 #define CFG_TUD_MSC_VENDOR          "tinyusb"
 

+ 2 - 1
examples/device/cdc_msc_hid_freertos/src/msc_app.c

@@ -36,7 +36,8 @@
  */
 /**************************************************************************/
 
-#include "msc_app.h"
+#include "bsp/board.h"
+#include "tusb.h"
 
 #if CFG_TUD_MSC
 

+ 0 - 64
examples/device/cdc_msc_hid_freertos/src/msc_app.h

@@ -1,64 +0,0 @@
-/**************************************************************************/
-/*!
- @file    msc_app.h
- @author  hathach (tinyusb.org)
-
- @section LICENSE
-
- Software License Agreement (BSD License)
-
- Copyright (c) 2013, hathach (tinyusb.org)
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- 3. Neither the name of the copyright holders nor the
- names of its contributors may be used to endorse or promote products
- derived from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- This file is part of the tinyusb stack.
- */
-/**************************************************************************/
-
-/** \ingroup group_demo
- *  \defgroup Mass Storage Device App
- *  @{ */
-
-#ifndef _TUSB_MSCD_DEVICE_APP_H_
-#define _TUSB_MSCD_DEVICE_APP_H_
-
-#include "bsp/board.h"
-#include "tusb.h"
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-#define README_CONTENTS \
-"This is tinyusb's MassStorage Class demo.\r\n\r\n\
-If you find any bugs or get any questions, feel free to file an\r\n\
-issue at github.com/hathach/tinyusb"
-
-#ifdef __cplusplus
- }
-#endif
-
-#endif /* _TUSB_MSCD_DEVICE_APP_H_ */
-
-/** @} */

+ 19 - 13
examples/device/cdc_msc_hid_freertos/src/msc_device_ramdisk.c → examples/device/cdc_msc_hid_freertos/src/msc_disk_ram.c

@@ -36,18 +36,22 @@
 */
 /**************************************************************************/
 
-#include "msc_app.h"
+#include "bsp/board.h"
+#include "tusb.h"
 
-#if CFG_TUD_MSC && defined (MSCD_APP_RAMDISK)
+#if CFG_TUD_MSC
 
-//--------------------------------------------------------------------+
-// MACRO CONSTANT TYPEDEF
-//--------------------------------------------------------------------+
+#define README_CONTENTS \
+"This is tinyusb's MassStorage Class demo.\r\n\r\n\
+If you find any bugs or get any questions, feel free to file an\r\n\
+issue at github.com/hathach/tinyusb"
+
+enum
+{
+  DISK_BLOCK_NUM  = 16, // 8KB is the smallest size that windows allow to mount
+  DISK_BLOCK_SIZE = 512
+};
 
-//--------------------------------------------------------------------+
-// INTERNAL OBJECT & FUNCTION DECLARATION
-//--------------------------------------------------------------------+
-CFG_TUSB_ATTR_USBRAM CFG_TUSB_MEM_ALIGN
 uint8_t msc_device_ramdisk[DISK_BLOCK_NUM][DISK_BLOCK_SIZE] =
 {
   //------------- Boot Sector -------------//
@@ -101,7 +105,7 @@ int32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void* buff
 
 // Callback invoked when received WRITE10 command.
 // Process data in buffer to disk's storage and return number of written bytes
-int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)
+int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t* buffer, uint32_t bufsize)
 {
   uint8_t* addr = msc_device_ramdisk[lba] + offset;
   memcpy(addr, buffer, bufsize);
@@ -109,8 +113,10 @@ int32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void* buf
   return bufsize;
 }
 
-//--------------------------------------------------------------------+
-// HELPER
-//--------------------------------------------------------------------+
+void tud_msc_capacity_cb(uint8_t lun, uint32_t* block_count, uint16_t* block_size)
+{
+  *block_count = DISK_BLOCK_NUM;
+  *block_size  = DISK_BLOCK_SIZE;
+}
 
 #endif

+ 0 - 6
examples/device/cdc_msc_hid_freertos/src/tusb_config.h

@@ -117,12 +117,6 @@
 // Buffer size of Device Mass storage
 #define CFG_TUD_MSC_BUFSIZE         512
 
-// Number of Blocks
-#define CFG_TUD_MSC_BLOCK_NUM       BOARD_MSC_FLASH_SIZE/CFG_TUD_MSC_BLOCK_SZ
-
-// Block size
-#define CFG_TUD_MSC_BLOCK_SZ        512
-
 // Vendor name included in Inquiry response, max 8 bytes
 #define CFG_TUD_MSC_VENDOR          "tinyusb"
 

+ 13 - 18
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);

+ 10 - 4
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);
-
 /** @} */
 /** @} */