From be2ff20e429bf3cb38c4c94927b0affc0c3ab782 Mon Sep 17 00:00:00 2001 From: hathach Date: Wed, 4 Jul 2018 17:15:49 +0700 Subject: enable usb cdc interface not handle anything yet. --- ports/nrf/Makefile | 14 +++- ports/nrf/usb/msc_flash.c | 163 ------------------------------------------ ports/nrf/usb/tusb_config.h | 2 +- ports/nrf/usb/usb_cdc.c | 53 ++++++++++++++ ports/nrf/usb/usb_msc_flash.c | 163 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 228 insertions(+), 167 deletions(-) delete mode 100644 ports/nrf/usb/msc_flash.c create mode 100644 ports/nrf/usb/usb_cdc.c create mode 100644 ports/nrf/usb/usb_msc_flash.c diff --git a/ports/nrf/Makefile b/ports/nrf/Makefile index a40cbd58e..1cc3d9e4a 100644 --- a/ports/nrf/Makefile +++ b/ports/nrf/Makefile @@ -116,8 +116,6 @@ SRC_C += \ boards/$(BOARD)/board.c \ nrfx/mdk/system_$(MCU_SUB_VARIANT).c \ device/$(MCU_VARIANT)/startup_$(MCU_SUB_VARIANT).c \ - usb/tusb_descriptors.c \ - usb/msc_flash.c \ lib/oofatfs/ff.c \ lib/oofatfs/option/ccsbcs.c \ lib/timeutils/timeutils.c \ @@ -127,6 +125,15 @@ SRC_C += \ lib/utils/pyexec.c \ lib/libc/string0.c \ lib/mp-readline/readline.c \ + internal_flash.c \ + + +ifeq ($(MCU_SUB_VARIANT),nrf52840) + +SRC_C += \ + usb/tusb_descriptors.c \ + usb/usb_msc_flash.c \ + usb/usb_cdc.c \ lib/tinyusb/src/portable/nordic/nrf5x/dcd_nrf5x.c \ lib/tinyusb/src/portable/nordic/nrf5x/hal_nrf5x.c \ lib/tinyusb/src/common/tusb_fifo.c \ @@ -135,7 +142,8 @@ SRC_C += \ lib/tinyusb/src/class/msc/msc_device.c \ lib/tinyusb/src/class/cdc/cdc_device.c \ lib/tinyusb/src/tusb.c \ - internal_flash.c \ + +endif DRIVERS_SRC_C += $(addprefix modules/,\ diff --git a/ports/nrf/usb/msc_flash.c b/ports/nrf/usb/msc_flash.c deleted file mode 100644 index 48600d052..000000000 --- a/ports/nrf/usb/msc_flash.c +++ /dev/null @@ -1,163 +0,0 @@ -/**************************************************************************/ -/*! - @file msc_flash.c - @author hathach (tinyusb.org) - - @section LICENSE - - Software License Agreement (BSD License) - - Copyright (c) 2018, Adafruit Industries (adafruit.com) - 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. -*/ -/**************************************************************************/ - -#ifdef NRF52840_XXAA - -#include "tusb.h" - -#if CFG_TUD_MSC - -/*------------------------------------------------------------------*/ -/* MACRO TYPEDEF CONSTANT ENUM - *------------------------------------------------------------------*/ -#define MSC_FLASH_ADDR_START 0xAD000 -#define MSC_FLASH_SIZE (256*1024) -#define MSC_FLASH_BLOCK_SIZE 512 - -/*------------------------------------------------------------------*/ -/* VARIABLES - *------------------------------------------------------------------*/ -static scsi_sense_fixed_data_t mscd_sense_data = -{ - .response_code = 0x70, - .sense_key = 0, // no errors - .additional_sense_len = sizeof(scsi_sense_fixed_data_t) - 8 -}; - -static scsi_mode_parameters_t const msc_dev_mode_para = -{ - .mode_data_length = 3, - .medium_type = 0, - .device_specific_para = 0, - .block_descriptor_length = 0 -}; - -/*------------------------------------------------------------------*/ -/* - *------------------------------------------------------------------*/ - -static inline uint32_t lba2addr(uint32_t lba) -{ - return MSC_FLASH_ADDR_START + lba*MSC_FLASH_BLOCK_SIZE; -} - -//--------------------------------------------------------------------+ -// tinyusb callbacks -//--------------------------------------------------------------------+ -int32_t tud_msc_scsi_cb (uint8_t rhport, 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* ptr = NULL; - uint16_t len = 0; - - // most scsi handled is input - bool in_xfer = true; - - switch (scsi_cmd[0]) - { - case SCSI_CMD_REQUEST_SENSE: - ptr = &mscd_sense_data; - len = sizeof(scsi_sense_fixed_data_t); - break; - - case SCSI_CMD_MODE_SENSE_6: - ptr = &msc_dev_mode_para; - len = sizeof(msc_dev_mode_para); - break; - - case SCSI_CMD_TEST_UNIT_READY: - ptr = NULL; - len = 0; - break; - - case SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL: - ptr = NULL; - len = 0; - break; - - default: - // negative is error -> Data stage is STALL, status = failed - return -1; - } - - // return len must not larger than bufsize - TU_ASSERT( bufsize >= len ); - - if ( ptr && len ) - { - if(in_xfer) - { - memcpy(buffer, ptr, len); - }else - { - // SCSI output - } - } - - //------------- clear sense data if it is not request sense command -------------// - if ( SCSI_CMD_REQUEST_SENSE != scsi_cmd[0] ) - { - mscd_sense_data.sense_key = SCSI_SENSEKEY_NONE; - mscd_sense_data.additional_sense_code = 0; - mscd_sense_data.additional_sense_qualifier = 0; - } - - return len; -} - -/*------------------------------------------------------------------*/ -/* Tinyusb Flash READ10 & WRITE10 - *------------------------------------------------------------------*/ -int32_t tud_msc_read10_cb (uint8_t rhport, uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize) -{ - (void) rhport; (void) lun; - - uint32_t addr = lba2addr(lba) + offset; - memcpy(buffer, (uint8_t*) addr, bufsize); - - return bufsize; -} - -int32_t tud_msc_write10_cb (uint8_t rhport, uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize) -{ - (void) rhport; (void) lun; - - return bufsize; -} - -#endif -#endif diff --git a/ports/nrf/usb/tusb_config.h b/ports/nrf/usb/tusb_config.h index f4f7dc04d..0875f91da 100644 --- a/ports/nrf/usb/tusb_config.h +++ b/ports/nrf/usb/tusb_config.h @@ -68,7 +68,7 @@ #define CFG_TUD_ENDOINT0_SIZE 64 //------------- CLASS -------------// -#define CFG_TUD_CDC 0 +#define CFG_TUD_CDC 1 #define CFG_TUD_MSC 1 #define CFG_TUD_HID_KEYBOARD 0 #define CFG_TUD_HID_MOUSE 0 diff --git a/ports/nrf/usb/usb_cdc.c b/ports/nrf/usb/usb_cdc.c new file mode 100644 index 000000000..1f4600d52 --- /dev/null +++ b/ports/nrf/usb/usb_cdc.c @@ -0,0 +1,53 @@ +/**************************************************************************/ +/*! + @file usb_cdc.c + @author hathach (tinyusb.org) + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2018, Adafruit Industries (adafruit.com) + 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. +*/ +/**************************************************************************/ + +#include "tusb.h" + +/*------------------------------------------------------------------*/ +/* MACRO TYPEDEF CONSTANT ENUM + *------------------------------------------------------------------*/ + +/*------------------------------------------------------------------*/ +/* VARIABLE DECLARATION + *------------------------------------------------------------------*/ + +/*------------------------------------------------------------------*/ +/* FUNCTION DECLARATION + *------------------------------------------------------------------*/ + +void tud_cdc_rx_cb(uint8_t port) +{ +} diff --git a/ports/nrf/usb/usb_msc_flash.c b/ports/nrf/usb/usb_msc_flash.c new file mode 100644 index 000000000..b9e0c8610 --- /dev/null +++ b/ports/nrf/usb/usb_msc_flash.c @@ -0,0 +1,163 @@ +/**************************************************************************/ +/*! + @file usb_msc_flash.c + @author hathach (tinyusb.org) + + @section LICENSE + + Software License Agreement (BSD License) + + Copyright (c) 2018, Adafruit Industries (adafruit.com) + 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. +*/ +/**************************************************************************/ + +#ifdef NRF52840_XXAA + +#include "tusb.h" + +#if CFG_TUD_MSC + +/*------------------------------------------------------------------*/ +/* MACRO TYPEDEF CONSTANT ENUM + *------------------------------------------------------------------*/ +#define MSC_FLASH_ADDR_START 0xAD000 +#define MSC_FLASH_SIZE (256*1024) +#define MSC_FLASH_BLOCK_SIZE 512 + +/*------------------------------------------------------------------*/ +/* VARIABLES + *------------------------------------------------------------------*/ +static scsi_sense_fixed_data_t mscd_sense_data = +{ + .response_code = 0x70, + .sense_key = 0, // no errors + .additional_sense_len = sizeof(scsi_sense_fixed_data_t) - 8 +}; + +static scsi_mode_parameters_t const msc_dev_mode_para = +{ + .mode_data_length = 3, + .medium_type = 0, + .device_specific_para = 0, + .block_descriptor_length = 0 +}; + +/*------------------------------------------------------------------*/ +/* + *------------------------------------------------------------------*/ + +static inline uint32_t lba2addr(uint32_t lba) +{ + return MSC_FLASH_ADDR_START + lba*MSC_FLASH_BLOCK_SIZE; +} + +//--------------------------------------------------------------------+ +// tinyusb callbacks +//--------------------------------------------------------------------+ +int32_t tud_msc_scsi_cb (uint8_t rhport, 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* ptr = NULL; + uint16_t len = 0; + + // most scsi handled is input + bool in_xfer = true; + + switch (scsi_cmd[0]) + { + case SCSI_CMD_REQUEST_SENSE: + ptr = &mscd_sense_data; + len = sizeof(scsi_sense_fixed_data_t); + break; + + case SCSI_CMD_MODE_SENSE_6: + ptr = &msc_dev_mode_para; + len = sizeof(msc_dev_mode_para); + break; + + case SCSI_CMD_TEST_UNIT_READY: + ptr = NULL; + len = 0; + break; + + case SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL: + ptr = NULL; + len = 0; + break; + + default: + // negative is error -> Data stage is STALL, status = failed + return -1; + } + + // return len must not larger than bufsize + TU_ASSERT( bufsize >= len ); + + if ( ptr && len ) + { + if(in_xfer) + { + memcpy(buffer, ptr, len); + }else + { + // SCSI output + } + } + + //------------- clear sense data if it is not request sense command -------------// + if ( SCSI_CMD_REQUEST_SENSE != scsi_cmd[0] ) + { + mscd_sense_data.sense_key = SCSI_SENSEKEY_NONE; + mscd_sense_data.additional_sense_code = 0; + mscd_sense_data.additional_sense_qualifier = 0; + } + + return len; +} + +/*------------------------------------------------------------------*/ +/* Tinyusb Flash READ10 & WRITE10 + *------------------------------------------------------------------*/ +int32_t tud_msc_read10_cb (uint8_t rhport, uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize) +{ + (void) rhport; (void) lun; + + uint32_t addr = lba2addr(lba) + offset; + memcpy(buffer, (uint8_t*) addr, bufsize); + + return bufsize; +} + +int32_t tud_msc_write10_cb (uint8_t rhport, uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize) +{ + (void) rhport; (void) lun; + + return bufsize; +} + +#endif +#endif -- cgit v1.2.3