diff options
| author | hathach <[email protected]> | 2018-09-08 00:15:34 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2018-09-08 00:15:34 +0700 |
| commit | 8572947da584e10d202845bccafaf313c4693460 (patch) | |
| tree | 722ea7605a5391a70ab97b85548180e1893fc555 /examples | |
| parent | a0ae452987a98dd957b2d62e7b2a07e7eefdcf5f (diff) | |
qspi msc flash seems to work
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/device/nrf52840/segger/nrf52840.emProject | 1 | ||||
| -rw-r--r-- | examples/device/nrf52840/src/main.c | 6 | ||||
| -rw-r--r-- | examples/device/nrf52840/src/msc_app.h | 12 | ||||
| -rw-r--r-- | examples/device/nrf52840/src/msc_flash_qspi.c | 123 | ||||
| -rw-r--r-- | examples/device/nrf52840/src/tusb_config.h | 12 |
5 files changed, 137 insertions, 17 deletions
diff --git a/examples/device/nrf52840/segger/nrf52840.emProject b/examples/device/nrf52840/segger/nrf52840.emProject index a54e7d093..e9fb8d5f5 100644 --- a/examples/device/nrf52840/segger/nrf52840.emProject +++ b/examples/device/nrf52840/segger/nrf52840.emProject @@ -60,6 +60,7 @@ <file file_name="../src/msc_app.c" /> <file file_name="../src/msc_app.h" /> <file file_name="../src/msc_flash_ram.c" /> + <file file_name="../src/msc_flash_qspi.c" /> </folder> <folder Name="hw"> <folder Name="bsp"> diff --git a/examples/device/nrf52840/src/main.c b/examples/device/nrf52840/src/main.c index 9a80accc9..58ac1ad21 100644 --- a/examples/device/nrf52840/src/main.c +++ b/examples/device/nrf52840/src/main.c @@ -84,6 +84,7 @@ int main(void) //--------------------------------------------------------------------+ void virtual_com_task(void) { +#if CFG_TUD_CDC // connected and there are data available if ( tud_mounted() && tud_cdc_available() ) { @@ -95,6 +96,7 @@ void virtual_com_task(void) tud_cdc_write(buf, count); tud_cdc_write_flush(); } +#endif } //--------------------------------------------------------------------+ @@ -102,6 +104,7 @@ void virtual_com_task(void) //--------------------------------------------------------------------+ void usb_hid_task(void) { +#if CFG_TUD_HID // Poll every 10ms static tu_timeout_t tm = { .start = 0, .interval = 10 }; @@ -141,8 +144,10 @@ void usb_hid_task(void) if ( btn & 0x04 ) tud_hid_mouse_move( 0 , -DELTA); // up if ( btn & 0x08 ) tud_hid_mouse_move( 0 , DELTA); // down } +#endif } +#if CFG_TUD_HID uint16_t tud_hid_generic_get_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen) { // TODO not Implemented @@ -153,6 +158,7 @@ void tud_hid_generic_set_report_cb(uint8_t report_id, hid_report_type_t report_t { // TODO not Implemented } +#endif //--------------------------------------------------------------------+ // tinyusb callbacks diff --git a/examples/device/nrf52840/src/msc_app.h b/examples/device/nrf52840/src/msc_app.h index 184ae6e48..38d0f4c99 100644 --- a/examples/device/nrf52840/src/msc_app.h +++ b/examples/device/nrf52840/src/msc_app.h @@ -50,23 +50,11 @@ extern "C" { #endif -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 - #ifdef __cplusplus } #endif diff --git a/examples/device/nrf52840/src/msc_flash_qspi.c b/examples/device/nrf52840/src/msc_flash_qspi.c new file mode 100644 index 000000000..3496d06bb --- /dev/null +++ b/examples/device/nrf52840/src/msc_flash_qspi.c @@ -0,0 +1,123 @@ +/**************************************************************************/ +/*! + @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 +//--------------------------------------------------------------------+ + +//------------- 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; + + flash_read(buffer, addr, bufsize); + + return bufsize; +} + +// 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),); + TU_ASSERT(NRFX_SUCCESS == nrfx_qspi_write(_fl_buf, FLASH_PAGE_SIZE, _fl_addr),); + + _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; + memset(_fl_buf, 0xff, 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 diff --git a/examples/device/nrf52840/src/tusb_config.h b/examples/device/nrf52840/src/tusb_config.h index 86bd9e9a0..775792382 100644 --- a/examples/device/nrf52840/src/tusb_config.h +++ b/examples/device/nrf52840/src/tusb_config.h @@ -39,6 +39,8 @@ #ifndef _TUSB_CONFIG_H_ #define _TUSB_CONFIG_H_ +#include "bsp/board.h" + #ifdef __cplusplus extern "C" { #endif @@ -79,12 +81,12 @@ // #define CFG_TUD_DESC_PID 0x0001 //------------- CLASS -------------// -#define CFG_TUD_CDC 1 +#define CFG_TUD_CDC 0 #define CFG_TUD_MSC 1 -#define CFG_TUD_HID 1 -#define CFG_TUD_HID_KEYBOARD 1 -#define CFG_TUD_HID_MOUSE 1 +#define CFG_TUD_HID 0 +#define CFG_TUD_HID_KEYBOARD 0 +#define CFG_TUD_HID_MOUSE 0 /* Use Boot Protocol for Keyboard, Mouse. Enable this will create separated HID interface * require more IN endpoints. If disabled, they they are all packed into a single @@ -112,7 +114,7 @@ #define CFG_TUD_MSC_BUFSIZE 512 // Number of Blocks -#define CFG_TUD_MSC_BLOCK_NUM 16 +#define CFG_TUD_MSC_BLOCK_NUM BOARD_MSC_FLASH_SIZE/CFG_TUD_MSC_BLOCK_SZ // Block size #define CFG_TUD_MSC_BLOCK_SZ 512 |
