From d3da69eb07fc60a30217e8f75feca17549ce650d Mon Sep 17 00:00:00 2001 From: Robert Fisk Date: Fri, 17 Jul 2015 03:12:04 +1200 Subject: [PATCH] Draft implementation of downstream SPI interface. Significant mods required to USB MSC class, mainly in usbd_msc_scsi.c. Currently untested! --- Upstream/.cproject | 4 +- Upstream/.settings/language.settings.xml | 4 +- Upstream/Debug/Upstream.elf | Bin 764364 -> 790837 bytes Upstream/Debug/Upstream.hex | 1451 ++++---- Upstream/Debug/Upstream.map | 3194 +++++++++-------- .../STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h | 2 +- .../Inc/stm32f4xx_hal_pcd.h | 2 + .../STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c | 2 +- .../Src/stm32f4xx_hal_dma.c | 1 + .../Src/stm32f4xx_hal_pcd.c | 8 +- .../Src/stm32f4xx_hal_spi.c | 1 + Upstream/Inc/board_config.h | 13 +- Upstream/Inc/downstream_interface_def.h | 39 + Upstream/Inc/downstream_interface_msc.h | 38 + Upstream/Inc/downstream_spi.h | 89 + Upstream/Inc/{hal_conf.h => hal_config.h} | 2 +- Upstream/Inc/interrupts.h | 5 +- Upstream/Inc/stm32f4xx_hal_conf.h | 401 --- Upstream/Inc/stm32f4xx_it.h | 58 - Upstream/Inc/usb_device.h | 2 +- Upstream/Inc/{usbd_conf.h => usbd_config.h} | 0 .../Inc/{usbd_desc.h => usbd_descriptors.h} | 1 + Upstream/Inc/usbd_storage_if.h | 101 - .../Class/MSC/Inc/usbd_msc.h | 37 +- .../Class/MSC/Inc/usbd_msc_bot.h | 6 +- .../Class/MSC/Inc/usbd_msc_data.h | 2 +- .../Class/MSC/Inc/usbd_msc_scsi.h | 19 +- .../Class/MSC/Src/usbd_msc.c | 43 +- .../Class/MSC/Src/usbd_msc_bot.c | 121 +- .../Class/MSC/Src/usbd_msc_scsi.c | 1028 +++--- .../Core/Inc/usbd_core.h | 31 +- .../Core/Inc/usbd_def.h | 6 +- .../Core/Src/usbd_core.c | 34 +- Upstream/Src/downstream_interface_msc.c | 228 ++ Upstream/Src/downstream_spi.c | 429 +++ Upstream/Src/hal_msp.c | 131 +- Upstream/Src/interrupts.c | 48 +- Upstream/Src/main.c | 49 +- Upstream/Src/usb_device.c | 7 +- Upstream/Src/{usbd_conf.c => usbd_config.c} | 29 +- .../Src/{usbd_desc.c => usbd_descriptors.c} | 61 +- Upstream/Src/usbd_storage_if.c | 251 -- 42 files changed, 4193 insertions(+), 3785 deletions(-) create mode 100644 Upstream/Inc/downstream_interface_def.h create mode 100644 Upstream/Inc/downstream_interface_msc.h create mode 100644 Upstream/Inc/downstream_spi.h rename Upstream/Inc/{hal_conf.h => hal_config.h} (97%) delete mode 100755 Upstream/Inc/stm32f4xx_hal_conf.h delete mode 100755 Upstream/Inc/stm32f4xx_it.h rename Upstream/Inc/{usbd_conf.h => usbd_config.h} (100%) rename Upstream/Inc/{usbd_desc.h => usbd_descriptors.h} (95%) delete mode 100755 Upstream/Inc/usbd_storage_if.h create mode 100644 Upstream/Src/downstream_interface_msc.c create mode 100644 Upstream/Src/downstream_spi.c rename Upstream/Src/{usbd_conf.c => usbd_config.c} (92%) rename Upstream/Src/{usbd_desc.c => usbd_descriptors.c} (88%) delete mode 100755 Upstream/Src/usbd_storage_if.c diff --git a/Upstream/.cproject b/Upstream/.cproject index 1a89563..b1c7159 100755 --- a/Upstream/.cproject +++ b/Upstream/.cproject @@ -108,7 +108,7 @@ - + @@ -227,7 +227,7 @@ - + diff --git a/Upstream/.settings/language.settings.xml b/Upstream/.settings/language.settings.xml index ff49345..e0f7243 100755 --- a/Upstream/.settings/language.settings.xml +++ b/Upstream/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/Upstream/Debug/Upstream.elf b/Upstream/Debug/Upstream.elf index 122626a57231460aaa75b05f0a70b63dd6542492..ef7516769e1d9cf531f18ebc0e5e220143cda7dc 100755 GIT binary patch delta 255997 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⩔(P;$c=Cw557uF+Oxq-JU+O_yJ&8@? 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 QcHI?+5Z`LY1Nxl*2M&j7F#rGn delta 216601 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%0DbEoCg*x134?c&G4D2q+fYLF5eFwpI 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

x!2P-|0;2q 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 +#include /** @addtogroup STM32F4xx_HAL_Driver * @{ diff --git a/Upstream/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd.h b/Upstream/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd.h index 61cc641..9f7a2ce 100755 --- a/Upstream/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd.h +++ b/Upstream/Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pcd.h @@ -233,6 +233,8 @@ void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum); void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd); void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd); +void HAL_PCD_BufferFreedCallBack(PCD_HandleTypeDef *hpcd); + /** * @} */ diff --git a/Upstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c b/Upstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c index 9856c35..3051d7c 100755 --- a/Upstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c +++ b/Upstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c @@ -266,7 +266,7 @@ __weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); /*Configure the SysTick IRQ priority */ - //*** Leave Systick interrupt at lowest priority + //*** HAL_MspInit() will set our desired priority //HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority ,0); /* Return function status */ diff --git a/Upstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c b/Upstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c index 66657b1..a965390 100755 --- a/Upstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c +++ b/Upstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c @@ -259,6 +259,7 @@ HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma) /* Initialize the DMA state */ hdma->State = HAL_DMA_STATE_READY; + __HAL_UNLOCK(hdma); return HAL_OK; } diff --git a/Upstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c b/Upstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c index 8dec3a2..2e4e2ac 100755 --- a/Upstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c +++ b/Upstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c @@ -191,6 +191,7 @@ HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd) USB_DevInit(hpcd->Instance, hpcd->Init); hpcd->State= HAL_PCD_STATE_READY; + __HAL_UNLOCK(hpcd); USB_DevDisconnect (hpcd->Instance); return HAL_OK; @@ -1128,7 +1129,7 @@ static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t len32b = (len + 3) / 4; - while ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) > len32b && + while ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) > len32b && /* SHOULD THIS BE ">=" ??????? */ ep->xfer_count < ep->xfer_len && ep->xfer_len != 0) { @@ -1147,11 +1148,12 @@ static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t ep->xfer_count += len; } - if(len <= 0) - { + if(len <= 0) //SHOULD THIS BE "if (ep->xfer_count >= ep->xfer_len)" ??????? + { //or just move USB_WritePacket up below the while check??????? fifoemptymsk = 0x1 << epnum; USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk; + HAL_PCD_BufferFreedCallBack(hpcd); } return HAL_OK; diff --git a/Upstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c b/Upstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c index 4397ab1..b9ef84d 100755 --- a/Upstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c +++ b/Upstream/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c @@ -222,6 +222,7 @@ HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi) hspi->ErrorCode = HAL_SPI_ERROR_NONE; hspi->State = HAL_SPI_STATE_READY; + __HAL_UNLOCK(hspi); return HAL_OK; } diff --git a/Upstream/Inc/board_config.h b/Upstream/Inc/board_config.h index e4c8111..2484c5a 100644 --- a/Upstream/Inc/board_config.h +++ b/Upstream/Inc/board_config.h @@ -9,6 +9,8 @@ #define INC_BOARD_CONFIG_H_ +#define BSRR_SHIFT_HIGH 0 +#define BSRR_SHIFT_LOW 16 #define PA_JTMS GPIO_PIN_13 #define PA_JTCK GPIO_PIN_14 @@ -21,10 +23,17 @@ #define STAT_LED_PIN GPIO_PIN_12 #define STAT_LED_PORT GPIOC -#define STAT_LED_BSRR_OFF (STAT_LED_PIN) -#define STAT_LED_BSRR_ON (STAT_LED_PIN << 16) +#define STAT_LED_ON STAT_LED_PORT->BSRR = (STAT_LED_PIN << BSRR_SHIFT_LOW) //Stat LED is active-low +#define STAT_LED_OFF STAT_LED_PORT->BSRR = (STAT_LED_PIN << BSRR_SHIFT_HIGH) +#define SPI1_NSS_PIN GPIO_PIN_4 +#define SPI1_NSS_PORT GPIOA +#define SPI1_NSS_ASSERT SPI1_NSS_PORT->BSRR = (SPI1_NSS_PIN << BSRR_SHIFT_LOW) +#define SPI1_NSS_DEASSERT SPI1_NSS_PORT->BSRR = (SPI1_NSS_PIN << BSRR_SHIFT_HIGH) +#define DOWNSTREAM_TX_OK_PIN GPIO_PIN_3 +#define DOWNSTREAM_TX_OK_PORT GPIOA +#define DOWNSTREAM_TX_OK_ACTIVE (!(DOWNSTREAM_TX_OK_PORT->IDR & DOWNSTREAM_TX_OK_PIN)) #endif /* INC_BOARD_CONFIG_H_ */ diff --git a/Upstream/Inc/downstream_interface_def.h b/Upstream/Inc/downstream_interface_def.h new file mode 100644 index 0000000..28bb61d --- /dev/null +++ b/Upstream/Inc/downstream_interface_def.h @@ -0,0 +1,39 @@ +/* + * interface_def.h + * + * Created on: 22/06/2015 + * Author: Robert Fisk + */ + +#ifndef INC_DOWNSTREAM_INTERFACE_DEF_H_ +#define INC_DOWNSTREAM_INTERFACE_DEF_H_ + + +//Upstream only supports one LUN. +//Downstream may support > 1 LUN and only report the first active one to upstream. +#define UPSTREAM_LUN_NBR 1 +#define COMMAND_CLASS_DATA_FLAG 0x80 +#define COMMAND_CLASS_MASK ((uint8_t)(~COMMAND_CLASS_DATA_FLAG)) + + +typedef enum +{ + COMMAND_CLASS_INTERFACE = 0, + COMMAND_CLASS_MASS_STORAGE = 1, + COMMAND_CLASS_MAX = 2, +} +InterfaceCommandClassTypeDef; + + +typedef enum +{ + COMMAND_MSC_TEST_UNIT_READY = 0, //Returns HAL_StatusTypeDef result + COMMAND_MSC_GET_CAPACITY = 2, //Returns uint32_t blk_nbr, uint32_t blk_size + COMMAND_MSC_BEGIN_READ = 3, //Returns HAL_StatusTypeDef result, then data stream + COMMAND_MSC_BEGIN_WRITE = 4, //Returns HAL_OK, HAL_ERROR if medium not present, HAL_BUSY if write-protected result, then waits for data stream + COMMAND_MSC_MAX = 5, +} +InterfaceCommandMscTypeDef; + + +#endif /* INC_DOWNSTREAM_INTERFACE_DEF_H_ */ diff --git a/Upstream/Inc/downstream_interface_msc.h b/Upstream/Inc/downstream_interface_msc.h new file mode 100644 index 0000000..1bcafd2 --- /dev/null +++ b/Upstream/Inc/downstream_interface_msc.h @@ -0,0 +1,38 @@ +/* + * downstream_interface_msc.h + * + * Created on: 4/07/2015 + * Author: Robert Fisk + */ + +#ifndef INC_DOWNSTREAM_INTERFACE_MSC_H_ +#define INC_DOWNSTREAM_INTERFACE_MSC_H_ + + +#include "downstream_spi.h" + + +typedef void (*DownstreamInterfaceMSCCallbackTypeDef)(HAL_StatusTypeDef result); +typedef void (*DownstreamInterfaceMSCCallbackPacketTypeDef)(HAL_StatusTypeDef result, + DownstreamPacketTypeDef* downstreamPacket); +typedef void (*DownstreamInterfaceMSCCallbackUintPacketTypeDef)(HAL_StatusTypeDef result, + uint32_t result_uint[], + DownstreamPacketTypeDef* downstreamPacket); + + +HAL_StatusTypeDef DownstreamInterface_TestReady(DownstreamInterfaceMSCCallbackTypeDef callback); +HAL_StatusTypeDef DownstreamInterface_GetCapacity(DownstreamInterfaceMSCCallbackUintPacketTypeDef callback); +HAL_StatusTypeDef DownstreamInterface_BeginRead(DownstreamInterfaceMSCCallbackTypeDef callback, + uint64_t readBlockStart, + uint32_t readBlockCount, + uint32_t readByteCount); +HAL_StatusTypeDef DownstreamInterface_GetStreamDataPacket(DownstreamInterfaceMSCCallbackPacketTypeDef callback); +HAL_StatusTypeDef DownstreamInterface_BeginWrite(DownstreamInterfaceMSCCallbackTypeDef callback, + uint64_t readBlockStart, + uint32_t readBlockCount); +HAL_StatusTypeDef DownstreamInterface_PutStreamDataPacket(DownstreamPacketTypeDef* packetToSend, + uint32_t dataLength); + + + +#endif /* INC_DOWNSTREAM_INTERFACE_MSC_H_ */ diff --git a/Upstream/Inc/downstream_spi.h b/Upstream/Inc/downstream_spi.h new file mode 100644 index 0000000..af664f3 --- /dev/null +++ b/Upstream/Inc/downstream_spi.h @@ -0,0 +1,89 @@ +/* + * downstream_spi.h + * + * Created on: 21/06/2015 + * Author: Robert Fisk + */ + +#ifndef INC_DOWNSTREAM_SPI_H_ +#define INC_DOWNSTREAM_SPI_H_ + + +#include "usbd_def.h" + + +#define DOWNSTREAM_PACKET_HEADER_LEN (2) //Min length = CommandClass & Command bytes +#define DOWNSTREAM_PACKET_LEN (DOWNSTREAM_PACKET_HEADER_LEN + USB_HS_MAX_PACKET_SIZE) +#define DOWNSTREAM_PACKET_LEN_MIN (DOWNSTREAM_PACKET_HEADER_LEN) + + +#define SPI_INTERFACE_FREAKOUT_VOID \ + do { \ + while (1); \ + /*DownstreamInterfaceState = INTERFACE_STATE_ERROR;*/ \ + /*return;*/ \ +} while (0); + +#define SPI_INTERFACE_FREAKOUT_HAL_ERROR \ + do { \ + while (1); \ + /*DownstreamInterfaceState = INTERFACE_STATE_ERROR;*/ \ + /*return HAL_ERROR;*/ \ +} while (0); + + + +typedef enum +{ + INTERFACE_STATE_RESET = 0, + INTERFACE_STATE_WAITING_CLIENT = 1, + INTERFACE_STATE_IDLE = 2, + INTERFACE_STATE_TX_SIZE_WAIT = 3, + INTERFACE_STATE_TX_SIZE = 4, + INTERFACE_STATE_TX_PACKET_WAIT = 5, + INTERFACE_STATE_TX_PACKET = 6, + INTERFACE_STATE_RX_SIZE_WAIT = 7, + INTERFACE_STATE_RX_SIZE = 8, + INTERFACE_STATE_RX_PACKET_WAIT = 9, + INTERFACE_STATE_RX_PACKET = 10, + INTERFACE_STATE_ERROR = 11 +} InterfaceStateTypeDef; + + +typedef enum +{ + NOT_BUSY = 0, + BUSY = 1 +} PacketBusyTypeDef; + + +typedef struct +{ + PacketBusyTypeDef Busy; //Everything after Busy should be word-aligned + uint16_t Length __ALIGN_END; //Packet length includes CommandClass, Command, and Data + uint8_t CommandClass; + uint8_t Command; + uint8_t Data[USB_HS_MAX_PACKET_SIZE]; //Should (must?) be word-aligned, for USB copy routine + uint8_t RxCrc; +} +DownstreamPacketTypeDef; + + + +typedef void (*FreePacketCallbackTypeDef)(DownstreamPacketTypeDef* freePacket); +typedef void (*SpiPacketReceivedCallbackTypeDef)(DownstreamPacketTypeDef* replyPacket); + + +void Downstream_InitInterface(void); +HAL_StatusTypeDef Downstream_GetFreePacket(FreePacketCallbackTypeDef callback); +DownstreamPacketTypeDef* Downstream_GetFreePacketImmediately(void); +void Downstream_ReleasePacket(DownstreamPacketTypeDef* packetToRelease); +HAL_StatusTypeDef Downstream_SendPacket(DownstreamPacketTypeDef* packetToWrite); +HAL_StatusTypeDef Downstream_GetPacket(SpiPacketReceivedCallbackTypeDef callback); +void Downstream_TxOkInterrupt(void); +void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi); +void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi); +void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi); + + +#endif /* INC_DOWNSTREAM_SPI_H_ */ diff --git a/Upstream/Inc/hal_conf.h b/Upstream/Inc/hal_config.h similarity index 97% rename from Upstream/Inc/hal_conf.h rename to Upstream/Inc/hal_config.h index 0b1b803..d87080a 100755 --- a/Upstream/Inc/hal_conf.h +++ b/Upstream/Inc/hal_config.h @@ -50,7 +50,7 @@ #define HAL_MODULE_ENABLED //#define HAL_ADC_MODULE_ENABLED //#define HAL_CAN_MODULE_ENABLED -#define HAL_CRC_MODULE_ENABLED +//#define HAL_CRC_MODULE_ENABLED //#define HAL_CRYP_MODULE_ENABLED //#define HAL_DAC_MODULE_ENABLED //#define HAL_DCMI_MODULE_ENABLED diff --git a/Upstream/Inc/interrupts.h b/Upstream/Inc/interrupts.h index 8d55dc4..a937955 100755 --- a/Upstream/Inc/interrupts.h +++ b/Upstream/Inc/interrupts.h @@ -47,8 +47,11 @@ /* The preemption priority for the IRQn channel. * This parameter can be a value between 0 and 15 * A lower priority value indicates a higher priority. */ + #define INT_PRIORITY_SYSTICK 2 -#define INT_PRIORITY_OTG_FS 10 +#define INT_PRIORITY_SPI_DMA 10 //SPI interacts heavily with USB_OTG, +#define INT_PRIORITY_OTG_FS 10 //so set them at the same priority. + /* Exported macro ------------------------------------------------------------*/ /* Exported functions ------------------------------------------------------- */ diff --git a/Upstream/Inc/stm32f4xx_hal_conf.h b/Upstream/Inc/stm32f4xx_hal_conf.h deleted file mode 100755 index 0b1b803..0000000 --- a/Upstream/Inc/stm32f4xx_hal_conf.h +++ /dev/null @@ -1,401 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_hal_conf.h - * @brief HAL configuration file. - ****************************************************************************** - * @attention - * - *

© COPYRIGHT(c) 2015 STMicroelectronics

- * - * 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 STMicroelectronics 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 AND CONTRIBUTORS "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 OR CONTRIBUTORS 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_HAL_CONF_H -#define __STM32F4xx_HAL_CONF_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ -/** - * @brief This is the list of modules to be used in the HAL driver - */ -#define HAL_MODULE_ENABLED -//#define HAL_ADC_MODULE_ENABLED -//#define HAL_CAN_MODULE_ENABLED -#define HAL_CRC_MODULE_ENABLED -//#define HAL_CRYP_MODULE_ENABLED -//#define HAL_DAC_MODULE_ENABLED -//#define HAL_DCMI_MODULE_ENABLED -//#define HAL_DMA2D_MODULE_ENABLED -//#define HAL_ETH_MODULE_ENABLED -//#define HAL_NAND_MODULE_ENABLED -//#define HAL_NOR_MODULE_ENABLED -//#define HAL_PCCARD_MODULE_ENABLED -//#define HAL_SRAM_MODULE_ENABLED -//#define HAL_SDRAM_MODULE_ENABLED -//#define HAL_HASH_MODULE_ENABLED -//#define HAL_I2C_MODULE_ENABLED -//#define HAL_I2S_MODULE_ENABLED -//#define HAL_IWDG_MODULE_ENABLED -//#define HAL_LTDC_MODULE_ENABLED -//#define HAL_RNG_MODULE_ENABLED -//#define HAL_RTC_MODULE_ENABLED -//#define HAL_SAI_MODULE_ENABLED -//#define HAL_SD_MODULE_ENABLED -#define HAL_SPI_MODULE_ENABLED -//#define HAL_TIM_MODULE_ENABLED -//#define HAL_UART_MODULE_ENABLED -//#define HAL_USART_MODULE_ENABLED -//#define HAL_IRDA_MODULE_ENABLED -//#define HAL_SMARTCARD_MODULE_ENABLED -//#define HAL_WWDG_MODULE_ENABLED -#define HAL_PCD_MODULE_ENABLED -//#define HAL_HCD_MODULE_ENABLED -#define HAL_GPIO_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED -#define HAL_FLASH_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED - -/* ########################## HSE/HSI Values adaptation ##################### */ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT ((uint32_t)500) /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#if !defined (LSI_VALUE) - #define LSI_VALUE ((uint32_t)32000) -#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature. */ -/** - * @brief External Low Speed oscillator (LSE) value. - */ -#if !defined (LSE_VALUE) - #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ - -/** - * @brief External clock source for I2S peripheral - * This value is used by the I2S HAL module to compute the I2S clock source - * frequency, this source is inserted directly through I2S_CKIN pad. - */ -#if !defined (EXTERNAL_CLOCK_VALUE) - #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000) /*!< Value of the External audio frequency in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ - -/* Tip: To avoid modifying this file each time you need to use different HSE, - === you can define the HSE value in your toolchain compiler preprocessor. */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ - -#define VDD_VALUE ((uint32_t)3300) /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY ((uint32_t)0) /*!< tick interrupt priority */ -#define USE_RTOS 0 -#define PREFETCH_ENABLE 1 -#define INSTRUCTION_CACHE_ENABLE 1 -#define DATA_CACHE_ENABLE 1 - -/* ########################## Assert Selection ############################## */ -/** - * @brief Uncomment the line below to expanse the "assert_param" macro in the - * HAL drivers code - */ -/* #define USE_FULL_ASSERT 1 */ - -/* ################## Ethernet peripheral configuration ##################### */ - -/* Section 1 : Ethernet peripheral configuration */ - -/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ -#define MAC_ADDR0 2 -#define MAC_ADDR1 0 -#define MAC_ADDR2 0 -#define MAC_ADDR3 0 -#define MAC_ADDR4 0 -#define MAC_ADDR5 0 - -/* Definition of the Ethernet driver buffers size and count */ -#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ -#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ -#define ETH_RXBUFNB ((uint32_t)4) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ -#define ETH_TXBUFNB ((uint32_t)4) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ - -/* Section 2: PHY configuration section */ - -/* DP83848 PHY Address*/ -#define DP83848_PHY_ADDRESS 0x01 -/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ -#define PHY_RESET_DELAY ((uint32_t)0x000000FF) -/* PHY Configuration delay */ -#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFF) - -#define PHY_READ_TO ((uint32_t)0x0000FFFF) -#define PHY_WRITE_TO ((uint32_t)0x0000FFFF) - -/* Section 3: Common PHY Registers */ - -#define PHY_BCR ((uint16_t)0x00) /*!< Transceiver Basic Control Register */ -#define PHY_BSR ((uint16_t)0x01) /*!< Transceiver Basic Status Register */ - -#define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */ -#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< Select loop-back mode */ -#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ -#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ -#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ -#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ -#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< Enable auto-negotiation function */ -#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< Restart auto-negotiation function */ -#define PHY_POWERDOWN ((uint16_t)0x0800) /*!< Select the power down mode */ -#define PHY_ISOLATE ((uint16_t)0x0400) /*!< Isolate PHY from MII */ - -#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process completed */ -#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< Valid link established */ -#define PHY_JABBER_DETECTION ((uint16_t)0x0002) /*!< Jabber condition detected */ - -/* Section 4: Extended PHY Registers */ - -#define PHY_SR ((uint16_t)0x10) /*!< PHY status register Offset */ -#define PHY_MICR ((uint16_t)0x11) /*!< MII Interrupt Control Register */ -#define PHY_MISR ((uint16_t)0x12) /*!< MII Interrupt Status and Misc. Control Register */ - -#define PHY_LINK_STATUS ((uint16_t)0x0001) /*!< PHY Link mask */ -#define PHY_SPEED_STATUS ((uint16_t)0x0002) /*!< PHY Speed mask */ -#define PHY_DUPLEX_STATUS ((uint16_t)0x0004) /*!< PHY Duplex mask */ - -#define PHY_MICR_INT_EN ((uint16_t)0x0002) /*!< PHY Enable interrupts */ -#define PHY_MICR_INT_OE ((uint16_t)0x0001) /*!< PHY Enable output interrupt events */ - -#define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020) /*!< Enable Interrupt on change of link status */ -#define PHY_LINK_INTERRUPT ((uint16_t)0x2000) /*!< PHY link status interrupt mask */ - -/* Includes ------------------------------------------------------------------*/ -/** - * @brief Include module's header file - */ - -#ifdef HAL_RCC_MODULE_ENABLED - #include "stm32f4xx_hal_rcc.h" -#endif /* HAL_RCC_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED - #include "stm32f4xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED - #include "stm32f4xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_CORTEX_MODULE_ENABLED - #include "stm32f4xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED - #include "stm32f4xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_CAN_MODULE_ENABLED - #include "stm32f4xx_hal_can.h" -#endif /* HAL_CAN_MODULE_ENABLED */ - -#ifdef HAL_CRC_MODULE_ENABLED - #include "stm32f4xx_hal_crc.h" -#endif /* HAL_CRC_MODULE_ENABLED */ - -#ifdef HAL_CRYP_MODULE_ENABLED - #include "stm32f4xx_hal_cryp.h" -#endif /* HAL_CRYP_MODULE_ENABLED */ - -#ifdef HAL_DMA2D_MODULE_ENABLED - #include "stm32f4xx_hal_dma2d.h" -#endif /* HAL_DMA2D_MODULE_ENABLED */ - -#ifdef HAL_DAC_MODULE_ENABLED - #include "stm32f4xx_hal_dac.h" -#endif /* HAL_DAC_MODULE_ENABLED */ - -#ifdef HAL_DCMI_MODULE_ENABLED - #include "stm32f4xx_hal_dcmi.h" -#endif /* HAL_DCMI_MODULE_ENABLED */ - -#ifdef HAL_ETH_MODULE_ENABLED - #include "stm32f4xx_hal_eth.h" -#endif /* HAL_ETH_MODULE_ENABLED */ - -#ifdef HAL_FLASH_MODULE_ENABLED - #include "stm32f4xx_hal_flash.h" -#endif /* HAL_FLASH_MODULE_ENABLED */ - -#ifdef HAL_SRAM_MODULE_ENABLED - #include "stm32f4xx_hal_sram.h" -#endif /* HAL_SRAM_MODULE_ENABLED */ - -#ifdef HAL_NOR_MODULE_ENABLED - #include "stm32f4xx_hal_nor.h" -#endif /* HAL_NOR_MODULE_ENABLED */ - -#ifdef HAL_NAND_MODULE_ENABLED - #include "stm32f4xx_hal_nand.h" -#endif /* HAL_NAND_MODULE_ENABLED */ - -#ifdef HAL_PCCARD_MODULE_ENABLED - #include "stm32f4xx_hal_pccard.h" -#endif /* HAL_PCCARD_MODULE_ENABLED */ - -#ifdef HAL_SDRAM_MODULE_ENABLED - #include "stm32f4xx_hal_sdram.h" -#endif /* HAL_SDRAM_MODULE_ENABLED */ - -#ifdef HAL_HASH_MODULE_ENABLED - #include "stm32f4xx_hal_hash.h" -#endif /* HAL_HASH_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED - #include "stm32f4xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_I2S_MODULE_ENABLED - #include "stm32f4xx_hal_i2s.h" -#endif /* HAL_I2S_MODULE_ENABLED */ - -#ifdef HAL_IWDG_MODULE_ENABLED - #include "stm32f4xx_hal_iwdg.h" -#endif /* HAL_IWDG_MODULE_ENABLED */ - -#ifdef HAL_LTDC_MODULE_ENABLED - #include "stm32f4xx_hal_ltdc.h" -#endif /* HAL_LTDC_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED - #include "stm32f4xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_RNG_MODULE_ENABLED - #include "stm32f4xx_hal_rng.h" -#endif /* HAL_RNG_MODULE_ENABLED */ - -#ifdef HAL_RTC_MODULE_ENABLED - #include "stm32f4xx_hal_rtc.h" -#endif /* HAL_RTC_MODULE_ENABLED */ - -#ifdef HAL_SAI_MODULE_ENABLED - #include "stm32f4xx_hal_sai.h" -#endif /* HAL_SAI_MODULE_ENABLED */ - -#ifdef HAL_SD_MODULE_ENABLED - #include "stm32f4xx_hal_sd.h" -#endif /* HAL_SD_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED - #include "stm32f4xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_TIM_MODULE_ENABLED - #include "stm32f4xx_hal_tim.h" -#endif /* HAL_TIM_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED - #include "stm32f4xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_USART_MODULE_ENABLED - #include "stm32f4xx_hal_usart.h" -#endif /* HAL_USART_MODULE_ENABLED */ - -#ifdef HAL_IRDA_MODULE_ENABLED - #include "stm32f4xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED - #include "stm32f4xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - -#ifdef HAL_WWDG_MODULE_ENABLED - #include "stm32f4xx_hal_wwdg.h" -#endif /* HAL_WWDG_MODULE_ENABLED */ - -#ifdef HAL_PCD_MODULE_ENABLED - #include "stm32f4xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_HCD_MODULE_ENABLED - #include "stm32f4xx_hal_hcd.h" -#endif /* HAL_HCD_MODULE_ENABLED */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr: If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ - #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ - void assert_failed(uint8_t* file, uint32_t line); -#else - #define assert_param(expr) ((void)0) -#endif /* USE_FULL_ASSERT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_HAL_CONF_H */ - - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Upstream/Inc/stm32f4xx_it.h b/Upstream/Inc/stm32f4xx_it.h deleted file mode 100755 index 814a90b..0000000 --- a/Upstream/Inc/stm32f4xx_it.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - ****************************************************************************** - * @file stm32f4xx_it.h - * @date 03/02/2015 20:27:00 - * @brief This file contains the headers of the interrupt handlers. - ****************************************************************************** - * - * COPYRIGHT(c) 2015 STMicroelectronics - * - * 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 STMicroelectronics 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 AND CONTRIBUTORS "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 OR CONTRIBUTORS 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. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F4xx_IT_H -#define __STM32F4xx_IT_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -void OTG_FS_IRQHandler(void); -void SysTick_Handler(void); - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32F4xx_IT_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Upstream/Inc/usb_device.h b/Upstream/Inc/usb_device.h index 9e144e3..e11adfb 100755 --- a/Upstream/Inc/usb_device.h +++ b/Upstream/Inc/usb_device.h @@ -46,7 +46,7 @@ extern USBD_HandleTypeDef hUsbDeviceFS; /* USB_Device init function */ -void MX_USB_DEVICE_Init(void); +void USB_Device_Init(void); #ifdef __cplusplus } diff --git a/Upstream/Inc/usbd_conf.h b/Upstream/Inc/usbd_config.h similarity index 100% rename from Upstream/Inc/usbd_conf.h rename to Upstream/Inc/usbd_config.h diff --git a/Upstream/Inc/usbd_desc.h b/Upstream/Inc/usbd_descriptors.h similarity index 95% rename from Upstream/Inc/usbd_desc.h rename to Upstream/Inc/usbd_descriptors.h index 52ffc74..edd4188 100755 --- a/Upstream/Inc/usbd_desc.h +++ b/Upstream/Inc/usbd_descriptors.h @@ -74,6 +74,7 @@ * @{ */ extern USBD_DescriptorsTypeDef FS_Desc; +extern const int8_t STORAGE_Inquirydata_FS[]; /** * @} */ diff --git a/Upstream/Inc/usbd_storage_if.h b/Upstream/Inc/usbd_storage_if.h deleted file mode 100755 index 86db905..0000000 --- a/Upstream/Inc/usbd_storage_if.h +++ /dev/null @@ -1,101 +0,0 @@ -/** - ****************************************************************************** - * @file : usbd_storage_if.h - * @author : MCD Application Team - * @version : V1.1.0 - * @date : 19-March-2012 - * @brief : header file for the usbd_storage_if.c file - ****************************************************************************** - * COPYRIGHT(c) 2015 STMicroelectronics - * - * 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 STMicroelectronics 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 AND CONTRIBUTORS "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 OR CONTRIBUTORS 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. - * - ****************************************************************************** -*/ - -/* Define to prevent recursive inclusion -------------------------------------*/ - -#ifndef __USBD_STORAGE_IF_H_ -#define __USBD_STORAGE_IF_H_ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_msc.h" - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_STORAGE - * @brief header file for the USBD_STORAGE.c file - * @{ - */ - -/** @defgroup USBD_STORAGE_Exported_Defines - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_STORAGE_Exported_Types - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_STORAGE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_STORAGE_Exported_Variables - * @{ - */ -extern USBD_StorageTypeDef USBD_Storage_Interface_fops_FS; -/** - * @} - */ - -/** @defgroup USBD_STORAGE_Exported_FunctionsPrototype - * @{ - */ - -/** - * @} - */ - -#endif /* __USBD_STORAGE_IF_H_ */ - -/** - * @} - */ - -/** -* @} -*/ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc.h b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc.h index 119fc11..82a4f08 100755 --- a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc.h +++ b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc.h @@ -34,9 +34,10 @@ #endif /* Includes ------------------------------------------------------------------*/ -#include "usbd_msc_bot.h" -#include "usbd_msc_scsi.h" -#include "usbd_ioreq.h" +#include "usbd_msc_bot.h" +#include "usbd_msc_scsi.h" +#include "usbd_ioreq.h" +#include "downstream_spi.h" /** @addtogroup USBD_MSC_BOT * @{ @@ -85,24 +86,26 @@ typedef struct _USBD_STORAGE typedef struct { - uint32_t max_lun; - uint32_t interface; - uint8_t bot_state; - uint8_t bot_status; - uint16_t bot_data_length; - uint8_t bot_data[MSC_MEDIA_PACKET]; - USBD_MSC_BOT_CBWTypeDef cbw; - USBD_MSC_BOT_CSWTypeDef csw; + uint32_t max_lun; + uint32_t interface; + uint8_t bot_state; + uint8_t bot_status; + uint16_t bot_data_length; + uint8_t* bot_data; + DownstreamPacketTypeDef* bot_packet; //Not NULL indicates we currently own a downstream packet buffer, and should free it when we are done. + USBD_MSC_BOT_CBWTypeDef cbw; + USBD_MSC_BOT_CSWTypeDef csw; - USBD_SCSI_SenseTypeDef scsi_sense [SENSE_LIST_DEEPTH]; + USBD_SCSI_SenseTypeDef scsi_sense [SENSE_LIST_DEPTH]; uint8_t scsi_sense_head; uint8_t scsi_sense_tail; - uint16_t scsi_blk_size; - uint32_t scsi_blk_nbr; - - uint32_t scsi_blk_addr; - uint32_t scsi_blk_len; + uint16_t scsi_blk_size; //LOGICAL BLOCK LENGTH IN BYTES: Number of bytes of user data in a logical block [SBC-4] + uint32_t scsi_blk_nbr; //This is total block count = LOGICAL BLOCK ADDRESS + 1. LOGICAL BLOCK ADDRESS: LBA of the last logical block on the direct access block device [SBC-4] + + uint32_t scsi_blk_addr; //LOGICAL BLOCK ADDRESS: Starting with the logical block referenced [SBC-4] + uint16_t scsi_blk_len; //TRANSFER LENGTH: Number of contiguous logical blocks of data that shall be read [SBC-4] + } USBD_MSC_BOT_HandleTypeDef; diff --git a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_bot.h b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_bot.h index 4216757..afd1d13 100755 --- a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_bot.h +++ b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_bot.h @@ -113,7 +113,6 @@ USBD_MSC_BOT_CSWTypeDef; /** @defgroup USBD_CORE_Exported_Types * @{ */ - /** * @} */ @@ -125,10 +124,13 @@ void MSC_BOT_Reset (USBD_HandleTypeDef *pdev); void MSC_BOT_DeInit (USBD_HandleTypeDef *pdev); void MSC_BOT_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum); - void MSC_BOT_DataOut (USBD_HandleTypeDef *pdev, uint8_t epnum); +void MSC_BOT_DataIn_Callback(int8_t result); +void MSC_BOT_DataOut_Callback(int8_t result); +void MSC_BOT_CBW_Decode_Callback(int8_t result); + void MSC_BOT_SendCSW (USBD_HandleTypeDef *pdev, uint8_t CSW_Status); diff --git a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_data.h b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_data.h index 7fcd1f8..a218c6f 100755 --- a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_data.h +++ b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_data.h @@ -34,7 +34,7 @@ #endif /* Includes ------------------------------------------------------------------*/ -#include "usbd_conf.h" +#include /** @addtogroup STM32_USB_DEVICE_LIBRARY * @{ diff --git a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_scsi.h b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_scsi.h index 4c30a45..3cc4240 100755 --- a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_scsi.h +++ b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Inc/usbd_msc_scsi.h @@ -49,7 +49,7 @@ * @{ */ -#define SENSE_LIST_DEEPTH 4 +#define SENSE_LIST_DEPTH 4 /* SCSI Commands */ #define SCSI_FORMAT_UNIT 0x04 @@ -99,15 +99,15 @@ #define INVALID_CDB 0x20 -#define INVALID_FIELED_IN_COMMAND 0x24 +#define INVALID_FIELD_IN_COMMAND 0x24 #define PARAMETER_LIST_LENGTH_ERROR 0x1A #define INVALID_FIELD_IN_PARAMETER_LIST 0x26 #define ADDRESS_OUT_OF_RANGE 0x21 #define MEDIUM_NOT_PRESENT 0x3A -#define MEDIUM_HAVE_CHANGED 0x28 +#define MEDIUM_HAS_CHANGED 0x28 #define WRITE_PROTECTED 0x27 -#define UNRECOVERED_READ_ERROR 0x11 -#define WRITE_FAULT 0x03 +#define UNRECOVERED_READ_ERROR 0x11 +#define WRITE_FAULT 0x03 #define READ_FORMAT_CAPACITY_DATA_LEN 0x0C #define READ_CAPACITY10_DATA_LEN 0x08 @@ -145,6 +145,10 @@ typedef struct _SENSE_ITEM { char *pData; } w; } USBD_SCSI_SenseTypeDef; + + +typedef void (*SCSI_ProcessCmdCallbackTypeDef)(int8_t result); + /** * @} */ @@ -167,9 +171,10 @@ typedef struct _SENSE_ITEM { /** @defgroup USBD_SCSI_Exported_FunctionsPrototype * @{ */ -int8_t SCSI_ProcessCmd(USBD_HandleTypeDef *pdev, +void SCSI_ProcessCmd(USBD_HandleTypeDef *pdev, uint8_t lun, - uint8_t *cmd); + uint8_t *cmd, + SCSI_ProcessCmdCallbackTypeDef process_cmd_callback); void SCSI_SenseCode(USBD_HandleTypeDef *pdev, uint8_t lun, diff --git a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c index 37365d9..5a1a761 100755 --- a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c +++ b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc.c @@ -42,7 +42,8 @@ /* Includes ------------------------------------------------------------------*/ #include "usbd_msc.h" - +#include "downstream_interface_def.h" +#include "downstream_spi.h" /** @addtogroup STM32_USB_DEVICE_LIBRARY * @{ @@ -106,6 +107,8 @@ uint8_t *USBD_MSC_GetOtherSpeedCfgDesc (uint16_t *length); uint8_t *USBD_MSC_GetDeviceQualifierDescriptor (uint16_t *length); +uint8_t USBD_MSC_BufferFreed(USBD_HandleTypeDef *pdev); + /** * @} @@ -128,7 +131,8 @@ USBD_ClassTypeDef USBD_MSC = USBD_MSC_DataOut, NULL, /*SOF */ NULL, - NULL, + NULL, + USBD_MSC_BufferFreed, USBD_MSC_GetHSCfgDesc, USBD_MSC_GetFSCfgDesc, USBD_MSC_GetOtherSpeedCfgDesc, @@ -181,7 +185,7 @@ __ALIGN_BEGIN uint8_t USBD_MSC_CfgHSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = /* USB Mass storage device Configuration Descriptor */ /* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ -uint8_t USBD_MSC_CfgFSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = +__ALIGN_BEGIN uint8_t USBD_MSC_CfgFSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = { 0x09, /* bLength: Configuation Descriptor size */ @@ -226,7 +230,7 @@ uint8_t USBD_MSC_CfgFSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = __ALIGN_BEGIN uint8_t USBD_MSC_OtherSpeedCfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = { - 0x09, /* bLength: Configuation Descriptor size */ + 0x09, /* bLength: Configuration Descriptor size */ USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION, USB_MSC_CONFIG_DESC_SIZ, @@ -337,7 +341,8 @@ uint8_t USBD_MSC_Init (USBD_HandleTypeDef *pdev, else { /* Init the BOT layer */ - MSC_BOT_Init(pdev); + MSC_BOT_Init(pdev); + ((USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData)->bot_packet = NULL; ret = 0; } @@ -398,7 +403,7 @@ uint8_t USBD_MSC_Setup (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) (req->wLength == 1) && ((req->bmRequest & 0x80) == 0x80)) { - hmsc->max_lun = ((USBD_StorageTypeDef *)pdev->pUserData)->GetMaxLun(); + hmsc->max_lun = (UPSTREAM_LUN_NBR - 1); USBD_CtlSendData (pdev, (uint8_t *)&hmsc->max_lun, 1); @@ -530,6 +535,18 @@ uint8_t USBD_MSC_DataOut (USBD_HandleTypeDef *pdev, return 0; } + +uint8_t USBD_MSC_BufferFreed(USBD_HandleTypeDef *pdev) +{ + if (((USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData)->bot_packet != NULL) + { + Downstream_ReleasePacket(((USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData)->bot_packet); + ((USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData)->bot_packet = NULL; + } + return 0; +} + + /** * @brief USBD_MSC_GetHSCfgDesc * return configuration descriptor @@ -577,20 +594,6 @@ uint8_t *USBD_MSC_GetDeviceQualifierDescriptor (uint16_t *length) return USBD_MSC_DeviceQualifierDesc; } -/** -* @brief USBD_MSC_RegisterStorage -* @param fops: storage callback -* @retval status -*/ -uint8_t USBD_MSC_RegisterStorage (USBD_HandleTypeDef *pdev, - USBD_StorageTypeDef *fops) -{ - if(fops != NULL) - { - pdev->pUserData= fops; - } - return 0; -} /** * @} diff --git a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_bot.c b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_bot.c index 9e893e8..f444170 100755 --- a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_bot.c +++ b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_bot.c @@ -70,6 +70,9 @@ * @{ */ +USBD_HandleTypeDef *MSC_BOT_pdev; +USBD_MSC_BOT_HandleTypeDef *MSC_BOT_hmsc; + /** * @} */ @@ -112,8 +115,6 @@ void MSC_BOT_Init (USBD_HandleTypeDef *pdev) hmsc->scsi_sense_tail = 0; hmsc->scsi_sense_head = 0; - ((USBD_StorageTypeDef *)pdev->pUserData)->Init(0); - USBD_LL_FlushEP(pdev, MSC_EPOUT_ADDR); USBD_LL_FlushEP(pdev, MSC_EPIN_ADDR); @@ -171,24 +172,32 @@ void MSC_BOT_DataIn (USBD_HandleTypeDef *pdev, switch (hmsc->bot_state) { case USBD_BOT_DATA_IN: - if(SCSI_ProcessCmd(pdev, - hmsc->cbw.bLUN, - &hmsc->cbw.CB[0]) < 0) - { - MSC_BOT_SendCSW (pdev, USBD_CSW_CMD_FAILED); - } + MSC_BOT_pdev = pdev; + SCSI_ProcessCmd(pdev, + hmsc->cbw.bLUN, + &hmsc->cbw.CB[0], + MSC_BOT_DataIn_Callback); break; case USBD_BOT_SEND_DATA: case USBD_BOT_LAST_DATA_IN: MSC_BOT_SendCSW (pdev, USBD_CSW_CMD_PASSED); - break; default: break; } } + + +void MSC_BOT_DataIn_Callback(int8_t result) +{ + if (result < 0) + { + MSC_BOT_SendCSW (MSC_BOT_pdev, USBD_CSW_CMD_FAILED); + } +} + /** * @brief MSC_BOT_DataOut * Process MSC OUT data @@ -209,13 +218,11 @@ void MSC_BOT_DataOut (USBD_HandleTypeDef *pdev, case USBD_BOT_DATA_OUT: - if(SCSI_ProcessCmd(pdev, - hmsc->cbw.bLUN, - &hmsc->cbw.CB[0]) < 0) - { - MSC_BOT_SendCSW (pdev, USBD_CSW_CMD_FAILED); - } - + MSC_BOT_pdev = pdev; + SCSI_ProcessCmd(pdev, + hmsc->cbw.bLUN, + &hmsc->cbw.CB[0], + MSC_BOT_DataOut_Callback); break; default: @@ -223,6 +230,15 @@ void MSC_BOT_DataOut (USBD_HandleTypeDef *pdev, } } + +void MSC_BOT_DataOut_Callback(int8_t result) +{ + if (result < 0) + { + MSC_BOT_SendCSW (MSC_BOT_pdev, USBD_CSW_CMD_FAILED); + } +} + /** * @brief MSC_BOT_CBW_Decode * Decode the CBW command and set the BOT state machine accordingly @@ -254,40 +270,51 @@ static void MSC_BOT_CBW_Decode (USBD_HandleTypeDef *pdev) } else { - if(SCSI_ProcessCmd(pdev, - hmsc->cbw.bLUN, - &hmsc->cbw.CB[0]) < 0) - { - if(hmsc->bot_state == USBD_BOT_NO_DATA) - { - MSC_BOT_SendCSW (pdev, - USBD_CSW_CMD_FAILED); - } - else - { - MSC_BOT_Abort(pdev); - } - } - /*Burst xfer handled internally*/ - else if ((hmsc->bot_state != USBD_BOT_DATA_IN) && - (hmsc->bot_state != USBD_BOT_DATA_OUT) && - (hmsc->bot_state != USBD_BOT_LAST_DATA_IN)) - { - if (hmsc->bot_data_length > 0) - { - MSC_BOT_SendData(pdev, - hmsc->bot_data, - hmsc->bot_data_length); - } - else if (hmsc->bot_data_length == 0) - { - MSC_BOT_SendCSW (pdev, - USBD_CSW_CMD_PASSED); - } - } + MSC_BOT_pdev = pdev; + MSC_BOT_hmsc = hmsc; + SCSI_ProcessCmd(pdev, + hmsc->cbw.bLUN, + &hmsc->cbw.CB[0], + MSC_BOT_CBW_Decode_Callback); } } + +void MSC_BOT_CBW_Decode_Callback(int8_t result) +{ + if (result < 0) + { + if(MSC_BOT_hmsc->bot_state == USBD_BOT_NO_DATA) + { + MSC_BOT_SendCSW (MSC_BOT_pdev, + USBD_CSW_CMD_FAILED); + } + else + { + MSC_BOT_Abort(MSC_BOT_pdev); + } + } + /*Burst xfer handled internally*/ + else if ((MSC_BOT_hmsc->bot_state != USBD_BOT_DATA_IN) && + (MSC_BOT_hmsc->bot_state != USBD_BOT_DATA_OUT) && + (MSC_BOT_hmsc->bot_state != USBD_BOT_LAST_DATA_IN)) + { + if (MSC_BOT_hmsc->bot_data_length > 0) + { + MSC_BOT_SendData(MSC_BOT_pdev, + MSC_BOT_hmsc->bot_data, + MSC_BOT_hmsc->bot_data_length); + } + else if (MSC_BOT_hmsc->bot_data_length == 0) + { + MSC_BOT_SendCSW (MSC_BOT_pdev, + USBD_CSW_CMD_PASSED); + } + } +} + + + /** * @brief MSC_BOT_SendData * Send the requested data diff --git a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c index f7a90e6..e46ac08 100755 --- a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c +++ b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Class/MSC/Src/usbd_msc_scsi.c @@ -30,7 +30,10 @@ #include "usbd_msc_scsi.h" #include "usbd_msc.h" #include "usbd_msc_data.h" - +#include "usbd_descriptors.h" +#include "downstream_interface_def.h" +#include "downstream_interface_msc.h" +#include "downstream_spi.h" /** @addtogroup STM32_USB_DEVICE_LIBRARY @@ -72,6 +75,13 @@ * @{ */ +USBD_HandleTypeDef *SCSI_ProcessCmd_pdev; +uint8_t SCSI_ProcessCmd_lun; +uint8_t *SCSI_ProcessCmd_params; +SCSI_ProcessCmdCallbackTypeDef SCSI_ProcessCmd_callback; +USBD_MSC_BOT_HandleTypeDef *SCSI_ProcessCmd_hmsc; + + /** * @} */ @@ -80,26 +90,33 @@ /** @defgroup MSC_SCSI_Private_FunctionPrototypes * @{ */ -static int8_t SCSI_TestUnitReady(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params); -static int8_t SCSI_Inquiry(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params); -static int8_t SCSI_ReadFormatCapacity(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params); -static int8_t SCSI_ReadCapacity10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params); -static int8_t SCSI_RequestSense (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params); -static int8_t SCSI_StartStopUnit(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params); -static int8_t SCSI_ModeSense6 (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params); -static int8_t SCSI_ModeSense10 (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params); -static int8_t SCSI_Write10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *params); -static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *params); -static int8_t SCSI_Verify10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params); -static int8_t SCSI_CheckAddressRange (USBD_HandleTypeDef *pdev, - uint8_t lun , - uint32_t blk_offset , - uint16_t blk_nbr); -static int8_t SCSI_ProcessRead (USBD_HandleTypeDef *pdev, - uint8_t lun); - -static int8_t SCSI_ProcessWrite (USBD_HandleTypeDef *pdev, - uint8_t lun); +static void SCSI_TestUnitReady(void); +static void SCSI_Inquiry(void); +static void SCSI_ReadFormatCapacity(void); +static void SCSI_ReadCapacity10(void); +static void SCSI_RequestSense (void); +static void SCSI_StartStopUnit(void); +static void SCSI_ModeSense6 (void); +static void SCSI_ModeSense10 (void); +static void SCSI_Write10(void); +static void SCSI_Read10(void); +static void SCSI_Verify10(void); +static int8_t SCSI_CheckAddressRange (uint32_t blk_offset , uint16_t blk_nbr); + +void SCSI_TestUnitReadyCallback(HAL_StatusTypeDef result); +void SCSI_ReadCapacity10Callback(HAL_StatusTypeDef result, + uint32_t result_uint[], + DownstreamPacketTypeDef* downstreamPacket); +void SCSI_ReadFormatCapacityCallback(HAL_StatusTypeDef result, + uint32_t result_uint[], + DownstreamPacketTypeDef* packetToUse); +void SCSI_Read10BeginCallback(HAL_StatusTypeDef result); +void SCSI_Read10ReplyCallback(HAL_StatusTypeDef result, + DownstreamPacketTypeDef* downstreamPacket); +void SCSI_Write10BeginCallback(HAL_StatusTypeDef result); +void SCSI_Write10FreePacketCallback(DownstreamPacketTypeDef* freePacket); + + /** * @} */ @@ -118,54 +135,74 @@ static int8_t SCSI_ProcessWrite (USBD_HandleTypeDef *pdev, * @param params: Command parameters * @retval status */ -int8_t SCSI_ProcessCmd(USBD_HandleTypeDef *pdev, - uint8_t lun, - uint8_t *params) +void SCSI_ProcessCmd(USBD_HandleTypeDef *pdev, + uint8_t lun, + uint8_t *params, + SCSI_ProcessCmdCallbackTypeDef callback) { - + //Save all our parameters for easy access in callback routines + SCSI_ProcessCmd_pdev = pdev; + SCSI_ProcessCmd_params = params; + SCSI_ProcessCmd_lun = lun; + SCSI_ProcessCmd_callback = callback; + SCSI_ProcessCmd_hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData; + switch (params[0]) { case SCSI_TEST_UNIT_READY: - return SCSI_TestUnitReady(pdev, lun, params); + SCSI_TestUnitReady(); + return; case SCSI_REQUEST_SENSE: - return SCSI_RequestSense (pdev, lun, params); + SCSI_RequestSense(); + return; + case SCSI_INQUIRY: - return SCSI_Inquiry(pdev, lun, params); + SCSI_Inquiry(); + return; case SCSI_START_STOP_UNIT: - return SCSI_StartStopUnit(pdev, lun, params); + SCSI_StartStopUnit(); + return; case SCSI_ALLOW_MEDIUM_REMOVAL: - return SCSI_StartStopUnit(pdev, lun, params); + SCSI_StartStopUnit(); + return; case SCSI_MODE_SENSE6: - return SCSI_ModeSense6 (pdev, lun, params); + SCSI_ModeSense6(); + return; case SCSI_MODE_SENSE10: - return SCSI_ModeSense10 (pdev, lun, params); + SCSI_ModeSense10(); + return; case SCSI_READ_FORMAT_CAPACITIES: - return SCSI_ReadFormatCapacity(pdev, lun, params); + SCSI_ReadFormatCapacity(); + return; case SCSI_READ_CAPACITY10: - return SCSI_ReadCapacity10(pdev, lun, params); + SCSI_ReadCapacity10(); + return; case SCSI_READ10: - return SCSI_Read10(pdev, lun, params); + SCSI_Read10(); + return; case SCSI_WRITE10: - return SCSI_Write10(pdev, lun, params); + SCSI_Write10(); + return; case SCSI_VERIFY10: - return SCSI_Verify10(pdev, lun, params); + SCSI_Verify10(); + return; default: SCSI_SenseCode(pdev, lun, ILLEGAL_REQUEST, INVALID_CDB); - return -1; + SCSI_ProcessCmd_callback(-1); } } @@ -177,34 +214,53 @@ int8_t SCSI_ProcessCmd(USBD_HandleTypeDef *pdev, * @param params: Command parameters * @retval status */ -static int8_t SCSI_TestUnitReady(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +void SCSI_TestUnitReady(void) { - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData; - /* case 9 : Hi > D0 */ - if (hmsc->cbw.dDataLength != 0) + if (SCSI_ProcessCmd_hmsc->cbw.dDataLength != 0) { - SCSI_SenseCode(pdev, - hmsc->cbw.bLUN, + SCSI_SenseCode(SCSI_ProcessCmd_pdev, + SCSI_ProcessCmd_lun, ILLEGAL_REQUEST, INVALID_CDB); - return -1; - } + SCSI_ProcessCmd_callback(-1); + return; + } - if(((USBD_StorageTypeDef *)pdev->pUserData)->IsReady(lun) !=0 ) + if (SCSI_ProcessCmd_lun >= UPSTREAM_LUN_NBR) { - SCSI_SenseCode(pdev, - lun, - NOT_READY, - MEDIUM_NOT_PRESENT); - - hmsc->bot_state = USBD_BOT_NO_DATA; - return -1; - } - hmsc->bot_data_length = 0; - return 0; + SCSI_TestUnitReadyCallback(HAL_ERROR); + return; + } + + if (DownstreamInterface_TestReady(SCSI_TestUnitReadyCallback) != HAL_OK) + { + SCSI_TestUnitReadyCallback(HAL_ERROR); + } } + +void SCSI_TestUnitReadyCallback(HAL_StatusTypeDef result) +{ + if (result != HAL_OK) + { + SCSI_SenseCode(SCSI_ProcessCmd_pdev, + SCSI_ProcessCmd_lun, + NOT_READY, + MEDIUM_NOT_PRESENT); + SCSI_ProcessCmd_hmsc->bot_state = USBD_BOT_NO_DATA; + SCSI_ProcessCmd_callback(-1); + return; + } + + //Success! + SCSI_ProcessCmd_hmsc->bot_data_length = 0; + SCSI_ProcessCmd_callback(0); +} + + + + /** * @brief SCSI_Inquiry * Process Inquiry command @@ -212,36 +268,40 @@ static int8_t SCSI_TestUnitReady(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t * @param params: Command parameters * @retval status */ -static int8_t SCSI_Inquiry(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +static void SCSI_Inquiry(void) { - uint8_t* pPage; - uint16_t len; - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData; - - if (params[1] & 0x01)/*Evpd is set*/ - { - pPage = (uint8_t *)MSC_Page00_Inquiry_Data; - len = LENGTH_INQUIRY_PAGE00; - } - else - { - - pPage = (uint8_t *)&((USBD_StorageTypeDef *)pdev->pUserData)->pInquiry[lun * STANDARD_INQUIRY_DATA_LEN]; - len = pPage[4] + 5; - - if (params[4] <= len) - { - len = params[4]; - } - } - hmsc->bot_data_length = len; - - while (len) - { - len--; - hmsc->bot_data[len] = pPage[len]; - } - return 0; + uint8_t* pPage; + uint16_t len; + DownstreamPacketTypeDef* freePacket; + + freePacket = Downstream_GetFreePacketImmediately(); + SCSI_ProcessCmd_hmsc->bot_packet = freePacket; + SCSI_ProcessCmd_hmsc->bot_data = freePacket->Data; + + if (SCSI_ProcessCmd_params[1] & 0x01)/*Evpd is set*/ + { + pPage = (uint8_t *)MSC_Page00_Inquiry_Data; + len = LENGTH_INQUIRY_PAGE00; + } + else + { + //Return the same info for any LUN requested + pPage = (uint8_t *)&STORAGE_Inquirydata_FS; + len = pPage[4] + 5; + + if (SCSI_ProcessCmd_params[4] <= len) + { + len = SCSI_ProcessCmd_params[4]; + } + } + SCSI_ProcessCmd_hmsc->bot_data_length = len; + + while (len) + { + len--; + SCSI_ProcessCmd_hmsc->bot_data[len] = pPage[len]; + } + SCSI_ProcessCmd_callback(0); } /** @@ -251,35 +311,49 @@ static int8_t SCSI_Inquiry(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *par * @param params: Command parameters * @retval status */ -static int8_t SCSI_ReadCapacity10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +static void SCSI_ReadCapacity10(void) { - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData; - - if(((USBD_StorageTypeDef *)pdev->pUserData)->GetCapacity(lun, &hmsc->scsi_blk_nbr, &hmsc->scsi_blk_size) != 0) - { - SCSI_SenseCode(pdev, - lun, - NOT_READY, - MEDIUM_NOT_PRESENT); - return -1; - } - else - { - - hmsc->bot_data[0] = (uint8_t)((hmsc->scsi_blk_nbr - 1) >> 24); - hmsc->bot_data[1] = (uint8_t)((hmsc->scsi_blk_nbr - 1) >> 16); - hmsc->bot_data[2] = (uint8_t)((hmsc->scsi_blk_nbr - 1) >> 8); - hmsc->bot_data[3] = (uint8_t)(hmsc->scsi_blk_nbr - 1); - - hmsc->bot_data[4] = (uint8_t)(hmsc->scsi_blk_size >> 24); - hmsc->bot_data[5] = (uint8_t)(hmsc->scsi_blk_size >> 16); - hmsc->bot_data[6] = (uint8_t)(hmsc->scsi_blk_size >> 8); - hmsc->bot_data[7] = (uint8_t)(hmsc->scsi_blk_size); - - hmsc->bot_data_length = 8; - return 0; - } + if (DownstreamInterface_GetCapacity(SCSI_ReadCapacity10Callback) != HAL_OK) + { + SCSI_ReadCapacity10Callback(HAL_ERROR, NULL, NULL); + } +} + + +void SCSI_ReadCapacity10Callback(HAL_StatusTypeDef result, + uint32_t result_uint[], + DownstreamPacketTypeDef* downstreamPacket) +{ + if (result != HAL_OK) + { + SCSI_SenseCode(SCSI_ProcessCmd_pdev, + SCSI_ProcessCmd_lun, + NOT_READY, + MEDIUM_NOT_PRESENT); + SCSI_ProcessCmd_callback(-1); + return; + } + + SCSI_ProcessCmd_hmsc->bot_packet = downstreamPacket; + SCSI_ProcessCmd_hmsc->bot_data = downstreamPacket->Data; + + SCSI_ProcessCmd_hmsc->scsi_blk_nbr = result_uint[0]; + SCSI_ProcessCmd_hmsc->scsi_blk_size = result_uint[1]; + + SCSI_ProcessCmd_hmsc->bot_data[0] = (uint8_t)((SCSI_ProcessCmd_hmsc->scsi_blk_nbr - 1) >> 24); + SCSI_ProcessCmd_hmsc->bot_data[1] = (uint8_t)((SCSI_ProcessCmd_hmsc->scsi_blk_nbr - 1) >> 16); + SCSI_ProcessCmd_hmsc->bot_data[2] = (uint8_t)((SCSI_ProcessCmd_hmsc->scsi_blk_nbr - 1) >> 8); + SCSI_ProcessCmd_hmsc->bot_data[3] = (uint8_t)(SCSI_ProcessCmd_hmsc->scsi_blk_nbr - 1); + + SCSI_ProcessCmd_hmsc->bot_data[4] = (uint8_t)(SCSI_ProcessCmd_hmsc->scsi_blk_size >> 24); + SCSI_ProcessCmd_hmsc->bot_data[5] = (uint8_t)(SCSI_ProcessCmd_hmsc->scsi_blk_size >> 16); + SCSI_ProcessCmd_hmsc->bot_data[6] = (uint8_t)(SCSI_ProcessCmd_hmsc->scsi_blk_size >> 8); + SCSI_ProcessCmd_hmsc->bot_data[7] = (uint8_t)(SCSI_ProcessCmd_hmsc->scsi_blk_size); + + SCSI_ProcessCmd_hmsc->bot_data_length = 8; + SCSI_ProcessCmd_callback(0); } + /** * @brief SCSI_ReadFormatCapacity * Process Read Format Capacity command @@ -287,44 +361,50 @@ static int8_t SCSI_ReadCapacity10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_ * @param params: Command parameters * @retval status */ -static int8_t SCSI_ReadFormatCapacity(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +static void SCSI_ReadFormatCapacity(void) { - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData; - - uint16_t blk_size; - uint32_t blk_nbr; - uint16_t i; - - for(i=0 ; i < 12 ; i++) - { - hmsc->bot_data[i] = 0; - } - - if(((USBD_StorageTypeDef *)pdev->pUserData)->GetCapacity(lun, &blk_nbr, &blk_size) != 0) - { - SCSI_SenseCode(pdev, - lun, - NOT_READY, - MEDIUM_NOT_PRESENT); - return -1; - } - else - { - hmsc->bot_data[3] = 0x08; - hmsc->bot_data[4] = (uint8_t)((blk_nbr - 1) >> 24); - hmsc->bot_data[5] = (uint8_t)((blk_nbr - 1) >> 16); - hmsc->bot_data[6] = (uint8_t)((blk_nbr - 1) >> 8); - hmsc->bot_data[7] = (uint8_t)(blk_nbr - 1); - - hmsc->bot_data[8] = 0x02; - hmsc->bot_data[9] = (uint8_t)(blk_size >> 16); - hmsc->bot_data[10] = (uint8_t)(blk_size >> 8); - hmsc->bot_data[11] = (uint8_t)(blk_size); - - hmsc->bot_data_length = 12; - return 0; - } + if (DownstreamInterface_GetCapacity(SCSI_ReadFormatCapacityCallback) != HAL_OK) + { + SCSI_ReadFormatCapacityCallback(HAL_ERROR, NULL, NULL); + } +} + + +void SCSI_ReadFormatCapacityCallback(HAL_StatusTypeDef result, + uint32_t result_uint[], + DownstreamPacketTypeDef* packetToUse) +{ + if (result != HAL_OK) + { + SCSI_SenseCode(SCSI_ProcessCmd_pdev, + SCSI_ProcessCmd_lun, + NOT_READY, + MEDIUM_NOT_PRESENT); + SCSI_ProcessCmd_callback(-1); + return; + } + + SCSI_ProcessCmd_hmsc->bot_packet = packetToUse; + SCSI_ProcessCmd_hmsc->bot_data = packetToUse->Data; + + SCSI_ProcessCmd_hmsc->bot_data[0] = 0; + SCSI_ProcessCmd_hmsc->bot_data[1] = 0; + SCSI_ProcessCmd_hmsc->bot_data[2] = 0; + SCSI_ProcessCmd_hmsc->bot_data[3] = 0x08; + SCSI_ProcessCmd_hmsc->bot_data[4] = (uint8_t)((result_uint[0] - 1) >> 24); + SCSI_ProcessCmd_hmsc->bot_data[5] = (uint8_t)((result_uint[0] - 1) >> 16); + SCSI_ProcessCmd_hmsc->bot_data[6] = (uint8_t)((result_uint[0] - 1) >> 8); + SCSI_ProcessCmd_hmsc->bot_data[7] = (uint8_t)(result_uint[0] - 1); + + SCSI_ProcessCmd_hmsc->bot_data[8] = 0x02; + SCSI_ProcessCmd_hmsc->bot_data[9] = (uint8_t)(result_uint[1] >> 16); + SCSI_ProcessCmd_hmsc->bot_data[10] = (uint8_t)(result_uint[1] >> 8); + SCSI_ProcessCmd_hmsc->bot_data[11] = (uint8_t)(result_uint[1]); + + SCSI_ProcessCmd_hmsc->bot_data_length = 12; + SCSI_ProcessCmd_callback(0); } + /** * @brief SCSI_ModeSense6 * Process Mode Sense6 command @@ -332,18 +412,23 @@ static int8_t SCSI_ReadFormatCapacity(USBD_HandleTypeDef *pdev, uint8_t lun, ui * @param params: Command parameters * @retval status */ -static int8_t SCSI_ModeSense6 (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +static void SCSI_ModeSense6 (void) { - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData; - uint16_t len = 8 ; - hmsc->bot_data_length = len; - - while (len) - { - len--; - hmsc->bot_data[len] = MSC_Mode_Sense6_data[len]; - } - return 0; + uint16_t len = 8; + DownstreamPacketTypeDef* freePacket; + + freePacket = Downstream_GetFreePacketImmediately(); + SCSI_ProcessCmd_hmsc->bot_packet = freePacket; + SCSI_ProcessCmd_hmsc->bot_data = freePacket->Data; + + SCSI_ProcessCmd_hmsc->bot_data_length = len; + + while (len) + { + len--; + SCSI_ProcessCmd_hmsc->bot_data[len] = MSC_Mode_Sense6_data[len]; + } + SCSI_ProcessCmd_callback(0); } /** @@ -353,19 +438,23 @@ static int8_t SCSI_ModeSense6 (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t * * @param params: Command parameters * @retval status */ -static int8_t SCSI_ModeSense10 (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +static void SCSI_ModeSense10(void) { - uint16_t len = 8; - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData; - - hmsc->bot_data_length = len; + uint16_t len = 8; + DownstreamPacketTypeDef* freePacket; - while (len) - { - len--; - hmsc->bot_data[len] = MSC_Mode_Sense10_data[len]; - } - return 0; + freePacket = Downstream_GetFreePacketImmediately(); + SCSI_ProcessCmd_hmsc->bot_packet = freePacket; + SCSI_ProcessCmd_hmsc->bot_data = freePacket->Data; + + SCSI_ProcessCmd_hmsc->bot_data_length = len; + + while (len) + { + len--; + SCSI_ProcessCmd_hmsc->bot_data[len] = MSC_Mode_Sense10_data[len]; + } + SCSI_ProcessCmd_callback(0); } /** @@ -376,38 +465,41 @@ static int8_t SCSI_ModeSense10 (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t * @retval status */ -static int8_t SCSI_RequestSense (USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +static void SCSI_RequestSense(void) { - uint8_t i; - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData; - - for(i=0 ; i < REQUEST_SENSE_DATA_LEN ; i++) - { - hmsc->bot_data[i] = 0; - } - - hmsc->bot_data[0] = 0x70; - hmsc->bot_data[7] = REQUEST_SENSE_DATA_LEN - 6; - - if((hmsc->scsi_sense_head != hmsc->scsi_sense_tail)) { - - hmsc->bot_data[2] = hmsc->scsi_sense[hmsc->scsi_sense_head].Skey; - hmsc->bot_data[12] = hmsc->scsi_sense[hmsc->scsi_sense_head].w.b.ASCQ; - hmsc->bot_data[13] = hmsc->scsi_sense[hmsc->scsi_sense_head].w.b.ASC; - hmsc->scsi_sense_head++; - - if (hmsc->scsi_sense_head == SENSE_LIST_DEEPTH) - { - hmsc->scsi_sense_head = 0; - } - } - hmsc->bot_data_length = REQUEST_SENSE_DATA_LEN; - - if (params[4] <= REQUEST_SENSE_DATA_LEN) - { - hmsc->bot_data_length = params[4]; - } - return 0; + uint8_t i; + DownstreamPacketTypeDef* freePacket; + + freePacket = Downstream_GetFreePacketImmediately(); + SCSI_ProcessCmd_hmsc->bot_packet = freePacket; + SCSI_ProcessCmd_hmsc->bot_data = freePacket->Data; + + for (i=0 ; i < REQUEST_SENSE_DATA_LEN ; i++) + { + SCSI_ProcessCmd_hmsc->bot_data[i] = 0; + } + + SCSI_ProcessCmd_hmsc->bot_data[0] = 0x70; + SCSI_ProcessCmd_hmsc->bot_data[7] = REQUEST_SENSE_DATA_LEN - 6; + + if((SCSI_ProcessCmd_hmsc->scsi_sense_head != SCSI_ProcessCmd_hmsc->scsi_sense_tail)) + { + SCSI_ProcessCmd_hmsc->bot_data[2] = SCSI_ProcessCmd_hmsc->scsi_sense[SCSI_ProcessCmd_hmsc->scsi_sense_head].Skey; + SCSI_ProcessCmd_hmsc->bot_data[12] = SCSI_ProcessCmd_hmsc->scsi_sense[SCSI_ProcessCmd_hmsc->scsi_sense_head].w.b.ASCQ; + SCSI_ProcessCmd_hmsc->bot_data[13] = SCSI_ProcessCmd_hmsc->scsi_sense[SCSI_ProcessCmd_hmsc->scsi_sense_head].w.b.ASC; + SCSI_ProcessCmd_hmsc->scsi_sense_head++; + if (SCSI_ProcessCmd_hmsc->scsi_sense_head == SENSE_LIST_DEPTH) + { + SCSI_ProcessCmd_hmsc->scsi_sense_head = 0; + } + } + SCSI_ProcessCmd_hmsc->bot_data_length = REQUEST_SENSE_DATA_LEN; + + if (SCSI_ProcessCmd_params[4] <= REQUEST_SENSE_DATA_LEN) + { + SCSI_ProcessCmd_hmsc->bot_data_length = SCSI_ProcessCmd_params[4]; + } + SCSI_ProcessCmd_callback(0); } /** @@ -426,7 +518,7 @@ void SCSI_SenseCode(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t sKey, uint8_ hmsc->scsi_sense[hmsc->scsi_sense_tail].Skey = sKey; hmsc->scsi_sense[hmsc->scsi_sense_tail].w.ASC = ASC << 8; hmsc->scsi_sense_tail++; - if (hmsc->scsi_sense_tail == SENSE_LIST_DEEPTH) + if (hmsc->scsi_sense_tail == SENSE_LIST_DEPTH) { hmsc->scsi_sense_tail = 0; } @@ -438,11 +530,10 @@ void SCSI_SenseCode(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t sKey, uint8_ * @param params: Command parameters * @retval status */ -static int8_t SCSI_StartStopUnit(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +static void SCSI_StartStopUnit(void) { - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*) pdev->pClassData; - hmsc->bot_data_length = 0; - return 0; + SCSI_ProcessCmd_hmsc->bot_data_length = 0; + SCSI_ProcessCmd_callback(0); } /** @@ -452,67 +543,121 @@ static int8_t SCSI_StartStopUnit(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t * @param params: Command parameters * @retval status */ -static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *params) +static void SCSI_Read10(void) { - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*) pdev->pClassData; - - if(hmsc->bot_state == USBD_BOT_IDLE) /* Idle */ - { - - /* case 10 : Ho <> Di */ - - if ((hmsc->cbw.bmFlags & 0x80) != 0x80) - { - SCSI_SenseCode(pdev, - hmsc->cbw.bLUN, - ILLEGAL_REQUEST, - INVALID_CDB); - return -1; - } - - if(((USBD_StorageTypeDef *)pdev->pUserData)->IsReady(lun) !=0 ) - { - SCSI_SenseCode(pdev, - lun, - NOT_READY, - MEDIUM_NOT_PRESENT); - return -1; - } - - hmsc->scsi_blk_addr = (params[2] << 24) | \ - (params[3] << 16) | \ - (params[4] << 8) | \ - params[5]; - - hmsc->scsi_blk_len = (params[7] << 8) | \ - params[8]; - - - - if( SCSI_CheckAddressRange(pdev, lun, hmsc->scsi_blk_addr, hmsc->scsi_blk_len) < 0) - { - return -1; /* error */ - } - - hmsc->bot_state = USBD_BOT_DATA_IN; - hmsc->scsi_blk_addr *= hmsc->scsi_blk_size; - hmsc->scsi_blk_len *= hmsc->scsi_blk_size; - - /* cases 4,5 : Hi <> Dn */ - if (hmsc->cbw.dDataLength != hmsc->scsi_blk_len) - { - SCSI_SenseCode(pdev, - hmsc->cbw.bLUN, - ILLEGAL_REQUEST, - INVALID_CDB); - return -1; - } - } - hmsc->bot_data_length = MSC_MEDIA_PACKET; - - return SCSI_ProcessRead(pdev, lun); + if (SCSI_ProcessCmd_hmsc->bot_state == USBD_BOT_IDLE) /* Idle */ + { + /* case 10 : Ho <> Di */ + if ((SCSI_ProcessCmd_hmsc->cbw.bmFlags & 0x80) != 0x80) + { + SCSI_SenseCode(SCSI_ProcessCmd_pdev, + SCSI_ProcessCmd_hmsc->cbw.bLUN, + ILLEGAL_REQUEST, + INVALID_CDB); + SCSI_ProcessCmd_callback(-1); + return; + } + + SCSI_ProcessCmd_hmsc->scsi_blk_addr = (SCSI_ProcessCmd_params[2] << 24) | \ + (SCSI_ProcessCmd_params[3] << 16) | \ + (SCSI_ProcessCmd_params[4] << 8) | \ + SCSI_ProcessCmd_params[5]; + + SCSI_ProcessCmd_hmsc->scsi_blk_len = (SCSI_ProcessCmd_params[7] << 8) | \ + SCSI_ProcessCmd_params[8]; + + if (SCSI_CheckAddressRange(SCSI_ProcessCmd_hmsc->scsi_blk_addr, + SCSI_ProcessCmd_hmsc->scsi_blk_len) < 0) + { + SCSI_SenseCode(SCSI_ProcessCmd_pdev, + SCSI_ProcessCmd_hmsc->cbw.bLUN, + ILLEGAL_REQUEST, + INVALID_CDB); + SCSI_ProcessCmd_callback(-1); /* error */ + return; + } + + /* cases 4,5 : Hi <> Dn */ + if (SCSI_ProcessCmd_hmsc->cbw.dDataLength != (uint32_t)(SCSI_ProcessCmd_hmsc->scsi_blk_len * SCSI_ProcessCmd_hmsc->scsi_blk_size)) + { + SCSI_SenseCode(SCSI_ProcessCmd_pdev, + SCSI_ProcessCmd_hmsc->cbw.bLUN, + ILLEGAL_REQUEST, + INVALID_CDB); + SCSI_ProcessCmd_callback(-1); + return; + } + + if (DownstreamInterface_BeginRead(SCSI_Read10BeginCallback, + SCSI_ProcessCmd_hmsc->scsi_blk_addr, + SCSI_ProcessCmd_hmsc->scsi_blk_len, + SCSI_ProcessCmd_hmsc->cbw.dDataLength) != HAL_OK) + { + SCSI_Read10BeginCallback(HAL_ERROR); + } + return; + } + + //hmsc->bot_state is already USBD_BOT_DATA_IN + DownstreamInterface_GetStreamDataPacket(SCSI_Read10ReplyCallback); } + +void SCSI_Read10BeginCallback(HAL_StatusTypeDef result) +{ + if (result != HAL_OK) + { + SCSI_SenseCode(SCSI_ProcessCmd_pdev, + SCSI_ProcessCmd_lun, + NOT_READY, + MEDIUM_NOT_PRESENT); + SCSI_ProcessCmd_callback(-1); + return; + } + SCSI_ProcessCmd_hmsc->bot_state = USBD_BOT_DATA_IN; + + if (DownstreamInterface_GetStreamDataPacket(SCSI_Read10ReplyCallback) != HAL_OK) + { + SCSI_SenseCode(SCSI_ProcessCmd_pdev, + SCSI_ProcessCmd_lun, + NOT_READY, + MEDIUM_NOT_PRESENT); + SCSI_ProcessCmd_callback(-1); + } +} + + +void SCSI_Read10ReplyCallback(HAL_StatusTypeDef result, + DownstreamPacketTypeDef* downstreamPacket) +{ + if (result != HAL_OK) + { + SCSI_SenseCode(SCSI_ProcessCmd_pdev, + SCSI_ProcessCmd_lun, + HARDWARE_ERROR, + UNRECOVERED_READ_ERROR); + SCSI_ProcessCmd_callback(-1); + return; + } + + SCSI_ProcessCmd_hmsc->bot_packet = downstreamPacket; + SCSI_ProcessCmd_hmsc->bot_data = downstreamPacket->Data; + USBD_LL_Transmit (SCSI_ProcessCmd_pdev, + MSC_EPIN_ADDR, + SCSI_ProcessCmd_hmsc->bot_data, + downstreamPacket->Length); + + /* case 6 : Hi = Di */ + SCSI_ProcessCmd_hmsc->csw.dDataResidue -= downstreamPacket->Length; + + if (SCSI_ProcessCmd_hmsc->csw.dDataResidue == 0) + { + SCSI_ProcessCmd_hmsc->bot_state = USBD_BOT_LAST_DATA_IN; + } + SCSI_ProcessCmd_callback(0); +} + + /** * @brief SCSI_Write10 * Process Write10 command @@ -521,86 +666,139 @@ static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *para * @retval status */ -static int8_t SCSI_Write10 (USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *params) +static void SCSI_Write10(void) { - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*) pdev->pClassData; - - if (hmsc->bot_state == USBD_BOT_IDLE) /* Idle */ - { - - /* case 8 : Hi <> Do */ - - if ((hmsc->cbw.bmFlags & 0x80) == 0x80) - { - SCSI_SenseCode(pdev, - hmsc->cbw.bLUN, - ILLEGAL_REQUEST, - INVALID_CDB); - return -1; - } - - /* Check whether Media is ready */ - if(((USBD_StorageTypeDef *)pdev->pUserData)->IsReady(lun) !=0 ) - { - SCSI_SenseCode(pdev, - lun, - NOT_READY, - MEDIUM_NOT_PRESENT); - return -1; - } - - /* Check If media is write-protected */ - if(((USBD_StorageTypeDef *)pdev->pUserData)->IsWriteProtected(lun) !=0 ) - { - SCSI_SenseCode(pdev, - lun, - NOT_READY, - WRITE_PROTECTED); - return -1; - } - - - hmsc->scsi_blk_addr = (params[2] << 24) | \ - (params[3] << 16) | \ - (params[4] << 8) | \ - params[5]; - hmsc->scsi_blk_len = (params[7] << 8) | \ - params[8]; - - /* check if LBA address is in the right range */ - if(SCSI_CheckAddressRange(pdev, - lun, - hmsc->scsi_blk_addr, - hmsc->scsi_blk_len) < 0) - { - return -1; /* error */ - } - - hmsc->scsi_blk_addr *= hmsc->scsi_blk_size; - hmsc->scsi_blk_len *= hmsc->scsi_blk_size; - - /* cases 3,11,13 : Hn,Ho <> D0 */ - if (hmsc->cbw.dDataLength != hmsc->scsi_blk_len) - { - SCSI_SenseCode(pdev, - hmsc->cbw.bLUN, - ILLEGAL_REQUEST, - INVALID_CDB); - return -1; - } - - /* Prepare EP to receive first data packet */ - hmsc->bot_state = USBD_BOT_DATA_OUT; - USBD_LL_PrepareReceive (pdev, - MSC_EPOUT_ADDR, - hmsc->bot_data, - MIN (hmsc->scsi_blk_len, MSC_MEDIA_PACKET)); - } - else /* Write Process ongoing */ - { - return SCSI_ProcessWrite(pdev, lun); - } - return 0; + uint32_t dataLength; + + if (SCSI_ProcessCmd_hmsc->bot_state == USBD_BOT_IDLE) /* Idle */ + { + /* case 8 : Hi <> Do */ + if ((SCSI_ProcessCmd_hmsc->cbw.bmFlags & 0x80) == 0x80) + { + SCSI_SenseCode(SCSI_ProcessCmd_pdev, + SCSI_ProcessCmd_hmsc->cbw.bLUN, + ILLEGAL_REQUEST, + INVALID_CDB); + SCSI_ProcessCmd_callback(-1); + return; + } + + SCSI_ProcessCmd_hmsc->scsi_blk_addr = (SCSI_ProcessCmd_params[2] << 24) | \ + (SCSI_ProcessCmd_params[3] << 16) | \ + (SCSI_ProcessCmd_params[4] << 8) | \ + SCSI_ProcessCmd_params[5]; + SCSI_ProcessCmd_hmsc->scsi_blk_len = (SCSI_ProcessCmd_params[7] << 8) | \ + SCSI_ProcessCmd_params[8]; + + if (SCSI_CheckAddressRange(SCSI_ProcessCmd_hmsc->scsi_blk_addr, + SCSI_ProcessCmd_hmsc->scsi_blk_len) < 0) + { + SCSI_SenseCode(SCSI_ProcessCmd_pdev, + SCSI_ProcessCmd_hmsc->cbw.bLUN, + ILLEGAL_REQUEST, + INVALID_CDB); + SCSI_ProcessCmd_callback(-1); /* error */ + return; + } + + /* cases 3,11,13 : Hn,Ho <> D0 */ + if (SCSI_ProcessCmd_hmsc->cbw.dDataLength != (uint32_t)(SCSI_ProcessCmd_hmsc->scsi_blk_len * SCSI_ProcessCmd_hmsc->scsi_blk_size)) + { + SCSI_SenseCode(SCSI_ProcessCmd_pdev, + SCSI_ProcessCmd_hmsc->cbw.bLUN, + ILLEGAL_REQUEST, + INVALID_CDB); + SCSI_ProcessCmd_callback(-1); + return; + } + + if (DownstreamInterface_BeginWrite(SCSI_Write10BeginCallback, + SCSI_ProcessCmd_hmsc->scsi_blk_addr, + SCSI_ProcessCmd_hmsc->scsi_blk_len) != HAL_OK) + { + SCSI_Write10BeginCallback(HAL_ERROR); + } + return; + } + + + //hmsc->bot_state is already USBD_BOT_DATA_OUT + dataLength = MIN(SCSI_ProcessCmd_hmsc->csw.dDataResidue, MSC_MEDIA_PACKET); + if (DownstreamInterface_PutStreamDataPacket(SCSI_ProcessCmd_hmsc->bot_packet, + dataLength) != HAL_OK) + { + SCSI_SenseCode(SCSI_ProcessCmd_pdev, + SCSI_ProcessCmd_lun, + HARDWARE_ERROR, + WRITE_FAULT); + SCSI_ProcessCmd_callback(-1); + return; + } + + SCSI_ProcessCmd_hmsc->csw.dDataResidue -= dataLength; + if (SCSI_ProcessCmd_hmsc->csw.dDataResidue == 0) + { + MSC_BOT_SendCSW (SCSI_ProcessCmd_pdev, USBD_CSW_CMD_PASSED); + SCSI_ProcessCmd_callback(0); + return; + } + + /* Prepare EP to Receive next packet */ + if (Downstream_GetFreePacket(SCSI_Write10FreePacketCallback) != HAL_OK) + { + SCSI_SenseCode(SCSI_ProcessCmd_pdev, + SCSI_ProcessCmd_lun, + NOT_READY, + MEDIUM_NOT_PRESENT); + SCSI_ProcessCmd_callback(-1); + } +} + + +void SCSI_Write10BeginCallback(HAL_StatusTypeDef result) +{ + if (result == HAL_BUSY) + { + SCSI_SenseCode(SCSI_ProcessCmd_pdev, + SCSI_ProcessCmd_lun, + NOT_READY, + WRITE_PROTECTED); + SCSI_ProcessCmd_callback(-1); + return; + } + if (result != HAL_OK) + { + SCSI_SenseCode(SCSI_ProcessCmd_pdev, + SCSI_ProcessCmd_lun, + NOT_READY, + MEDIUM_NOT_PRESENT); + SCSI_ProcessCmd_callback(-1); + return; + } + + /* Prepare EP to receive first data packet */ + SCSI_ProcessCmd_hmsc->bot_state = USBD_BOT_DATA_OUT; + if (Downstream_GetFreePacket(SCSI_Write10FreePacketCallback) != HAL_OK) + { + SCSI_SenseCode(SCSI_ProcessCmd_pdev, + SCSI_ProcessCmd_lun, + NOT_READY, + MEDIUM_NOT_PRESENT); + SCSI_ProcessCmd_callback(-1); + } +} + + +void SCSI_Write10FreePacketCallback(DownstreamPacketTypeDef* freePacket) +{ + SCSI_ProcessCmd_hmsc->bot_packet = freePacket; + SCSI_ProcessCmd_hmsc->bot_data = freePacket->Data; + + USBD_LL_PrepareReceive (SCSI_ProcessCmd_pdev, + MSC_EPOUT_ADDR, + SCSI_ProcessCmd_hmsc->bot_data, + MIN(SCSI_ProcessCmd_hmsc->csw.dDataResidue, MSC_MEDIA_PACKET)); + SCSI_ProcessCmd_callback(0); //Report eventual success! } @@ -612,28 +810,26 @@ static int8_t SCSI_Write10 (USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *pa * @retval status */ -static int8_t SCSI_Verify10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *params) +static void SCSI_Verify10(void) { - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*) pdev->pClassData; - - if ((params[1]& 0x02) == 0x02) + if ((SCSI_ProcessCmd_params[1]& 0x02) == 0x02) { - SCSI_SenseCode (pdev, - lun, + SCSI_SenseCode (SCSI_ProcessCmd_pdev, + SCSI_ProcessCmd_lun, ILLEGAL_REQUEST, - INVALID_FIELED_IN_COMMAND); - return -1; /* Error, Verify Mode Not supported*/ + INVALID_FIELD_IN_COMMAND); + SCSI_ProcessCmd_callback(-1); /* Error, Verify Mode Not supported*/ + return; } - if(SCSI_CheckAddressRange(pdev, - lun, - hmsc->scsi_blk_addr, - hmsc->scsi_blk_len) < 0) + if(SCSI_CheckAddressRange(SCSI_ProcessCmd_hmsc->scsi_blk_addr, + SCSI_ProcessCmd_hmsc->scsi_blk_len) < 0) { - return -1; /* error */ + SCSI_ProcessCmd_callback(-1); /* error */ + return; } - hmsc->bot_data_length = 0; - return 0; + SCSI_ProcessCmd_hmsc->bot_data_length = 0; + SCSI_ProcessCmd_callback(0); } /** @@ -644,14 +840,12 @@ static int8_t SCSI_Verify10(USBD_HandleTypeDef *pdev, uint8_t lun , uint8_t *pa * @param blk_nbr: number of block to be processed * @retval status */ -static int8_t SCSI_CheckAddressRange (USBD_HandleTypeDef *pdev, uint8_t lun , uint32_t blk_offset , uint16_t blk_nbr) +static int8_t SCSI_CheckAddressRange (uint32_t blk_offset , uint16_t blk_nbr) { - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*) pdev->pClassData; - - if ((blk_offset + blk_nbr) > hmsc->scsi_blk_nbr ) + if ((blk_offset + blk_nbr) > SCSI_ProcessCmd_hmsc->scsi_blk_nbr ) { - SCSI_SenseCode(pdev, - lun, + SCSI_SenseCode(SCSI_ProcessCmd_pdev, + SCSI_ProcessCmd_lun, ILLEGAL_REQUEST, ADDRESS_OUT_OF_RANGE); return -1; @@ -659,110 +853,6 @@ static int8_t SCSI_CheckAddressRange (USBD_HandleTypeDef *pdev, uint8_t lun , u return 0; } -/** -* @brief SCSI_ProcessRead -* Handle Read Process -* @param lun: Logical unit number -* @retval status -*/ -static int8_t SCSI_ProcessRead (USBD_HandleTypeDef *pdev, uint8_t lun) -{ - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*)pdev->pClassData; - uint32_t len; - - len = MIN(hmsc->scsi_blk_len , MSC_MEDIA_PACKET); - - if( ((USBD_StorageTypeDef *)pdev->pUserData)->Read(lun , - hmsc->bot_data, - hmsc->scsi_blk_addr / hmsc->scsi_blk_size, - len / hmsc->scsi_blk_size) < 0) - { - - SCSI_SenseCode(pdev, - lun, - HARDWARE_ERROR, - UNRECOVERED_READ_ERROR); - return -1; - } - - - USBD_LL_Transmit (pdev, - MSC_EPIN_ADDR, - hmsc->bot_data, - len); - - - hmsc->scsi_blk_addr += len; - hmsc->scsi_blk_len -= len; - - /* case 6 : Hi = Di */ - hmsc->csw.dDataResidue -= len; - - if (hmsc->scsi_blk_len == 0) - { - hmsc->bot_state = USBD_BOT_LAST_DATA_IN; - } - return 0; -} - -/** -* @brief SCSI_ProcessWrite -* Handle Write Process -* @param lun: Logical unit number -* @retval status -*/ - -static int8_t SCSI_ProcessWrite (USBD_HandleTypeDef *pdev, uint8_t lun) -{ - uint32_t len; - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef*) pdev->pClassData; - - len = MIN(hmsc->scsi_blk_len , MSC_MEDIA_PACKET); - - if(((USBD_StorageTypeDef *)pdev->pUserData)->Write(lun , - hmsc->bot_data, - hmsc->scsi_blk_addr / hmsc->scsi_blk_size, - len / hmsc->scsi_blk_size) < 0) - { - SCSI_SenseCode(pdev, - lun, - HARDWARE_ERROR, - WRITE_FAULT); - return -1; - } - - - hmsc->scsi_blk_addr += len; - hmsc->scsi_blk_len -= len; - - /* case 12 : Ho = Do */ - hmsc->csw.dDataResidue -= len; - - if (hmsc->scsi_blk_len == 0) - { - MSC_BOT_SendCSW (pdev, USBD_CSW_CMD_PASSED); - } - else - { - /* Prepare EP to Receive next packet */ - USBD_LL_PrepareReceive (pdev, - MSC_EPOUT_ADDR, - hmsc->bot_data, - MIN (hmsc->scsi_blk_len, MSC_MEDIA_PACKET)); - } - - return 0; -} -/** - * @} - */ - - -/** - * @} - */ - - /** * @} */ diff --git a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h index f98d011..230b513 100755 --- a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h +++ b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_core.h @@ -34,7 +34,7 @@ #endif /* Includes ------------------------------------------------------------------*/ -#include "usbd_conf.h" +#include #include "usbd_def.h" #include "usbd_ioreq.h" #include "usbd_ctlreq.h" @@ -80,7 +80,7 @@ /** @defgroup USBD_CORE_Exported_Variables * @{ */ -#define USBD_SOF USBD_LL_SOF + /** * @} */ @@ -98,21 +98,24 @@ USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev); USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup); -USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata); -USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata); +USBD_StatusTypeDef USBD_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup); +USBD_StatusTypeDef USBD_DataOutStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata); +USBD_StatusTypeDef USBD_DataInStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata); + +USBD_StatusTypeDef USBD_Reset(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed); +USBD_StatusTypeDef USBD_Suspend(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_Resume(USBD_HandleTypeDef *pdev); + +USBD_StatusTypeDef USBD_SOF(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); +USBD_StatusTypeDef USBD_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); -USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed); -USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_DevConnected(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_DevDisconnected(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); -USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); +USBD_StatusTypeDef USBD_BufferFreed(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev); /* USBD Low Level Driver */ USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev); diff --git a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h index 28a1d5e..75f7049 100755 --- a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h +++ b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Core/Inc/usbd_def.h @@ -34,7 +34,7 @@ #endif /* Includes ------------------------------------------------------------------*/ -#include "usbd_conf.h" +#include /** @addtogroup STM32_USBD_DEVICE_LIBRARY * @{ @@ -169,7 +169,9 @@ typedef struct _Device_cb uint8_t (*DataOut) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); uint8_t (*SOF) (struct _USBD_HandleTypeDef *pdev); uint8_t (*IsoINIncomplete) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); - uint8_t (*IsoOUTIncomplete) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); + uint8_t (*IsoOUTIncomplete) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); + + uint8_t (*FreeDataBuffer) (struct _USBD_HandleTypeDef *pdev); uint8_t *(*GetHSConfigDescriptor)(uint16_t *length); uint8_t *(*GetFSConfigDescriptor)(uint16_t *length); diff --git a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c index 1e6d766..0a8890f 100755 --- a/Upstream/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c +++ b/Upstream/Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c @@ -260,7 +260,7 @@ USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) +USBD_StatusTypeDef USBD_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) { USBD_ParseSetupRequest(&pdev->request, psetup); @@ -296,7 +296,7 @@ USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) * @param epnum: endpoint index * @retval status */ -USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata) +USBD_StatusTypeDef USBD_DataOutStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata) { USBD_EndpointTypeDef *pep; @@ -340,7 +340,7 @@ USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev , uint8_t epnum * @param epnum: endpoint index * @retval status */ -USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev ,uint8_t epnum, uint8_t *pdata) +USBD_StatusTypeDef USBD_DataInStage(USBD_HandleTypeDef *pdev ,uint8_t epnum, uint8_t *pdata) { USBD_EndpointTypeDef *pep; @@ -394,13 +394,13 @@ USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev ,uint8_t epnum, } /** -* @brief USBD_LL_Reset +* @brief USBD_Reset * Handle Reset event * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_Reset(USBD_HandleTypeDef *pdev) { /* Open EP0 OUT */ USBD_LL_OpenEP(pdev, @@ -431,12 +431,12 @@ USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) /** -* @brief USBD_LL_Reset +* @brief USBD_SetSpeed * Handle Reset event * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed) +USBD_StatusTypeDef USBD_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed) { pdev->dev_speed = speed; return USBD_OK; @@ -449,7 +449,7 @@ USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef * @retval status */ -USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_Suspend(USBD_HandleTypeDef *pdev) { pdev->dev_old_state = pdev->dev_state; pdev->dev_state = USBD_STATE_SUSPENDED; @@ -463,7 +463,7 @@ USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) * @retval status */ -USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_Resume(USBD_HandleTypeDef *pdev) { pdev->dev_state = pdev->dev_old_state; return USBD_OK; @@ -476,7 +476,7 @@ USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) * @retval status */ -USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_SOF(USBD_HandleTypeDef *pdev) { if(pdev->dev_state == USBD_STATE_CONFIGURED) { @@ -494,7 +494,7 @@ USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) +USBD_StatusTypeDef USBD_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) { return USBD_OK; } @@ -505,7 +505,7 @@ USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t ep * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) +USBD_StatusTypeDef USBD_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) { return USBD_OK; } @@ -516,7 +516,7 @@ USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t e * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_DevConnected(USBD_HandleTypeDef *pdev) { return USBD_OK; } @@ -527,7 +527,7 @@ USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_DevDisconnected(USBD_HandleTypeDef *pdev) { /* Free Class Resources */ pdev->dev_state = USBD_STATE_DEFAULT; @@ -535,6 +535,12 @@ USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev) return USBD_OK; } + +USBD_StatusTypeDef USBD_BufferFreed(USBD_HandleTypeDef *pdev) +{ + pdev->pClass->FreeDataBuffer(pdev); + return USBD_OK; +} /** * @} */ diff --git a/Upstream/Src/downstream_interface_msc.c b/Upstream/Src/downstream_interface_msc.c new file mode 100644 index 0000000..4e7d347 --- /dev/null +++ b/Upstream/Src/downstream_interface_msc.c @@ -0,0 +1,228 @@ +/* + * downstream_interface_msc.c + * + * Created on: 4/07/2015 + * Author: Robert Fisk + */ + + +#include "stm32f4xx_hal.h" +#include "downstream_interface_msc.h" +#include "downstream_interface_def.h" +#include "downstream_spi.h" + + +//Stuff we need to save for our callbacks to use: +DownstreamInterfaceMSCCallbackTypeDef TestReadyCallback; +DownstreamInterfaceMSCCallbackUintPacketTypeDef GetCapacityCallback; +DownstreamInterfaceMSCCallbackPacketTypeDef GetStreamDataCallback; +uint64_t BlockStart; +uint32_t BlockCount; +uint32_t ByteCount; +DownstreamPacketTypeDef* ReadStreamPacket; + + +static void DownstreamInterface_TestReadyReplyCallback(DownstreamPacketTypeDef* replyPacket); +static void DownstreamInterface_GetCapacityReplyCallback(DownstreamPacketTypeDef* replyPacket); +static void DownstreamInterface_GetStreamDataPacketCallback(DownstreamPacketTypeDef* replyPacket); +static void DownstreamInterface_BeginWriteReplyCallback(DownstreamPacketTypeDef* replyPacket); + + + +HAL_StatusTypeDef DownstreamInterface_TestReady(DownstreamInterfaceMSCCallbackTypeDef callback) +{ + DownstreamPacketTypeDef* freePacket; + HAL_StatusTypeDef tempResult; + + TestReadyCallback = callback; + freePacket = Downstream_GetFreePacketImmediately(); + + freePacket->Length = DOWNSTREAM_PACKET_HEADER_LEN; + freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; + freePacket->Command = COMMAND_MSC_TEST_UNIT_READY; + tempResult = Downstream_SendPacket(freePacket); + if (tempResult != HAL_OK) + { + return tempResult; + } + return Downstream_GetPacket(DownstreamInterface_TestReadyReplyCallback); +} + +void DownstreamInterface_TestReadyReplyCallback(DownstreamPacketTypeDef* replyPacket) +{ + if ((replyPacket->Length != (DOWNSTREAM_PACKET_HEADER_LEN + 1)) || + (replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG) || + (replyPacket->Data[0] != HAL_OK)) + { + Downstream_ReleasePacket(replyPacket); + TestReadyCallback(HAL_ERROR); + } + else + { + Downstream_ReleasePacket(replyPacket); + TestReadyCallback(HAL_OK); + } +} + + + +HAL_StatusTypeDef DownstreamInterface_GetCapacity(DownstreamInterfaceMSCCallbackUintPacketTypeDef callback) +{ + DownstreamPacketTypeDef* freePacket; + HAL_StatusTypeDef tempResult; + + GetCapacityCallback = callback; + freePacket = Downstream_GetFreePacketImmediately(); + + freePacket->Length = DOWNSTREAM_PACKET_HEADER_LEN; + freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; + freePacket->Command = COMMAND_MSC_GET_CAPACITY; + tempResult = Downstream_SendPacket(freePacket); + if (tempResult != HAL_OK) + { + return tempResult; + } + return Downstream_GetPacket(DownstreamInterface_GetCapacityReplyCallback); +} + +void DownstreamInterface_GetCapacityReplyCallback(DownstreamPacketTypeDef* replyPacket) +{ + uint32_t uint[2]; + + if ((replyPacket->Length != (DOWNSTREAM_PACKET_HEADER_LEN + 8) || + (replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG))) + { + GetCapacityCallback(HAL_ERROR, NULL, NULL); + } + uint[0] = (uint32_t)(replyPacket->Data[0]); + uint[1] = (uint32_t)(replyPacket->Data[1]); + GetCapacityCallback(HAL_OK, uint, replyPacket); //usb_msc_scsi will use this packet, so don't release now +} + + + + +HAL_StatusTypeDef DownstreamInterface_BeginRead(DownstreamInterfaceMSCCallbackTypeDef callback, + uint64_t readBlockStart, + uint32_t readBlockCount, + uint32_t readByteCount) +{ + DownstreamPacketTypeDef* freePacket; + HAL_StatusTypeDef tempResult; + uint64_t* workDammit; + uint32_t* prettyPlease; + + ReadStreamPacket = NULL; //Prepare for GetStreamDataPacket's use + + TestReadyCallback = callback; + BlockStart = readBlockStart; + BlockCount = readBlockCount; + ByteCount = readByteCount; + freePacket = Downstream_GetFreePacketImmediately(); + + freePacket->Length = DOWNSTREAM_PACKET_HEADER_LEN + (4 * 3); + freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; + freePacket->Command = COMMAND_MSC_BEGIN_READ; + workDammit = (uint64_t*)&(freePacket->Data[0]); + *workDammit = BlockStart; + prettyPlease = (uint32_t*)&(freePacket->Data[8]); + *prettyPlease = BlockCount; + tempResult = Downstream_SendPacket(freePacket); + if (tempResult != HAL_OK) + { + TestReadyCallback(tempResult); + } + return Downstream_GetPacket(DownstreamInterface_TestReadyReplyCallback); //Re-use TestReadyReplyCallback because it does exactly what we want! +} + + +HAL_StatusTypeDef DownstreamInterface_GetStreamDataPacket(DownstreamInterfaceMSCCallbackPacketTypeDef callback) +{ + GetStreamDataCallback = callback; + + //We have a callback address. Do we have a stored packet? + if (ReadStreamPacket) + { + DownstreamInterface_GetStreamDataPacketCallback(ReadStreamPacket); //Send it now! + ReadStreamPacket = NULL; + GetStreamDataCallback = NULL; //We have used up our callback, so mark it empty. + } + return Downstream_GetPacket(DownstreamInterface_GetStreamDataPacketCallback); +} + +void DownstreamInterface_GetStreamDataPacketCallback(DownstreamPacketTypeDef* replyPacket) +{ + if (GetStreamDataCallback == NULL) + { + ReadStreamPacket = replyPacket; //We used up our callback already, so save this one for later. + return; + } + + if (((replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG) == 0) || //Any 'command' reply (as opposed to 'data' reply) is an automatic fail here + (replyPacket->Length <= DOWNSTREAM_PACKET_HEADER_LEN) || //Should be at least one data byte in the reply. + (replyPacket->Length > ByteCount)) + { + GetStreamDataCallback(HAL_ERROR, NULL); + } + else + { + ByteCount -= replyPacket->Length; + GetStreamDataCallback(HAL_OK, replyPacket); //usb_msc_scsi will use this packet, so don't release now + } +} + + +HAL_StatusTypeDef DownstreamInterface_BeginWrite(DownstreamInterfaceMSCCallbackTypeDef callback, + uint64_t readBlockStart, + uint32_t readBlockCount) +{ + DownstreamPacketTypeDef* freePacket; + HAL_StatusTypeDef tempResult; + uint64_t* workDammit; + uint32_t* prettyPlease; + + TestReadyCallback = callback; + BlockStart = readBlockStart; + BlockCount = readBlockCount; + freePacket = Downstream_GetFreePacketImmediately(); + + freePacket->Length = DOWNSTREAM_PACKET_HEADER_LEN + (4 * 3); + freePacket->CommandClass = COMMAND_CLASS_MASS_STORAGE; + freePacket->Command = COMMAND_MSC_BEGIN_WRITE; + workDammit = (uint64_t*)&(freePacket->Data[0]); + *workDammit = BlockStart; + prettyPlease = (uint32_t*)&(freePacket->Data[8]); + *prettyPlease = BlockCount; + tempResult = Downstream_SendPacket(freePacket); + if (tempResult != HAL_OK) + { + TestReadyCallback(tempResult); + } + return Downstream_GetPacket(DownstreamInterface_BeginWriteReplyCallback); +} + +void DownstreamInterface_BeginWriteReplyCallback(DownstreamPacketTypeDef* replyPacket) +{ + if ((replyPacket->Length != (DOWNSTREAM_PACKET_HEADER_LEN + 1)) || + (replyPacket->CommandClass & COMMAND_CLASS_DATA_FLAG) || + ((replyPacket->Data[0] != HAL_OK) && (replyPacket->Data[0] != HAL_BUSY))) + { + Downstream_ReleasePacket(replyPacket); + TestReadyCallback(HAL_ERROR); + } + else + { + Downstream_ReleasePacket(replyPacket); + TestReadyCallback(replyPacket->Data[0]); + } +} + + +HAL_StatusTypeDef DownstreamInterface_PutStreamDataPacket(DownstreamPacketTypeDef* packetToSend, + uint32_t dataLength) +{ + packetToSend->Length = dataLength + DOWNSTREAM_PACKET_HEADER_LEN; + packetToSend->CommandClass = COMMAND_CLASS_MASS_STORAGE | COMMAND_CLASS_DATA_FLAG; + packetToSend->Command = COMMAND_MSC_BEGIN_WRITE; + return Downstream_SendPacket(packetToSend); +} diff --git a/Upstream/Src/downstream_spi.c b/Upstream/Src/downstream_spi.c new file mode 100644 index 0000000..9fc81bc --- /dev/null +++ b/Upstream/Src/downstream_spi.c @@ -0,0 +1,429 @@ +/* + * downstream_spi.c + * + * Created on: 21/06/2015 + * Author: Robert Fisk + */ + +#include +#include "downstream_interface_def.h" +#include "stm32f4xx_hal.h" +#include "usbd_def.h" +#include "board_config.h" + + + +SPI_HandleTypeDef hspi1; +DownstreamPacketTypeDef DownstreamPacket0; +DownstreamPacketTypeDef DownstreamPacket1; +DownstreamPacketTypeDef* CurrentWorkingPacket; +DownstreamPacketTypeDef* NextTxPacket; //Indicates we have a pending TX packet + +InterfaceStateTypeDef DownstreamInterfaceState; +FreePacketCallbackTypeDef PendingFreePacketCallback; //Indicates someone is waiting for a packet buffer to become available +SpiPacketReceivedCallbackTypeDef ReceivePacketCallback; //Indicates someone is waiting for a received packet + +uint8_t SentCommandClass; +uint8_t SentCommand; + + +static void SPI1_Init(void); +static HAL_StatusTypeDef Downstream_CheckBeginPacketReception(void); +static void Downstream_BeginPacketReception(DownstreamPacketTypeDef* freePacket); + + + +void Downstream_InitInterface(void) +{ + DownstreamInterfaceState = INTERFACE_STATE_RESET; + + SPI1_Init(); + DownstreamPacket0.Busy = NOT_BUSY; + DownstreamPacket1.Busy = NOT_BUSY; + NextTxPacket = NULL; + PendingFreePacketCallback = NULL; + ReceivePacketCallback = NULL; + + //Todo: check connection to downstream, await client USB insertion + + while (!DOWNSTREAM_TX_OK_ACTIVE); + DownstreamInterfaceState = INTERFACE_STATE_IDLE; +} + + +void SPI1_Init(void) +{ + hspi1.Instance = SPI1; + hspi1.State = HAL_SPI_STATE_RESET; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_8BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.NSS = SPI_NSS_SOFT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; //42MHz APB2 / 32 = 1.3Mbaud + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLED; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_ENABLED; + hspi1.Init.CRCPolynomial = SPI_CRC_DEFAULTPOLYNOMIAL; + HAL_SPI_Init(&hspi1); +} + + + +//Used by USB interface classes, and by our internal RX code. +HAL_StatusTypeDef Downstream_GetFreePacket(FreePacketCallbackTypeDef callback) +{ + //Sanity checks + if ((DownstreamInterfaceState < INTERFACE_STATE_IDLE) || + (DownstreamInterfaceState > INTERFACE_STATE_RX_PACKET)) + { + SPI_INTERFACE_FREAKOUT_HAL_ERROR; + } + + //Do we already have a queued callback? + if (PendingFreePacketCallback != NULL) + { + SPI_INTERFACE_FREAKOUT_HAL_ERROR; + } + + //Check if there is a free buffer now + if (DownstreamPacket0.Busy == NOT_BUSY) + { + DownstreamPacket0.Busy = BUSY; + callback(&DownstreamPacket0); + return HAL_OK; + } + if (DownstreamPacket1.Busy == NOT_BUSY) + { + DownstreamPacket1.Busy = BUSY; + callback(&DownstreamPacket1); + return HAL_OK; + } + + //Otherwise save requested address for when a buffer becomes free in the future + PendingFreePacketCallback = callback; + return HAL_OK; +} + + +DownstreamPacketTypeDef* Downstream_GetFreePacketImmediately(void) +{ + //Sanity checks + if ((DownstreamInterfaceState < INTERFACE_STATE_IDLE) || + (DownstreamInterfaceState > INTERFACE_STATE_RX_PACKET)) + { + SPI_INTERFACE_FREAKOUT_HAL_ERROR; + } + + //We are expecting a free buffer now + if (DownstreamPacket0.Busy == NOT_BUSY) + { + DownstreamPacket0.Busy = BUSY; + return &DownstreamPacket0; + } + if (DownstreamPacket1.Busy == NOT_BUSY) + { + DownstreamPacket1.Busy = BUSY; + return &DownstreamPacket1; + } + + //Should not happen: + SPI_INTERFACE_FREAKOUT_HAL_ERROR; +} + + +//Used by USB interface classes, and by our internal RX code. +void Downstream_ReleasePacket(DownstreamPacketTypeDef* packetToRelease) +{ + if (PendingFreePacketCallback != NULL) + { + PendingFreePacketCallback(packetToRelease); + PendingFreePacketCallback = NULL; + } + else + { + packetToRelease->Busy = NOT_BUSY; + } +} + + +//Used by USB interface classes only. +//OK to call when still transmitting another packet. +//Not OK to call when receiving or waiting for downstream reply. +HAL_StatusTypeDef Downstream_SendPacket(DownstreamPacketTypeDef* packetToWrite) +{ + //Sanity checks + if ((packetToWrite != &DownstreamPacket0) && + (packetToWrite != &DownstreamPacket1)) + { + SPI_INTERFACE_FREAKOUT_HAL_ERROR; + } + if ((packetToWrite->Busy != BUSY) || + (packetToWrite->Length < DOWNSTREAM_PACKET_LEN_MIN) || + (packetToWrite->Length > DOWNSTREAM_PACKET_LEN)) + { + SPI_INTERFACE_FREAKOUT_HAL_ERROR; + } + + //Cancel any outstanding receive request + ReceivePacketCallback = NULL; + + switch (DownstreamInterfaceState) + { + case INTERFACE_STATE_TX_SIZE_WAIT: + case INTERFACE_STATE_TX_SIZE: + case INTERFACE_STATE_TX_PACKET_WAIT: + case INTERFACE_STATE_TX_PACKET: + if (NextTxPacket != NULL) + { + SPI_INTERFACE_FREAKOUT_HAL_ERROR; + } + NextTxPacket = packetToWrite; + break; + + case INTERFACE_STATE_RX_SIZE_WAIT: + case INTERFACE_STATE_RX_SIZE: + case INTERFACE_STATE_RX_PACKET_WAIT: + case INTERFACE_STATE_RX_PACKET: + //We can't let the size/packet sequence get out of sync. + SPI_INTERFACE_FREAKOUT_HAL_ERROR; + + case INTERFACE_STATE_IDLE: + DownstreamInterfaceState = INTERFACE_STATE_TX_SIZE_WAIT; + CurrentWorkingPacket = packetToWrite; + SentCommandClass = CurrentWorkingPacket->CommandClass; + SentCommand = CurrentWorkingPacket->Command; + if (DOWNSTREAM_TX_OK_ACTIVE) + { + Downstream_TxOkInterrupt(); //Manually trigger edge interrupt processing if the line was already asserted + } + break; + + default: + SPI_INTERFACE_FREAKOUT_HAL_ERROR; + } + return HAL_OK; +} + + + +//Called at the end of the SPI TX DMA transfer, +//at DMA2 interrupt priority. Assume *hspi points to our hspi1. +void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) +{ + SPI1_NSS_DEASSERT; + + if ((DownstreamInterfaceState != INTERFACE_STATE_TX_SIZE) && + (DownstreamInterfaceState != INTERFACE_STATE_TX_PACKET)) + { + SPI_INTERFACE_FREAKOUT_VOID; + } + + if (DownstreamInterfaceState == INTERFACE_STATE_TX_SIZE) + { + DownstreamInterfaceState = INTERFACE_STATE_TX_PACKET_WAIT; + if (DOWNSTREAM_TX_OK_ACTIVE) + { + Downstream_TxOkInterrupt(); + } + return; + } + + if (DownstreamInterfaceState == INTERFACE_STATE_TX_PACKET) + { + if ((PendingFreePacketCallback != NULL) && (NextTxPacket == NULL)) + { + SPI_INTERFACE_FREAKOUT_VOID; + } + + Downstream_ReleasePacket(CurrentWorkingPacket); + if (NextTxPacket != NULL) + { + //NextTxPacket has already passed the checks in SendDownstreamPacket. + //So we just need to pass it to HAL_SPI_Transmit_DMA. + DownstreamInterfaceState = INTERFACE_STATE_TX_SIZE_WAIT; + CurrentWorkingPacket = NextTxPacket; + NextTxPacket = NULL; + if (DOWNSTREAM_TX_OK_ACTIVE) + { + Downstream_TxOkInterrupt(); + } + return; + } + + DownstreamInterfaceState = INTERFACE_STATE_IDLE; + if (ReceivePacketCallback != NULL) + { + Downstream_CheckBeginPacketReception(); + } + } +} + + +//Used by USB interface classes. +//Ok to call when transmitting, receiving, or waiting for downstream. +HAL_StatusTypeDef Downstream_GetPacket(SpiPacketReceivedCallbackTypeDef callback) +{ + if (ReceivePacketCallback != NULL) + { + SPI_INTERFACE_FREAKOUT_HAL_ERROR; + } + + ReceivePacketCallback = callback; + return Downstream_CheckBeginPacketReception(); +} + + +//Internal use only. +HAL_StatusTypeDef Downstream_CheckBeginPacketReception(void) +{ + if ((DownstreamInterfaceState < INTERFACE_STATE_IDLE) || + (DownstreamInterfaceState > INTERFACE_STATE_RX_PACKET)) + { + SPI_INTERFACE_FREAKOUT_HAL_ERROR; + } + + if (DownstreamInterfaceState == INTERFACE_STATE_IDLE) + { + DownstreamInterfaceState = INTERFACE_STATE_RX_SIZE_WAIT; + } + + if (DownstreamInterfaceState == INTERFACE_STATE_RX_SIZE_WAIT) + { + if (DOWNSTREAM_TX_OK_ACTIVE) + { + //DownstreamTxOkInterrupt(); + Downstream_GetFreePacket(Downstream_BeginPacketReception); //Take a shortcut here :) + } + } + return HAL_OK; +} + + +//This is called by EXTI3 falling edge interrupt, +//indicating that downstream is ready for next transaction. +void Downstream_TxOkInterrupt(void) +{ + switch (DownstreamInterfaceState) + { + case INTERFACE_STATE_TX_SIZE_WAIT: + DownstreamInterfaceState = INTERFACE_STATE_TX_SIZE; + SPI1_NSS_ASSERT; + if (HAL_SPI_Transmit_DMA(&hspi1, + (uint8_t*)&CurrentWorkingPacket->Length, + 2) != HAL_OK) + { + SPI_INTERFACE_FREAKOUT_VOID; + } + break; + + case INTERFACE_STATE_TX_PACKET_WAIT: + DownstreamInterfaceState = INTERFACE_STATE_TX_PACKET; + SPI1_NSS_ASSERT; + if ((HAL_SPI_Transmit_DMA(&hspi1, + &CurrentWorkingPacket->CommandClass, + CurrentWorkingPacket->Length)) != HAL_OK) + { + SPI_INTERFACE_FREAKOUT_VOID; + } + break; + + case INTERFACE_STATE_RX_SIZE_WAIT: + Downstream_GetFreePacket(Downstream_BeginPacketReception); + break; + + case INTERFACE_STATE_RX_PACKET_WAIT: + DownstreamInterfaceState = INTERFACE_STATE_RX_PACKET; + SPI1_NSS_ASSERT; + if ((HAL_SPI_Receive_DMA(&hspi1, + &CurrentWorkingPacket->CommandClass, + (CurrentWorkingPacket->Length + 1))) != HAL_OK) //"When the CRC feature is enabled the pData Length must be Size + 1" + { + SPI_INTERFACE_FREAKOUT_VOID; + } + break; + + default: + SPI_INTERFACE_FREAKOUT_VOID; + } +} + + +//Internal use only. +//Called when we want to receive downstream packet, and a packet buffer has become free. +void Downstream_BeginPacketReception(DownstreamPacketTypeDef* freePacket) +{ + if (DownstreamInterfaceState != INTERFACE_STATE_RX_SIZE_WAIT) + { + SPI_INTERFACE_FREAKOUT_VOID; + } + DownstreamInterfaceState = INTERFACE_STATE_RX_SIZE; + CurrentWorkingPacket = freePacket; + CurrentWorkingPacket->Length = 0; //Our RX buffer is used by HAL_SPI_Receive_DMA as dummy TX data, we set Length to 0 so downstream will know this is a dummy packet. + SPI1_NSS_ASSERT; + if (HAL_SPI_Receive_DMA(&hspi1, + (uint8_t*)&CurrentWorkingPacket->Length, + (2 + 1)) != HAL_OK) //"When the CRC feature is enabled the pData Length must be Size + 1" + { + SPI_INTERFACE_FREAKOUT_VOID; + } +} + + +//Called at the end of the SPI TX DMA transfer, +//at DMA2 interrupt priority. Assume *hspi points to our hspi1. +void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) +{ + SpiPacketReceivedCallbackTypeDef tempPacketCallback; + + SPI1_NSS_DEASSERT; + + if ((DownstreamInterfaceState != INTERFACE_STATE_RX_SIZE) && + (DownstreamInterfaceState != INTERFACE_STATE_RX_PACKET)) + { + SPI_INTERFACE_FREAKOUT_VOID; + } + + if (DownstreamInterfaceState == INTERFACE_STATE_RX_SIZE) + { + if ((CurrentWorkingPacket->Length < DOWNSTREAM_PACKET_LEN_MIN) || + (CurrentWorkingPacket->Length > DOWNSTREAM_PACKET_LEN)) + { + SPI_INTERFACE_FREAKOUT_VOID; + } + DownstreamInterfaceState = INTERFACE_STATE_RX_PACKET_WAIT; + if (DOWNSTREAM_TX_OK_ACTIVE) + { + Downstream_TxOkInterrupt(); + } + return; + } + + if (DownstreamInterfaceState == INTERFACE_STATE_RX_PACKET) + { + DownstreamInterfaceState = INTERFACE_STATE_IDLE; + if ((SentCommandClass != (CurrentWorkingPacket->CommandClass & COMMAND_CLASS_MASK)) || + (SentCommand != CurrentWorkingPacket->Command)) + { + SPI_INTERFACE_FREAKOUT_VOID; + } + if (ReceivePacketCallback == NULL) + { + SPI_INTERFACE_FREAKOUT_VOID; + } + //USB interface may want to receive another packet immediately, + //so clear ReceivePacketCallback before the call. + //It is the callback's responsibility to release the packet buffer we are passing to it! + tempPacketCallback = ReceivePacketCallback; + ReceivePacketCallback = NULL; + tempPacketCallback(CurrentWorkingPacket); + } +} + + +//Something bad happened! Possibly CRC error... +void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) +{ + SPI_INTERFACE_FREAKOUT_VOID; +} diff --git a/Upstream/Src/hal_msp.c b/Upstream/Src/hal_msp.c index b362508..1e3faae 100755 --- a/Upstream/Src/hal_msp.c +++ b/Upstream/Src/hal_msp.c @@ -35,64 +35,26 @@ /* Includes ------------------------------------------------------------------*/ #include "stm32f4xx_hal.h" #include "interrupts.h" +#include "board_config.h" -/* USER CODE BEGIN 0 */ -/* USER CODE END 0 */ +DMA_HandleTypeDef spiTxDmaHandle; +DMA_HandleTypeDef spiRxDmaHandle; + /** * Initializes the Global MSP. */ void HAL_MspInit(void) { - /* USER CODE BEGIN MspInit 0 */ - - /* USER CODE END MspInit 0 */ - // HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); // // /* System interrupt init*/ ///* SysTick_IRQn interrupt configuration */ HAL_NVIC_SetPriority(SysTick_IRQn, INT_PRIORITY_SYSTICK, 0); - /* USER CODE BEGIN MspInit 1 */ - - /* USER CODE END MspInit 1 */ } -void HAL_CRC_MspInit(CRC_HandleTypeDef* hcrc) -{ - - if(hcrc->Instance==CRC) - { - /* USER CODE BEGIN CRC_MspInit 0 */ - - /* USER CODE END CRC_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_CRC_CLK_ENABLE(); - /* USER CODE BEGIN CRC_MspInit 1 */ - - /* USER CODE END CRC_MspInit 1 */ - } - -} - -void HAL_CRC_MspDeInit(CRC_HandleTypeDef* hcrc) -{ - - if(hcrc->Instance==CRC) - { - /* USER CODE BEGIN CRC_MspDeInit 0 */ - - /* USER CODE END CRC_MspDeInit 0 */ - /* Peripheral clock disable */ - __CRC_CLK_DISABLE(); - /* USER CODE BEGIN CRC_MspDeInit 1 */ - - /* USER CODE END CRC_MspDeInit 1 */ - } - -} void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) { @@ -100,30 +62,69 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) GPIO_InitTypeDef GPIO_InitStruct; if(hspi->Instance==SPI1) { - /* USER CODE BEGIN SPI1_MspInit 0 */ - - /* USER CODE END SPI1_MspInit 0 */ /* Peripheral clock enable */ __HAL_RCC_SPI1_CLK_ENABLE(); - + __HAL_RCC_DMA2_CLK_ENABLE(); + /**SPI1 GPIO Configuration - PA4 ------> SPI1_NSS + PA4 ------> GPIO manual slave select PA5 ------> SPI1_SCK PA6 ------> SPI1_MISO PA7 ------> SPI1_MOSI */ - GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_PULLDOWN; + GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USER CODE BEGIN SPI1_MspInit 1 */ - - /* USER CODE END SPI1_MspInit 1 */ + GPIO_InitStruct.Pin = SPI1_NSS_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + SPI1_NSS_DEASSERT; + + //Prepare Tx DMA stream + hspi->hdmatx = &spiTxDmaHandle; + spiTxDmaHandle.Instance = DMA2_Stream3; + spiTxDmaHandle.Parent = hspi; + spiTxDmaHandle.Init.Channel = DMA_CHANNEL_3; + spiTxDmaHandle.Init.Direction = DMA_MEMORY_TO_PERIPH; + spiTxDmaHandle.Init.PeriphInc = DMA_PINC_DISABLE; + spiTxDmaHandle.Init.MemInc = DMA_MINC_ENABLE; + spiTxDmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + spiTxDmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + spiTxDmaHandle.Init.Mode = DMA_NORMAL; + spiTxDmaHandle.Init.Priority = DMA_PRIORITY_MEDIUM; + spiTxDmaHandle.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + HAL_DMA_Init(&spiTxDmaHandle); + HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, INT_PRIORITY_SPI_DMA, 0); + HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn); + + //Prepare Rx DMA stream + hspi->hdmarx = &spiRxDmaHandle; + spiRxDmaHandle.Instance = DMA2_Stream2; + spiRxDmaHandle.Parent = hspi; + spiRxDmaHandle.Init.Channel = DMA_CHANNEL_3; + spiRxDmaHandle.Init.Direction = DMA_PERIPH_TO_MEMORY; + spiRxDmaHandle.Init.PeriphInc = DMA_PINC_DISABLE; + spiRxDmaHandle.Init.MemInc = DMA_MINC_ENABLE; + spiRxDmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + spiRxDmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + spiRxDmaHandle.Init.Mode = DMA_NORMAL; + spiRxDmaHandle.Init.Priority = DMA_PRIORITY_MEDIUM; + spiRxDmaHandle.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + HAL_DMA_Init(&spiRxDmaHandle); + HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, INT_PRIORITY_SPI_DMA, 0); + HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn); + + //Configure downstream request pin and interrupt + GPIO_InitStruct.Pin = DOWNSTREAM_TX_OK_PIN; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT | GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_PULLUP; + HAL_GPIO_Init(DOWNSTREAM_TX_OK_PORT, &GPIO_InitStruct); + HAL_NVIC_SetPriority(EXTI3_IRQn, INT_PRIORITY_SPI_DMA, 0); + HAL_NVIC_EnableIRQ(EXTI3_IRQn); } - } void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) @@ -131,11 +132,9 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) if(hspi->Instance==SPI1) { - /* USER CODE BEGIN SPI1_MspDeInit 0 */ - - /* USER CODE END SPI1_MspDeInit 0 */ /* Peripheral clock disable */ - __SPI1_CLK_DISABLE(); + __HAL_RCC_SPI1_CLK_DISABLE(); + __HAL_RCC_DMA2_CLK_DISABLE(); /**SPI1 GPIO Configuration PA4 ------> SPI1_NSS @@ -144,24 +143,16 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) PA7 ------> SPI1_MOSI */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); + HAL_DMA_DeInit(&spiTxDmaHandle); + HAL_DMA_DeInit(&spiRxDmaHandle); - /* USER CODE BEGIN SPI1_MspDeInit 1 */ - - /* USER CODE END SPI1_MspDeInit 1 */ + HAL_NVIC_DisableIRQ(DMA2_Stream3_IRQn); + HAL_NVIC_DisableIRQ(DMA2_Stream2_IRQn); } } -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ -/** - * @} - */ - -/** - * @} - */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Upstream/Src/interrupts.c b/Upstream/Src/interrupts.c index 98fba37..74aa428 100755 --- a/Upstream/Src/interrupts.c +++ b/Upstream/Src/interrupts.c @@ -41,38 +41,50 @@ /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ -extern PCD_HandleTypeDef hpcd_USB_OTG_FS; +extern PCD_HandleTypeDef hpcd_USB_OTG_FS; +extern DMA_HandleTypeDef spiTxDmaHandle; +extern DMA_HandleTypeDef spiRxDmaHandle; + /******************************************************************************/ /* Cortex-M4 Processor Interruption and Exception Handlers */ /******************************************************************************/ -/** -* @brief This function handles USB On The Go FS global interrupt. -*/ +void SysTick_Handler(void) +{ + HAL_IncTick(); + +} + +///////////////////////// +//All interrupts in this section must be at the same priority. +//They interact with each other, and calls are not thread-safe +//when different interrupt priorities are used. +///////////////////////// void OTG_FS_IRQHandler(void) { - STAT_LED_PORT->BSRR = STAT_LED_BSRR_ON; //blink STAT LED while processing interrupt + STAT_LED_ON; //blink STAT LED while processing interrupt HAL_PCD_IRQHandler(&hpcd_USB_OTG_FS); - STAT_LED_PORT->BSRR = STAT_LED_BSRR_OFF; + STAT_LED_OFF; } -/** -* @brief This function handles System tick timer. -*/ -void SysTick_Handler(void) +void DMA2_Stream2_IRQHandler(void) { - /* USER CODE BEGIN SysTick_IRQn 0 */ + HAL_DMA_IRQHandler(&spiRxDmaHandle); +} - /* USER CODE END SysTick_IRQn 0 */ - HAL_IncTick(); - //HAL_SYSTICK_IRQHandler(); - /* USER CODE BEGIN SysTick_IRQn 1 */ +void DMA2_Stream3_IRQHandler(void) +{ + HAL_DMA_IRQHandler(&spiTxDmaHandle); +} - /* USER CODE END SysTick_IRQn 1 */ +void EXTI3_IRQHandler(void) +{ + __HAL_GPIO_EXTI_CLEAR_IT(3); + Downstream_TxOkInterrupt(); } +///////////////////////// +///////////////////////// -/* USER CODE BEGIN 1 */ -/* USER CODE END 1 */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Upstream/Src/main.c b/Upstream/Src/main.c index 8d0817d..ed19f43 100755 --- a/Upstream/Src/main.c +++ b/Upstream/Src/main.c @@ -33,6 +33,7 @@ */ /* Includes ------------------------------------------------------------------*/ +#include #include "stm32f4xx_hal.h" #include "usb_device.h" #include "board_config.h" @@ -40,16 +41,13 @@ /* Private variables ---------------------------------------------------------*/ -CRC_HandleTypeDef hcrc; -SPI_HandleTypeDef hspi1; /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); -static void MX_GPIO_Init(void); -static void MX_CRC_Init(void); -static void MX_SPI1_Init(void); +static void GPIO_Init(void); + int main(void) @@ -63,10 +61,12 @@ int main(void) SystemClock_Config(); /* Initialize all configured peripherals */ - MX_GPIO_Init(); - MX_CRC_Init(); - MX_SPI1_Init(); - MX_USB_DEVICE_Init(); + GPIO_Init(); + USB_Device_Init(); + + Downstream_InitInterface(); + + while (1) { @@ -107,33 +107,6 @@ void SystemClock_Config(void) } -/* CRC init function */ -void MX_CRC_Init(void) -{ - hcrc.Instance = CRC; - hcrc.State = HAL_CRC_STATE_RESET; - HAL_CRC_Init(&hcrc); -} - - -/* SPI1 init function */ -void MX_SPI1_Init(void) -{ - hspi1.Instance = SPI1; - hspi1.State = HAL_SPI_STATE_RESET; - hspi1.Init.Mode = SPI_MODE_MASTER; - hspi1.Init.Direction = SPI_DIRECTION_2LINES; - hspi1.Init.DataSize = SPI_DATASIZE_8BIT; - hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT; - hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; - hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi1.Init.TIMode = SPI_TIMODE_DISABLED; - hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_ENABLED; - hspi1.Init.CRCPolynomial = SPI_CRC_DEFAULTPOLYNOMIAL; - HAL_SPI_Init(&hspi1); -} /** Configure pins as * Analog @@ -142,7 +115,7 @@ void MX_SPI1_Init(void) * EVENT_OUT * EXTI */ -void MX_GPIO_Init(void) +void GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; @@ -177,7 +150,7 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(STAT_LED_PORT, &GPIO_InitStruct); - STAT_LED_PORT->BSRR = STAT_LED_BSRR_OFF; + STAT_LED_PORT->BSRR = STAT_LED_OFF; } /* USER CODE BEGIN 4 */ diff --git a/Upstream/Src/usb_device.c b/Upstream/Src/usb_device.c index 16e11ff..3aadc60 100755 --- a/Upstream/Src/usb_device.c +++ b/Upstream/Src/usb_device.c @@ -35,25 +35,22 @@ /* Includes ------------------------------------------------------------------*/ +#include #include "usb_device.h" #include "usbd_core.h" -#include "usbd_desc.h" #include "usbd_msc.h" -#include "usbd_storage_if.h" /* USB Device Core handle declaration */ USBD_HandleTypeDef hUsbDeviceFS; /* init function */ -void MX_USB_DEVICE_Init(void) +void USB_Device_Init(void) { /* Init Device Library,Add Supported Class and Start the library*/ USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS); USBD_RegisterClass(&hUsbDeviceFS, &USBD_MSC); - USBD_MSC_RegisterStorage(&hUsbDeviceFS, &USBD_Storage_Interface_fops_FS); - USBD_Start(&hUsbDeviceFS); } diff --git a/Upstream/Src/usbd_conf.c b/Upstream/Src/usbd_config.c similarity index 92% rename from Upstream/Src/usbd_conf.c rename to Upstream/Src/usbd_config.c index 6f1595d..8a0035e 100755 --- a/Upstream/Src/usbd_conf.c +++ b/Upstream/Src/usbd_config.c @@ -116,7 +116,7 @@ void HAL_PCD_MspDeInit(PCD_HandleTypeDef* hpcd) */ void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) { - USBD_LL_SetupStage(hpcd->pData, (uint8_t *)hpcd->Setup); + USBD_SetupStage(hpcd->pData, (uint8_t *)hpcd->Setup); } /** @@ -127,7 +127,7 @@ void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) */ void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) { - USBD_LL_DataOutStage(hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff); + USBD_DataOutStage(hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff); } /** @@ -138,7 +138,7 @@ void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) */ void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) { - USBD_LL_DataInStage(hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff); + USBD_DataInStage(hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff); } /** @@ -148,7 +148,7 @@ void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) */ void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) { - USBD_LL_SOF(hpcd->pData); + USBD_SOF(hpcd->pData); } /** @@ -174,10 +174,10 @@ void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) speed = USBD_SPEED_FULL; break; } - USBD_LL_SetSpeed(hpcd->pData, speed); + USBD_SetSpeed(hpcd->pData, speed); /*Reset Device*/ - USBD_LL_Reset(hpcd->pData); + USBD_Reset(hpcd->pData); } /** @@ -189,7 +189,7 @@ void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) { /* Inform USB library that core enters in suspend Mode */ - USBD_LL_Suspend(hpcd->pData); + USBD_Suspend(hpcd->pData); __HAL_PCD_GATE_PHYCLOCK(hpcd); /*Enter in STOP mode */ /* USER CODE BEGIN 2 */ @@ -217,7 +217,7 @@ void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) } /* USER CODE END 3 */ __HAL_PCD_UNGATE_PHYCLOCK(hpcd); - USBD_LL_Resume(hpcd->pData); + USBD_Resume(hpcd->pData); } /** @@ -228,7 +228,7 @@ void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) */ void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) { - USBD_LL_IsoOUTIncomplete(hpcd->pData, epnum); + USBD_IsoOUTIncomplete(hpcd->pData, epnum); } /** @@ -239,7 +239,7 @@ void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) */ void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) { - USBD_LL_IsoINIncomplete(hpcd->pData, epnum); + USBD_IsoINIncomplete(hpcd->pData, epnum); } /** @@ -249,7 +249,7 @@ void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) */ void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) { - USBD_LL_DevConnected(hpcd->pData); + USBD_DevConnected(hpcd->pData); } /** @@ -259,7 +259,12 @@ void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) */ void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) { - USBD_LL_DevDisconnected(hpcd->pData); + USBD_DevDisconnected(hpcd->pData); +} + +void HAL_PCD_BufferFreedCallBack(PCD_HandleTypeDef *hpcd) +{ + USBD_BufferFreed(hpcd->pData); } /******************************************************************************* diff --git a/Upstream/Src/usbd_desc.c b/Upstream/Src/usbd_descriptors.c similarity index 88% rename from Upstream/Src/usbd_desc.c rename to Upstream/Src/usbd_descriptors.c index d127dc0..ddf0611 100755 --- a/Upstream/Src/usbd_desc.c +++ b/Upstream/Src/usbd_descriptors.c @@ -34,9 +34,10 @@ */ /* Includes ------------------------------------------------------------------*/ +#include "usbd_config.h" +#include "usbd_descriptors.h" #include "usbd_core.h" -#include "usbd_desc.h" -#include "usbd_conf.h" +#include "usbd_msc.h" /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY * @{ */ @@ -145,6 +146,26 @@ __ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END = #pragma data_alignment=4 #endif __ALIGN_BEGIN uint8_t USBD_StrDesc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END; + + +/* USB Mass storage Standard Inquiry Data */ +const int8_t STORAGE_Inquirydata_FS[] = { //36 + + /* LUN 0 */ + 0x00, + 0x80, + 0x02, + 0x02, + (STANDARD_INQUIRY_DATA_LEN - 5), + 0x00, + 0x00, + 0x00, + 'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */ + 'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product : 16 Bytes */ + ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', + '0', '.', '0' ,'1', /* Version : 4 Bytes */ +}; + /** * @} */ @@ -195,14 +216,7 @@ uint8_t * USBD_FS_LangIDStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *leng */ uint8_t * USBD_FS_ProductStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length) { -// if(speed == 0) -// { -// USBD_GetString (USBD_PRODUCT_STRING_FS, USBD_StrDesc, length); -// } -// else -// { - USBD_GetString (USBD_PRODUCT_STRING_FS, USBD_StrDesc, length); -// } + USBD_GetString (USBD_PRODUCT_STRING_FS, USBD_StrDesc, length); return USBD_StrDesc; } @@ -228,14 +242,7 @@ uint8_t * USBD_FS_ManufacturerStrDescriptor( USBD_SpeedTypeDef speed , uint16_t */ uint8_t * USBD_FS_SerialStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length) { - if(speed == USBD_SPEED_HIGH) - { - USBD_GetString (USBD_SERIALNUMBER_STRING_FS, USBD_StrDesc, length); - } - else - { - USBD_GetString (USBD_SERIALNUMBER_STRING_FS, USBD_StrDesc, length); - } + USBD_GetString (USBD_SERIALNUMBER_STRING_FS, USBD_StrDesc, length); return USBD_StrDesc; } @@ -248,14 +255,7 @@ uint8_t * USBD_FS_SerialStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *leng */ uint8_t * USBD_FS_ConfigStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length) { - if(speed == USBD_SPEED_HIGH) - { - USBD_GetString (USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length); - } - else - { - USBD_GetString (USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length); - } + USBD_GetString (USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length); return USBD_StrDesc; } @@ -268,14 +268,7 @@ uint8_t * USBD_FS_ConfigStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *leng */ uint8_t * USBD_FS_InterfaceStrDescriptor( USBD_SpeedTypeDef speed , uint16_t *length) { - if(speed == 0) - { - USBD_GetString (USBD_INTERFACE_STRING_FS, USBD_StrDesc, length); - } - else - { - USBD_GetString (USBD_INTERFACE_STRING_FS, USBD_StrDesc, length); - } + USBD_GetString (USBD_INTERFACE_STRING_FS, USBD_StrDesc, length); return USBD_StrDesc; } /** diff --git a/Upstream/Src/usbd_storage_if.c b/Upstream/Src/usbd_storage_if.c deleted file mode 100755 index c9e22cf..0000000 --- a/Upstream/Src/usbd_storage_if.c +++ /dev/null @@ -1,251 +0,0 @@ -/** - ****************************************************************************** - * @file : usbd_storage_if.c - * @author : MCD Application Team - * @version : V1.1.0 - * @date : 19-March-2012 - * @brief : Memory management layer - ****************************************************************************** - * COPYRIGHT(c) 2015 STMicroelectronics - * - * 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 STMicroelectronics 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 AND CONTRIBUTORS "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 OR CONTRIBUTORS 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. - * - ****************************************************************************** -*/ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_storage_if.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* USB handler declaration */ -/* Handle for USB Full Speed IP */ -USBD_HandleTypeDef *hUsbDevice_0; - -extern USBD_HandleTypeDef hUsbDeviceFS; - -/* Private function prototypes -----------------------------------------------*/ -/* Extern function prototypes ------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -#define STORAGE_LUN_NBR 1 -#define STORAGE_BLK_NBR 0x10000 -#define STORAGE_BLK_SIZ 0x200 - -static int8_t STORAGE_Init_FS (uint8_t lun); -static int8_t STORAGE_GetCapacity_FS (uint8_t lun, - uint32_t *block_num, - uint16_t *block_size); -static int8_t STORAGE_IsReady_FS (uint8_t lun); -static int8_t STORAGE_IsWriteProtected_FS (uint8_t lun); -static int8_t STORAGE_Read_FS (uint8_t lun, - uint8_t *buf, - uint32_t blk_addr, - uint16_t blk_len); -static int8_t STORAGE_Write_FS (uint8_t lun, - uint8_t *buf, - uint32_t blk_addr, - uint16_t blk_len); -static int8_t STORAGE_GetMaxLun_FS (void); - -/* USER CODE BEGIN 0 */ -/* USB Mass storage Standard Inquiry Data */ -const int8_t STORAGE_Inquirydata_FS[] = {//36 - - /* LUN 0 */ - 0x00, - 0x80, - 0x02, - 0x02, - (STANDARD_INQUIRY_DATA_LEN - 5), - 0x00, - 0x00, - 0x00, - 'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */ - 'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product : 16 Bytes */ - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', - '0', '.', '0' ,'1', /* Version : 4 Bytes */ -}; -/* USER CODE END 0 */ - -USBD_StorageTypeDef USBD_Storage_Interface_fops_FS = -{ - STORAGE_Init_FS, - STORAGE_GetCapacity_FS, - STORAGE_IsReady_FS, - STORAGE_IsWriteProtected_FS, - STORAGE_Read_FS, - STORAGE_Write_FS, - STORAGE_GetMaxLun_FS, - (int8_t *)STORAGE_Inquirydata_FS, -}; - -/******************************************************************************* -* Function Name : STORAGE_Init_FS -* Description : - * Input : None. - * Output : None. - * Return : None. - *******************************************************************************/ -int8_t -STORAGE_Init_FS (uint8_t lun) -{ - /* USER CODE BEGIN 2 */ - if (lun >= STORAGE_LUN_NBR) - { - return (USBD_FAIL); - } - return (USBD_OK); - /* USER CODE END 2 */ -} - -/******************************************************************************* -* Function Name : STORAGE_GetCapacity_FS -* Description : -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -int8_t STORAGE_GetCapacity_FS (uint8_t lun, uint32_t *block_num, uint16_t *block_size) -{ - /* USER CODE BEGIN 3 */ - if (lun >= STORAGE_LUN_NBR) - { - return (USBD_FAIL); - } - - *block_num = STORAGE_BLK_NBR; - *block_size = STORAGE_BLK_SIZ; - return (USBD_OK); - /* USER CODE END 3 */ -} - -/******************************************************************************* -* Function Name : STORAGE_IsReady_FS -* Description : -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -int8_t STORAGE_IsReady_FS (uint8_t lun) -{ - /* USER CODE BEGIN 4 */ - if (lun >= STORAGE_LUN_NBR) - { - return (USBD_FAIL); - } - return (USBD_OK); - /* USER CODE END 4 */ -} - -/******************************************************************************* -* Function Name : STORAGE_IsWriteProtected_FS -* Description : -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -int8_t STORAGE_IsWriteProtected_FS (uint8_t lun) -{ - /* USER CODE BEGIN 5 */ - if (lun >= STORAGE_LUN_NBR) - { - return (USBD_FAIL); - } - return (USBD_OK); - /* USER CODE END 5 */ -} - -/******************************************************************************* -* Function Name : STORAGE_Read_FS -* Description : -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -int8_t STORAGE_Read_FS (uint8_t lun, - uint8_t *buf, - uint32_t blk_addr, - uint16_t blk_len) -{ - /* USER CODE BEGIN 6 */ - uint16_t blockLoop; - uint16_t byteLoop; - - if (lun >= STORAGE_LUN_NBR) - { - return -1; - } - - for (blockLoop = 0; blockLoop < blk_len; blockLoop++) //blk_len will be 1 when scsi_blk_size = 512 bytes - { - for (byteLoop = 0; byteLoop < STORAGE_BLK_SIZ; byteLoop += 4) //STORAGE_BLK_SIZ must be a multiple of 4 - { - *((__packed uint32_t *)buf) = 0; - buf += 4; - } - } - - return (USBD_OK); - /* USER CODE END 6 */ -} - -/******************************************************************************* -* Function Name : STORAGE_Write_FS -* Description : -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -int8_t STORAGE_Write_FS (uint8_t lun, - uint8_t *buf, - uint32_t blk_addr, - uint16_t blk_len) -{ - /* USER CODE BEGIN 7 */ - if (lun >= STORAGE_LUN_NBR) - { - return -1; - } - - return (USBD_OK); - /* USER CODE END 7 */ -} - -/******************************************************************************* -* Function Name : STORAGE_GetMaxLun_FS -* Description : -* Input : None. -* Output : None. -* Return : None. -*******************************************************************************/ -int8_t STORAGE_GetMaxLun_FS (void) -{ - /* USER CODE BEGIN 8 */ - return (STORAGE_LUN_NBR - 1); - /* USER CODE END 8 */ -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/