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