From a993cb55e5be9b0baf62afe460783317f726fd2f Mon Sep 17 00:00:00 2001 From: hathach Date: Tue, 23 Oct 2018 11:40:59 +0700 Subject: clean up --- .../segger/nrf5x_freertos.emProject | 6 +- examples/device/nrf52840_freertos/src/msc_app.c | 115 +++++++++++++++ examples/device/nrf52840_freertos/src/msc_app.h | 64 ++++++++ .../device/nrf52840_freertos/src/msc_device_app.c | 124 ---------------- .../device/nrf52840_freertos/src/msc_device_app.h | 93 ------------ .../device/nrf52840_freertos/src/msc_flash_qspi.c | 162 +++++++++++++++++++++ 6 files changed, 344 insertions(+), 220 deletions(-) create mode 100644 examples/device/nrf52840_freertos/src/msc_app.c create mode 100644 examples/device/nrf52840_freertos/src/msc_app.h delete mode 100644 examples/device/nrf52840_freertos/src/msc_device_app.c delete mode 100644 examples/device/nrf52840_freertos/src/msc_device_app.h create mode 100644 examples/device/nrf52840_freertos/src/msc_flash_qspi.c 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_app.c b/examples/device/nrf52840_freertos/src/msc_app.c new file mode 100644 index 000000000..52cf58f78 --- /dev/null +++ b/examples/device/nrf52840_freertos/src/msc_app.c @@ -0,0 +1,115 @@ +/**************************************************************************/ +/*! + @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_app.h" + +#if CFG_TUD_MSC + +//--------------------------------------------------------------------+ +// MACRO CONSTANT TYPEDEF +//--------------------------------------------------------------------+ + +//--------------------------------------------------------------------+ +// tinyusb callbacks +//--------------------------------------------------------------------+ + +// Callback invoked when received an SCSI command not in built-in list below +// - READ_CAPACITY10, READ_FORMAT_CAPACITY, INQUIRY, MODE_SENSE6, REQUEST_SENSE +// - READ10 and WRITE10 has their own callbacks +int32_t tud_msc_scsi_cb (uint8_t lun, uint8_t const scsi_cmd[16], void* buffer, uint16_t bufsize) +{ + // read10 & write10 has their own callback and MUST not be handled here + + void const* response = NULL; + uint16_t resplen = 0; + + // most scsi handled is input + bool in_xfer = true; + + switch (scsi_cmd[0]) + { + case SCSI_CMD_TEST_UNIT_READY: + // Command that host uses to check our readiness before sending other commands + resplen = 0; + break; + + case SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL: + // Host is about to read/write etc ... better not to disconnect disk + resplen = 0; + break; + + case SCSI_CMD_START_STOP_UNIT: + // Host try to eject/safe remove/poweroff us. We could safely disconnect with disk storage, or go into lower power + /* scsi_start_stop_unit_t const * start_stop = (scsi_start_stop_unit_t const *) scsi_cmd; + // Start bit = 0 : low power mode, if load_eject = 1 : unmount disk storage as well + // Start bit = 1 : Ready mode, if load_eject = 1 : mount disk storage + start_stop->start; + start_stop->load_eject; + */ + resplen = 0; + break; + + + default: + // Set Sense = Invalid Command Operation + tud_msc_set_sense(lun, SCSI_SENSE_ILLEGAL_REQUEST, 0x20, 0x00); + + // negative means error -> tinyusb could stall and/or response with failed status + resplen = -1; + break; + } + + // return resplen must not larger than bufsize + if ( resplen > bufsize ) resplen = bufsize; + + if ( response && (resplen > 0) ) + { + if(in_xfer) + { + memcpy(buffer, response, resplen); + }else + { + // SCSI output + } + } + + return resplen; +} + + +#endif 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.c b/examples/device/nrf52840_freertos/src/msc_device_app.c deleted file mode 100644 index 9f5015042..000000000 --- a/examples/device/nrf52840_freertos/src/msc_device_app.c +++ /dev/null @@ -1,124 +0,0 @@ -/**************************************************************************/ -/*! - @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. -*/ -/**************************************************************************/ - -#include "msc_device_app.h" - -#if CFG_TUD_MSC - -//--------------------------------------------------------------------+ -// MACRO CONSTANT TYPEDEF -//--------------------------------------------------------------------+ - -//--------------------------------------------------------------------+ -// 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 -// - READ10 and WRITE10 has their own callbacks -int32_t tud_msc_scsi_cb (uint8_t lun, uint8_t const scsi_cmd[16], void* buffer, uint16_t bufsize) -{ - // read10 & write10 has their own callback and MUST not be handled here - - void const* response = NULL; - uint16_t resplen = 0; - - // most scsi handled is input - bool in_xfer = true; - - switch (scsi_cmd[0]) - { - case SCSI_CMD_TEST_UNIT_READY: - // Command that host uses to check our readiness before sending other commands - resplen = 0; - break; - - case SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL: - // Host is about to read/write etc ... better not to disconnect disk - resplen = 0; - break; - - case SCSI_CMD_START_STOP_UNIT: - // Host try to eject/safe remove/poweroff us. We could safely disconnect with disk storage, or go into lower power - /* scsi_start_stop_unit_t const * start_stop = (scsi_start_stop_unit_t const *) scsi_cmd; - // Start bit = 0 : low power mode, if load_eject = 1 : unmount disk storage as well - // Start bit = 1 : Ready mode, if load_eject = 1 : mount disk storage - start_stop->start; - start_stop->load_eject; - */ - resplen = 0; - break; - - - default: - // Set Sense = Invalid Command Operation - tud_msc_set_sense(lun, SCSI_SENSE_ILLEGAL_REQUEST, 0x20, 0x00); - - // negative means error -> tinyusb could stall and/or response with failed status - resplen = -1; - break; - } - - // return resplen must not larger than bufsize - if ( resplen > bufsize ) resplen = bufsize; - - if ( response && (resplen > 0) ) - { - if(in_xfer) - { - memcpy(buffer, response, resplen); - }else - { - // SCSI output - } - } - - return resplen; -} - - -#endif 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 -- cgit v1.3.1