From 26f5806b035a206152e02a2ade8f9d05047d25df Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Fri, 29 May 2020 14:23:58 +0100 Subject: [PATCH 01/37] initial commit of new cdc_msc and updated msc --- .../stm32/usb/cdc_msc/usbd_cdc_msc.cpp | 508 +++++++++++++ .../arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h | 39 + cores/arduino/stm32/usb/msc/usbd_msc.c | 601 +++++++++++++++ cores/arduino/stm32/usb/msc/usbd_msc.h | 133 ++++ cores/arduino/stm32/usb/msc/usbd_msc_bot.c | 387 ++++++++++ cores/arduino/stm32/usb/msc/usbd_msc_bot.h | 150 ++++ cores/arduino/stm32/usb/msc/usbd_msc_data.c | 135 ++++ cores/arduino/stm32/usb/msc/usbd_msc_data.h | 103 +++ cores/arduino/stm32/usb/msc/usbd_msc_scsi.c | 716 ++++++++++++++++++ cores/arduino/stm32/usb/msc/usbd_msc_scsi.h | 192 +++++ 10 files changed, 2964 insertions(+) create mode 100644 cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp create mode 100644 cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h create mode 100644 cores/arduino/stm32/usb/msc/usbd_msc.c create mode 100644 cores/arduino/stm32/usb/msc/usbd_msc.h create mode 100644 cores/arduino/stm32/usb/msc/usbd_msc_bot.c create mode 100644 cores/arduino/stm32/usb/msc/usbd_msc_bot.h create mode 100644 cores/arduino/stm32/usb/msc/usbd_msc_data.c create mode 100644 cores/arduino/stm32/usb/msc/usbd_msc_data.h create mode 100644 cores/arduino/stm32/usb/msc/usbd_msc_scsi.c create mode 100644 cores/arduino/stm32/usb/msc/usbd_msc_scsi.h diff --git a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp new file mode 100644 index 0000000000..20a859a408 --- /dev/null +++ b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp @@ -0,0 +1,508 @@ +/** + ****************************************************************************** + * @file usbd_template.c + * @author MCD Application Team + * @brief This file provides the HID core functions. + * + * @verbatim + * + * =================================================================== + * COMPOSITE Class Description + * =================================================================== + * + * + * + * + * + * + * @note In HS mode and when the DMA is used, all variables and data structures + * dealing with the DMA during the transaction process should be 32-bit aligned. + * + * + * @endverbatim + * + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ + +#include "usbd_cdc_msc.h" +#include "usbd_ctlreq.h" + + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_COMPOSITE + * @brief usbd core module + * @{ + */ + +/** @defgroup USBD_COMPOSITE_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_COMPOSITE_Private_Defines + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_COMPOSITE_Private_Macros + * @{ + */ + +/** + * @} + */ + + + + +/** @defgroup USBD_COMPOSITE_Private_FunctionPrototypes + * @{ + */ + + +static uint8_t USBD_COMPOSITE_Init(USBD_HandleTypeDef *pdev, + uint8_t cfgidx); + +static uint8_t USBD_COMPOSITE_DeInit(USBD_HandleTypeDef *pdev, + uint8_t cfgidx); + +static uint8_t USBD_COMPOSITE_Setup(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req); + +static uint8_t *USBD_COMPOSITE_GetCfgDesc(uint16_t *length); + +static uint8_t *USBD_COMPOSITE_GetDeviceQualifierDesc(uint16_t *length); + +static uint8_t USBD_COMPOSITE_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); + +static uint8_t USBD_COMPOSITE_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); + +static uint8_t USBD_COMPOSITE_EP0_RxReady(USBD_HandleTypeDef *pdev); + +static uint8_t USBD_COMPOSITE_EP0_TxReady(USBD_HandleTypeDef *pdev); + +static uint8_t USBD_COMPOSITE_SOF(USBD_HandleTypeDef *pdev); + +/** + * @} + */ + +/** @defgroup USBD_COMPOSITE_Private_Variables + * @{ + */ + +USBD_ClassTypeDef USBD_COMPOSITE_ClassDriver = +{ + USBD_COMPOSITE_Init, + USBD_COMPOSITE_DeInit, + USBD_COMPOSITE_Setup, + nullptr, + USBD_COMPOSITE_EP0_RxReady, + USBD_COMPOSITE_DataIn, + USBD_COMPOSITE_DataOut, + USBD_COMPOSITE_SOF, + nullptr, + nullptr, + USBD_COMPOSITE_GetCfgDesc, + USBD_COMPOSITE_GetCfgDesc, + USBD_COMPOSITE_GetCfgDesc, + USBD_COMPOSITE_GetDeviceQualifierDesc, +}; + + +#if defined ( __ICCARM__ ) /*!< IAR Compiler */ +#pragma data_alignment=4 +#endif +/* USB COMPOSITE device Configuration Descriptor */ +static uint8_t USBD_COMPOSITE_CfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = +{ + 0x09, /* bLength: Configuation Descriptor size */ + USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION, /* bDescriptorType: Configuration */ + USB_CDC_MSC_CONFIG_DESC_SIZ, + /* wTotalLength: Bytes returned */ + 0x00, + 0x03, /*bNumInterfaces: 3 interface*/ + 0x01, /*bConfigurationValue: Configuration value*/ + 0x02, /*iConfiguration: Index of string descriptor describing the configuration*/ + 0xC0, /*bmAttributes: bus powered and Supports Remote Wakeup */ + 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ + /* 09 */ + + /*---------------------------------------------------------------------------*/ + + /*Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + 0x00, /* iInterface: */ + + /*Header Functional Descriptor*/ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /*Call Management Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + 0x01, /* bDataInterface: 1 */ + + /*ACM Functional Descriptor*/ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /*Union Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + 0x00, /* bMasterInterface: Communication class interface */ + 0x01, /* bSlaveInterface0: Data Class Interface */ + + /*Endpoint 2 Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), + CDC_FS_BINTERVAL, /* bInterval: */ + /*---------------------------------------------------------------------------*/ + + /*Data class interface descriptor*/ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + 0x01, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /*Endpoint OUT Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), + 0x00, /* bInterval: ignore for Bulk transfer */ + + /*Endpoint IN Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), + 0x00, + + + /******************** Mass Storage interface ********************/ + 0x09, /* bLength: Interface Descriptor size */ + 0x04, /* bDescriptorType: */ + 0x02, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints */ + 0x08, /* bInterfaceClass: MSC Class */ + 0x06, /* bInterfaceSubClass : SCSI transparent */ + 0x50, /* nInterfaceProtocol */ + 0x05, /* iInterface: */ + + /******************** Mass Storage Endpoints ********************/ + 0x07, /* Endpoint descriptor length = 7 */ + 0x05, /* Endpoint descriptor type */ + MSC_EPIN_ADDR, /* Endpoint address (IN, address 1) */ + 0x02, /* Bulk endpoint type */ + LOBYTE(MSC_MAX_HS_PACKET), + HIBYTE(MSC_MAX_HS_PACKET), + 0x00, /* Polling interval in milliseconds */ + + 0x07, /* Endpoint descriptor length = 7 */ + 0x05, /* Endpoint descriptor type */ + MSC_EPOUT_ADDR, /* Endpoint address (OUT, address 1) */ + 0x02, /* Bulk endpoint type */ + LOBYTE(MSC_MAX_HS_PACKET), + HIBYTE(MSC_MAX_HS_PACKET), + 0x00 /* Polling interval in milliseconds */ +}; + +#if defined ( __ICCARM__ ) /*!< IAR Compiler */ +#pragma data_alignment=4 +#endif +/* USB Standard Device Descriptor */ +static uint8_t USBD_COMPOSITE_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] = +{ + USB_LEN_DEV_QUALIFIER_DESC, + USB_DESC_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + 0x40, + 0x01, + 0x00, +}; + +/** + * @} + */ + +/** @defgroup USBD_COMPOSITE_Private_Functions + * @{ + */ + +/** + * @brief USBD_COMPOSITE_Init + * Initialize the COMPOSITE interface + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t USBD_COMPOSITE_Init(USBD_HandleTypeDef *pdev, + uint8_t cfgidx) +{ + USBD_MSC.Init(pdev, cfgidx); + + USBD_CDC.Init(pdev, cfgidx); + + return (uint8_t)USBD_OK; +} + +/** + * @brief USBD_COMPOSITE_Init + * DeInitialize the COMPOSITE layer + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t USBD_COMPOSITE_DeInit(USBD_HandleTypeDef *pdev, + uint8_t cfgidx) +{ + USBD_MSC.DeInit(pdev, cfgidx); + + USBD_CDC.DeInit(pdev, cfgidx); + + return USBD_OK; +} + +/** + * @brief USBD_COMPOSITE_Setup + * Handle the COMPOSITE specific requests + * @param pdev: instance + * @param req: usb requests + * @retval status + */ +static uint8_t USBD_COMPOSITE_Setup(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req) +{ + switch (req->bmRequest & USB_REQ_RECIPIENT_MASK) + { + case USB_REQ_RECIPIENT_INTERFACE: + switch(req->wIndex) { + case CDC_ACM_INTERFACE: + case CDC_COM_INTERFACE: + return USBD_CDC.Setup(pdev, req); + break; + + case MSC_INTERFACE: + return USBD_MSC.Setup(pdev, req); + break; + + // invalid interface + default: + return USBD_FAIL; + } + break; + + case USB_REQ_RECIPIENT_ENDPOINT: + switch (req->wIndex) { + case CDC_IN_EP: + case CDC_OUT_EP: + case CDC_CMD_EP: + return USBD_CDC.Setup(pdev, req); + + case MSC_IN_EP: + case MSC_OUT_EP: + return USBD_MSC.Setup(pdev, req); + + // invalid endpoint + default: + return USBD_FAIL; + } + break; + + default: + break; + } + + return USBD_OK; +} + + +/** + * @brief USBD_COMPOSITE_GetCfgDesc + * return configuration descriptor + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t *USBD_COMPOSITE_GetCfgDesc(uint16_t *length) +{ + *length = sizeof(USBD_COMPOSITE_CfgDesc); + return USBD_COMPOSITE_CfgDesc; +} + +/** +* @brief DeviceQualifierDescriptor +* return Device Qualifier descriptor +* @param length : pointer data length +* @retval pointer to descriptor buffer +*/ +uint8_t *USBD_COMPOSITE_DeviceQualifierDescriptor(uint16_t *length) +{ + *length = sizeof(USBD_COMPOSITE_DeviceQualifierDesc); + return USBD_COMPOSITE_DeviceQualifierDesc; +} + + +/** + * @brief USBD_COMPOSITE_DataIn + * handle data IN Stage + * @param pdev: device instance + * @param epnum: endpoint index + * @retval status + */ +static uint8_t USBD_COMPOSITE_DataIn(USBD_HandleTypeDef *pdev, + uint8_t epnum) +{ + switch (epnum) + { + case CDC_IN_EP: + case CDC_CMD_EP: + case CDC_OUT_EP: + return USBD_CDC.DataIn(pdev, epnum); + + case MSC_IN_EP: + case MSC_OUT_EP: + return USBD_MSC.DataIn(pdev, epnum); + + // invalid endpoint + default: + return USBD_FAIL; + } +} + +/** + * @brief USBD_COMPOSITE_EP0_RxReady + * handle EP0 Rx Ready event + * @param pdev: device instance + * @retval status + */ +static uint8_t USBD_COMPOSITE_EP0_RxReady(USBD_HandleTypeDef *pdev) +{ + // only needed by CDC + return USBD_CDC.EP0_RxReady(pdev); +} + +/** + * @brief USBD_COMPOSITE_SOF + * handle SOF event + * @param pdev: device instance + * @retval status + */ +static uint8_t USBD_COMPOSITE_SOF(USBD_HandleTypeDef *pdev) +{ + // only needed for CDC + return USBD_CDC.SOF(pdev); +} + +/** + * @brief USBD_COMPOSITE_DataOut + * handle data OUT Stage + * @param pdev: device instance + * @param epnum: endpoint index + * @retval status + */ +static uint8_t USBD_COMPOSITE_DataOut(USBD_HandleTypeDef *pdev, + uint8_t epnum) +{ + switch (epnum) + { + case CDC_IN_EP: + case CDC_CMD_EP: + case CDC_OUT_EP: + return USBD_CDC.DataOut(pdev, epnum); + + case MSC_IN_EP: + case MSC_OUT_EP: + return USBD_MSC.DataOut(pdev, epnum); + + // invalid endpoint + default: + return USBD_FAIL; + } +} + +/** +* @brief DeviceQualifierDescriptor +* return Device Qualifier descriptor +* @param length : pointer data length +* @retval pointer to descriptor buffer +*/ +uint8_t *USBD_COMPOSITE_GetDeviceQualifierDesc(uint16_t *length) +{ + *length = sizeof(USBD_COMPOSITE_DeviceQualifierDesc); + return USBD_COMPOSITE_DeviceQualifierDesc; +} + +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h new file mode 100644 index 0000000000..3d50cb967a --- /dev/null +++ b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h @@ -0,0 +1,39 @@ +/** + ****************************************************************************** + * @file usbd_cdc_msc_core.h + * @author MCD Application Team + * @version V1.2.1 + * @date 17-March-2018 + * @brief header file for the usbd_cdc_msc_core.c file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ + +#ifndef __USB_CDC_MSC_CORE_H_ +#define __USB_CDC_MSC_CORE_H_ + +#include "../cdc/usbd_cdc.h" +#include "usbd_msc.h" +#include "usbd_ioreq.h" + +#define CDC_ACM_INTERFACE 0x0 +#define CDC_COM_INTERFACE 0x1 +#define MSC_INTERFACE 0x2 + +#define USB_CDC_MSC_CONFIG_DESC_SIZ (USB_CDC_CONFIG_DESC_SIZ - 9 + USB_MSC_CONFIG_DESC_SIZ) + +#endif /* __USB_CDC_MSC_CORE_H_ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc.c b/cores/arduino/stm32/usb/msc/usbd_msc.c new file mode 100644 index 0000000000..e196cefe46 --- /dev/null +++ b/cores/arduino/stm32/usb/msc/usbd_msc.c @@ -0,0 +1,601 @@ +/** + ****************************************************************************** + * @file usbd_msc.c + * @author MCD Application Team + * @brief This file provides all the MSC core functions. + * + * @verbatim + * + * =================================================================== + * MSC Class Description + * =================================================================== + * This module manages the MSC class V1.0 following the "Universal + * Serial Bus Mass Storage Class (MSC) Bulk-Only Transport (BOT) Version 1.0 + * Sep. 31, 1999". + * This driver implements the following aspects of the specification: + * - Bulk-Only Transport protocol + * - Subclass : SCSI transparent command set (ref. SCSI Primary Commands - 3 (SPC-3)) + * + * @endverbatim + * + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* BSPDependencies +- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c" +- "stm32xxxxx_{eval}{discovery}_io.c" +- "stm32xxxxx_{eval}{discovery}{adafruit}_sd.c" +EndBSPDependencies */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_msc.h" + + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup MSC_CORE + * @brief Mass storage core module + * @{ + */ + +/** @defgroup MSC_CORE_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup MSC_CORE_Private_Defines + * @{ + */ + +/** + * @} + */ + + +/** @defgroup MSC_CORE_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup MSC_CORE_Private_FunctionPrototypes + * @{ + */ +uint8_t USBD_MSC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +uint8_t USBD_MSC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +uint8_t USBD_MSC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +uint8_t USBD_MSC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); +uint8_t USBD_MSC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); + +uint8_t *USBD_MSC_GetHSCfgDesc(uint16_t *length); +uint8_t *USBD_MSC_GetFSCfgDesc(uint16_t *length); +uint8_t *USBD_MSC_GetOtherSpeedCfgDesc(uint16_t *length); +uint8_t *USBD_MSC_GetDeviceQualifierDescriptor(uint16_t *length); + +/** + * @} + */ + + +/** @defgroup MSC_CORE_Private_Variables + * @{ + */ + + +USBD_ClassTypeDef USBD_MSC = +{ + USBD_MSC_Init, + USBD_MSC_DeInit, + USBD_MSC_Setup, + NULL, /*EP0_TxSent*/ + NULL, /*EP0_RxReady*/ + USBD_MSC_DataIn, + USBD_MSC_DataOut, + NULL, /*SOF */ + NULL, + NULL, + USBD_MSC_GetHSCfgDesc, + USBD_MSC_GetFSCfgDesc, + USBD_MSC_GetOtherSpeedCfgDesc, + USBD_MSC_GetDeviceQualifierDescriptor, +}; + +/* USB Mass storage device Configuration Descriptor */ +/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ +__ALIGN_BEGIN uint8_t USBD_MSC_CfgHSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = +{ + + 0x09, /* bLength: Configuation Descriptor size */ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ + USB_MSC_CONFIG_DESC_SIZ, + + 0x00, + 0x01, /* bNumInterfaces: 1 interface */ + 0x01, /* bConfigurationValue: */ + 0x04, /* iConfiguration: */ + 0xC0, /* bmAttributes: */ + 0x32, /* MaxPower 100 mA */ + + /******************** Mass Storage interface ********************/ + 0x09, /* bLength: Interface Descriptor size */ + 0x04, /* bDescriptorType: */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints*/ + 0x08, /* bInterfaceClass: MSC Class */ + 0x06, /* bInterfaceSubClass : SCSI transparent*/ + 0x50, /* nInterfaceProtocol */ + 0x05, /* iInterface: */ + /******************** Mass Storage Endpoints ********************/ + 0x07, /*Endpoint descriptor length = 7*/ + 0x05, /*Endpoint descriptor type */ + MSC_EPIN_ADDR, /*Endpoint address (IN, address 1) */ + 0x02, /*Bulk endpoint type */ + LOBYTE(MSC_MAX_HS_PACKET), + HIBYTE(MSC_MAX_HS_PACKET), + 0x00, /*Polling interval in milliseconds */ + + 0x07, /*Endpoint descriptor length = 7 */ + 0x05, /*Endpoint descriptor type */ + MSC_EPOUT_ADDR, /*Endpoint address (OUT, address 1) */ + 0x02, /*Bulk endpoint type */ + LOBYTE(MSC_MAX_HS_PACKET), + HIBYTE(MSC_MAX_HS_PACKET), + 0x00 /*Polling interval in milliseconds*/ +}; + +/* USB Mass storage device Configuration Descriptor */ +/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ +__ALIGN_BEGIN uint8_t USBD_MSC_CfgFSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = +{ + 0x09, /* bLength: Configuation Descriptor size */ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ + USB_MSC_CONFIG_DESC_SIZ, + + 0x00, + 0x01, /* bNumInterfaces: 1 interface */ + 0x01, /* bConfigurationValue: */ + 0x04, /* iConfiguration: */ + 0xC0, /* bmAttributes: */ + 0x32, /* MaxPower 100 mA */ + + /******************** Mass Storage interface ********************/ + 0x09, /* bLength: Interface Descriptor size */ + 0x04, /* bDescriptorType: */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints*/ + 0x08, /* bInterfaceClass: MSC Class */ + 0x06, /* bInterfaceSubClass : SCSI transparent*/ + 0x50, /* nInterfaceProtocol */ + 0x05, /* iInterface: */ + /******************** Mass Storage Endpoints ********************/ + 0x07, /*Endpoint descriptor length = 7*/ + 0x05, /*Endpoint descriptor type */ + MSC_EPIN_ADDR, /*Endpoint address (IN, address 1) */ + 0x02, /*Bulk endpoint type */ + LOBYTE(MSC_MAX_FS_PACKET), + HIBYTE(MSC_MAX_FS_PACKET), + 0x00, /*Polling interval in milliseconds */ + + 0x07, /*Endpoint descriptor length = 7 */ + 0x05, /*Endpoint descriptor type */ + MSC_EPOUT_ADDR, /*Endpoint address (OUT, address 1) */ + 0x02, /*Bulk endpoint type */ + LOBYTE(MSC_MAX_FS_PACKET), + HIBYTE(MSC_MAX_FS_PACKET), + 0x00 /*Polling interval in milliseconds*/ +}; + +__ALIGN_BEGIN uint8_t USBD_MSC_OtherSpeedCfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = +{ + 0x09, /* bLength: Configuation Descriptor size */ + USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION, + USB_MSC_CONFIG_DESC_SIZ, + + 0x00, + 0x01, /* bNumInterfaces: 1 interface */ + 0x01, /* bConfigurationValue: */ + 0x04, /* iConfiguration: */ + 0xC0, /* bmAttributes: */ + 0x32, /* MaxPower 100 mA */ + + /******************** Mass Storage interface ********************/ + 0x09, /* bLength: Interface Descriptor size */ + 0x04, /* bDescriptorType: */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints*/ + 0x08, /* bInterfaceClass: MSC Class */ + 0x06, /* bInterfaceSubClass : SCSI transparent command set*/ + 0x50, /* nInterfaceProtocol */ + 0x05, /* iInterface: */ + /******************** Mass Storage Endpoints ********************/ + 0x07, /*Endpoint descriptor length = 7*/ + 0x05, /*Endpoint descriptor type */ + MSC_EPIN_ADDR, /*Endpoint address (IN, address 1) */ + 0x02, /*Bulk endpoint type */ + 0x40, + 0x00, + 0x00, /*Polling interval in milliseconds */ + + 0x07, /*Endpoint descriptor length = 7 */ + 0x05, /*Endpoint descriptor type */ + MSC_EPOUT_ADDR, /*Endpoint address (OUT, address 1) */ + 0x02, /*Bulk endpoint type */ + 0x40, + 0x00, + 0x00 /*Polling interval in milliseconds*/ +}; + +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN uint8_t USBD_MSC_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = +{ + USB_LEN_DEV_QUALIFIER_DESC, + USB_DESC_TYPE_DEVICE_QUALIFIER, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, + MSC_MAX_FS_PACKET, + 0x01, + 0x00, +}; +/** + * @} + */ + +USBD_MSC_BOT_HandleTypeDef msc_handle_dat; +USBD_MSC_BOT_HandleTypeDef *msc_handle = &msc_handle_dat; + +USBD_StorageTypeDef *msc_storage = NULL; + +/** @defgroup MSC_CORE_Private_Functions + * @{ + */ + +/** + * @brief USBD_MSC_Init + * Initialize the mass storage configuration + * @param pdev: device instance + * @param cfgidx: configuration index + * @retval status + */ +uint8_t USBD_MSC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +{ + if (pdev->dev_speed == USBD_SPEED_HIGH) + { + /* Open EP OUT */ + USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); + pdev->ep_out[MSC_EPOUT_ADDR & 0xFU].is_used = 1U; + + /* Open EP IN */ + USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); + pdev->ep_in[MSC_EPIN_ADDR & 0xFU].is_used = 1U; + } + else + { + /* Open EP OUT */ + USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); + pdev->ep_out[MSC_EPOUT_ADDR & 0xFU].is_used = 1U; + + /* Open EP IN */ + USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); + pdev->ep_in[MSC_EPIN_ADDR & 0xFU].is_used = 1U; + } + + /* Init the BOT layer */ + MSC_BOT_Init(pdev); + + return USBD_OK; +} + +/** + * @brief USBD_MSC_DeInit + * DeInitilaize the mass storage configuration + * @param pdev: device instance + * @param cfgidx: configuration index + * @retval status + */ +uint8_t USBD_MSC_DeInit(USBD_HandleTypeDef *pdev, + uint8_t cfgidx) +{ + /* Close MSC EPs */ + USBD_LL_CloseEP(pdev, MSC_EPOUT_ADDR); + pdev->ep_out[MSC_EPOUT_ADDR & 0xFU].is_used = 0U; + + /* Close EP IN */ + USBD_LL_CloseEP(pdev, MSC_EPIN_ADDR); + pdev->ep_in[MSC_EPIN_ADDR & 0xFU].is_used = 0U; + + /* De-Init the BOT layer */ + MSC_BOT_DeInit(pdev); + + return USBD_OK; +} +/** +* @brief USBD_MSC_Setup +* Handle the MSC specific requests +* @param pdev: device instance +* @param req: USB request +* @retval status +*/ +uint8_t USBD_MSC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + uint8_t ret = USBD_OK; + uint16_t status_info = 0U; + + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + /* Class request */ + case USB_REQ_TYPE_CLASS: + switch (req->bRequest) + { + case BOT_GET_MAX_LUN: + if ((req->wValue == 0U) && (req->wLength == 1U) && + ((req->bmRequest & 0x80U) == 0x80U)) + { + if (msc_storage != NULL) { + hmsc->max_lun = (uint32_t)msc_storage->GetMaxLun(); + USBD_CtlSendData(pdev, (uint8_t *)(void *)&hmsc->max_lun, 1U); + } + else { + ret = USBD_FAIL; + } + } + else + { + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + } + break; + + case BOT_RESET : + if ((req->wValue == 0U) && (req->wLength == 0U) && + ((req->bmRequest & 0x80U) != 0x80U)) + { + MSC_BOT_Reset(pdev); + } + else + { + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + } + break; + + default: + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + break; + } + break; + /* Interface & Endpoint request */ + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) + { + case USB_REQ_GET_STATUS: + if (pdev->dev_state == USBD_STATE_CONFIGURED) + { + USBD_CtlSendData(pdev, (uint8_t *)(void *)&status_info, 2U); + } + else + { + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + } + break; + + case USB_REQ_GET_INTERFACE: + if (pdev->dev_state == USBD_STATE_CONFIGURED) + { + USBD_CtlSendData(pdev, (uint8_t *)(void *)&hmsc->interface, 1U); + } + else + { + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + } + break; + + case USB_REQ_SET_INTERFACE: + if (pdev->dev_state == USBD_STATE_CONFIGURED) + { + hmsc->interface = (uint8_t)(req->wValue); + } + else + { + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + } + break; + + case USB_REQ_CLEAR_FEATURE: + + /* Flush the FIFO and Clear the stall status */ + USBD_LL_FlushEP(pdev, (uint8_t)req->wIndex); + + /* Reactivate the EP */ + USBD_LL_CloseEP(pdev, (uint8_t)req->wIndex); + if ((((uint8_t)req->wIndex) & 0x80U) == 0x80U) + { + pdev->ep_in[(uint8_t)req->wIndex & 0xFU].is_used = 0U; + if (pdev->dev_speed == USBD_SPEED_HIGH) + { + /* Open EP IN */ + USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, + MSC_MAX_HS_PACKET); + } + else + { + /* Open EP IN */ + USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, + MSC_MAX_FS_PACKET); + } + pdev->ep_in[MSC_EPIN_ADDR & 0xFU].is_used = 1U; + } + else + { + pdev->ep_out[(uint8_t)req->wIndex & 0xFU].is_used = 0U; + if (pdev->dev_speed == USBD_SPEED_HIGH) + { + /* Open EP OUT */ + USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK, + MSC_MAX_HS_PACKET); + } + else + { + /* Open EP OUT */ + USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK, + MSC_MAX_FS_PACKET); + } + pdev->ep_out[MSC_EPOUT_ADDR & 0xFU].is_used = 1U; + } + + /* Handle BOT error */ + MSC_BOT_CplClrFeature(pdev, (uint8_t)req->wIndex); + break; + + default: + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + break; + } + break; + + default: + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + break; + } + + return ret; +} + +/** +* @brief USBD_MSC_DataIn +* handle data IN Stage +* @param pdev: device instance +* @param epnum: endpoint index +* @retval status +*/ +uint8_t USBD_MSC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) +{ + MSC_BOT_DataIn(pdev, epnum); + + return USBD_OK; +} + +/** +* @brief USBD_MSC_DataOut +* handle data OUT Stage +* @param pdev: device instance +* @param epnum: endpoint index +* @retval status +*/ +uint8_t USBD_MSC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) +{ + MSC_BOT_DataOut(pdev, epnum); + + return USBD_OK; +} + +/** +* @brief USBD_MSC_GetHSCfgDesc +* return configuration descriptor +* @param length : pointer data length +* @retval pointer to descriptor buffer +*/ +uint8_t *USBD_MSC_GetHSCfgDesc(uint16_t *length) +{ + *length = sizeof(USBD_MSC_CfgHSDesc); + + return USBD_MSC_CfgHSDesc; +} + +/** +* @brief USBD_MSC_GetFSCfgDesc +* return configuration descriptor +* @param length : pointer data length +* @retval pointer to descriptor buffer +*/ +uint8_t *USBD_MSC_GetFSCfgDesc(uint16_t *length) +{ + *length = sizeof(USBD_MSC_CfgFSDesc); + + return USBD_MSC_CfgFSDesc; +} + +/** +* @brief USBD_MSC_GetOtherSpeedCfgDesc +* return other speed configuration descriptor +* @param length : pointer data length +* @retval pointer to descriptor buffer +*/ +uint8_t *USBD_MSC_GetOtherSpeedCfgDesc(uint16_t *length) +{ + *length = sizeof(USBD_MSC_OtherSpeedCfgDesc); + + return USBD_MSC_OtherSpeedCfgDesc; +} +/** +* @brief DeviceQualifierDescriptor +* return Device Qualifier descriptor +* @param length : pointer data length +* @retval pointer to descriptor buffer +*/ +uint8_t *USBD_MSC_GetDeviceQualifierDescriptor(uint16_t *length) +{ + *length = sizeof(USBD_MSC_DeviceQualifierDesc); + + 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) +{ + msc_storage = fops; + + return USBD_OK; +} + +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc.h b/cores/arduino/stm32/usb/msc/usbd_msc.h new file mode 100644 index 0000000000..35c234068b --- /dev/null +++ b/cores/arduino/stm32/usb/msc/usbd_msc.h @@ -0,0 +1,133 @@ +/** + ****************************************************************************** + * @file usbd_msc.h + * @author MCD Application Team + * @brief Header for the usbd_msc.c file + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_MSC_H +#define __USBD_MSC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_msc_bot.h" +#include "usbd_msc_scsi.h" +#include "usbd_ioreq.h" + +/** @addtogroup USBD_MSC_BOT + * @{ + */ + +/** @defgroup USBD_MSC + * @brief This file is the Header file for usbd_msc.c + * @{ + */ + + +/** @defgroup USBD_BOT_Exported_Defines + * @{ + */ +/* MSC Class Config */ +#ifndef MSC_MEDIA_PACKET +#define MSC_MEDIA_PACKET 512U +#endif /* MSC_MEDIA_PACKET */ + +#define MSC_MAX_FS_PACKET 0x40U +#define MSC_MAX_HS_PACKET 0x200U + +#define BOT_GET_MAX_LUN 0xFE +#define BOT_RESET 0xFF +#define USB_MSC_CONFIG_DESC_SIZ 32 + + +#define MSC_EPIN_ADDR 0x81U +#define MSC_EPOUT_ADDR 0x01U + +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_Types + * @{ + */ +typedef struct _USBD_STORAGE +{ + int8_t (* Init)(uint8_t lun); + int8_t (* GetCapacity)(uint8_t lun, uint32_t *block_num, uint16_t *block_size); + int8_t (* IsReady)(uint8_t lun); + int8_t (* IsWriteProtected)(uint8_t lun); + int8_t (* Read)(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); + int8_t (* Write)(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); + int8_t (* GetMaxLun)(void); + int8_t *pInquiry; + +} USBD_StorageTypeDef; + + +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; + + USBD_SCSI_SenseTypeDef scsi_sense [SENSE_LIST_DEEPTH]; + 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; +} +USBD_MSC_BOT_HandleTypeDef; + +/* Structure for MSC process */ +extern USBD_ClassTypeDef USBD_MSC; +#define USBD_MSC_CLASS &USBD_MSC + +/* Handle */ +extern USBD_MSC_BOT_HandleTypeDef *msc_handle; +extern USBD_StorageTypeDef *msc_storage; + +uint8_t USBD_MSC_RegisterStorage(USBD_HandleTypeDef *pdev, + USBD_StorageTypeDef *fops); +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_MSC_H */ +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_bot.c b/cores/arduino/stm32/usb/msc/usbd_msc_bot.c new file mode 100644 index 0000000000..fe8f840b11 --- /dev/null +++ b/cores/arduino/stm32/usb/msc/usbd_msc_bot.c @@ -0,0 +1,387 @@ +/** + ****************************************************************************** + * @file usbd_msc_bot.c + * @author MCD Application Team + * @brief This file provides all the BOT protocol core functions. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* BSPDependencies +- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c" +- "stm32xxxxx_{eval}{discovery}_io.c" +- "stm32xxxxx_{eval}{discovery}{adafruit}_sd.c" +EndBSPDependencies */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_msc_bot.h" +#include "usbd_msc.h" +#include "usbd_msc_scsi.h" +#include "usbd_ioreq.h" + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup MSC_BOT + * @brief BOT protocol module + * @{ + */ + +/** @defgroup MSC_BOT_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup MSC_BOT_Private_Defines + * @{ + */ + +/** + * @} + */ + + +/** @defgroup MSC_BOT_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup MSC_BOT_Private_Variables + * @{ + */ + +/** + * @} + */ + + +/** @defgroup MSC_BOT_Private_FunctionPrototypes + * @{ + */ +static void MSC_BOT_CBW_Decode(USBD_HandleTypeDef *pdev); +static void MSC_BOT_SendData(USBD_HandleTypeDef *pdev, uint8_t *pbuf, + uint16_t len); + +static void MSC_BOT_Abort(USBD_HandleTypeDef *pdev); +/** + * @} + */ + + +/** @defgroup MSC_BOT_Private_Functions + * @{ + */ + + + +/** +* @brief MSC_BOT_Init +* Initialize the BOT Process +* @param pdev: device instance +* @retval None +*/ +void MSC_BOT_Init(USBD_HandleTypeDef *pdev) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + hmsc->bot_state = USBD_BOT_IDLE; + hmsc->bot_status = USBD_BOT_STATUS_NORMAL; + + hmsc->scsi_sense_tail = 0U; + hmsc->scsi_sense_head = 0U; + + msc_storage->Init(0U); + + USBD_LL_FlushEP(pdev, MSC_EPOUT_ADDR); + USBD_LL_FlushEP(pdev, MSC_EPIN_ADDR); + + /* Prapare EP to Receive First BOT Cmd */ + USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, (uint8_t *)(void *)&hmsc->cbw, + USBD_BOT_CBW_LENGTH); +} + +/** +* @brief MSC_BOT_Reset +* Reset the BOT Machine +* @param pdev: device instance +* @retval None +*/ +void MSC_BOT_Reset(USBD_HandleTypeDef *pdev) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + hmsc->bot_state = USBD_BOT_IDLE; + hmsc->bot_status = USBD_BOT_STATUS_RECOVERY; + + /* Prapare EP to Receive First BOT Cmd */ + USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, (uint8_t *)(void *)&hmsc->cbw, + USBD_BOT_CBW_LENGTH); +} + +/** +* @brief MSC_BOT_DeInit +* Deinitialize the BOT Machine +* @param pdev: device instance +* @retval None +*/ +void MSC_BOT_DeInit(USBD_HandleTypeDef *pdev) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + hmsc->bot_state = USBD_BOT_IDLE; +} + +/** +* @brief MSC_BOT_DataIn +* Handle BOT IN data stage +* @param pdev: device instance +* @param epnum: endpoint index +* @retval None +*/ +void MSC_BOT_DataIn(USBD_HandleTypeDef *pdev, + uint8_t epnum) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + 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); + } + break; + + case USBD_BOT_SEND_DATA: + case USBD_BOT_LAST_DATA_IN: + MSC_BOT_SendCSW(pdev, USBD_CSW_CMD_PASSED); + break; + + default: + break; + } +} +/** +* @brief MSC_BOT_DataOut +* Process MSC OUT data +* @param pdev: device instance +* @param epnum: endpoint index +* @retval None +*/ +void MSC_BOT_DataOut(USBD_HandleTypeDef *pdev, + uint8_t epnum) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + switch (hmsc->bot_state) + { + case USBD_BOT_IDLE: + MSC_BOT_CBW_Decode(pdev); + break; + + 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); + } + break; + + default: + break; + } +} + +/** +* @brief MSC_BOT_CBW_Decode +* Decode the CBW command and set the BOT state machine accordingly +* @param pdev: device instance +* @retval None +*/ +static void MSC_BOT_CBW_Decode(USBD_HandleTypeDef *pdev) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + hmsc->csw.dTag = hmsc->cbw.dTag; + hmsc->csw.dDataResidue = hmsc->cbw.dDataLength; + + if ((USBD_LL_GetRxDataSize(pdev, MSC_EPOUT_ADDR) != USBD_BOT_CBW_LENGTH) || + (hmsc->cbw.dSignature != USBD_BOT_CBW_SIGNATURE) || + (hmsc->cbw.bLUN > 1U) || + (hmsc->cbw.bCBLength < 1U) || (hmsc->cbw.bCBLength > 16U)) + { + + SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); + + hmsc->bot_status = USBD_BOT_STATUS_ERROR; + MSC_BOT_Abort(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 > 0U) + { + MSC_BOT_SendData(pdev, hmsc->bot_data, hmsc->bot_data_length); + } + else if (hmsc->bot_data_length == 0U) + { + MSC_BOT_SendCSW(pdev, USBD_CSW_CMD_PASSED); + } + else + { + MSC_BOT_Abort(pdev); + } + } + else + { + return; + } + } +} + +/** +* @brief MSC_BOT_SendData +* Send the requested data +* @param pdev: device instance +* @param buf: pointer to data buffer +* @param len: Data Length +* @retval None +*/ +static void MSC_BOT_SendData(USBD_HandleTypeDef *pdev, uint8_t *pbuf, + uint16_t len) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + uint16_t length = (uint16_t)MIN(hmsc->cbw.dDataLength, len); + + hmsc->csw.dDataResidue -= len; + hmsc->csw.bStatus = USBD_CSW_CMD_PASSED; + hmsc->bot_state = USBD_BOT_SEND_DATA; + + USBD_LL_Transmit(pdev, MSC_EPIN_ADDR, pbuf, length); +} + +/** +* @brief MSC_BOT_SendCSW +* Send the Command Status Wrapper +* @param pdev: device instance +* @param status : CSW status +* @retval None +*/ +void MSC_BOT_SendCSW(USBD_HandleTypeDef *pdev, + uint8_t CSW_Status) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + hmsc->csw.dSignature = USBD_BOT_CSW_SIGNATURE; + hmsc->csw.bStatus = CSW_Status; + hmsc->bot_state = USBD_BOT_IDLE; + + USBD_LL_Transmit(pdev, MSC_EPIN_ADDR, (uint8_t *)(void *)&hmsc->csw, + USBD_BOT_CSW_LENGTH); + + /* Prepare EP to Receive next Cmd */ + USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, (uint8_t *)(void *)&hmsc->cbw, + USBD_BOT_CBW_LENGTH); +} + +/** +* @brief MSC_BOT_Abort +* Abort the current transfer +* @param pdev: device instance +* @retval status +*/ + +static void MSC_BOT_Abort(USBD_HandleTypeDef *pdev) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + if ((hmsc->cbw.bmFlags == 0U) && + (hmsc->cbw.dDataLength != 0U) && + (hmsc->bot_status == USBD_BOT_STATUS_NORMAL)) + { + USBD_LL_StallEP(pdev, MSC_EPOUT_ADDR); + } + + USBD_LL_StallEP(pdev, MSC_EPIN_ADDR); + + if (hmsc->bot_status == USBD_BOT_STATUS_ERROR) + { + USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, (uint8_t *)(void *)&hmsc->cbw, + USBD_BOT_CBW_LENGTH); + } +} + +/** +* @brief MSC_BOT_CplClrFeature +* Complete the clear feature request +* @param pdev: device instance +* @param epnum: endpoint index +* @retval None +*/ + +void MSC_BOT_CplClrFeature(USBD_HandleTypeDef *pdev, uint8_t epnum) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + if (hmsc->bot_status == USBD_BOT_STATUS_ERROR) /* Bad CBW Signature */ + { + USBD_LL_StallEP(pdev, MSC_EPIN_ADDR); + hmsc->bot_status = USBD_BOT_STATUS_NORMAL; + } + else if (((epnum & 0x80U) == 0x80U) && (hmsc->bot_status != USBD_BOT_STATUS_RECOVERY)) + { + MSC_BOT_SendCSW(pdev, USBD_CSW_CMD_FAILED); + } + else + { + return; + } +} +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_bot.h b/cores/arduino/stm32/usb/msc/usbd_msc_bot.h new file mode 100644 index 0000000000..f5b1b6d42e --- /dev/null +++ b/cores/arduino/stm32/usb/msc/usbd_msc_bot.h @@ -0,0 +1,150 @@ +/** + ****************************************************************************** + * @file usbd_msc_bot.h + * @author MCD Application Team + * @brief Header for the usbd_msc_bot.c file + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_MSC_BOT_H +#define __USBD_MSC_BOT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_core.h" + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup MSC_BOT + * @brief This file is the Header file for usbd_msc_bot.c + * @{ + */ + + +/** @defgroup USBD_CORE_Exported_Defines + * @{ + */ +#define USBD_BOT_IDLE 0U /* Idle state */ +#define USBD_BOT_DATA_OUT 1U /* Data Out state */ +#define USBD_BOT_DATA_IN 2U /* Data In state */ +#define USBD_BOT_LAST_DATA_IN 3U /* Last Data In Last */ +#define USBD_BOT_SEND_DATA 4U /* Send Immediate data */ +#define USBD_BOT_NO_DATA 5U /* No data Stage */ + +#define USBD_BOT_CBW_SIGNATURE 0x43425355U +#define USBD_BOT_CSW_SIGNATURE 0x53425355U +#define USBD_BOT_CBW_LENGTH 31U +#define USBD_BOT_CSW_LENGTH 13U +#define USBD_BOT_MAX_DATA 256U + +/* CSW Status Definitions */ +#define USBD_CSW_CMD_PASSED 0x00U +#define USBD_CSW_CMD_FAILED 0x01U +#define USBD_CSW_PHASE_ERROR 0x02U + +/* BOT Status */ +#define USBD_BOT_STATUS_NORMAL 0U +#define USBD_BOT_STATUS_RECOVERY 1U +#define USBD_BOT_STATUS_ERROR 2U + + +#define USBD_DIR_IN 0U +#define USBD_DIR_OUT 1U +#define USBD_BOTH_DIR 2U + +/** + * @} + */ + +/** @defgroup MSC_CORE_Private_TypesDefinitions + * @{ + */ + +typedef struct +{ + uint32_t dSignature; + uint32_t dTag; + uint32_t dDataLength; + uint8_t bmFlags; + uint8_t bLUN; + uint8_t bCBLength; + uint8_t CB[16]; + uint8_t ReservedForAlign; +} +USBD_MSC_BOT_CBWTypeDef; + + +typedef struct +{ + uint32_t dSignature; + uint32_t dTag; + uint32_t dDataResidue; + uint8_t bStatus; + uint8_t ReservedForAlign[3]; +} +USBD_MSC_BOT_CSWTypeDef; + +/** + * @} + */ + + +/** @defgroup USBD_CORE_Exported_Types + * @{ + */ + +/** + * @} + */ +/** @defgroup USBD_CORE_Exported_FunctionsPrototypes + * @{ + */ +void MSC_BOT_Init(USBD_HandleTypeDef *pdev); +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_SendCSW(USBD_HandleTypeDef *pdev, + uint8_t CSW_Status); + +void MSC_BOT_CplClrFeature(USBD_HandleTypeDef *pdev, + uint8_t epnum); +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_MSC_BOT_H */ +/** + * @} + */ + +/** +* @} +*/ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_data.c b/cores/arduino/stm32/usb/msc/usbd_msc_data.c new file mode 100644 index 0000000000..aaafc3aa1e --- /dev/null +++ b/cores/arduino/stm32/usb/msc/usbd_msc_data.c @@ -0,0 +1,135 @@ +/** + ****************************************************************************** + * @file usbd_msc_data.c + * @author MCD Application Team + * @brief This file provides all the vital inquiry pages and sense data. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* BSPDependencies +- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c" +- "stm32xxxxx_{eval}{discovery}_io.c" +- "stm32xxxxx_{eval}{discovery}{adafruit}_sd.c" +EndBSPDependencies */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_msc_data.h" + + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup MSC_DATA + * @brief Mass storage info/data module + * @{ + */ + +/** @defgroup MSC_DATA_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup MSC_DATA_Private_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup MSC_DATA_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup MSC_DATA_Private_Variables + * @{ + */ + + +/* USB Mass storage Page 0 Inquiry Data */ +const uint8_t MSC_Page00_Inquiry_Data[] = +{ + 0x00, + 0x00, + 0x00, + (LENGTH_INQUIRY_PAGE00 - 4U), + 0x00, + 0x80, + 0x83 +}; +/* USB Mass storage sense 6 Data */ +const uint8_t MSC_Mode_Sense6_data[] = +{ + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00 +}; +/* USB Mass storage sense 10 Data */ +const uint8_t MSC_Mode_Sense10_data[] = +{ + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00 +}; +/** + * @} + */ + + +/** @defgroup MSC_DATA_Private_FunctionPrototypes + * @{ + */ +/** + * @} + */ + + +/** @defgroup MSC_DATA_Private_Functions + * @{ + */ + +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_data.h b/cores/arduino/stm32/usb/msc/usbd_msc_data.h new file mode 100644 index 0000000000..79dafbd67f --- /dev/null +++ b/cores/arduino/stm32/usb/msc/usbd_msc_data.h @@ -0,0 +1,103 @@ +/** + ****************************************************************************** + * @file usbd_msc_data.h + * @author MCD Application Team + * @brief Header for the usbd_msc_data.c file + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_MSC_DATA_H +#define __USBD_MSC_DATA_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_conf.h" + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USB_INFO + * @brief general defines for the usb device library file + * @{ + */ + +/** @defgroup USB_INFO_Exported_Defines + * @{ + */ +#define MODE_SENSE6_LEN 8U +#define MODE_SENSE10_LEN 8U +#define LENGTH_INQUIRY_PAGE00 7U +#define LENGTH_FORMAT_CAPACITIES 20U + +/** + * @} + */ + + +/** @defgroup USBD_INFO_Exported_TypesDefinitions + * @{ + */ +/** + * @} + */ + + + +/** @defgroup USBD_INFO_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_INFO_Exported_Variables + * @{ + */ +extern const uint8_t MSC_Page00_Inquiry_Data[]; +extern const uint8_t MSC_Mode_Sense6_data[]; +extern const uint8_t MSC_Mode_Sense10_data[] ; + +/** + * @} + */ + +/** @defgroup USBD_INFO_Exported_FunctionsPrototype + * @{ + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_MSC_DATA_H */ + +/** + * @} + */ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c new file mode 100644 index 0000000000..3c98584244 --- /dev/null +++ b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c @@ -0,0 +1,716 @@ +/** + ****************************************************************************** + * @file usbd_msc_scsi.c + * @author MCD Application Team + * @brief This file provides all the USBD SCSI layer functions. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* BSPDependencies +- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c" +- "stm32xxxxx_{eval}{discovery}_io.c" +- "stm32xxxxx_{eval}{discovery}{adafruit}_sd.c" +EndBSPDependencies */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_msc_bot.h" +#include "usbd_msc_scsi.h" +#include "usbd_msc.h" +#include "usbd_msc_data.h" + + + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup MSC_SCSI + * @brief Mass storage SCSI layer module + * @{ + */ + +/** @defgroup MSC_SCSI_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup MSC_SCSI_Private_Defines + * @{ + */ + +/** + * @} + */ + + +/** @defgroup MSC_SCSI_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup MSC_SCSI_Private_Variables + * @{ + */ + +/** + * @} + */ + + +/** @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, uint32_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); +/** + * @} + */ + + +/** @defgroup MSC_SCSI_Private_Functions + * @{ + */ + + +/** +* @brief SCSI_ProcessCmd +* Process SCSI commands +* @param pdev: device instance +* @param lun: Logical unit number +* @param params: Command parameters +* @retval status +*/ +int8_t SCSI_ProcessCmd(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *cmd) +{ + switch (cmd[0]) + { + case SCSI_TEST_UNIT_READY: + SCSI_TestUnitReady(pdev, lun, cmd); + break; + + case SCSI_REQUEST_SENSE: + SCSI_RequestSense(pdev, lun, cmd); + break; + case SCSI_INQUIRY: + SCSI_Inquiry(pdev, lun, cmd); + break; + + case SCSI_START_STOP_UNIT: + SCSI_StartStopUnit(pdev, lun, cmd); + break; + + case SCSI_ALLOW_MEDIUM_REMOVAL: + SCSI_StartStopUnit(pdev, lun, cmd); + break; + + case SCSI_MODE_SENSE6: + SCSI_ModeSense6(pdev, lun, cmd); + break; + + case SCSI_MODE_SENSE10: + SCSI_ModeSense10(pdev, lun, cmd); + break; + + case SCSI_READ_FORMAT_CAPACITIES: + SCSI_ReadFormatCapacity(pdev, lun, cmd); + break; + + case SCSI_READ_CAPACITY10: + SCSI_ReadCapacity10(pdev, lun, cmd); + break; + + case SCSI_READ10: + SCSI_Read10(pdev, lun, cmd); + break; + + case SCSI_WRITE10: + SCSI_Write10(pdev, lun, cmd); + break; + + case SCSI_VERIFY10: + SCSI_Verify10(pdev, lun, cmd); + break; + + default: + SCSI_SenseCode(pdev, lun, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } + + return 0; +} + + +/** +* @brief SCSI_TestUnitReady +* Process SCSI Test Unit Ready Command +* @param lun: Logical unit number +* @param params: Command parameters +* @retval status +*/ +static int8_t SCSI_TestUnitReady(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + /* case 9 : Hi > D0 */ + if (hmsc->cbw.dDataLength != 0U) + { + SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); + + return -1; + } + + if (msc_storage->IsReady(lun) != 0) + { + SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); + hmsc->bot_state = USBD_BOT_NO_DATA; + + return -1; + } + hmsc->bot_data_length = 0U; + + return 0; +} + +/** +* @brief SCSI_Inquiry +* Process Inquiry command +* @param lun: Logical unit number +* @param params: Command parameters +* @retval status +*/ +static int8_t SCSI_Inquiry(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +{ + uint8_t *pPage; + uint16_t len; + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + if (params[1] & 0x01U)/*Evpd is set*/ + { + len = LENGTH_INQUIRY_PAGE00; + hmsc->bot_data_length = len; + + while (len) + { + len--; + hmsc->bot_data[len] = MSC_Page00_Inquiry_Data[len]; + } + } + else + { + pPage = (uint8_t *)(void *) & msc_storage->pInquiry[lun * STANDARD_INQUIRY_DATA_LEN]; + len = (uint16_t)pPage[4] + 5U; + + if (params[4] <= len) + { + len = params[4]; + } + hmsc->bot_data_length = len; + + while (len) + { + len--; + hmsc->bot_data[len] = pPage[len]; + } + } + + return 0; +} + +/** +* @brief SCSI_ReadCapacity10 +* Process Read Capacity 10 command +* @param lun: Logical unit number +* @param params: Command parameters +* @retval status +*/ +static int8_t SCSI_ReadCapacity10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + if (msc_storage->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 - 1U) >> 24); + hmsc->bot_data[1] = (uint8_t)((hmsc->scsi_blk_nbr - 1U) >> 16); + hmsc->bot_data[2] = (uint8_t)((hmsc->scsi_blk_nbr - 1U) >> 8); + hmsc->bot_data[3] = (uint8_t)(hmsc->scsi_blk_nbr - 1U); + + 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 = 8U; + return 0; + } +} +/** +* @brief SCSI_ReadFormatCapacity +* Process Read Format Capacity command +* @param lun: Logical unit number +* @param params: Command parameters +* @retval status +*/ +static int8_t SCSI_ReadFormatCapacity(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + uint16_t blk_size; + uint32_t blk_nbr; + uint16_t i; + + for (i = 0U; i < 12U ; i++) + { + hmsc->bot_data[i] = 0U; + } + + if (msc_storage->GetCapacity(lun, &blk_nbr, &blk_size) != 0U) + { + SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); + return -1; + } + else + { + hmsc->bot_data[3] = 0x08U; + hmsc->bot_data[4] = (uint8_t)((blk_nbr - 1U) >> 24); + hmsc->bot_data[5] = (uint8_t)((blk_nbr - 1U) >> 16); + hmsc->bot_data[6] = (uint8_t)((blk_nbr - 1U) >> 8); + hmsc->bot_data[7] = (uint8_t)(blk_nbr - 1U); + + hmsc->bot_data[8] = 0x02U; + 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 = 12U; + return 0; + } +} +/** +* @brief SCSI_ModeSense6 +* Process Mode Sense6 command +* @param lun: Logical unit number +* @param params: Command parameters +* @retval status +*/ +static int8_t SCSI_ModeSense6(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + uint16_t len = 8U; + hmsc->bot_data_length = len; + + while (len) + { + len--; + hmsc->bot_data[len] = MSC_Mode_Sense6_data[len]; + } + return 0; +} + +/** +* @brief SCSI_ModeSense10 +* Process Mode Sense10 command +* @param lun: Logical unit number +* @param params: Command parameters +* @retval status +*/ +static int8_t SCSI_ModeSense10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +{ + uint16_t len = 8U; + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + hmsc->bot_data_length = len; + + while (len) + { + len--; + hmsc->bot_data[len] = MSC_Mode_Sense10_data[len]; + } + + return 0; +} + +/** +* @brief SCSI_RequestSense +* Process Request Sense command +* @param lun: Logical unit number +* @param params: Command parameters +* @retval status +*/ + +static int8_t SCSI_RequestSense(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +{ + uint8_t i; + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + for (i = 0U ; i < REQUEST_SENSE_DATA_LEN; i++) + { + hmsc->bot_data[i] = 0U; + } + + hmsc->bot_data[0] = 0x70U; + hmsc->bot_data[7] = REQUEST_SENSE_DATA_LEN - 6U; + + 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 = 0U; + } + } + hmsc->bot_data_length = REQUEST_SENSE_DATA_LEN; + + if (params[4] <= REQUEST_SENSE_DATA_LEN) + { + hmsc->bot_data_length = params[4]; + } + return 0; +} + +/** +* @brief SCSI_SenseCode +* Load the last error code in the error list +* @param lun: Logical unit number +* @param sKey: Sense Key +* @param ASC: Additional Sense Key +* @retval none + +*/ +void SCSI_SenseCode(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t sKey, uint8_t ASC) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + 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) + { + hmsc->scsi_sense_tail = 0U; + } +} +/** +* @brief SCSI_StartStopUnit +* Process Start Stop Unit command +* @param lun: Logical unit number +* @param params: Command parameters +* @retval status +*/ +static int8_t SCSI_StartStopUnit(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + hmsc->bot_data_length = 0U; + return 0; +} + +/** +* @brief SCSI_Read10 +* Process Read10 command +* @param lun: Logical unit number +* @param params: Command parameters +* @retval status +*/ +static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + if (hmsc->bot_state == USBD_BOT_IDLE) /* Idle */ + { + /* case 10 : Ho <> Di */ + if ((hmsc->cbw.bmFlags & 0x80U) != 0x80U) + { + SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } + + if (msc_storage->IsReady(lun) != 0) + { + SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); + return -1; + } + + hmsc->scsi_blk_addr = ((uint32_t)params[2] << 24) | + ((uint32_t)params[3] << 16) | + ((uint32_t)params[4] << 8) | + (uint32_t)params[5]; + + hmsc->scsi_blk_len = ((uint32_t)params[7] << 8) | (uint32_t)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; + + /* cases 4,5 : Hi <> Dn */ + if (hmsc->cbw.dDataLength != (hmsc->scsi_blk_len * hmsc->scsi_blk_size)) + { + SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } + } + hmsc->bot_data_length = MSC_MEDIA_PACKET; + + return SCSI_ProcessRead(pdev, lun); +} + +/** +* @brief SCSI_Write10 +* Process Write10 command +* @param lun: Logical unit number +* @param params: Command parameters +* @retval status +*/ + +static int8_t SCSI_Write10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + uint32_t len; + + if (hmsc->bot_state == USBD_BOT_IDLE) /* Idle */ + { + /* case 8 : Hi <> Do */ + if ((hmsc->cbw.bmFlags & 0x80U) == 0x80U) + { + SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } + + /* Check whether Media is ready */ + if (msc_storage->IsReady(lun) != 0) + { + SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); + return -1; + } + + /* Check If media is write-protected */ + if (msc_storage->IsWriteProtected(lun) != 0) + { + SCSI_SenseCode(pdev, lun, NOT_READY, WRITE_PROTECTED); + return -1; + } + + hmsc->scsi_blk_addr = ((uint32_t)params[2] << 24) | + ((uint32_t)params[3] << 16) | + ((uint32_t)params[4] << 8) | + (uint32_t)params[5]; + + hmsc->scsi_blk_len = ((uint32_t)params[7] << 8) | + (uint32_t)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 */ + } + + len = hmsc->scsi_blk_len * hmsc->scsi_blk_size; + + /* cases 3,11,13 : Hn,Ho <> D0 */ + if (hmsc->cbw.dDataLength != len) + { + SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } + + len = MIN(len, MSC_MEDIA_PACKET); + + /* Prepare EP to receive first data packet */ + hmsc->bot_state = USBD_BOT_DATA_OUT; + USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, hmsc->bot_data, len); + } + else /* Write Process ongoing */ + { + return SCSI_ProcessWrite(pdev, lun); + } + return 0; +} + + +/** +* @brief SCSI_Verify10 +* Process Verify10 command +* @param lun: Logical unit number +* @param params: Command parameters +* @retval status +*/ + +static int8_t SCSI_Verify10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + if ((params[1] & 0x02U) == 0x02U) + { + SCSI_SenseCode(pdev, lun, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); + return -1; /* Error, Verify Mode Not supported*/ + } + + if (SCSI_CheckAddressRange(pdev, lun, hmsc->scsi_blk_addr, + hmsc->scsi_blk_len) < 0) + { + return -1; /* error */ + } + hmsc->bot_data_length = 0U; + return 0; +} + +/** +* @brief SCSI_CheckAddressRange +* Check address range +* @param lun: Logical unit number +* @param blk_offset: first block address +* @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, uint32_t blk_nbr) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + if ((blk_offset + blk_nbr) > hmsc->scsi_blk_nbr) + { + SCSI_SenseCode(pdev, lun, ILLEGAL_REQUEST, ADDRESS_OUT_OF_RANGE); + return -1; + } + 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 = msc_handle; + uint32_t len = hmsc->scsi_blk_len * hmsc->scsi_blk_size; + + len = MIN(len, MSC_MEDIA_PACKET); + + if (msc_storage->Read(lun, + hmsc->bot_data, + hmsc->scsi_blk_addr, + (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_size); + hmsc->scsi_blk_len -= (len / hmsc->scsi_blk_size); + + /* case 6 : Hi = Di */ + hmsc->csw.dDataResidue -= len; + + if (hmsc->scsi_blk_len == 0U) + { + 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) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + uint32_t len = hmsc->scsi_blk_len * hmsc->scsi_blk_size; + + len = MIN(len, MSC_MEDIA_PACKET); + + if (msc_storage->Write(lun, hmsc->bot_data, + hmsc->scsi_blk_addr, + (len / hmsc->scsi_blk_size)) < 0) + { + SCSI_SenseCode(pdev, lun, HARDWARE_ERROR, WRITE_FAULT); + + return -1; + } + + hmsc->scsi_blk_addr += (len / hmsc->scsi_blk_size); + hmsc->scsi_blk_len -= (len / hmsc->scsi_blk_size); + + /* case 12 : Ho = Do */ + hmsc->csw.dDataResidue -= len; + + if (hmsc->scsi_blk_len == 0U) + { + MSC_BOT_SendCSW(pdev, USBD_CSW_CMD_PASSED); + } + else + { + len = MIN((hmsc->scsi_blk_len * hmsc->scsi_blk_size), MSC_MEDIA_PACKET); + /* Prepare EP to Receive next packet */ + USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, hmsc->bot_data, len); + } + + return 0; +} +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.h b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.h new file mode 100644 index 0000000000..1629d786c3 --- /dev/null +++ b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.h @@ -0,0 +1,192 @@ +/** + ****************************************************************************** + * @file usbd_msc_scsi.h + * @author MCD Application Team + * @brief Header for the usbd_msc_scsi.c file + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_MSC_SCSI_H +#define __USBD_MSC_SCSI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_SCSI + * @brief header file for the storage disk file + * @{ + */ + +/** @defgroup USBD_SCSI_Exported_Defines + * @{ + */ + +#define SENSE_LIST_DEEPTH 4U + +/* SCSI Commands */ +#define SCSI_FORMAT_UNIT 0x04U +#define SCSI_INQUIRY 0x12U +#define SCSI_MODE_SELECT6 0x15U +#define SCSI_MODE_SELECT10 0x55U +#define SCSI_MODE_SENSE6 0x1AU +#define SCSI_MODE_SENSE10 0x5AU +#define SCSI_ALLOW_MEDIUM_REMOVAL 0x1EU +#define SCSI_READ6 0x08U +#define SCSI_READ10 0x28U +#define SCSI_READ12 0xA8U +#define SCSI_READ16 0x88U + +#define SCSI_READ_CAPACITY10 0x25U +#define SCSI_READ_CAPACITY16 0x9EU + +#define SCSI_REQUEST_SENSE 0x03U +#define SCSI_START_STOP_UNIT 0x1BU +#define SCSI_TEST_UNIT_READY 0x00U +#define SCSI_WRITE6 0x0AU +#define SCSI_WRITE10 0x2AU +#define SCSI_WRITE12 0xAAU +#define SCSI_WRITE16 0x8AU + +#define SCSI_VERIFY10 0x2FU +#define SCSI_VERIFY12 0xAFU +#define SCSI_VERIFY16 0x8FU + +#define SCSI_SEND_DIAGNOSTIC 0x1DU +#define SCSI_READ_FORMAT_CAPACITIES 0x23U + +#define NO_SENSE 0U +#define RECOVERED_ERROR 1U +#define NOT_READY 2U +#define MEDIUM_ERROR 3U +#define HARDWARE_ERROR 4U +#define ILLEGAL_REQUEST 5U +#define UNIT_ATTENTION 6U +#define DATA_PROTECT 7U +#define BLANK_CHECK 8U +#define VENDOR_SPECIFIC 9U +#define COPY_ABORTED 10U +#define ABORTED_COMMAND 11U +#define VOLUME_OVERFLOW 13U +#define MISCOMPARE 14U + + +#define INVALID_CDB 0x20U +#define INVALID_FIELED_IN_COMMAND 0x24U +#define PARAMETER_LIST_LENGTH_ERROR 0x1AU +#define INVALID_FIELD_IN_PARAMETER_LIST 0x26U +#define ADDRESS_OUT_OF_RANGE 0x21U +#define MEDIUM_NOT_PRESENT 0x3AU +#define MEDIUM_HAVE_CHANGED 0x28U +#define WRITE_PROTECTED 0x27U +#define UNRECOVERED_READ_ERROR 0x11U +#define WRITE_FAULT 0x03U + +#define READ_FORMAT_CAPACITY_DATA_LEN 0x0CU +#define READ_CAPACITY10_DATA_LEN 0x08U +#define MODE_SENSE10_DATA_LEN 0x08U +#define MODE_SENSE6_DATA_LEN 0x04U +#define REQUEST_SENSE_DATA_LEN 0x12U +#define STANDARD_INQUIRY_DATA_LEN 0x24U +#define BLKVFY 0x04U + +extern uint8_t Page00_Inquiry_Data[]; +extern uint8_t Standard_Inquiry_Data[]; +extern uint8_t Standard_Inquiry_Data2[]; +extern uint8_t Mode_Sense6_data[]; +extern uint8_t Mode_Sense10_data[]; +extern uint8_t Scsi_Sense_Data[]; +extern uint8_t ReadCapacity10_Data[]; +extern uint8_t ReadFormatCapacity_Data []; +/** + * @} + */ + + +/** @defgroup USBD_SCSI_Exported_TypesDefinitions + * @{ + */ + +typedef struct _SENSE_ITEM +{ + char Skey; + union + { + struct _ASCs + { + char ASC; + char ASCQ; + } b; + uint8_t ASC; + char *pData; + } w; +} USBD_SCSI_SenseTypeDef; +/** + * @} + */ + +/** @defgroup USBD_SCSI_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_SCSI_Exported_Variables + * @{ + */ + +/** + * @} + */ +/** @defgroup USBD_SCSI_Exported_FunctionsPrototype + * @{ + */ +int8_t SCSI_ProcessCmd(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *cmd); + +void SCSI_SenseCode(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t sKey, + uint8_t ASC); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_MSC_SCSI_H */ +/** + * @} + */ + +/** + * @} + */ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + From db11e1b27f1f006a2c226a51bd935507581327c2 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Fri, 29 May 2020 14:26:38 +0100 Subject: [PATCH 02/37] added endpoint configuration --- cores/arduino/stm32/usb/cdc/usbd_cdc.c | 180 +++++++++++++------------ 1 file changed, 91 insertions(+), 89 deletions(-) diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc.c b/cores/arduino/stm32/usb/cdc/usbd_cdc.c index 9ee0d7885a..219efa06f7 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc.c +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc.c @@ -51,18 +51,17 @@ */ #ifdef USBCON -#ifdef USBD_USE_CDC /* Includes ------------------------------------------------------------------*/ #include "usbd_cdc.h" #include "usbd_ctlreq.h" +#ifdef USBD_USE_CDC_CLASS /** @addtogroup STM32_USB_DEVICE_LIBRARY * @{ */ - /** @defgroup USBD_CDC * @brief usbd core module * @{ @@ -75,7 +74,6 @@ * @} */ - /** @defgroup USBD_CDC_Private_Defines * @{ */ @@ -83,7 +81,6 @@ * @} */ - /** @defgroup USBD_CDC_Private_Macros * @{ */ @@ -92,22 +89,35 @@ * @} */ - /** @defgroup USBD_CDC_Private_FunctionPrototypes * @{ */ -static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_CDC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev); - -static uint8_t *USBD_CDC_GetFSCfgDesc(uint16_t *length); -static uint8_t *USBD_CDC_GetHSCfgDesc(uint16_t *length); -static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length); -static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length); +static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, + uint8_t cfgidx); + +static uint8_t USBD_CDC_DeInit(USBD_HandleTypeDef *pdev, + uint8_t cfgidx); + +static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req); + +static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, + uint8_t epnum); + +static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, + uint8_t epnum); + +static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev); + +static uint8_t *USBD_CDC_GetFSCfgDesc(uint16_t *length); + +static uint8_t *USBD_CDC_GetHSCfgDesc(uint16_t *length); + +static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length); + +static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length); + uint8_t *USBD_CDC_GetDeviceQualifierDescriptor(uint16_t *length); /* USB Standard Device Descriptor */ @@ -402,6 +412,15 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_OtherSpeedCfgDesc[USB_CDC_CONFIG_DESC_SIZ] 0x00 /* bInterval */ }; + + +USBD_CDC_HandleTypeDef cdc_handle_dat; +USBD_CDC_HandleTypeDef *cdc_handle = &cdc_handle_dat; + +USBD_CDC_ItfTypeDef *cdc_itf = NULL; /* TODO */ + + + /** * @} */ @@ -420,7 +439,8 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_OtherSpeedCfgDesc[USB_CDC_CONFIG_DESC_SIZ] static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) { UNUSED(cfgidx); - USBD_CDC_HandleTypeDef *hcdc; + + USBD_CDC_HandleTypeDef *hcdc = cdc_handle; hcdc = USBD_malloc(sizeof(USBD_CDC_HandleTypeDef)); @@ -468,7 +488,7 @@ static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) pdev->ep_in[CDC_CMD_EP & 0xFU].is_used = 1U; /* Init physical Interface components */ - ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Init(); + cdc_itf->Init(); /* Init Xfer states */ hcdc->TxState = 0U; @@ -476,15 +496,15 @@ static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) if (pdev->dev_speed == USBD_SPEED_HIGH) { /* Prepare Out endpoint to receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer, - CDC_DATA_HS_OUT_PACKET_SIZE); + USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer, + CDC_DATA_HS_OUT_PACKET_SIZE); } else { /* Prepare Out endpoint to receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer, - CDC_DATA_FS_OUT_PACKET_SIZE); + USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer, + CDC_DATA_FS_OUT_PACKET_SIZE); } - return (uint8_t)USBD_OK; + return ret; } /** @@ -513,11 +533,8 @@ static uint8_t USBD_CDC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) pdev->ep_in[CDC_CMD_EP & 0xFU].bInterval = 0U; /* DeInit physical Interface components */ - if (pdev->pClassData != NULL) { - ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->DeInit(); - (void)USBD_free(pdev->pClassData); - pdev->pClassData = NULL; - } + /* TODO remove user data reference */ + cdc_itf->DeInit(); return ret; } @@ -532,18 +549,18 @@ static uint8_t USBD_CDC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *) pdev->pClassData; + USBD_CDC_HandleTypeDef *hcdc = cdc_handle; uint8_t ifalt = 0U; uint16_t status_info = 0U; USBD_StatusTypeDef ret = USBD_OK; switch (req->bmRequest & USB_REQ_TYPE_MASK) { - case USB_REQ_TYPE_CLASS: - if (req->wLength != 0U) { - if ((req->bmRequest & 0x80U) != 0U) { - ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Control(req->bRequest, - (uint8_t *)hcdc->data, - req->wLength); + case USB_REQ_TYPE_CLASS : + if (req->wLength) { + if (req->bmRequest & 0x80U) { + cdc_itf->Control(req->bRequest, + (uint8_t *)(void *)hcdc->data, + req->wLength); (void)USBD_CtlSendData(pdev, (uint8_t *)hcdc->data, req->wLength); } else { @@ -553,8 +570,8 @@ static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, (void)USBD_CtlPrepareRx(pdev, (uint8_t *)hcdc->data, req->wLength); } } else { - ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Control(req->bRequest, - (uint8_t *)req, 0U); + cdc_itf->Control(req->bRequest, + (uint8_t *)(void *)req, 0U); } break; @@ -613,26 +630,23 @@ static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, */ static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) { - USBD_CDC_HandleTypeDef *hcdc; + USBD_CDC_HandleTypeDef *hcdc = cdc_handle; PCD_HandleTypeDef *hpcd = pdev->pData; - - if (pdev->pClassData == NULL) { - return (uint8_t)USBD_FAIL; - } - hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassData; + USBD_CDC_ItfTypeDef *ctrl = cdc_itf; if ((pdev->ep_in[epnum].total_length > 0U) && ((pdev->ep_in[epnum].total_length % hpcd->IN_ep[epnum].maxpacket) == 0U)) { /* Update the packet total length */ pdev->ep_in[epnum].total_length = 0U; /* Send ZLP */ - (void)USBD_LL_Transmit(pdev, epnum, NULL, 0U); + USBD_LL_Transmit(pdev, epnum, NULL, 0U); } else { hcdc->TxState = 0U; - ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->TransmitCplt(hcdc->TxBuffer, &hcdc->TxLength, epnum); + if (ctrl->Transferred) { + ctrl->Transferred(); + } } - - return (uint8_t)USBD_OK; + return USBD_OK; } /** @@ -644,21 +658,16 @@ static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) */ static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) { - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassData; - - if (pdev->pClassData == NULL) { - return (uint8_t)USBD_FAIL; - } + USBD_CDC_HandleTypeDef *hcdc = cdc_handle; /* Get the received data length */ hcdc->RxLength = USBD_LL_GetRxDataSize(pdev, epnum); /* USB data will be immediately processed, this allow next USB traffic being NAKed till the end of the application Xfer */ + cdc_itf->Receive(hcdc->RxBuffer, &hcdc->RxLength); - ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Receive(hcdc->RxBuffer, &hcdc->RxLength); - - return (uint8_t)USBD_OK; + return USBD_OK; } /** @@ -669,14 +678,13 @@ static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) */ static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev) { - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassData; + USBD_CDC_HandleTypeDef *hcdc = cdc_handle; if ((pdev->pUserData != NULL) && (hcdc->CmdOpCode != 0xFFU)) { - ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Control(hcdc->CmdOpCode, - (uint8_t *)hcdc->data, - (uint16_t)hcdc->CmdLength); + cdc_itf->Control(hcdc->CmdOpCode, + (uint8_t *)(void *)hcdc->data, + (uint16_t)hcdc->CmdLength); hcdc->CmdOpCode = 0xFFU; - } return (uint8_t)USBD_OK; @@ -764,7 +772,7 @@ uint8_t USBD_CDC_RegisterInterface(USBD_HandleTypeDef *pdev, uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff, uint32_t length) { - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassData; + USBD_CDC_HandleTypeDef *hcdc = cdc_handle; hcdc->TxBuffer = pbuff; hcdc->TxLength = length; @@ -781,7 +789,7 @@ uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, */ uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff) { - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassData; + USBD_CDC_HandleTypeDef *hcdc = cdc_handle; hcdc->RxBuffer = pbuff; @@ -796,12 +804,7 @@ uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff) */ uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev) { - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassData; - USBD_StatusTypeDef ret = USBD_BUSY; - - if (pdev->pClassData == NULL) { - return (uint8_t)USBD_FAIL; - } + USBD_CDC_HandleTypeDef *hcdc = cdc_handle; if (hcdc->TxState == 0U) { /* Tx Transfer in progress */ @@ -811,9 +814,12 @@ uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev) pdev->ep_in[CDC_IN_EP & 0xFU].total_length = hcdc->TxLength; /* Transmit next packet */ - (void)USBD_LL_Transmit(pdev, CDC_IN_EP, hcdc->TxBuffer, hcdc->TxLength); + USBD_LL_Transmit(pdev, CDC_IN_EP, hcdc->TxBuffer, + (uint16_t)hcdc->TxLength); - ret = USBD_OK; + return USBD_OK; + } else { + return USBD_BUSY; } return (uint8_t)ret; @@ -828,37 +834,33 @@ uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev) */ uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev) { - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassData; - - if (pdev->pClassData == NULL) { - return (uint8_t)USBD_FAIL; - } + USBD_CDC_HandleTypeDef *hcdc = cdc_handle; + /* Suspend or Resume USB Out process */ if (pdev->dev_speed == USBD_SPEED_HIGH) { /* Prepare Out endpoint to receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer, - CDC_DATA_HS_OUT_PACKET_SIZE); + USBD_LL_PrepareReceive(pdev, + CDC_OUT_EP, + hcdc->RxBuffer, + CDC_DATA_HS_OUT_PACKET_SIZE); } else { /* Prepare Out endpoint to receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer, - CDC_DATA_FS_OUT_PACKET_SIZE); + USBD_LL_PrepareReceive(pdev, + CDC_OUT_EP, + hcdc->RxBuffer, + CDC_DATA_FS_OUT_PACKET_SIZE); } - - return (uint8_t)USBD_OK; + return USBD_OK; } uint8_t USBD_CDC_ClearBuffer(USBD_HandleTypeDef *pdev) { /* Suspend or Resume USB Out process */ - if (pdev->pClassData != NULL) { - /* Prepare Out endpoint to receive next packet */ - USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, 0, 0); - return (uint8_t)USBD_OK; - } else { - return (uint8_t)USBD_FAIL; - } + /* Prepare Out endpoint to receive next packet */ + USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, 0, 0); + return USBD_OK; } -#endif /* USBD_USE_CDC */ +#endif /* USBD_USE_CDC_CLASS */ #endif /* USBCON */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ From 1c247ede5ad9a731b3ef7766acc8f4f1dc911a79 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Fri, 29 May 2020 14:30:27 +0100 Subject: [PATCH 03/37] added endpoint define changes --- cores/arduino/stm32/usb/usbd_conf.h | 13 +++++++ cores/arduino/stm32/usb/usbd_ep_conf.h | 53 ++++++++++++++++++-------- 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/cores/arduino/stm32/usb/usbd_conf.h b/cores/arduino/stm32/usb/usbd_conf.h index c1a4808380..db346747b0 100644 --- a/cores/arduino/stm32/usb/usbd_conf.h +++ b/cores/arduino/stm32/usb/usbd_conf.h @@ -40,6 +40,7 @@ extern "C" { #include #include + #if defined(USB_BASE) #if defined(STM32F1xx) @@ -107,6 +108,18 @@ extern "C" { #define USB_BB_MAX_NUM_ALT_MODE 0x2U #endif /* USB_BB_MAX_NUM_ALT_MODE */ + +/* Endpoint Configuration */ + +#define CDC_IN_EP 0x81 /* EP1 for data IN */ +#define CDC_OUT_EP 0x01 /* EP1 for data OUT */ +#define CDC_CMD_EP 0x82 /* EP2 for CDC commands */ + +#define MSC_IN_EP 0x83 /* EP3 for Interrupt IN */ +#define MSC_OUT_EP 0x02 /* EP3 for Interrupt IN */ + + + /* MSC Class Config */ #ifndef MSC_MEDIA_PACKET #define MSC_MEDIA_PACKET 8192U diff --git a/cores/arduino/stm32/usb/usbd_ep_conf.h b/cores/arduino/stm32/usb/usbd_ep_conf.h index 354b6f4d0c..f370164e00 100644 --- a/cores/arduino/stm32/usb/usbd_ep_conf.h +++ b/cores/arduino/stm32/usb/usbd_ep_conf.h @@ -36,6 +36,7 @@ typedef struct { /* CDC Endpoints Configurations */ #ifdef USBD_USE_CDC + #define USBD_USE_CDC_CLASS #define CDC_OUT_EP 0x01U /* EP1 for data OUT */ #define CDC_IN_EP 0x82U /* EP1 for data IN */ @@ -50,6 +51,25 @@ typedef struct { #endif /* USBD_USE_CDC */ +#ifdef USBD_USE_CDC_MSC_COMPOSITE + #define USBD_USE_CDC_CLASS + #define USBD_USE_MSC_CLASS + + #define CDC_OUT_EP 0x01U /* EP1 for CDC data OUT */ + #define CDC_IN_EP 0x81U /* EP1 for CDC data IN */ + #define CDC_CMD_EP 0x82U /* EP2 for CDC commands */ + + #define MSC_OUT_EP 0x02U /* EP2 for MSC data IN */ + #define MSC_IN_EP 0x83U /* EP3 for MSC data IN */ + + #define DEV_NUM_EP 0x04U /* Device Endpoints number including EP0 */ + + /* CDC Endpoints parameters*/ + #define CDC_DATA_HS_MAX_PACKET_SIZE USB_HS_MAX_PACKET_SIZE /* Endpoint IN & OUT Packet size */ + #define CDC_DATA_FS_MAX_PACKET_SIZE USB_FS_MAX_PACKET_SIZE /* Endpoint IN & OUT Packet size */ + #define CDC_CMD_PACKET_SIZE 8U /* Control Endpoint Packet size */ +#endif + /* HID composite (Mouse + Keyboard) Endpoints Configurations */ #ifdef USBD_USE_HID_COMPOSITE #define HID_MOUSE_EPIN_ADDR 0x81U @@ -61,23 +81,24 @@ typedef struct { #define DEV_NUM_EP 0x03U /* Device Endpoints number including EP0 */ #endif /* USBD_USE_HID_COMPOSITE */ + /* Require DEV_NUM_EP to be defined */ #if defined (USB) -/* Size in words, byte size divided by 2 */ -#define PMA_EP0_OUT_ADDR (8 * DEV_NUM_EP) -#define PMA_EP0_IN_ADDR (PMA_EP0_OUT_ADDR + USB_MAX_EP0_SIZE) - -#ifdef USBD_USE_CDC -#define PMA_CDC_OUT_BASE (PMA_EP0_IN_ADDR + USB_MAX_EP0_SIZE) -#define PMA_CDC_OUT_ADDR ((PMA_CDC_OUT_BASE + USB_FS_MAX_PACKET_SIZE) | \ - (PMA_CDC_OUT_BASE << 16U)) -#define PMA_CDC_IN_ADDR (PMA_CDC_OUT_BASE + USB_FS_MAX_PACKET_SIZE * 2) -#define PMA_CDC_CMD_ADDR (PMA_CDC_IN_ADDR + CDC_CMD_PACKET_SIZE) -#endif /* USBD_USE_CDC */ -#ifdef USBD_USE_HID_COMPOSITE - #define PMA_MOUSE_IN_ADDR (PMA_EP0_IN_ADDR + HID_MOUSE_EPIN_SIZE) - #define PMA_KEYBOARD_IN_ADDR (PMA_MOUSE_IN_ADDR + HID_KEYBOARD_EPIN_SIZE) -#endif /* USBD_USE_HID_COMPOSITE */ + /* Size in words, byte size divided by 2 */ + #define PMA_EP0_OUT_ADDR (8 * DEV_NUM_EP) + #define PMA_EP0_IN_ADDR (PMA_EP0_OUT_ADDR + USB_MAX_EP0_SIZE) + + #ifdef USBD_USE_CDC + #define PMA_CDC_OUT_BASE (PMA_EP0_IN_ADDR + USB_MAX_EP0_SIZE) + #define PMA_CDC_OUT_ADDR ((PMA_CDC_OUT_BASE + USB_FS_MAX_PACKET_SIZE) | \ + (PMA_CDC_OUT_BASE << 16U)) + #define PMA_CDC_IN_ADDR (PMA_CDC_OUT_BASE + USB_FS_MAX_PACKET_SIZE * 2) + #define PMA_CDC_CMD_ADDR (PMA_CDC_IN_ADDR + CDC_CMD_PACKET_SIZE) + #endif /* USBD_USE_CDC */ + #ifdef USBD_USE_HID_COMPOSITE + #define PMA_MOUSE_IN_ADDR (PMA_EP0_IN_ADDR + HID_MOUSE_EPIN_SIZE) + #define PMA_KEYBOARD_IN_ADDR (PMA_MOUSE_IN_ADDR + HID_KEYBOARD_EPIN_SIZE) + #endif /* USBD_USE_HID_COMPOSITE */ #endif /* USB */ extern const ep_desc_t ep_def[DEV_NUM_EP + 1]; @@ -86,4 +107,4 @@ extern const ep_desc_t ep_def[DEV_NUM_EP + 1]; #endif /* USBCON */ #endif /* __USBD_EP_CONF_H */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ \ No newline at end of file +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ From 0b9e38e9922283beae216c3ff8c42ebea00dc6a5 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Fri, 29 May 2020 14:57:39 +0100 Subject: [PATCH 04/37] added default msc interface --- cores/arduino/stm32/usb/msc/usbd_msc.c | 3 +- .../stm32/usb/msc/usbd_msc_storage_if.c | 177 ++++++++++++++++++ .../stm32/usb/msc/usbd_msc_storage_if.h | 97 ++++++++++ 3 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 cores/arduino/stm32/usb/msc/usbd_msc_storage_if.c create mode 100644 cores/arduino/stm32/usb/msc/usbd_msc_storage_if.h diff --git a/cores/arduino/stm32/usb/msc/usbd_msc.c b/cores/arduino/stm32/usb/msc/usbd_msc.c index e196cefe46..f7e537d4cb 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc.c @@ -40,6 +40,7 @@ EndBSPDependencies */ /* Includes ------------------------------------------------------------------*/ #include "usbd_msc.h" +#include "usbd_msc_storage_if.h" /** @addtogroup STM32_USB_DEVICE_LIBRARY @@ -268,7 +269,7 @@ __ALIGN_BEGIN uint8_t USBD_MSC_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] USBD_MSC_BOT_HandleTypeDef msc_handle_dat; USBD_MSC_BOT_HandleTypeDef *msc_handle = &msc_handle_dat; -USBD_StorageTypeDef *msc_storage = NULL; +USBD_StorageTypeDef *msc_storage = &USBD_MSC_Template_fops; /** @defgroup MSC_CORE_Private_Functions * @{ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.c b/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.c new file mode 100644 index 0000000000..dc6cc3dead --- /dev/null +++ b/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.c @@ -0,0 +1,177 @@ +/** + ****************************************************************************** + * @file usbd_msc_storage_template.c + * @author MCD Application Team + * @brief Memory management layer + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* BSPDependencies +- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c" +- "stm32xxxxx_{eval}{discovery}_io.c" +- "stm32xxxxx_{eval}{discovery}{adafruit}_sd.c" +EndBSPDependencies */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_msc_storage_template.h" + + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Extern function prototypes ------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +#define STORAGE_LUN_NBR 1U +#define STORAGE_BLK_NBR 0x10000U +#define STORAGE_BLK_SIZ 0x200U + +int8_t STORAGE_Init(uint8_t lun); + +int8_t STORAGE_GetCapacity(uint8_t lun, uint32_t *block_num, + uint16_t *block_size); + +int8_t STORAGE_IsReady(uint8_t lun); + +int8_t STORAGE_IsWriteProtected(uint8_t lun); + +int8_t STORAGE_Read(uint8_t lun, uint8_t *buf, uint32_t blk_addr, + uint16_t blk_len); + +int8_t STORAGE_Write(uint8_t lun, uint8_t *buf, uint32_t blk_addr, + uint16_t blk_len); + +int8_t STORAGE_GetMaxLun(void); + +/* USB Mass storage Standard Inquiry Data */ +int8_t STORAGE_Inquirydata[] = /* 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 */ +}; + +USBD_StorageTypeDef USBD_MSC_Template_fops = +{ + STORAGE_Init, + STORAGE_GetCapacity, + STORAGE_IsReady, + STORAGE_IsWriteProtected, + STORAGE_Read, + STORAGE_Write, + STORAGE_GetMaxLun, + STORAGE_Inquirydata, + +}; +/******************************************************************************* +* Function Name : Read_Memory +* Description : Handle the Read operation from the microSD card. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +int8_t STORAGE_Init(uint8_t lun) +{ + return (0); +} + +/******************************************************************************* +* Function Name : Read_Memory +* Description : Handle the Read operation from the STORAGE card. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +int8_t STORAGE_GetCapacity(uint8_t lun, uint32_t *block_num, uint16_t *block_size) +{ + *block_num = STORAGE_BLK_NBR; + *block_size = STORAGE_BLK_SIZ; + return (0); +} + +/******************************************************************************* +* Function Name : Read_Memory +* Description : Handle the Read operation from the STORAGE card. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +int8_t STORAGE_IsReady(uint8_t lun) +{ + return (0); +} + +/******************************************************************************* +* Function Name : Read_Memory +* Description : Handle the Read operation from the STORAGE card. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +int8_t STORAGE_IsWriteProtected(uint8_t lun) +{ + return 0; +} + +/******************************************************************************* +* Function Name : Read_Memory +* Description : Handle the Read operation from the STORAGE card. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +int8_t STORAGE_Read(uint8_t lun, uint8_t *buf, + uint32_t blk_addr, uint16_t blk_len) +{ + return 0; +} +/******************************************************************************* +* Function Name : Write_Memory +* Description : Handle the Write operation to the STORAGE card. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +int8_t STORAGE_Write(uint8_t lun, uint8_t *buf, + uint32_t blk_addr, uint16_t blk_len) +{ + return (0); +} +/******************************************************************************* +* Function Name : Write_Memory +* Description : Handle the Write operation to the STORAGE card. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +int8_t STORAGE_GetMaxLun(void) +{ + return (STORAGE_LUN_NBR - 1); +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.h b/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.h new file mode 100644 index 0000000000..0288c308fc --- /dev/null +++ b/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.h @@ -0,0 +1,97 @@ +/** + ****************************************************************************** + * @file usbd_msc_storage.h + * @author MCD Application Team + * @brief Header file for the usbd_msc_storage.c file + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under Ultimate Liberty license + * SLA0044, the "License"; You may not use this file except in compliance with + * the License. You may obtain a copy of the License at: + * www.st.com/SLA0044 + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_MSC_STORAGE_H +#define __USBD_MSC_STORAGE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_msc.h" + +/** @addtogroup STM32_USB_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_STORAGE + * @brief header file for the usbd_msc_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_MSC_Template_fops; +/** + * @} + */ + +/** @defgroup USBD_STORAGE_Exported_FunctionsPrototype + * @{ + */ + + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_MSC_STORAGE_H */ + +/** + * @} + */ + +/** +* @} +*/ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ From 162ade3bae828a2f514a4668e80e048c1ab3a2ad Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Fri, 29 May 2020 15:29:33 +0100 Subject: [PATCH 05/37] fixed cdc handle nad renamed cdc msc flag --- cores/arduino/stm32/usb/cdc/usbd_cdc.c | 7 ++- cores/arduino/stm32/usb/cdc/usbd_cdc.h | 6 ++ cores/arduino/stm32/usb/cdc/usbd_cdc_if.c | 57 +++++-------------- cores/arduino/stm32/usb/cdc/usbd_cdc_if.h | 5 +- .../stm32/usb/cdc_msc/usbd_cdc_msc.cpp | 2 +- .../arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h | 2 + cores/arduino/stm32/usb/usbd_ep_conf.h | 2 +- 7 files changed, 32 insertions(+), 49 deletions(-) diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc.c b/cores/arduino/stm32/usb/cdc/usbd_cdc.c index 219efa06f7..49ee9e2f7a 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc.c +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc.c @@ -754,8 +754,11 @@ uint8_t *USBD_CDC_GetDeviceQualifierDescriptor(uint16_t *length) uint8_t USBD_CDC_RegisterInterface(USBD_HandleTypeDef *pdev, USBD_CDC_ItfTypeDef *fops) { - if (fops == NULL) { - return (uint8_t)USBD_FAIL; + uint8_t ret = USBD_FAIL; + + if (fops != NULL) { + cdc_itf = fops; + ret = USBD_OK; } pdev->pUserData = fops; diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc.h b/cores/arduino/stm32/usb/cdc/usbd_cdc.h index 5395708c06..bfcbfab31d 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc.h +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc.h @@ -126,8 +126,14 @@ typedef struct { * @{ */ + extern USBD_ClassTypeDef USBD_CDC; #define USBD_CDC_CLASS &USBD_CDC + +extern USBD_CDC_HandleTypeDef *cdc_handle; + +extern USBD_CDC_ItfTypeDef *cdc_itf; + /** * @} */ diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc_if.c b/cores/arduino/stm32/usb/cdc/usbd_cdc_if.c index c09675f95e..e5ee766c33 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc_if.c +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc_if.c @@ -18,7 +18,10 @@ */ #ifdef USBCON -#ifdef USBD_USE_CDC + +#include "usbd_ep_conf.h" + +#ifdef USBD_USE_CDC_CLASS /* Includes ------------------------------------------------------------------*/ #include "usbd_desc.h" @@ -44,9 +47,7 @@ /* USBD_CDC Private Variables */ /* USB Device Core CDC handle declaration */ -USBD_HandleTypeDef hUSBD_Device_CDC; - -static bool CDC_initialized = false; +USBD_HandleTypeDef *hUSBD_Device_CDC; /* Received Data over USB are stored in this buffer */ CDC_TransmitQueue_TypeDef TransmitQueue; @@ -98,7 +99,7 @@ static int8_t USBD_CDC_Init(void) CDC_TransmitQueue_Init(&TransmitQueue); CDC_ReceiveQueue_Init(&ReceiveQueue); receivePended = true; - USBD_CDC_SetRxBuffer(&hUSBD_Device_CDC, CDC_ReceiveQueue_ReserveBlock(&ReceiveQueue)); + USBD_CDC_SetRxBuffer(hUSBD_Device_CDC, CDC_ReceiveQueue_ReserveBlock(&ReceiveQueue)); return ((int8_t)USBD_OK); } @@ -235,7 +236,7 @@ static int8_t USBD_CDC_Receive(uint8_t *Buf, uint32_t *Len) receivePended = false; /* If enough space in the queue for a full buffer then continue receive */ if (!CDC_resume_receive()) { - USBD_CDC_ClearBuffer(&hUSBD_Device_CDC); + USBD_CDC_ClearBuffer(hUSBD_Device_CDC); } return ((int8_t)USBD_OK); } @@ -264,34 +265,6 @@ static int8_t USBD_CDC_TransmitCplt(uint8_t *Buf, uint32_t *Len, uint8_t epnum) return ((int8_t)USBD_OK); } -void CDC_init(void) -{ - if (!CDC_initialized) { - /* Init Device Library */ - if (USBD_Init(&hUSBD_Device_CDC, &USBD_Desc, 0) == USBD_OK) { - /* Add Supported Class */ - if (USBD_RegisterClass(&hUSBD_Device_CDC, USBD_CDC_CLASS) == USBD_OK) { - /* Add CDC Interface Class */ - if (USBD_CDC_RegisterInterface(&hUSBD_Device_CDC, &USBD_CDC_fops) == USBD_OK) { - /* Start Device Process */ - USBD_Start(&hUSBD_Device_CDC); - CDC_initialized = true; - } - } - } - } -} - -void CDC_deInit(void) -{ - if (CDC_initialized) { - USBD_Stop(&hUSBD_Device_CDC); - USBD_CDC_DeInit(); - USBD_DeInit(&hUSBD_Device_CDC); - CDC_initialized = false; - } -} - bool CDC_connected() { /* Save the transmitStart value in a local variable to avoid twice reading - fix #478 */ @@ -299,16 +272,16 @@ bool CDC_connected() if (transmitTime) { transmitTime = HAL_GetTick() - transmitTime; } - return ((hUSBD_Device_CDC.dev_state == USBD_STATE_CONFIGURED) - && (transmitTime < USB_CDC_TRANSMIT_TIMEOUT) - && lineState); + return hUSBD_Device_CDC->dev_state == USBD_STATE_CONFIGURED + && transmitTime < USB_CDC_TRANSMIT_TIMEOUT + && lineState; } void CDC_continue_transmit(void) { uint16_t size; uint8_t *buffer; - USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *) hUSBD_Device_CDC.pClassData; + USBD_CDC_HandleTypeDef *hcdc = cdc_handle; /* * TS: This method can be called both in the main thread * (via USBSerial::write) and in the IRQ stream (via USBD_CDC_TransmistCplt), @@ -321,12 +294,12 @@ void CDC_continue_transmit(void) buffer = CDC_TransmitQueue_ReadBlock(&TransmitQueue, &size); if (size > 0) { transmitStart = HAL_GetTick(); - USBD_CDC_SetTxBuffer(&hUSBD_Device_CDC, buffer, size); + USBD_CDC_SetTxBuffer(hUSBD_Device_CDC, buffer, size); /* * size never exceed PMA buffer and USBD_CDC_TransmitPacket make full * copy of block in PMA, so no need to worry about buffer damage */ - USBD_CDC_TransmitPacket(&hUSBD_Device_CDC); + USBD_CDC_TransmitPacket(hUSBD_Device_CDC); } } } @@ -342,8 +315,8 @@ bool CDC_resume_receive(void) if (block != NULL) { receivePended = true; /* Set new buffer */ - USBD_CDC_SetRxBuffer(&hUSBD_Device_CDC, block); - USBD_CDC_ReceivePacket(&hUSBD_Device_CDC); + USBD_CDC_SetRxBuffer(hUSBD_Device_CDC, block); + USBD_CDC_ReceivePacket(hUSBD_Device_CDC); return true; } } diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc_if.h b/cores/arduino/stm32/usb/cdc/usbd_cdc_if.h index b415ac16de..1f2e311471 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc_if.h +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc_if.h @@ -22,7 +22,7 @@ #define __USBD_CDC_IF_H #ifdef USBCON -#ifdef USBD_USE_CDC +#ifdef USBD_USE_CDC_CLASS #ifdef __cplusplus extern "C" { @@ -39,6 +39,7 @@ extern "C" { /* Exported types ------------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/ +extern USBD_HandleTypeDef *hUSBD_Device_CDC; extern USBD_CDC_ItfTypeDef USBD_CDC_fops; extern CDC_TransmitQueue_TypeDef TransmitQueue; extern CDC_ReceiveQueue_TypeDef ReceiveQueue; @@ -48,8 +49,6 @@ extern CDC_ReceiveQueue_TypeDef ReceiveQueue; /* Exported functions ------------------------------------------------------- */ void CDC_continue_transmit(void); bool CDC_resume_receive(void); -void CDC_init(void); -void CDC_deInit(void); bool CDC_connected(void); #ifdef __cplusplus diff --git a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp index 20a859a408..008381fbec 100644 --- a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp +++ b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp @@ -115,7 +115,7 @@ static uint8_t USBD_COMPOSITE_SOF(USBD_HandleTypeDef *pdev); * @{ */ -USBD_ClassTypeDef USBD_COMPOSITE_ClassDriver = +USBD_ClassTypeDef USBD_CDC_MSC_CLASS = { USBD_COMPOSITE_Init, USBD_COMPOSITE_DeInit, diff --git a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h index 3d50cb967a..ae561f5d44 100644 --- a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h +++ b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h @@ -34,6 +34,8 @@ #define USB_CDC_MSC_CONFIG_DESC_SIZ (USB_CDC_CONFIG_DESC_SIZ - 9 + USB_MSC_CONFIG_DESC_SIZ) +extern USBD_ClassTypeDef USBD_CDC_MSC_CLASS; + #endif /* __USB_CDC_MSC_CORE_H_ */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/usbd_ep_conf.h b/cores/arduino/stm32/usb/usbd_ep_conf.h index f370164e00..5bd4f88d06 100644 --- a/cores/arduino/stm32/usb/usbd_ep_conf.h +++ b/cores/arduino/stm32/usb/usbd_ep_conf.h @@ -51,7 +51,7 @@ typedef struct { #endif /* USBD_USE_CDC */ -#ifdef USBD_USE_CDC_MSC_COMPOSITE +#ifdef USBD_USE_CDC_MSC #define USBD_USE_CDC_CLASS #define USBD_USE_MSC_CLASS From 8d7e9d80fe831027042a3b3adaee429b56a79ded Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Fri, 29 May 2020 15:29:55 +0100 Subject: [PATCH 06/37] added usb class --- cores/arduino/USB.cpp | 72 +++++++++++++++++++++++++++++++++++++ cores/arduino/USB.h | 41 +++++++++++++++++++++ cores/arduino/USBSerial.cpp | 6 ++-- cores/arduino/USBSerial.h | 5 +-- 4 files changed, 119 insertions(+), 5 deletions(-) create mode 100644 cores/arduino/USB.cpp create mode 100644 cores/arduino/USB.h diff --git a/cores/arduino/USB.cpp b/cores/arduino/USB.cpp new file mode 100644 index 0000000000..546be48787 --- /dev/null +++ b/cores/arduino/USB.cpp @@ -0,0 +1,72 @@ +/* + Copyright (c) 2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "USBSerial.h" + +#include "cdc/usbd_cdc.h" +#include "cdc_msc/usbd_cdc_msc.h" +#include "cdc/usbd_cdc_if.h" +#include "usbd_desc.h" +#include "wiring.h" + +void USB::begin() { + if (!initialized) initialize(); +} + +void USB::initialize() { + hUSBD_Device_CDC = &hUSBD_Device; + + /* Init Device Library */ + if (USBD_Init(&hUSBD_Device, &USBD_Desc, 0) == USBD_OK) { + #ifdef USBD_USE_CDC + /* Add Supported Class */ + if (USBD_RegisterClass(&hUSBD_Device_CDC, USBD_CDC_CLASS) == USBD_OK) { + /* Add CDC Interface Class */ + if (USBD_CDC_RegisterInterface(&hUSBD_Device_CDC, &USBD_CDC_fops) == USBD_OK) { + /* Start Device Process */ + USBD_Start(&hUSBD_Device_CDC); + initialized = true; + } + } + #elif USBD_USE_CDC_MSC + /* Add Supported Class */ + if (USBD_RegisterClass(&hUSBD_Device, USBD_CDC_MSC_CLASS) == USBD_OK) { + /* Add CDC Interface Class */ + if (USBD_CDC_RegisterInterface(&hUSBD_Device, &USBD_CDC_fops) == USBD_OK) { + /* Add MSC Interface Class */ + if (USBD_MSC_RegisterStorage(&hUSBD_Device, &USBD_MSC_fops) == USBD_OK) { + /* Start Device Process */ + USBD_Start(&hUSBD_Device); + initialized = true; + } + } + } + #endif + } +} + +void USB::end() { + if (initialized) deinitialize(); +} + +void USB::deinitialize() { + USBD_Stop(&hUSBD_Device_CDC); + USBD_CDC_DeInit(); + USBD_DeInit(&hUSBD_Device_CDC); + initialized = false; +} \ No newline at end of file diff --git a/cores/arduino/USB.h b/cores/arduino/USB.h new file mode 100644 index 0000000000..872a16c01e --- /dev/null +++ b/cores/arduino/USB.h @@ -0,0 +1,41 @@ +/* + Copyright (c) 2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef _USB_H_ +#define _USB_H_ + +#if defined (USBCON) +#include "Stream.h" +#include "usbd_core.h" + +class USB { + public: + void begin(void); + + void end(void); + + protected: + void initialize(); + void deinitialize(); + + bool initialized(); + + USBD_HandleTypeDef hUSBD_Device; +} + +#endif \ No newline at end of file diff --git a/cores/arduino/USBSerial.cpp b/cores/arduino/USBSerial.cpp index 256b5a1df8..e729386b60 100644 --- a/cores/arduino/USBSerial.cpp +++ b/cores/arduino/USBSerial.cpp @@ -16,7 +16,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#if defined (USBCON) && defined(USBD_USE_CDC) +#if defined (USBCON) && defined(USBD_USE_CDC_CLASS) #include "USBSerial.h" #include "usbd_cdc.h" @@ -31,7 +31,7 @@ void serialEventUSB() __attribute__((weak)); void USBSerial::begin(void) { - CDC_init(); + USB::begin(); } void USBSerial::begin(uint32_t /* baud_count */) @@ -48,7 +48,7 @@ void USBSerial::begin(uint32_t /* baud_count */, uint8_t /* config */) void USBSerial::end() { - CDC_deInit(); + USB::end(); } int USBSerial::availableForWrite() diff --git a/cores/arduino/USBSerial.h b/cores/arduino/USBSerial.h index 1628eef358..63e2263830 100644 --- a/cores/arduino/USBSerial.h +++ b/cores/arduino/USBSerial.h @@ -19,10 +19,11 @@ #ifndef _USBSERIAL_H_ #define _USBSERIAL_H_ -#if defined (USBCON) && defined(USBD_USE_CDC) -#include "Stream.h" #include "usbd_core.h" +#if defined (USBCON) && defined(USBD_USE_CDC_CLASS) +#include "Stream.h" + //================================================================================ // Serial over CDC class USBSerial : public Stream { From 4b489ef7ccebfc5878fc5e245dff141ca2e8b2f1 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Sat, 30 May 2020 14:18:17 +0100 Subject: [PATCH 07/37] add new include dirs --- platform.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform.txt b/platform.txt index 3674dfe7d2..925aa620ea 100644 --- a/platform.txt +++ b/platform.txt @@ -9,7 +9,7 @@ version=1.0.0 # STM compile variables # ---------------------- -compiler.stm.extra_include="-I{build.source.path}" "-I{build.core.path}/avr" "-I{build.core.path}/stm32" "-I{build.core.path}/stm32/LL" "-I{build.core.path}/stm32/usb" "-I{build.core.path}/stm32/OpenAMP" "-I{build.core.path}/stm32/usb/hid" "-I{build.core.path}/stm32/usb/cdc" "-I{build.system.path}/Drivers/{build.series}_HAL_Driver/Inc" "-I{build.system.path}/Drivers/{build.series}_HAL_Driver/Src" "-I{build.system.path}/{build.series}" "-I{build.system.path}/Middlewares/ST/STM32_USB_Device_Library/Core/Inc" "-I{build.system.path}/Middlewares/ST/STM32_USB_Device_Library/Core/Src" {build.virtio_extra_include} +compiler.stm.extra_include="-I{build.source.path}" "-I{build.core.path}/avr" "-I{build.core.path}/stm32" "-I{build.core.path}/stm32/LL" "-I{build.core.path}/stm32/usb" "-I{build.core.path}/stm32/OpenAMP" "-I{build.core.path}/stm32/usb/hid" "-I{build.core.path}/stm32/usb/cdc" "-I{build.core.path}/stm32/usb/msc" "-I{build.core.path}/stm32/usb/cdc_msc" "-I{build.system.path}/Drivers/{build.series}_HAL_Driver/Inc" "-I{build.system.path}/Drivers/{build.series}_HAL_Driver/Src" "-I{build.system.path}/{build.series}" "-I{build.system.path}/Middlewares/ST/STM32_USB_Device_Library/Core/Inc" "-I{build.system.path}/Middlewares/ST/STM32_USB_Device_Library/Core/Src" {build.virtio_extra_include} compiler.warning_flags=-w compiler.warning_flags.none=-w From a144bca45c37943600b1292cb6247f801348dabf Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Mon, 1 Jun 2020 11:29:25 +0100 Subject: [PATCH 08/37] formatting changes, improved usbd_ep_conf and now compiles in marlin --- cores/arduino/USB.cpp | 22 +++-- cores/arduino/USB.h | 9 +- cores/arduino/USBSerial.cpp | 7 +- cores/arduino/USBSerial.h | 3 +- cores/arduino/stm32/usb/cdc/cdc_queue.c | 4 +- cores/arduino/stm32/usb/cdc/usbd_cdc.c | 4 +- cores/arduino/stm32/usb/cdc/usbd_cdc.h | 1 - cores/arduino/stm32/usb/cdc/usbd_cdc_if.c | 3 +- .../stm32/usb/cdc_msc/usbd_cdc_msc.cpp | 84 ++--------------- .../arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h | 4 +- cores/arduino/stm32/usb/msc/usbd_msc.c | 77 ++------------- cores/arduino/stm32/usb/msc/usbd_msc.h | 29 ------ cores/arduino/stm32/usb/msc/usbd_msc_bot.c | 75 ++------------- cores/arduino/stm32/usb/msc/usbd_msc_bot.h | 44 --------- cores/arduino/stm32/usb/msc/usbd_msc_data.c | 74 ++------------- cores/arduino/stm32/usb/msc/usbd_msc_data.h | 54 ----------- cores/arduino/stm32/usb/msc/usbd_msc_scsi.c | 75 ++------------- cores/arduino/stm32/usb/msc/usbd_msc_scsi.h | 55 ----------- .../stm32/usb/msc/usbd_msc_storage_if.c | 23 ++--- .../stm32/usb/msc/usbd_msc_storage_if.h | 61 +----------- cores/arduino/stm32/usb/usbd_conf.c | 12 ++- cores/arduino/stm32/usb/usbd_conf.h | 12 --- cores/arduino/stm32/usb/usbd_desc.c | 10 +- cores/arduino/stm32/usb/usbd_ep_conf.c | 94 +++++++++++-------- cores/arduino/stm32/usb/usbd_ep_conf.h | 22 ++++- tools/platformio-build.py | 4 +- 26 files changed, 173 insertions(+), 689 deletions(-) diff --git a/cores/arduino/USB.cpp b/cores/arduino/USB.cpp index 546be48787..db54cf7138 100644 --- a/cores/arduino/USB.cpp +++ b/cores/arduino/USB.cpp @@ -16,14 +16,17 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "USBSerial.h" - -#include "cdc/usbd_cdc.h" -#include "cdc_msc/usbd_cdc_msc.h" -#include "cdc/usbd_cdc_if.h" +#include "usbd_cdc.h" +#include "usbd_cdc_msc.h" +#include "usbd_msc.h" +#include "usbd_msc_storage_if.h" +#include "usbd_cdc_if.h" #include "usbd_desc.h" +#include "USB.h" #include "wiring.h" +USB USBDevice; + void USB::begin() { if (!initialized) initialize(); } @@ -35,7 +38,7 @@ void USB::initialize() { if (USBD_Init(&hUSBD_Device, &USBD_Desc, 0) == USBD_OK) { #ifdef USBD_USE_CDC /* Add Supported Class */ - if (USBD_RegisterClass(&hUSBD_Device_CDC, USBD_CDC_CLASS) == USBD_OK) { + if (USBD_RegisterClass(&hUSBD_Device_CDC, &USBD_CDC) == USBD_OK) { /* Add CDC Interface Class */ if (USBD_CDC_RegisterInterface(&hUSBD_Device_CDC, &USBD_CDC_fops) == USBD_OK) { /* Start Device Process */ @@ -45,7 +48,7 @@ void USB::initialize() { } #elif USBD_USE_CDC_MSC /* Add Supported Class */ - if (USBD_RegisterClass(&hUSBD_Device, USBD_CDC_MSC_CLASS) == USBD_OK) { + if (USBD_RegisterClass(&hUSBD_Device, &USBD_CDC_MSC) == USBD_OK) { /* Add CDC Interface Class */ if (USBD_CDC_RegisterInterface(&hUSBD_Device, &USBD_CDC_fops) == USBD_OK) { /* Add MSC Interface Class */ @@ -65,8 +68,7 @@ void USB::end() { } void USB::deinitialize() { - USBD_Stop(&hUSBD_Device_CDC); - USBD_CDC_DeInit(); - USBD_DeInit(&hUSBD_Device_CDC); + USBD_Stop(&hUSBD_Device); + USBD_DeInit(&hUSBD_Device); initialized = false; } \ No newline at end of file diff --git a/cores/arduino/USB.h b/cores/arduino/USB.h index 872a16c01e..2051be1c9b 100644 --- a/cores/arduino/USB.h +++ b/cores/arduino/USB.h @@ -33,9 +33,12 @@ class USB { void initialize(); void deinitialize(); - bool initialized(); + bool initialized; USBD_HandleTypeDef hUSBD_Device; -} +}; -#endif \ No newline at end of file +extern USB USBDevice; + +#endif // USBCON +#endif // _USB_H_ \ No newline at end of file diff --git a/cores/arduino/USBSerial.cpp b/cores/arduino/USBSerial.cpp index e729386b60..741f57ce9c 100644 --- a/cores/arduino/USBSerial.cpp +++ b/cores/arduino/USBSerial.cpp @@ -16,8 +16,11 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "usbd_ep_conf.h" + #if defined (USBCON) && defined(USBD_USE_CDC_CLASS) +#include "USB.h" #include "USBSerial.h" #include "usbd_cdc.h" #include "usbd_cdc_if.h" @@ -31,7 +34,7 @@ void serialEventUSB() __attribute__((weak)); void USBSerial::begin(void) { - USB::begin(); + USBDevice.begin(); } void USBSerial::begin(uint32_t /* baud_count */) @@ -48,7 +51,7 @@ void USBSerial::begin(uint32_t /* baud_count */, uint8_t /* config */) void USBSerial::end() { - USB::end(); + USBDevice.end(); } int USBSerial::availableForWrite() diff --git a/cores/arduino/USBSerial.h b/cores/arduino/USBSerial.h index 63e2263830..6ff78af907 100644 --- a/cores/arduino/USBSerial.h +++ b/cores/arduino/USBSerial.h @@ -19,9 +19,10 @@ #ifndef _USBSERIAL_H_ #define _USBSERIAL_H_ -#include "usbd_core.h" +#include "usbd_ep_conf.h" #if defined (USBCON) && defined(USBD_USE_CDC_CLASS) +#include "usbd_core.h" #include "Stream.h" //================================================================================ diff --git a/cores/arduino/stm32/usb/cdc/cdc_queue.c b/cores/arduino/stm32/usb/cdc/cdc_queue.c index 2d2330c195..3209341d42 100644 --- a/cores/arduino/stm32/usb/cdc/cdc_queue.c +++ b/cores/arduino/stm32/usb/cdc/cdc_queue.c @@ -35,8 +35,10 @@ ****************************************************************************** */ +#include "usbd_ep_conf.h" + #ifdef USBCON -#ifdef USBD_USE_CDC +#ifdef USBD_USE_CDC_CLASS #include "cdc_queue.h" diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc.c b/cores/arduino/stm32/usb/cdc/usbd_cdc.c index 49ee9e2f7a..ee2b6d6eb3 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc.c +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc.c @@ -50,13 +50,15 @@ ****************************************************************************** */ +#include "usbd_ep_conf.h" + #ifdef USBCON +#ifdef USBD_USE_CDC_CLASS /* Includes ------------------------------------------------------------------*/ #include "usbd_cdc.h" #include "usbd_ctlreq.h" -#ifdef USBD_USE_CDC_CLASS /** @addtogroup STM32_USB_DEVICE_LIBRARY * @{ diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc.h b/cores/arduino/stm32/usb/cdc/usbd_cdc.h index bfcbfab31d..1c12bbbffb 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc.h +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc.h @@ -128,7 +128,6 @@ typedef struct { extern USBD_ClassTypeDef USBD_CDC; -#define USBD_CDC_CLASS &USBD_CDC extern USBD_CDC_HandleTypeDef *cdc_handle; diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc_if.c b/cores/arduino/stm32/usb/cdc/usbd_cdc_if.c index e5ee766c33..6b731641b4 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc_if.c +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc_if.c @@ -17,10 +17,9 @@ ****************************************************************************** */ -#ifdef USBCON - #include "usbd_ep_conf.h" +#ifdef USBCON #ifdef USBD_USE_CDC_CLASS /* Includes ------------------------------------------------------------------*/ diff --git a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp index 008381fbec..458e4741d9 100644 --- a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp +++ b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp @@ -35,55 +35,14 @@ ****************************************************************************** */ -/* Includes ------------------------------------------------------------------*/ +#include "usbd_ep_conf.h" + +#ifdef USBCON +#ifdef USBD_USE_CDC_MSC #include "usbd_cdc_msc.h" #include "usbd_ctlreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_COMPOSITE - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_COMPOSITE_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_COMPOSITE_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_COMPOSITE_Private_Macros - * @{ - */ - -/** - * @} - */ - - - - -/** @defgroup USBD_COMPOSITE_Private_FunctionPrototypes - * @{ - */ - - static uint8_t USBD_COMPOSITE_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); @@ -103,19 +62,9 @@ static uint8_t USBD_COMPOSITE_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); static uint8_t USBD_COMPOSITE_EP0_RxReady(USBD_HandleTypeDef *pdev); -static uint8_t USBD_COMPOSITE_EP0_TxReady(USBD_HandleTypeDef *pdev); - static uint8_t USBD_COMPOSITE_SOF(USBD_HandleTypeDef *pdev); -/** - * @} - */ - -/** @defgroup USBD_COMPOSITE_Private_Variables - * @{ - */ - -USBD_ClassTypeDef USBD_CDC_MSC_CLASS = +USBD_ClassTypeDef USBD_CDC_MSC = { USBD_COMPOSITE_Init, USBD_COMPOSITE_DeInit, @@ -280,14 +229,6 @@ static uint8_t USBD_COMPOSITE_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] = 0x00, }; -/** - * @} - */ - -/** @defgroup USBD_COMPOSITE_Private_Functions - * @{ - */ - /** * @brief USBD_COMPOSITE_Init * Initialize the COMPOSITE interface @@ -491,18 +432,7 @@ uint8_t *USBD_COMPOSITE_GetDeviceQualifierDesc(uint16_t *length) return USBD_COMPOSITE_DeviceQualifierDesc; } -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ +#endif /* USBD_USE_MSC_CLASS */ +#endif /* USBCON */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h index ae561f5d44..c3cd830697 100644 --- a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h +++ b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h @@ -24,7 +24,7 @@ #ifndef __USB_CDC_MSC_CORE_H_ #define __USB_CDC_MSC_CORE_H_ -#include "../cdc/usbd_cdc.h" +#include "usbd_cdc.h" #include "usbd_msc.h" #include "usbd_ioreq.h" @@ -34,7 +34,7 @@ #define USB_CDC_MSC_CONFIG_DESC_SIZ (USB_CDC_CONFIG_DESC_SIZ - 9 + USB_MSC_CONFIG_DESC_SIZ) -extern USBD_ClassTypeDef USBD_CDC_MSC_CLASS; +extern USBD_ClassTypeDef USBD_CDC_MSC; #endif /* __USB_CDC_MSC_CORE_H_ */ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc.c b/cores/arduino/stm32/usb/msc/usbd_msc.c index f7e537d4cb..8fd17b9c3f 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc.c @@ -38,49 +38,15 @@ - "stm32xxxxx_{eval}{discovery}{adafruit}_sd.c" EndBSPDependencies */ -/* Includes ------------------------------------------------------------------*/ -#include "usbd_msc.h" -#include "usbd_msc_storage_if.h" - - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup MSC_CORE - * @brief Mass storage core module - * @{ - */ - -/** @defgroup MSC_CORE_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ +#include "usbd_ep_conf.h" +#ifdef USBCON +#ifdef USBD_USE_MSC_CLASS -/** @defgroup MSC_CORE_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup MSC_CORE_Private_Macros - * @{ - */ -/** - * @} - */ +#include "usbd_msc.h" +#include "usbd_msc_storage_if.h" -/** @defgroup MSC_CORE_Private_FunctionPrototypes - * @{ - */ uint8_t USBD_MSC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); uint8_t USBD_MSC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); uint8_t USBD_MSC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); @@ -92,15 +58,6 @@ uint8_t *USBD_MSC_GetFSCfgDesc(uint16_t *length); uint8_t *USBD_MSC_GetOtherSpeedCfgDesc(uint16_t *length); uint8_t *USBD_MSC_GetDeviceQualifierDescriptor(uint16_t *length); -/** - * @} - */ - - -/** @defgroup MSC_CORE_Private_Variables - * @{ - */ - USBD_ClassTypeDef USBD_MSC = { @@ -269,11 +226,7 @@ __ALIGN_BEGIN uint8_t USBD_MSC_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] USBD_MSC_BOT_HandleTypeDef msc_handle_dat; USBD_MSC_BOT_HandleTypeDef *msc_handle = &msc_handle_dat; -USBD_StorageTypeDef *msc_storage = &USBD_MSC_Template_fops; - -/** @defgroup MSC_CORE_Private_Functions - * @{ - */ +USBD_StorageTypeDef *msc_storage = &USBD_MSC_fops; /** * @brief USBD_MSC_Init @@ -313,7 +266,7 @@ uint8_t USBD_MSC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) /** * @brief USBD_MSC_DeInit - * DeInitilaize the mass storage configuration + * DeInitialize the mass storage configuration * @param pdev: device instance * @param cfgidx: configuration index * @retval status @@ -334,6 +287,7 @@ uint8_t USBD_MSC_DeInit(USBD_HandleTypeDef *pdev, return USBD_OK; } + /** * @brief USBD_MSC_Setup * Handle the MSC specific requests @@ -585,18 +539,7 @@ uint8_t USBD_MSC_RegisterStorage(USBD_HandleTypeDef *pdev, return USBD_OK; } -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ +#endif /* USBD_USE_MSC_CLASS */ +#endif /* USBCON */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc.h b/cores/arduino/stm32/usb/msc/usbd_msc.h index 35c234068b..9d19a1496d 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc.h +++ b/cores/arduino/stm32/usb/msc/usbd_msc.h @@ -25,24 +25,10 @@ extern "C" { #endif -/* Includes ------------------------------------------------------------------*/ #include "usbd_msc_bot.h" #include "usbd_msc_scsi.h" #include "usbd_ioreq.h" -/** @addtogroup USBD_MSC_BOT - * @{ - */ - -/** @defgroup USBD_MSC - * @brief This file is the Header file for usbd_msc.c - * @{ - */ - - -/** @defgroup USBD_BOT_Exported_Defines - * @{ - */ /* MSC Class Config */ #ifndef MSC_MEDIA_PACKET #define MSC_MEDIA_PACKET 512U @@ -59,13 +45,6 @@ extern "C" { #define MSC_EPIN_ADDR 0x81U #define MSC_EPOUT_ADDR 0x01U -/** - * @} - */ - -/** @defgroup USB_CORE_Exported_Types - * @{ - */ typedef struct _USBD_STORAGE { int8_t (* Init)(uint8_t lun); @@ -79,7 +58,6 @@ typedef struct _USBD_STORAGE } USBD_StorageTypeDef; - typedef struct { uint32_t max_lun; @@ -113,13 +91,6 @@ extern USBD_StorageTypeDef *msc_storage; uint8_t USBD_MSC_RegisterStorage(USBD_HandleTypeDef *pdev, USBD_StorageTypeDef *fops); -/** - * @} - */ - -/** - * @} - */ #ifdef __cplusplus } diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_bot.c b/cores/arduino/stm32/usb/msc/usbd_msc_bot.c index fe8f840b11..8b83094bd8 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_bot.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_bot.c @@ -23,73 +23,22 @@ - "stm32xxxxx_{eval}{discovery}{adafruit}_sd.c" EndBSPDependencies */ +#include "usbd_ep_conf.h" + +#ifdef USBCON +#ifdef USBD_USE_MSC_CLASS + /* Includes ------------------------------------------------------------------*/ #include "usbd_msc_bot.h" #include "usbd_msc.h" #include "usbd_msc_scsi.h" #include "usbd_ioreq.h" -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup MSC_BOT - * @brief BOT protocol module - * @{ - */ - -/** @defgroup MSC_BOT_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup MSC_BOT_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup MSC_BOT_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup MSC_BOT_Private_Variables - * @{ - */ - -/** - * @} - */ - - -/** @defgroup MSC_BOT_Private_FunctionPrototypes - * @{ - */ static void MSC_BOT_CBW_Decode(USBD_HandleTypeDef *pdev); static void MSC_BOT_SendData(USBD_HandleTypeDef *pdev, uint8_t *pbuf, uint16_t len); static void MSC_BOT_Abort(USBD_HandleTypeDef *pdev); -/** - * @} - */ - - -/** @defgroup MSC_BOT_Private_Functions - * @{ - */ - /** @@ -370,18 +319,8 @@ void MSC_BOT_CplClrFeature(USBD_HandleTypeDef *pdev, uint8_t epnum) return; } } -/** - * @} - */ - -/** - * @} - */ - - -/** - * @} - */ +#endif /* USBD_USE_MSC_CLASS */ +#endif /* USBCON */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_bot.h b/cores/arduino/stm32/usb/msc/usbd_msc_bot.h index f5b1b6d42e..9b2f109969 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_bot.h +++ b/cores/arduino/stm32/usb/msc/usbd_msc_bot.h @@ -28,19 +28,6 @@ extern "C" { /* Includes ------------------------------------------------------------------*/ #include "usbd_core.h" -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup MSC_BOT - * @brief This file is the Header file for usbd_msc_bot.c - * @{ - */ - - -/** @defgroup USBD_CORE_Exported_Defines - * @{ - */ #define USBD_BOT_IDLE 0U /* Idle state */ #define USBD_BOT_DATA_OUT 1U /* Data Out state */ #define USBD_BOT_DATA_IN 2U /* Data In state */ @@ -69,13 +56,6 @@ extern "C" { #define USBD_DIR_OUT 1U #define USBD_BOTH_DIR 2U -/** - * @} - */ - -/** @defgroup MSC_CORE_Private_TypesDefinitions - * @{ - */ typedef struct { @@ -101,21 +81,6 @@ typedef struct } USBD_MSC_BOT_CSWTypeDef; -/** - * @} - */ - - -/** @defgroup USBD_CORE_Exported_Types - * @{ - */ - -/** - * @} - */ -/** @defgroup USBD_CORE_Exported_FunctionsPrototypes - * @{ - */ void MSC_BOT_Init(USBD_HandleTypeDef *pdev); void MSC_BOT_Reset(USBD_HandleTypeDef *pdev); void MSC_BOT_DeInit(USBD_HandleTypeDef *pdev); @@ -130,21 +95,12 @@ void MSC_BOT_SendCSW(USBD_HandleTypeDef *pdev, void MSC_BOT_CplClrFeature(USBD_HandleTypeDef *pdev, uint8_t epnum); -/** - * @} - */ #ifdef __cplusplus } #endif #endif /* __USBD_MSC_BOT_H */ -/** - * @} - */ -/** -* @} -*/ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_data.c b/cores/arduino/stm32/usb/msc/usbd_msc_data.c index aaafc3aa1e..64556d91a7 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_data.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_data.c @@ -23,47 +23,13 @@ - "stm32xxxxx_{eval}{discovery}{adafruit}_sd.c" EndBSPDependencies */ -/* Includes ------------------------------------------------------------------*/ -#include "usbd_msc_data.h" - - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup MSC_DATA - * @brief Mass storage info/data module - * @{ - */ - -/** @defgroup MSC_DATA_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup MSC_DATA_Private_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup MSC_DATA_Private_Macros - * @{ - */ -/** - * @} - */ +#include "usbd_ep_conf.h" +#ifdef USBCON +#ifdef USBD_USE_MSC_CLASS -/** @defgroup MSC_DATA_Private_Variables - * @{ - */ +/* Includes ------------------------------------------------------------------*/ +#include "usbd_msc_data.h" /* USB Mass storage Page 0 Inquiry Data */ @@ -101,35 +67,9 @@ const uint8_t MSC_Mode_Sense10_data[] = 0x00, 0x00 }; -/** - * @} - */ - - -/** @defgroup MSC_DATA_Private_FunctionPrototypes - * @{ - */ -/** - * @} - */ - - -/** @defgroup MSC_DATA_Private_Functions - * @{ - */ - -/** - * @} - */ -/** - * @} - */ - - -/** - * @} - */ +#endif /* USBD_USE_MSC_CLASS */ +#endif /* USBCON */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_data.h b/cores/arduino/stm32/usb/msc/usbd_msc_data.h index 79dafbd67f..e0ed04ee82 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_data.h +++ b/cores/arduino/stm32/usb/msc/usbd_msc_data.h @@ -28,63 +28,17 @@ extern "C" { /* Includes ------------------------------------------------------------------*/ #include "usbd_conf.h" -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USB_INFO - * @brief general defines for the usb device library file - * @{ - */ -/** @defgroup USB_INFO_Exported_Defines - * @{ - */ #define MODE_SENSE6_LEN 8U #define MODE_SENSE10_LEN 8U #define LENGTH_INQUIRY_PAGE00 7U #define LENGTH_FORMAT_CAPACITIES 20U -/** - * @} - */ - - -/** @defgroup USBD_INFO_Exported_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_INFO_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_INFO_Exported_Variables - * @{ - */ extern const uint8_t MSC_Page00_Inquiry_Data[]; extern const uint8_t MSC_Mode_Sense6_data[]; extern const uint8_t MSC_Mode_Sense10_data[] ; -/** - * @} - */ - -/** @defgroup USBD_INFO_Exported_FunctionsPrototype - * @{ - */ - -/** - * @} - */ #ifdef __cplusplus } @@ -92,12 +46,4 @@ extern const uint8_t MSC_Mode_Sense10_data[] ; #endif /* __USBD_MSC_DATA_H */ -/** - * @} - */ - -/** -* @} -*/ - /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c index 3c98584244..f00bb2d62e 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c @@ -23,6 +23,11 @@ - "stm32xxxxx_{eval}{discovery}{adafruit}_sd.c" EndBSPDependencies */ +#include "usbd_ep_conf.h" + +#ifdef USBCON +#ifdef USBD_USE_MSC_CLASS + /* Includes ------------------------------------------------------------------*/ #include "usbd_msc_bot.h" #include "usbd_msc_scsi.h" @@ -31,53 +36,6 @@ EndBSPDependencies */ -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup MSC_SCSI - * @brief Mass storage SCSI layer module - * @{ - */ - -/** @defgroup MSC_SCSI_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup MSC_SCSI_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup MSC_SCSI_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup MSC_SCSI_Private_Variables - * @{ - */ - -/** - * @} - */ - - -/** @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); @@ -94,14 +52,6 @@ static int8_t SCSI_CheckAddressRange(USBD_HandleTypeDef *pdev, uint8_t lun, static int8_t SCSI_ProcessRead(USBD_HandleTypeDef *pdev, uint8_t lun); static int8_t SCSI_ProcessWrite(USBD_HandleTypeDef *pdev, uint8_t lun); -/** - * @} - */ - - -/** @defgroup MSC_SCSI_Private_Functions - * @{ - */ /** @@ -505,7 +455,6 @@ static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params * @param params: Command parameters * @retval status */ - static int8_t SCSI_Write10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) { USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; @@ -699,18 +648,8 @@ static int8_t SCSI_ProcessWrite(USBD_HandleTypeDef *pdev, uint8_t lun) return 0; } -/** - * @} - */ - -/** - * @} - */ - - -/** - * @} - */ +#endif /* USBD_USE_MSC_CLASS */ +#endif /* USBCON */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.h b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.h index 1629d786c3..175b83578c 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.h +++ b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.h @@ -28,19 +28,6 @@ extern "C" { /* Includes ------------------------------------------------------------------*/ #include "usbd_def.h" -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_SCSI - * @brief header file for the storage disk file - * @{ - */ - -/** @defgroup USBD_SCSI_Exported_Defines - * @{ - */ - #define SENSE_LIST_DEEPTH 4U /* SCSI Commands */ @@ -117,15 +104,8 @@ extern uint8_t Mode_Sense10_data[]; extern uint8_t Scsi_Sense_Data[]; extern uint8_t ReadCapacity10_Data[]; extern uint8_t ReadFormatCapacity_Data []; -/** - * @} - */ -/** @defgroup USBD_SCSI_Exported_TypesDefinitions - * @{ - */ - typedef struct _SENSE_ITEM { char Skey; @@ -140,53 +120,18 @@ typedef struct _SENSE_ITEM char *pData; } w; } USBD_SCSI_SenseTypeDef; -/** - * @} - */ -/** @defgroup USBD_SCSI_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_SCSI_Exported_Variables - * @{ - */ - -/** - * @} - */ -/** @defgroup USBD_SCSI_Exported_FunctionsPrototype - * @{ - */ int8_t SCSI_ProcessCmd(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *cmd); void SCSI_SenseCode(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t sKey, uint8_t ASC); -/** - * @} - */ #ifdef __cplusplus } #endif #endif /* __USBD_MSC_SCSI_H */ -/** - * @} - */ - -/** - * @} - */ - -/** -* @} -*/ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.c b/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.c index dc6cc3dead..d45dfcd9be 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.c @@ -17,23 +17,18 @@ ****************************************************************************** */ +#include "usbd_ep_conf.h" + +#ifdef USBCON +#ifdef USBD_USE_MSC_CLASS + /* BSPDependencies - "stm32xxxxx_{eval}{discovery}{nucleo_144}.c" - "stm32xxxxx_{eval}{discovery}_io.c" - "stm32xxxxx_{eval}{discovery}{adafruit}_sd.c" EndBSPDependencies */ -/* Includes ------------------------------------------------------------------*/ -#include "usbd_msc_storage_template.h" - - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Extern function prototypes ------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ +#include "usbd_msc_storage_if.h" #define STORAGE_LUN_NBR 1U #define STORAGE_BLK_NBR 0x10000U @@ -75,7 +70,7 @@ int8_t STORAGE_Inquirydata[] = /* 36 */ '0', '.', '0', '1', /* Version : 4 Bytes */ }; -USBD_StorageTypeDef USBD_MSC_Template_fops = +USBD_StorageTypeDef USBD_MSC_fops = { STORAGE_Init, STORAGE_GetCapacity, @@ -173,5 +168,7 @@ int8_t STORAGE_GetMaxLun(void) return (STORAGE_LUN_NBR - 1); } -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +#endif /* USBD_USE_MSC_CLASS */ +#endif /* USBCON */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.h b/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.h index 0288c308fc..676b250195 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.h +++ b/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.h @@ -25,61 +25,9 @@ extern "C" { #endif -/* Includes ------------------------------------------------------------------*/ #include "usbd_msc.h" -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_STORAGE - * @brief header file for the usbd_msc_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_MSC_Template_fops; -/** - * @} - */ - -/** @defgroup USBD_STORAGE_Exported_FunctionsPrototype - * @{ - */ - - -/** - * @} - */ +extern USBD_StorageTypeDef USBD_MSC_fops; #ifdef __cplusplus } @@ -87,11 +35,4 @@ extern USBD_StorageTypeDef USBD_MSC_Template_fops; #endif /* __USBD_MSC_STORAGE_H */ -/** - * @} - */ - -/** -* @} -*/ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/usbd_conf.c b/cores/arduino/stm32/usb/usbd_conf.c index 109f2f56f5..93ed28b8f6 100644 --- a/cores/arduino/stm32/usb/usbd_conf.c +++ b/cores/arduino/stm32/usb/usbd_conf.c @@ -517,10 +517,20 @@ USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev) HAL_PCDEx_SetTxFiFo(&g_hpcd, ep_def[i].ep_adress & 0xF, ep_def[i].ep_size); } #else + uint32_t offset = 0; for (uint32_t i = 0; i < (DEV_NUM_EP + 1); i++) { - HAL_PCDEx_PMAConfig(&g_hpcd, ep_def[i].ep_adress, ep_def[i].ep_kind, ep_def[i].ep_size); + ep_desc_t *pDesc = &ep_dep[i]; + uint32_t size = pDesc->ep_size; + uint32_t address = offset; + if (pDesc->ep_kind == PCD_DBL_BUF) { + address = address | ((address + size) << 16U); + size *= 2; + } + HAL_PCDEx_PMAConfig(&g_hpcd, pDesc->ep_adress, pDesc->ep_kind, address); + offset += size; } #endif /* USE_USB_HS */ + return USBD_OK; } diff --git a/cores/arduino/stm32/usb/usbd_conf.h b/cores/arduino/stm32/usb/usbd_conf.h index db346747b0..01ef078aa3 100644 --- a/cores/arduino/stm32/usb/usbd_conf.h +++ b/cores/arduino/stm32/usb/usbd_conf.h @@ -108,18 +108,6 @@ extern "C" { #define USB_BB_MAX_NUM_ALT_MODE 0x2U #endif /* USB_BB_MAX_NUM_ALT_MODE */ - -/* Endpoint Configuration */ - -#define CDC_IN_EP 0x81 /* EP1 for data IN */ -#define CDC_OUT_EP 0x01 /* EP1 for data OUT */ -#define CDC_CMD_EP 0x82 /* EP2 for CDC commands */ - -#define MSC_IN_EP 0x83 /* EP3 for Interrupt IN */ -#define MSC_OUT_EP 0x02 /* EP3 for Interrupt IN */ - - - /* MSC Class Config */ #ifndef MSC_MEDIA_PACKET #define MSC_MEDIA_PACKET 8192U diff --git a/cores/arduino/stm32/usb/usbd_desc.c b/cores/arduino/stm32/usb/usbd_desc.c index 229112ea5f..b9ba7cabae 100644 --- a/cores/arduino/stm32/usb/usbd_desc.c +++ b/cores/arduino/stm32/usb/usbd_desc.c @@ -37,7 +37,7 @@ #define USBD_VID 0x0483 #if defined(USBD_USE_HID_COMPOSITE) #define USBD_PID 0x5711 - #elif defined(USBD_USE_CDC) + #elif defined(USBD_USE_CDC) || defined(USBD_USE_CDC_MSC) #define USBD_PID 0x5740 #endif #endif /* !USBD_PID && !USBD_VID */ @@ -70,7 +70,7 @@ #elif defined(USBD_USE_HID_COMPOSITE) #define USBD_CLASS_PRODUCT_HS_STRING CONCATS(BOARD_NAME, "HID in HS Mode") #define USBD_CLASS_PRODUCT_FS_STRING CONCATS(BOARD_NAME, "HID in FS Mode") -#elif defined(USBD_USE_CDC) +#elif defined(USBD_USE_CDC) || defined(USBD_USE_CDC_MSC) #define USBD_CLASS_PRODUCT_HS_STRING CONCATS(BOARD_NAME, "CDC in HS Mode") #define USBD_CLASS_PRODUCT_FS_STRING CONCATS(BOARD_NAME, "CDC in FS Mode") #else @@ -85,7 +85,7 @@ #define USBD_CLASS_INTERFACE_FS_STRING CONCATS(BOARD_NAME, "HID Interface") #endif /* USBD_USE_HID_COMPOSITE */ -#ifdef USBD_USE_CDC +#if defined(USBD_USE_CDC) || defined(USBD_USE_CDC_MSC) #define USBD_CLASS_CONFIGURATION_HS_STRING CONCATS(BOARD_NAME, "CDC Config") #define USBD_CLASS_INTERFACE_HS_STRING CONCATS(BOARD_NAME, "CDC Interface") #define USBD_CLASS_CONFIGURATION_FS_STRING CONCATS(BOARD_NAME, "CDC Config") @@ -158,7 +158,7 @@ __ALIGN_BEGIN uint8_t USBD_Class_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = { }; /* USB_DeviceDescriptor */ #endif /* USBD_USE_HID_COMPOSITE */ -#ifdef USBD_USE_CDC +#if defined(USBD_USE_CDC) || defined(USBD_USE_CDC_MSC) /* USB Standard Device Descriptor */ __ALIGN_BEGIN uint8_t USBD_Class_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = { 0x12, /* bLength */ @@ -185,7 +185,7 @@ __ALIGN_BEGIN uint8_t USBD_Class_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = { USBD_IDX_SERIAL_STR, /* Index of serial number string */ USBD_MAX_NUM_CONFIGURATION /* bNumConfigurations */ }; /* USB_DeviceDescriptor */ -#endif /* USBD_USE_CDC */ +#endif /* USBD_USE_CDC || USBD_USE_CDC_MSC */ /* USB Device LPM BOS descriptor */ #if (USBD_LPM_ENABLED == 1) diff --git a/cores/arduino/stm32/usb/usbd_ep_conf.c b/cores/arduino/stm32/usb/usbd_ep_conf.c index 455afe5ecd..91ea4a657c 100644 --- a/cores/arduino/stm32/usb/usbd_ep_conf.c +++ b/cores/arduino/stm32/usb/usbd_ep_conf.c @@ -19,51 +19,65 @@ /* Includes ------------------------------------------------------------------*/ #include "usbd_ep_conf.h" -#ifdef USBD_USE_CDC -const ep_desc_t ep_def[] = { -#ifdef USE_USB_HS - {0x00, CDC_DATA_HS_MAX_PACKET_SIZE}, - {0x80, CDC_DATA_HS_MAX_PACKET_SIZE}, - {CDC_OUT_EP, CDC_DATA_HS_MAX_PACKET_SIZE}, - {CDC_IN_EP, CDC_DATA_HS_MAX_PACKET_SIZE}, - {CDC_CMD_EP, CDC_CMD_PACKET_SIZE} -#else /* USE_USB_FS */ -#ifdef USB_OTG_FS - {0x00, CDC_DATA_FS_MAX_PACKET_SIZE}, - {0x80, CDC_DATA_FS_MAX_PACKET_SIZE}, - {CDC_OUT_EP, CDC_DATA_FS_MAX_PACKET_SIZE}, - {CDC_IN_EP, CDC_DATA_FS_MAX_PACKET_SIZE}, - {CDC_CMD_EP, CDC_CMD_PACKET_SIZE} +#if defined(USB_OTG_FS) || defined(USE_USB_HS) + #define EP_DESC(ADDR, SIZE, KIND_TYP) {ADDR, SIZE} #else - {0x00, PMA_EP0_OUT_ADDR, PCD_SNG_BUF}, - {0x80, PMA_EP0_IN_ADDR, PCD_SNG_BUF}, - {CDC_OUT_EP, PMA_CDC_OUT_ADDR, PCD_DBL_BUF}, - {CDC_IN_EP, PMA_CDC_IN_ADDR, PCD_SNG_BUF}, - {CDC_CMD_EP, PMA_CDC_CMD_ADDR, PCD_SNG_BUF} -#endif + #define EP_DESC(ADDR, SIZE, KIND_TYP) {ADDR, SIZE, KIND_TYP} #endif -}; + +#ifdef USBD_USE_CDC + #ifdef USE_USB_HS + #define CDC_DATA_MAX_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE + #else /* USE_USB_FS */ + #define CDC_DATA_MAX_PACKET_SIZE CDC_DATA_FS_MAX_PACKET_SIZE + #endif + + + const ep_desc_t ep_def[] = { + EP_DESC(0x00, CDC_DATA_MAX_PACKET_SIZE, PCD_SNG_BUF), + EP_DESC(0x80, CDC_DATA_MAX_PACKET_SIZE, PCD_SNG_BUF), + EP_DESC(CDC_OUT_EP, CDC_DATA_MAX_PACKET_SIZE, PCD_DBL_BUF), + EP_DESC(CDC_IN_EP, CDC_DATA_MAX_PACKET_SIZE, PCD_SNG_BUF), + EP_DESC(CDC_CMD_EP, CDC_CMD_PACKET_SIZE, PCD_SNG_BUF) + }; +#endif /* USBD_USE_CDC */ + + +#ifdef USBD_USE_CDC_MSC + #ifdef USE_USB_HS + #define CDC_DATA_MAX_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE + #define MSC_DATA_MAX_PACKET_SIZE MSC_DATA_HS_MAX_PACKET_SIZE + #else /* USE_USB_FS */ + #define CDC_DATA_MAX_PACKET_SIZE CDC_DATA_FS_MAX_PACKET_SIZE + #define MSC_DATA_MAX_PACKET_SIZE MSC_DATA_FS_MAX_PACKET_SIZE + #endif + + + const ep_desc_t ep_def[] = { + EP_DESC(0x00, CDC_DATA_MAX_PACKET_SIZE, PCD_SNG_BUF), + EP_DESC(0x80, CDC_DATA_MAX_PACKET_SIZE, PCD_SNG_BUF), + EP_DESC(CDC_OUT_EP, CDC_DATA_MAX_PACKET_SIZE, PCD_DBL_BUF), + EP_DESC(CDC_IN_EP, CDC_DATA_MAX_PACKET_SIZE, PCD_SNG_BUF), + EP_DESC(CDC_CMD_EP, CDC_CMD_PACKET_SIZE, PCD_SNG_BUF), + EP_DESC(MSC_IN_EP, MSC_DATA_MAX_PACKET_SIZE, PCD_SNG_BUF), + EP_DESC(MSC_OUT_EP, MSC_DATA_MAX_PACKET_SIZE, PCD_SNG_BUF) + }; #endif /* USBD_USE_CDC */ + #ifdef USBD_USE_HID_COMPOSITE -const ep_desc_t ep_def[] = { -#if !defined (USB) -#ifdef USE_USB_HS - {0x00, USB_HS_MAX_PACKET_SIZE}, - {0x80, USB_HS_MAX_PACKET_SIZE}, -#else - {0x00, USB_FS_MAX_PACKET_SIZE}, - {0x80, USB_FS_MAX_PACKET_SIZE}, -#endif - {HID_MOUSE_EPIN_ADDR, HID_MOUSE_EPIN_SIZE}, - {HID_KEYBOARD_EPIN_ADDR, HID_KEYBOARD_EPIN_SIZE}, -#else - {0x00, PMA_EP0_OUT_ADDR, PCD_SNG_BUF}, - {0x80, PMA_EP0_IN_ADDR, PCD_SNG_BUF}, - {HID_MOUSE_EPIN_ADDR, PMA_MOUSE_IN_ADDR, PCD_SNG_BUF}, - {HID_KEYBOARD_EPIN_ADDR, PMA_KEYBOARD_IN_ADDR, PCD_SNG_BUF}, -#endif -}; + #ifdef USE_USB_HS + #define HID_MAX_PACKET_SIZE USB_HS_MAX_PACKET_SIZE + #else /* USE_USB_FS */ + #define HID_MAX_PACKET_SIZE USB_FS_MAX_PACKET_SIZE + #endif + + const ep_desc_t ep_def[] = { + EP_DESC(0x00, HID_MAX_PACKET_SIZE, PCD_SNG_BUF), + EP_DESC(0x80, HID_MAX_PACKET_SIZE, PCD_SNG_BUF), + EP_DESC(HID_MOUSE_EPIN_ADDR, HID_MOUSE_EPIN_SIZE, PCD_SNG_BUF), + EP_DESC(HID_KEYBOARD_EPIN_ADDR, HID_MOUSE_EPIN_SIZE, PCD_SNG_BUF) + }; #endif /* USBD_USE_HID_COMPOSITE */ #endif /* HAL_PCD_MODULE_ENABLED && USBCON */ diff --git a/cores/arduino/stm32/usb/usbd_ep_conf.h b/cores/arduino/stm32/usb/usbd_ep_conf.h index 5bd4f88d06..0f1105f181 100644 --- a/cores/arduino/stm32/usb/usbd_ep_conf.h +++ b/cores/arduino/stm32/usb/usbd_ep_conf.h @@ -68,6 +68,9 @@ typedef struct { #define CDC_DATA_HS_MAX_PACKET_SIZE USB_HS_MAX_PACKET_SIZE /* Endpoint IN & OUT Packet size */ #define CDC_DATA_FS_MAX_PACKET_SIZE USB_FS_MAX_PACKET_SIZE /* Endpoint IN & OUT Packet size */ #define CDC_CMD_PACKET_SIZE 8U /* Control Endpoint Packet size */ + /* MSC Endpoints parameters*/ + #define MSC_DATA_HS_MAX_PACKET_SIZE USB_HS_MAX_PACKET_SIZE /* Endpoint IN & OUT Packet size */ + #define MSC_DATA_FS_MAX_PACKET_SIZE USB_FS_MAX_PACKET_SIZE /* Endpoint IN & OUT Packet size */ #endif /* HID composite (Mouse + Keyboard) Endpoints Configurations */ @@ -89,12 +92,21 @@ typedef struct { #define PMA_EP0_IN_ADDR (PMA_EP0_OUT_ADDR + USB_MAX_EP0_SIZE) #ifdef USBD_USE_CDC - #define PMA_CDC_OUT_BASE (PMA_EP0_IN_ADDR + USB_MAX_EP0_SIZE) - #define PMA_CDC_OUT_ADDR ((PMA_CDC_OUT_BASE + USB_FS_MAX_PACKET_SIZE) | \ - (PMA_CDC_OUT_BASE << 16U)) - #define PMA_CDC_IN_ADDR (PMA_CDC_OUT_BASE + USB_FS_MAX_PACKET_SIZE * 2) - #define PMA_CDC_CMD_ADDR (PMA_CDC_IN_ADDR + CDC_CMD_PACKET_SIZE) + #define PMA_CDC_OUT_BASE (PMA_EP0_IN_ADDR + USB_MAX_EP0_SIZE) + #define PMA_CDC_OUT_ADDR ((PMA_CDC_OUT_BASE + USB_FS_MAX_PACKET_SIZE) | \ + (PMA_CDC_OUT_BASE << 16U)) + #define PMA_CDC_IN_ADDR (PMA_CDC_OUT_BASE + USB_FS_MAX_PACKET_SIZE * 2) + #define PMA_CDC_CMD_ADDR (PMA_CDC_IN_ADDR + CDC_CMD_PACKET_SIZE) #endif /* USBD_USE_CDC */ + #ifdef USBD_USE_CDC_MSC + #define PMA_CDC_OUT_ADDR0 (PMA_EP0_IN_ADDR + USB_MAX_EP0_SIZE) + #define PMA_CDC_OUT_ADDR1 (PMA_CDC_OUT_ADDR1 + USB_FS_MAX_PACKET_SIZE) + #define PMA_CDC_OUT_ADDR (PMA_CDC_OUT_ADDR0 | (PMA_CDC_OUT_ADDR1 << 16U)) // cdc out has a double buffer + #define PMA_CDC_IN_ADDR (PMA_CDC_OUT_ADDR1 + USB_FS_MAX_PACKET_SIZE) + #define PMA_CDC_CMD_ADDR (PMA_CDC_IN_ADDR + USB_FS_MAX_PACKET_SIZE) + #define PMA_MSC_IN_ADDR (PMA_CDC_CMD_ADDR + CDC_CMD_PACKET_SIZE) + #define PMA_MSC_IN_ADDR (PMA_MSC_IN_ADDR + USB_FS_MAX_PACKET_SIZE) + #endif /* USBD_USE_CDC_MSC */ #ifdef USBD_USE_HID_COMPOSITE #define PMA_MOUSE_IN_ADDR (PMA_EP0_IN_ADDR + HID_MOUSE_EPIN_SIZE) #define PMA_KEYBOARD_IN_ADDR (PMA_MOUSE_IN_ADDR + HID_KEYBOARD_EPIN_SIZE) diff --git a/tools/platformio-build.py b/tools/platformio-build.py index 68b0dfc01c..7bdc40d781 100644 --- a/tools/platformio-build.py +++ b/tools/platformio-build.py @@ -86,7 +86,7 @@ def process_usb_configuration(cpp_defines): elif "PIO_FRAMEWORK_ARDUINO_ENABLE_HID" in cpp_defines: env.Append(CPPDEFINES=["USBD_USE_HID_COMPOSITE"]) - if any(f in env["CPPDEFINES"] for f in ("USBD_USE_CDC", "USBD_USE_HID_COMPOSITE")): + if any(f in env["CPPDEFINES"] for f in ["USBCON"]): env.Append(CPPDEFINES=["HAL_PCD_MODULE_ENABLED"]) @@ -170,6 +170,8 @@ def configure_application_offset(mcu, upload_protocol): join(FRAMEWORK_DIR, "cores", "arduino", "stm32", "usb"), join(FRAMEWORK_DIR, "cores", "arduino", "stm32", "usb", "hid"), join(FRAMEWORK_DIR, "cores", "arduino", "stm32", "usb", "cdc"), + join(FRAMEWORK_DIR, "cores", "arduino", "stm32", "usb", "msc"), + join(FRAMEWORK_DIR, "cores", "arduino", "stm32", "usb", "cdc_msc"), join(FRAMEWORK_DIR, "system", "Drivers", series + "_HAL_Driver", "Inc"), join(FRAMEWORK_DIR, "system", "Drivers", series + "_HAL_Driver", "Src"), join(FRAMEWORK_DIR, "system", series), From 6717196bd09d485788e8ec4fd19864316dcae895 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Mon, 1 Jun 2020 22:10:17 +0100 Subject: [PATCH 09/37] fixed bug in descriptor, small changes to USB class --- cores/arduino/USB.cpp | 17 +++++++++-------- cores/arduino/USB.h | 3 +++ .../arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp | 16 ++++++++-------- .../arduino/stm32/usb/msc/usbd_msc_storage_if.c | 4 +++- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/cores/arduino/USB.cpp b/cores/arduino/USB.cpp index db54cf7138..b6c56dddf6 100644 --- a/cores/arduino/USB.cpp +++ b/cores/arduino/USB.cpp @@ -31,6 +31,10 @@ void USB::begin() { if (!initialized) initialize(); } +void USB::register_msc(USBD_StorageTypeDef* fops) { + USBD_MSC_RegisterStorage(&hUSBD_Device, fops); +} + void USB::initialize() { hUSBD_Device_CDC = &hUSBD_Device; @@ -38,9 +42,9 @@ void USB::initialize() { if (USBD_Init(&hUSBD_Device, &USBD_Desc, 0) == USBD_OK) { #ifdef USBD_USE_CDC /* Add Supported Class */ - if (USBD_RegisterClass(&hUSBD_Device_CDC, &USBD_CDC) == USBD_OK) { + if (USBD_RegisterClass(&hUSBD_Device, &USBD_CDC) == USBD_OK) { /* Add CDC Interface Class */ - if (USBD_CDC_RegisterInterface(&hUSBD_Device_CDC, &USBD_CDC_fops) == USBD_OK) { + if (USBD_CDC_RegisterInterface(&hUSBD_Device, &USBD_CDC_fops) == USBD_OK) { /* Start Device Process */ USBD_Start(&hUSBD_Device_CDC); initialized = true; @@ -51,12 +55,9 @@ void USB::initialize() { if (USBD_RegisterClass(&hUSBD_Device, &USBD_CDC_MSC) == USBD_OK) { /* Add CDC Interface Class */ if (USBD_CDC_RegisterInterface(&hUSBD_Device, &USBD_CDC_fops) == USBD_OK) { - /* Add MSC Interface Class */ - if (USBD_MSC_RegisterStorage(&hUSBD_Device, &USBD_MSC_fops) == USBD_OK) { - /* Start Device Process */ - USBD_Start(&hUSBD_Device); - initialized = true; - } + /* Start Device Process */ + USBD_Start(&hUSBD_Device); + initialized = true; } } #endif diff --git a/cores/arduino/USB.h b/cores/arduino/USB.h index 2051be1c9b..64d5900c15 100644 --- a/cores/arduino/USB.h +++ b/cores/arduino/USB.h @@ -22,9 +22,12 @@ #if defined (USBCON) #include "Stream.h" #include "usbd_core.h" +#include "usbd_msc.h" class USB { public: + void register_msc(USBD_StorageTypeDef* fops); + void begin(void); void end(void); diff --git a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp index 458e4741d9..e9bcc25f30 100644 --- a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp +++ b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp @@ -87,10 +87,10 @@ USBD_ClassTypeDef USBD_CDC_MSC = #pragma data_alignment=4 #endif /* USB COMPOSITE device Configuration Descriptor */ -static uint8_t USBD_COMPOSITE_CfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = +static uint8_t USBD_COMPOSITE_CfgFSDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { 0x09, /* bLength: Configuation Descriptor size */ - USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION, /* bDescriptorType: Configuration */ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ USB_CDC_MSC_CONFIG_DESC_SIZ, /* wTotalLength: Bytes returned */ 0x00, @@ -198,16 +198,16 @@ static uint8_t USBD_COMPOSITE_CfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = 0x05, /* Endpoint descriptor type */ MSC_EPIN_ADDR, /* Endpoint address (IN, address 1) */ 0x02, /* Bulk endpoint type */ - LOBYTE(MSC_MAX_HS_PACKET), - HIBYTE(MSC_MAX_HS_PACKET), + LOBYTE(MSC_MAX_FS_PACKET), + HIBYTE(MSC_MAX_FS_PACKET), 0x00, /* Polling interval in milliseconds */ 0x07, /* Endpoint descriptor length = 7 */ 0x05, /* Endpoint descriptor type */ MSC_EPOUT_ADDR, /* Endpoint address (OUT, address 1) */ 0x02, /* Bulk endpoint type */ - LOBYTE(MSC_MAX_HS_PACKET), - HIBYTE(MSC_MAX_HS_PACKET), + LOBYTE(MSC_MAX_FS_PACKET), + HIBYTE(MSC_MAX_FS_PACKET), 0x00 /* Polling interval in milliseconds */ }; @@ -325,8 +325,8 @@ static uint8_t USBD_COMPOSITE_Setup(USBD_HandleTypeDef *pdev, */ static uint8_t *USBD_COMPOSITE_GetCfgDesc(uint16_t *length) { - *length = sizeof(USBD_COMPOSITE_CfgDesc); - return USBD_COMPOSITE_CfgDesc; + *length = sizeof(USBD_COMPOSITE_CfgFSDesc); + return USBD_COMPOSITE_CfgFSDesc; } /** diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.c b/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.c index d45dfcd9be..4a0c4a6902 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.c @@ -54,7 +54,6 @@ int8_t STORAGE_GetMaxLun(void); /* USB Mass storage Standard Inquiry Data */ int8_t STORAGE_Inquirydata[] = /* 36 */ { - /* LUN 0 */ 0x00, 0x80, @@ -82,6 +81,7 @@ USBD_StorageTypeDef USBD_MSC_fops = STORAGE_Inquirydata, }; + /******************************************************************************* * Function Name : Read_Memory * Description : Handle the Read operation from the microSD card. @@ -144,6 +144,7 @@ int8_t STORAGE_Read(uint8_t lun, uint8_t *buf, { return 0; } + /******************************************************************************* * Function Name : Write_Memory * Description : Handle the Write operation to the STORAGE card. @@ -156,6 +157,7 @@ int8_t STORAGE_Write(uint8_t lun, uint8_t *buf, { return (0); } + /******************************************************************************* * Function Name : Write_Memory * Description : Handle the Write operation to the STORAGE card. From 6f3ebfcbce037bc4240e0ea97aa134ef9782c293 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Tue, 2 Jun 2020 10:09:19 +0100 Subject: [PATCH 10/37] fixed duplicate endpoint definition and somewhat fixed endpoint configuration --- .../stm32/usb/cdc_msc/usbd_cdc_msc.cpp | 26 +++++----- cores/arduino/stm32/usb/msc/usbd_msc.c | 48 +++++++++---------- cores/arduino/stm32/usb/msc/usbd_msc.h | 4 -- cores/arduino/stm32/usb/msc/usbd_msc_bot.c | 24 +++++----- cores/arduino/stm32/usb/msc/usbd_msc_scsi.c | 6 +-- cores/arduino/stm32/usb/usbd_conf.c | 4 +- cores/arduino/stm32/usb/usbd_ep_conf.h | 4 +- 7 files changed, 57 insertions(+), 59 deletions(-) diff --git a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp index e9bcc25f30..e20dbfb1b6 100644 --- a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp +++ b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp @@ -164,20 +164,20 @@ static uint8_t USBD_COMPOSITE_CfgFSDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = 0x00, /* iInterface: */ /*Endpoint OUT Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ + 0x00, /* bInterval: ignore for Bulk transfer */ /*Endpoint IN Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00, @@ -196,7 +196,7 @@ static uint8_t USBD_COMPOSITE_CfgFSDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = /******************** Mass Storage Endpoints ********************/ 0x07, /* Endpoint descriptor length = 7 */ 0x05, /* Endpoint descriptor type */ - MSC_EPIN_ADDR, /* Endpoint address (IN, address 1) */ + MSC_IN_EP, /* Endpoint address (IN, address 1) */ 0x02, /* Bulk endpoint type */ LOBYTE(MSC_MAX_FS_PACKET), HIBYTE(MSC_MAX_FS_PACKET), @@ -204,7 +204,7 @@ static uint8_t USBD_COMPOSITE_CfgFSDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = 0x07, /* Endpoint descriptor length = 7 */ 0x05, /* Endpoint descriptor type */ - MSC_EPOUT_ADDR, /* Endpoint address (OUT, address 1) */ + MSC_OUT_EP, /* Endpoint address (OUT, address 1) */ 0x02, /* Bulk endpoint type */ LOBYTE(MSC_MAX_FS_PACKET), HIBYTE(MSC_MAX_FS_PACKET), diff --git a/cores/arduino/stm32/usb/msc/usbd_msc.c b/cores/arduino/stm32/usb/msc/usbd_msc.c index 8fd17b9c3f..ba6d4a99a9 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc.c @@ -106,7 +106,7 @@ __ALIGN_BEGIN uint8_t USBD_MSC_CfgHSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = /******************** Mass Storage Endpoints ********************/ 0x07, /*Endpoint descriptor length = 7*/ 0x05, /*Endpoint descriptor type */ - MSC_EPIN_ADDR, /*Endpoint address (IN, address 1) */ + MSC_IN_EP, /*Endpoint address (IN, address 1) */ 0x02, /*Bulk endpoint type */ LOBYTE(MSC_MAX_HS_PACKET), HIBYTE(MSC_MAX_HS_PACKET), @@ -114,7 +114,7 @@ __ALIGN_BEGIN uint8_t USBD_MSC_CfgHSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = 0x07, /*Endpoint descriptor length = 7 */ 0x05, /*Endpoint descriptor type */ - MSC_EPOUT_ADDR, /*Endpoint address (OUT, address 1) */ + MSC_OUT_EP, /*Endpoint address (OUT, address 1) */ 0x02, /*Bulk endpoint type */ LOBYTE(MSC_MAX_HS_PACKET), HIBYTE(MSC_MAX_HS_PACKET), @@ -149,7 +149,7 @@ __ALIGN_BEGIN uint8_t USBD_MSC_CfgFSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = /******************** Mass Storage Endpoints ********************/ 0x07, /*Endpoint descriptor length = 7*/ 0x05, /*Endpoint descriptor type */ - MSC_EPIN_ADDR, /*Endpoint address (IN, address 1) */ + MSC_IN_EP, /*Endpoint address (IN, address 1) */ 0x02, /*Bulk endpoint type */ LOBYTE(MSC_MAX_FS_PACKET), HIBYTE(MSC_MAX_FS_PACKET), @@ -157,7 +157,7 @@ __ALIGN_BEGIN uint8_t USBD_MSC_CfgFSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = 0x07, /*Endpoint descriptor length = 7 */ 0x05, /*Endpoint descriptor type */ - MSC_EPOUT_ADDR, /*Endpoint address (OUT, address 1) */ + MSC_OUT_EP, /*Endpoint address (OUT, address 1) */ 0x02, /*Bulk endpoint type */ LOBYTE(MSC_MAX_FS_PACKET), HIBYTE(MSC_MAX_FS_PACKET), @@ -190,7 +190,7 @@ __ALIGN_BEGIN uint8_t USBD_MSC_OtherSpeedCfgDesc[USB_MSC_CONFIG_DESC_SIZ] __AL /******************** Mass Storage Endpoints ********************/ 0x07, /*Endpoint descriptor length = 7*/ 0x05, /*Endpoint descriptor type */ - MSC_EPIN_ADDR, /*Endpoint address (IN, address 1) */ + MSC_IN_EP, /*Endpoint address (IN, address 1) */ 0x02, /*Bulk endpoint type */ 0x40, 0x00, @@ -198,7 +198,7 @@ __ALIGN_BEGIN uint8_t USBD_MSC_OtherSpeedCfgDesc[USB_MSC_CONFIG_DESC_SIZ] __AL 0x07, /*Endpoint descriptor length = 7 */ 0x05, /*Endpoint descriptor type */ - MSC_EPOUT_ADDR, /*Endpoint address (OUT, address 1) */ + MSC_OUT_EP, /*Endpoint address (OUT, address 1) */ 0x02, /*Bulk endpoint type */ 0x40, 0x00, @@ -240,22 +240,22 @@ uint8_t USBD_MSC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) if (pdev->dev_speed == USBD_SPEED_HIGH) { /* Open EP OUT */ - USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); - pdev->ep_out[MSC_EPOUT_ADDR & 0xFU].is_used = 1U; + USBD_LL_OpenEP(pdev, MSC_OUT_EP, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); + pdev->ep_out[MSC_OUT_EP & 0xFU].is_used = 1U; /* Open EP IN */ - USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); - pdev->ep_in[MSC_EPIN_ADDR & 0xFU].is_used = 1U; + USBD_LL_OpenEP(pdev, MSC_IN_EP, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); + pdev->ep_in[MSC_IN_EP & 0xFU].is_used = 1U; } else { /* Open EP OUT */ - USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); - pdev->ep_out[MSC_EPOUT_ADDR & 0xFU].is_used = 1U; + USBD_LL_OpenEP(pdev, MSC_OUT_EP, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); + pdev->ep_out[MSC_OUT_EP & 0xFU].is_used = 1U; /* Open EP IN */ - USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); - pdev->ep_in[MSC_EPIN_ADDR & 0xFU].is_used = 1U; + USBD_LL_OpenEP(pdev, MSC_IN_EP, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); + pdev->ep_in[MSC_IN_EP & 0xFU].is_used = 1U; } /* Init the BOT layer */ @@ -275,12 +275,12 @@ uint8_t USBD_MSC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) { /* Close MSC EPs */ - USBD_LL_CloseEP(pdev, MSC_EPOUT_ADDR); - pdev->ep_out[MSC_EPOUT_ADDR & 0xFU].is_used = 0U; + USBD_LL_CloseEP(pdev, MSC_OUT_EP); + pdev->ep_out[MSC_OUT_EP & 0xFU].is_used = 0U; /* Close EP IN */ - USBD_LL_CloseEP(pdev, MSC_EPIN_ADDR); - pdev->ep_in[MSC_EPIN_ADDR & 0xFU].is_used = 0U; + USBD_LL_CloseEP(pdev, MSC_IN_EP); + pdev->ep_in[MSC_IN_EP & 0xFU].is_used = 0U; /* De-Init the BOT layer */ MSC_BOT_DeInit(pdev); @@ -398,16 +398,16 @@ uint8_t USBD_MSC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) if (pdev->dev_speed == USBD_SPEED_HIGH) { /* Open EP IN */ - USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, + USBD_LL_OpenEP(pdev, MSC_IN_EP, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); } else { /* Open EP IN */ - USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, + USBD_LL_OpenEP(pdev, MSC_IN_EP, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); } - pdev->ep_in[MSC_EPIN_ADDR & 0xFU].is_used = 1U; + pdev->ep_in[MSC_IN_EP & 0xFU].is_used = 1U; } else { @@ -415,16 +415,16 @@ uint8_t USBD_MSC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) if (pdev->dev_speed == USBD_SPEED_HIGH) { /* Open EP OUT */ - USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK, + USBD_LL_OpenEP(pdev, MSC_OUT_EP, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); } else { /* Open EP OUT */ - USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK, + USBD_LL_OpenEP(pdev, MSC_OUT_EP, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); } - pdev->ep_out[MSC_EPOUT_ADDR & 0xFU].is_used = 1U; + pdev->ep_out[MSC_OUT_EP & 0xFU].is_used = 1U; } /* Handle BOT error */ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc.h b/cores/arduino/stm32/usb/msc/usbd_msc.h index 9d19a1496d..3c19a9a2ac 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc.h +++ b/cores/arduino/stm32/usb/msc/usbd_msc.h @@ -41,10 +41,6 @@ extern "C" { #define BOT_RESET 0xFF #define USB_MSC_CONFIG_DESC_SIZ 32 - -#define MSC_EPIN_ADDR 0x81U -#define MSC_EPOUT_ADDR 0x01U - typedef struct _USBD_STORAGE { int8_t (* Init)(uint8_t lun); diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_bot.c b/cores/arduino/stm32/usb/msc/usbd_msc_bot.c index 8b83094bd8..f1a80a6b61 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_bot.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_bot.c @@ -59,11 +59,11 @@ void MSC_BOT_Init(USBD_HandleTypeDef *pdev) msc_storage->Init(0U); - USBD_LL_FlushEP(pdev, MSC_EPOUT_ADDR); - USBD_LL_FlushEP(pdev, MSC_EPIN_ADDR); + USBD_LL_FlushEP(pdev, MSC_OUT_EP); + USBD_LL_FlushEP(pdev, MSC_IN_EP); /* Prapare EP to Receive First BOT Cmd */ - USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, (uint8_t *)(void *)&hmsc->cbw, + USBD_LL_PrepareReceive(pdev, MSC_OUT_EP, (uint8_t *)(void *)&hmsc->cbw, USBD_BOT_CBW_LENGTH); } @@ -81,7 +81,7 @@ void MSC_BOT_Reset(USBD_HandleTypeDef *pdev) hmsc->bot_status = USBD_BOT_STATUS_RECOVERY; /* Prapare EP to Receive First BOT Cmd */ - USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, (uint8_t *)(void *)&hmsc->cbw, + USBD_LL_PrepareReceive(pdev, MSC_OUT_EP, (uint8_t *)(void *)&hmsc->cbw, USBD_BOT_CBW_LENGTH); } @@ -171,7 +171,7 @@ static void MSC_BOT_CBW_Decode(USBD_HandleTypeDef *pdev) hmsc->csw.dTag = hmsc->cbw.dTag; hmsc->csw.dDataResidue = hmsc->cbw.dDataLength; - if ((USBD_LL_GetRxDataSize(pdev, MSC_EPOUT_ADDR) != USBD_BOT_CBW_LENGTH) || + if ((USBD_LL_GetRxDataSize(pdev, MSC_OUT_EP) != USBD_BOT_CBW_LENGTH) || (hmsc->cbw.dSignature != USBD_BOT_CBW_SIGNATURE) || (hmsc->cbw.bLUN > 1U) || (hmsc->cbw.bCBLength < 1U) || (hmsc->cbw.bCBLength > 16U)) @@ -239,7 +239,7 @@ static void MSC_BOT_SendData(USBD_HandleTypeDef *pdev, uint8_t *pbuf, hmsc->csw.bStatus = USBD_CSW_CMD_PASSED; hmsc->bot_state = USBD_BOT_SEND_DATA; - USBD_LL_Transmit(pdev, MSC_EPIN_ADDR, pbuf, length); + USBD_LL_Transmit(pdev, MSC_IN_EP, pbuf, length); } /** @@ -258,11 +258,11 @@ void MSC_BOT_SendCSW(USBD_HandleTypeDef *pdev, hmsc->csw.bStatus = CSW_Status; hmsc->bot_state = USBD_BOT_IDLE; - USBD_LL_Transmit(pdev, MSC_EPIN_ADDR, (uint8_t *)(void *)&hmsc->csw, + USBD_LL_Transmit(pdev, MSC_IN_EP, (uint8_t *)(void *)&hmsc->csw, USBD_BOT_CSW_LENGTH); /* Prepare EP to Receive next Cmd */ - USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, (uint8_t *)(void *)&hmsc->cbw, + USBD_LL_PrepareReceive(pdev, MSC_OUT_EP, (uint8_t *)(void *)&hmsc->cbw, USBD_BOT_CBW_LENGTH); } @@ -281,14 +281,14 @@ static void MSC_BOT_Abort(USBD_HandleTypeDef *pdev) (hmsc->cbw.dDataLength != 0U) && (hmsc->bot_status == USBD_BOT_STATUS_NORMAL)) { - USBD_LL_StallEP(pdev, MSC_EPOUT_ADDR); + USBD_LL_StallEP(pdev, MSC_OUT_EP); } - USBD_LL_StallEP(pdev, MSC_EPIN_ADDR); + USBD_LL_StallEP(pdev, MSC_IN_EP); if (hmsc->bot_status == USBD_BOT_STATUS_ERROR) { - USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, (uint8_t *)(void *)&hmsc->cbw, + USBD_LL_PrepareReceive(pdev, MSC_OUT_EP, (uint8_t *)(void *)&hmsc->cbw, USBD_BOT_CBW_LENGTH); } } @@ -307,7 +307,7 @@ void MSC_BOT_CplClrFeature(USBD_HandleTypeDef *pdev, uint8_t epnum) if (hmsc->bot_status == USBD_BOT_STATUS_ERROR) /* Bad CBW Signature */ { - USBD_LL_StallEP(pdev, MSC_EPIN_ADDR); + USBD_LL_StallEP(pdev, MSC_IN_EP); hmsc->bot_status = USBD_BOT_STATUS_NORMAL; } else if (((epnum & 0x80U) == 0x80U) && (hmsc->bot_status != USBD_BOT_STATUS_RECOVERY)) diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c index f00bb2d62e..1887134e79 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c @@ -511,7 +511,7 @@ static int8_t SCSI_Write10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *para /* Prepare EP to receive first data packet */ hmsc->bot_state = USBD_BOT_DATA_OUT; - USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, hmsc->bot_data, len); + USBD_LL_PrepareReceive(pdev, MSC_OUT_EP, hmsc->bot_data, len); } else /* Write Process ongoing */ { @@ -591,7 +591,7 @@ static int8_t SCSI_ProcessRead(USBD_HandleTypeDef *pdev, uint8_t lun) return -1; } - USBD_LL_Transmit(pdev, MSC_EPIN_ADDR, hmsc->bot_data, len); + USBD_LL_Transmit(pdev, MSC_IN_EP, hmsc->bot_data, len); hmsc->scsi_blk_addr += (len / hmsc->scsi_blk_size); hmsc->scsi_blk_len -= (len / hmsc->scsi_blk_size); @@ -643,7 +643,7 @@ static int8_t SCSI_ProcessWrite(USBD_HandleTypeDef *pdev, uint8_t lun) { len = MIN((hmsc->scsi_blk_len * hmsc->scsi_blk_size), MSC_MEDIA_PACKET); /* Prepare EP to Receive next packet */ - USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, hmsc->bot_data, len); + USBD_LL_PrepareReceive(pdev, MSC_OUT_EP, hmsc->bot_data, len); } return 0; diff --git a/cores/arduino/stm32/usb/usbd_conf.c b/cores/arduino/stm32/usb/usbd_conf.c index 93ed28b8f6..0bc8b9cc16 100644 --- a/cores/arduino/stm32/usb/usbd_conf.c +++ b/cores/arduino/stm32/usb/usbd_conf.c @@ -514,7 +514,9 @@ USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev) /* configure EPs FIFOs */ HAL_PCDEx_SetRxFiFo(&g_hpcd, ep_def[0].ep_size); for (uint32_t i = 1; i < (DEV_NUM_EP + 1); i++) { - HAL_PCDEx_SetTxFiFo(&g_hpcd, ep_def[i].ep_adress & 0xF, ep_def[i].ep_size); + if (ep_def[i].ep_adress & 0xF0U) { + HAL_PCDEx_SetTxFiFo(&g_hpcd, ep_def[i].ep_adress & 0xF, ep_def[i].ep_size); + } } #else uint32_t offset = 0; diff --git a/cores/arduino/stm32/usb/usbd_ep_conf.h b/cores/arduino/stm32/usb/usbd_ep_conf.h index 0f1105f181..6d8003ef2f 100644 --- a/cores/arduino/stm32/usb/usbd_ep_conf.h +++ b/cores/arduino/stm32/usb/usbd_ep_conf.h @@ -59,10 +59,10 @@ typedef struct { #define CDC_IN_EP 0x81U /* EP1 for CDC data IN */ #define CDC_CMD_EP 0x82U /* EP2 for CDC commands */ - #define MSC_OUT_EP 0x02U /* EP2 for MSC data IN */ + #define MSC_OUT_EP 0x03U /* EP3 for MSC data IN */ #define MSC_IN_EP 0x83U /* EP3 for MSC data IN */ - #define DEV_NUM_EP 0x04U /* Device Endpoints number including EP0 */ + #define DEV_NUM_EP 0x07U /* Device Endpoints number including EP0 */ /* CDC Endpoints parameters*/ #define CDC_DATA_HS_MAX_PACKET_SIZE USB_HS_MAX_PACKET_SIZE /* Endpoint IN & OUT Packet size */ From ccef5566236ba11a20e0c06230ee8b52ddc66281 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Tue, 2 Jun 2020 21:11:44 +0100 Subject: [PATCH 11/37] fixed styling and changed dummy sd usb so it is always not ready --- cores/arduino/USB.cpp | 72 ++++++---- cores/arduino/USB.h | 4 +- cores/arduino/stm32/usb/cdc/usbd_cdc.c | 18 +-- .../stm32/usb/cdc_msc/usbd_cdc_msc.cpp | 36 +++-- .../arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h | 4 +- cores/arduino/stm32/usb/msc/usbd_msc.c | 86 ++++-------- cores/arduino/stm32/usb/msc/usbd_msc.h | 6 +- cores/arduino/stm32/usb/msc/usbd_msc_bot.c | 65 +++------ cores/arduino/stm32/usb/msc/usbd_msc_bot.h | 6 +- cores/arduino/stm32/usb/msc/usbd_msc_data.c | 11 +- cores/arduino/stm32/usb/msc/usbd_msc_scsi.c | 126 ++++++------------ cores/arduino/stm32/usb/msc/usbd_msc_scsi.h | 9 +- .../stm32/usb/msc/usbd_msc_storage_if.c | 8 +- 13 files changed, 176 insertions(+), 275 deletions(-) diff --git a/cores/arduino/USB.cpp b/cores/arduino/USB.cpp index b6c56dddf6..3685543257 100644 --- a/cores/arduino/USB.cpp +++ b/cores/arduino/USB.cpp @@ -27,48 +27,62 @@ USB USBDevice; -void USB::begin() { - if (!initialized) initialize(); +void USB::begin() +{ + if (!initialized) { + initialize(); + } } -void USB::register_msc(USBD_StorageTypeDef* fops) { +void USB::register_msc(USBD_StorageTypeDef* fops) +{ USBD_MSC_RegisterStorage(&hUSBD_Device, fops); } -void USB::initialize() { +void USB::initialize() +{ hUSBD_Device_CDC = &hUSBD_Device; /* Init Device Library */ - if (USBD_Init(&hUSBD_Device, &USBD_Desc, 0) == USBD_OK) { - #ifdef USBD_USE_CDC - /* Add Supported Class */ - if (USBD_RegisterClass(&hUSBD_Device, &USBD_CDC) == USBD_OK) { - /* Add CDC Interface Class */ - if (USBD_CDC_RegisterInterface(&hUSBD_Device, &USBD_CDC_fops) == USBD_OK) { - /* Start Device Process */ - USBD_Start(&hUSBD_Device_CDC); - initialized = true; - } - } - #elif USBD_USE_CDC_MSC - /* Add Supported Class */ - if (USBD_RegisterClass(&hUSBD_Device, &USBD_CDC_MSC) == USBD_OK) { - /* Add CDC Interface Class */ - if (USBD_CDC_RegisterInterface(&hUSBD_Device, &USBD_CDC_fops) == USBD_OK) { - /* Start Device Process */ - USBD_Start(&hUSBD_Device); - initialized = true; - } - } - #endif + if (USBD_Init(&hUSBD_Device, &USBD_Desc, 0) != USBD_OK) { + return; + } + + /* Add Supported Class and register interface */ +#ifdef USBD_USE_CDC + if (USBD_RegisterClass(&hUSBD_Device, &USBD_CDC) != USBD_OK) { + return; + } + if (USBD_CDC_RegisterInterface(&hUSBD_Device, &USBD_CDC_fops) != USBD_OK) { + return; + } +#elif USBD_USE_CDC_MSC + if (USBD_RegisterClass(&hUSBD_Device, &USBD_CDC_MSC) != USBD_OK) { + return; } + if (USBD_CDC_RegisterInterface(&hUSBD_Device, &USBD_CDC_fops) != USBD_OK) { + return; + } +#elif USBD_USE_MSC + if (USBD_RegisterClass(&hUSBD_Device, &USBD_CDC_MSC) != USBD_OK) { + return; + } +#endif + + /* Start Device Process */ + USBD_Start(&hUSBD_Device_CDC); + initialized = true; } -void USB::end() { - if (initialized) deinitialize(); +void USB::end() +{ + if (initialized) { + deinitialize(); + } } -void USB::deinitialize() { +void USB::deinitialize() +{ USBD_Stop(&hUSBD_Device); USBD_DeInit(&hUSBD_Device); initialized = false; diff --git a/cores/arduino/USB.h b/cores/arduino/USB.h index 64d5900c15..25572d07a2 100644 --- a/cores/arduino/USB.h +++ b/cores/arduino/USB.h @@ -26,7 +26,7 @@ class USB { public: - void register_msc(USBD_StorageTypeDef* fops); + void register_msc(USBD_StorageTypeDef *fops); void begin(void); @@ -37,7 +37,7 @@ class USB { void deinitialize(); bool initialized; - + USBD_HandleTypeDef hUSBD_Device; }; diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc.c b/cores/arduino/stm32/usb/cdc/usbd_cdc.c index ee2b6d6eb3..7ce101ae03 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc.c +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc.c @@ -499,11 +499,11 @@ static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) if (pdev->dev_speed == USBD_SPEED_HIGH) { /* Prepare Out endpoint to receive next packet */ USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer, - CDC_DATA_HS_OUT_PACKET_SIZE); + CDC_DATA_HS_OUT_PACKET_SIZE); } else { /* Prepare Out endpoint to receive next packet */ USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer, - CDC_DATA_FS_OUT_PACKET_SIZE); + CDC_DATA_FS_OUT_PACKET_SIZE); } return ret; @@ -820,7 +820,7 @@ uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev) /* Transmit next packet */ USBD_LL_Transmit(pdev, CDC_IN_EP, hcdc->TxBuffer, - (uint16_t)hcdc->TxLength); + (uint16_t)hcdc->TxLength); return USBD_OK; } else { @@ -845,15 +845,15 @@ uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev) if (pdev->dev_speed == USBD_SPEED_HIGH) { /* Prepare Out endpoint to receive next packet */ USBD_LL_PrepareReceive(pdev, - CDC_OUT_EP, - hcdc->RxBuffer, - CDC_DATA_HS_OUT_PACKET_SIZE); + CDC_OUT_EP, + hcdc->RxBuffer, + CDC_DATA_HS_OUT_PACKET_SIZE); } else { /* Prepare Out endpoint to receive next packet */ USBD_LL_PrepareReceive(pdev, - CDC_OUT_EP, - hcdc->RxBuffer, - CDC_DATA_FS_OUT_PACKET_SIZE); + CDC_OUT_EP, + hcdc->RxBuffer, + CDC_DATA_FS_OUT_PACKET_SIZE); } return USBD_OK; } diff --git a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp index e20dbfb1b6..05ec62476d 100644 --- a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp +++ b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp @@ -44,13 +44,13 @@ #include "usbd_ctlreq.h" static uint8_t USBD_COMPOSITE_Init(USBD_HandleTypeDef *pdev, - uint8_t cfgidx); + uint8_t cfgidx); static uint8_t USBD_COMPOSITE_DeInit(USBD_HandleTypeDef *pdev, - uint8_t cfgidx); + uint8_t cfgidx); static uint8_t USBD_COMPOSITE_Setup(USBD_HandleTypeDef *pdev, - USBD_SetupReqTypedef *req); + USBD_SetupReqTypedef *req); static uint8_t *USBD_COMPOSITE_GetCfgDesc(uint16_t *length); @@ -64,8 +64,7 @@ static uint8_t USBD_COMPOSITE_EP0_RxReady(USBD_HandleTypeDef *pdev); static uint8_t USBD_COMPOSITE_SOF(USBD_HandleTypeDef *pdev); -USBD_ClassTypeDef USBD_CDC_MSC = -{ +USBD_ClassTypeDef USBD_CDC_MSC = { USBD_COMPOSITE_Init, USBD_COMPOSITE_DeInit, USBD_COMPOSITE_Setup, @@ -84,11 +83,10 @@ USBD_ClassTypeDef USBD_CDC_MSC = #if defined ( __ICCARM__ ) /*!< IAR Compiler */ -#pragma data_alignment=4 + #pragma data_alignment=4 #endif /* USB COMPOSITE device Configuration Descriptor */ -static uint8_t USBD_COMPOSITE_CfgFSDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = -{ +static uint8_t USBD_COMPOSITE_CfgFSDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { 0x09, /* bLength: Configuation Descriptor size */ USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ USB_CDC_MSC_CONFIG_DESC_SIZ, @@ -212,11 +210,10 @@ static uint8_t USBD_COMPOSITE_CfgFSDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = }; #if defined ( __ICCARM__ ) /*!< IAR Compiler */ -#pragma data_alignment=4 + #pragma data_alignment=4 #endif /* USB Standard Device Descriptor */ -static uint8_t USBD_COMPOSITE_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] = -{ +static uint8_t USBD_COMPOSITE_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] = { USB_LEN_DEV_QUALIFIER_DESC, USB_DESC_TYPE_DEVICE_QUALIFIER, 0x00, @@ -237,7 +234,7 @@ static uint8_t USBD_COMPOSITE_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] = * @retval status */ static uint8_t USBD_COMPOSITE_Init(USBD_HandleTypeDef *pdev, - uint8_t cfgidx) + uint8_t cfgidx) { USBD_MSC.Init(pdev, cfgidx); @@ -254,7 +251,7 @@ static uint8_t USBD_COMPOSITE_Init(USBD_HandleTypeDef *pdev, * @retval status */ static uint8_t USBD_COMPOSITE_DeInit(USBD_HandleTypeDef *pdev, - uint8_t cfgidx) + uint8_t cfgidx) { USBD_MSC.DeInit(pdev, cfgidx); @@ -271,7 +268,7 @@ static uint8_t USBD_COMPOSITE_DeInit(USBD_HandleTypeDef *pdev, * @retval status */ static uint8_t USBD_COMPOSITE_Setup(USBD_HandleTypeDef *pdev, - USBD_SetupReqTypedef *req) + USBD_SetupReqTypedef *req) { switch (req->bmRequest & USB_REQ_RECIPIENT_MASK) { @@ -285,12 +282,12 @@ static uint8_t USBD_COMPOSITE_Setup(USBD_HandleTypeDef *pdev, case MSC_INTERFACE: return USBD_MSC.Setup(pdev, req); break; - + // invalid interface default: return USBD_FAIL; } - break; + break; case USB_REQ_RECIPIENT_ENDPOINT: switch (req->wIndex) { @@ -307,7 +304,7 @@ static uint8_t USBD_COMPOSITE_Setup(USBD_HandleTypeDef *pdev, default: return USBD_FAIL; } - break; + break; default: break; @@ -350,10 +347,9 @@ uint8_t *USBD_COMPOSITE_DeviceQualifierDescriptor(uint16_t *length) * @retval status */ static uint8_t USBD_COMPOSITE_DataIn(USBD_HandleTypeDef *pdev, - uint8_t epnum) + uint8_t epnum) { - switch (epnum) - { + switch (epnum) { case CDC_IN_EP: case CDC_CMD_EP: case CDC_OUT_EP: diff --git a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h index c3cd830697..ffe43f6fa2 100644 --- a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h +++ b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h @@ -17,9 +17,7 @@ * * ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ + */ #ifndef __USB_CDC_MSC_CORE_H_ #define __USB_CDC_MSC_CORE_H_ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc.c b/cores/arduino/stm32/usb/msc/usbd_msc.c index ba6d4a99a9..b9d300078c 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc.c @@ -59,8 +59,7 @@ uint8_t *USBD_MSC_GetOtherSpeedCfgDesc(uint16_t *length); uint8_t *USBD_MSC_GetDeviceQualifierDescriptor(uint16_t *length); -USBD_ClassTypeDef USBD_MSC = -{ +USBD_ClassTypeDef USBD_MSC = { USBD_MSC_Init, USBD_MSC_DeInit, USBD_MSC_Setup, @@ -79,8 +78,7 @@ USBD_ClassTypeDef USBD_MSC = /* USB Mass storage device Configuration Descriptor */ /* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ -__ALIGN_BEGIN uint8_t USBD_MSC_CfgHSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = -{ +__ALIGN_BEGIN uint8_t USBD_MSC_CfgHSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = { 0x09, /* bLength: Configuation Descriptor size */ USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ @@ -123,8 +121,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 */ -__ALIGN_BEGIN 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 */ USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ USB_MSC_CONFIG_DESC_SIZ, @@ -164,8 +161,7 @@ __ALIGN_BEGIN uint8_t USBD_MSC_CfgFSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = 0x00 /*Polling interval in milliseconds*/ }; -__ALIGN_BEGIN uint8_t USBD_MSC_OtherSpeedCfgDesc[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 */ USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION, USB_MSC_CONFIG_DESC_SIZ, @@ -237,8 +233,7 @@ USBD_StorageTypeDef *msc_storage = &USBD_MSC_fops; */ uint8_t USBD_MSC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) { - if (pdev->dev_speed == USBD_SPEED_HIGH) - { + if (pdev->dev_speed == USBD_SPEED_HIGH) { /* Open EP OUT */ USBD_LL_OpenEP(pdev, MSC_OUT_EP, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); pdev->ep_out[MSC_OUT_EP & 0xFU].is_used = 1U; @@ -246,9 +241,7 @@ uint8_t USBD_MSC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) /* Open EP IN */ USBD_LL_OpenEP(pdev, MSC_IN_EP, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); pdev->ep_in[MSC_IN_EP & 0xFU].is_used = 1U; - } - else - { + } else { /* Open EP OUT */ USBD_LL_OpenEP(pdev, MSC_OUT_EP, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); pdev->ep_out[MSC_OUT_EP & 0xFU].is_used = 1U; @@ -272,7 +265,7 @@ uint8_t USBD_MSC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) * @retval status */ uint8_t USBD_MSC_DeInit(USBD_HandleTypeDef *pdev, - uint8_t cfgidx) + uint8_t cfgidx) { /* Close MSC EPs */ USBD_LL_CloseEP(pdev, MSC_OUT_EP); @@ -301,26 +294,21 @@ uint8_t USBD_MSC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) uint8_t ret = USBD_OK; uint16_t status_info = 0U; - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { + switch (req->bmRequest & USB_REQ_TYPE_MASK) { /* Class request */ case USB_REQ_TYPE_CLASS: switch (req->bRequest) { case BOT_GET_MAX_LUN: if ((req->wValue == 0U) && (req->wLength == 1U) && - ((req->bmRequest & 0x80U) == 0x80U)) - { + ((req->bmRequest & 0x80U) == 0x80U)) { if (msc_storage != NULL) { hmsc->max_lun = (uint32_t)msc_storage->GetMaxLun(); USBD_CtlSendData(pdev, (uint8_t *)(void *)&hmsc->max_lun, 1U); - } - else { + } else { ret = USBD_FAIL; } - } - else - { + } else { USBD_CtlError(pdev, req); ret = USBD_FAIL; } @@ -328,12 +316,9 @@ uint8_t USBD_MSC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) case BOT_RESET : if ((req->wValue == 0U) && (req->wLength == 0U) && - ((req->bmRequest & 0x80U) != 0x80U)) - { + ((req->bmRequest & 0x80U) != 0x80U)) { MSC_BOT_Reset(pdev); - } - else - { + } else { USBD_CtlError(pdev, req); ret = USBD_FAIL; } @@ -347,39 +332,29 @@ uint8_t USBD_MSC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) break; /* Interface & Endpoint request */ case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { + switch (req->bRequest) { case USB_REQ_GET_STATUS: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { + if (pdev->dev_state == USBD_STATE_CONFIGURED) { USBD_CtlSendData(pdev, (uint8_t *)(void *)&status_info, 2U); - } - else - { + } else { USBD_CtlError(pdev, req); ret = USBD_FAIL; } break; case USB_REQ_GET_INTERFACE: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { + if (pdev->dev_state == USBD_STATE_CONFIGURED) { USBD_CtlSendData(pdev, (uint8_t *)(void *)&hmsc->interface, 1U); - } - else - { + } else { USBD_CtlError(pdev, req); ret = USBD_FAIL; } break; case USB_REQ_SET_INTERFACE: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { + if (pdev->dev_state == USBD_STATE_CONFIGURED) { hmsc->interface = (uint8_t)(req->wValue); - } - else - { + } else { USBD_CtlError(pdev, req); ret = USBD_FAIL; } @@ -392,34 +367,25 @@ uint8_t USBD_MSC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) /* Reactivate the EP */ USBD_LL_CloseEP(pdev, (uint8_t)req->wIndex); - if ((((uint8_t)req->wIndex) & 0x80U) == 0x80U) - { + if ((((uint8_t)req->wIndex) & 0x80U) == 0x80U) { pdev->ep_in[(uint8_t)req->wIndex & 0xFU].is_used = 0U; - if (pdev->dev_speed == USBD_SPEED_HIGH) - { + if (pdev->dev_speed == USBD_SPEED_HIGH) { /* Open EP IN */ USBD_LL_OpenEP(pdev, MSC_IN_EP, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); - } - else - { + } else { /* Open EP IN */ USBD_LL_OpenEP(pdev, MSC_IN_EP, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); } pdev->ep_in[MSC_IN_EP & 0xFU].is_used = 1U; - } - else - { + } else { pdev->ep_out[(uint8_t)req->wIndex & 0xFU].is_used = 0U; - if (pdev->dev_speed == USBD_SPEED_HIGH) - { + if (pdev->dev_speed == USBD_SPEED_HIGH) { /* Open EP OUT */ USBD_LL_OpenEP(pdev, MSC_OUT_EP, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); - } - else - { + } else { /* Open EP OUT */ USBD_LL_OpenEP(pdev, MSC_OUT_EP, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); diff --git a/cores/arduino/stm32/usb/msc/usbd_msc.h b/cores/arduino/stm32/usb/msc/usbd_msc.h index 3c19a9a2ac..ee925e7be5 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc.h +++ b/cores/arduino/stm32/usb/msc/usbd_msc.h @@ -41,8 +41,7 @@ extern "C" { #define BOT_RESET 0xFF #define USB_MSC_CONFIG_DESC_SIZ 32 -typedef struct _USBD_STORAGE -{ +typedef struct _USBD_STORAGE { int8_t (* Init)(uint8_t lun); int8_t (* GetCapacity)(uint8_t lun, uint32_t *block_num, uint16_t *block_size); int8_t (* IsReady)(uint8_t lun); @@ -54,8 +53,7 @@ typedef struct _USBD_STORAGE } USBD_StorageTypeDef; -typedef struct -{ +typedef struct { uint32_t max_lun; uint32_t interface; uint8_t bot_state; diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_bot.c b/cores/arduino/stm32/usb/msc/usbd_msc_bot.c index f1a80a6b61..403d05425a 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_bot.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_bot.c @@ -109,11 +109,9 @@ void MSC_BOT_DataIn(USBD_HandleTypeDef *pdev, { USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; - switch (hmsc->bot_state) - { + switch (hmsc->bot_state) { case USBD_BOT_DATA_IN: - if (SCSI_ProcessCmd(pdev, hmsc->cbw.bLUN, &hmsc->cbw.CB[0]) < 0) - { + if (SCSI_ProcessCmd(pdev, hmsc->cbw.bLUN, &hmsc->cbw.CB[0]) < 0) { MSC_BOT_SendCSW(pdev, USBD_CSW_CMD_FAILED); } break; @@ -139,16 +137,14 @@ void MSC_BOT_DataOut(USBD_HandleTypeDef *pdev, { USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; - switch (hmsc->bot_state) - { + switch (hmsc->bot_state) { case USBD_BOT_IDLE: MSC_BOT_CBW_Decode(pdev); break; case USBD_BOT_DATA_OUT: - if (SCSI_ProcessCmd(pdev, hmsc->cbw.bLUN, &hmsc->cbw.CB[0]) < 0) - { + if (SCSI_ProcessCmd(pdev, hmsc->cbw.bLUN, &hmsc->cbw.CB[0]) < 0) { MSC_BOT_SendCSW(pdev, USBD_CSW_CMD_FAILED); } break; @@ -174,47 +170,32 @@ static void MSC_BOT_CBW_Decode(USBD_HandleTypeDef *pdev) if ((USBD_LL_GetRxDataSize(pdev, MSC_OUT_EP) != USBD_BOT_CBW_LENGTH) || (hmsc->cbw.dSignature != USBD_BOT_CBW_SIGNATURE) || (hmsc->cbw.bLUN > 1U) || - (hmsc->cbw.bCBLength < 1U) || (hmsc->cbw.bCBLength > 16U)) - { + (hmsc->cbw.bCBLength < 1U) || (hmsc->cbw.bCBLength > 16U)) { SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); hmsc->bot_status = USBD_BOT_STATUS_ERROR; MSC_BOT_Abort(pdev); - } - else - { - if (SCSI_ProcessCmd(pdev, hmsc->cbw.bLUN, &hmsc->cbw.CB[0]) < 0) - { - if (hmsc->bot_state == USBD_BOT_NO_DATA) - { + } 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 - { + } 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 > 0U) - { + (hmsc->bot_state != USBD_BOT_LAST_DATA_IN)) { + if (hmsc->bot_data_length > 0U) { MSC_BOT_SendData(pdev, hmsc->bot_data, hmsc->bot_data_length); - } - else if (hmsc->bot_data_length == 0U) - { + } else if (hmsc->bot_data_length == 0U) { MSC_BOT_SendCSW(pdev, USBD_CSW_CMD_PASSED); - } - else - { + } else { MSC_BOT_Abort(pdev); } - } - else - { + } else { return; } } @@ -279,15 +260,13 @@ static void MSC_BOT_Abort(USBD_HandleTypeDef *pdev) if ((hmsc->cbw.bmFlags == 0U) && (hmsc->cbw.dDataLength != 0U) && - (hmsc->bot_status == USBD_BOT_STATUS_NORMAL)) - { + (hmsc->bot_status == USBD_BOT_STATUS_NORMAL)) { USBD_LL_StallEP(pdev, MSC_OUT_EP); } USBD_LL_StallEP(pdev, MSC_IN_EP); - if (hmsc->bot_status == USBD_BOT_STATUS_ERROR) - { + if (hmsc->bot_status == USBD_BOT_STATUS_ERROR) { USBD_LL_PrepareReceive(pdev, MSC_OUT_EP, (uint8_t *)(void *)&hmsc->cbw, USBD_BOT_CBW_LENGTH); } @@ -305,17 +284,13 @@ void MSC_BOT_CplClrFeature(USBD_HandleTypeDef *pdev, uint8_t epnum) { USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; - if (hmsc->bot_status == USBD_BOT_STATUS_ERROR) /* Bad CBW Signature */ - { + if (hmsc->bot_status == USBD_BOT_STATUS_ERROR) { + /* Bad CBW Signature */ USBD_LL_StallEP(pdev, MSC_IN_EP); hmsc->bot_status = USBD_BOT_STATUS_NORMAL; - } - else if (((epnum & 0x80U) == 0x80U) && (hmsc->bot_status != USBD_BOT_STATUS_RECOVERY)) - { + } else if (((epnum & 0x80U) == 0x80U) && (hmsc->bot_status != USBD_BOT_STATUS_RECOVERY)) { MSC_BOT_SendCSW(pdev, USBD_CSW_CMD_FAILED); - } - else - { + } else { return; } } diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_bot.h b/cores/arduino/stm32/usb/msc/usbd_msc_bot.h index 9b2f109969..de1af53223 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_bot.h +++ b/cores/arduino/stm32/usb/msc/usbd_msc_bot.h @@ -57,8 +57,7 @@ extern "C" { #define USBD_BOTH_DIR 2U -typedef struct -{ +typedef struct { uint32_t dSignature; uint32_t dTag; uint32_t dDataLength; @@ -71,8 +70,7 @@ typedef struct USBD_MSC_BOT_CBWTypeDef; -typedef struct -{ +typedef struct { uint32_t dSignature; uint32_t dTag; uint32_t dDataResidue; diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_data.c b/cores/arduino/stm32/usb/msc/usbd_msc_data.c index 64556d91a7..7f960191a6 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_data.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_data.c @@ -33,8 +33,7 @@ EndBSPDependencies */ /* USB Mass storage Page 0 Inquiry Data */ -const uint8_t MSC_Page00_Inquiry_Data[] = -{ +const uint8_t MSC_Page00_Inquiry_Data[] = { 0x00, 0x00, 0x00, @@ -43,9 +42,9 @@ const uint8_t MSC_Page00_Inquiry_Data[] = 0x80, 0x83 }; + /* USB Mass storage sense 6 Data */ -const uint8_t MSC_Mode_Sense6_data[] = -{ +const uint8_t MSC_Mode_Sense6_data[] = { 0x00, 0x00, 0x00, @@ -55,9 +54,9 @@ const uint8_t MSC_Mode_Sense6_data[] = 0x00, 0x00 }; + /* USB Mass storage sense 10 Data */ -const uint8_t MSC_Mode_Sense10_data[] = -{ +const uint8_t MSC_Mode_Sense10_data[] = { 0x00, 0x06, 0x00, diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c index 1887134e79..4df0ee9e5c 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c @@ -64,8 +64,7 @@ static int8_t SCSI_ProcessWrite(USBD_HandleTypeDef *pdev, uint8_t lun); */ int8_t SCSI_ProcessCmd(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *cmd) { - switch (cmd[0]) - { + switch (cmd[0]) { case SCSI_TEST_UNIT_READY: SCSI_TestUnitReady(pdev, lun, cmd); break; @@ -134,15 +133,13 @@ static int8_t SCSI_TestUnitReady(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; /* case 9 : Hi > D0 */ - if (hmsc->cbw.dDataLength != 0U) - { + if (hmsc->cbw.dDataLength != 0U) { SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); return -1; } - if (msc_storage->IsReady(lun) != 0) - { + if (msc_storage->IsReady(lun) != 0) { SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); hmsc->bot_state = USBD_BOT_NO_DATA; @@ -166,30 +163,25 @@ static int8_t SCSI_Inquiry(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *par uint16_t len; USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; - if (params[1] & 0x01U)/*Evpd is set*/ - { + if (params[1] & 0x01U) { + /*Evpd is set*/ len = LENGTH_INQUIRY_PAGE00; hmsc->bot_data_length = len; - while (len) - { + while (len) { len--; hmsc->bot_data[len] = MSC_Page00_Inquiry_Data[len]; } - } - else - { + } else { pPage = (uint8_t *)(void *) & msc_storage->pInquiry[lun * STANDARD_INQUIRY_DATA_LEN]; len = (uint16_t)pPage[4] + 5U; - if (params[4] <= len) - { + if (params[4] <= len) { len = params[4]; } hmsc->bot_data_length = len; - while (len) - { + while (len) { len--; hmsc->bot_data[len] = pPage[len]; } @@ -209,13 +201,10 @@ static int8_t SCSI_ReadCapacity10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_ { USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; - if (msc_storage->GetCapacity(lun, &hmsc->scsi_blk_nbr, &hmsc->scsi_blk_size) != 0) - { + if (msc_storage->GetCapacity(lun, &hmsc->scsi_blk_nbr, &hmsc->scsi_blk_size) != 0) { SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); return -1; - } - else - { + } else { hmsc->bot_data[0] = (uint8_t)((hmsc->scsi_blk_nbr - 1U) >> 24); hmsc->bot_data[1] = (uint8_t)((hmsc->scsi_blk_nbr - 1U) >> 16); @@ -246,18 +235,14 @@ static int8_t SCSI_ReadFormatCapacity(USBD_HandleTypeDef *pdev, uint8_t lun, ui uint32_t blk_nbr; uint16_t i; - for (i = 0U; i < 12U ; i++) - { + for (i = 0U; i < 12U ; i++) { hmsc->bot_data[i] = 0U; } - if (msc_storage->GetCapacity(lun, &blk_nbr, &blk_size) != 0U) - { + if (msc_storage->GetCapacity(lun, &blk_nbr, &blk_size) != 0U) { SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); return -1; - } - else - { + } else { hmsc->bot_data[3] = 0x08U; hmsc->bot_data[4] = (uint8_t)((blk_nbr - 1U) >> 24); hmsc->bot_data[5] = (uint8_t)((blk_nbr - 1U) >> 16); @@ -286,8 +271,7 @@ static int8_t SCSI_ModeSense6(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *p uint16_t len = 8U; hmsc->bot_data_length = len; - while (len) - { + while (len) { len--; hmsc->bot_data[len] = MSC_Mode_Sense6_data[len]; } @@ -308,8 +292,7 @@ static int8_t SCSI_ModeSense10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t * hmsc->bot_data_length = len; - while (len) - { + while (len) { len--; hmsc->bot_data[len] = MSC_Mode_Sense10_data[len]; } @@ -330,31 +313,27 @@ static int8_t SCSI_RequestSense(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t uint8_t i; USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; - for (i = 0U ; i < REQUEST_SENSE_DATA_LEN; i++) - { + for (i = 0U ; i < REQUEST_SENSE_DATA_LEN; i++) { hmsc->bot_data[i] = 0U; } hmsc->bot_data[0] = 0x70U; hmsc->bot_data[7] = REQUEST_SENSE_DATA_LEN - 6U; - if ((hmsc->scsi_sense_head != hmsc->scsi_sense_tail)) - { + 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) - { + if (hmsc->scsi_sense_head == SENSE_LIST_DEEPTH) { hmsc->scsi_sense_head = 0U; } } hmsc->bot_data_length = REQUEST_SENSE_DATA_LEN; - if (params[4] <= REQUEST_SENSE_DATA_LEN) - { + if (params[4] <= REQUEST_SENSE_DATA_LEN) { hmsc->bot_data_length = params[4]; } return 0; @@ -376,8 +355,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_DEEPTH) { hmsc->scsi_sense_tail = 0U; } } @@ -406,8 +384,8 @@ static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params { USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; - if (hmsc->bot_state == USBD_BOT_IDLE) /* Idle */ - { + if (hmsc->bot_state == USBD_BOT_IDLE) { + /* Idle */ /* case 10 : Ho <> Di */ if ((hmsc->cbw.bmFlags & 0x80U) != 0x80U) { @@ -415,8 +393,7 @@ static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params return -1; } - if (msc_storage->IsReady(lun) != 0) - { + if (msc_storage->IsReady(lun) != 0) { SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); return -1; } @@ -429,16 +406,14 @@ static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params hmsc->scsi_blk_len = ((uint32_t)params[7] << 8) | (uint32_t)params[8]; if (SCSI_CheckAddressRange(pdev, lun, hmsc->scsi_blk_addr, - hmsc->scsi_blk_len) < 0) - { + hmsc->scsi_blk_len) < 0) { return -1; /* error */ } hmsc->bot_state = USBD_BOT_DATA_IN; /* cases 4,5 : Hi <> Dn */ - if (hmsc->cbw.dDataLength != (hmsc->scsi_blk_len * hmsc->scsi_blk_size)) - { + if (hmsc->cbw.dDataLength != (hmsc->scsi_blk_len * hmsc->scsi_blk_size)) { SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); return -1; } @@ -460,25 +435,22 @@ static int8_t SCSI_Write10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *para USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; uint32_t len; - if (hmsc->bot_state == USBD_BOT_IDLE) /* Idle */ - { + if (hmsc->bot_state == USBD_BOT_IDLE) { + /* Idle */ /* case 8 : Hi <> Do */ - if ((hmsc->cbw.bmFlags & 0x80U) == 0x80U) - { + if ((hmsc->cbw.bmFlags & 0x80U) == 0x80U) { SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); return -1; } /* Check whether Media is ready */ - if (msc_storage->IsReady(lun) != 0) - { + if (msc_storage->IsReady(lun) != 0) { SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); return -1; } /* Check If media is write-protected */ - if (msc_storage->IsWriteProtected(lun) != 0) - { + if (msc_storage->IsWriteProtected(lun) != 0) { SCSI_SenseCode(pdev, lun, NOT_READY, WRITE_PROTECTED); return -1; } @@ -493,16 +465,14 @@ static int8_t SCSI_Write10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *para /* check if LBA address is in the right range */ if (SCSI_CheckAddressRange(pdev, lun, hmsc->scsi_blk_addr, - hmsc->scsi_blk_len) < 0) - { + hmsc->scsi_blk_len) < 0) { return -1; /* error */ } len = hmsc->scsi_blk_len * hmsc->scsi_blk_size; /* cases 3,11,13 : Hn,Ho <> D0 */ - if (hmsc->cbw.dDataLength != len) - { + if (hmsc->cbw.dDataLength != len) { SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); return -1; } @@ -512,9 +482,8 @@ static int8_t SCSI_Write10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *para /* Prepare EP to receive first data packet */ hmsc->bot_state = USBD_BOT_DATA_OUT; USBD_LL_PrepareReceive(pdev, MSC_OUT_EP, hmsc->bot_data, len); - } - else /* Write Process ongoing */ - { + } else { + /* Write Process ongoing */ return SCSI_ProcessWrite(pdev, lun); } return 0; @@ -533,15 +502,13 @@ static int8_t SCSI_Verify10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *par { USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; - if ((params[1] & 0x02U) == 0x02U) - { + if ((params[1] & 0x02U) == 0x02U) { SCSI_SenseCode(pdev, lun, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); return -1; /* Error, Verify Mode Not supported*/ } if (SCSI_CheckAddressRange(pdev, lun, hmsc->scsi_blk_addr, - hmsc->scsi_blk_len) < 0) - { + hmsc->scsi_blk_len) < 0) { return -1; /* error */ } hmsc->bot_data_length = 0U; @@ -561,8 +528,7 @@ static int8_t SCSI_CheckAddressRange(USBD_HandleTypeDef *pdev, uint8_t lun, { USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; - if ((blk_offset + blk_nbr) > hmsc->scsi_blk_nbr) - { + if ((blk_offset + blk_nbr) > hmsc->scsi_blk_nbr) { SCSI_SenseCode(pdev, lun, ILLEGAL_REQUEST, ADDRESS_OUT_OF_RANGE); return -1; } @@ -585,8 +551,7 @@ static int8_t SCSI_ProcessRead(USBD_HandleTypeDef *pdev, uint8_t lun) if (msc_storage->Read(lun, hmsc->bot_data, hmsc->scsi_blk_addr, - (len / hmsc->scsi_blk_size)) < 0) - { + (len / hmsc->scsi_blk_size)) < 0) { SCSI_SenseCode(pdev, lun, HARDWARE_ERROR, UNRECOVERED_READ_ERROR); return -1; } @@ -599,8 +564,7 @@ static int8_t SCSI_ProcessRead(USBD_HandleTypeDef *pdev, uint8_t lun) /* case 6 : Hi = Di */ hmsc->csw.dDataResidue -= len; - if (hmsc->scsi_blk_len == 0U) - { + if (hmsc->scsi_blk_len == 0U) { hmsc->bot_state = USBD_BOT_LAST_DATA_IN; } return 0; @@ -622,8 +586,7 @@ static int8_t SCSI_ProcessWrite(USBD_HandleTypeDef *pdev, uint8_t lun) if (msc_storage->Write(lun, hmsc->bot_data, hmsc->scsi_blk_addr, - (len / hmsc->scsi_blk_size)) < 0) - { + (len / hmsc->scsi_blk_size)) < 0) { SCSI_SenseCode(pdev, lun, HARDWARE_ERROR, WRITE_FAULT); return -1; @@ -635,12 +598,9 @@ static int8_t SCSI_ProcessWrite(USBD_HandleTypeDef *pdev, uint8_t lun) /* case 12 : Ho = Do */ hmsc->csw.dDataResidue -= len; - if (hmsc->scsi_blk_len == 0U) - { + if (hmsc->scsi_blk_len == 0U) { MSC_BOT_SendCSW(pdev, USBD_CSW_CMD_PASSED); - } - else - { + } else { len = MIN((hmsc->scsi_blk_len * hmsc->scsi_blk_size), MSC_MEDIA_PACKET); /* Prepare EP to Receive next packet */ USBD_LL_PrepareReceive(pdev, MSC_OUT_EP, hmsc->bot_data, len); diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.h b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.h index 175b83578c..3c0d97ac6c 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.h +++ b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.h @@ -106,13 +106,10 @@ extern uint8_t ReadCapacity10_Data[]; extern uint8_t ReadFormatCapacity_Data []; -typedef struct _SENSE_ITEM -{ +typedef struct _SENSE_ITEM { char Skey; - union - { - struct _ASCs - { + union { + struct _ASCs { char ASC; char ASCQ; } b; diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.c b/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.c index 4a0c4a6902..a9f9752de8 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.c @@ -69,8 +69,7 @@ int8_t STORAGE_Inquirydata[] = /* 36 */ '0', '.', '0', '1', /* Version : 4 Bytes */ }; -USBD_StorageTypeDef USBD_MSC_fops = -{ +USBD_StorageTypeDef USBD_MSC_fops = { STORAGE_Init, STORAGE_GetCapacity, STORAGE_IsReady, @@ -113,11 +112,12 @@ int8_t STORAGE_GetCapacity(uint8_t lun, uint32_t *block_num, uint16_t *block_siz * Description : Handle the Read operation from the STORAGE card. * Input : None. * Output : None. -* Return : None. +* Return : 0 if device is ready, otherwise not ready *******************************************************************************/ int8_t STORAGE_IsReady(uint8_t lun) { - return (0); + // the dummy device is never ready + return 1; } /******************************************************************************* From ff6cecfb8078826fb6f8ed76c7120644b468424a Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Tue, 2 Jun 2020 21:27:25 +0100 Subject: [PATCH 12/37] fixed small type and more formatting --- cores/arduino/USB.cpp | 4 ++-- cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp | 10 ++++------ cores/arduino/stm32/usb/msc/usbd_msc.c | 6 ++---- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/cores/arduino/USB.cpp b/cores/arduino/USB.cpp index 3685543257..a7724b9ffd 100644 --- a/cores/arduino/USB.cpp +++ b/cores/arduino/USB.cpp @@ -34,7 +34,7 @@ void USB::begin() } } -void USB::register_msc(USBD_StorageTypeDef* fops) +void USB::register_msc(USBD_StorageTypeDef *fops) { USBD_MSC_RegisterStorage(&hUSBD_Device, fops); } @@ -70,7 +70,7 @@ void USB::initialize() #endif /* Start Device Process */ - USBD_Start(&hUSBD_Device_CDC); + USBD_Start(&hUSBD_Device); initialized = true; } diff --git a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp index 05ec62476d..64c557a37a 100644 --- a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp +++ b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp @@ -270,10 +270,9 @@ static uint8_t USBD_COMPOSITE_DeInit(USBD_HandleTypeDef *pdev, static uint8_t USBD_COMPOSITE_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - switch (req->bmRequest & USB_REQ_RECIPIENT_MASK) - { + switch (req->bmRequest & USB_REQ_RECIPIENT_MASK) { case USB_REQ_RECIPIENT_INTERFACE: - switch(req->wIndex) { + switch (req->wIndex) { case CDC_ACM_INTERFACE: case CDC_COM_INTERFACE: return USBD_CDC.Setup(pdev, req); @@ -397,10 +396,9 @@ static uint8_t USBD_COMPOSITE_SOF(USBD_HandleTypeDef *pdev) * @retval status */ static uint8_t USBD_COMPOSITE_DataOut(USBD_HandleTypeDef *pdev, - uint8_t epnum) + uint8_t epnum) { - switch (epnum) - { + switch (epnum) { case CDC_IN_EP: case CDC_CMD_EP: case CDC_OUT_EP: diff --git a/cores/arduino/stm32/usb/msc/usbd_msc.c b/cores/arduino/stm32/usb/msc/usbd_msc.c index b9d300078c..2de3df3428 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc.c @@ -202,8 +202,7 @@ __ALIGN_BEGIN uint8_t USBD_MSC_OtherSpeedCfgDesc[USB_MSC_CONFIG_DESC_SIZ] __AL }; /* USB Standard Device Descriptor */ -__ALIGN_BEGIN uint8_t USBD_MSC_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = -{ +__ALIGN_BEGIN uint8_t USBD_MSC_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = { USB_LEN_DEV_QUALIFIER_DESC, USB_DESC_TYPE_DEVICE_QUALIFIER, 0x00, @@ -297,8 +296,7 @@ uint8_t USBD_MSC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) switch (req->bmRequest & USB_REQ_TYPE_MASK) { /* Class request */ case USB_REQ_TYPE_CLASS: - switch (req->bRequest) - { + switch (req->bRequest) { case BOT_GET_MAX_LUN: if ((req->wValue == 0U) && (req->wLength == 1U) && ((req->bmRequest & 0x80U) == 0x80U)) { From da5c702a3f351f0ef18204222741aed0d529e003 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Tue, 2 Jun 2020 21:39:02 +0100 Subject: [PATCH 13/37] added ifdef for USB.c --- cores/arduino/USB.cpp | 6 +++++- cores/arduino/USB.h | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cores/arduino/USB.cpp b/cores/arduino/USB.cpp index a7724b9ffd..c5334f9902 100644 --- a/cores/arduino/USB.cpp +++ b/cores/arduino/USB.cpp @@ -16,6 +16,8 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#ifdef USBCON + #include "usbd_cdc.h" #include "usbd_cdc_msc.h" #include "usbd_msc.h" @@ -86,4 +88,6 @@ void USB::deinitialize() USBD_Stop(&hUSBD_Device); USBD_DeInit(&hUSBD_Device); initialized = false; -} \ No newline at end of file +} + +#endif // USBCON diff --git a/cores/arduino/USB.h b/cores/arduino/USB.h index 25572d07a2..a743dd4011 100644 --- a/cores/arduino/USB.h +++ b/cores/arduino/USB.h @@ -19,8 +19,8 @@ #ifndef _USB_H_ #define _USB_H_ -#if defined (USBCON) -#include "Stream.h" +#ifdef USBCON + #include "usbd_core.h" #include "usbd_msc.h" From ffd635d4103fe48c53d918d7018acceda38012d5 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Tue, 2 Jun 2020 23:11:35 +0100 Subject: [PATCH 14/37] fixed bug in ST MSC SCSI library --- cores/arduino/stm32/usb/msc/usbd_msc_scsi.c | 24 ++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c index 4df0ee9e5c..eb79d9dcbf 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c @@ -66,50 +66,50 @@ int8_t SCSI_ProcessCmd(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *cmd) { switch (cmd[0]) { case SCSI_TEST_UNIT_READY: - SCSI_TestUnitReady(pdev, lun, cmd); + return SCSI_TestUnitReady(pdev, lun, cmd); break; case SCSI_REQUEST_SENSE: - SCSI_RequestSense(pdev, lun, cmd); + return SCSI_RequestSense(pdev, lun, cmd); break; case SCSI_INQUIRY: - SCSI_Inquiry(pdev, lun, cmd); + return SCSI_Inquiry(pdev, lun, cmd); break; case SCSI_START_STOP_UNIT: - SCSI_StartStopUnit(pdev, lun, cmd); + return SCSI_StartStopUnit(pdev, lun, cmd); break; case SCSI_ALLOW_MEDIUM_REMOVAL: - SCSI_StartStopUnit(pdev, lun, cmd); + return SCSI_StartStopUnit(pdev, lun, cmd); break; case SCSI_MODE_SENSE6: - SCSI_ModeSense6(pdev, lun, cmd); + return SCSI_ModeSense6(pdev, lun, cmd); break; case SCSI_MODE_SENSE10: - SCSI_ModeSense10(pdev, lun, cmd); + return SCSI_ModeSense10(pdev, lun, cmd); break; case SCSI_READ_FORMAT_CAPACITIES: - SCSI_ReadFormatCapacity(pdev, lun, cmd); + return SCSI_ReadFormatCapacity(pdev, lun, cmd); break; case SCSI_READ_CAPACITY10: - SCSI_ReadCapacity10(pdev, lun, cmd); + return SCSI_ReadCapacity10(pdev, lun, cmd); break; case SCSI_READ10: - SCSI_Read10(pdev, lun, cmd); + return SCSI_Read10(pdev, lun, cmd); break; case SCSI_WRITE10: - SCSI_Write10(pdev, lun, cmd); + return SCSI_Write10(pdev, lun, cmd); break; case SCSI_VERIFY10: - SCSI_Verify10(pdev, lun, cmd); + return SCSI_Verify10(pdev, lun, cmd); break; default: From 7676e07c74bc415a03e608a0c8d761608c2a78b5 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Tue, 2 Jun 2020 23:25:26 +0100 Subject: [PATCH 15/37] fixed formatting --- cores/arduino/stm32/usb/msc/usbd_msc_scsi.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c index eb79d9dcbf..a1ca379344 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c @@ -387,8 +387,7 @@ static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params if (hmsc->bot_state == USBD_BOT_IDLE) { /* Idle */ /* case 10 : Ho <> Di */ - if ((hmsc->cbw.bmFlags & 0x80U) != 0x80U) - { + if ((hmsc->cbw.bmFlags & 0x80U) != 0x80U) { SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); return -1; } From 376112515416466cc41927a14d00deae804510c5 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Wed, 3 Jun 2020 13:28:02 +0100 Subject: [PATCH 16/37] introduced usb msc abstract class --- cores/arduino/USB.cpp | 38 +++++++++-- cores/arduino/USB.h | 15 ++++- cores/arduino/USBMscHandler.h | 66 +++++++++++++++++++ cores/arduino/stm32/usb/msc/usbd_msc.h | 2 +- cores/arduino/stm32/usb/msc/usbd_msc_scsi.c | 2 +- ...c_storage_if.c => usbd_msc_storage_if.cpp} | 43 +++++++----- .../stm32/usb/msc/usbd_msc_storage_if.h | 7 ++ cores/arduino/stm32/usb/usbd_ep_conf.h | 24 +------ cores/arduino/stm32/usb/usbd_if.c | 7 -- cores/arduino/stm32/usb/usbd_if.h | 4 +- 10 files changed, 152 insertions(+), 56 deletions(-) create mode 100644 cores/arduino/USBMscHandler.h rename cores/arduino/stm32/usb/msc/{usbd_msc_storage_if.c => usbd_msc_storage_if.cpp} (87%) diff --git a/cores/arduino/USB.cpp b/cores/arduino/USB.cpp index c5334f9902..b1b703160e 100644 --- a/cores/arduino/USB.cpp +++ b/cores/arduino/USB.cpp @@ -36,15 +36,32 @@ void USB::begin() } } -void USB::register_msc(USBD_StorageTypeDef *fops) +#ifdef USBD_USE_MSC_CLASS +DummyUSBMscHandler dummyHandler; + +void USB::registerMscHandler(USBMscHandler &handler) { - USBD_MSC_RegisterStorage(&hUSBD_Device, fops); + pSingleMscHandler= &handler; + registerMscHandlers(1, &pSingleMscHandler, USBD_MSC_fops.pInquiry); +} + +void USB::registerMscHandlers(uint8_t count, USBMscHandler **ppHandlers, uint8_t *pInquiryData) +{ + if (count == 0) { + registerMscHandler(dummyHandler); + } else { + ppUsbMscHandlers = ppHandlers; + usbMscMaxLun = count - 1; + USBD_MSC_fops.pInquiry = pInquiryData; + } } +#endif void USB::initialize() { hUSBD_Device_CDC = &hUSBD_Device; + /* Init Device Library */ if (USBD_Init(&hUSBD_Device, &USBD_Desc, 0) != USBD_OK) { return; @@ -55,18 +72,27 @@ void USB::initialize() if (USBD_RegisterClass(&hUSBD_Device, &USBD_CDC) != USBD_OK) { return; } - if (USBD_CDC_RegisterInterface(&hUSBD_Device, &USBD_CDC_fops) != USBD_OK) { +#elif USBD_USE_CDC_MSC + if (USBD_RegisterClass(&hUSBD_Device, &USBD_CDC_MSC) != USBD_OK) { return; } -#elif USBD_USE_CDC_MSC +#elif USBD_USE_MSC if (USBD_RegisterClass(&hUSBD_Device, &USBD_CDC_MSC) != USBD_OK) { return; } +#endif + +#ifdef USBD_USE_CDC_CLASS if (USBD_CDC_RegisterInterface(&hUSBD_Device, &USBD_CDC_fops) != USBD_OK) { return; } -#elif USBD_USE_MSC - if (USBD_RegisterClass(&hUSBD_Device, &USBD_CDC_MSC) != USBD_OK) { +#endif + +#ifdef USBD_USE_MSC_CLASS + if (ppUsbMscHandlers == nullptr) { + registerMscHandler(dummyHandler); + } + if (USBD_MSC_RegisterStorage(&hUSBD_Device, &USBD_MSC_fops) != USBD_OK) { return; } #endif diff --git a/cores/arduino/USB.h b/cores/arduino/USB.h index a743dd4011..a5e17aa35a 100644 --- a/cores/arduino/USB.h +++ b/cores/arduino/USB.h @@ -22,11 +22,18 @@ #ifdef USBCON #include "usbd_core.h" -#include "usbd_msc.h" +#include "usbd_ep_conf.h" + +#ifdef USBD_USE_MSC_CLASS +#include "USBMscHandler.h" +#endif class USB { public: - void register_msc(USBD_StorageTypeDef *fops); +#ifdef USBD_USE_MSC_CLASS + void registerMscHandler(USBMscHandler &pHandler); + void registerMscHandlers(uint8_t count, USBMscHandler **pHandlers, uint8_t *pInquiryData); +#endif void begin(void); @@ -39,6 +46,10 @@ class USB { bool initialized; USBD_HandleTypeDef hUSBD_Device; + +#ifdef USBD_USE_MSC_CLASS + USBMscHandler *pSingleMscHandler; +#endif }; extern USB USBDevice; diff --git a/cores/arduino/USBMscHandler.h b/cores/arduino/USBMscHandler.h new file mode 100644 index 0000000000..fe48329449 --- /dev/null +++ b/cores/arduino/USBMscHandler.h @@ -0,0 +1,66 @@ +/* + Copyright (c) 2015 Arduino LLC. All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + +#ifndef _USB_MSC_HANDLER_H_ +#define _USB_MSC_HANDLER_H_ + +#ifdef USBCON + +#include "usbd_core.h" +#include "usbd_msc.h" + +/* Handler for mass storage devices */ +class USBMscHandler { + public: + // Example: A 128 MB SD card has 245760 blocks, at a block size of 512 bytes + // Returns true if successful, otherwise false. + virtual bool GetCapacity(uint32_t * blockNum, uint16_t * blockSize) = 0; + + // Read [blk_len] blocks, starting at [blk_addr] into [buf]. + // Returns true if successful, otherwise false. + virtual bool Read(uint8_t * pBuf, uint32_t blkAddr, uint16_t blkLen) = 0; + + // Write [blk_len] blocks, starting at [blk_addr] into [buf]. + // Returns true if successful, otherwise false. + virtual bool Write(uint8_t * pBuf, uint32_t blkAddr, uint16_t blkLen) = 0; + + /** Optional functions **/ + + virtual bool Init() { return true; } + + // Return false if the mass storage device has not been connected or initialized yet. + virtual bool IsReady() { return true; } + + // If the device should be read-only then this function should return true. + virtual bool IsWriteProtected() { return false; } +}; + +class DummyUSBMscHandler : public USBMscHandler { + public: + // Any call to one of these functions always fails. + bool GetCapacity(uint32_t *pBlockNum, uint16_t *pBlockSize) { return false; } + bool Read(uint8_t *pBuf, uint32_t blockAddr, uint16_t blkLen) { return false; } + bool Write(uint8_t *pBuf, uint32_t blockAddr, uint16_t blkLen) { return false; } + + // The dummy handler is never ready. + bool IsReady() { return false; } +}; + +#endif +#endif \ No newline at end of file diff --git a/cores/arduino/stm32/usb/msc/usbd_msc.h b/cores/arduino/stm32/usb/msc/usbd_msc.h index ee925e7be5..861abd5bec 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc.h +++ b/cores/arduino/stm32/usb/msc/usbd_msc.h @@ -49,7 +49,7 @@ typedef struct _USBD_STORAGE { int8_t (* Read)(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); int8_t (* Write)(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); int8_t (* GetMaxLun)(void); - int8_t *pInquiry; + uint8_t *pInquiry; } USBD_StorageTypeDef; diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c index a1ca379344..589355c365 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c @@ -173,7 +173,7 @@ static int8_t SCSI_Inquiry(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *par hmsc->bot_data[len] = MSC_Page00_Inquiry_Data[len]; } } else { - pPage = (uint8_t *)(void *) & msc_storage->pInquiry[lun * STANDARD_INQUIRY_DATA_LEN]; + pPage = &msc_storage->pInquiry[lun * STANDARD_INQUIRY_DATA_LEN]; len = (uint16_t)pPage[4] + 5U; if (params[4] <= len) { diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.c b/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.cpp similarity index 87% rename from cores/arduino/stm32/usb/msc/usbd_msc_storage_if.c rename to cores/arduino/stm32/usb/msc/usbd_msc_storage_if.cpp index a9f9752de8..b6d80a52c1 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.cpp @@ -28,11 +28,11 @@ - "stm32xxxxx_{eval}{discovery}{adafruit}_sd.c" EndBSPDependencies */ +#include "USBMscHandler.h" #include "usbd_msc_storage_if.h" -#define STORAGE_LUN_NBR 1U -#define STORAGE_BLK_NBR 0x10000U -#define STORAGE_BLK_SIZ 0x200U +uint8_t usbMscMaxLun = 0; +USBMscHandler **ppUsbMscHandlers = nullptr; int8_t STORAGE_Init(uint8_t lun); @@ -52,7 +52,7 @@ int8_t STORAGE_Write(uint8_t lun, uint8_t *buf, uint32_t blk_addr, int8_t STORAGE_GetMaxLun(void); /* USB Mass storage Standard Inquiry Data */ -int8_t STORAGE_Inquirydata[] = /* 36 */ +uint8_t STORAGE_Inquirydata[] = /* 36 */ { /* LUN 0 */ 0x00, @@ -78,9 +78,13 @@ USBD_StorageTypeDef USBD_MSC_fops = { STORAGE_Write, STORAGE_GetMaxLun, STORAGE_Inquirydata, - }; +#define HANDLER_LUN_CHECK \ + if (lun > usbMscMaxLun) { \ + return 1; \ + } + /******************************************************************************* * Function Name : Read_Memory * Description : Handle the Read operation from the microSD card. @@ -90,7 +94,9 @@ USBD_StorageTypeDef USBD_MSC_fops = { *******************************************************************************/ int8_t STORAGE_Init(uint8_t lun) { - return (0); + HANDLER_LUN_CHECK + + return !ppUsbMscHandlers[lun]->Init(); } /******************************************************************************* @@ -102,9 +108,9 @@ int8_t STORAGE_Init(uint8_t lun) *******************************************************************************/ int8_t STORAGE_GetCapacity(uint8_t lun, uint32_t *block_num, uint16_t *block_size) { - *block_num = STORAGE_BLK_NBR; - *block_size = STORAGE_BLK_SIZ; - return (0); + HANDLER_LUN_CHECK + + return !ppUsbMscHandlers[lun]->GetCapacity(block_num, block_size); } /******************************************************************************* @@ -116,8 +122,9 @@ int8_t STORAGE_GetCapacity(uint8_t lun, uint32_t *block_num, uint16_t *block_siz *******************************************************************************/ int8_t STORAGE_IsReady(uint8_t lun) { - // the dummy device is never ready - return 1; + HANDLER_LUN_CHECK + + return !ppUsbMscHandlers[lun]->IsReady(); } /******************************************************************************* @@ -129,7 +136,9 @@ int8_t STORAGE_IsReady(uint8_t lun) *******************************************************************************/ int8_t STORAGE_IsWriteProtected(uint8_t lun) { - return 0; + HANDLER_LUN_CHECK + + return !ppUsbMscHandlers[lun]->IsWriteProtected(); } /******************************************************************************* @@ -142,7 +151,9 @@ int8_t STORAGE_IsWriteProtected(uint8_t lun) int8_t STORAGE_Read(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) { - return 0; + HANDLER_LUN_CHECK + + return !ppUsbMscHandlers[lun]->Read(buf, blk_addr, blk_len); } /******************************************************************************* @@ -155,7 +166,9 @@ int8_t STORAGE_Read(uint8_t lun, uint8_t *buf, int8_t STORAGE_Write(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) { - return (0); + HANDLER_LUN_CHECK + + return !ppUsbMscHandlers[lun]->Write(buf, blk_addr, blk_len); } /******************************************************************************* @@ -167,7 +180,7 @@ int8_t STORAGE_Write(uint8_t lun, uint8_t *buf, *******************************************************************************/ int8_t STORAGE_GetMaxLun(void) { - return (STORAGE_LUN_NBR - 1); + return usbMscMaxLun; } #endif /* USBD_USE_MSC_CLASS */ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.h b/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.h index 676b250195..cddadecda0 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.h +++ b/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.h @@ -29,6 +29,13 @@ extern "C" { extern USBD_StorageTypeDef USBD_MSC_fops; +#ifdef __cplusplus +#include "USBMscHandler.h" + +extern uint8_t usbMscMaxLun; +extern USBMscHandler **ppUsbMscHandlers; +#endif + #ifdef __cplusplus } #endif diff --git a/cores/arduino/stm32/usb/usbd_ep_conf.h b/cores/arduino/stm32/usb/usbd_ep_conf.h index 6d8003ef2f..18f46cc58f 100644 --- a/cores/arduino/stm32/usb/usbd_ep_conf.h +++ b/cores/arduino/stm32/usb/usbd_ep_conf.h @@ -33,6 +33,7 @@ typedef struct { #endif } ep_desc_t; +// *INDENT-OFF* /* CDC Endpoints Configurations */ #ifdef USBD_USE_CDC @@ -90,29 +91,10 @@ typedef struct { /* Size in words, byte size divided by 2 */ #define PMA_EP0_OUT_ADDR (8 * DEV_NUM_EP) #define PMA_EP0_IN_ADDR (PMA_EP0_OUT_ADDR + USB_MAX_EP0_SIZE) - - #ifdef USBD_USE_CDC - #define PMA_CDC_OUT_BASE (PMA_EP0_IN_ADDR + USB_MAX_EP0_SIZE) - #define PMA_CDC_OUT_ADDR ((PMA_CDC_OUT_BASE + USB_FS_MAX_PACKET_SIZE) | \ - (PMA_CDC_OUT_BASE << 16U)) - #define PMA_CDC_IN_ADDR (PMA_CDC_OUT_BASE + USB_FS_MAX_PACKET_SIZE * 2) - #define PMA_CDC_CMD_ADDR (PMA_CDC_IN_ADDR + CDC_CMD_PACKET_SIZE) - #endif /* USBD_USE_CDC */ - #ifdef USBD_USE_CDC_MSC - #define PMA_CDC_OUT_ADDR0 (PMA_EP0_IN_ADDR + USB_MAX_EP0_SIZE) - #define PMA_CDC_OUT_ADDR1 (PMA_CDC_OUT_ADDR1 + USB_FS_MAX_PACKET_SIZE) - #define PMA_CDC_OUT_ADDR (PMA_CDC_OUT_ADDR0 | (PMA_CDC_OUT_ADDR1 << 16U)) // cdc out has a double buffer - #define PMA_CDC_IN_ADDR (PMA_CDC_OUT_ADDR1 + USB_FS_MAX_PACKET_SIZE) - #define PMA_CDC_CMD_ADDR (PMA_CDC_IN_ADDR + USB_FS_MAX_PACKET_SIZE) - #define PMA_MSC_IN_ADDR (PMA_CDC_CMD_ADDR + CDC_CMD_PACKET_SIZE) - #define PMA_MSC_IN_ADDR (PMA_MSC_IN_ADDR + USB_FS_MAX_PACKET_SIZE) - #endif /* USBD_USE_CDC_MSC */ - #ifdef USBD_USE_HID_COMPOSITE - #define PMA_MOUSE_IN_ADDR (PMA_EP0_IN_ADDR + HID_MOUSE_EPIN_SIZE) - #define PMA_KEYBOARD_IN_ADDR (PMA_MOUSE_IN_ADDR + HID_KEYBOARD_EPIN_SIZE) - #endif /* USBD_USE_HID_COMPOSITE */ #endif /* USB */ +// *INDENT-ON* + extern const ep_desc_t ep_def[DEV_NUM_EP + 1]; diff --git a/cores/arduino/stm32/usb/usbd_if.c b/cores/arduino/stm32/usb/usbd_if.c index e579140f72..0ea854909e 100644 --- a/cores/arduino/stm32/usb/usbd_if.c +++ b/cores/arduino/stm32/usb/usbd_if.c @@ -155,11 +155,4 @@ WEAK void USBD_reenumerate(void) #else /* !defined(USBD_REENUM_DISABLED) */ WEAK void USBD_reenumerate(void) { } #endif - -#ifdef USBD_USE_CDC -void USBD_CDC_init(void) -{ - CDC_init(); -} -#endif /* USBD_USE_CDC */ #endif /* USBCON */ diff --git a/cores/arduino/stm32/usb/usbd_if.h b/cores/arduino/stm32/usb/usbd_if.h index dc026240fe..bcd54020e6 100644 --- a/cores/arduino/stm32/usb/usbd_if.h +++ b/cores/arduino/stm32/usb/usbd_if.h @@ -24,9 +24,7 @@ extern "C" { #endif void USBD_reenumerate(void); -#ifdef USBD_USE_CDC -void USBD_CDC_init(void); -#endif + #ifdef __cplusplus } #endif From 6f00830eb8979808692a187abe30685edefdac21 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Wed, 3 Jun 2020 13:42:22 +0100 Subject: [PATCH 17/37] changes to formatting --- cores/arduino/USBMscHandler.h | 39 ++++++++++++++++++++------ cores/arduino/stm32/usb/usbd_ep_conf.c | 6 +++- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/cores/arduino/USBMscHandler.h b/cores/arduino/USBMscHandler.h index fe48329449..f349fd5705 100644 --- a/cores/arduino/USBMscHandler.h +++ b/cores/arduino/USBMscHandler.h @@ -20,7 +20,7 @@ #ifndef _USB_MSC_HANDLER_H_ #define _USB_MSC_HANDLER_H_ -#ifdef USBCON +#if defined(USBCON) && defined(USBD_USE_MSC_CLASS) #include "usbd_core.h" #include "usbd_msc.h" @@ -42,24 +42,47 @@ class USBMscHandler { /** Optional functions **/ - virtual bool Init() { return true; } + virtual bool Init() + { + return true; + } // Return false if the mass storage device has not been connected or initialized yet. - virtual bool IsReady() { return true; } + virtual bool IsReady() + { + return true; + } // If the device should be read-only then this function should return true. - virtual bool IsWriteProtected() { return false; } + virtual bool IsWriteProtected() + { + return false; + } }; class DummyUSBMscHandler : public USBMscHandler { public: // Any call to one of these functions always fails. - bool GetCapacity(uint32_t *pBlockNum, uint16_t *pBlockSize) { return false; } - bool Read(uint8_t *pBuf, uint32_t blockAddr, uint16_t blkLen) { return false; } - bool Write(uint8_t *pBuf, uint32_t blockAddr, uint16_t blkLen) { return false; } + bool GetCapacity(uint32_t *pBlockNum, uint16_t *pBlockSize) + { + return false; + } + + bool Read(uint8_t *pBuf, uint32_t blockAddr, uint16_t blkLen) + { + return false; + } + + bool Write(uint8_t *pBuf, uint32_t blockAddr, uint16_t blkLen) + { + return false; + } // The dummy handler is never ready. - bool IsReady() { return false; } + bool IsReady() + { + return false; + } }; #endif diff --git a/cores/arduino/stm32/usb/usbd_ep_conf.c b/cores/arduino/stm32/usb/usbd_ep_conf.c index 91ea4a657c..74f4eb44c6 100644 --- a/cores/arduino/stm32/usb/usbd_ep_conf.c +++ b/cores/arduino/stm32/usb/usbd_ep_conf.c @@ -25,6 +25,8 @@ #define EP_DESC(ADDR, SIZE, KIND_TYP) {ADDR, SIZE, KIND_TYP} #endif +// *INDENT-OFF* + #ifdef USBD_USE_CDC #ifdef USE_USB_HS #define CDC_DATA_MAX_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE @@ -71,7 +73,7 @@ #else /* USE_USB_FS */ #define HID_MAX_PACKET_SIZE USB_FS_MAX_PACKET_SIZE #endif - + const ep_desc_t ep_def[] = { EP_DESC(0x00, HID_MAX_PACKET_SIZE, PCD_SNG_BUF), EP_DESC(0x80, HID_MAX_PACKET_SIZE, PCD_SNG_BUF), @@ -80,6 +82,8 @@ }; #endif /* USBD_USE_HID_COMPOSITE */ +// *INDENT-OFF* + #endif /* HAL_PCD_MODULE_ENABLED && USBCON */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ From f578d6c63378701060e369eec031e6f2aff788e9 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Wed, 3 Jun 2020 13:47:59 +0100 Subject: [PATCH 18/37] more formatting changes --- cores/arduino/USBMscHandler.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cores/arduino/USBMscHandler.h b/cores/arduino/USBMscHandler.h index f349fd5705..9f8afea1e1 100644 --- a/cores/arduino/USBMscHandler.h +++ b/cores/arduino/USBMscHandler.h @@ -30,15 +30,15 @@ class USBMscHandler { public: // Example: A 128 MB SD card has 245760 blocks, at a block size of 512 bytes // Returns true if successful, otherwise false. - virtual bool GetCapacity(uint32_t * blockNum, uint16_t * blockSize) = 0; + virtual bool GetCapacity(uint32_t *pBlockNum, uint16_t *pBlockSize) = 0; // Read [blk_len] blocks, starting at [blk_addr] into [buf]. // Returns true if successful, otherwise false. - virtual bool Read(uint8_t * pBuf, uint32_t blkAddr, uint16_t blkLen) = 0; + virtual bool Read(uint8_t *pBuf, uint32_t blkAddr, uint16_t blkLen) = 0; // Write [blk_len] blocks, starting at [blk_addr] into [buf]. // Returns true if successful, otherwise false. - virtual bool Write(uint8_t * pBuf, uint32_t blkAddr, uint16_t blkLen) = 0; + virtual bool Write(uint8_t *pBuf, uint32_t blkAddr, uint16_t blkLen) = 0; /** Optional functions **/ From 805113ddde1cbd74fbcb0e662db3cd9a17254521 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Wed, 3 Jun 2020 13:50:44 +0100 Subject: [PATCH 19/37] and more formatting changes --- cores/arduino/USB.cpp | 2 +- cores/arduino/USB.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cores/arduino/USB.cpp b/cores/arduino/USB.cpp index b1b703160e..fa5fd0e272 100644 --- a/cores/arduino/USB.cpp +++ b/cores/arduino/USB.cpp @@ -41,7 +41,7 @@ DummyUSBMscHandler dummyHandler; void USB::registerMscHandler(USBMscHandler &handler) { - pSingleMscHandler= &handler; + pSingleMscHandler = &handler; registerMscHandlers(1, &pSingleMscHandler, USBD_MSC_fops.pInquiry); } diff --git a/cores/arduino/USB.h b/cores/arduino/USB.h index a5e17aa35a..1c06240d27 100644 --- a/cores/arduino/USB.h +++ b/cores/arduino/USB.h @@ -25,7 +25,7 @@ #include "usbd_ep_conf.h" #ifdef USBD_USE_MSC_CLASS -#include "USBMscHandler.h" + #include "USBMscHandler.h" #endif class USB { From 5df8d9cbfd7d8122a75463938cba6555d12d45c8 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Wed, 3 Jun 2020 15:23:14 +0100 Subject: [PATCH 20/37] small bugfixes --- cores/arduino/USB.cpp | 16 +++++++++++----- libraries/SrcWrapper/src/stm32/hw_config.c | 4 ---- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/cores/arduino/USB.cpp b/cores/arduino/USB.cpp index fa5fd0e272..8f16e1e9ea 100644 --- a/cores/arduino/USB.cpp +++ b/cores/arduino/USB.cpp @@ -18,15 +18,21 @@ #ifdef USBCON -#include "usbd_cdc.h" -#include "usbd_cdc_msc.h" -#include "usbd_msc.h" -#include "usbd_msc_storage_if.h" -#include "usbd_cdc_if.h" #include "usbd_desc.h" #include "USB.h" #include "wiring.h" +#ifdef USBD_USE_CDC_CLASS + #include "usbd_cdc.h" + #include "usbd_cdc_msc.h" + #include "usbd_cdc_if.h" +#endif + +#ifdef USBD_USE_MSC_CLASS + #include "usbd_msc.h" + #include "usbd_msc_storage_if.h" +#endif + USB USBDevice; void USB::begin() diff --git a/libraries/SrcWrapper/src/stm32/hw_config.c b/libraries/SrcWrapper/src/stm32/hw_config.c index 3434d6da96..ee23f0ee36 100644 --- a/libraries/SrcWrapper/src/stm32/hw_config.c +++ b/libraries/SrcWrapper/src/stm32/hw_config.c @@ -62,10 +62,6 @@ void hw_config_init(void) /* Configure the system clock */ SystemClock_Config(); -#if defined (USBCON) && defined(USBD_USE_CDC) - USBD_CDC_init(); -#endif - #if defined (STM32MP1xx) __HAL_RCC_HSEM_CLK_ENABLE(); #endif From 5b3e972cf8c70dacf54469dbca4481a9115c5487 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Wed, 3 Jun 2020 18:47:11 +0100 Subject: [PATCH 21/37] added back early usb initialisation and fixed write protection bug in new interface --- cores/arduino/stm32/usb/msc/usbd_msc_storage_if.cpp | 2 +- .../SrcWrapper/src/stm32/{hw_config.c => hw_config.cpp} | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) rename libraries/SrcWrapper/src/stm32/{hw_config.c => hw_config.cpp} (95%) diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.cpp b/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.cpp index b6d80a52c1..a614bfe288 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.cpp +++ b/cores/arduino/stm32/usb/msc/usbd_msc_storage_if.cpp @@ -138,7 +138,7 @@ int8_t STORAGE_IsWriteProtected(uint8_t lun) { HANDLER_LUN_CHECK - return !ppUsbMscHandlers[lun]->IsWriteProtected(); + return ppUsbMscHandlers[lun]->IsWriteProtected(); } /******************************************************************************* diff --git a/libraries/SrcWrapper/src/stm32/hw_config.c b/libraries/SrcWrapper/src/stm32/hw_config.cpp similarity index 95% rename from libraries/SrcWrapper/src/stm32/hw_config.c rename to libraries/SrcWrapper/src/stm32/hw_config.cpp index ee23f0ee36..6bec1f76f0 100644 --- a/libraries/SrcWrapper/src/stm32/hw_config.c +++ b/libraries/SrcWrapper/src/stm32/hw_config.cpp @@ -37,7 +37,8 @@ */ #include "stm32_def.h" #include "hw_config.h" -#include "usbd_if.h" +#include "usbd_ep_conf.h" +#include "USBSerial.h" #include "dwt.h" #ifdef __cplusplus @@ -62,6 +63,10 @@ void hw_config_init(void) /* Configure the system clock */ SystemClock_Config(); +#if defined (USBCON) && defined(USBD_USE_CDC_CLASS) + SerialUSB.begin(); +#endif + #if defined (STM32MP1xx) __HAL_RCC_HSEM_CLK_ENABLE(); #endif From 77d673b67dca14338b23c8df470e426776b42494 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Wed, 3 Jun 2020 19:19:04 +0100 Subject: [PATCH 22/37] fixed hs/fs/other speed interface descriptors for cdc msc --- .../stm32/usb/cdc_msc/usbd_cdc_msc.cpp | 300 +++++++++++++++++- 1 file changed, 291 insertions(+), 9 deletions(-) diff --git a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp index 64c557a37a..d73427e7e0 100644 --- a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp +++ b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp @@ -52,7 +52,11 @@ static uint8_t USBD_COMPOSITE_DeInit(USBD_HandleTypeDef *pdev, static uint8_t USBD_COMPOSITE_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static uint8_t *USBD_COMPOSITE_GetCfgDesc(uint16_t *length); +static uint8_t *USBD_COMPOSITE_GetHSCfgDesc(uint16_t *length); + +static uint8_t *USBD_COMPOSITE_GetFSCfgDesc(uint16_t *length); + +static uint8_t *USBD_COMPOSITE_GetOtherSpeedCfgDesc(uint16_t *length); static uint8_t *USBD_COMPOSITE_GetDeviceQualifierDesc(uint16_t *length); @@ -75,18 +79,144 @@ USBD_ClassTypeDef USBD_CDC_MSC = { USBD_COMPOSITE_SOF, nullptr, nullptr, - USBD_COMPOSITE_GetCfgDesc, - USBD_COMPOSITE_GetCfgDesc, - USBD_COMPOSITE_GetCfgDesc, + USBD_COMPOSITE_GetHSCfgDesc, + USBD_COMPOSITE_GetFSCfgDesc, + USBD_COMPOSITE_GetOtherSpeedCfgDesc, USBD_COMPOSITE_GetDeviceQualifierDesc, }; +#if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 +#endif +/* USB COMPOSITE device Configuration Descriptor */ +static uint8_t USBD_COMPOSITE_HSCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { + 0x09, /* bLength: Configuation Descriptor size */ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ + USB_CDC_MSC_CONFIG_DESC_SIZ, + /* wTotalLength: Bytes returned */ + 0x00, + 0x03, /*bNumInterfaces: 3 interface*/ + 0x01, /*bConfigurationValue: Configuration value*/ + 0x02, /*iConfiguration: Index of string descriptor describing the configuration*/ + 0xC0, /*bmAttributes: bus powered and Supports Remote Wakeup */ + 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ + /* 09 */ + + /*---------------------------------------------------------------------------*/ + + /*Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + 0x00, /* iInterface: */ + + /*Header Functional Descriptor*/ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /*Call Management Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + 0x01, /* bDataInterface: 1 */ + + /*ACM Functional Descriptor*/ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /*Union Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + 0x00, /* bMasterInterface: Communication class interface */ + 0x01, /* bSlaveInterface0: Data Class Interface */ + + /*Endpoint 2 Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), + CDC_HS_BINTERVAL, /* bInterval: */ + /*---------------------------------------------------------------------------*/ + + /*Data class interface descriptor*/ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + 0x01, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /*Endpoint OUT Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), + 0x00, /* bInterval: ignore for Bulk transfer */ + + /*Endpoint IN Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), + 0x00, + + + /******************** Mass Storage interface ********************/ + 0x09, /* bLength: Interface Descriptor size */ + 0x04, /* bDescriptorType: */ + 0x02, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints */ + 0x08, /* bInterfaceClass: MSC Class */ + 0x06, /* bInterfaceSubClass : SCSI transparent */ + 0x50, /* nInterfaceProtocol */ + 0x05, /* iInterface: */ + + /******************** Mass Storage Endpoints ********************/ + 0x07, /* Endpoint descriptor length = 7 */ + 0x05, /* Endpoint descriptor type */ + MSC_IN_EP, /* Endpoint address (IN, address 1) */ + 0x02, /* Bulk endpoint type */ + LOBYTE(MSC_MAX_HS_PACKET), + HIBYTE(MSC_MAX_HS_PACKET), + 0x00, /* Polling interval in milliseconds */ + + 0x07, /* Endpoint descriptor length = 7 */ + 0x05, /* Endpoint descriptor type */ + MSC_OUT_EP, /* Endpoint address (OUT, address 1) */ + 0x02, /* Bulk endpoint type */ + LOBYTE(MSC_MAX_HS_PACKET), + HIBYTE(MSC_MAX_HS_PACKET), + 0x00 /* Polling interval in milliseconds */ +}; #if defined ( __ICCARM__ ) /*!< IAR Compiler */ #pragma data_alignment=4 #endif /* USB COMPOSITE device Configuration Descriptor */ -static uint8_t USBD_COMPOSITE_CfgFSDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { +static uint8_t USBD_COMPOSITE_FSCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { 0x09, /* bLength: Configuation Descriptor size */ USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ USB_CDC_MSC_CONFIG_DESC_SIZ, @@ -209,6 +339,134 @@ static uint8_t USBD_COMPOSITE_CfgFSDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { 0x00 /* Polling interval in milliseconds */ }; +#if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 +#endif +/* USB COMPOSITE device Configuration Descriptor */ +static uint8_t USBD_COMPOSITE_OtherSpeedCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { + 0x09, /* bLength: Configuation Descriptor size */ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ + USB_CDC_MSC_CONFIG_DESC_SIZ, + /* wTotalLength: Bytes returned */ + 0x00, + 0x03, /*bNumInterfaces: 3 interface*/ + 0x01, /*bConfigurationValue: Configuration value*/ + 0x02, /*iConfiguration: Index of string descriptor describing the configuration*/ + 0xC0, /*bmAttributes: bus powered and Supports Remote Wakeup */ + 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ + /* 09 */ + + /*---------------------------------------------------------------------------*/ + + /*Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + 0x00, /* iInterface: */ + + /*Header Functional Descriptor*/ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /*Call Management Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + 0x01, /* bDataInterface: 1 */ + + /*ACM Functional Descriptor*/ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /*Union Functional Descriptor*/ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + 0x00, /* bMasterInterface: Communication class interface */ + 0x01, /* bSlaveInterface0: Data Class Interface */ + + /*Endpoint 2 Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), + CDC_FS_BINTERVAL, /* bInterval: */ + /*---------------------------------------------------------------------------*/ + + /*Data class interface descriptor*/ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + 0x01, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /*Endpoint OUT Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), + 0x00, /* bInterval: ignore for Bulk transfer */ + + /*Endpoint IN Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), + 0x00, + + + /******************** Mass Storage interface ********************/ + 0x09, /* bLength: Interface Descriptor size */ + 0x04, /* bDescriptorType: */ + 0x02, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints */ + 0x08, /* bInterfaceClass: MSC Class */ + 0x06, /* bInterfaceSubClass : SCSI transparent */ + 0x50, /* nInterfaceProtocol */ + 0x05, /* iInterface: */ + + /******************** Mass Storage Endpoints ********************/ + 0x07, /* Endpoint descriptor length = 7 */ + 0x05, /* Endpoint descriptor type */ + MSC_IN_EP, /* Endpoint address (IN, address 1) */ + 0x02, /* Bulk endpoint type */ + LOBYTE(MSC_MAX_FS_PACKET), + HIBYTE(MSC_MAX_FS_PACKET), + 0x00, /* Polling interval in milliseconds */ + + 0x07, /* Endpoint descriptor length = 7 */ + 0x05, /* Endpoint descriptor type */ + MSC_OUT_EP, /* Endpoint address (OUT, address 1) */ + 0x02, /* Bulk endpoint type */ + LOBYTE(MSC_MAX_FS_PACKET), + HIBYTE(MSC_MAX_FS_PACKET), + 0x00 /* Polling interval in milliseconds */ +}; + + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ #pragma data_alignment=4 #endif @@ -314,15 +572,39 @@ static uint8_t USBD_COMPOSITE_Setup(USBD_HandleTypeDef *pdev, /** - * @brief USBD_COMPOSITE_GetCfgDesc + * @brief USBD_COMPOSITE_GetHSCfgDesc + * return configuration descriptor + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t *USBD_COMPOSITE_GetHSCfgDesc(uint16_t *length) +{ + *length = sizeof(USBD_COMPOSITE_HSCfgDesc); + return USBD_COMPOSITE_HSCfgDesc; +} + +/** + * @brief USBD_COMPOSITE_GetFSCfgDesc + * return configuration descriptor + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t *USBD_COMPOSITE_GetFSCfgDesc(uint16_t *length) +{ + *length = sizeof(USBD_COMPOSITE_FSCfgDesc); + return USBD_COMPOSITE_FSCfgDesc; +} + +/** + * @brief USBD_COMPOSITE_GetOtherSpeedCfgDesc * return configuration descriptor * @param length : pointer data length * @retval pointer to descriptor buffer */ -static uint8_t *USBD_COMPOSITE_GetCfgDesc(uint16_t *length) +static uint8_t *USBD_COMPOSITE_GetOtherSpeedCfgDesc(uint16_t *length) { - *length = sizeof(USBD_COMPOSITE_CfgFSDesc); - return USBD_COMPOSITE_CfgFSDesc; + *length = sizeof(USBD_COMPOSITE_OtherSpeedCfgDesc); + return USBD_COMPOSITE_OtherSpeedCfgDesc; } /** From 3f3783ece7ddefaa3b22536ece065b6b45db1fcd Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Wed, 3 Jun 2020 19:41:43 +0100 Subject: [PATCH 23/37] small changes to ep conf --- cores/arduino/stm32/usb/usbd_conf.c | 2 +- cores/arduino/stm32/usb/usbd_ep_conf.h | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cores/arduino/stm32/usb/usbd_conf.c b/cores/arduino/stm32/usb/usbd_conf.c index 0bc8b9cc16..3094d3a331 100644 --- a/cores/arduino/stm32/usb/usbd_conf.c +++ b/cores/arduino/stm32/usb/usbd_conf.c @@ -519,7 +519,7 @@ USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev) } } #else - uint32_t offset = 0; + uint32_t offset = PMA_BASE_OFFSET; for (uint32_t i = 0; i < (DEV_NUM_EP + 1); i++) { ep_desc_t *pDesc = &ep_dep[i]; uint32_t size = pDesc->ep_size; diff --git a/cores/arduino/stm32/usb/usbd_ep_conf.h b/cores/arduino/stm32/usb/usbd_ep_conf.h index 18f46cc58f..1243aa73ae 100644 --- a/cores/arduino/stm32/usb/usbd_ep_conf.h +++ b/cores/arduino/stm32/usb/usbd_ep_conf.h @@ -89,8 +89,7 @@ typedef struct { /* Require DEV_NUM_EP to be defined */ #if defined (USB) /* Size in words, byte size divided by 2 */ - #define PMA_EP0_OUT_ADDR (8 * DEV_NUM_EP) - #define PMA_EP0_IN_ADDR (PMA_EP0_OUT_ADDR + USB_MAX_EP0_SIZE) + #define PMA_BASE_OFFSET (8 * DEV_NUM_EP) #endif /* USB */ // *INDENT-ON* From 3c4d73d776379522fa9d0020d4ef05db9a1ebdd1 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Thu, 4 Jun 2020 09:09:06 +0100 Subject: [PATCH 24/37] fixed bug where usb device library relies on pdev->pClassData to determine if deinitialisation should happen --- cores/arduino/stm32/usb/cdc/usbd_cdc.c | 25 +++++++++---------- .../stm32/usb/cdc_msc/usbd_cdc_msc.cpp | 8 ++++++ cores/arduino/stm32/usb/msc/usbd_msc.c | 9 +++++++ 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc.c b/cores/arduino/stm32/usb/cdc/usbd_cdc.c index 7ce101ae03..5826d32e48 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc.c +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc.c @@ -421,7 +421,7 @@ USBD_CDC_HandleTypeDef *cdc_handle = &cdc_handle_dat; USBD_CDC_ItfTypeDef *cdc_itf = NULL; /* TODO */ - +int cdcInitialized; /** * @} @@ -444,14 +444,7 @@ static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) USBD_CDC_HandleTypeDef *hcdc = cdc_handle; - hcdc = USBD_malloc(sizeof(USBD_CDC_HandleTypeDef)); - - if (hcdc == NULL) { - pdev->pClassData = NULL; - return (uint8_t)USBD_EMEM; - } - - pdev->pClassData = (void *)hcdc; + pdev->pClassData = &cdcInitialized; if (pdev->dev_speed == USBD_SPEED_HIGH) { /* Open EP IN */ @@ -534,9 +527,15 @@ static uint8_t USBD_CDC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) pdev->ep_in[CDC_CMD_EP & 0xFU].is_used = 0U; pdev->ep_in[CDC_CMD_EP & 0xFU].bInterval = 0U; - /* DeInit physical Interface components */ - /* TODO remove user data reference */ - cdc_itf->DeInit(); + if (pdev->pClassData) { + /* DeInit physical Interface components */ + cdc_itf->DeInit(); + } + + if (pdev->pClassData == &cdcInitialized) { + // only mark as uninitialised if we own the initialisation + pdev->pClassData = NULL; + } return ret; } @@ -682,7 +681,7 @@ static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev) { USBD_CDC_HandleTypeDef *hcdc = cdc_handle; - if ((pdev->pUserData != NULL) && (hcdc->CmdOpCode != 0xFFU)) { + if (hcdc->CmdOpCode != 0xFFU) { cdc_itf->Control(hcdc->CmdOpCode, (uint8_t *)(void *)hcdc->data, (uint16_t)hcdc->CmdLength); diff --git a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp index d73427e7e0..20e743aa45 100644 --- a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp +++ b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp @@ -484,6 +484,8 @@ static uint8_t USBD_COMPOSITE_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] = 0x00, }; +int cdcMscInitialised; + /** * @brief USBD_COMPOSITE_Init * Initialize the COMPOSITE interface @@ -498,6 +500,8 @@ static uint8_t USBD_COMPOSITE_Init(USBD_HandleTypeDef *pdev, USBD_CDC.Init(pdev, cfgidx); + pdev->pClassData = &cdcMscInitialised; + return (uint8_t)USBD_OK; } @@ -515,6 +519,10 @@ static uint8_t USBD_COMPOSITE_DeInit(USBD_HandleTypeDef *pdev, USBD_CDC.DeInit(pdev, cfgidx); + if (pdev->pClassData == &cdcMscInitialised) { + pdev->pClassData = nullptr; + } + return USBD_OK; } diff --git a/cores/arduino/stm32/usb/msc/usbd_msc.c b/cores/arduino/stm32/usb/msc/usbd_msc.c index 2de3df3428..64b51c2b7f 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc.c @@ -223,6 +223,8 @@ USBD_MSC_BOT_HandleTypeDef *msc_handle = &msc_handle_dat; USBD_StorageTypeDef *msc_storage = &USBD_MSC_fops; +int mscInitialized; + /** * @brief USBD_MSC_Init * Initialize the mass storage configuration @@ -232,6 +234,8 @@ USBD_StorageTypeDef *msc_storage = &USBD_MSC_fops; */ uint8_t USBD_MSC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) { + pdev->pClassData = &mscInitialized; + if (pdev->dev_speed == USBD_SPEED_HIGH) { /* Open EP OUT */ USBD_LL_OpenEP(pdev, MSC_OUT_EP, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); @@ -277,6 +281,11 @@ uint8_t USBD_MSC_DeInit(USBD_HandleTypeDef *pdev, /* De-Init the BOT layer */ MSC_BOT_DeInit(pdev); + if (pdev->pClassData == &mscInitialized) { + // only mark as uninitialised if we own the initialisation + pdev->pClassData = NULL; + } + return USBD_OK; } From f0e3993f4c1814cad5be25ad77f02937c9901cdb Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Thu, 4 Jun 2020 12:39:26 +0100 Subject: [PATCH 25/37] update msc and cdc classes --- cores/arduino/stm32/usb/cdc/usbd_cdc.c | 203 ++++---- cores/arduino/stm32/usb/cdc/usbd_cdc.h | 16 +- cores/arduino/stm32/usb/cdc/usbd_cdc_if.c | 2 +- cores/arduino/stm32/usb/msc/usbd_msc.c | 150 +++--- cores/arduino/stm32/usb/msc/usbd_msc.h | 4 +- cores/arduino/stm32/usb/msc/usbd_msc_bot.c | 82 +-- cores/arduino/stm32/usb/msc/usbd_msc_data.c | 64 ++- cores/arduino/stm32/usb/msc/usbd_msc_data.h | 16 +- cores/arduino/stm32/usb/msc/usbd_msc_scsi.c | 540 ++++++++++++++++---- cores/arduino/stm32/usb/msc/usbd_msc_scsi.h | 20 +- cores/arduino/stm32/usb/usbd_ep_conf.c | 19 +- cores/arduino/stm32/usb/usbd_ep_conf.h | 16 +- 12 files changed, 758 insertions(+), 374 deletions(-) diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc.c b/cores/arduino/stm32/usb/cdc/usbd_cdc.c index 5826d32e48..e8d6e982d7 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc.c +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc.c @@ -64,6 +64,7 @@ * @{ */ + /** @defgroup USBD_CDC * @brief usbd core module * @{ @@ -76,6 +77,7 @@ * @} */ + /** @defgroup USBD_CDC_Private_Defines * @{ */ @@ -83,6 +85,7 @@ * @} */ + /** @defgroup USBD_CDC_Private_Macros * @{ */ @@ -91,36 +94,23 @@ * @} */ + /** @defgroup USBD_CDC_Private_FunctionPrototypes * @{ */ -static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, - uint8_t cfgidx); - -static uint8_t USBD_CDC_DeInit(USBD_HandleTypeDef *pdev, - uint8_t cfgidx); - -static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, - USBD_SetupReqTypedef *req); - -static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, - uint8_t epnum); - -static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, - uint8_t epnum); - -static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev); +static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +static uint8_t USBD_CDC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); +static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); +static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev); -static uint8_t *USBD_CDC_GetFSCfgDesc(uint16_t *length); - -static uint8_t *USBD_CDC_GetHSCfgDesc(uint16_t *length); - -static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length); - -static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length); - -uint8_t *USBD_CDC_GetDeviceQualifierDescriptor(uint16_t *length); +static uint8_t *USBD_CDC_GetFSCfgDesc(uint16_t *length); +static uint8_t *USBD_CDC_GetHSCfgDesc(uint16_t *length); +static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length); +static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length); +uint8_t *USBD_CDC_GetDeviceQualifierDescriptor(uint16_t *length); /* USB Standard Device Descriptor */ __ALIGN_BEGIN static uint8_t USBD_CDC_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = { @@ -438,7 +428,7 @@ int cdcInitialized; * @param cfgidx: Configuration index * @retval status */ -static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) { UNUSED(cfgidx); @@ -451,31 +441,31 @@ static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) (void)USBD_LL_OpenEP(pdev, CDC_IN_EP, USBD_EP_TYPE_BULK, CDC_DATA_HS_IN_PACKET_SIZE); - pdev->ep_in[CDC_IN_EP & 0xFU].is_used = 1U; + pdev->ep_in[CDC_IN_EP & 0xFU].is_used = 1U; - /* Open EP OUT */ - (void)USBD_LL_OpenEP(pdev, CDC_OUT_EP, USBD_EP_TYPE_BULK, - CDC_DATA_HS_OUT_PACKET_SIZE); + /* Open EP OUT */ + (void)USBD_LL_OpenEP(pdev, CDC_OUT_EP, USBD_EP_TYPE_BULK, + CDC_DATA_HS_OUT_PACKET_SIZE); - pdev->ep_out[CDC_OUT_EP & 0xFU].is_used = 1U; + pdev->ep_out[CDC_OUT_EP & 0xFU].is_used = 1U; - /* Set bInterval for CDC CMD Endpoint */ - pdev->ep_in[CDC_CMD_EP & 0xFU].bInterval = CDC_HS_BINTERVAL; + /* Set bInterval for CDC CMD Endpoint */ + pdev->ep_in[CDC_CMD_EP & 0xFU].bInterval = CDC_HS_BINTERVAL; } else { /* Open EP IN */ (void)USBD_LL_OpenEP(pdev, CDC_IN_EP, USBD_EP_TYPE_BULK, CDC_DATA_FS_IN_PACKET_SIZE); - pdev->ep_in[CDC_IN_EP & 0xFU].is_used = 1U; + pdev->ep_in[CDC_IN_EP & 0xFU].is_used = 1U; - /* Open EP OUT */ - (void)USBD_LL_OpenEP(pdev, CDC_OUT_EP, USBD_EP_TYPE_BULK, - CDC_DATA_FS_OUT_PACKET_SIZE); + /* Open EP OUT */ + (void)USBD_LL_OpenEP(pdev, CDC_OUT_EP, USBD_EP_TYPE_BULK, + CDC_DATA_FS_OUT_PACKET_SIZE); - pdev->ep_out[CDC_OUT_EP & 0xFU].is_used = 1U; + pdev->ep_out[CDC_OUT_EP & 0xFU].is_used = 1U; - /* Set bInterval for CMD Endpoint */ - pdev->ep_in[CDC_CMD_EP & 0xFU].bInterval = CDC_FS_BINTERVAL; + /* Set bInterval for CMD Endpoint */ + pdev->ep_in[CDC_CMD_EP & 0xFU].bInterval = CDC_FS_BINTERVAL; } /* Open Command IN EP */ @@ -491,15 +481,15 @@ static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) if (pdev->dev_speed == USBD_SPEED_HIGH) { /* Prepare Out endpoint to receive next packet */ - USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer, - CDC_DATA_HS_OUT_PACKET_SIZE); + (void)USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer, + CDC_DATA_HS_OUT_PACKET_SIZE); } else { /* Prepare Out endpoint to receive next packet */ - USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer, - CDC_DATA_FS_OUT_PACKET_SIZE); + (void)USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer, + CDC_DATA_FS_OUT_PACKET_SIZE); } - return ret; + return (uint8_t)USBD_OK; } /** @@ -509,7 +499,7 @@ static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) * @param cfgidx: Configuration index * @retval status */ -static uint8_t USBD_CDC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +static uint8_t USBD_CDC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) { UNUSED(cfgidx); uint8_t ret = 0U; @@ -527,7 +517,8 @@ static uint8_t USBD_CDC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) pdev->ep_in[CDC_CMD_EP & 0xFU].is_used = 0U; pdev->ep_in[CDC_CMD_EP & 0xFU].bInterval = 0U; - if (pdev->pClassData) { + /* DeInit physical Interface components */ + if (pdev->pClassData != NULL) { /* DeInit physical Interface components */ cdc_itf->DeInit(); } @@ -547,8 +538,8 @@ static uint8_t USBD_CDC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) * @param req: usb requests * @retval status */ -static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, - USBD_SetupReqTypedef *req) +static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, + USBD_SetupReqTypedef *req) { USBD_CDC_HandleTypeDef *hcdc = cdc_handle; uint8_t ifalt = 0U; @@ -556,11 +547,11 @@ static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, USBD_StatusTypeDef ret = USBD_OK; switch (req->bmRequest & USB_REQ_TYPE_MASK) { - case USB_REQ_TYPE_CLASS : - if (req->wLength) { - if (req->bmRequest & 0x80U) { + case USB_REQ_TYPE_CLASS: + if (req->wLength != 0U) { + if ((req->bmRequest & 0x80U) != 0U) { cdc_itf->Control(req->bRequest, - (uint8_t *)(void *)hcdc->data, + (uint8_t *)hcdc->data, req->wLength); (void)USBD_CtlSendData(pdev, (uint8_t *)hcdc->data, req->wLength); @@ -572,7 +563,7 @@ static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, } } else { cdc_itf->Control(req->bRequest, - (uint8_t *)(void *)req, 0U); + (uint8_t *)req, 0U); } break; @@ -589,7 +580,7 @@ static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, case USB_REQ_GET_INTERFACE: if (pdev->dev_state == USBD_STATE_CONFIGURED) { - (void)USBD_CtlSendData(pdev, &ifalt, 1U); + (void)USBD_CtlSendData(pdev, &ifalt, 1U); } else { USBD_CtlError(pdev, req); ret = USBD_FAIL; @@ -629,25 +620,29 @@ static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, * @param epnum: endpoint number * @retval status */ -static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) +static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) { USBD_CDC_HandleTypeDef *hcdc = cdc_handle; PCD_HandleTypeDef *hpcd = pdev->pData; USBD_CDC_ItfTypeDef *ctrl = cdc_itf; - if ((pdev->ep_in[epnum].total_length > 0U) && ((pdev->ep_in[epnum].total_length % hpcd->IN_ep[epnum].maxpacket) == 0U)) { + if (pdev->pClassData == NULL) { + return (uint8_t)USBD_FAIL; + } + + if ((pdev->ep_in[epnum].total_length > 0U) && + ((pdev->ep_in[epnum].total_length % hpcd->IN_ep[epnum].maxpacket) == 0U)) { /* Update the packet total length */ pdev->ep_in[epnum].total_length = 0U; /* Send ZLP */ - USBD_LL_Transmit(pdev, epnum, NULL, 0U); + (void)USBD_LL_Transmit(pdev, epnum, NULL, 0U); } else { hcdc->TxState = 0U; - if (ctrl->Transferred) { - ctrl->Transferred(); - } + ctrl->TransmitCplt(hcdc->TxBuffer, &hcdc->TxLength, epnum); } - return USBD_OK; + + return (uint8_t)USBD_OK; } /** @@ -657,18 +652,22 @@ static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) * @param epnum: endpoint number * @retval status */ -static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) +static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) { USBD_CDC_HandleTypeDef *hcdc = cdc_handle; + if (pdev->pClassData == NULL) { + return (uint8_t)USBD_FAIL; + } /* Get the received data length */ hcdc->RxLength = USBD_LL_GetRxDataSize(pdev, epnum); /* USB data will be immediately processed, this allow next USB traffic being NAKed till the end of the application Xfer */ + cdc_itf->Receive(hcdc->RxBuffer, &hcdc->RxLength); - return USBD_OK; + return (uint8_t)USBD_OK; } /** @@ -677,15 +676,16 @@ static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) * @param pdev: device instance * @retval status */ -static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev) +static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev) { USBD_CDC_HandleTypeDef *hcdc = cdc_handle; - if (hcdc->CmdOpCode != 0xFFU) { + if ((pdev->pUserData != NULL) && (hcdc->CmdOpCode != 0xFFU)) { cdc_itf->Control(hcdc->CmdOpCode, - (uint8_t *)(void *)hcdc->data, + (uint8_t *)hcdc->data, (uint16_t)hcdc->CmdLength); hcdc->CmdOpCode = 0xFFU; + } return (uint8_t)USBD_OK; @@ -698,7 +698,7 @@ static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev) * @param length : pointer data length * @retval pointer to descriptor buffer */ -static uint8_t *USBD_CDC_GetFSCfgDesc(uint16_t *length) +static uint8_t *USBD_CDC_GetFSCfgDesc(uint16_t *length) { *length = (uint16_t)sizeof(USBD_CDC_CfgFSDesc); @@ -712,7 +712,7 @@ static uint8_t *USBD_CDC_GetFSCfgDesc(uint16_t *length) * @param length : pointer data length * @retval pointer to descriptor buffer */ -static uint8_t *USBD_CDC_GetHSCfgDesc(uint16_t *length) +static uint8_t *USBD_CDC_GetHSCfgDesc(uint16_t *length) { *length = (uint16_t)sizeof(USBD_CDC_CfgHSDesc); @@ -726,7 +726,7 @@ static uint8_t *USBD_CDC_GetHSCfgDesc(uint16_t *length) * @param length : pointer data length * @retval pointer to descriptor buffer */ -static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length) +static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length) { *length = (uint16_t)sizeof(USBD_CDC_OtherSpeedCfgDesc); @@ -739,7 +739,7 @@ static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length) * @param length : pointer data length * @retval pointer to descriptor buffer */ -uint8_t *USBD_CDC_GetDeviceQualifierDescriptor(uint16_t *length) +uint8_t *USBD_CDC_GetDeviceQualifierDescriptor(uint16_t *length) { *length = (uint16_t)sizeof(USBD_CDC_DeviceQualifierDesc); @@ -752,17 +752,14 @@ uint8_t *USBD_CDC_GetDeviceQualifierDescriptor(uint16_t *length) * @param fops: CD Interface callback * @retval status */ -uint8_t USBD_CDC_RegisterInterface(USBD_HandleTypeDef *pdev, - USBD_CDC_ItfTypeDef *fops) +uint8_t USBD_CDC_RegisterInterface(USBD_HandleTypeDef *pdev, + USBD_CDC_ItfTypeDef *fops) { - uint8_t ret = USBD_FAIL; - - if (fops != NULL) { - cdc_itf = fops; - ret = USBD_OK; + if (fops == NULL) { + return (uint8_t)USBD_FAIL; } - pdev->pUserData = fops; + cdc_itf = fops; return (uint8_t)USBD_OK; } @@ -773,8 +770,8 @@ uint8_t USBD_CDC_RegisterInterface(USBD_HandleTypeDef *pdev, * @param pbuff: Tx Buffer * @retval status */ -uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, - uint8_t *pbuff, uint32_t length) +uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, + uint8_t *pbuff, uint32_t length) { USBD_CDC_HandleTypeDef *hcdc = cdc_handle; @@ -791,7 +788,7 @@ uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, * @param pbuff: Rx Buffer * @retval status */ -uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff) +uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff) { USBD_CDC_HandleTypeDef *hcdc = cdc_handle; @@ -806,9 +803,14 @@ uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff) * @param pdev: device instance * @retval status */ -uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev) +uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev) { USBD_CDC_HandleTypeDef *hcdc = cdc_handle; + USBD_StatusTypeDef ret = USBD_BUSY; + + if (pdev->pClassData == NULL) { + return (uint8_t)USBD_FAIL; + } if (hcdc->TxState == 0U) { /* Tx Transfer in progress */ @@ -818,12 +820,9 @@ uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev) pdev->ep_in[CDC_IN_EP & 0xFU].total_length = hcdc->TxLength; /* Transmit next packet */ - USBD_LL_Transmit(pdev, CDC_IN_EP, hcdc->TxBuffer, - (uint16_t)hcdc->TxLength); + (void)USBD_LL_Transmit(pdev, CDC_IN_EP, hcdc->TxBuffer, hcdc->TxLength); - return USBD_OK; - } else { - return USBD_BUSY; + ret = USBD_OK; } return (uint8_t)ret; @@ -836,33 +835,25 @@ uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev) +uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev) { USBD_CDC_HandleTypeDef *hcdc = cdc_handle; - /* Suspend or Resume USB Out process */ + if (pdev->pClassData == NULL) { + return (uint8_t)USBD_FAIL; + } + if (pdev->dev_speed == USBD_SPEED_HIGH) { /* Prepare Out endpoint to receive next packet */ - USBD_LL_PrepareReceive(pdev, - CDC_OUT_EP, - hcdc->RxBuffer, - CDC_DATA_HS_OUT_PACKET_SIZE); + (void)USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer, + CDC_DATA_HS_OUT_PACKET_SIZE); } else { /* Prepare Out endpoint to receive next packet */ - USBD_LL_PrepareReceive(pdev, - CDC_OUT_EP, - hcdc->RxBuffer, - CDC_DATA_FS_OUT_PACKET_SIZE); + (void)USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer, + CDC_DATA_FS_OUT_PACKET_SIZE); } - return USBD_OK; -} -uint8_t USBD_CDC_ClearBuffer(USBD_HandleTypeDef *pdev) -{ - /* Suspend or Resume USB Out process */ - /* Prepare Out endpoint to receive next packet */ - USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, 0, 0); - return USBD_OK; + return (uint8_t)USBD_OK; } #endif /* USBD_USE_CDC_CLASS */ diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc.h b/cores/arduino/stm32/usb/cdc/usbd_cdc.h index 1c12bbbffb..0f4dfd89af 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc.h +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc.h @@ -38,6 +38,7 @@ extern "C" { * @{ */ + /** @defgroup usbd_cdc_Exported_Defines * @{ */ @@ -140,16 +141,15 @@ extern USBD_CDC_ItfTypeDef *cdc_itf; /** @defgroup USB_CORE_Exported_Functions * @{ */ -uint8_t USBD_CDC_RegisterInterface(USBD_HandleTypeDef *pdev, - USBD_CDC_ItfTypeDef *fops); +uint8_t USBD_CDC_RegisterInterface(USBD_HandleTypeDef *pdev, + USBD_CDC_ItfTypeDef *fops); -uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff, - uint32_t length); +uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff, + uint32_t length); -uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff); -uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev); -uint8_t USBD_CDC_ClearBuffer(USBD_HandleTypeDef *pdev); -uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev); +uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff); +uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev); +uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev); /** * @} */ diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc_if.c b/cores/arduino/stm32/usb/cdc/usbd_cdc_if.c index 6b731641b4..c55ece32f7 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc_if.c +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc_if.c @@ -242,7 +242,7 @@ static int8_t USBD_CDC_Receive(uint8_t *Buf, uint32_t *Len) /** - * @brief USBD_CDC_TransmitCplt + * @brief TEMPLATE_TransmitCplt * Data transmited callback * * @note diff --git a/cores/arduino/stm32/usb/msc/usbd_msc.c b/cores/arduino/stm32/usb/msc/usbd_msc.c index 64b51c2b7f..742d747c30 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc.c @@ -47,16 +47,16 @@ EndBSPDependencies */ #include "usbd_msc_storage_if.h" -uint8_t USBD_MSC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -uint8_t USBD_MSC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -uint8_t USBD_MSC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -uint8_t USBD_MSC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); -uint8_t USBD_MSC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); +uint8_t USBD_MSC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +uint8_t USBD_MSC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +uint8_t USBD_MSC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +uint8_t USBD_MSC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); +uint8_t USBD_MSC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); -uint8_t *USBD_MSC_GetHSCfgDesc(uint16_t *length); -uint8_t *USBD_MSC_GetFSCfgDesc(uint16_t *length); -uint8_t *USBD_MSC_GetOtherSpeedCfgDesc(uint16_t *length); -uint8_t *USBD_MSC_GetDeviceQualifierDescriptor(uint16_t *length); +uint8_t *USBD_MSC_GetHSCfgDesc(uint16_t *length); +uint8_t *USBD_MSC_GetFSCfgDesc(uint16_t *length); +uint8_t *USBD_MSC_GetOtherSpeedCfgDesc(uint16_t *length); +uint8_t *USBD_MSC_GetDeviceQualifierDescriptor(uint16_t *length); USBD_ClassTypeDef USBD_MSC = { @@ -78,7 +78,7 @@ USBD_ClassTypeDef USBD_MSC = { /* USB Mass storage device Configuration Descriptor */ /* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ -__ALIGN_BEGIN uint8_t USBD_MSC_CfgHSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = { +__ALIGN_BEGIN static uint8_t USBD_MSC_CfgHSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = { 0x09, /* bLength: Configuation Descriptor size */ USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ @@ -104,7 +104,7 @@ __ALIGN_BEGIN uint8_t USBD_MSC_CfgHSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = /******************** Mass Storage Endpoints ********************/ 0x07, /*Endpoint descriptor length = 7*/ 0x05, /*Endpoint descriptor type */ - MSC_IN_EP, /*Endpoint address (IN, address 1) */ + MSC_EPIN_ADDR, /*Endpoint address (IN, address 1) */ 0x02, /*Bulk endpoint type */ LOBYTE(MSC_MAX_HS_PACKET), HIBYTE(MSC_MAX_HS_PACKET), @@ -112,7 +112,7 @@ __ALIGN_BEGIN uint8_t USBD_MSC_CfgHSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = 0x07, /*Endpoint descriptor length = 7 */ 0x05, /*Endpoint descriptor type */ - MSC_OUT_EP, /*Endpoint address (OUT, address 1) */ + MSC_EPOUT_ADDR, /*Endpoint address (OUT, address 1) */ 0x02, /*Bulk endpoint type */ LOBYTE(MSC_MAX_HS_PACKET), HIBYTE(MSC_MAX_HS_PACKET), @@ -120,8 +120,8 @@ __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 */ -__ALIGN_BEGIN uint8_t USBD_MSC_CfgFSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = { +/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ +__ALIGN_BEGIN static uint8_t USBD_MSC_CfgFSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = { 0x09, /* bLength: Configuation Descriptor size */ USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ USB_MSC_CONFIG_DESC_SIZ, @@ -146,7 +146,7 @@ __ALIGN_BEGIN uint8_t USBD_MSC_CfgFSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = /******************** Mass Storage Endpoints ********************/ 0x07, /*Endpoint descriptor length = 7*/ 0x05, /*Endpoint descriptor type */ - MSC_IN_EP, /*Endpoint address (IN, address 1) */ + MSC_EPIN_ADDR, /*Endpoint address (IN, address 1) */ 0x02, /*Bulk endpoint type */ LOBYTE(MSC_MAX_FS_PACKET), HIBYTE(MSC_MAX_FS_PACKET), @@ -154,14 +154,14 @@ __ALIGN_BEGIN uint8_t USBD_MSC_CfgFSDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = 0x07, /*Endpoint descriptor length = 7 */ 0x05, /*Endpoint descriptor type */ - MSC_OUT_EP, /*Endpoint address (OUT, address 1) */ + MSC_EPOUT_ADDR, /*Endpoint address (OUT, address 1) */ 0x02, /*Bulk endpoint type */ LOBYTE(MSC_MAX_FS_PACKET), HIBYTE(MSC_MAX_FS_PACKET), 0x00 /*Polling interval in milliseconds*/ }; -__ALIGN_BEGIN uint8_t USBD_MSC_OtherSpeedCfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = { +__ALIGN_BEGIN static uint8_t USBD_MSC_OtherSpeedCfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = { 0x09, /* bLength: Configuation Descriptor size */ USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION, USB_MSC_CONFIG_DESC_SIZ, @@ -186,7 +186,7 @@ __ALIGN_BEGIN uint8_t USBD_MSC_OtherSpeedCfgDesc[USB_MSC_CONFIG_DESC_SIZ] __AL /******************** Mass Storage Endpoints ********************/ 0x07, /*Endpoint descriptor length = 7*/ 0x05, /*Endpoint descriptor type */ - MSC_IN_EP, /*Endpoint address (IN, address 1) */ + MSC_EPIN_ADDR, /*Endpoint address (IN, address 1) */ 0x02, /*Bulk endpoint type */ 0x40, 0x00, @@ -194,7 +194,7 @@ __ALIGN_BEGIN uint8_t USBD_MSC_OtherSpeedCfgDesc[USB_MSC_CONFIG_DESC_SIZ] __AL 0x07, /*Endpoint descriptor length = 7 */ 0x05, /*Endpoint descriptor type */ - MSC_OUT_EP, /*Endpoint address (OUT, address 1) */ + MSC_EPOUT_ADDR, /*Endpoint address (OUT, address 1) */ 0x02, /*Bulk endpoint type */ 0x40, 0x00, @@ -202,7 +202,7 @@ __ALIGN_BEGIN uint8_t USBD_MSC_OtherSpeedCfgDesc[USB_MSC_CONFIG_DESC_SIZ] __AL }; /* USB Standard Device Descriptor */ -__ALIGN_BEGIN uint8_t USBD_MSC_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = { +__ALIGN_BEGIN static uint8_t USBD_MSC_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = { USB_LEN_DEV_QUALIFIER_DESC, USB_DESC_TYPE_DEVICE_QUALIFIER, 0x00, @@ -234,49 +234,51 @@ int mscInitialized; */ uint8_t USBD_MSC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) { + UNUSED(cfgidx); pdev->pClassData = &mscInitialized; if (pdev->dev_speed == USBD_SPEED_HIGH) { /* Open EP OUT */ - USBD_LL_OpenEP(pdev, MSC_OUT_EP, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); - pdev->ep_out[MSC_OUT_EP & 0xFU].is_used = 1U; + (void)USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); + pdev->ep_out[MSC_EPOUT_ADDR & 0xFU].is_used = 1U; /* Open EP IN */ - USBD_LL_OpenEP(pdev, MSC_IN_EP, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); - pdev->ep_in[MSC_IN_EP & 0xFU].is_used = 1U; + (void)USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); + pdev->ep_in[MSC_EPIN_ADDR & 0xFU].is_used = 1U; } else { /* Open EP OUT */ - USBD_LL_OpenEP(pdev, MSC_OUT_EP, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); - pdev->ep_out[MSC_OUT_EP & 0xFU].is_used = 1U; + (void)USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); + pdev->ep_out[MSC_EPOUT_ADDR & 0xFU].is_used = 1U; /* Open EP IN */ - USBD_LL_OpenEP(pdev, MSC_IN_EP, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); - pdev->ep_in[MSC_IN_EP & 0xFU].is_used = 1U; + (void)USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); + pdev->ep_in[MSC_EPIN_ADDR & 0xFU].is_used = 1U; } /* Init the BOT layer */ MSC_BOT_Init(pdev); - return USBD_OK; + return (uint8_t)USBD_OK; } /** * @brief USBD_MSC_DeInit - * DeInitialize the mass storage configuration + * DeInitialize the mass storage configuration * @param pdev: device instance * @param cfgidx: configuration index * @retval status */ -uint8_t USBD_MSC_DeInit(USBD_HandleTypeDef *pdev, - uint8_t cfgidx) +uint8_t USBD_MSC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) { + UNUSED(cfgidx); + /* Close MSC EPs */ - USBD_LL_CloseEP(pdev, MSC_OUT_EP); - pdev->ep_out[MSC_OUT_EP & 0xFU].is_used = 0U; + (void)USBD_LL_CloseEP(pdev, MSC_EPOUT_ADDR); + pdev->ep_out[MSC_EPOUT_ADDR & 0xFU].is_used = 0U; /* Close EP IN */ - USBD_LL_CloseEP(pdev, MSC_IN_EP); - pdev->ep_in[MSC_IN_EP & 0xFU].is_used = 0U; + (void)USBD_LL_CloseEP(pdev, MSC_EPIN_ADDR); + pdev->ep_in[MSC_EPIN_ADDR & 0xFU].is_used = 0U; /* De-Init the BOT layer */ MSC_BOT_DeInit(pdev); @@ -286,7 +288,7 @@ uint8_t USBD_MSC_DeInit(USBD_HandleTypeDef *pdev, pdev->pClassData = NULL; } - return USBD_OK; + return (uint8_t)USBD_OK; } /** @@ -309,19 +311,15 @@ uint8_t USBD_MSC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) case BOT_GET_MAX_LUN: if ((req->wValue == 0U) && (req->wLength == 1U) && ((req->bmRequest & 0x80U) == 0x80U)) { - if (msc_storage != NULL) { - hmsc->max_lun = (uint32_t)msc_storage->GetMaxLun(); - USBD_CtlSendData(pdev, (uint8_t *)(void *)&hmsc->max_lun, 1U); - } else { - ret = USBD_FAIL; - } + hmsc->max_lun = (uint32_t)msc_storage->GetMaxLun(); + (void)USBD_CtlSendData(pdev, (uint8_t *)&hmsc->max_lun, 1U); } else { USBD_CtlError(pdev, req); ret = USBD_FAIL; } break; - case BOT_RESET : + case BOT_RESET: if ((req->wValue == 0U) && (req->wLength == 0U) && ((req->bmRequest & 0x80U) != 0x80U)) { MSC_BOT_Reset(pdev); @@ -342,7 +340,7 @@ uint8_t USBD_MSC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) switch (req->bRequest) { case USB_REQ_GET_STATUS: if (pdev->dev_state == USBD_STATE_CONFIGURED) { - USBD_CtlSendData(pdev, (uint8_t *)(void *)&status_info, 2U); + (void)USBD_CtlSendData(pdev, (uint8_t *)&status_info, 2U); } else { USBD_CtlError(pdev, req); ret = USBD_FAIL; @@ -351,7 +349,7 @@ uint8_t USBD_MSC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) case USB_REQ_GET_INTERFACE: if (pdev->dev_state == USBD_STATE_CONFIGURED) { - USBD_CtlSendData(pdev, (uint8_t *)(void *)&hmsc->interface, 1U); + (void)USBD_CtlSendData(pdev, (uint8_t *)&hmsc->interface, 1U); } else { USBD_CtlError(pdev, req); ret = USBD_FAIL; @@ -368,40 +366,15 @@ uint8_t USBD_MSC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) break; case USB_REQ_CLEAR_FEATURE: + if (pdev->dev_state == USBD_STATE_CONFIGURED) { + if (req->wValue == USB_FEATURE_EP_HALT) { + /* Flush the FIFO */ + (void)USBD_LL_FlushEP(pdev, (uint8_t)req->wIndex); - /* Flush the FIFO and Clear the stall status */ - USBD_LL_FlushEP(pdev, (uint8_t)req->wIndex); - - /* Reactivate the EP */ - USBD_LL_CloseEP(pdev, (uint8_t)req->wIndex); - if ((((uint8_t)req->wIndex) & 0x80U) == 0x80U) { - pdev->ep_in[(uint8_t)req->wIndex & 0xFU].is_used = 0U; - if (pdev->dev_speed == USBD_SPEED_HIGH) { - /* Open EP IN */ - USBD_LL_OpenEP(pdev, MSC_IN_EP, USBD_EP_TYPE_BULK, - MSC_MAX_HS_PACKET); - } else { - /* Open EP IN */ - USBD_LL_OpenEP(pdev, MSC_IN_EP, USBD_EP_TYPE_BULK, - MSC_MAX_FS_PACKET); + /* Handle BOT error */ + MSC_BOT_CplClrFeature(pdev, (uint8_t)req->wIndex); } - pdev->ep_in[MSC_IN_EP & 0xFU].is_used = 1U; - } else { - pdev->ep_out[(uint8_t)req->wIndex & 0xFU].is_used = 0U; - if (pdev->dev_speed == USBD_SPEED_HIGH) { - /* Open EP OUT */ - USBD_LL_OpenEP(pdev, MSC_OUT_EP, USBD_EP_TYPE_BULK, - MSC_MAX_HS_PACKET); - } else { - /* Open EP OUT */ - USBD_LL_OpenEP(pdev, MSC_OUT_EP, USBD_EP_TYPE_BULK, - MSC_MAX_FS_PACKET); - } - pdev->ep_out[MSC_OUT_EP & 0xFU].is_used = 1U; } - - /* Handle BOT error */ - MSC_BOT_CplClrFeature(pdev, (uint8_t)req->wIndex); break; default: @@ -417,7 +390,7 @@ uint8_t USBD_MSC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) break; } - return ret; + return (uint8_t)ret; } /** @@ -431,7 +404,7 @@ uint8_t USBD_MSC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) { MSC_BOT_DataIn(pdev, epnum); - return USBD_OK; + return (uint8_t)USBD_OK; } /** @@ -445,7 +418,7 @@ uint8_t USBD_MSC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) { MSC_BOT_DataOut(pdev, epnum); - return USBD_OK; + return (uint8_t)USBD_OK; } /** @@ -456,7 +429,7 @@ uint8_t USBD_MSC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) */ uint8_t *USBD_MSC_GetHSCfgDesc(uint16_t *length) { - *length = sizeof(USBD_MSC_CfgHSDesc); + *length = (uint16_t)sizeof(USBD_MSC_CfgHSDesc); return USBD_MSC_CfgHSDesc; } @@ -469,7 +442,7 @@ uint8_t *USBD_MSC_GetHSCfgDesc(uint16_t *length) */ uint8_t *USBD_MSC_GetFSCfgDesc(uint16_t *length) { - *length = sizeof(USBD_MSC_CfgFSDesc); + *length = (uint16_t)sizeof(USBD_MSC_CfgFSDesc); return USBD_MSC_CfgFSDesc; } @@ -482,7 +455,7 @@ uint8_t *USBD_MSC_GetFSCfgDesc(uint16_t *length) */ uint8_t *USBD_MSC_GetOtherSpeedCfgDesc(uint16_t *length) { - *length = sizeof(USBD_MSC_OtherSpeedCfgDesc); + *length = (uint16_t)sizeof(USBD_MSC_OtherSpeedCfgDesc); return USBD_MSC_OtherSpeedCfgDesc; } @@ -494,7 +467,7 @@ uint8_t *USBD_MSC_GetOtherSpeedCfgDesc(uint16_t *length) */ uint8_t *USBD_MSC_GetDeviceQualifierDescriptor(uint16_t *length) { - *length = sizeof(USBD_MSC_DeviceQualifierDesc); + *length = (uint16_t)sizeof(USBD_MSC_DeviceQualifierDesc); return USBD_MSC_DeviceQualifierDesc; } @@ -504,12 +477,15 @@ uint8_t *USBD_MSC_GetDeviceQualifierDescriptor(uint16_t *length) * @param fops: storage callback * @retval status */ -uint8_t USBD_MSC_RegisterStorage(USBD_HandleTypeDef *pdev, - USBD_StorageTypeDef *fops) +uint8_t USBD_MSC_RegisterStorage(USBD_HandleTypeDef *pdev, USBD_StorageTypeDef *fops) { + if (fops == NULL) { + return (uint8_t)USBD_FAIL; + } + msc_storage = fops; - return USBD_OK; + return (uint8_t)USBD_OK; } #endif /* USBD_USE_MSC_CLASS */ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc.h b/cores/arduino/stm32/usb/msc/usbd_msc.h index 861abd5bec..a3001d570c 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc.h +++ b/cores/arduino/stm32/usb/msc/usbd_msc.h @@ -53,12 +53,13 @@ typedef struct _USBD_STORAGE { } USBD_StorageTypeDef; + typedef struct { uint32_t max_lun; uint32_t interface; uint8_t bot_state; uint8_t bot_status; - uint16_t bot_data_length; + uint32_t bot_data_length; uint8_t bot_data[MSC_MEDIA_PACKET]; USBD_MSC_BOT_CBWTypeDef cbw; USBD_MSC_BOT_CSWTypeDef csw; @@ -66,6 +67,7 @@ typedef struct { USBD_SCSI_SenseTypeDef scsi_sense [SENSE_LIST_DEEPTH]; uint8_t scsi_sense_head; uint8_t scsi_sense_tail; + uint8_t scsi_medium_state; uint16_t scsi_blk_size; uint32_t scsi_blk_nbr; diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_bot.c b/cores/arduino/stm32/usb/msc/usbd_msc_bot.c index 403d05425a..d3338d2292 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_bot.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_bot.c @@ -34,11 +34,9 @@ EndBSPDependencies */ #include "usbd_msc_scsi.h" #include "usbd_ioreq.h" -static void MSC_BOT_CBW_Decode(USBD_HandleTypeDef *pdev); -static void MSC_BOT_SendData(USBD_HandleTypeDef *pdev, uint8_t *pbuf, - uint16_t len); - -static void MSC_BOT_Abort(USBD_HandleTypeDef *pdev); +static void MSC_BOT_SendData(USBD_HandleTypeDef *pdev, uint8_t *pbuf, uint32_t len); +static void MSC_BOT_CBW_Decode(USBD_HandleTypeDef *pdev); +static void MSC_BOT_Abort(USBD_HandleTypeDef *pdev); /** @@ -47,7 +45,7 @@ static void MSC_BOT_Abort(USBD_HandleTypeDef *pdev); * @param pdev: device instance * @retval None */ -void MSC_BOT_Init(USBD_HandleTypeDef *pdev) +void MSC_BOT_Init(USBD_HandleTypeDef *pdev) { USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; @@ -56,15 +54,16 @@ void MSC_BOT_Init(USBD_HandleTypeDef *pdev) hmsc->scsi_sense_tail = 0U; hmsc->scsi_sense_head = 0U; + hmsc->scsi_medium_state = SCSI_MEDIUM_UNLOCKED; msc_storage->Init(0U); - USBD_LL_FlushEP(pdev, MSC_OUT_EP); - USBD_LL_FlushEP(pdev, MSC_IN_EP); + (void)USBD_LL_FlushEP(pdev, MSC_EPOUT_ADDR); + (void)USBD_LL_FlushEP(pdev, MSC_EPIN_ADDR); /* Prapare EP to Receive First BOT Cmd */ - USBD_LL_PrepareReceive(pdev, MSC_OUT_EP, (uint8_t *)(void *)&hmsc->cbw, - USBD_BOT_CBW_LENGTH); + (void)USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, (uint8_t *)&hmsc->cbw, + USBD_BOT_CBW_LENGTH); } /** @@ -73,16 +72,19 @@ void MSC_BOT_Init(USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval None */ -void MSC_BOT_Reset(USBD_HandleTypeDef *pdev) +void MSC_BOT_Reset(USBD_HandleTypeDef *pdev) { USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; hmsc->bot_state = USBD_BOT_IDLE; hmsc->bot_status = USBD_BOT_STATUS_RECOVERY; + (void)USBD_LL_ClearStallEP(pdev, MSC_EPIN_ADDR); + (void)USBD_LL_ClearStallEP(pdev, MSC_EPOUT_ADDR); + /* Prapare EP to Receive First BOT Cmd */ - USBD_LL_PrepareReceive(pdev, MSC_OUT_EP, (uint8_t *)(void *)&hmsc->cbw, - USBD_BOT_CBW_LENGTH); + (void)USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, (uint8_t *)&hmsc->cbw, + USBD_BOT_CBW_LENGTH); } /** @@ -104,9 +106,10 @@ void MSC_BOT_DeInit(USBD_HandleTypeDef *pdev) * @param epnum: endpoint index * @retval None */ -void MSC_BOT_DataIn(USBD_HandleTypeDef *pdev, - uint8_t epnum) +void MSC_BOT_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) { + UNUSED(epnum); + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; switch (hmsc->bot_state) { @@ -132,9 +135,10 @@ void MSC_BOT_DataIn(USBD_HandleTypeDef *pdev, * @param epnum: endpoint index * @retval None */ -void MSC_BOT_DataOut(USBD_HandleTypeDef *pdev, - uint8_t epnum) +void MSC_BOT_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) { + UNUSED(epnum); + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; switch (hmsc->bot_state) { @@ -143,7 +147,6 @@ void MSC_BOT_DataOut(USBD_HandleTypeDef *pdev, break; 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); } @@ -167,11 +170,10 @@ static void MSC_BOT_CBW_Decode(USBD_HandleTypeDef *pdev) hmsc->csw.dTag = hmsc->cbw.dTag; hmsc->csw.dDataResidue = hmsc->cbw.dDataLength; - if ((USBD_LL_GetRxDataSize(pdev, MSC_OUT_EP) != USBD_BOT_CBW_LENGTH) || + if ((USBD_LL_GetRxDataSize(pdev, MSC_EPOUT_ADDR) != USBD_BOT_CBW_LENGTH) || (hmsc->cbw.dSignature != USBD_BOT_CBW_SIGNATURE) || - (hmsc->cbw.bLUN > 1U) || - (hmsc->cbw.bCBLength < 1U) || (hmsc->cbw.bCBLength > 16U)) { - + (hmsc->cbw.bLUN > 1U) || (hmsc->cbw.bCBLength < 1U) || + (hmsc->cbw.bCBLength > 16U)) { SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); hmsc->bot_status = USBD_BOT_STATUS_ERROR; @@ -184,7 +186,7 @@ static void MSC_BOT_CBW_Decode(USBD_HandleTypeDef *pdev) MSC_BOT_Abort(pdev); } } - /*Burst xfer handled internally*/ + /* 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)) { @@ -209,18 +211,17 @@ static void MSC_BOT_CBW_Decode(USBD_HandleTypeDef *pdev) * @param len: Data Length * @retval None */ -static void MSC_BOT_SendData(USBD_HandleTypeDef *pdev, uint8_t *pbuf, - uint16_t len) +static void MSC_BOT_SendData(USBD_HandleTypeDef *pdev, uint8_t *pbuf, uint32_t len) { USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; - uint16_t length = (uint16_t)MIN(hmsc->cbw.dDataLength, len); + uint32_t length = MIN(hmsc->cbw.dDataLength, len); hmsc->csw.dDataResidue -= len; hmsc->csw.bStatus = USBD_CSW_CMD_PASSED; hmsc->bot_state = USBD_BOT_SEND_DATA; - USBD_LL_Transmit(pdev, MSC_IN_EP, pbuf, length); + (void)USBD_LL_Transmit(pdev, MSC_EPIN_ADDR, pbuf, length); } /** @@ -230,8 +231,7 @@ static void MSC_BOT_SendData(USBD_HandleTypeDef *pdev, uint8_t *pbuf, * @param status : CSW status * @retval None */ -void MSC_BOT_SendCSW(USBD_HandleTypeDef *pdev, - uint8_t CSW_Status) +void MSC_BOT_SendCSW(USBD_HandleTypeDef *pdev, uint8_t CSW_Status) { USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; @@ -239,12 +239,12 @@ void MSC_BOT_SendCSW(USBD_HandleTypeDef *pdev, hmsc->csw.bStatus = CSW_Status; hmsc->bot_state = USBD_BOT_IDLE; - USBD_LL_Transmit(pdev, MSC_IN_EP, (uint8_t *)(void *)&hmsc->csw, - USBD_BOT_CSW_LENGTH); + (void)USBD_LL_Transmit(pdev, MSC_EPIN_ADDR, (uint8_t *)&hmsc->csw, + USBD_BOT_CSW_LENGTH); /* Prepare EP to Receive next Cmd */ - USBD_LL_PrepareReceive(pdev, MSC_OUT_EP, (uint8_t *)(void *)&hmsc->cbw, - USBD_BOT_CBW_LENGTH); + (void)USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, (uint8_t *)&hmsc->cbw, + USBD_BOT_CBW_LENGTH); } /** @@ -254,21 +254,21 @@ void MSC_BOT_SendCSW(USBD_HandleTypeDef *pdev, * @retval status */ -static void MSC_BOT_Abort(USBD_HandleTypeDef *pdev) +static void MSC_BOT_Abort(USBD_HandleTypeDef *pdev) { USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; if ((hmsc->cbw.bmFlags == 0U) && (hmsc->cbw.dDataLength != 0U) && (hmsc->bot_status == USBD_BOT_STATUS_NORMAL)) { - USBD_LL_StallEP(pdev, MSC_OUT_EP); + (void)USBD_LL_StallEP(pdev, MSC_EPOUT_ADDR); } - USBD_LL_StallEP(pdev, MSC_IN_EP); + (void)USBD_LL_StallEP(pdev, MSC_EPIN_ADDR); if (hmsc->bot_status == USBD_BOT_STATUS_ERROR) { - USBD_LL_PrepareReceive(pdev, MSC_OUT_EP, (uint8_t *)(void *)&hmsc->cbw, - USBD_BOT_CBW_LENGTH); + (void)USBD_LL_StallEP(pdev, MSC_EPIN_ADDR); + (void)USBD_LL_StallEP(pdev, MSC_EPOUT_ADDR); } } @@ -280,14 +280,14 @@ static void MSC_BOT_Abort(USBD_HandleTypeDef *pdev) * @retval None */ -void MSC_BOT_CplClrFeature(USBD_HandleTypeDef *pdev, uint8_t epnum) +void MSC_BOT_CplClrFeature(USBD_HandleTypeDef *pdev, uint8_t epnum) { USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; if (hmsc->bot_status == USBD_BOT_STATUS_ERROR) { /* Bad CBW Signature */ - USBD_LL_StallEP(pdev, MSC_IN_EP); - hmsc->bot_status = USBD_BOT_STATUS_NORMAL; + (void)USBD_LL_StallEP(pdev, MSC_EPIN_ADDR); + (void)USBD_LL_StallEP(pdev, MSC_EPOUT_ADDR); } else if (((epnum & 0x80U) == 0x80U) && (hmsc->bot_status != USBD_BOT_STATUS_RECOVERY)) { MSC_BOT_SendCSW(pdev, USBD_CSW_CMD_FAILED); } else { diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_data.c b/cores/arduino/stm32/usb/msc/usbd_msc_data.c index 7f960191a6..a1456d285c 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_data.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_data.c @@ -33,18 +33,47 @@ EndBSPDependencies */ /* USB Mass storage Page 0 Inquiry Data */ -const uint8_t MSC_Page00_Inquiry_Data[] = { +uint8_t MSC_Page00_Inquiry_Data[LENGTH_INQUIRY_PAGE00] = +{ 0x00, 0x00, 0x00, (LENGTH_INQUIRY_PAGE00 - 4U), 0x00, - 0x80, - 0x83 + 0x80 }; -/* USB Mass storage sense 6 Data */ -const uint8_t MSC_Mode_Sense6_data[] = { +/* USB Mass storage VPD Page 0x80 Inquiry Data for Unit Serial Number */ +uint8_t MSC_Page80_Inquiry_Data[LENGTH_INQUIRY_PAGE80] = +{ + 0x00, + 0x80, + 0x00, + LENGTH_INQUIRY_PAGE80, + 0x20, /* Put Product Serial number */ + 0x20, + 0x20, + 0x20 + }; + +/* USB Mass storage sense 6 Data */ +uint8_t MSC_Mode_Sense6_data[MODE_SENSE6_LEN] = +{ + 0x22, + 0x00, + 0x00, + 0x00, + 0x08, + 0x12, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, 0x00, 0x00, 0x00, @@ -55,10 +84,31 @@ const uint8_t MSC_Mode_Sense6_data[] = { 0x00 }; + /* USB Mass storage sense 10 Data */ -const uint8_t MSC_Mode_Sense10_data[] = { +uint8_t MSC_Mode_Sense10_data[MODE_SENSE10_LEN] = +{ + 0x00, + 0x26, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x08, + 0x12, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_data.h b/cores/arduino/stm32/usb/msc/usbd_msc_data.h index e0ed04ee82..24ab8cf1a2 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_data.h +++ b/cores/arduino/stm32/usb/msc/usbd_msc_data.h @@ -29,15 +29,17 @@ extern "C" { #include "usbd_conf.h" -#define MODE_SENSE6_LEN 8U -#define MODE_SENSE10_LEN 8U -#define LENGTH_INQUIRY_PAGE00 7U -#define LENGTH_FORMAT_CAPACITIES 20U +#define MODE_SENSE6_LEN 0x17U +#define MODE_SENSE10_LEN 0x1BU +#define LENGTH_INQUIRY_PAGE00 0x06U +#define LENGTH_INQUIRY_PAGE80 0x08U +#define LENGTH_FORMAT_CAPACITIES 0x14U -extern const uint8_t MSC_Page00_Inquiry_Data[]; -extern const uint8_t MSC_Mode_Sense6_data[]; -extern const uint8_t MSC_Mode_Sense10_data[] ; +extern uint8_t MSC_Page00_Inquiry_Data[LENGTH_INQUIRY_PAGE00]; +extern uint8_t MSC_Page80_Inquiry_Data[LENGTH_INQUIRY_PAGE80]; +extern uint8_t MSC_Mode_Sense6_data[MODE_SENSE6_LEN]; +extern uint8_t MSC_Mode_Sense10_data[MODE_SENSE10_LEN]; #ifdef __cplusplus diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c index 589355c365..59e62b86f7 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c @@ -40,12 +40,16 @@ static int8_t SCSI_TestUnitReady(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t 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_ReadCapacity16(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_AllowPreventRemovable(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_Write12(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_Read12(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, uint32_t blk_nbr); @@ -53,6 +57,8 @@ static int8_t SCSI_CheckAddressRange(USBD_HandleTypeDef *pdev, uint8_t lun, static int8_t SCSI_ProcessRead(USBD_HandleTypeDef *pdev, uint8_t lun); static int8_t SCSI_ProcessWrite(USBD_HandleTypeDef *pdev, uint8_t lun); +static int8_t SCSI_UpdateBotData(USBD_MSC_BOT_HandleTypeDef *hmsc, + uint8_t *pBuff, uint16_t length); /** * @brief SCSI_ProcessCmd @@ -64,60 +70,78 @@ static int8_t SCSI_ProcessWrite(USBD_HandleTypeDef *pdev, uint8_t lun); */ int8_t SCSI_ProcessCmd(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *cmd) { + int8_t ret; + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_storage; + switch (cmd[0]) { case SCSI_TEST_UNIT_READY: - return SCSI_TestUnitReady(pdev, lun, cmd); + ret = SCSI_TestUnitReady(pdev, lun, cmd); break; case SCSI_REQUEST_SENSE: - return SCSI_RequestSense(pdev, lun, cmd); + ret = SCSI_RequestSense(pdev, lun, cmd); break; + case SCSI_INQUIRY: - return SCSI_Inquiry(pdev, lun, cmd); + ret = SCSI_Inquiry(pdev, lun, cmd); break; case SCSI_START_STOP_UNIT: - return SCSI_StartStopUnit(pdev, lun, cmd); + ret = SCSI_StartStopUnit(pdev, lun, cmd); break; case SCSI_ALLOW_MEDIUM_REMOVAL: - return SCSI_StartStopUnit(pdev, lun, cmd); + ret = SCSI_AllowPreventRemovable(pdev, lun, cmd); break; case SCSI_MODE_SENSE6: - return SCSI_ModeSense6(pdev, lun, cmd); + ret = SCSI_ModeSense6(pdev, lun, cmd); break; case SCSI_MODE_SENSE10: - return SCSI_ModeSense10(pdev, lun, cmd); + ret = SCSI_ModeSense10(pdev, lun, cmd); break; case SCSI_READ_FORMAT_CAPACITIES: - return SCSI_ReadFormatCapacity(pdev, lun, cmd); + ret = SCSI_ReadFormatCapacity(pdev, lun, cmd); break; case SCSI_READ_CAPACITY10: - return SCSI_ReadCapacity10(pdev, lun, cmd); + ret = SCSI_ReadCapacity10(pdev, lun, cmd); + break; + + case SCSI_READ_CAPACITY16: + ret = SCSI_ReadCapacity16(pdev, lun, cmd); break; case SCSI_READ10: - return SCSI_Read10(pdev, lun, cmd); + ret = SCSI_Read10(pdev, lun, cmd); + break; + + case SCSI_READ12: + ret = SCSI_Read12(pdev, lun, cmd); break; case SCSI_WRITE10: - return SCSI_Write10(pdev, lun, cmd); + ret = SCSI_Write10(pdev, lun, cmd); + break; + + case SCSI_WRITE12: + ret = SCSI_Write12(pdev, lun, cmd); break; case SCSI_VERIFY10: - return SCSI_Verify10(pdev, lun, cmd); + ret = SCSI_Verify10(pdev, lun, cmd); break; default: SCSI_SenseCode(pdev, lun, ILLEGAL_REQUEST, INVALID_CDB); - return -1; + hmsc->bot_status = USBD_BOT_STATUS_ERROR; + ret = -1; + break; } - return 0; + return ret; } @@ -128,8 +152,9 @@ int8_t SCSI_ProcessCmd(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *cmd) * @param params: Command parameters * @retval status */ -static int8_t SCSI_TestUnitReady(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +static int8_t SCSI_TestUnitReady(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) { + UNUSED(params); USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; /* case 9 : Hi > D0 */ @@ -139,7 +164,14 @@ static int8_t SCSI_TestUnitReady(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t return -1; } - if (msc_storage->IsReady(lun) != 0) { + if (hmsc->scsi_medium_state == SCSI_MEDIUM_EJECTED) { + SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); + hmsc->bot_state = USBD_BOT_NO_DATA; + return -1; + } + + if (msc_storage->IsReady(lun) != 0) + { SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); hmsc->bot_state = USBD_BOT_NO_DATA; @@ -150,6 +182,7 @@ static int8_t SCSI_TestUnitReady(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t return 0; } + /** * @brief SCSI_Inquiry * Process Inquiry command @@ -157,20 +190,32 @@ 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 int8_t SCSI_Inquiry(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) { uint8_t *pPage; uint16_t len; USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; - if (params[1] & 0x01U) { - /*Evpd is set*/ - len = LENGTH_INQUIRY_PAGE00; - hmsc->bot_data_length = len; + if (hmsc->cbw.dDataLength == 0U) + { + SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } - while (len) { - len--; - hmsc->bot_data[len] = MSC_Page00_Inquiry_Data[len]; + if ((params[1] & 0x01U) != 0U) { + /* Evpd is set */ + if (params[2] == 0U) { + /* Request for Supported Vital Product Data Pages*/ + (void)SCSI_UpdateBotData(hmsc, MSC_Page00_Inquiry_Data, LENGTH_INQUIRY_PAGE00); + } else if (params[2] == 0x80U) { + /* Request for VPD page 0x80 Unit Serial Number */ + (void)SCSI_UpdateBotData(hmsc, MSC_Page80_Inquiry_Data, LENGTH_INQUIRY_PAGE80); + } else { + /* Request Not supported */ + SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, + INVALID_FIELED_IN_COMMAND); + + return -1; } } else { pPage = &msc_storage->pInquiry[lun * STANDARD_INQUIRY_DATA_LEN]; @@ -179,17 +224,14 @@ static int8_t SCSI_Inquiry(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *par if (params[4] <= len) { len = params[4]; } - hmsc->bot_data_length = len; - while (len) { - len--; - hmsc->bot_data[len] = pPage[len]; - } + (void)SCSI_UpdateBotData(hmsc, pPage, len); } return 0; } + /** * @brief SCSI_ReadCapacity10 * Process Read Capacity 10 command @@ -197,29 +239,85 @@ 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 int8_t SCSI_ReadCapacity10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) { - USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + UNUSED(params); + int8_t ret; + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; - if (msc_storage->GetCapacity(lun, &hmsc->scsi_blk_nbr, &hmsc->scsi_blk_size) != 0) { + ret = msc_storage->GetCapacity(lun, &hmsc->scsi_blk_nbr, &hmsc->scsi_blk_size); + + if ((ret != 0) || (hmsc->scsi_medium_state == SCSI_MEDIUM_EJECTED)) { SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); return -1; - } else { + } + + hmsc->bot_data[0] = (uint8_t)((hmsc->scsi_blk_nbr - 1U) >> 24); + hmsc->bot_data[1] = (uint8_t)((hmsc->scsi_blk_nbr - 1U) >> 16); + hmsc->bot_data[2] = (uint8_t)((hmsc->scsi_blk_nbr - 1U) >> 8); + hmsc->bot_data[3] = (uint8_t)(hmsc->scsi_blk_nbr - 1U); + + 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 = 8U; + + return 0; + +} - hmsc->bot_data[0] = (uint8_t)((hmsc->scsi_blk_nbr - 1U) >> 24); - hmsc->bot_data[1] = (uint8_t)((hmsc->scsi_blk_nbr - 1U) >> 16); - hmsc->bot_data[2] = (uint8_t)((hmsc->scsi_blk_nbr - 1U) >> 8); - hmsc->bot_data[3] = (uint8_t)(hmsc->scsi_blk_nbr - 1U); - 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); +/** +* @brief SCSI_ReadCapacity16 +* Process Read Capacity 16 command +* @param lun: Logical unit number +* @param params: Command parameters +* @retval status +*/ +static int8_t SCSI_ReadCapacity16(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +{ + UNUSED(params); + uint8_t idx; + int8_t ret; + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; - hmsc->bot_data_length = 8U; - return 0; + ret = msc_storage->GetCapacity(lun, &hmsc->scsi_blk_nbr, &hmsc->scsi_blk_size); + + if ((ret != 0) || (hmsc->scsi_medium_state == SCSI_MEDIUM_EJECTED)) { + SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); + return -1; + } + + hmsc->bot_data_length = ((uint32_t)params[10] << 24) | + ((uint32_t)params[11] << 16) | + ((uint32_t)params[12] << 8) | + (uint32_t)params[13]; + + for (idx = 0U; idx < hmsc->bot_data_length; idx++) { + hmsc->bot_data[idx] = 0U; } + + hmsc->bot_data[4] = (uint8_t)((hmsc->scsi_blk_nbr - 1U) >> 24); + hmsc->bot_data[5] = (uint8_t)((hmsc->scsi_blk_nbr - 1U) >> 16); + hmsc->bot_data[6] = (uint8_t)((hmsc->scsi_blk_nbr - 1U) >> 8); + hmsc->bot_data[7] = (uint8_t)(hmsc->scsi_blk_nbr - 1U); + + hmsc->bot_data[8] = (uint8_t)(hmsc->scsi_blk_size >> 24); + hmsc->bot_data[9] = (uint8_t)(hmsc->scsi_blk_size >> 16); + hmsc->bot_data[10] = (uint8_t)(hmsc->scsi_blk_size >> 8); + hmsc->bot_data[11] = (uint8_t)(hmsc->scsi_blk_size); + + hmsc->bot_data_length = ((uint32_t)params[10] << 24) | + ((uint32_t)params[11] << 16) | + ((uint32_t)params[12] << 8) | + (uint32_t)params[13]; + + return 0; } + + /** * @brief SCSI_ReadFormatCapacity * Process Read Format Capacity command @@ -227,37 +325,43 @@ 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 int8_t SCSI_ReadFormatCapacity(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) { - USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; - + UNUSED(params); uint16_t blk_size; uint32_t blk_nbr; uint16_t i; + int8_t ret; + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + ret = msc_storage->GetCapacity(lun, &blk_nbr, &blk_size); + + if ((ret != 0) || (hmsc->scsi_medium_state == SCSI_MEDIUM_EJECTED)) { + SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); + return -1; + } for (i = 0U; i < 12U ; i++) { hmsc->bot_data[i] = 0U; } - if (msc_storage->GetCapacity(lun, &blk_nbr, &blk_size) != 0U) { - SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); - return -1; - } else { - hmsc->bot_data[3] = 0x08U; - hmsc->bot_data[4] = (uint8_t)((blk_nbr - 1U) >> 24); - hmsc->bot_data[5] = (uint8_t)((blk_nbr - 1U) >> 16); - hmsc->bot_data[6] = (uint8_t)((blk_nbr - 1U) >> 8); - hmsc->bot_data[7] = (uint8_t)(blk_nbr - 1U); + hmsc->bot_data[3] = 0x08U; + hmsc->bot_data[4] = (uint8_t)((blk_nbr - 1U) >> 24); + hmsc->bot_data[5] = (uint8_t)((blk_nbr - 1U) >> 16); + hmsc->bot_data[6] = (uint8_t)((blk_nbr - 1U) >> 8); + hmsc->bot_data[7] = (uint8_t)(blk_nbr - 1U); - hmsc->bot_data[8] = 0x02U; - 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[8] = 0x02U; + 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 = 12U; - return 0; - } + hmsc->bot_data_length = 12U; + + return 0; } + + /** * @brief SCSI_ModeSense6 * Process Mode Sense6 command @@ -265,19 +369,22 @@ 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 int8_t SCSI_ModeSense6(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) { + UNUSED(lun); USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; - uint16_t len = 8U; - hmsc->bot_data_length = len; + uint16_t len = MODE_SENSE6_LEN; - while (len) { - len--; - hmsc->bot_data[len] = MSC_Mode_Sense6_data[len]; + if (params[4] <= len) { + len = params[4]; } + + (void)SCSI_UpdateBotData(hmsc, MSC_Mode_Sense6_data, len); + return 0; } + /** * @brief SCSI_ModeSense10 * Process Mode Sense10 command @@ -285,21 +392,22 @@ static int8_t SCSI_ModeSense6(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *p * @param params: Command parameters * @retval status */ -static int8_t SCSI_ModeSense10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +static int8_t SCSI_ModeSense10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) { - uint16_t len = 8U; + UNUSED(lun); USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + uint16_t len = MODE_SENSE10_LEN; - hmsc->bot_data_length = len; - - while (len) { - len--; - hmsc->bot_data[len] = MSC_Mode_Sense10_data[len]; + if (params[8] <= len) { + len = params[8]; } + (void)SCSI_UpdateBotData(hmsc, MSC_Mode_Sense10_data, len); + return 0; } + /** * @brief SCSI_RequestSense * Process Request Sense command @@ -307,58 +415,71 @@ static int8_t SCSI_ModeSense10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t * * @param params: Command parameters * @retval status */ - -static int8_t SCSI_RequestSense(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +static int8_t SCSI_RequestSense(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) { + UNUSED(lun); uint8_t i; USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; - for (i = 0U ; i < REQUEST_SENSE_DATA_LEN; i++) { + if (hmsc->cbw.dDataLength == 0U) { + SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } + + for (i = 0U; i < REQUEST_SENSE_DATA_LEN; i++) { hmsc->bot_data[i] = 0U; } hmsc->bot_data[0] = 0x70U; hmsc->bot_data[7] = REQUEST_SENSE_DATA_LEN - 6U; - 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; + if ((hmsc->scsi_sense_head != hmsc->scsi_sense_tail)) + { + hmsc->bot_data[2] = (uint8_t)hmsc->scsi_sense[hmsc->scsi_sense_head].Skey; + hmsc->bot_data[12] = (uint8_t)hmsc->scsi_sense[hmsc->scsi_sense_head].w.b.ASC; + hmsc->bot_data[13] = (uint8_t)hmsc->scsi_sense[hmsc->scsi_sense_head].w.b.ASCQ; hmsc->scsi_sense_head++; if (hmsc->scsi_sense_head == SENSE_LIST_DEEPTH) { hmsc->scsi_sense_head = 0U; } } + hmsc->bot_data_length = REQUEST_SENSE_DATA_LEN; if (params[4] <= REQUEST_SENSE_DATA_LEN) { hmsc->bot_data_length = params[4]; } + return 0; } + /** * @brief SCSI_SenseCode * Load the last error code in the error list * @param lun: Logical unit number * @param sKey: Sense Key -* @param ASC: Additional Sense Key +* @param ASC: Additional Sense Code * @retval none */ -void SCSI_SenseCode(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t sKey, uint8_t ASC) +void SCSI_SenseCode(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t sKey, uint8_t ASC) { + UNUSED(lun); USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; - hmsc->scsi_sense[hmsc->scsi_sense_tail].Skey = sKey; - hmsc->scsi_sense[hmsc->scsi_sense_tail].w.ASC = ASC << 8; + hmsc->scsi_sense[hmsc->scsi_sense_tail].Skey = sKey; + hmsc->scsi_sense[hmsc->scsi_sense_tail].w.b.ASC = ASC; + hmsc->scsi_sense[hmsc->scsi_sense_tail].w.b.ASCQ = 0U; hmsc->scsi_sense_tail++; + if (hmsc->scsi_sense_tail == SENSE_LIST_DEEPTH) { hmsc->scsi_sense_tail = 0U; } } + + /** * @brief SCSI_StartStopUnit * Process Start Stop Unit command @@ -366,13 +487,59 @@ 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 int8_t SCSI_StartStopUnit(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) { + UNUSED(lun); USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + if ((hmsc->scsi_medium_state == SCSI_MEDIUM_LOCKED) && ((params[4] & 0x3U) == 2U)) { + SCSI_SenseCode(pdev, lun, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); + + return -1; + } + + if ((params[4] & 0x3U) == 0x1U) /* START=1 */ + { + hmsc->scsi_medium_state = SCSI_MEDIUM_UNLOCKED; + } else if ((params[4] & 0x3U) == 0x2U) { + /* START=0 and LOEJ Load Eject=1 */ + hmsc->scsi_medium_state = SCSI_MEDIUM_EJECTED; + } else if ((params[4] & 0x3U) == 0x3U) { + /* START=1 and LOEJ Load Eject=1 */ + hmsc->scsi_medium_state = SCSI_MEDIUM_UNLOCKED; + } else { + /* .. */ + } hmsc->bot_data_length = 0U; + + return 0; +} + + +/** +* @brief SCSI_AllowPreventRemovable +* Process Allow Prevent Removable medium command +* @param lun: Logical unit number +* @param params: Command parameters +* @retval status +*/ +static int8_t SCSI_AllowPreventRemovable(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +{ + UNUSED(lun); + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + if (params[4] == 0U) { + hmsc->scsi_medium_state = SCSI_MEDIUM_UNLOCKED; + } else { + hmsc->scsi_medium_state = SCSI_MEDIUM_LOCKED; + } + + hmsc->bot_data_length = 0U; + return 0; } + /** * @brief SCSI_Read10 * Process Read10 command @@ -392,7 +559,13 @@ static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params return -1; } - if (msc_storage->IsReady(lun) != 0) { + if (hmsc->scsi_medium_state == SCSI_MEDIUM_EJECTED) { + SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); + + return -1; + } + + if (((USBD_StorageTypeDef *)pdev->pUserData)->IsReady(lun) != 0) { SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); return -1; } @@ -409,19 +582,78 @@ static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params return -1; /* error */ } + /* cases 4,5 : Hi <> Dn */ + if (hmsc->cbw.dDataLength != (hmsc->scsi_blk_len * hmsc->scsi_blk_size)) { + SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } + hmsc->bot_state = USBD_BOT_DATA_IN; + } + hmsc->bot_data_length = MSC_MEDIA_PACKET; + + return SCSI_ProcessRead(pdev, lun); +} + + +/** +* @brief SCSI_Read12 +* Process Read12 command +* @param lun: Logical unit number +* @param params: Command parameters +* @retval status +*/ +static int8_t SCSI_Read12(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + + if (hmsc->bot_state == USBD_BOT_IDLE) { + /* Idle */ + /* case 10 : Ho <> Di */ + if ((hmsc->cbw.bmFlags & 0x80U) != 0x80U) { + SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } + + if (hmsc->scsi_medium_state == SCSI_MEDIUM_EJECTED) { + SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); + return -1; + } + + if (msc_storage->IsReady(lun) != 0) { + SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); + return -1; + } + + hmsc->scsi_blk_addr = ((uint32_t)params[2] << 24) | + ((uint32_t)params[3] << 16) | + ((uint32_t)params[4] << 8) | + (uint32_t)params[5]; + + hmsc->scsi_blk_len = ((uint32_t)params[6] << 24) | + ((uint32_t)params[7] << 16) | + ((uint32_t)params[8] << 8) | + (uint32_t)params[9]; + + if (SCSI_CheckAddressRange(pdev, lun, hmsc->scsi_blk_addr, + hmsc->scsi_blk_len) < 0) { + return -1; /* error */ + } /* cases 4,5 : Hi <> Dn */ if (hmsc->cbw.dDataLength != (hmsc->scsi_blk_len * hmsc->scsi_blk_size)) { SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); return -1; } + + hmsc->bot_state = USBD_BOT_DATA_IN; } hmsc->bot_data_length = MSC_MEDIA_PACKET; return SCSI_ProcessRead(pdev, lun); } + /** * @brief SCSI_Write10 * Process Write10 command @@ -429,13 +661,18 @@ static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params * @param params: Command parameters * @retval status */ -static int8_t SCSI_Write10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +static int8_t SCSI_Write10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) { USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; uint32_t len; if (hmsc->bot_state == USBD_BOT_IDLE) { /* Idle */ + if (hmsc->cbw.dDataLength == 0U) { + SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } + /* case 8 : Hi <> Do */ if ((hmsc->cbw.bmFlags & 0x80U) == 0x80U) { SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); @@ -480,11 +717,89 @@ static int8_t SCSI_Write10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *para /* Prepare EP to receive first data packet */ hmsc->bot_state = USBD_BOT_DATA_OUT; - USBD_LL_PrepareReceive(pdev, MSC_OUT_EP, hmsc->bot_data, len); + (void)USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, hmsc->bot_data, len); + } else { + /* Write Process ongoing */ + return SCSI_ProcessWrite(pdev, lun); + } + + return 0; +} + + +/** +* @brief SCSI_Write12 +* Process Write12 command +* @param lun: Logical unit number +* @param params: Command parameters +* @retval status +*/ +static int8_t SCSI_Write12(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +{ + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; + uint32_t len; + + if (hmsc->bot_state == USBD_BOT_IDLE) { + /* Idle */ + if (hmsc->cbw.dDataLength == 0U) { + SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } + + /* case 8 : Hi <> Do */ + if ((hmsc->cbw.bmFlags & 0x80U) == 0x80U) { + SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } + + /* Check whether Media is ready */ + if (msc_storage->IsReady(lun) != 0) { + SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); + hmsc->bot_state = USBD_BOT_NO_DATA; + return -1; + } + + /* Check If media is write-protected */ + if (msc_storage->IsWriteProtected(lun) != 0) { + SCSI_SenseCode(pdev, lun, NOT_READY, WRITE_PROTECTED); + hmsc->bot_state = USBD_BOT_NO_DATA; + return -1; + } + + hmsc->scsi_blk_addr = ((uint32_t)params[2] << 24) | + ((uint32_t)params[3] << 16) | + ((uint32_t)params[4] << 8) | + (uint32_t)params[5]; + + hmsc->scsi_blk_len = ((uint32_t)params[6] << 24) | + ((uint32_t)params[7] << 16) | + ((uint32_t)params[8] << 8) | + (uint32_t)params[9]; + + /* 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 */ + } + + len = hmsc->scsi_blk_len * hmsc->scsi_blk_size; + + /* cases 3,11,13 : Hn,Ho <> D0 */ + if (hmsc->cbw.dDataLength != len) { + SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } + + len = MIN(len, MSC_MEDIA_PACKET); + + /* Prepare EP to receive first data packet */ + hmsc->bot_state = USBD_BOT_DATA_OUT; + (void)USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, hmsc->bot_data, len); } else { /* Write Process ongoing */ return SCSI_ProcessWrite(pdev, lun); } + return 0; } @@ -496,8 +811,7 @@ static int8_t SCSI_Write10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *para * @param params: Command parameters * @retval status */ - -static int8_t SCSI_Verify10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) +static int8_t SCSI_Verify10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) { USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; @@ -510,7 +824,9 @@ static int8_t SCSI_Verify10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *par hmsc->scsi_blk_len) < 0) { return -1; /* error */ } + hmsc->bot_data_length = 0U; + return 0; } @@ -531,6 +847,7 @@ static int8_t SCSI_CheckAddressRange(USBD_HandleTypeDef *pdev, uint8_t lun, SCSI_SenseCode(pdev, lun, ILLEGAL_REQUEST, ADDRESS_OUT_OF_RANGE); return -1; } + return 0; } @@ -540,7 +857,7 @@ static int8_t SCSI_CheckAddressRange(USBD_HandleTypeDef *pdev, uint8_t lun, * @param lun: Logical unit number * @retval status */ -static int8_t SCSI_ProcessRead(USBD_HandleTypeDef *pdev, uint8_t lun) +static int8_t SCSI_ProcessRead(USBD_HandleTypeDef *pdev, uint8_t lun) { USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; uint32_t len = hmsc->scsi_blk_len * hmsc->scsi_blk_size; @@ -555,7 +872,7 @@ static int8_t SCSI_ProcessRead(USBD_HandleTypeDef *pdev, uint8_t lun) return -1; } - USBD_LL_Transmit(pdev, MSC_IN_EP, hmsc->bot_data, len); + (void)USBD_LL_Transmit(pdev, MSC_EPIN_ADDR, hmsc->bot_data, len); hmsc->scsi_blk_addr += (len / hmsc->scsi_blk_size); hmsc->scsi_blk_len -= (len / hmsc->scsi_blk_size); @@ -566,6 +883,7 @@ static int8_t SCSI_ProcessRead(USBD_HandleTypeDef *pdev, uint8_t lun) if (hmsc->scsi_blk_len == 0U) { hmsc->bot_state = USBD_BOT_LAST_DATA_IN; } + return 0; } @@ -575,8 +893,7 @@ static int8_t SCSI_ProcessRead(USBD_HandleTypeDef *pdev, uint8_t lun) * @param lun: Logical unit number * @retval status */ - -static int8_t SCSI_ProcessWrite(USBD_HandleTypeDef *pdev, uint8_t lun) +static int8_t SCSI_ProcessWrite(USBD_HandleTypeDef *pdev, uint8_t lun) { USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; uint32_t len = hmsc->scsi_blk_len * hmsc->scsi_blk_size; @@ -587,7 +904,6 @@ static int8_t SCSI_ProcessWrite(USBD_HandleTypeDef *pdev, uint8_t lun) hmsc->scsi_blk_addr, (len / hmsc->scsi_blk_size)) < 0) { SCSI_SenseCode(pdev, lun, HARDWARE_ERROR, WRITE_FAULT); - return -1; } @@ -601,13 +917,39 @@ static int8_t SCSI_ProcessWrite(USBD_HandleTypeDef *pdev, uint8_t lun) MSC_BOT_SendCSW(pdev, USBD_CSW_CMD_PASSED); } else { len = MIN((hmsc->scsi_blk_len * hmsc->scsi_blk_size), MSC_MEDIA_PACKET); + /* Prepare EP to Receive next packet */ - USBD_LL_PrepareReceive(pdev, MSC_OUT_EP, hmsc->bot_data, len); + (void)USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, hmsc->bot_data, len); } return 0; } + +/** +* @brief SCSI_UpdateBotData +* fill the requested Data to transmit buffer +* @param hmsc handler +* @param params: Data buffer +* @param length: Data length +* @retval status +*/ +static int8_t SCSI_UpdateBotData(USBD_MSC_BOT_HandleTypeDef *hmsc, + uint8_t *pBuff, uint16_t length) +{ + uint16_t len = length; + + hmsc->bot_data_length = len; + + while (len != 0U) { + len--; + hmsc->bot_data[len] = pBuff[len]; + } + + return 0; +} + + #endif /* USBD_USE_MSC_CLASS */ #endif /* USBCON */ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.h b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.h index 3c0d97ac6c..b39ad35c44 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.h +++ b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.h @@ -96,25 +96,19 @@ extern "C" { #define STANDARD_INQUIRY_DATA_LEN 0x24U #define BLKVFY 0x04U -extern uint8_t Page00_Inquiry_Data[]; -extern uint8_t Standard_Inquiry_Data[]; -extern uint8_t Standard_Inquiry_Data2[]; -extern uint8_t Mode_Sense6_data[]; -extern uint8_t Mode_Sense10_data[]; -extern uint8_t Scsi_Sense_Data[]; -extern uint8_t ReadCapacity10_Data[]; -extern uint8_t ReadFormatCapacity_Data []; - +#define SCSI_MEDIUM_UNLOCKED 0x00U +#define SCSI_MEDIUM_LOCKED 0x01U +#define SCSI_MEDIUM_EJECTED 0x02U typedef struct _SENSE_ITEM { - char Skey; + uint8_t Skey; union { struct _ASCs { - char ASC; - char ASCQ; + uint8_t ASC; + uint8_t ASCQ; } b; uint8_t ASC; - char *pData; + uint8_t *pData; } w; } USBD_SCSI_SenseTypeDef; diff --git a/cores/arduino/stm32/usb/usbd_ep_conf.c b/cores/arduino/stm32/usb/usbd_ep_conf.c index 74f4eb44c6..2e72855e5d 100644 --- a/cores/arduino/stm32/usb/usbd_ep_conf.c +++ b/cores/arduino/stm32/usb/usbd_ep_conf.c @@ -44,6 +44,21 @@ }; #endif /* USBD_USE_CDC */ +#ifdef USBD_USE_MSC + #ifdef USE_USB_HS + #define MSC_DATA_MAX_PACKET_SIZE MSC_DATA_HS_MAX_PACKET_SIZE + #else /* USE_USB_FS */ + #define MSC_DATA_MAX_PACKET_SIZE MSC_DATA_FS_MAX_PACKET_SIZE + #endif + + + const ep_desc_t ep_def[] = { + EP_DESC(0x00, CDC_DATA_MAX_PACKET_SIZE, PCD_SNG_BUF), + EP_DESC(0x80, CDC_DATA_MAX_PACKET_SIZE, PCD_SNG_BUF), + EP_DESC(MSC_EPIN_ADDR, MSC_DATA_MAX_PACKET_SIZE, PCD_SNG_BUF), + EP_DESC(MSC_EPOUT_ADDR, MSC_DATA_MAX_PACKET_SIZE, PCD_SNG_BUF) + }; +#endif /* USBD_USE_MSC */ #ifdef USBD_USE_CDC_MSC #ifdef USE_USB_HS @@ -61,8 +76,8 @@ EP_DESC(CDC_OUT_EP, CDC_DATA_MAX_PACKET_SIZE, PCD_DBL_BUF), EP_DESC(CDC_IN_EP, CDC_DATA_MAX_PACKET_SIZE, PCD_SNG_BUF), EP_DESC(CDC_CMD_EP, CDC_CMD_PACKET_SIZE, PCD_SNG_BUF), - EP_DESC(MSC_IN_EP, MSC_DATA_MAX_PACKET_SIZE, PCD_SNG_BUF), - EP_DESC(MSC_OUT_EP, MSC_DATA_MAX_PACKET_SIZE, PCD_SNG_BUF) + EP_DESC(MSC_EPIN_ADDR, MSC_DATA_MAX_PACKET_SIZE, PCD_SNG_BUF), + EP_DESC(MSC_EPOUT_ADDR, MSC_DATA_MAX_PACKET_SIZE, PCD_SNG_BUF) }; #endif /* USBD_USE_CDC */ diff --git a/cores/arduino/stm32/usb/usbd_ep_conf.h b/cores/arduino/stm32/usb/usbd_ep_conf.h index 1243aa73ae..75a458b4d1 100644 --- a/cores/arduino/stm32/usb/usbd_ep_conf.h +++ b/cores/arduino/stm32/usb/usbd_ep_conf.h @@ -51,6 +51,18 @@ typedef struct { #define CDC_CMD_PACKET_SIZE 8U /* Control Endpoint Packet size */ #endif /* USBD_USE_CDC */ +#ifdef USBD_USE_MSC + #define USBD_USE_MSC_CLASS + + #define MSC_EPOUT_ADDR 0x01U /* EP1 for MSC data IN */ + #define MSC_EPIN_ADDR 0x81U /* EP1 for MSC data IN */ + + #define DEV_NUM_EP 0x04U /* Device Endpoints number including EP0 IN and EP0 OUT */ + + /* MSC Endpoints parameters*/ + #define MSC_DATA_HS_MAX_PACKET_SIZE USB_HS_MAX_PACKET_SIZE /* Endpoint IN & OUT Packet size */ + #define MSC_DATA_FS_MAX_PACKET_SIZE USB_FS_MAX_PACKET_SIZE /* Endpoint IN & OUT Packet size */ +#endif #ifdef USBD_USE_CDC_MSC #define USBD_USE_CDC_CLASS @@ -60,8 +72,8 @@ typedef struct { #define CDC_IN_EP 0x81U /* EP1 for CDC data IN */ #define CDC_CMD_EP 0x82U /* EP2 for CDC commands */ - #define MSC_OUT_EP 0x03U /* EP3 for MSC data IN */ - #define MSC_IN_EP 0x83U /* EP3 for MSC data IN */ + #define MSC_EPOUT_ADDR 0x03U /* EP3 for MSC data IN */ + #define MSC_EPIN_ADDR 0x83U /* EP3 for MSC data IN */ #define DEV_NUM_EP 0x07U /* Device Endpoints number including EP0 */ From a7fd6e25c531107ea4939be7290b6d952697777d Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Thu, 4 Jun 2020 12:46:51 +0100 Subject: [PATCH 26/37] fixed ep addresses --- .../stm32/usb/cdc_msc/usbd_cdc_msc.cpp | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp index 20e743aa45..754bc52c65 100644 --- a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp +++ b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp @@ -197,7 +197,7 @@ static uint8_t USBD_COMPOSITE_HSCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { /******************** Mass Storage Endpoints ********************/ 0x07, /* Endpoint descriptor length = 7 */ 0x05, /* Endpoint descriptor type */ - MSC_IN_EP, /* Endpoint address (IN, address 1) */ + MSC_EPIN_ADDR, /* Endpoint address (IN, address 1) */ 0x02, /* Bulk endpoint type */ LOBYTE(MSC_MAX_HS_PACKET), HIBYTE(MSC_MAX_HS_PACKET), @@ -205,7 +205,7 @@ static uint8_t USBD_COMPOSITE_HSCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { 0x07, /* Endpoint descriptor length = 7 */ 0x05, /* Endpoint descriptor type */ - MSC_OUT_EP, /* Endpoint address (OUT, address 1) */ + MSC_EPOUT_ADDR, /* Endpoint address (OUT, address 1) */ 0x02, /* Bulk endpoint type */ LOBYTE(MSC_MAX_HS_PACKET), HIBYTE(MSC_MAX_HS_PACKET), @@ -324,7 +324,7 @@ static uint8_t USBD_COMPOSITE_FSCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { /******************** Mass Storage Endpoints ********************/ 0x07, /* Endpoint descriptor length = 7 */ 0x05, /* Endpoint descriptor type */ - MSC_IN_EP, /* Endpoint address (IN, address 1) */ + MSC_EPIN_ADDR, /* Endpoint address (IN, address 1) */ 0x02, /* Bulk endpoint type */ LOBYTE(MSC_MAX_FS_PACKET), HIBYTE(MSC_MAX_FS_PACKET), @@ -332,7 +332,7 @@ static uint8_t USBD_COMPOSITE_FSCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { 0x07, /* Endpoint descriptor length = 7 */ 0x05, /* Endpoint descriptor type */ - MSC_OUT_EP, /* Endpoint address (OUT, address 1) */ + MSC_EPOUT_ADDR, /* Endpoint address (OUT, address 1) */ 0x02, /* Bulk endpoint type */ LOBYTE(MSC_MAX_FS_PACKET), HIBYTE(MSC_MAX_FS_PACKET), @@ -451,7 +451,7 @@ static uint8_t USBD_COMPOSITE_OtherSpeedCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { /******************** Mass Storage Endpoints ********************/ 0x07, /* Endpoint descriptor length = 7 */ 0x05, /* Endpoint descriptor type */ - MSC_IN_EP, /* Endpoint address (IN, address 1) */ + MSC_EPIN_ADDR, /* Endpoint address (IN, address 1) */ 0x02, /* Bulk endpoint type */ LOBYTE(MSC_MAX_FS_PACKET), HIBYTE(MSC_MAX_FS_PACKET), @@ -459,7 +459,7 @@ static uint8_t USBD_COMPOSITE_OtherSpeedCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { 0x07, /* Endpoint descriptor length = 7 */ 0x05, /* Endpoint descriptor type */ - MSC_OUT_EP, /* Endpoint address (OUT, address 1) */ + MSC_EPOUT_ADDR, /* Endpoint address (OUT, address 1) */ 0x02, /* Bulk endpoint type */ LOBYTE(MSC_MAX_FS_PACKET), HIBYTE(MSC_MAX_FS_PACKET), @@ -561,8 +561,8 @@ static uint8_t USBD_COMPOSITE_Setup(USBD_HandleTypeDef *pdev, case CDC_CMD_EP: return USBD_CDC.Setup(pdev, req); - case MSC_IN_EP: - case MSC_OUT_EP: + case MSC_EPIN_ADDR: + case MSC_EPOUT_ADDR: return USBD_MSC.Setup(pdev, req); // invalid endpoint @@ -644,8 +644,8 @@ static uint8_t USBD_COMPOSITE_DataIn(USBD_HandleTypeDef *pdev, case CDC_OUT_EP: return USBD_CDC.DataIn(pdev, epnum); - case MSC_IN_EP: - case MSC_OUT_EP: + case MSC_EPIN_ADDR: + case MSC_EPOUT_ADDR: return USBD_MSC.DataIn(pdev, epnum); // invalid endpoint @@ -694,8 +694,8 @@ static uint8_t USBD_COMPOSITE_DataOut(USBD_HandleTypeDef *pdev, case CDC_OUT_EP: return USBD_CDC.DataOut(pdev, epnum); - case MSC_IN_EP: - case MSC_OUT_EP: + case MSC_EPIN_ADDR: + case MSC_EPOUT_ADDR: return USBD_MSC.DataOut(pdev, epnum); // invalid endpoint From df73d28f43f61c78c9c611eb206c6e5148a61f85 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Thu, 4 Jun 2020 12:51:28 +0100 Subject: [PATCH 27/37] fixed formatting --- cores/arduino/stm32/usb/cdc/usbd_cdc.c | 28 ++++++++++----------- cores/arduino/stm32/usb/msc/usbd_msc_data.c | 12 +++------ cores/arduino/stm32/usb/msc/usbd_msc_scsi.c | 17 ++++++------- 3 files changed, 25 insertions(+), 32 deletions(-) diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc.c b/cores/arduino/stm32/usb/cdc/usbd_cdc.c index e8d6e982d7..a767e2f831 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc.c +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc.c @@ -441,31 +441,31 @@ static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) (void)USBD_LL_OpenEP(pdev, CDC_IN_EP, USBD_EP_TYPE_BULK, CDC_DATA_HS_IN_PACKET_SIZE); - pdev->ep_in[CDC_IN_EP & 0xFU].is_used = 1U; + pdev->ep_in[CDC_IN_EP & 0xFU].is_used = 1U; - /* Open EP OUT */ - (void)USBD_LL_OpenEP(pdev, CDC_OUT_EP, USBD_EP_TYPE_BULK, - CDC_DATA_HS_OUT_PACKET_SIZE); + /* Open EP OUT */ + (void)USBD_LL_OpenEP(pdev, CDC_OUT_EP, USBD_EP_TYPE_BULK, + CDC_DATA_HS_OUT_PACKET_SIZE); - pdev->ep_out[CDC_OUT_EP & 0xFU].is_used = 1U; + pdev->ep_out[CDC_OUT_EP & 0xFU].is_used = 1U; - /* Set bInterval for CDC CMD Endpoint */ - pdev->ep_in[CDC_CMD_EP & 0xFU].bInterval = CDC_HS_BINTERVAL; + /* Set bInterval for CDC CMD Endpoint */ + pdev->ep_in[CDC_CMD_EP & 0xFU].bInterval = CDC_HS_BINTERVAL; } else { /* Open EP IN */ (void)USBD_LL_OpenEP(pdev, CDC_IN_EP, USBD_EP_TYPE_BULK, CDC_DATA_FS_IN_PACKET_SIZE); - pdev->ep_in[CDC_IN_EP & 0xFU].is_used = 1U; + pdev->ep_in[CDC_IN_EP & 0xFU].is_used = 1U; /* Open EP OUT */ - (void)USBD_LL_OpenEP(pdev, CDC_OUT_EP, USBD_EP_TYPE_BULK, - CDC_DATA_FS_OUT_PACKET_SIZE); + (void)USBD_LL_OpenEP(pdev, CDC_OUT_EP, USBD_EP_TYPE_BULK, + CDC_DATA_FS_OUT_PACKET_SIZE); - pdev->ep_out[CDC_OUT_EP & 0xFU].is_used = 1U; + pdev->ep_out[CDC_OUT_EP & 0xFU].is_used = 1U; - /* Set bInterval for CMD Endpoint */ - pdev->ep_in[CDC_CMD_EP & 0xFU].bInterval = CDC_FS_BINTERVAL; + /* Set bInterval for CMD Endpoint */ + pdev->ep_in[CDC_CMD_EP & 0xFU].bInterval = CDC_FS_BINTERVAL; } /* Open Command IN EP */ @@ -580,7 +580,7 @@ static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, case USB_REQ_GET_INTERFACE: if (pdev->dev_state == USBD_STATE_CONFIGURED) { - (void)USBD_CtlSendData(pdev, &ifalt, 1U); + (void)USBD_CtlSendData(pdev, &ifalt, 1U); } else { USBD_CtlError(pdev, req); ret = USBD_FAIL; diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_data.c b/cores/arduino/stm32/usb/msc/usbd_msc_data.c index a1456d285c..9d788c64ca 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_data.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_data.c @@ -33,8 +33,7 @@ EndBSPDependencies */ /* USB Mass storage Page 0 Inquiry Data */ -uint8_t MSC_Page00_Inquiry_Data[LENGTH_INQUIRY_PAGE00] = -{ +uint8_t MSC_Page00_Inquiry_Data[LENGTH_INQUIRY_PAGE00] = { 0x00, 0x00, 0x00, @@ -44,8 +43,7 @@ uint8_t MSC_Page00_Inquiry_Data[LENGTH_INQUIRY_PAGE00] = }; /* USB Mass storage VPD Page 0x80 Inquiry Data for Unit Serial Number */ -uint8_t MSC_Page80_Inquiry_Data[LENGTH_INQUIRY_PAGE80] = -{ +uint8_t MSC_Page80_Inquiry_Data[LENGTH_INQUIRY_PAGE80] = { 0x00, 0x80, 0x00, @@ -57,8 +55,7 @@ uint8_t MSC_Page80_Inquiry_Data[LENGTH_INQUIRY_PAGE80] = }; /* USB Mass storage sense 6 Data */ -uint8_t MSC_Mode_Sense6_data[MODE_SENSE6_LEN] = -{ +uint8_t MSC_Mode_Sense6_data[MODE_SENSE6_LEN] = { 0x22, 0x00, 0x00, @@ -86,8 +83,7 @@ uint8_t MSC_Mode_Sense6_data[MODE_SENSE6_LEN] = /* USB Mass storage sense 10 Data */ -uint8_t MSC_Mode_Sense10_data[MODE_SENSE10_LEN] = -{ +uint8_t MSC_Mode_Sense10_data[MODE_SENSE10_LEN] = { 0x00, 0x26, 0x00, diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c index 59e62b86f7..ea8e903d10 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c @@ -170,8 +170,7 @@ static int8_t SCSI_TestUnitReady(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t return -1; } - if (msc_storage->IsReady(lun) != 0) - { + if (msc_storage->IsReady(lun) != 0) { SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); hmsc->bot_state = USBD_BOT_NO_DATA; @@ -196,8 +195,7 @@ static int8_t SCSI_Inquiry(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *param uint16_t len; USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; - if (hmsc->cbw.dDataLength == 0U) - { + if (hmsc->cbw.dDataLength == 0U) { SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); return -1; } @@ -293,7 +291,7 @@ static int8_t SCSI_ReadCapacity16(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t hmsc->bot_data_length = ((uint32_t)params[10] << 24) | ((uint32_t)params[11] << 16) | ((uint32_t)params[12] << 8) | - (uint32_t)params[13]; + (uint32_t)params[13]; for (idx = 0U; idx < hmsc->bot_data_length; idx++) { hmsc->bot_data[idx] = 0U; @@ -312,7 +310,7 @@ static int8_t SCSI_ReadCapacity16(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t hmsc->bot_data_length = ((uint32_t)params[10] << 24) | ((uint32_t)params[11] << 16) | ((uint32_t)params[12] << 8) | - (uint32_t)params[13]; + (uint32_t)params[13]; return 0; } @@ -433,8 +431,7 @@ static int8_t SCSI_RequestSense(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t * hmsc->bot_data[0] = 0x70U; hmsc->bot_data[7] = REQUEST_SENSE_DATA_LEN - 6U; - if ((hmsc->scsi_sense_head != hmsc->scsi_sense_tail)) - { + if ((hmsc->scsi_sense_head != hmsc->scsi_sense_tail)) { hmsc->bot_data[2] = (uint8_t)hmsc->scsi_sense[hmsc->scsi_sense_head].Skey; hmsc->bot_data[12] = (uint8_t)hmsc->scsi_sense[hmsc->scsi_sense_head].w.b.ASC; hmsc->bot_data[13] = (uint8_t)hmsc->scsi_sense[hmsc->scsi_sense_head].w.b.ASCQ; @@ -498,8 +495,8 @@ static int8_t SCSI_StartStopUnit(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t return -1; } - if ((params[4] & 0x3U) == 0x1U) /* START=1 */ - { + if ((params[4] & 0x3U) == 0x1U) { + /* START=1 */ hmsc->scsi_medium_state = SCSI_MEDIUM_UNLOCKED; } else if ((params[4] & 0x3U) == 0x2U) { /* START=0 and LOEJ Load Eject=1 */ From 760d8e3c2bd95d4eecb2574e5609924214dc1126 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Thu, 4 Jun 2020 13:46:30 +0100 Subject: [PATCH 28/37] added back cdc clear buffer --- cores/arduino/stm32/usb/cdc/usbd_cdc.c | 2 +- cores/arduino/stm32/usb/cdc/usbd_cdc.h | 3 +++ cores/arduino/stm32/usb/cdc/usbd_cdc_if.c | 8 ++++++++ cores/arduino/stm32/usb/msc/usbd_msc_data.c | 2 +- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc.c b/cores/arduino/stm32/usb/cdc/usbd_cdc.c index a767e2f831..f7b7865a95 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc.c +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc.c @@ -458,7 +458,7 @@ static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) pdev->ep_in[CDC_IN_EP & 0xFU].is_used = 1U; - /* Open EP OUT */ + /* Open EP OUT */ (void)USBD_LL_OpenEP(pdev, CDC_OUT_EP, USBD_EP_TYPE_BULK, CDC_DATA_FS_OUT_PACKET_SIZE); diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc.h b/cores/arduino/stm32/usb/cdc/usbd_cdc.h index 0f4dfd89af..93ce74fbcb 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc.h +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc.h @@ -150,6 +150,9 @@ uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff, uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff); uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev); uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev); + +uint8_t USBD_CDC_ClearBuffer(USBD_HandleTypeDef *pdev); + /** * @} */ diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc_if.c b/cores/arduino/stm32/usb/cdc/usbd_cdc_if.c index c55ece32f7..fa41e06fcf 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc_if.c +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc_if.c @@ -322,6 +322,14 @@ bool CDC_resume_receive(void) return false; } +uint8_t USBD_CDC_ClearBuffer(USBD_HandleTypeDef *pdev) +{ + /* Suspend or Resume USB Out process */ + /* Prepare Out endpoint to receive next packet */ + USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, 0, 0); + return USBD_OK; +} + #endif /* USBD_USE_CDC */ #endif /* USBCON */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_data.c b/cores/arduino/stm32/usb/msc/usbd_msc_data.c index 9d788c64ca..a2ae3c0f31 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_data.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_data.c @@ -52,7 +52,7 @@ uint8_t MSC_Page80_Inquiry_Data[LENGTH_INQUIRY_PAGE80] = { 0x20, 0x20, 0x20 - }; +}; /* USB Mass storage sense 6 Data */ uint8_t MSC_Mode_Sense6_data[MODE_SENSE6_LEN] = { From f7dbf85d03b467382ae080426c184b31ae213ed0 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Thu, 4 Jun 2020 15:21:58 +0100 Subject: [PATCH 29/37] remove reference to userdata --- cores/arduino/stm32/usb/cdc/usbd_cdc.c | 2 +- cores/arduino/stm32/usb/msc/usbd_msc_scsi.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc.c b/cores/arduino/stm32/usb/cdc/usbd_cdc.c index f7b7865a95..8523cf43f6 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc.c +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc.c @@ -680,7 +680,7 @@ static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev) { USBD_CDC_HandleTypeDef *hcdc = cdc_handle; - if ((pdev->pUserData != NULL) && (hcdc->CmdOpCode != 0xFFU)) { + if ((hcdc->CmdOpCode != 0xFFU)) { cdc_itf->Control(hcdc->CmdOpCode, (uint8_t *)hcdc->data, (uint16_t)hcdc->CmdLength); diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c index ea8e903d10..fe80bf50dd 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c @@ -562,7 +562,7 @@ static int8_t SCSI_Read10(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params return -1; } - if (((USBD_StorageTypeDef *)pdev->pUserData)->IsReady(lun) != 0) { + if (msc_storage->IsReady(lun) != 0) { SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); return -1; } From 6d0023f772f2d98dd77933104948a5290c9c09e4 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Thu, 4 Jun 2020 15:41:19 +0100 Subject: [PATCH 30/37] fixed pointer error and warning --- cores/arduino/stm32/usb/cdc/usbd_cdc.c | 1 + cores/arduino/stm32/usb/msc/usbd_msc_scsi.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc.c b/cores/arduino/stm32/usb/cdc/usbd_cdc.c index 8523cf43f6..6c1945f23d 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc.c +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc.c @@ -431,6 +431,7 @@ int cdcInitialized; static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) { UNUSED(cfgidx); + UNUSED(ret); USBD_CDC_HandleTypeDef *hcdc = cdc_handle; diff --git a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c index fe80bf50dd..269bc30ff4 100644 --- a/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c +++ b/cores/arduino/stm32/usb/msc/usbd_msc_scsi.c @@ -71,7 +71,7 @@ static int8_t SCSI_UpdateBotData(USBD_MSC_BOT_HandleTypeDef *hmsc, int8_t SCSI_ProcessCmd(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *cmd) { int8_t ret; - USBD_MSC_BOT_HandleTypeDef *hmsc = msc_storage; + USBD_MSC_BOT_HandleTypeDef *hmsc = msc_handle; switch (cmd[0]) { case SCSI_TEST_UNIT_READY: From 4d0f56282a12d6a196dc097597a5b8ba5fa1a46e Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Thu, 4 Jun 2020 18:08:15 +0100 Subject: [PATCH 31/37] changes to cdc msc interface definitions --- .../stm32/usb/cdc_msc/usbd_cdc_msc.cpp | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp index 754bc52c65..3ab66d91ab 100644 --- a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp +++ b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp @@ -108,13 +108,13 @@ static uint8_t USBD_COMPOSITE_HSCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { 0x09, /* bLength: Interface Descriptor size */ USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ /* Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ + CDC_ACM_INTERFACE, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x01, /* bNumEndpoints: One endpoints used */ 0x02, /* bInterfaceClass: Communication Interface Class */ 0x02, /* bInterfaceSubClass: Abstract Control Model */ 0x01, /* bInterfaceProtocol: Common AT commands */ - 0x00, /* iInterface: */ + 0x05, /* iInterface: */ /*Header Functional Descriptor*/ 0x05, /* bLength: Endpoint Descriptor size */ @@ -128,7 +128,7 @@ static uint8_t USBD_COMPOSITE_HSCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { 0x24, /* bDescriptorType: CS_INTERFACE */ 0x01, /* bDescriptorSubtype: Call Management Func Desc */ 0x00, /* bmCapabilities: D0+D1 */ - 0x01, /* bDataInterface: 1 */ + CDC_COM_INTERFACE, /* bDataInterface: 1 */ /*ACM Functional Descriptor*/ 0x04, /* bFunctionLength */ @@ -140,8 +140,8 @@ static uint8_t USBD_COMPOSITE_HSCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { 0x05, /* bFunctionLength */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x06, /* bDescriptorSubtype: Union func desc */ - 0x00, /* bMasterInterface: Communication class interface */ - 0x01, /* bSlaveInterface0: Data Class Interface */ + CDC_ACM_INTERFACE, /* bMasterInterface: Communication class interface */ + CDC_COM_INTERFACE, /* bSlaveInterface0: Data Class Interface */ /*Endpoint 2 Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ @@ -156,13 +156,13 @@ static uint8_t USBD_COMPOSITE_HSCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { /*Data class interface descriptor*/ 0x09, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - 0x01, /* bInterfaceNumber: Number of Interface */ + CDC_COM_INTERFACE, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints: Two endpoints used */ 0x0A, /* bInterfaceClass: CDC */ 0x00, /* bInterfaceSubClass: */ 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ + 0x05, /* iInterface: */ /*Endpoint OUT Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ @@ -186,7 +186,7 @@ static uint8_t USBD_COMPOSITE_HSCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { /******************** Mass Storage interface ********************/ 0x09, /* bLength: Interface Descriptor size */ 0x04, /* bDescriptorType: */ - 0x02, /* bInterfaceNumber: Number of Interface */ + MSC_INTERFACE, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints */ 0x08, /* bInterfaceClass: MSC Class */ @@ -235,13 +235,13 @@ static uint8_t USBD_COMPOSITE_FSCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { 0x09, /* bLength: Interface Descriptor size */ USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ /* Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ + CDC_ACM_INTERFACE, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x01, /* bNumEndpoints: One endpoints used */ 0x02, /* bInterfaceClass: Communication Interface Class */ 0x02, /* bInterfaceSubClass: Abstract Control Model */ 0x01, /* bInterfaceProtocol: Common AT commands */ - 0x00, /* iInterface: */ + 0x05, /* iInterface: */ /*Header Functional Descriptor*/ 0x05, /* bLength: Endpoint Descriptor size */ @@ -267,29 +267,29 @@ static uint8_t USBD_COMPOSITE_FSCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { 0x05, /* bFunctionLength */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x06, /* bDescriptorSubtype: Union func desc */ - 0x00, /* bMasterInterface: Communication class interface */ - 0x01, /* bSlaveInterface0: Data Class Interface */ + CDC_ACM_INTERFACE, /* bMasterInterface: Communication class interface */ + CDC_COM_INTERFACE, /* bSlaveInterface0: Data Class Interface */ /*Endpoint 2 Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ CDC_CMD_EP, /* bEndpointAddress */ 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_FS_BINTERVAL, /* bInterval: */ + CDC_FS_BINTERVAL, /* bInterval: */ /*---------------------------------------------------------------------------*/ /*Data class interface descriptor*/ 0x09, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - 0x01, /* bInterfaceNumber: Number of Interface */ + CDC_COM_INTERFACE, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints: Two endpoints used */ 0x0A, /* bInterfaceClass: CDC */ 0x00, /* bInterfaceSubClass: */ 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ + 0x05, /* iInterface: */ /*Endpoint OUT Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ @@ -313,7 +313,7 @@ static uint8_t USBD_COMPOSITE_FSCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { /******************** Mass Storage interface ********************/ 0x09, /* bLength: Interface Descriptor size */ 0x04, /* bDescriptorType: */ - 0x02, /* bInterfaceNumber: Number of Interface */ + MSC_INTERFACE, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints */ 0x08, /* bInterfaceClass: MSC Class */ @@ -362,13 +362,13 @@ static uint8_t USBD_COMPOSITE_OtherSpeedCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { 0x09, /* bLength: Interface Descriptor size */ USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ /* Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ + CDC_ACM_INTERFACE, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x01, /* bNumEndpoints: One endpoints used */ 0x02, /* bInterfaceClass: Communication Interface Class */ 0x02, /* bInterfaceSubClass: Abstract Control Model */ 0x01, /* bInterfaceProtocol: Common AT commands */ - 0x00, /* iInterface: */ + 0x05, /* iInterface: */ /*Header Functional Descriptor*/ 0x05, /* bLength: Endpoint Descriptor size */ @@ -394,8 +394,8 @@ static uint8_t USBD_COMPOSITE_OtherSpeedCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { 0x05, /* bFunctionLength */ 0x24, /* bDescriptorType: CS_INTERFACE */ 0x06, /* bDescriptorSubtype: Union func desc */ - 0x00, /* bMasterInterface: Communication class interface */ - 0x01, /* bSlaveInterface0: Data Class Interface */ + CDC_ACM_INTERFACE, /* bMasterInterface: Communication class interface */ + CDC_COM_INTERFACE, /* bSlaveInterface0: Data Class Interface */ /*Endpoint 2 Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ @@ -410,13 +410,13 @@ static uint8_t USBD_COMPOSITE_OtherSpeedCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { /*Data class interface descriptor*/ 0x09, /* bLength: Endpoint Descriptor size */ USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - 0x01, /* bInterfaceNumber: Number of Interface */ + CDC_COM_INTERFACE, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints: Two endpoints used */ 0x0A, /* bInterfaceClass: CDC */ 0x00, /* bInterfaceSubClass: */ 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ + 0x05, /* iInterface: */ /*Endpoint OUT Descriptor*/ 0x07, /* bLength: Endpoint Descriptor size */ @@ -440,7 +440,7 @@ static uint8_t USBD_COMPOSITE_OtherSpeedCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { /******************** Mass Storage interface ********************/ 0x09, /* bLength: Interface Descriptor size */ 0x04, /* bDescriptorType: */ - 0x02, /* bInterfaceNumber: Number of Interface */ + MSC_INTERFACE, /* bInterfaceNumber: Number of Interface */ 0x00, /* bAlternateSetting: Alternate setting */ 0x02, /* bNumEndpoints */ 0x08, /* bInterfaceClass: MSC Class */ From b29c3ea6dc83ea3bf959aa8ca6e4b3dd062cd10b Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Thu, 4 Jun 2020 18:09:47 +0100 Subject: [PATCH 32/37] remove SOF from MSC+CDC --- cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp index 3ab66d91ab..5f22361fd6 100644 --- a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp +++ b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp @@ -66,7 +66,6 @@ static uint8_t USBD_COMPOSITE_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); static uint8_t USBD_COMPOSITE_EP0_RxReady(USBD_HandleTypeDef *pdev); -static uint8_t USBD_COMPOSITE_SOF(USBD_HandleTypeDef *pdev); USBD_ClassTypeDef USBD_CDC_MSC = { USBD_COMPOSITE_Init, @@ -76,7 +75,7 @@ USBD_ClassTypeDef USBD_CDC_MSC = { USBD_COMPOSITE_EP0_RxReady, USBD_COMPOSITE_DataIn, USBD_COMPOSITE_DataOut, - USBD_COMPOSITE_SOF, + nullptr, nullptr, nullptr, USBD_COMPOSITE_GetHSCfgDesc, @@ -666,18 +665,6 @@ static uint8_t USBD_COMPOSITE_EP0_RxReady(USBD_HandleTypeDef *pdev) return USBD_CDC.EP0_RxReady(pdev); } -/** - * @brief USBD_COMPOSITE_SOF - * handle SOF event - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_COMPOSITE_SOF(USBD_HandleTypeDef *pdev) -{ - // only needed for CDC - return USBD_CDC.SOF(pdev); -} - /** * @brief USBD_COMPOSITE_DataOut * handle data OUT Stage From 2207a41855b03bf4011f47b0f4c276a320467d75 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Thu, 4 Jun 2020 18:33:59 +0000 Subject: [PATCH 33/37] further changes during merging --- cores/arduino/stm32/usb/cdc/usbd_cdc.c | 13 ++++++++++++- cores/arduino/stm32/usb/cdc/usbd_cdc.h | 3 +-- cores/arduino/stm32/usb/cdc/usbd_cdc_if.c | 10 +--------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc.c b/cores/arduino/stm32/usb/cdc/usbd_cdc.c index 6c1945f23d..f76e248bb4 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc.c +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc.c @@ -431,7 +431,6 @@ int cdcInitialized; static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) { UNUSED(cfgidx); - UNUSED(ret); USBD_CDC_HandleTypeDef *hcdc = cdc_handle; @@ -857,6 +856,18 @@ uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev) return (uint8_t)USBD_OK; } +uint8_t USBD_CDC_ClearBuffer(USBD_HandleTypeDef *pdev) +{ + /* Suspend or Resume USB Out process */ + if (pdev->pClassData != NULL) { + /* Prepare Out endpoint to receive next packet */ + USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, 0, 0); + return (uint8_t)USBD_OK; + } else { + return (uint8_t)USBD_FAIL; + } +} + #endif /* USBD_USE_CDC_CLASS */ #endif /* USBCON */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc.h b/cores/arduino/stm32/usb/cdc/usbd_cdc.h index 93ce74fbcb..5a9bce8606 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc.h +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc.h @@ -150,8 +150,7 @@ uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff, uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff); uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev); uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev); - -uint8_t USBD_CDC_ClearBuffer(USBD_HandleTypeDef *pdev); +uint8_t USBD_CDC_ClearBuffer(USBD_HandleTypeDef *pdev); /** * @} diff --git a/cores/arduino/stm32/usb/cdc/usbd_cdc_if.c b/cores/arduino/stm32/usb/cdc/usbd_cdc_if.c index fa41e06fcf..6b731641b4 100644 --- a/cores/arduino/stm32/usb/cdc/usbd_cdc_if.c +++ b/cores/arduino/stm32/usb/cdc/usbd_cdc_if.c @@ -242,7 +242,7 @@ static int8_t USBD_CDC_Receive(uint8_t *Buf, uint32_t *Len) /** - * @brief TEMPLATE_TransmitCplt + * @brief USBD_CDC_TransmitCplt * Data transmited callback * * @note @@ -322,14 +322,6 @@ bool CDC_resume_receive(void) return false; } -uint8_t USBD_CDC_ClearBuffer(USBD_HandleTypeDef *pdev) -{ - /* Suspend or Resume USB Out process */ - /* Prepare Out endpoint to receive next packet */ - USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, 0, 0); - return USBD_OK; -} - #endif /* USBD_USE_CDC */ #endif /* USBCON */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ From a34101102e58d443951c2bd2cd47843b48ccf598 Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Thu, 4 Jun 2020 20:13:16 +0100 Subject: [PATCH 34/37] set cdc usb handle to usb handle --- cores/arduino/USB.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/cores/arduino/USB.cpp b/cores/arduino/USB.cpp index 8f16e1e9ea..1b2dfaca24 100644 --- a/cores/arduino/USB.cpp +++ b/cores/arduino/USB.cpp @@ -89,6 +89,7 @@ void USB::initialize() #endif #ifdef USBD_USE_CDC_CLASS + hUSBD_Device_CDC = &hUSBD_Device; if (USBD_CDC_RegisterInterface(&hUSBD_Device, &USBD_CDC_fops) != USBD_OK) { return; } From 8709e8f9afeb9b6e0c9c73d734ba5bd14bd7db0a Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Sun, 7 Jun 2020 11:18:47 +0000 Subject: [PATCH 35/37] refactored cdc msc descriptor and fixed for windowsn --- .../stm32/usb/cdc_msc/usbd_cdc_msc.cpp | 527 ++++++------------ .../arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h | 2 +- cores/arduino/stm32/usb/usbd_desc.c | 110 ++-- 3 files changed, 207 insertions(+), 432 deletions(-) diff --git a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp index 5f22361fd6..419be31e05 100644 --- a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp +++ b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp @@ -84,131 +84,141 @@ USBD_ClassTypeDef USBD_CDC_MSC = { USBD_COMPOSITE_GetDeviceQualifierDesc, }; + +#define EP_ATTR_BULK 0x02 +#define EP_ATTR_INTERRUPT 0x03 + +#define IF_CLASS_COMM 0x02 +#define IF_CLASS_CDC 0x0A +#define IF_CLASS_MSC 0x08 + +#define IF_SUBCLASS_NONE 0x00 +#define IF_SUBCLASS_ACM 0x02 +#define IF_SUBCLASS_SCSI_TRANSPARENT 0x06 + +#define ENDPOINT_DESCRIPTOR(_EP_ADDR, _ATTR, _PACKET_SIZE, _BINTERVAL) \ + 0x07, /* bLength: Endpoint Descriptor size */ \ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ \ + _EP_ADDR, /* bEndpointAddress */ \ + _ATTR, /* bmAttributes: Interrupt */ \ + LOBYTE(_PACKET_SIZE), /* wMaxPacketSize: */ \ + HIBYTE(_PACKET_SIZE), \ + _BINTERVAL /* bInterval: */ + + +/* ACM Interface Descriptor */ +#define INTERFACE_DESCRIPTOR(_IF_NUM, _EP_COUNT, _CLASS, _SUBCLASS, _PROT) \ + 0x09, /* bLength: Interface Descriptor size */ \ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ \ + /* Interface descriptor type */ \ + _IF_NUM, /* bInterfaceNumber: Number of Interface */ \ + 0x00, /* bAlternateSetting: Alternate setting */ \ + _EP_COUNT, /* bNumEndpoints: One endpoints used */ \ + _CLASS, /* bInterfaceClass: Communication Interface Class */ \ + _SUBCLASS, /* bInterfaceSubClass: Abstract Control Model */ \ + _PROT, /* bInterfaceProtocol: Common AT commands */ \ + 0x05 /* iInterface: */ + + + +#define USB_DESC_TYPE_INTERFACE_ASSOC_DESC 0x0B + +#define CONFIGURATION_DESCRIPTOR() \ + 0x09, /* bLength: Configuation Descriptor size */ \ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ \ + USB_CDC_MSC_CONFIG_DESC_SIZ, /* wTotalLength: Bytes returned */ \ + 0x00, \ + 0x03, /*bNumInterfaces: 3 interface*/ \ + 0x01, /*bConfigurationValue: Configuration value*/ \ + 0x02, /*iConfiguration: Index of string descriptor describing the configuration*/ \ + 0xC0, /*bmAttributes: bus powered and Supports Remote Wakeup */ \ + 0x32 /*MaxPower 100 mA: this current is used for detecting Vbus*/ +/* 09 */ + +/******** IAD should be positioned just before the CDC interfaces ****** + IAD to associate the two CDC interfaces */ +#define IAD_DESCRIPTOR() \ + 0x08, /* bLength: Interface Descriptor size */ \ + USB_DESC_TYPE_INTERFACE_ASSOC_DESC, /* bDescriptorType: Interface */ \ + 0x00, /* bFirstInterface */ \ + 0x02, /* bInterfaceCount */ \ + 0x02, /* bFunctionClass */ \ + 0x02, /* bFunctionSubClass */ \ + 0x01, /* bFunctionProtocol */ \ + 0x04 /* iFunction (Index of string descriptor describing this function) */ +/* 08 */ + +/* ACM Interface Descriptor */ +#define ACM_INTERFACE_DESCRIPTOR() INTERFACE_DESCRIPTOR(CDC_ACM_INTERFACE, 0x01, IF_CLASS_COMM, IF_SUBCLASS_ACM, 0x01) + +/* Header Functional Descriptor */ +#define ACM_HEADER_FUNCTIONAL_DESCRIPTOR() \ + 0x05, /* bLength: Endpoint Descriptor size */ \ + 0x24, /* bDescriptorType: CS_INTERFACE */ \ + 0x00, /* bDescriptorSubtype: Header Func Desc */ \ + 0x10, /* bcdCDC: spec release number */ \ + 0x01 + +/* ACM Call Management Functional Descriptor */ +#define ACM_CALL_MANAGEMENT_FUNCTIONAL_DESCRIPTOR() \ + 0x05, /* bFunctionLength */ \ + 0x24, /* bDescriptorType: CS_INTERFACE */ \ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ \ + 0x00, /* bmCapabilities: D0+D1 */ \ + CDC_COM_INTERFACE /* bDataInterface: 1 */ \ + +/* ACM Functional Descriptor */ +#define ACM_FUNCTIONAL_DESCRIPTOR() \ + 0x04, /* bFunctionLength */ \ + 0x24, /* bDescriptorType: CS_INTERFACE */ \ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ \ + 0x02 /* bmCapabilities */ + +#define ACM_UNION_FUNCTIONAL_DESCRIPTOR() \ + 0x05, /* bFunctionLength */ \ + 0x24, /* bDescriptorType: CS_INTERFACE */ \ + 0x06, /* bDescriptorSubtype: Union func desc */ \ + CDC_ACM_INTERFACE, /* bMasterInterface: Communication class interface */ \ + CDC_COM_INTERFACE /* bSlaveInterface0: Data Class Interface */ + +#define ACM_EP_DESCRIPTOR(_BINTERVAL) ENDPOINT_DESCRIPTOR(CDC_CMD_EP, EP_ATTR_INTERRUPT, CDC_CMD_PACKET_SIZE, _BINTERVAL) + +#define CDC_INTERFACE_DESCRIPTOR() INTERFACE_DESCRIPTOR(CDC_COM_INTERFACE, 0x02, IF_CLASS_CDC, IF_SUBCLASS_NONE, 0x00) +#define CDC_EP_OUT_DESCRIPTOR(_PACKET_SIZE) ENDPOINT_DESCRIPTOR(CDC_OUT_EP, EP_ATTR_BULK, _PACKET_SIZE, 0x00) +#define CDC_EP_IN_DESCRIPTOR(_PACKET_SIZE) ENDPOINT_DESCRIPTOR(CDC_IN_EP, EP_ATTR_BULK, _PACKET_SIZE, 0x00) + +#define MSC_INTERFACE_DESCRIPTOR() INTERFACE_DESCRIPTOR(MSC_INTERFACE, 0x02, IF_CLASS_MSC, IF_SUBCLASS_SCSI_TRANSPARENT, 0x50) +#define MSC_EP_IN_DESCRIPTOR(_PACKET_SIZE) ENDPOINT_DESCRIPTOR(MSC_EPIN_ADDR, EP_ATTR_BULK, _PACKET_SIZE, 0x00) +#define MSC_EP_OUT_DESCRIPTOR(_PACKET_SIZE) ENDPOINT_DESCRIPTOR(MSC_EPOUT_ADDR, EP_ATTR_BULK, _PACKET_SIZE, 0x00) + + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ #pragma data_alignment=4 #endif -/* USB COMPOSITE device Configuration Descriptor */ -static uint8_t USBD_COMPOSITE_HSCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { - 0x09, /* bLength: Configuation Descriptor size */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - USB_CDC_MSC_CONFIG_DESC_SIZ, - /* wTotalLength: Bytes returned */ - 0x00, - 0x03, /*bNumInterfaces: 3 interface*/ - 0x01, /*bConfigurationValue: Configuration value*/ - 0x02, /*iConfiguration: Index of string descriptor describing the configuration*/ - 0xC0, /*bmAttributes: bus powered and Supports Remote Wakeup */ - 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ - /* 09 */ - - /*---------------------------------------------------------------------------*/ - - /*Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - /* Interface descriptor type */ - CDC_ACM_INTERFACE, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - 0x05, /* iInterface: */ - - /*Header Functional Descriptor*/ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /*Call Management Functional Descriptor*/ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - CDC_COM_INTERFACE, /* bDataInterface: 1 */ - - /*ACM Functional Descriptor*/ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /*Union Functional Descriptor*/ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - CDC_ACM_INTERFACE, /* bMasterInterface: Communication class interface */ - CDC_COM_INTERFACE, /* bSlaveInterface0: Data Class Interface */ - - /*Endpoint 2 Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_HS_BINTERVAL, /* bInterval: */ - /*---------------------------------------------------------------------------*/ - - /*Data class interface descriptor*/ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - CDC_COM_INTERFACE, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x05, /* iInterface: */ - - /*Endpoint OUT Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ - - /*Endpoint IN Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), - 0x00, - /******************** Mass Storage interface ********************/ - 0x09, /* bLength: Interface Descriptor size */ - 0x04, /* bDescriptorType: */ - MSC_INTERFACE, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints */ - 0x08, /* bInterfaceClass: MSC Class */ - 0x06, /* bInterfaceSubClass : SCSI transparent */ - 0x50, /* nInterfaceProtocol */ - 0x05, /* iInterface: */ - - /******************** Mass Storage Endpoints ********************/ - 0x07, /* Endpoint descriptor length = 7 */ - 0x05, /* Endpoint descriptor type */ - MSC_EPIN_ADDR, /* Endpoint address (IN, address 1) */ - 0x02, /* Bulk endpoint type */ - LOBYTE(MSC_MAX_HS_PACKET), - HIBYTE(MSC_MAX_HS_PACKET), - 0x00, /* Polling interval in milliseconds */ - - 0x07, /* Endpoint descriptor length = 7 */ - 0x05, /* Endpoint descriptor type */ - MSC_EPOUT_ADDR, /* Endpoint address (OUT, address 1) */ - 0x02, /* Bulk endpoint type */ - LOBYTE(MSC_MAX_HS_PACKET), - HIBYTE(MSC_MAX_HS_PACKET), - 0x00 /* Polling interval in milliseconds */ +/* USB COMPOSITE device Configuration Descriptor */ +#if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 +#endif +static uint8_t USBD_COMPOSITE_HSCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { + CONFIGURATION_DESCRIPTOR(), + IAD_DESCRIPTOR(), + + ACM_INTERFACE_DESCRIPTOR(), + ACM_HEADER_FUNCTIONAL_DESCRIPTOR(), + ACM_CALL_MANAGEMENT_FUNCTIONAL_DESCRIPTOR(), + ACM_FUNCTIONAL_DESCRIPTOR(), + ACM_UNION_FUNCTIONAL_DESCRIPTOR(), + ACM_EP_DESCRIPTOR(CDC_HS_BINTERVAL), + + CDC_INTERFACE_DESCRIPTOR(), + CDC_EP_OUT_DESCRIPTOR(CDC_DATA_HS_MAX_PACKET_SIZE), + CDC_EP_IN_DESCRIPTOR(CDC_DATA_HS_MAX_PACKET_SIZE), + + MSC_INTERFACE_DESCRIPTOR(), + MSC_EP_IN_DESCRIPTOR(MSC_MAX_HS_PACKET), + MSC_EP_OUT_DESCRIPTOR(MSC_MAX_HS_PACKET) }; #if defined ( __ICCARM__ ) /*!< IAR Compiler */ @@ -216,253 +226,48 @@ static uint8_t USBD_COMPOSITE_HSCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { #endif /* USB COMPOSITE device Configuration Descriptor */ static uint8_t USBD_COMPOSITE_FSCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { - 0x09, /* bLength: Configuation Descriptor size */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - USB_CDC_MSC_CONFIG_DESC_SIZ, - /* wTotalLength: Bytes returned */ - 0x00, - 0x03, /*bNumInterfaces: 3 interface*/ - 0x01, /*bConfigurationValue: Configuration value*/ - 0x02, /*iConfiguration: Index of string descriptor describing the configuration*/ - 0xC0, /*bmAttributes: bus powered and Supports Remote Wakeup */ - 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ - /* 09 */ - - /*---------------------------------------------------------------------------*/ - - /*Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - /* Interface descriptor type */ - CDC_ACM_INTERFACE, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - 0x05, /* iInterface: */ - - /*Header Functional Descriptor*/ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /*Call Management Functional Descriptor*/ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - 0x01, /* bDataInterface: 1 */ - - /*ACM Functional Descriptor*/ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /*Union Functional Descriptor*/ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - CDC_ACM_INTERFACE, /* bMasterInterface: Communication class interface */ - CDC_COM_INTERFACE, /* bSlaveInterface0: Data Class Interface */ - - /*Endpoint 2 Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_FS_BINTERVAL, /* bInterval: */ - /*---------------------------------------------------------------------------*/ - - /*Data class interface descriptor*/ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - CDC_COM_INTERFACE, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x05, /* iInterface: */ - - /*Endpoint OUT Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ - - /*Endpoint IN Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, - - - /******************** Mass Storage interface ********************/ - 0x09, /* bLength: Interface Descriptor size */ - 0x04, /* bDescriptorType: */ - MSC_INTERFACE, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints */ - 0x08, /* bInterfaceClass: MSC Class */ - 0x06, /* bInterfaceSubClass : SCSI transparent */ - 0x50, /* nInterfaceProtocol */ - 0x05, /* iInterface: */ - - /******************** Mass Storage Endpoints ********************/ - 0x07, /* Endpoint descriptor length = 7 */ - 0x05, /* Endpoint descriptor type */ - MSC_EPIN_ADDR, /* Endpoint address (IN, address 1) */ - 0x02, /* Bulk endpoint type */ - LOBYTE(MSC_MAX_FS_PACKET), - HIBYTE(MSC_MAX_FS_PACKET), - 0x00, /* Polling interval in milliseconds */ - - 0x07, /* Endpoint descriptor length = 7 */ - 0x05, /* Endpoint descriptor type */ - MSC_EPOUT_ADDR, /* Endpoint address (OUT, address 1) */ - 0x02, /* Bulk endpoint type */ - LOBYTE(MSC_MAX_FS_PACKET), - HIBYTE(MSC_MAX_FS_PACKET), - 0x00 /* Polling interval in milliseconds */ + CONFIGURATION_DESCRIPTOR(), + IAD_DESCRIPTOR(), + + ACM_INTERFACE_DESCRIPTOR(), + ACM_HEADER_FUNCTIONAL_DESCRIPTOR(), + ACM_CALL_MANAGEMENT_FUNCTIONAL_DESCRIPTOR(), + ACM_FUNCTIONAL_DESCRIPTOR(), + ACM_UNION_FUNCTIONAL_DESCRIPTOR(), + ACM_EP_DESCRIPTOR(CDC_FS_BINTERVAL), + + CDC_INTERFACE_DESCRIPTOR(), + CDC_EP_OUT_DESCRIPTOR(CDC_DATA_FS_MAX_PACKET_SIZE), + CDC_EP_IN_DESCRIPTOR(CDC_DATA_FS_MAX_PACKET_SIZE), + + MSC_INTERFACE_DESCRIPTOR(), + MSC_EP_IN_DESCRIPTOR(MSC_MAX_FS_PACKET), + MSC_EP_OUT_DESCRIPTOR(MSC_MAX_FS_PACKET) }; + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ - #pragma data_alignment=4 +#pragma data_alignment=4 #endif /* USB COMPOSITE device Configuration Descriptor */ static uint8_t USBD_COMPOSITE_OtherSpeedCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { - 0x09, /* bLength: Configuation Descriptor size */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - USB_CDC_MSC_CONFIG_DESC_SIZ, - /* wTotalLength: Bytes returned */ - 0x00, - 0x03, /*bNumInterfaces: 3 interface*/ - 0x01, /*bConfigurationValue: Configuration value*/ - 0x02, /*iConfiguration: Index of string descriptor describing the configuration*/ - 0xC0, /*bmAttributes: bus powered and Supports Remote Wakeup */ - 0x32, /*MaxPower 100 mA: this current is used for detecting Vbus*/ - /* 09 */ - - /*---------------------------------------------------------------------------*/ - - /*Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - /* Interface descriptor type */ - CDC_ACM_INTERFACE, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - 0x05, /* iInterface: */ - - /*Header Functional Descriptor*/ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /*Call Management Functional Descriptor*/ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - 0x01, /* bDataInterface: 1 */ - - /*ACM Functional Descriptor*/ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /*Union Functional Descriptor*/ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - CDC_ACM_INTERFACE, /* bMasterInterface: Communication class interface */ - CDC_COM_INTERFACE, /* bSlaveInterface0: Data Class Interface */ - - /*Endpoint 2 Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_FS_BINTERVAL, /* bInterval: */ - /*---------------------------------------------------------------------------*/ - - /*Data class interface descriptor*/ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - CDC_COM_INTERFACE, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x05, /* iInterface: */ - - /*Endpoint OUT Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ - - /*Endpoint IN Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, - - - /******************** Mass Storage interface ********************/ - 0x09, /* bLength: Interface Descriptor size */ - 0x04, /* bDescriptorType: */ - MSC_INTERFACE, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints */ - 0x08, /* bInterfaceClass: MSC Class */ - 0x06, /* bInterfaceSubClass : SCSI transparent */ - 0x50, /* nInterfaceProtocol */ - 0x05, /* iInterface: */ - - /******************** Mass Storage Endpoints ********************/ - 0x07, /* Endpoint descriptor length = 7 */ - 0x05, /* Endpoint descriptor type */ - MSC_EPIN_ADDR, /* Endpoint address (IN, address 1) */ - 0x02, /* Bulk endpoint type */ - LOBYTE(MSC_MAX_FS_PACKET), - HIBYTE(MSC_MAX_FS_PACKET), - 0x00, /* Polling interval in milliseconds */ - - 0x07, /* Endpoint descriptor length = 7 */ - 0x05, /* Endpoint descriptor type */ - MSC_EPOUT_ADDR, /* Endpoint address (OUT, address 1) */ - 0x02, /* Bulk endpoint type */ - LOBYTE(MSC_MAX_FS_PACKET), - HIBYTE(MSC_MAX_FS_PACKET), - 0x00 /* Polling interval in milliseconds */ + CONFIGURATION_DESCRIPTOR(), + IAD_DESCRIPTOR(), + + ACM_INTERFACE_DESCRIPTOR(), + ACM_HEADER_FUNCTIONAL_DESCRIPTOR(), + ACM_CALL_MANAGEMENT_FUNCTIONAL_DESCRIPTOR(), + ACM_FUNCTIONAL_DESCRIPTOR(), + ACM_UNION_FUNCTIONAL_DESCRIPTOR(), + ACM_EP_DESCRIPTOR(CDC_FS_BINTERVAL), + + CDC_INTERFACE_DESCRIPTOR(), + CDC_EP_OUT_DESCRIPTOR(CDC_DATA_FS_MAX_PACKET_SIZE), + CDC_EP_IN_DESCRIPTOR(CDC_DATA_FS_MAX_PACKET_SIZE), + + MSC_INTERFACE_DESCRIPTOR(), + MSC_EP_IN_DESCRIPTOR(MSC_MAX_FS_PACKET), + MSC_EP_OUT_DESCRIPTOR(MSC_MAX_FS_PACKET) }; diff --git a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h index ffe43f6fa2..e8110535d8 100644 --- a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h +++ b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.h @@ -30,7 +30,7 @@ #define CDC_COM_INTERFACE 0x1 #define MSC_INTERFACE 0x2 -#define USB_CDC_MSC_CONFIG_DESC_SIZ (USB_CDC_CONFIG_DESC_SIZ - 9 + USB_MSC_CONFIG_DESC_SIZ) +#define USB_CDC_MSC_CONFIG_DESC_SIZ (USB_CDC_CONFIG_DESC_SIZ - 9 + 8 + USB_MSC_CONFIG_DESC_SIZ) extern USBD_ClassTypeDef USBD_CDC_MSC; diff --git a/cores/arduino/stm32/usb/usbd_desc.c b/cores/arduino/stm32/usb/usbd_desc.c index b9ba7cabae..883557a98a 100644 --- a/cores/arduino/stm32/usb/usbd_desc.c +++ b/cores/arduino/stm32/usb/usbd_desc.c @@ -129,81 +129,51 @@ USBD_DescriptorsTypeDef USBD_Desc = { #endif }; -#ifdef USBD_USE_HID_COMPOSITE -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN uint8_t USBD_Class_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = { - 0x12, /* bLength */ - USB_DESC_TYPE_DEVICE, /* bDescriptorType */ + +#define USB_CDC_CLASS_MULTI 0xEF +#define CDC_SUBCLASS_ACM 0x02 +#define CDC_PROTOCOL_V25TER 0x01 // Common AT commands + + #if ((USBD_LPM_ENABLED == 1) || (USBD_CLASS_BOS_ENABLED == 1)) - 0x01, /*bcdUSB */ /* changed to USB version 2.01 - in order to support BOS Desc */ + #define BCD_USB_FLAG 0x01 #else - 0x00, /* bcdUSB */ + #define BCD_USB_FLAG 0x00 #endif - 0x02, - 0x00, /* bDeviceClass */ - 0x00, /* bDeviceSubClass */ - 0x00, /* bDeviceProtocol */ - USB_MAX_EP0_SIZE, /* bMaxPacketSize */ - LOBYTE(USBD_VID), /* idVendor */ - HIBYTE(USBD_VID), /* idVendor */ - LOBYTE(USBD_PID), /* idProduct */ - HIBYTE(USBD_PID), /* idProduct */ - 0x00, /* bcdDevice rel. 0.00 */ - 0x00, - USBD_IDX_MFC_STR, /* Index of manufacturer string */ - USBD_IDX_PRODUCT_STR, /* Index of product string */ - USBD_IDX_SERIAL_STR, /* Index of serial number string */ - USBD_MAX_NUM_CONFIGURATION /* bNumConfigurations */ -}; /* USB_DeviceDescriptor */ -#endif /* USBD_USE_HID_COMPOSITE */ -#if defined(USBD_USE_CDC) || defined(USBD_USE_CDC_MSC) -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN uint8_t USBD_Class_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = { - 0x12, /* bLength */ - USB_DESC_TYPE_DEVICE, /* bDescriptorType */ -#if ((USBD_LPM_ENABLED == 1) || (USBD_CLASS_BOS_ENABLED == 1)) - 0x01, /*bcdUSB */ /* changed to USB version 2.01 - in order to support BOS Desc */ -#else - 0x00, /* bcdUSB */ + +#define USBD_CLASS_DEVICE_DESCRIPTOR(_CLASS, _SUBCLASS, _PROTO) \ +__ALIGN_BEGIN uint8_t USBD_Class_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = { \ + 0x12, /* bLength */ \ + USB_DESC_TYPE_DEVICE, /* bDescriptorType */ \ + BCD_USB_FLAG, /* bcdUSB */ \ + 0x02, \ + _CLASS, /* bDeviceClass */ \ + _SUBCLASS, /* bDeviceSubClass */ \ + _PROTO, /* bDeviceProtocol */ \ + USB_MAX_EP0_SIZE, /* bMaxPacketSize */ \ + LOBYTE(USBD_VID), /* idVendor */ \ + HIBYTE(USBD_VID), /* idVendor */ \ + LOBYTE(USBD_PID), /* idProduct */ \ + HIBYTE(USBD_PID), /* idProduct */ \ + 0x00, /* bcdDevice rel. 0.00 */ \ + 0x00, \ + USBD_IDX_MFC_STR, /* Index of manufacturer string */ \ + USBD_IDX_PRODUCT_STR, /* Index of product string */ \ + USBD_IDX_SERIAL_STR, /* Index of serial number string */ \ + USBD_MAX_NUM_CONFIGURATION /* bNumConfigurations */ \ +} + +#ifdef USBD_USE_HID_COMPOSITE +USBD_CLASS_DEVICE_DESCRIPTOR(0x00, 0x00, 0x00); #endif - 0x02, - 0x02, /* bDeviceClass */ - 0x02, /* bDeviceSubClass */ - 0x00, /* bDeviceProtocol */ - USB_MAX_EP0_SIZE, /* bMaxPacketSize */ - LOBYTE(USBD_VID), /* idVendor */ - HIBYTE(USBD_VID), /* idVendor */ - LOBYTE(USBD_PID), /* idProduct */ - HIBYTE(USBD_PID), /* idProduct */ - 0x00, /* bcdDevice rel. 0.00 */ - 0x00, - USBD_IDX_MFC_STR, /* Index of manufacturer string */ - USBD_IDX_PRODUCT_STR, /* Index of product string */ - USBD_IDX_SERIAL_STR, /* Index of serial number string */ - USBD_MAX_NUM_CONFIGURATION /* bNumConfigurations */ -}; /* USB_DeviceDescriptor */ -#endif /* USBD_USE_CDC || USBD_USE_CDC_MSC */ - -/* USB Device LPM BOS descriptor */ -#if (USBD_LPM_ENABLED == 1) -__ALIGN_BEGIN uint8_t USBD_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END = { - 0x5, - USB_DESC_TYPE_BOS, - 0xC, - 0x0, - 0x1, /* 1 device capability */ - /* device capability */ - 0x7, - USB_DEVICE_CAPABITY_TYPE, - 0x2, - 0x6, /*LPM capability bit set */ - 0x0, - 0x0, - 0x0 -}; + +#ifdef USBD_USE_CDC +USBD_CLASS_DEVICE_DESCRIPTOR(0x02, 0x02, 0x00); +#endif + +#ifdef USBD_USE_CDC_MSC +USBD_CLASS_DEVICE_DESCRIPTOR(USB_CDC_CLASS_MULTI, CDC_SUBCLASS_ACM, CDC_PROTOCOL_V25TER); #endif /* USB Device Billboard BOS descriptor Template */ From def086798e3822f8604a7211244f21e3dad34d2f Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Sun, 7 Jun 2020 11:23:47 +0000 Subject: [PATCH 36/37] fixed formatting --- cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp | 2 +- cores/arduino/stm32/usb/usbd_desc.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp index 419be31e05..d846a4a965 100644 --- a/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp +++ b/cores/arduino/stm32/usb/cdc_msc/usbd_cdc_msc.cpp @@ -247,7 +247,7 @@ static uint8_t USBD_COMPOSITE_FSCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { #if defined ( __ICCARM__ ) /*!< IAR Compiler */ -#pragma data_alignment=4 + #pragma data_alignment=4 #endif /* USB COMPOSITE device Configuration Descriptor */ static uint8_t USBD_COMPOSITE_OtherSpeedCfgDesc[USB_CDC_MSC_CONFIG_DESC_SIZ] = { diff --git a/cores/arduino/stm32/usb/usbd_desc.c b/cores/arduino/stm32/usb/usbd_desc.c index 883557a98a..3d48f046ed 100644 --- a/cores/arduino/stm32/usb/usbd_desc.c +++ b/cores/arduino/stm32/usb/usbd_desc.c @@ -165,15 +165,15 @@ __ALIGN_BEGIN uint8_t USBD_Class_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = { \ } #ifdef USBD_USE_HID_COMPOSITE -USBD_CLASS_DEVICE_DESCRIPTOR(0x00, 0x00, 0x00); + USBD_CLASS_DEVICE_DESCRIPTOR(0x00, 0x00, 0x00); #endif #ifdef USBD_USE_CDC -USBD_CLASS_DEVICE_DESCRIPTOR(0x02, 0x02, 0x00); + USBD_CLASS_DEVICE_DESCRIPTOR(0x02, 0x02, 0x00); #endif #ifdef USBD_USE_CDC_MSC -USBD_CLASS_DEVICE_DESCRIPTOR(USB_CDC_CLASS_MULTI, CDC_SUBCLASS_ACM, CDC_PROTOCOL_V25TER); + USBD_CLASS_DEVICE_DESCRIPTOR(USB_CDC_CLASS_MULTI, CDC_SUBCLASS_ACM, CDC_PROTOCOL_V25TER); #endif /* USB Device Billboard BOS descriptor Template */ From 444780324d7c51bef6af548fc684c244897c29cd Mon Sep 17 00:00:00 2001 From: Rudi Horn Date: Sun, 7 Jun 2020 11:57:03 +0000 Subject: [PATCH 37/37] added extra board configurations --- boards.txt | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/boards.txt b/boards.txt index 65074d3a9f..a91fa61206 100644 --- a/boards.txt +++ b/boards.txt @@ -2325,6 +2325,8 @@ Nucleo_144.menu.usb.CDCgen=CDC (generic 'Serial' supersede U(S)ART) Nucleo_144.menu.usb.CDCgen.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC Nucleo_144.menu.usb.CDC=CDC (no generic 'Serial') Nucleo_144.menu.usb.CDC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB +Nucleo_144.menu.usb.CDC_MSC=CDC + MSC +Nucleo_144.menu.usb.CDC_MSC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC_MSC Nucleo_144.menu.usb.HID=HID (keyboard and mouse) Nucleo_144.menu.usb.HID.build.enable_usb={build.usb_flags} -DUSBD_USE_HID_COMPOSITE Nucleo_144.menu.xusb.FS=Low/Full Speed @@ -2338,6 +2340,8 @@ Nucleo_64.menu.usb.CDCgen=CDC (generic 'Serial' supersede U(S)ART) Nucleo_64.menu.usb.CDCgen.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC Nucleo_64.menu.usb.CDC=CDC (no generic 'Serial') Nucleo_64.menu.usb.CDC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB +Nucleo_64.menu.usb.CDC_MSC=CDC + MSC +Nucleo_64.menu.usb.CDC_MSC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC_MSC Nucleo_64.menu.usb.HID=HID (keyboard and mouse) Nucleo_64.menu.usb.HID.build.enable_usb={build.usb_flags} -DUSBD_USE_HID_COMPOSITE Nucleo_64.menu.xusb.FS=Low/Full Speed @@ -2351,6 +2355,8 @@ Nucleo_32.menu.usb.CDCgen=CDC (generic 'Serial' supersede U(S)ART) Nucleo_32.menu.usb.CDCgen.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC Nucleo_32.menu.usb.CDC=CDC (no generic 'Serial') Nucleo_32.menu.usb.CDC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB +Nucleo_32.menu.usb.CDC_MSC=CDC + MSC +Nucleo_32.menu.usb.CDC_MSC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC_MSC Nucleo_32.menu.usb.HID=HID (keyboard and mouse) Nucleo_32.menu.usb.HID.build.enable_usb={build.usb_flags} -DUSBD_USE_HID_COMPOSITE Nucleo_32.menu.xusb.FS=Low/Full Speed @@ -2364,6 +2370,8 @@ Disco.menu.usb.CDCgen=CDC (generic 'Serial' supersede U(S)ART) Disco.menu.usb.CDCgen.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC Disco.menu.usb.CDC=CDC (no generic 'Serial') Disco.menu.usb.CDC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB +Disco.menu.usb.CDC_MSC=CDC + MSC +Disco.menu.usb.CDC_MSC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC_MSC Disco.menu.usb.HID=HID (keyboard and mouse) Disco.menu.usb.HID.build.enable_usb={build.usb_flags} -DUSBD_USE_HID_COMPOSITE Disco.menu.xusb.FS=Low/Full Speed @@ -2377,6 +2385,8 @@ Eval.menu.usb.CDCgen=CDC (generic 'Serial' supersede U(S)ART) Eval.menu.usb.CDCgen.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC Eval.menu.usb.CDC=CDC (no generic 'Serial') Eval.menu.usb.CDC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB +Eval.menu.usb.CDC_MSC=CDC + MSC +Eval.menu.usb.CDC_MSC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC_MSC Eval.menu.usb.HID=HID (keyboard and mouse) Eval.menu.usb.HID.build.enable_usb={build.usb_flags} -DUSBD_USE_HID_COMPOSITE Eval.menu.xusb.FS=Low/Full Speed @@ -2390,6 +2400,8 @@ GenF1.menu.usb.CDCgen=CDC (generic 'Serial' supersede U(S)ART) GenF1.menu.usb.CDCgen.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC GenF1.menu.usb.CDC=CDC (no generic 'Serial') GenF1.menu.usb.CDC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB +GenF1.menu.usb.CDC_MSC=CDC + MSC +GenF1.menu.usb.CDC_MSC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC_MSC GenF1.menu.usb.HID=HID (keyboard and mouse) GenF1.menu.usb.HID.build.enable_usb={build.usb_flags} -DUSBD_USE_HID_COMPOSITE GenF1.menu.xusb.FS=Low/Full Speed @@ -2403,6 +2415,8 @@ GenF3.menu.usb.CDCgen=CDC (generic 'Serial' supersede U(S)ART) GenF3.menu.usb.CDCgen.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC GenF3.menu.usb.CDC=CDC (no generic 'Serial') GenF3.menu.usb.CDC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB +GenF3.menu.usb.CDC_MSC=CDC + MSC +GenF3.menu.usb.CDC_MSC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC_MSC GenF3.menu.usb.HID=HID (keyboard and mouse) GenF3.menu.usb.HID.build.enable_usb={build.usb_flags} -DUSBD_USE_HID_COMPOSITE GenF3.menu.xusb.FS=Low/Full Speed @@ -2416,6 +2430,8 @@ GenF4.menu.usb.CDCgen=CDC (generic 'Serial' supersede U(S)ART) GenF4.menu.usb.CDCgen.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC GenF4.menu.usb.CDC=CDC (no generic 'Serial') GenF4.menu.usb.CDC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB +GenF4.menu.usb.CDC_MSC=CDC + MSC +GenF4.menu.usb.CDC_MSC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC_MSC GenF4.menu.usb.HID=HID (keyboard and mouse) GenF4.menu.usb.HID.build.enable_usb={build.usb_flags} -DUSBD_USE_HID_COMPOSITE GenF4.menu.xusb.FS=Low/Full Speed @@ -2429,6 +2445,8 @@ GenH7.menu.usb.CDCgen=CDC (generic 'Serial' supersede U(S)ART) GenH7.menu.usb.CDCgen.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC GenH7.menu.usb.CDC=CDC (no generic 'Serial') GenH7.menu.usb.CDC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB +GenH7.menu.usb.CDC_MSC=CDC + MSC +GenH7.menu.usb.CDC_MSC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC_MSC GenH7.menu.usb.HID=HID (keyboard and mouse) GenH7.menu.usb.HID.build.enable_usb={build.usb_flags} -DUSBD_USE_HID_COMPOSITE GenH7.menu.xusb.FS=Low/Full Speed @@ -2440,6 +2458,8 @@ GenL0.menu.usb.CDCgen=CDC (generic 'Serial' supersede U(S)ART) GenL0.menu.usb.CDCgen.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC GenL0.menu.usb.CDC=CDC (no generic 'Serial') GenL0.menu.usb.CDC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB +GenL0.menu.usb.CDC_MSC=CDC + MSC +GenL0.menu.usb.CDC_MSC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC_MSC GenL0.menu.usb.HID=HID (keyboard and mouse) GenL0.menu.usb.HID.build.enable_usb={build.usb_flags} -DUSBD_USE_HID_COMPOSITE @@ -2448,6 +2468,8 @@ GenL0.menu.usb.HID.build.enable_usb={build.usb_flags} -DUSBD_USE_HID_COMPOSITE 3dprinter.menu.usb.CDCgen.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC 3dprinter.menu.usb.CDC=CDC (no generic 'Serial') 3dprinter.menu.usb.CDC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB +3dprinter.menu.usb.CDC_MSC=CDC + MSC +3dprinter.menu.usb.CDC_MSC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC_MSC 3dprinter.menu.xusb.FS=Low/Full Speed 3dprinter.menu.xusb.HS=High Speed 3dprinter.menu.xusb.HS.build.usb_speed=-DUSE_USB_HS @@ -2459,6 +2481,8 @@ Genericflight.menu.usb.CDCgen=CDC (generic 'Serial' supersede U(S)ART) Genericflight.menu.usb.CDCgen.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC Genericflight.menu.usb.CDC=CDC (no generic 'Serial') Genericflight.menu.usb.CDC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB +Genericflight.menu.usb.CDC_MSC=CDC + MSC +Genericflight.menu.usb.CDC_MSC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC_MSC Genericflight.menu.usb.HID=HID (keyboard and mouse) Genericflight.menu.usb.HID.build.enable_usb={build.usb_flags} -DUSBD_USE_HID_COMPOSITE Genericflight.menu.xusb.FS=Low/Full Speed @@ -2472,6 +2496,8 @@ Garatronic.menu.usb.CDCgen=CDC (generic 'Serial' supersede U(S)ART) Garatronic.menu.usb.CDCgen.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC Garatronic.menu.usb.CDC=CDC (no generic 'Serial') Garatronic.menu.usb.CDC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB +Garatronic.menu.usb.CDC_MSC=CDC + MSC +Garatronic.menu.usb.CDC_MSC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC_MSC Garatronic.menu.usb.HID=HID (keyboard and mouse) Garatronic.menu.usb.HID.build.enable_usb={build.usb_flags} -DUSBD_USE_HID_COMPOSITE @@ -2480,6 +2506,8 @@ Midatronics.menu.usb.CDCgen=CDC (generic 'Serial' supersede U(S)ART) Midatronics.menu.usb.CDCgen.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC Midatronics.menu.usb.CDC=CDC (no generic 'Serial') Midatronics.menu.usb.CDC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC -DDISABLE_GENERIC_SERIALUSB +Midatronics.menu.usb.CDC_MSC=CDC + MSC +Midatronics.menu.usb.CDC_MSC.build.enable_usb={build.usb_flags} -DUSBD_USE_CDC_MSC Midatronics.menu.usb.HID=HID (keyboard and mouse) Midatronics.menu.usb.HID.build.enable_usb={build.usb_flags} -DUSBD_USE_HID_COMPOSITE Midatronics.menu.xusb.FS=Low/Full Speed