diff --git a/examples/device/nrf52840_freertos/segger/nrf5x_freertos.emProject b/examples/device/nrf52840_freertos/segger/nrf5x_freertos.emProject
index ccc1960e4..efb2f6e6e 100644
--- a/examples/device/nrf52840_freertos/segger/nrf5x_freertos.emProject
+++ b/examples/device/nrf52840_freertos/segger/nrf5x_freertos.emProject
@@ -57,9 +57,9 @@
-
-
-
+
+
+
diff --git a/examples/device/nrf52840_freertos/src/msc_device_app.c b/examples/device/nrf52840_freertos/src/msc_app.c
similarity index 56%
rename from examples/device/nrf52840_freertos/src/msc_device_app.c
rename to examples/device/nrf52840_freertos/src/msc_app.c
index 9f5015042..52cf58f78 100644
--- a/examples/device/nrf52840_freertos/src/msc_device_app.c
+++ b/examples/device/nrf52840_freertos/src/msc_app.c
@@ -1,42 +1,42 @@
/**************************************************************************/
/*!
- @file msc_device_app.c
- @author hathach (tinyusb.org)
+ @file msc_app.c
+ @author hathach (tinyusb.org)
- @section LICENSE
+ @section LICENSE
- Software License Agreement (BSD License)
+ Software License Agreement (BSD License)
- Copyright (c) 2013, hathach (tinyusb.org)
- All rights reserved.
+ 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.
+ 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 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.
-*/
+ 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
diff --git a/examples/device/nrf52840_freertos/src/msc_app.h b/examples/device/nrf52840_freertos/src/msc_app.h
new file mode 100644
index 000000000..38d0f4c99
--- /dev/null
+++ b/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_ */
+
+/** @} */
diff --git a/examples/device/nrf52840_freertos/src/msc_device_app.h b/examples/device/nrf52840_freertos/src/msc_device_app.h
deleted file mode 100644
index cc3caa102..000000000
--- a/examples/device/nrf52840_freertos/src/msc_device_app.h
+++ /dev/null
@@ -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_ */
-
-/** @} */
diff --git a/examples/device/nrf52840_freertos/src/msc_flash_qspi.c b/examples/device/nrf52840_freertos/src/msc_flash_qspi.c
new file mode 100644
index 000000000..d8058d8ac
--- /dev/null
+++ b/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