hathach 7 жил өмнө
parent
commit
a993cb55e5

+ 3 - 3
examples/device/nrf52840_freertos/segger/nrf5x_freertos.emProject

@@ -57,9 +57,9 @@
       <file file_name="../src/tusb_config.h" />
       <file file_name="../src/tusb_descriptors.c" />
       <file file_name="../src/tusb_descriptors.h" />
-      <file file_name="../src/msc_device_app.c" />
-      <file file_name="../src/msc_device_app.h" />
-      <file file_name="../src/msc_device_ramdisk.c" />
+      <file file_name="../src/msc_flash_qspi.c" />
+      <file file_name="../src/msc_app.c" />
+      <file file_name="../src/msc_app.h" />
     </folder>
     <folder Name="hw">
       <folder Name="bsp">

+ 35 - 44
examples/device/nrf52840_freertos/src/msc_device_app.c → examples/device/nrf52840_freertos/src/msc_app.c

@@ -1,42 +1,42 @@
 /**************************************************************************/
 /*!
-    @file     msc_device_app.c
-    @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.
-*/
+ @file    msc_app.c
+ @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.
+ */
 /**************************************************************************/
 
-#include "msc_device_app.h"
+#include "msc_app.h"
 
 #if CFG_TUD_MSC
 
@@ -47,15 +47,6 @@
 //--------------------------------------------------------------------+
 // tinyusb callbacks
 //--------------------------------------------------------------------+
-void msc_app_mount(uint8_t rhport)
-{
-
-}
-
-void msc_app_umount(uint8_t rhport)
-{
-
-}
 
 // Callback invoked when received an SCSI command not in built-in list below
 // - READ_CAPACITY10, READ_FORMAT_CAPACITY, INQUIRY, MODE_SENSE6, REQUEST_SENSE

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

@@ -0,0 +1,64 @@
+/**************************************************************************/
+/*!
+ @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_ */
+
+/** @} */

+ 0 - 93
examples/device/nrf52840_freertos/src/msc_device_app.h

@@ -1,93 +0,0 @@
-/**************************************************************************/
-/*!
-    @file     msc_device_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
-
-#if CFG_TUD_MSC
-
-enum
-{
-  DISK_BLOCK_NUM  = 16, // 8KB is the smallest size that windows allow to mount
-  DISK_BLOCK_SIZE = 512
-};
-
-#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"
-
-#if CFG_TUSB_MCU==OPT_MCU_LPC11UXX || CFG_TUSB_MCU==OPT_MCU_LPC13UXX
-  #define MSCD_APP_ROMDISK
-#else // defaults is ram disk
-  #define MSCD_APP_RAMDISK
-#endif
-
-void msc_app_init(void);
-void msc_app_task(void* param);
-
-void msc_app_mount(uint8_t rhport);
-void msc_app_umount(uint8_t rhport);
-
-#else
-
-#define msc_app_init()
-#define msc_app_task(x)
-#define msc_app_mount(x)
-#define msc_app_umount(x)
-
-#endif
-
-#ifdef __cplusplus
- }
-#endif
-
-#endif /* _TUSB_MSCD_DEVICE_APP_H_ */
-
-/** @} */

+ 162 - 0
examples/device/nrf52840_freertos/src/msc_flash_qspi.c

@@ -0,0 +1,162 @@
+/**************************************************************************/
+/*!
+ @file    msc_flash_qspi.c
+ @author  hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2018, 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.
+*/
+/**************************************************************************/
+
+#include "msc_app.h"
+
+#if CFG_TUD_MSC && defined (BOARD_MSC_FLASH_QSPI)
+
+void flash_read (void *dst, uint32_t src, int len);
+void flash_write (uint32_t dst, const void *src, int len);
+void flash_flush (void);
+
+//--------------------------------------------------------------------+
+// MACRO TYPEDEF CONSTANT ENUM DECLARATION
+//--------------------------------------------------------------------+
+enum
+{
+  FLASH_STATE_IDLE,
+  FLASH_STATE_BUSY,
+  FLASH_STATE_COMPLETE
+};
+
+volatile uint8_t _fl_state = FLASH_STATE_IDLE;
+
+void qspi_flash_complete (void)
+{
+  _fl_state = FLASH_STATE_COMPLETE;
+}
+
+//------------- IMPLEMENTATION -------------//
+// Callback invoked when received READ10 command.
+// 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)
+{
+  uint32_t addr = lba * CFG_TUD_MSC_BLOCK_SZ + offset;
+
+  switch ( _fl_state )
+  {
+    case FLASH_STATE_IDLE:
+      _fl_state = FLASH_STATE_BUSY;
+      flash_read(buffer, addr, bufsize);
+      return 0;    // data not ready
+
+    case FLASH_STATE_BUSY:
+      return 0;    // data not ready
+
+    case FLASH_STATE_COMPLETE:
+      _fl_state = FLASH_STATE_IDLE;
+      return bufsize;
+
+    default:
+      _fl_state = FLASH_STATE_IDLE;
+      return -1;
+  }
+}
+
+// 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)
+{
+  uint32_t addr = lba * CFG_TUD_MSC_BLOCK_SZ + offset;
+
+  flash_write(addr, buffer, bufsize);
+
+  return bufsize;
+}
+
+// Callback invoked when WRITE10 command is completed (status received and accepted by host).
+// used to flush any pending cache.
+void tud_msc_write10_complete_cb (uint8_t lun)
+{
+  (void) lun;
+
+  // flush pending cache when write10 is complete
+  flash_flush();
+}
+
+//--------------------------------------------------------------------+
+// Flash caching
+//--------------------------------------------------------------------+
+#define FLASH_PAGE_SIZE    4096
+
+#define NO_CACHE 0xffffffff
+
+static uint32_t _fl_addr = NO_CACHE;
+static uint8_t _fl_buf[FLASH_PAGE_SIZE] __attribute__((aligned(4)));
+
+void flash_flush (void)
+{
+  if ( _fl_addr == NO_CACHE ) return;
+
+  TU_ASSERT(NRFX_SUCCESS == nrfx_qspi_erase(NRF_QSPI_ERASE_LEN_4KB, _fl_addr),);
+  while ( _fl_state != FLASH_STATE_COMPLETE )
+  {
+  }
+  _fl_state = FLASH_STATE_IDLE;
+
+  TU_ASSERT(NRFX_SUCCESS == nrfx_qspi_write(_fl_buf, FLASH_PAGE_SIZE, _fl_addr),);
+  while ( _fl_state != FLASH_STATE_COMPLETE )
+  {
+  }
+  _fl_state = FLASH_STATE_IDLE;
+
+  _fl_addr = NO_CACHE;
+}
+
+void flash_write (uint32_t dst, const void *src, int len)
+{
+  uint32_t newAddr = dst & ~(FLASH_PAGE_SIZE - 1);
+
+  if ( newAddr != _fl_addr )
+  {
+    flash_flush();
+    _fl_addr = newAddr;
+
+    flash_read(_fl_buf, newAddr, FLASH_PAGE_SIZE);
+  }
+
+  memcpy(_fl_buf + (dst & (FLASH_PAGE_SIZE - 1)), src, len);
+}
+
+void flash_read (void *dst, uint32_t src, int len)
+{
+  TU_ASSERT(NRFX_SUCCESS == nrfx_qspi_read(dst, len, src),);
+}
+
+
+#endif