diff --git a/Class/AUDIO/Inc/usbd_audio.h b/Class/AUDIO/Inc/usbd_audio.h deleted file mode 100644 index a082d19..0000000 --- a/Class/AUDIO/Inc/usbd_audio.h +++ /dev/null @@ -1,332 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_audio.h - * @author MCD Application Team - * @brief header file for the usbd_audio.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_AUDIO_H -#define __USB_AUDIO_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_AUDIO - * @brief This file is the Header file for usbd_audio.c - * @{ - */ - - -/** @defgroup USBD_AUDIO_Exported_Defines - * @{ - */ -#ifndef USBD_AUDIO_FREQ -/* AUDIO Class Config */ -#define USBD_AUDIO_FREQ 48000U -#endif /* USBD_AUDIO_FREQ */ - -#ifndef USBD_MAX_NUM_INTERFACES -#define USBD_MAX_NUM_INTERFACES 1U -#endif /* USBD_AUDIO_FREQ */ - -#ifndef AUDIO_HS_BINTERVAL -#define AUDIO_HS_BINTERVAL 0x01U -#endif /* AUDIO_HS_BINTERVAL */ - -#ifndef AUDIO_FS_BINTERVAL -#define AUDIO_FS_BINTERVAL 0x01U -#endif /* AUDIO_FS_BINTERVAL */ - -#ifndef AUDIO_OUT_EP -#define AUDIO_OUT_EP 0x01U -#endif /* AUDIO_OUT_EP */ - -#define USB_AUDIO_CONFIG_DESC_SIZ 0x6DU -#define AUDIO_INTERFACE_DESC_SIZE 0x09U -#define USB_AUDIO_DESC_SIZ 0x09U -#define AUDIO_STANDARD_ENDPOINT_DESC_SIZE 0x09U -#define AUDIO_STREAMING_ENDPOINT_DESC_SIZE 0x07U - -#define AUDIO_DESCRIPTOR_TYPE 0x21U -#define USB_DEVICE_CLASS_AUDIO 0x01U -#define AUDIO_SUBCLASS_AUDIOCONTROL 0x01U -#define AUDIO_SUBCLASS_AUDIOSTREAMING 0x02U -#define AUDIO_PROTOCOL_UNDEFINED 0x00U -#define AUDIO_STREAMING_GENERAL 0x01U -#define AUDIO_STREAMING_FORMAT_TYPE 0x02U - -/* Audio Descriptor Types */ -#define AUDIO_INTERFACE_DESCRIPTOR_TYPE 0x24U -#define AUDIO_ENDPOINT_DESCRIPTOR_TYPE 0x25U - -/* Audio Control Interface Descriptor Subtypes */ -#define AUDIO_CONTROL_HEADER 0x01U -#define AUDIO_CONTROL_INPUT_TERMINAL 0x02U -#define AUDIO_CONTROL_OUTPUT_TERMINAL 0x03U -#define AUDIO_CONTROL_FEATURE_UNIT 0x06U - -#define AUDIO_INPUT_TERMINAL_DESC_SIZE 0x0CU -#define AUDIO_OUTPUT_TERMINAL_DESC_SIZE 0x09U -#define AUDIO_STREAMING_INTERFACE_DESC_SIZE 0x07U - -#define AUDIO_CONTROL_MUTE 0x0001U - -#define AUDIO_FORMAT_TYPE_I 0x01U -#define AUDIO_FORMAT_TYPE_III 0x03U - -#define AUDIO_ENDPOINT_GENERAL 0x01U - -#define AUDIO_REQ_GET_CUR 0x81U -#define AUDIO_REQ_SET_CUR 0x01U - -#define AUDIO_OUT_STREAMING_CTRL 0x02U - -#define AUDIO_OUT_TC 0x01U -#define AUDIO_IN_TC 0x02U - - -#define AUDIO_OUT_PACKET (uint16_t)(((USBD_AUDIO_FREQ * 2U * 2U) / 1000U)) -#define AUDIO_DEFAULT_VOLUME 70U - -/* Number of sub-packets in the audio transfer buffer. You can modify this value but always make sure - that it is an even number and higher than 3 */ -#define AUDIO_OUT_PACKET_NUM 80U -/* Total size of the audio transfer buffer */ -#define AUDIO_TOTAL_BUF_SIZE ((uint16_t)(AUDIO_OUT_PACKET * AUDIO_OUT_PACKET_NUM)) - -/* Audio Commands enumeration */ -typedef enum -{ - AUDIO_CMD_START = 1, - AUDIO_CMD_PLAY, - AUDIO_CMD_STOP, -} AUDIO_CMD_TypeDef; - - -typedef enum -{ - AUDIO_OFFSET_NONE = 0, - AUDIO_OFFSET_HALF, - AUDIO_OFFSET_FULL, - AUDIO_OFFSET_UNKNOWN, -} AUDIO_OffsetTypeDef; -/** - * @} - */ - - -/** @defgroup USBD_CORE_Exported_TypesDefinitions - * @{ - */ -typedef struct -{ - uint8_t cmd; - uint8_t data[USB_MAX_EP0_SIZE]; - uint8_t len; - uint8_t unit; -} USBD_AUDIO_ControlTypeDef; - - -typedef struct -{ - uint32_t alt_setting; - uint8_t buffer[AUDIO_TOTAL_BUF_SIZE]; - AUDIO_OffsetTypeDef offset; - uint8_t rd_enable; - uint16_t rd_ptr; - uint16_t wr_ptr; - USBD_AUDIO_ControlTypeDef control; -} USBD_AUDIO_HandleTypeDef; - - -typedef struct -{ - int8_t (*Init)(uint32_t AudioFreq, uint32_t Volume, uint32_t options); - int8_t (*DeInit)(uint32_t options); - int8_t (*AudioCmd)(uint8_t *pbuf, uint32_t size, uint8_t cmd); - int8_t (*VolumeCtl)(uint8_t vol); - int8_t (*MuteCtl)(uint8_t cmd); - int8_t (*PeriodicTC)(uint8_t *pbuf, uint32_t size, uint8_t cmd); - int8_t (*GetState)(void); -} USBD_AUDIO_ItfTypeDef; - -/* - * Audio Class specification release 1.0 - */ - -/* Table 4-2: Class-Specific AC Interface Header Descriptor */ -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint16_t bcdADC; - uint16_t wTotalLength; - uint8_t bInCollection; - uint8_t baInterfaceNr; -} __PACKED USBD_SpeakerIfDescTypeDef; - -/* Table 4-3: Input Terminal Descriptor */ -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bTerminalID; - uint16_t wTerminalType; - uint8_t bAssocTerminal; - uint8_t bNrChannels; - uint16_t wChannelConfig; - uint8_t iChannelNames; - uint8_t iTerminal; -} __PACKED USBD_SpeakerInDescTypeDef; - -/* USB Speaker Audio Feature Unit Descriptor */ -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bUnitID; - uint8_t bSourceID; - uint8_t bControlSize; - uint16_t bmaControls; - uint8_t iTerminal; -} __PACKED USBD_SpeakerFeatureDescTypeDef; - -/* Table 4-4: Output Terminal Descriptor */ -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bTerminalID; - uint16_t wTerminalType; - uint8_t bAssocTerminal; - uint8_t bSourceID; - uint8_t iTerminal; -} __PACKED USBD_SpeakerOutDescTypeDef; - -/* Table 4-19: Class-Specific AS Interface Descriptor */ -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bTerminalLink; - uint8_t bDelay; - uint16_t wFormatTag; -} __PACKED USBD_SpeakerStreamIfDescTypeDef; - -/* USB Speaker Audio Type III Format Interface Descriptor */ -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bFormatType; - uint8_t bNrChannels; - uint8_t bSubFrameSize; - uint8_t bBitResolution; - uint8_t bSamFreqType; - uint8_t tSamFreq2; - uint8_t tSamFreq1; - uint8_t tSamFreq0; -} USBD_SpeakerIIIFormatIfDescTypeDef; - -/* Table 4-17: Standard AC Interrupt Endpoint Descriptor */ -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bEndpointAddress; - uint8_t bmAttributes; - uint16_t wMaxPacketSize; - uint8_t bInterval; - uint8_t bRefresh; - uint8_t bSynchAddress; -} __PACKED USBD_SpeakerEndDescTypeDef; - -/* Table 4-21: Class-Specific AS Isochronous Audio Data Endpoint Descriptor */ -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptor; - uint8_t bmAttributes; - uint8_t bLockDelayUnits; - uint16_t wLockDelay; -} __PACKED USBD_SpeakerEndStDescTypeDef; - -/** - * @} - */ - - - -/** @defgroup USBD_CORE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Exported_Variables - * @{ - */ - -extern USBD_ClassTypeDef USBD_AUDIO; -#define USBD_AUDIO_CLASS &USBD_AUDIO -/** - * @} - */ - -/** @defgroup USB_CORE_Exported_Functions - * @{ - */ -uint8_t USBD_AUDIO_RegisterInterface(USBD_HandleTypeDef *pdev, - USBD_AUDIO_ItfTypeDef *fops); - -void USBD_AUDIO_Sync(USBD_HandleTypeDef *pdev, AUDIO_OffsetTypeDef offset); - -#ifdef USE_USBD_COMPOSITE -uint32_t USBD_AUDIO_GetEpPcktSze(USBD_HandleTypeDef *pdev, uint8_t If, uint8_t Ep); -#endif /* USE_USBD_COMPOSITE */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_AUDIO_H */ -/** - * @} - */ - -/** - * @} - */ diff --git a/Class/AUDIO/Inc/usbd_audio_if_template.h b/Class/AUDIO/Inc/usbd_audio_if_template.h deleted file mode 100644 index 02aa1b6..0000000 --- a/Class/AUDIO/Inc/usbd_audio_if_template.h +++ /dev/null @@ -1,42 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_audio_if_template.h - * @author MCD Application Team - * @brief Header for usbd_audio_if_template.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_AUDIO_IF_TEMPLATE_H -#define __USBD_AUDIO_IF_TEMPLATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_audio.h" - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -extern USBD_AUDIO_ItfTypeDef USBD_AUDIO_Template_fops; - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_AUDIO_IF_TEMPLATE_H */ diff --git a/Class/AUDIO/Src/usbd_audio.c b/Class/AUDIO/Src/usbd_audio.c deleted file mode 100644 index 05153b1..0000000 --- a/Class/AUDIO/Src/usbd_audio.c +++ /dev/null @@ -1,980 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_audio.c - * @author MCD Application Team - * @brief This file provides the Audio core functions. - * - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - * @verbatim - * - * =================================================================== - * AUDIO Class Description - * =================================================================== - * This driver manages the Audio Class 1.0 following the "USB Device Class Definition for - * Audio Devices V1.0 Mar 18, 98". - * This driver implements the following aspects of the specification: - * - Device descriptor management - * - Configuration descriptor management - * - Standard AC Interface Descriptor management - * - 1 Audio Streaming Interface (with single channel, PCM, Stereo mode) - * - 1 Audio Streaming Endpoint - * - 1 Audio Terminal Input (1 channel) - * - Audio Class-Specific AC Interfaces - * - Audio Class-Specific AS Interfaces - * - AudioControl Requests: only SET_CUR and GET_CUR requests are supported (for Mute) - * - Audio Feature Unit (limited to Mute control) - * - Audio Synchronization type: Asynchronous - * - Single fixed audio sampling rate (configurable in usbd_conf.h file) - * The current audio class version supports the following audio features: - * - Pulse Coded Modulation (PCM) format - * - sampling rate: 48KHz. - * - Bit resolution: 16 - * - Number of channels: 2 - * - No volume control - * - Mute/Unmute capability - * - Asynchronous Endpoints - * - * @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 - ****************************************************************************** - */ - -/* BSPDependencies -- "stm32xxxxx_{eval}{discovery}.c" -- "stm32xxxxx_{eval}{discovery}_io.c" -- "stm32xxxxx_{eval}{discovery}_audio.c" -EndBSPDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_audio.h" -#include "usbd_ctlreq.h" - - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_AUDIO - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_AUDIO_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_AUDIO_Private_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_AUDIO_Private_Macros - * @{ - */ -#define AUDIO_SAMPLE_FREQ(frq) \ - (uint8_t)(frq), (uint8_t)((frq >> 8)), (uint8_t)((frq >> 16)) - -#define AUDIO_PACKET_SZE(frq) \ - (uint8_t)(((frq * 2U * 2U) / 1000U) & 0xFFU), (uint8_t)((((frq * 2U * 2U) / 1000U) >> 8) & 0xFFU) - -#ifdef USE_USBD_COMPOSITE -#define AUDIO_PACKET_SZE_WORD(frq) (uint32_t)((((frq) * 2U * 2U)/1000U)) -#endif /* USE_USBD_COMPOSITE */ -/** - * @} - */ - - -/** @defgroup USBD_AUDIO_Private_FunctionPrototypes - * @{ - */ -static uint8_t USBD_AUDIO_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_AUDIO_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); - -static uint8_t USBD_AUDIO_Setup(USBD_HandleTypeDef *pdev, - USBD_SetupReqTypedef *req); -#ifndef USE_USBD_COMPOSITE -static uint8_t *USBD_AUDIO_GetCfgDesc(uint16_t *length); -static uint8_t *USBD_AUDIO_GetDeviceQualifierDesc(uint16_t *length); -#endif /* USE_USBD_COMPOSITE */ -static uint8_t USBD_AUDIO_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_AUDIO_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_AUDIO_EP0_RxReady(USBD_HandleTypeDef *pdev); -static uint8_t USBD_AUDIO_EP0_TxReady(USBD_HandleTypeDef *pdev); -static uint8_t USBD_AUDIO_SOF(USBD_HandleTypeDef *pdev); - -static uint8_t USBD_AUDIO_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_AUDIO_IsoOutIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); -static void AUDIO_REQ_GetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void AUDIO_REQ_SetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void *USBD_AUDIO_GetAudioHeaderDesc(uint8_t *pConfDesc); - -/** - * @} - */ - -/** @defgroup USBD_AUDIO_Private_Variables - * @{ - */ - -USBD_ClassTypeDef USBD_AUDIO = -{ - USBD_AUDIO_Init, - USBD_AUDIO_DeInit, - USBD_AUDIO_Setup, - USBD_AUDIO_EP0_TxReady, - USBD_AUDIO_EP0_RxReady, - USBD_AUDIO_DataIn, - USBD_AUDIO_DataOut, - USBD_AUDIO_SOF, - USBD_AUDIO_IsoINIncomplete, - USBD_AUDIO_IsoOutIncomplete, -#ifdef USE_USBD_COMPOSITE - NULL, - NULL, - NULL, - NULL, -#else - USBD_AUDIO_GetCfgDesc, - USBD_AUDIO_GetCfgDesc, - USBD_AUDIO_GetCfgDesc, - USBD_AUDIO_GetDeviceQualifierDesc, -#endif /* USE_USBD_COMPOSITE */ -}; - -#ifndef USE_USBD_COMPOSITE -/* USB AUDIO device Configuration Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_AUDIO_CfgDesc[USB_AUDIO_CONFIG_DESC_SIZ] __ALIGN_END = -{ - /* Configuration 1 */ - 0x09, /* bLength */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType */ - LOBYTE(USB_AUDIO_CONFIG_DESC_SIZ), /* wTotalLength */ - HIBYTE(USB_AUDIO_CONFIG_DESC_SIZ), - 0x02, /* bNumInterfaces */ - 0x01, /* bConfigurationValue */ - 0x00, /* iConfiguration */ -#if (USBD_SELF_POWERED == 1U) - 0xC0, /* bmAttributes: Bus Powered according to user configuration */ -#else - 0x80, /* bmAttributes: Bus Powered according to user configuration */ -#endif /* USBD_SELF_POWERED */ - USBD_MAX_POWER, /* MaxPower (mA) */ - /* 09 byte*/ - - /* USB Speaker Standard interface descriptor */ - AUDIO_INTERFACE_DESC_SIZE, /* bLength */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType */ - 0x00, /* bInterfaceNumber */ - 0x00, /* bAlternateSetting */ - 0x00, /* bNumEndpoints */ - USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ - AUDIO_SUBCLASS_AUDIOCONTROL, /* bInterfaceSubClass */ - AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ - 0x00, /* iInterface */ - /* 09 byte*/ - - /* USB Speaker Class-specific AC Interface Descriptor */ - AUDIO_INTERFACE_DESC_SIZE, /* bLength */ - AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ - AUDIO_CONTROL_HEADER, /* bDescriptorSubtype */ - 0x00, /* 1.00 */ /* bcdADC */ - 0x01, - 0x27, /* wTotalLength */ - 0x00, - 0x01, /* bInCollection */ - 0x01, /* baInterfaceNr */ - /* 09 byte*/ - - /* USB Speaker Input Terminal Descriptor */ - AUDIO_INPUT_TERMINAL_DESC_SIZE, /* bLength */ - AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ - AUDIO_CONTROL_INPUT_TERMINAL, /* bDescriptorSubtype */ - 0x01, /* bTerminalID */ - 0x01, /* wTerminalType AUDIO_TERMINAL_USB_STREAMING 0x0101 */ - 0x01, - 0x00, /* bAssocTerminal */ - 0x01, /* bNrChannels */ - 0x00, /* wChannelConfig 0x0000 Mono */ - 0x00, - 0x00, /* iChannelNames */ - 0x00, /* iTerminal */ - /* 12 byte*/ - - /* USB Speaker Audio Feature Unit Descriptor */ - 0x09, /* bLength */ - AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ - AUDIO_CONTROL_FEATURE_UNIT, /* bDescriptorSubtype */ - AUDIO_OUT_STREAMING_CTRL, /* bUnitID */ - 0x01, /* bSourceID */ - 0x01, /* bControlSize */ - AUDIO_CONTROL_MUTE, /* bmaControls(0) */ - 0, /* bmaControls(1) */ - 0x00, /* iTerminal */ - /* 09 byte */ - - /* USB Speaker Output Terminal Descriptor */ - 0x09, /* bLength */ - AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ - AUDIO_CONTROL_OUTPUT_TERMINAL, /* bDescriptorSubtype */ - 0x03, /* bTerminalID */ - 0x01, /* wTerminalType 0x0301 */ - 0x03, - 0x00, /* bAssocTerminal */ - 0x02, /* bSourceID */ - 0x00, /* iTerminal */ - /* 09 byte */ - - /* USB Speaker Standard AS Interface Descriptor - Audio Streaming Zero Bandwidth */ - /* Interface 1, Alternate Setting 0 */ - AUDIO_INTERFACE_DESC_SIZE, /* bLength */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType */ - 0x01, /* bInterfaceNumber */ - 0x00, /* bAlternateSetting */ - 0x00, /* bNumEndpoints */ - USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ - AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ - AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ - 0x00, /* iInterface */ - /* 09 byte*/ - - /* USB Speaker Standard AS Interface Descriptor - Audio Streaming Operational */ - /* Interface 1, Alternate Setting 1 */ - AUDIO_INTERFACE_DESC_SIZE, /* bLength */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType */ - 0x01, /* bInterfaceNumber */ - 0x01, /* bAlternateSetting */ - 0x01, /* bNumEndpoints */ - USB_DEVICE_CLASS_AUDIO, /* bInterfaceClass */ - AUDIO_SUBCLASS_AUDIOSTREAMING, /* bInterfaceSubClass */ - AUDIO_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ - 0x00, /* iInterface */ - /* 09 byte*/ - - /* USB Speaker Audio Streaming Interface Descriptor */ - AUDIO_STREAMING_INTERFACE_DESC_SIZE, /* bLength */ - AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ - AUDIO_STREAMING_GENERAL, /* bDescriptorSubtype */ - 0x01, /* bTerminalLink */ - 0x01, /* bDelay */ - 0x01, /* wFormatTag AUDIO_FORMAT_PCM 0x0001 */ - 0x00, - /* 07 byte*/ - - /* USB Speaker Audio Type III Format Interface Descriptor */ - 0x0B, /* bLength */ - AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */ - AUDIO_STREAMING_FORMAT_TYPE, /* bDescriptorSubtype */ - AUDIO_FORMAT_TYPE_I, /* bFormatType */ - 0x02, /* bNrChannels */ - 0x02, /* bSubFrameSize : 2 Bytes per frame (16bits) */ - 16, /* bBitResolution (16-bits per sample) */ - 0x01, /* bSamFreqType only one frequency supported */ - AUDIO_SAMPLE_FREQ(USBD_AUDIO_FREQ), /* Audio sampling frequency coded on 3 bytes */ - /* 11 byte*/ - - /* Endpoint 1 - Standard Descriptor */ - AUDIO_STANDARD_ENDPOINT_DESC_SIZE, /* bLength */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType */ - AUDIO_OUT_EP, /* bEndpointAddress 1 out endpoint */ - USBD_EP_TYPE_ISOC, /* bmAttributes */ - AUDIO_PACKET_SZE(USBD_AUDIO_FREQ), /* wMaxPacketSize in Bytes (Freq(Samples)*2(Stereo)*2(HalfWord)) */ - AUDIO_FS_BINTERVAL, /* bInterval */ - 0x00, /* bRefresh */ - 0x00, /* bSynchAddress */ - /* 09 byte*/ - - /* Endpoint - Audio Streaming Descriptor */ - AUDIO_STREAMING_ENDPOINT_DESC_SIZE, /* bLength */ - AUDIO_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */ - AUDIO_ENDPOINT_GENERAL, /* bDescriptor */ - 0x00, /* bmAttributes */ - 0x00, /* bLockDelayUnits */ - 0x00, /* wLockDelay */ - 0x00, - /* 07 byte*/ -} ; - -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_AUDIO_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = -{ - USB_LEN_DEV_QUALIFIER_DESC, - USB_DESC_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x01, - 0x00, -}; -#endif /* USE_USBD_COMPOSITE */ - -static uint8_t AUDIOOutEpAdd = AUDIO_OUT_EP; -/** - * @} - */ - -/** @defgroup USBD_AUDIO_Private_Functions - * @{ - */ - -/** - * @brief USBD_AUDIO_Init - * Initialize the AUDIO interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_AUDIO_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - USBD_AUDIO_HandleTypeDef *haudio; - - /* Allocate Audio structure */ - haudio = (USBD_AUDIO_HandleTypeDef *)USBD_malloc(sizeof(USBD_AUDIO_HandleTypeDef)); - - if (haudio == NULL) - { - pdev->pClassDataCmsit[pdev->classId] = NULL; - return (uint8_t)USBD_EMEM; - } - - pdev->pClassDataCmsit[pdev->classId] = (void *)haudio; - pdev->pClassData = pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - AUDIOOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_ISOC, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - pdev->ep_out[AUDIOOutEpAdd & 0xFU].bInterval = AUDIO_HS_BINTERVAL; - } - else /* LOW and FULL-speed endpoints */ - { - pdev->ep_out[AUDIOOutEpAdd & 0xFU].bInterval = AUDIO_FS_BINTERVAL; - } - - /* Open EP OUT */ - (void)USBD_LL_OpenEP(pdev, AUDIOOutEpAdd, USBD_EP_TYPE_ISOC, AUDIO_OUT_PACKET); - pdev->ep_out[AUDIOOutEpAdd & 0xFU].is_used = 1U; - - haudio->alt_setting = 0U; - haudio->offset = AUDIO_OFFSET_UNKNOWN; - haudio->wr_ptr = 0U; - haudio->rd_ptr = 0U; - haudio->rd_enable = 0U; - - /* Initialize the Audio output Hardware layer */ - if (((USBD_AUDIO_ItfTypeDef *)pdev->pUserData[pdev->classId])->Init(USBD_AUDIO_FREQ, - AUDIO_DEFAULT_VOLUME, - 0U) != 0U) - { - return (uint8_t)USBD_FAIL; - } - - /* Prepare Out endpoint to receive 1st packet */ - (void)USBD_LL_PrepareReceive(pdev, AUDIOOutEpAdd, haudio->buffer, - AUDIO_OUT_PACKET); - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_AUDIO_Init - * DeInitialize the AUDIO layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_AUDIO_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - AUDIOOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_ISOC, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Open EP OUT */ - (void)USBD_LL_CloseEP(pdev, AUDIOOutEpAdd); - pdev->ep_out[AUDIOOutEpAdd & 0xFU].is_used = 0U; - pdev->ep_out[AUDIOOutEpAdd & 0xFU].bInterval = 0U; - - /* DeInit physical Interface components */ - if (pdev->pClassDataCmsit[pdev->classId] != NULL) - { - ((USBD_AUDIO_ItfTypeDef *)pdev->pUserData[pdev->classId])->DeInit(0U); - (void)USBD_free(pdev->pClassDataCmsit[pdev->classId]); - pdev->pClassDataCmsit[pdev->classId] = NULL; - pdev->pClassData = NULL; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_AUDIO_Setup - * Handle the AUDIO specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t USBD_AUDIO_Setup(USBD_HandleTypeDef *pdev, - USBD_SetupReqTypedef *req) -{ - USBD_AUDIO_HandleTypeDef *haudio; - uint16_t len; - uint8_t *pbuf; - uint16_t status_info = 0U; - USBD_StatusTypeDef ret = USBD_OK; - - haudio = (USBD_AUDIO_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (haudio == NULL) - { - return (uint8_t)USBD_FAIL; - } - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS: - switch (req->bRequest) - { - case AUDIO_REQ_GET_CUR: - AUDIO_REQ_GetCurrent(pdev, req); - break; - - case AUDIO_REQ_SET_CUR: - AUDIO_REQ_SetCurrent(pdev, req); - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - break; - - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_STATUS: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, (uint8_t *)&status_info, 2U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_GET_DESCRIPTOR: - if ((req->wValue >> 8) == AUDIO_DESCRIPTOR_TYPE) - { - pbuf = (uint8_t *)USBD_AUDIO_GetAudioHeaderDesc(pdev->pConfDesc); - if (pbuf != NULL) - { - len = MIN(USB_AUDIO_DESC_SIZ, req->wLength); - (void)USBD_CtlSendData(pdev, pbuf, len); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - } - break; - - case USB_REQ_GET_INTERFACE: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, (uint8_t *)&haudio->alt_setting, 1U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_SET_INTERFACE: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if ((uint8_t)(req->wValue) <= USBD_MAX_NUM_INTERFACES) - { - haudio->alt_setting = (uint8_t)(req->wValue); - } - else - { - /* Call the error management function (command will be NAKed */ - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_CLEAR_FEATURE: - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - break; - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - - return (uint8_t)ret; -} - -#ifndef USE_USBD_COMPOSITE -/** - * @brief USBD_AUDIO_GetCfgDesc - * return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_AUDIO_GetCfgDesc(uint16_t *length) -{ - *length = (uint16_t)sizeof(USBD_AUDIO_CfgDesc); - - return USBD_AUDIO_CfgDesc; -} -#endif /* USE_USBD_COMPOSITE */ -/** - * @brief USBD_AUDIO_DataIn - * handle data IN Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_AUDIO_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - UNUSED(pdev); - UNUSED(epnum); - - /* Only OUT data are processed */ - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_AUDIO_EP0_RxReady - * handle EP0 Rx Ready event - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_AUDIO_EP0_RxReady(USBD_HandleTypeDef *pdev) -{ - USBD_AUDIO_HandleTypeDef *haudio; - haudio = (USBD_AUDIO_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (haudio == NULL) - { - return (uint8_t)USBD_FAIL; - } - - if (haudio->control.cmd == AUDIO_REQ_SET_CUR) - { - /* In this driver, to simplify code, only SET_CUR request is managed */ - - if (haudio->control.unit == AUDIO_OUT_STREAMING_CTRL) - { - ((USBD_AUDIO_ItfTypeDef *)pdev->pUserData[pdev->classId])->MuteCtl(haudio->control.data[0]); - haudio->control.cmd = 0U; - haudio->control.len = 0U; - } - } - - return (uint8_t)USBD_OK; -} -/** - * @brief USBD_AUDIO_EP0_TxReady - * handle EP0 TRx Ready event - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_AUDIO_EP0_TxReady(USBD_HandleTypeDef *pdev) -{ - UNUSED(pdev); - - /* Only OUT control data are processed */ - return (uint8_t)USBD_OK; -} -/** - * @brief USBD_AUDIO_SOF - * handle SOF event - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_AUDIO_SOF(USBD_HandleTypeDef *pdev) -{ - UNUSED(pdev); - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_AUDIO_SOF - * handle SOF event - * @param pdev: device instance - * @param offset: audio offset - * @retval status - */ -void USBD_AUDIO_Sync(USBD_HandleTypeDef *pdev, AUDIO_OffsetTypeDef offset) -{ - USBD_AUDIO_HandleTypeDef *haudio; - uint32_t BufferSize = AUDIO_TOTAL_BUF_SIZE / 2U; - - if (pdev->pClassDataCmsit[pdev->classId] == NULL) - { - return; - } - - haudio = (USBD_AUDIO_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - haudio->offset = offset; - - if (haudio->rd_enable == 1U) - { - haudio->rd_ptr += (uint16_t)BufferSize; - - if (haudio->rd_ptr == AUDIO_TOTAL_BUF_SIZE) - { - /* roll back */ - haudio->rd_ptr = 0U; - } - } - - if (haudio->rd_ptr > haudio->wr_ptr) - { - if ((haudio->rd_ptr - haudio->wr_ptr) < AUDIO_OUT_PACKET) - { - BufferSize += 4U; - } - else - { - if ((haudio->rd_ptr - haudio->wr_ptr) > (AUDIO_TOTAL_BUF_SIZE - AUDIO_OUT_PACKET)) - { - BufferSize -= 4U; - } - } - } - else - { - if ((haudio->wr_ptr - haudio->rd_ptr) < AUDIO_OUT_PACKET) - { - BufferSize -= 4U; - } - else - { - if ((haudio->wr_ptr - haudio->rd_ptr) > (AUDIO_TOTAL_BUF_SIZE - AUDIO_OUT_PACKET)) - { - BufferSize += 4U; - } - } - } - - if (haudio->offset == AUDIO_OFFSET_FULL) - { - ((USBD_AUDIO_ItfTypeDef *)pdev->pUserData[pdev->classId])->AudioCmd(&haudio->buffer[0], - BufferSize, AUDIO_CMD_PLAY); - haudio->offset = AUDIO_OFFSET_NONE; - } -} - -/** - * @brief USBD_AUDIO_IsoINIncomplete - * handle data ISO IN Incomplete event - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_AUDIO_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - UNUSED(pdev); - UNUSED(epnum); - - return (uint8_t)USBD_OK; -} -/** - * @brief USBD_AUDIO_IsoOutIncomplete - * handle data ISO OUT Incomplete event - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_AUDIO_IsoOutIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - USBD_AUDIO_HandleTypeDef *haudio; - - if (pdev->pClassDataCmsit[pdev->classId] == NULL) - { - return (uint8_t)USBD_FAIL; - } - - haudio = (USBD_AUDIO_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - /* Prepare Out endpoint to receive next audio packet */ - (void)USBD_LL_PrepareReceive(pdev, epnum, - &haudio->buffer[haudio->wr_ptr], - AUDIO_OUT_PACKET); - - return (uint8_t)USBD_OK; -} -/** - * @brief USBD_AUDIO_DataOut - * handle data OUT Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_AUDIO_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - uint16_t PacketSize; - USBD_AUDIO_HandleTypeDef *haudio; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - AUDIOOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_ISOC, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - haudio = (USBD_AUDIO_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (haudio == NULL) - { - return (uint8_t)USBD_FAIL; - } - - if (epnum == AUDIOOutEpAdd) - { - /* Get received data packet length */ - PacketSize = (uint16_t)USBD_LL_GetRxDataSize(pdev, epnum); - - /* Packet received Callback */ - ((USBD_AUDIO_ItfTypeDef *)pdev->pUserData[pdev->classId])->PeriodicTC(&haudio->buffer[haudio->wr_ptr], - PacketSize, AUDIO_OUT_TC); - - /* Increment the Buffer pointer or roll it back when all buffers are full */ - haudio->wr_ptr += PacketSize; - - if (haudio->wr_ptr >= AUDIO_TOTAL_BUF_SIZE) - { - /* All buffers are full: roll back */ - haudio->wr_ptr = 0U; - - if (haudio->offset == AUDIO_OFFSET_UNKNOWN) - { - ((USBD_AUDIO_ItfTypeDef *)pdev->pUserData[pdev->classId])->AudioCmd(&haudio->buffer[0], - AUDIO_TOTAL_BUF_SIZE / 2U, - AUDIO_CMD_START); - haudio->offset = AUDIO_OFFSET_NONE; - } - } - - if (haudio->rd_enable == 0U) - { - if (haudio->wr_ptr == (AUDIO_TOTAL_BUF_SIZE / 2U)) - { - haudio->rd_enable = 1U; - } - } - - /* Prepare Out endpoint to receive next audio packet */ - (void)USBD_LL_PrepareReceive(pdev, AUDIOOutEpAdd, - &haudio->buffer[haudio->wr_ptr], - AUDIO_OUT_PACKET); - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief AUDIO_Req_GetCurrent - * Handles the GET_CUR Audio control request. - * @param pdev: device instance - * @param req: setup class request - * @retval status - */ -static void AUDIO_REQ_GetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_AUDIO_HandleTypeDef *haudio; - haudio = (USBD_AUDIO_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (haudio == NULL) - { - return; - } - - (void)USBD_memset(haudio->control.data, 0, USB_MAX_EP0_SIZE); - - /* Send the current mute state */ - (void)USBD_CtlSendData(pdev, haudio->control.data, - MIN(req->wLength, USB_MAX_EP0_SIZE)); -} - -/** - * @brief AUDIO_Req_SetCurrent - * Handles the SET_CUR Audio control request. - * @param pdev: device instance - * @param req: setup class request - * @retval status - */ -static void AUDIO_REQ_SetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_AUDIO_HandleTypeDef *haudio; - haudio = (USBD_AUDIO_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (haudio == NULL) - { - return; - } - - if (req->wLength != 0U) - { - haudio->control.cmd = AUDIO_REQ_SET_CUR; /* Set the request value */ - haudio->control.len = (uint8_t)MIN(req->wLength, USB_MAX_EP0_SIZE); /* Set the request data length */ - haudio->control.unit = HIBYTE(req->wIndex); /* Set the request target unit */ - - /* Prepare the reception of the buffer over EP0 */ - (void)USBD_CtlPrepareRx(pdev, haudio->control.data, haudio->control.len); - } -} - -#ifndef USE_USBD_COMPOSITE -/** - * @brief DeviceQualifierDescriptor - * return Device Qualifier descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_AUDIO_GetDeviceQualifierDesc(uint16_t *length) -{ - *length = (uint16_t)sizeof(USBD_AUDIO_DeviceQualifierDesc); - - return USBD_AUDIO_DeviceQualifierDesc; -} -#endif /* USE_USBD_COMPOSITE */ -/** - * @brief USBD_AUDIO_RegisterInterface - * @param pdev: device instance - * @param fops: Audio interface callback - * @retval status - */ -uint8_t USBD_AUDIO_RegisterInterface(USBD_HandleTypeDef *pdev, - USBD_AUDIO_ItfTypeDef *fops) -{ - if (fops == NULL) - { - return (uint8_t)USBD_FAIL; - } - - pdev->pUserData[pdev->classId] = fops; - - return (uint8_t)USBD_OK; -} - -#ifdef USE_USBD_COMPOSITE -/** - * @brief USBD_AUDIO_GetEpPcktSze - * @param pdev: device instance (reserved for future use) - * @param If: Interface number (reserved for future use) - * @param Ep: Endpoint number (reserved for future use) - * @retval status - */ -uint32_t USBD_AUDIO_GetEpPcktSze(USBD_HandleTypeDef *pdev, uint8_t If, uint8_t Ep) -{ - uint32_t mps; - - UNUSED(pdev); - UNUSED(If); - UNUSED(Ep); - - mps = AUDIO_PACKET_SZE_WORD(USBD_AUDIO_FREQ); - - /* Return the wMaxPacketSize value in Bytes (Freq(Samples)*2(Stereo)*2(HalfWord)) */ - return mps; -} -#endif /* USE_USBD_COMPOSITE */ - -/** - * @brief USBD_AUDIO_GetAudioHeaderDesc - * This function return the Audio descriptor - * @param pdev: device instance - * @param pConfDesc: pointer to Bos descriptor - * @retval pointer to the Audio AC Header descriptor - */ -static void *USBD_AUDIO_GetAudioHeaderDesc(uint8_t *pConfDesc) -{ - USBD_ConfigDescTypeDef *desc = (USBD_ConfigDescTypeDef *)(void *)pConfDesc; - USBD_DescHeaderTypeDef *pdesc = (USBD_DescHeaderTypeDef *)(void *)pConfDesc; - uint8_t *pAudioDesc = NULL; - uint16_t ptr; - - if (desc->wTotalLength > desc->bLength) - { - ptr = desc->bLength; - - while (ptr < desc->wTotalLength) - { - pdesc = USBD_GetNextDesc((uint8_t *)pdesc, &ptr); - if ((pdesc->bDescriptorType == AUDIO_INTERFACE_DESCRIPTOR_TYPE) && - (pdesc->bDescriptorSubType == AUDIO_CONTROL_HEADER)) - { - pAudioDesc = (uint8_t *)pdesc; - break; - } - } - } - return pAudioDesc; -} - -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ diff --git a/Class/AUDIO/Src/usbd_audio_if_template.c b/Class/AUDIO/Src/usbd_audio_if_template.c deleted file mode 100644 index c9db989..0000000 --- a/Class/AUDIO/Src/usbd_audio_if_template.c +++ /dev/null @@ -1,198 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc_if_template.c - * @author MCD Application Team - * @brief Generic media access Layer. - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* BSPDependencies -- "stm32xxxxx_{eval}{discovery}.c" -- "stm32xxxxx_{eval}{discovery}_io.c" -- "stm32xxxxx_{eval}{discovery}_audio.c" -EndBSPDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_audio_if_template.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_AUDIO - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_AUDIO_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_AUDIO_Private_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_AUDIO_Private_Macros - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_AUDIO_Private_FunctionPrototypes - * @{ - */ - -static int8_t TEMPLATE_Init(uint32_t AudioFreq, uint32_t Volume, uint32_t options); -static int8_t TEMPLATE_DeInit(uint32_t options); -static int8_t TEMPLATE_AudioCmd(uint8_t *pbuf, uint32_t size, uint8_t cmd); -static int8_t TEMPLATE_VolumeCtl(uint8_t vol); -static int8_t TEMPLATE_MuteCtl(uint8_t cmd); -static int8_t TEMPLATE_PeriodicTC(uint8_t *pbuf, uint32_t size, uint8_t cmd); -static int8_t TEMPLATE_GetState(void); - -USBD_AUDIO_ItfTypeDef USBD_AUDIO_Template_fops = -{ - TEMPLATE_Init, - TEMPLATE_DeInit, - TEMPLATE_AudioCmd, - TEMPLATE_VolumeCtl, - TEMPLATE_MuteCtl, - TEMPLATE_PeriodicTC, - TEMPLATE_GetState, -}; - -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief TEMPLATE_Init - * Initializes the AUDIO media low layer - * @param None - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t TEMPLATE_Init(uint32_t AudioFreq, uint32_t Volume, uint32_t options) -{ - UNUSED(AudioFreq); - UNUSED(Volume); - UNUSED(options); - - /* - Add your initialization code here - */ - return (0); -} - -/** - * @brief TEMPLATE_DeInit - * DeInitializes the AUDIO media low layer - * @param None - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t TEMPLATE_DeInit(uint32_t options) -{ - UNUSED(options); - - /* - Add your deinitialization code here - */ - return (0); -} - - -/** - * @brief TEMPLATE_AudioCmd - * AUDIO command handler - * @param Buf: Buffer of data to be sent - * @param size: Number of data to be sent (in bytes) - * @param cmd: command opcode - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t TEMPLATE_AudioCmd(uint8_t *pbuf, uint32_t size, uint8_t cmd) -{ - UNUSED(pbuf); - UNUSED(size); - UNUSED(cmd); - - return (0); -} - -/** - * @brief TEMPLATE_VolumeCtl - * @param vol: volume level (0..100) - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t TEMPLATE_VolumeCtl(uint8_t vol) -{ - UNUSED(vol); - - return (0); -} - -/** - * @brief TEMPLATE_MuteCtl - * @param cmd: vmute command - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t TEMPLATE_MuteCtl(uint8_t cmd) -{ - UNUSED(cmd); - - return (0); -} - -/** - * @brief TEMPLATE_PeriodicTC - * @param cmd - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t TEMPLATE_PeriodicTC(uint8_t *pbuf, uint32_t size, uint8_t cmd) -{ - UNUSED(pbuf); - UNUSED(size); - UNUSED(cmd); - - return (0); -} - -/** - * @brief TEMPLATE_GetState - * @param None - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t TEMPLATE_GetState(void) -{ - return (0); -} -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/Class/BillBoard/Inc/usbd_billboard.h b/Class/BillBoard/Inc/usbd_billboard.h deleted file mode 100644 index 8045140..0000000 --- a/Class/BillBoard/Inc/usbd_billboard.h +++ /dev/null @@ -1,160 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_billboard.h - * @author MCD Application Team - * @brief Header file for the usbd_billboard.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_BB_H -#define __USB_BB_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" -#include "usbd_desc.h" -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_BB - * @brief This file is the Header file for usbd_billboard.c - * @{ - */ - -/** @defgroup USBD_BB_Exported_Defines - * @{ - */ -#define USB_BB_CONFIG_DESC_SIZ 18U - -#ifndef USB_BB_MAX_NUM_ALT_MODE -#define USB_BB_MAX_NUM_ALT_MODE 0x2U -#endif /* USB_BB_MAX_NUM_ALT_MODE */ - -#ifndef USBD_BB_IF_STRING_INDEX -#define USBD_BB_IF_STRING_INDEX 0x10U -#endif /* USBD_BB_IF_STRING_INDEX */ - - -#define USBD_BILLBOARD_CAPABILITY 0x0DU -#define USBD_BILLBOARD_ALTMODE_CAPABILITY 0x0FU - -/** - * @} - */ - - -/** @defgroup USBD_CORE_Exported_TypesDefinitions - * @{ - */ -typedef struct _BB_DescHeader -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDevCapabilityType; -} -USBD_BB_DescHeader_t; - -typedef struct -{ - uint16_t wSVID; - uint8_t bAlternateMode; - uint8_t iAlternateModeString; -} USBD_BB_AltModeTypeDef; - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDevCapabilityType; - uint8_t bIndex; - uint32_t dwAlternateModeVdo; -} USBD_BB_AltModeCapDescTypeDef; - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDevCapabilityType; - uint8_t iAddtionalInfoURL; - uint8_t bNbrOfAltModes; - uint8_t bPreferredAltMode; - uint16_t VconnPwr; - uint8_t bmConfigured[32]; - uint16_t bcdVersion; - uint8_t bAdditionalFailureInfo; - uint8_t bReserved; - USBD_BB_AltModeTypeDef wSVID[USB_BB_MAX_NUM_ALT_MODE]; -} USBD_BosBBCapDescTypedef; - -typedef enum -{ - UNSPECIFIED_ERROR = 0, - CONFIGURATION_NOT_ATTEMPTED, - CONFIGURATION_UNSUCCESSFUL, - CONFIGURATION_SUCCESSFUL, -} BB_AltModeState; - -/** - * @} - */ - - - -/** @defgroup USBD_CORE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Exported_Variables - * @{ - */ - -extern USBD_ClassTypeDef USBD_BB; -#define USBD_BB_CLASS &USBD_BB -/** - * @} - */ - -/** @defgroup USB_CORE_Exported_Functions - * @{ - */ - -#if (USBD_CLASS_BOS_ENABLED == 1) -void *USBD_BB_GetCapDesc(USBD_HandleTypeDef *pdev, uint8_t *buf); -void *USBD_BB_GetAltModeDesc(USBD_HandleTypeDef *pdev, uint8_t *buf, uint8_t idx); -#endif /* (USBD_CLASS_BOS_ENABLED == 1) */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_BB_H */ -/** - * @} - */ - -/** - * @} - */ diff --git a/Class/BillBoard/Src/usbd_billboard.c b/Class/BillBoard/Src/usbd_billboard.c deleted file mode 100644 index f86c003..0000000 --- a/Class/BillBoard/Src/usbd_billboard.c +++ /dev/null @@ -1,502 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_billboard.c - * @author MCD Application Team - * @brief This file provides the high layer firmware functions to manage the - * following functionalities of the USB BillBoard Class: - * - Initialization and Configuration of high and low layer - * - Enumeration as BillBoard Device - * - Error management - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - * @verbatim - * - * =================================================================== - * BillBoard Class Description - * =================================================================== - * This module manages the BillBoard class V1.2.1 following the "Device Class Definition - * for BillBoard Devices (BB) Version R1.2.1 Sept 08, 2016". - * This driver implements the following aspects of the specification: - * - Device descriptor management - * - Configuration descriptor management - * - Enumeration as an USB BillBoard device - * - Enumeration & management of BillBoard device supported alternate modes - * - * @endverbatim - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_billboard.h" -#include "usbd_ctlreq.h" - - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_BB - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_BB_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_BB_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_BB_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_BB_Private_FunctionPrototypes - * @{ - */ - -static uint8_t USBD_BB_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_BB_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_BB_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static uint8_t USBD_BB_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_BB_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_BB_EP0_RxReady(USBD_HandleTypeDef *pdev); - -static uint8_t *USBD_BB_GetCfgDesc(uint16_t *length); -static uint8_t *USBD_BB_GetDeviceQualifierDesc(uint16_t *length); -static uint8_t *USBD_BB_GetOtherSpeedCfgDesc(uint16_t *length); - -#if (USBD_CLASS_BOS_ENABLED == 1) -USBD_BB_DescHeader_t *USBD_BB_GetNextDesc(uint8_t *pbuf, uint16_t *ptr); -#endif /* USBD_CLASS_BOS_ENABLED */ - - - -/** - * @} - */ - -/** @defgroup USBD_BB_Private_Variables - * @{ - */ -USBD_ClassTypeDef USBD_BB = -{ - USBD_BB_Init, /* Init */ - USBD_BB_DeInit, /* DeInit */ - USBD_BB_Setup, /* Setup */ - NULL, /* EP0_TxSent */ - USBD_BB_EP0_RxReady, /* EP0_RxReady */ - USBD_BB_DataIn, /* DataIn */ - USBD_BB_DataOut, /* DataOut */ - NULL, /* SOF */ - NULL, - NULL, - USBD_BB_GetCfgDesc, - USBD_BB_GetCfgDesc, - USBD_BB_GetOtherSpeedCfgDesc, - USBD_BB_GetDeviceQualifierDesc, -#if (USBD_SUPPORT_USER_STRING_DESC == 1U) - NULL, -#endif /* USBD_SUPPORT_USER_STRING_DESC */ -}; - -/* USB Standard Device Qualifier Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_BB_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = -{ - USB_LEN_DEV_QUALIFIER_DESC, /* bLength */ - USB_DESC_TYPE_DEVICE_QUALIFIER, /* bDescriptorType */ - 0x01, /* bcdUSB */ - 0x20, - 0x11, /* bDeviceClass */ - 0x00, /* bDeviceSubClass */ - 0x00, /* bDeviceProtocol */ - 0x40, /* bMaxPacketSize0 */ - 0x01, /* bNumConfigurations */ - 0x00, /* bReserved */ -}; - -/* USB device Configuration Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_BB_CfgDesc[USB_BB_CONFIG_DESC_SIZ] __ALIGN_END = -{ - 0x09, /* bLength: Configuration Descriptor size */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - USB_BB_CONFIG_DESC_SIZ, /* wTotalLength: Bytes returned */ - 0x00, - 0x01, /* bNumInterfaces: 1 interface */ - 0x01, /* bConfigurationValue: Configuration value */ - USBD_IDX_CONFIG_STR, /* iConfiguration: Index of string descriptor describing the configuration */ -#if (USBD_SELF_POWERED == 1U) - 0xC0, /* bmAttributes: Bus Powered according to user configuration */ -#else - 0x80, /* bmAttributes: Bus Powered according to user configuration */ -#endif /* USBD_SELF_POWERED */ - USBD_MAX_POWER, /* MaxPower (mA) */ - /* 09 */ - - /************** Descriptor of BillBoard interface ****************/ - /* 09 */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x00, /* bNumEndpoints */ - 0x11, /* bInterfaceClass: billboard */ - 0x00, /* bInterfaceSubClass */ - 0x00, /* nInterfaceProtocol */ - USBD_BB_IF_STRING_INDEX, /* iInterface: Index of string descriptor */ -}; - -/* USB device Other Speed Configuration Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_BB_OtherSpeedCfgDesc[USB_BB_CONFIG_DESC_SIZ] __ALIGN_END = -{ - 0x09, /* bLength: Configuration Descriptor size */ - USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION, - USB_BB_CONFIG_DESC_SIZ, - 0x00, - 0x01, /* bNumInterfaces: 1 interface */ - 0x01, /* bConfigurationValue */ - USBD_IDX_CONFIG_STR, /* iConfiguration */ -#if (USBD_SELF_POWERED == 1U) - 0xC0, /* bmAttributes: Bus Powered according to user configuration */ -#else - 0x80, /* bmAttributes: Bus Powered according to user configuration */ -#endif /* USBD_SELF_POWERED */ - USBD_MAX_POWER, /* MaxPower (mA) */ - - /************** Descriptor of BillBoard interface ****************/ - /* 09 */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x00, /* bNumEndpoints*/ - 0x11, /* bInterfaceClass: billboard */ - 0x00, /* bInterfaceSubClass */ - 0x00, /* nInterfaceProtocol */ - USBD_BB_IF_STRING_INDEX, /* iInterface: Index of string descriptor */ -} ; - -/** - * @} - */ - -/** @defgroup USBD_BB_Private_Functions - * @{ - */ - -/** - * @brief USBD_BB_Init - * Initialize the BB interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_BB_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - /* Prevent unused argument compilation warning */ - UNUSED(pdev); - UNUSED(cfgidx); - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_BB_Init - * DeInitialize the BB layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_BB_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - /* Prevent unused argument compilation warning */ - UNUSED(pdev); - UNUSED(cfgidx); - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_BB_Setup - * Handle the BB specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t USBD_BB_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_StatusTypeDef ret = USBD_OK; - uint16_t status_info = 0U; - uint16_t AltSetting = 0U; - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS: - break; - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_STATUS: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, (uint8_t *)&status_info, 2U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_GET_INTERFACE: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, (uint8_t *)&AltSetting, 1U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_SET_INTERFACE: - case USB_REQ_CLEAR_FEATURE: - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - - return (uint8_t)ret; -} - -/** - * @brief USBD_BB_DataIn - * Data sent on non-control IN endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t USBD_BB_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - /* Prevent unused argument compilation warning */ - UNUSED(pdev); - UNUSED(epnum); - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_BB_DataOut - * Data received on non-control Out endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t USBD_BB_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - /* Prevent unused argument compilation warning */ - UNUSED(pdev); - UNUSED(epnum); - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_BB_EP0_RxReady - * Handle EP0 Rx Ready event - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_BB_EP0_RxReady(USBD_HandleTypeDef *pdev) -{ - /* Prevent unused argument compilation warning */ - UNUSED(pdev); - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_BB_GetCfgDesc - * return configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_BB_GetCfgDesc(uint16_t *length) -{ - *length = (uint16_t)sizeof(USBD_BB_CfgDesc); - return USBD_BB_CfgDesc; -} - -/** - * @brief USBD_BB_GetOtherSpeedCfgDesc - * return other speed configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -uint8_t *USBD_BB_GetOtherSpeedCfgDesc(uint16_t *length) -{ - *length = (uint16_t)sizeof(USBD_BB_OtherSpeedCfgDesc); - return USBD_BB_OtherSpeedCfgDesc; -} - -/** - * @brief DeviceQualifierDescriptor - * return Device Qualifier descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_BB_GetDeviceQualifierDesc(uint16_t *length) -{ - *length = (uint16_t)sizeof(USBD_BB_DeviceQualifierDesc); - return USBD_BB_DeviceQualifierDesc; -} - - -#if (USBD_CLASS_BOS_ENABLED == 1U) -/** - * @brief USBD_BB_GetNextDesc - * This function return the next descriptor header - * @param buf: Buffer where the descriptor is available - * @param ptr: data pointer inside the descriptor - * @retval next header - */ -USBD_BB_DescHeader_t *USBD_BB_GetNextDesc(uint8_t *pbuf, uint16_t *ptr) -{ - USBD_BB_DescHeader_t *pnext = (USBD_BB_DescHeader_t *)(void *)pbuf; - - *ptr += pnext->bLength; - pnext = (USBD_BB_DescHeader_t *)(void *)(pbuf + pnext->bLength); - - return (pnext); -} - - -/** - * @brief USBD_BB_GetCapDesc - * This function return the Billboard Capability descriptor - * @param pdev: device instance - * @param pBosDesc: pointer to Bos descriptor - * @retval pointer to Billboard Capability descriptor - */ -void *USBD_BB_GetCapDesc(USBD_HandleTypeDef *pdev, uint8_t *pBosDesc) -{ - UNUSED(pdev); - - USBD_BB_DescHeader_t *pdesc = (USBD_BB_DescHeader_t *)(void *)pBosDesc; - USBD_BosDescTypeDef *desc = (USBD_BosDescTypeDef *)(void *)pBosDesc; - USBD_BosBBCapDescTypedef *pCapDesc = NULL; - uint16_t ptr; - - if (desc->wTotalLength > desc->bLength) - { - ptr = desc->bLength; - - while (ptr < desc->wTotalLength) - { - pdesc = USBD_BB_GetNextDesc((uint8_t *)pdesc, &ptr); - - if (pdesc->bDevCapabilityType == USBD_BILLBOARD_CAPABILITY) - { - pCapDesc = (USBD_BosBBCapDescTypedef *)(void *)pdesc; - break; - } - } - } - return (void *)pCapDesc; -} - - -/** - * @brief USBD_BB_GetAltModeDesc - * This function return the Billboard Alternate Mode descriptor - * @param pdev: device instance - * @param pBosDesc: pointer to Bos descriptor - * @param idx: Index of requested Alternate Mode descriptor - * @retval pointer to Alternate Mode descriptor - */ -void *USBD_BB_GetAltModeDesc(USBD_HandleTypeDef *pdev, uint8_t *pBosDesc, uint8_t idx) -{ - UNUSED(pdev); - - USBD_BB_DescHeader_t *pdesc = (USBD_BB_DescHeader_t *)(void *)pBosDesc; - USBD_BosDescTypeDef *desc = (USBD_BosDescTypeDef *)(void *)pBosDesc; - USBD_BB_AltModeCapDescTypeDef *pAltModDesc = NULL; - uint8_t cnt = 0U; - uint16_t ptr; - - if (desc->wTotalLength > desc->bLength) - { - ptr = desc->bLength; - - while (ptr < desc->wTotalLength) - { - pdesc = USBD_BB_GetNextDesc((uint8_t *)pdesc, &ptr); - - if (pdesc->bDevCapabilityType == USBD_BILLBOARD_ALTMODE_CAPABILITY) - { - if (cnt == idx) - { - pAltModDesc = (USBD_BB_AltModeCapDescTypeDef *)(void *)pdesc; - break; - } - else - { - cnt++; - } - } - } - } - return (void *)pAltModDesc; -} -#endif /* USBD_CLASS_BOS_ENABLED */ - -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ diff --git a/Class/CCID/Inc/usbd_ccid.h b/Class/CCID/Inc/usbd_ccid.h deleted file mode 100644 index e8d12be..0000000 --- a/Class/CCID/Inc/usbd_ccid.h +++ /dev/null @@ -1,375 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ccid.h - * @author MCD Application Team - * @brief header file for the usbd_ccid.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CCID_H -#define __USBD_CCID_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup usbd_cdc - * @brief This file is the Header file for usbd_ccid.c - * @{ - */ - - -/** @defgroup usbd_cdc_Exported_Defines - * @{ - */ -#ifndef CCID_IN_EP -#define CCID_IN_EP 0x81U /* EP1 for data IN */ -#endif /* CCID_IN_EP */ - -#ifndef CCID_OUT_EP -#define CCID_OUT_EP 0x01U /* EP1 for data OUT */ -#endif /* CCID_OUT_EP */ - -#ifndef CCID_CMD_EP -#define CCID_CMD_EP 0x82U /* EP2 for CCID commands */ -#endif /* CCID_CMD_EP */ - -#ifndef CCID_CMD_HS_BINTERVAL -#define CCID_CMD_HS_BINTERVAL 0x10U -#endif /* CCID_CMD_HS_BINTERVAL */ - -#ifndef CCID_CMD_FS_BINTERVAL -#define CCID_CMD_FS_BINTERVAL 0x10U -#endif /* CCID_CMD_FS_BINTERVAL */ - -#ifndef CCID_CMD_PACKET_SIZE -#define CCID_CMD_PACKET_SIZE 8U /* Control Endpoint Packet size */ -#endif /* CCID_CMD_PACKET_SIZE */ - -#define CCID_DATA_HS_MAX_PACKET_SIZE 512U /* Endpoint IN & OUT Packet size */ -#define CCID_DATA_FS_MAX_PACKET_SIZE 64U /* Endpoint IN & OUT Packet size */ - -#define USB_CCID_CONFIG_DESC_SIZ 93U -#define CCID_DATA_HS_IN_PACKET_SIZE CCID_DATA_HS_MAX_PACKET_SIZE -#define CCID_DATA_HS_OUT_PACKET_SIZE CCID_DATA_HS_MAX_PACKET_SIZE - -#define CCID_DATA_FS_IN_PACKET_SIZE CCID_DATA_FS_MAX_PACKET_SIZE -#define CCID_DATA_FS_OUT_PACKET_SIZE CCID_DATA_FS_MAX_PACKET_SIZE - -/*---------------------------------------------------------------------*/ -/* CCID definitions */ -/*---------------------------------------------------------------------*/ -#define CCID_SEND_ENCAPSULATED_COMMAND 0x00U -#define CCID_GET_ENCAPSULATED_RESPONSE 0x01U -#define CCID_SET_COMM_FEATURE 0x02U -#define CCID_GET_COMM_FEATURE 0x03U -#define CCID_CLEAR_COMM_FEATURE 0x04U -#define CCID_SET_LINE_CODING 0x20U -#define CCID_GET_LINE_CODING 0x21U -#define CCID_SET_CONTROL_LINE_STATE 0x22U -#define CCID_SEND_BREAK 0x23U - -/*---------------------------------------------------------------------*/ -#define REQUEST_ABORT 0x01U -#define REQUEST_GET_CLOCK_FREQUENCIES 0x02U -#define REQUEST_GET_DATA_RATES 0x03U - -/*---------------------------------------------------------------------*/ -/* The Smart Card Device Class Descriptor definitions */ -/*---------------------------------------------------------------------*/ - -#define CCID_INTERFACE_DESC_SIZE 0x09U -#define USB_DEVICE_CLASS_CCID 0x0BU -#define CCID_CLASS_DESC_SIZE 0x36U -#define CCID_DESC_TYPE 0x21U - -#ifndef CCID_VOLTAGE_SUPP -#define CCID_VOLTAGE_SUPP 0x07U -#endif /* CCID_VOLTAGE_SUPP */ -#ifndef USBD_CCID_PROTOCOL -#define USBD_CCID_PROTOCOL 0x03U -#endif /* USBD_CCID_PROTOCOL */ -#ifndef USBD_CCID_DEFAULT_CLOCK_FREQ -#define USBD_CCID_DEFAULT_CLOCK_FREQ 3600U -#endif /* USBD_CCID_DEFAULT_CLOCK_FREQ */ -#ifndef USBD_CCID_MAX_CLOCK_FREQ -#define USBD_CCID_MAX_CLOCK_FREQ USBD_CCID_DEFAULT_CLOCK_FREQ -#endif /* USBD_CCID_MAX_CLOCK_FREQ */ -#ifndef USBD_CCID_DEFAULT_DATA_RATE -#define USBD_CCID_DEFAULT_DATA_RATE 9677U -#endif /* USBD_CCID_DEFAULT_DATA_RATE */ -#ifndef USBD_CCID_MAX_DATA_RATE -#define USBD_CCID_MAX_DATA_RATE USBD_CCID_DEFAULT_DATA_RATE -#endif /* USBD_CCID_MAX_DATA_RATE */ -#ifndef USBD_CCID_MAX_INF_FIELD_SIZE -#define USBD_CCID_MAX_INF_FIELD_SIZE 254U -#endif /* USBD_CCID_MAX_INF_FIELD_SIZE */ -#ifndef CCID_MAX_BLOCK_SIZE_HEADER -#define CCID_MAX_BLOCK_SIZE_HEADER 271U -#endif /* CCID_MAX_BLOCK_SIZE_HEADER */ - -#define TPDU_EXCHANGE 0x01U -#define SHORT_APDU_EXCHANGE 0x02U -#define EXTENDED_APDU_EXCHANGE 0x04U -#define CHARACTER_EXCHANGE 0x00U - -#ifndef EXCHANGE_LEVEL_FEATURE -#define EXCHANGE_LEVEL_FEATURE TPDU_EXCHANGE -#endif /* EXCHANGE_LEVEL_FEATURE */ - -#define CCID_ENDPOINT_DESC_SIZE 0x07U - -#ifndef CCID_EP0_BUFF_SIZ -#define CCID_EP0_BUFF_SIZ 64U -#endif /* CCID_EP0_BUFF_SIZ */ - -#ifndef CCID_BULK_EPIN_SIZE -#define CCID_BULK_EPIN_SIZE 64U -#endif /* CCID_BULK_EPIN_SIZE */ - -#define CCID_INT_BUFF_SIZ 2U -/*---------------------------------------------------------------------*/ -/* - * CCID Class specification revision 1.1 - * Command Pipe. Bulk Messages - */ - -/* CCID Bulk Out Command definitions */ -#define PC_TO_RDR_ICCPOWERON 0x62U -#define PC_TO_RDR_ICCPOWEROFF 0x63U -#define PC_TO_RDR_GETSLOTSTATUS 0x65U -#define PC_TO_RDR_XFRBLOCK 0x6FU -#define PC_TO_RDR_GETPARAMETERS 0x6CU -#define PC_TO_RDR_RESETPARAMETERS 0x6DU -#define PC_TO_RDR_SETPARAMETERS 0x61U -#define PC_TO_RDR_ESCAPE 0x6BU -#define PC_TO_RDR_ICCCLOCK 0x6EU -#define PC_TO_RDR_T0APDU 0x6AU -#define PC_TO_RDR_SECURE 0x69U -#define PC_TO_RDR_MECHANICAL 0x71U -#define PC_TO_RDR_ABORT 0x72U -#define PC_TO_RDR_SETDATARATEANDCLOCKFREQUENCY 0x73U - -/* CCID Bulk In Command definitions */ -#define RDR_TO_PC_DATABLOCK 0x80U -#define RDR_TO_PC_SLOTSTATUS 0x81U -#define RDR_TO_PC_PARAMETERS 0x82U -#define RDR_TO_PC_ESCAPE 0x83U -#define RDR_TO_PC_DATARATEANDCLOCKFREQUENCY 0x84U - -/* CCID Interrupt In Command definitions */ -#define RDR_TO_PC_NOTIFYSLOTCHANGE 0x50U -#define RDR_TO_PC_HARDWAREERROR 0x51U - -/* Bulk-only Command Block Wrapper */ -#define ABDATA_SIZE 261U -#define CCID_CMD_HEADER_SIZE 10U -#define CCID_RESPONSE_HEADER_SIZE 10U - -/* Number of SLOTS. For single card, this value is 1 */ -#define CCID_NUMBER_OF_SLOTS 1U - -#define CARD_SLOT_FITTED 1U -#define CARD_SLOT_REMOVED 0U - -#define OFFSET_INT_BMESSAGETYPE 0x00U -#define OFFSET_INT_BMSLOTICCSTATE 0x01U -#define SLOT_ICC_PRESENT 0x01U -/* LSb : (0b = no ICC present, 1b = ICC present) */ -#define SLOT_ICC_CHANGE 0x02U -/* MSb : (0b = no change, 1b = change) */ - - -/** - * @} - */ - - -/** @defgroup USBD_CORE_Exported_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -typedef struct -{ - uint32_t bitrate; - uint8_t format; - uint8_t paritytype; - uint8_t datatype; -} USBD_CCID_LineCodingTypeDef; - -typedef struct -{ - uint8_t bMessageType; /* Offset = 0*/ - uint32_t dwLength; /* Offset = 1, The length field (dwLength) is the length - of the message not including the 10-byte header.*/ - uint8_t bSlot; /* Offset = 5*/ - uint8_t bSeq; /* Offset = 6*/ - uint8_t bSpecific_0; /* Offset = 7*/ - uint8_t bSpecific_1; /* Offset = 8*/ - uint8_t bSpecific_2; /* Offset = 9*/ - uint8_t abData [ABDATA_SIZE]; /* Offset = 10, For reference, the absolute - maximum block size for a TPDU T=0 block is 260 bytes - (5 bytes command; 255 bytes data), - or for a TPDU T=1 block is 259 bytes, - or for a short APDU T=1 block is 261 bytes, - or for an extended APDU T=1 block is 65544 bytes.*/ -} __PACKED USBD_CCID_BulkOut_DataTypeDef; - -typedef struct -{ - uint8_t bMessageType; /* Offset = 0 */ - uint32_t dwLength; /* Offset = 1 */ - uint8_t bSlot; /* Offset = 5, Same as Bulk-OUT message */ - uint8_t bSeq; /* Offset = 6, Same as Bulk-OUT message */ - uint8_t bStatus; /* Offset = 7, Slot status as defined in section 6.2.6 */ - uint8_t bError; /* Offset = 8, Slot error as defined in section 6.2.6 */ - uint8_t bSpecific; /* Offset = 9 */ - uint8_t abData[ABDATA_SIZE]; /* Offset = 10 */ - uint16_t u16SizeToSend; -} __PACKED USBD_CCID_BulkIn_DataTypeDef; - -typedef struct -{ - __IO uint8_t SlotStatus; - __IO uint8_t SlotStatusChange; -} USBD_CCID_SlotStatusTypeDef; - - -typedef struct -{ - __IO uint8_t bAbortRequestFlag; - __IO uint8_t bSeq; - __IO uint8_t bSlot; -} USBD_CCID_ParamTypeDef; - -/* - * CCID Class specification revision 1.1 - * Smart Card Device Class Descriptor Table - */ - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint16_t bcdCCID; - uint8_t bMaxSlotIndex; - uint8_t bVoltageSupport; - uint32_t dwProtocols; - uint32_t dwDefaultClock; - uint32_t dwMaximumClock; - uint8_t bNumClockSupported; - uint32_t dwDataRate; - uint32_t dwMaxDataRate; - uint8_t bNumDataRatesSupported; - uint32_t dwMaxIFSD; - uint32_t dwSynchProtocols; - uint32_t dwMechanical; - uint32_t dwFeatures; - uint32_t dwMaxCCIDMessageLength; - uint8_t bClassGetResponse; - uint8_t bClassEnvelope; - uint16_t wLcdLayout; - uint8_t bPINSupport; - uint8_t bMaxCCIDBusySlots; -} __PACKED USBD_CCID_DescTypeDef; - -typedef struct -{ - uint8_t data[CCID_DATA_HS_MAX_PACKET_SIZE / 4U]; /* Force 32-bit alignment */ - uint32_t UsbMessageLength; - uint8_t UsbIntData[CCID_CMD_PACKET_SIZE]; /* Buffer for the Interrupt In Data */ - uint32_t alt_setting; - - USBD_CCID_BulkIn_DataTypeDef UsbBlkInData; /* Buffer for the Out Data */ - USBD_CCID_BulkOut_DataTypeDef UsbBlkOutData; /* Buffer for the In Data */ - USBD_CCID_SlotStatusTypeDef SlotStatus; - USBD_CCID_ParamTypeDef USBD_CCID_Param; - - __IO uint32_t MaxPcktLen; - __IO uint8_t blkt_state; /* Bulk transfer state */ - - uint16_t slot_nb; - uint16_t seq_nb; -} USBD_CCID_HandleTypeDef; - -/** @defgroup USBD_CORE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Exported_Variables - * @{ - */ - -extern USBD_ClassTypeDef USBD_CCID; -#define USBD_CCID_CLASS &USBD_CCID -/** - * @} - */ - -/** @defgroup USB_CORE_Exported_Functions - * @{ - */ -typedef struct _USBD_CCID_Itf -{ - uint8_t (* Init)(USBD_HandleTypeDef *pdev); - uint8_t (* DeInit)(USBD_HandleTypeDef *pdev); - uint8_t (* Control)(uint8_t req, uint8_t *pbuf, uint16_t *length); - uint8_t (* Response_SendData)(USBD_HandleTypeDef *pdev, uint8_t *buf, uint16_t len); - uint8_t (* Send_Process)(uint8_t *Command, uint8_t *Data); - uint8_t (* SetSlotStatus)(USBD_HandleTypeDef *pdev); -} USBD_CCID_ItfTypeDef; - -/** - * @} - */ -/** @defgroup USB_CORE_Exported_Functions - * @{ - */ -uint8_t USBD_CCID_RegisterInterface(USBD_HandleTypeDef *pdev, - USBD_CCID_ItfTypeDef *fops); - -uint8_t USBD_CCID_IntMessage(USBD_HandleTypeDef *pdev); - - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_CCID_H */ -/** - * @} - */ - -/** - * @} - */ diff --git a/Class/CCID/Inc/usbd_ccid_cmd.h b/Class/CCID/Inc/usbd_ccid_cmd.h deleted file mode 100644 index 91e2720..0000000 --- a/Class/CCID/Inc/usbd_ccid_cmd.h +++ /dev/null @@ -1,222 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ccid_cmd.h - * @author MCD Application Team - * @brief header file for the usbd_ccid_cmd.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CCID_CMD_H -#define __USBD_CCID_CMD_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#ifndef __USBD_CCID_IF_H -#include "usbd_ccid_if_template.h" -#endif /* __USBD_CCID_IF_H */ - -#ifndef __USBD_CCID_SC_IF_H -#include "usbd_ccid_sc_if_template.h" -#endif /* __USBD_CCID_SC_IF_H */ - - -/* Exported types ------------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ - -/******************************************************************************/ -/* ERROR CODES for USB Bulk In Messages : bError */ -/******************************************************************************/ - -#define SLOT_NO_ERROR 0x81U -#define SLOTERROR_UNKNOWN 0x82U -/*----------------------------------------------------------------------------*/ - -/* Index of not supported / incorrect message parameter : 7Fh to 01h */ -/* These Values are used for Return Types between Firmware Layers */ -/* - Failure of a command - The CCID cannot parse one parameter or the ICC is not supporting one parameter. - Then the Slot Error register contains the index of the first bad parameter as a - positive number (1-127). For instance, if the CCID receives an ICC command to - an unimplemented slot, then the Slot Error register shall be set to 5 (index of bSlot field) */ - -/* - * CCID Class specification revision 1.1 - */ - -/* Following Parameters used in PC_to_RDR_XfrBlock */ -#define SLOTERROR_BAD_LENTGH 0x01U -#define SLOTERROR_BAD_SLOT 0x05U -#define SLOTERROR_BAD_POWERSELECT 0x07U -#define SLOTERROR_BAD_PROTOCOLNUM 0x07U -#define SLOTERROR_BAD_CLOCKCOMMAND 0x07U -#define SLOTERROR_BAD_ABRFU_3B 0x07U -#define SLOTERROR_BAD_BMCHANGES 0x07U -#define SLOTERROR_BAD_BFUNCTION_MECHANICAL 0x07U -#define SLOTERROR_BAD_ABRFU_2B 0x08U -#define SLOTERROR_BAD_LEVELPARAMETER 0x08U -#define SLOTERROR_BAD_FIDI 0x0AU -#define SLOTERROR_BAD_T01CONVCHECKSUM 0x0BU -#define SLOTERROR_BAD_GUARDTIME 0x0CU -#define SLOTERROR_BAD_WAITINGINTEGER 0x0DU -#define SLOTERROR_BAD_CLOCKSTOP 0x0EU -#define SLOTERROR_BAD_IFSC 0x0FU -#define SLOTERROR_BAD_NAD 0x10U -#define SLOTERROR_BAD_DWLENGTH 0x08U - - -/*---------- Table 6.2-2 Slot error register when bmCommandStatus = 1 */ -#define SLOTERROR_CMD_ABORTED 0xFFU -#define SLOTERROR_ICC_MUTE 0xFEU -#define SLOTERROR_XFR_PARITY_ERROR 0xFDU -#define SLOTERROR_XFR_OVERRUN 0xFCU -#define SLOTERROR_HW_ERROR 0xFBU -#define SLOTERROR_BAD_ATR_TS 0xF8U -#define SLOTERROR_BAD_ATR_TCK 0xF7U -#define SLOTERROR_ICC_PROTOCOL_NOT_SUPPORTED 0xF6U -#define SLOTERROR_ICC_CLASS_NOT_SUPPORTED 0xF5U -#define SLOTERROR_PROCEDURE_BYTE_CONFLICT 0xF4U -#define SLOTERROR_DEACTIVATED_PROTOCOL 0xF3U -#define SLOTERROR_BUSY_WITH_AUTO_SEQUENCE 0xF2U -#define SLOTERROR_PIN_TIMEOUT 0xF0U -#define SLOTERROR_PIN_CANCELLED 0xEFU -#define SLOTERROR_CMD_SLOT_BUSY 0xE0U -#define SLOTERROR_CMD_NOT_SUPPORTED 0x00U - -/* Following Parameters used in PC_to_RDR_ResetParameters */ -/* DEFAULT_FIDI_VALUE */ -#ifndef DEFAULT_FIDI -#define DEFAULT_FIDI 0x11U -#endif /* DEFAULT_FIDI */ -#ifndef DEFAULT_T01CONVCHECKSUM -#define DEFAULT_T01CONVCHECKSUM 0x00U -#endif /* DEFAULT_T01CONVCHECKSUM */ -#ifndef DEFAULT_EXTRA_GUARDTIME -#define DEFAULT_EXTRA_GUARDTIME 0x00U -#endif /* DEFAULT_EXTRA_GUARDTIME */ -#ifndef DEFAULT_WAITINGINTEGER -#define DEFAULT_WAITINGINTEGER 0x0AU -#endif /* DEFAULT_WAITINGINTEGER */ -#ifndef DEFAULT_CLOCKSTOP -#define DEFAULT_CLOCKSTOP 0x00U -#endif /* DEFAULT_CLOCKSTOP */ -#ifndef DEFAULT_IFSC -#define DEFAULT_IFSC 0x20U -#endif /* DEFAULT_IFSC */ -#ifndef DEFAULT_NAD -#define DEFAULT_NAD 0x00U -#endif /* DEFAULT_NAD */ - -/* Following Parameters used in PC_to_RDR_IccPowerOn */ -#define VOLTAGE_SELECTION_AUTOMATIC 0xFFU -#define VOLTAGE_SELECTION_3V 0x02U -#define VOLTAGE_SELECTION_5V 0x01U -#define VOLTAGE_SELECTION_1V8 0x03U - -/* -Offset=0 bmICCStatus 2 bit 0, 1, 2 - 0 - An ICC is present and active (power is on and stable, RST is inactive) - 1 - An ICC is present and inactive (not activated or shut down by hardware error) - 2 - No ICC is present - 3 - RFU -Offset=0 bmRFU 4 bits 0 RFU -Offset=6 bmCommandStatus 2 bits 0, 1, 2 - 0 - Processed without error - 1 - Failed (error code provided by the error register) - 2 - Time Extension is requested - 3 - RFU - */ - -#define BM_ICC_PRESENT_ACTIVE 0x00U -#define BM_ICC_PRESENT_INACTIVE 0x01U -#define BM_ICC_NO_ICC_PRESENT 0x02U - -#define BM_COMMAND_STATUS_OFFSET 0x06U -#define BM_COMMAND_STATUS_NO_ERROR 0x00U -#define BM_COMMAND_STATUS_FAILED (0x01U << BM_COMMAND_STATUS_OFFSET) -#define BM_COMMAND_STATUS_TIME_EXTN (0x02 << BM_COMMAND_STATUS_OFFSET) - - -#if (ATR_T01 == 0) -#define SIZE_OF_ATR 19U -#else -#define SIZE_OF_ATR 15U -#endif /* (ATR_T01 == 0) */ - -/* defines for the CCID_CMD Layers */ -#define LEN_PROTOCOL_STRUCT_T0 5U -#define LEN_PROTOCOL_STRUCT_T1 7U - -#define BPROTOCOL_NUM_T0 0U -#define BPROTOCOL_NUM_T1 1U - -/************************************************************************************/ -/* ERROR CODES for RDR_TO_PC_HARDWAREERROR Message : bHardwareErrorCode */ -/************************************************************************************/ - -#define HARDWAREERRORCODE_OVERCURRENT 0x01U -#define HARDWAREERRORCODE_VOLTAGEERROR 0x02U -#define HARDWAREERRORCODE_OVERCURRENT_IT 0x04U -#define HARDWAREERRORCODE_VOLTAGEERROR_IT 0x08U - - - -#define CHK_PARAM_SLOT 0x01U -#define CHK_PARAM_DWLENGTH 0x02U -#define CHK_PARAM_ABRFU2 0x04U -#define CHK_PARAM_ABRFU3 0x08U -#define CHK_PARAM_CARD_PRESENT 0x10U -#define CHK_PARAM_ABORT 0x20U -#define CHK_ACTIVE_STATE 0x40U - - -/* Exported functions ------------------------------------------------------- */ -uint8_t PC_to_RDR_IccPowerOn(USBD_HandleTypeDef *pdev); -uint8_t PC_to_RDR_IccPowerOff(USBD_HandleTypeDef *pdev); -uint8_t PC_to_RDR_GetSlotStatus(USBD_HandleTypeDef *pdev); -uint8_t PC_to_RDR_XfrBlock(USBD_HandleTypeDef *pdev); -uint8_t PC_to_RDR_GetParameters(USBD_HandleTypeDef *pdev); -uint8_t PC_to_RDR_ResetParameters(USBD_HandleTypeDef *pdev); -uint8_t PC_to_RDR_SetParameters(USBD_HandleTypeDef *pdev); -uint8_t PC_to_RDR_Escape(USBD_HandleTypeDef *pdev); -uint8_t PC_to_RDR_IccClock(USBD_HandleTypeDef *pdev); -uint8_t PC_to_RDR_Abort(USBD_HandleTypeDef *pdev); -uint8_t PC_TO_RDR_T0Apdu(USBD_HandleTypeDef *pdev); -uint8_t PC_TO_RDR_Mechanical(USBD_HandleTypeDef *pdev); -uint8_t PC_TO_RDR_SetDataRateAndClockFrequency(USBD_HandleTypeDef *pdev); -uint8_t PC_TO_RDR_Secure(USBD_HandleTypeDef *pdev); - -void RDR_to_PC_DataBlock(uint8_t errorCode, USBD_HandleTypeDef *pdev); -void RDR_to_PC_NotifySlotChange(USBD_HandleTypeDef *pdev); -void RDR_to_PC_SlotStatus(uint8_t errorCode, USBD_HandleTypeDef *pdev); -void RDR_to_PC_Parameters(uint8_t errorCode, USBD_HandleTypeDef *pdev); -void RDR_to_PC_Escape(uint8_t errorCode, USBD_HandleTypeDef *pdev); -void RDR_to_PC_DataRateAndClockFrequency(uint8_t errorCode, USBD_HandleTypeDef *pdev); - -void CCID_UpdSlotStatus(USBD_HandleTypeDef *pdev, uint8_t slotStatus); -void CCID_UpdSlotChange(USBD_HandleTypeDef *pdev, uint8_t changeStatus); -uint8_t CCID_IsSlotStatusChange(USBD_HandleTypeDef *pdev); -uint8_t CCID_CmdAbort(USBD_HandleTypeDef *pdev, uint8_t slot, uint8_t seq); -uint8_t USBD_CCID_Transfer_Data_Request(USBD_HandleTypeDef *pdev, - uint8_t *dataPointer, uint16_t dataLen); - - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_CCID_CMD_H */ diff --git a/Class/CCID/Inc/usbd_ccid_if_template.h b/Class/CCID/Inc/usbd_ccid_if_template.h deleted file mode 100644 index af75689..0000000 --- a/Class/CCID/Inc/usbd_ccid_if_template.h +++ /dev/null @@ -1,76 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ccid_if_template.h - * @author MCD Application Team - * @brief header file for the usbd_ccid_if_template.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CCID_IF_TEMPLATE_H -#define __USBD_CCID_IF_TEMPLATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ccid.h" -#include "usbd_ccid_cmd.h" - -#ifndef __USBD_CCID_SMARTCARD_H -#include "usbd_ccid_smartcard_template.h" -#endif /* __USBD_CCID_SMARTCARD_H */ - -/* Exported defines ----------------------------------------------------------*/ - -/*****************************************************************************/ -/*********************** CCID Bulk Transfer State machine ********************/ -/*****************************************************************************/ -#define CCID_STATE_IDLE 0U -#define CCID_STATE_DATA_OUT 1U -#define CCID_STATE_RECEIVE_DATA 2U -#define CCID_STATE_SEND_RESP 3U -#define CCID_STATE_DATAIN 4U -#define CCID_STATE_UNCORRECT_LENGTH 5U - -#define DIR_IN 0U -#define DIR_OUT 1U -#define BOTH_DIR 2U - -/************ Value of the Interrupt transfer status to set ******************/ -#define INTRSTATUS_COMPLETE 1U -#define INTRSTATUS_RESET 0U -/************** slot change status *******************************************/ -#define SLOTSTATUS_CHANGED 1U -#define SLOTSTATUS_RESET 0U - -/* Exported types ------------------------------------------------------------*/ -extern USBD_HandleTypeDef USBD_Device; - -/* CCID Interface callback */ -extern USBD_CCID_ItfTypeDef USBD_CCID_If_fops; - -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_CCID_IF_TEMPLATE_H */ diff --git a/Class/CCID/Inc/usbd_ccid_sc_if_template.h b/Class/CCID/Inc/usbd_ccid_sc_if_template.h deleted file mode 100644 index 0072f8b..0000000 --- a/Class/CCID/Inc/usbd_ccid_sc_if_template.h +++ /dev/null @@ -1,100 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ccid_sc_if_template.h - * @author MCD Application Team - * @brief header file for the usbd_ccid_sc_if_template.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CCID_SC_IF_TEMPLATE_H -#define __USBD_CCID_SC_IF_TEMPLATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ccid.h" -#include "usbd_ccid_cmd.h" - -#ifndef __USBD_CCID_SMARTCARD_H -#include "usbd_ccid_smartcard_template.h" -#endif /* __USBD_CCID_SMARTCARD_H */ - -/* Exported constants --------------------------------------------------------*/ -/* Exported types ------------------------------------------------------------*/ -typedef struct -{ - uint8_t voltage; /* Voltage for the Card Already Selected */ - uint8_t USART_GuardTime; - uint8_t SC_A2R_FiDi; - uint8_t SC_hostFiDi; - uint8_t USART_DefaultGuardTime; - uint32_t USART_BaudRate; -} SC_Param_t; - -#pragma pack(1) -typedef struct -{ - uint8_t bmFindexDindex; - uint8_t bmTCCKST0; - uint8_t bGuardTimeT0; - uint8_t bWaitingIntegerT0; - uint8_t bClockStop; - uint8_t bIfsc; - uint8_t bNad; -} Protocol_01_DataTypeDef; -#pragma pack() - -extern Protocol_01_DataTypeDef ProtocolData; -extern SC_Param_t SC_Param; - -/* Exported macro ------------------------------------------------------------*/ -#define MAX_EXTRA_GUARD_TIME (0xFF - DEFAULT_EXTRA_GUARDTIME) - -/* Following macros are used for SC_XferBlock command */ -#define XFER_BLK_SEND_DATA 1U /* Command is for issuing the data */ -#define XFER_BLK_RECEIVE_DATA 2U /* Command is for receiving the data */ -#define XFER_BLK_NO_DATA 3U /* Command type is No data exchange */ - -/* Exported functions ------------------------------------------------------- */ -/* APPLICATION LAYER ---------------------------------------------------------*/ -void SC_Itf_InitParams(void); -void SC_Itf_IccPowerOn(uint8_t voltage); -void SC_Itf_IccPowerOff(void); -uint8_t SC_GetState(void); -uint8_t SC_Itf_XferBlock(uint8_t *ptrBlock, uint32_t blockLen, - uint16_t expectedLen, - USBD_CCID_BulkIn_DataTypeDef *CCID_BulkIn_Data); - -uint8_t SC_Itf_SetParams(Protocol_01_DataTypeDef *pPtr, uint8_t T_01); -uint8_t SC_Itf_Escape(uint8_t *escapePtr, uint32_t escapeLen, - uint8_t *responseBuff, uint32_t *responseLen); - -uint8_t SC_Itf_SetClock(uint8_t bClockCommand); -uint8_t SC_Itf_T0Apdu(uint8_t bmChanges, uint8_t bClassGetResponse, - uint8_t bClassEnvelope); - -uint8_t SC_Itf_Mechanical(uint8_t bFunction); -uint8_t SC_Itf_SetDataRateAndClockFrequency(uint32_t dwClockFrequency, - uint32_t dwDataRate); - -uint8_t SC_Itf_Secure(uint32_t dwLength, uint8_t bBWI, uint16_t wLevelParameter, - uint8_t *pbuf, uint32_t *returnLen); - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_CCID_SC_IF_TEMPLATE_H */ diff --git a/Class/CCID/Inc/usbd_ccid_smartcard_template.h b/Class/CCID/Inc/usbd_ccid_smartcard_template.h deleted file mode 100644 index 7730180..0000000 --- a/Class/CCID/Inc/usbd_ccid_smartcard_template.h +++ /dev/null @@ -1,279 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ccid_smartcard_template.h - * @author MCD Application Team - * @brief header file for the usbd_ccid_smartcard_template.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CCID_SMARTCARD_TEMPLATE_H -#define __USBD_CCID_SMARTCARD_TEMPLATE_H - -#ifdef __cplusplus -extern "C" { -#endif - - -/* Includes ------------------------------------------------------------------*/ -#ifndef __USBD_CCID_IF_H -#include "usbd_ccid_if_template.h" -#endif /* __USBD_CCID_IF_H */ - -/* Exported constants --------------------------------------------------------*/ -#define T0_PROTOCOL 0x00U /* T0 protocol */ -#define T1_PROTOCOL 0x01U /* T1 protocol */ -#define DIRECT 0x3BU /* Direct bit convention */ -#define INDIRECT 0x3FU /* Indirect bit convention */ -#define SETUP_LENGTH 20U -#define HIST_LENGTH 20U - -#define SC_TRANSMIT_TIMEOUT 200U /* Direction to transmit */ -#define MAX_PROTOCOLLEVEL 7U /* Maximum levels of protocol */ -#define MAX_INTERFACEBYTE 4U /* Maximum number of interface bytes per protocol */ -#define LC_MAX 24U -#define SC_RECEIVE_TIMEOUT 0x8000U /* Direction to reader */ - -/* T=1 protocol constants */ -#define T1_I_BLOCK 0x00U /* PCB (I-block: b8 = 0) */ -#define T1_R_BLOCK 0x80U /* PCB (R-block: b8 b7 = 10) */ -#define T1_S_BLOCK 0xC0U /* PCB (S-block: b8 b7 = 11) */ - -/* I block */ -#define T1_I_SEQ_SHIFT 6U /* N(S) position (bit 7) */ - -/* R block */ -#define T1_IS_ERROR(pcb) ((pcb) & 0x0FU) -#define T1_EDC_ERROR 0x01U /* [b6..b1] = 0-N(R)-0001 */ -#define T1_OTHER_ERROR 0x02U /* [b6..b1] = 0-N(R)-0010 */ -#define T1_R_SEQ_SHIFT 4U /* N(R) position (b5) */ - -/* S block */ -#define T1_S_RESPONSE 0x20U /* If response: set bit b6, if request reset b6 in PCB S-Block */ -#define T1_S_RESYNC 0x00U /* RESYNCH: b6->b1: 000000 of PCB S-Block */ -#define T1_S_IFS 0x01U /* IFS: b6->b1: 000001 of PCB S-Block */ -#define T1_S_ABORT 0x02U /* ABORT: b6->b1: 000010 of PCB S-Block */ -#define T1_S_WTX 0x03U /* WTX: b6->b1: 000011 of PCB S-Block */ - -#define NAD 0U /* NAD byte position in the block */ -#define PCB 1U /* PCB byte position in the block */ -#define LEN 2U /* LEN byte position in the block */ -#define DATA 3U /* The position of the first byte of INF field in the block */ - -/* Modifiable parameters */ -#define SAD 0x0U /* Source address: reader (allowed values 0 -> 7) */ -#define DAD 0x0U /* Destination address: card (allowed values 0 -> 7) */ -#define IFSD_VALUE 254U /* Max length of INF field Supported by the reader */ -#define SC_FILE_SIZE 0x100U /* File size */ -#define SC_FILE_ID 0x0001U /* File identifier */ -#define SC_CLASS 0x00U - -/* Constant parameters */ -#define INS_SELECT_FILE 0xA4U /* Select file instruction */ -#define INS_READ_FILE 0xB0U /* Read file instruction */ -#define INS_WRITE_FILE 0xD6U /* Write file instruction */ -#define TRAILER_LENGTH 2U /* Trailer length (SW1 and SW2: 2 bytes) */ - -#define SC_T1_RECEIVE_SUCCESS 0U -#define SC_T1_BWT_TIMEOUT 1U -#define SC_T1_CWT_TIMEOUT 2U - -#define DEFAULT_FIDI_VALUE 0x11U -#define PPS_REQUEST 0xFFU - -/* SC Tree Structure ----------------------------------------------------------- - MasterFile - ________|___________ - | | | - System UserData Note -------------------------------------------------------------------------------*/ - -/* SC ADPU Command: Operation Code -------------------------------------------*/ -#define SC_CLA_NAME 0x00U - -/*------------------------ Data Area Management Commands ---------------------*/ -#define SC_SELECT_FILE 0xA4U -#define SC_GET_RESPONCE 0xC0U -#define SC_STATUS 0xF2U -#define SC_UPDATE_BINARY 0xD6U -#define SC_READ_BINARY 0xB0U -#define SC_WRITE_BINARY 0xD0U -#define SC_UPDATE_RECORD 0xDCU -#define SC_READ_RECORD 0xB2U - -/*-------------------------- Administrative Commands -------------------------*/ -#define SC_CREATE_FILE 0xE0U - -/*-------------------------- Safety Management Commands ----------------------*/ -#define SC_VERIFY 0x20U -#define SC_CHANGE 0x24U -#define SC_DISABLE 0x26U -#define SC_ENABLE 0x28U -#define SC_UNBLOCK 0x2CU -#define SC_EXTERNAL_AUTH 0x82U -#define SC_GET_CHALLENGE 0x84U - -/*-------------------------- Smartcard Interface Byte-------------------------*/ -#define SC_INTERFACEBYTE_TA 0U /* Interface byte TA(i) */ -#define SC_INTERFACEBYTE_TB 1U /* Interface byte TB(i) */ -#define SC_INTERFACEBYTE_TC 2U /* Interface byte TC(i) */ -#define SC_INTERFACEBYTE_TD 3U /* Interface byte TD(i) */ - -/*-------------------------- Answer to reset Commands ------------------------*/ -#define SC_GET_A2R 0x00U - -/* SC STATUS: Status Code ----------------------------------------------------*/ -#define SC_EF_SELECTED 0x9FU -#define SC_DF_SELECTED 0x9FU -#define SC_OP_TERMINATED 0x9000U - -/* Smartcard Voltage */ -#define SC_VOLTAGE_5V 0x00U -#define SC_VOLTAGE_3V 0x01U -#define SC_VOLTAGE_NOINIT 0xFFU -/*----------------- ATR Protocole supported ----------------------------------*/ -#define ATR_T01 0x00U - - -/* Exported types ------------------------------------------------------------*/ -typedef enum -{ - SC_POWER_ON = 0x00, - SC_RESET_LOW = 0x01, - SC_RESET_HIGH = 0x02, - SC_ACTIVE = 0x03, - SC_ACTIVE_ON_T0 = 0x04, - SC_ACTIVE_ON_T1 = 0x05, - SC_POWER_OFF = 0x06, - SC_NO_INIT = 0x07 - -} SC_State; - -/* Interface Byte structure - TA(i), TB(i), TC(i) and TD(i) ------------------*/ -typedef struct -{ - uint8_t Status; /* The Presence of the Interface byte */ - uint8_t Value; /* The Value of the Interface byte */ -} SC_InterfaceByteTypeDef; - -/* Protocol Level structure - ------------------------------------------------*/ -typedef struct -{ - SC_InterfaceByteTypeDef InterfaceByte[MAX_INTERFACEBYTE]; /* The Values of the Interface byte - TA(i), TB(i), TC(i)and TD(i) */ -} SC_ProtocolLevelTypeDef; - -/* ATR structure - Answer To Reset -------------------------------------------*/ -typedef struct -{ - uint8_t TS; /* Bit Convention Direct/Indirect */ - uint8_t T0; /* Each bit in the high nibble = Presence of the further interface byte; - Low nibble = Number of historical byte */ - SC_ProtocolLevelTypeDef T[MAX_PROTOCOLLEVEL]; /* Setup array */ - uint8_t Historical[HIST_LENGTH]; /* Historical array */ - uint8_t Tlength; /* Setup array dimension */ - uint8_t Hlength; /* Historical array dimension */ - uint8_t TCK; -} SC_ATRTypeDef; - -/* ADPU-Header command structure ---------------------------------------------*/ -typedef struct -{ - uint8_t CLA; /* Command class */ - uint8_t INS; /* Operation code */ - uint8_t P1; /* Selection Mode */ - uint8_t P2; /* Selection Option */ -} SC_HeaderTypeDef; - -/* ADPU-Body command structure -----------------------------------------------*/ -typedef struct -{ - uint8_t LC; /* Data field length */ - uint8_t Data[LC_MAX]; /* Command parameters */ - uint8_t LE; /* Expected length of data to be returned */ -} SC_BodyTypeDef; - -/* ADPU Command structure ----------------------------------------------------*/ -typedef struct -{ - SC_HeaderTypeDef Header; - SC_BodyTypeDef Body; -} SC_ADPU_CommandsTypeDef; - -/* SC response structure -----------------------------------------------------*/ -typedef struct -{ - uint8_t Data[LC_MAX]; /* Data returned from the card */ - uint8_t SW1; /* Command Processing status */ - uint8_t SW2; /* Command Processing qualification */ -} SC_ADPU_ResponseTypeDef; - -/* SC Command Status -----------------------------------------------------*/ -typedef enum -{ - SC_CS_FAILED = 0x00, - SC_CS_PIN_ENABLED = 0x01, - SC_CS_PIN_VERIFIED = 0x02, - SC_CS_READ = 0x03, - SC_CS_PIN_CHANGED = 0x04 - -} SC_Command_State; -/* SC Response Status -----------------------------------------------------*/ -typedef enum -{ - REP_OK = 0x00, - REP_NOT_OK = 0x01, - REP_NOT_SUPP = 0x02, - REP_ENABLED = 0x03, - REP_CHANGE = 0x04 - -} REP_Command_t; -/* Conforming of Command with ICC APP -----------------------------------------------------*/ -typedef enum -{ - Command_OK = 0x00, - Command_NOT_OK = 0x01, - -} Command_State_t; - -typedef enum -{ - SC_DISABLED = 0U, - SC_ENABLED = !SC_DISABLED -} SCPowerState; - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -/* APPLICATION LAYER ---------------------------------------------------------*/ -void SC_Handler(SC_State *SCState, SC_ADPU_CommandsTypeDef *SC_ADPU, SC_ADPU_ResponseTypeDef *SC_Response); -void SC_PowerCmd(SCPowerState NewState); -void SC_ParityErrorHandler(void); -void SC_PTSConfig(void); -uint8_t SC_Detect(void); -uint32_t SC_GetDTableValue(uint32_t idx); -void SC_VoltageConfig(uint32_t SC_Voltage); -void SC_SetState(SC_State scState); -void SC_IOConfig(void); - -extern uint8_t SC_ATR_Table[40]; -extern SC_ATRTypeDef SC_A2R; -extern SC_ADPU_ResponseTypeDef SC_Response; - -extern uint8_t ProtocolNUM_OUT; -extern SC_ADPU_CommandsTypeDef SC_ADPU; - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_CCID_SMARTCARD_TEMPLATE_H */ diff --git a/Class/CCID/Src/usbd_ccid.c b/Class/CCID/Src/usbd_ccid.c deleted file mode 100644 index 4c77b13..0000000 --- a/Class/CCID/Src/usbd_ccid.c +++ /dev/null @@ -1,969 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ccid.c - * @author MCD Application Team - * @brief This file provides the high layer firmware functions to manage - * all the functionalities of the USB CCID Class: - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - * @verbatim - * - * =================================================================== - * CCID Class Driver Description - * =================================================================== - * This module manages the Specification for Integrated Circuit(s) - * Cards Interface Revision 1.1 - * This driver implements the following aspects of the specification: - * - Device descriptor management - * - Configuration descriptor management - * - Enumeration as CCID device with 2 data endpoints (IN and OUT) and 1 command endpoint (IN) - * and enumeration for each implemented memory interface - * - Bulk OUT/IN data Transfers - * - Requests management - * - * @endverbatim - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ccid.h" -#include "usbd_ccid_cmd.h" -#include "usbd_ctlreq.h" -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_CCID - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_CCID_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_CCID_Private_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_CCID_Private_Macros - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_CCID_Private_FunctionPrototypes - * @{ - */ -static uint8_t USBD_CCID_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_CCID_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_CCID_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static uint8_t USBD_CCID_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_CCID_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_CCID_DispatchCommand(USBD_HandleTypeDef *pdev); -static uint8_t USBD_CCID_ReceiveCmdHeader(USBD_HandleTypeDef *pdev, - uint8_t *pDst, uint16_t u8length); -#ifndef USE_USBD_COMPOSITE -static uint8_t *USBD_CCID_GetHSCfgDesc(uint16_t *length); -static uint8_t *USBD_CCID_GetFSCfgDesc(uint16_t *length); -static uint8_t *USBD_CCID_GetOtherSpeedCfgDesc(uint16_t *length); -static uint8_t *USBD_CCID_GetDeviceQualifierDescriptor(uint16_t *length); -#endif /* USE_USBD_COMPOSITE */ - -/** - * @} - */ - -/** @defgroup USBD_CCID_Private_Variables - * @{ - */ - -static uint8_t CCIDInEpAdd = CCID_IN_EP; -static uint8_t CCIDOutEpAdd = CCID_OUT_EP; -static uint8_t CCIDCmdEpAdd = CCID_CMD_EP; - - -/* CCID interface class callbacks structure */ -USBD_ClassTypeDef USBD_CCID = -{ - USBD_CCID_Init, - USBD_CCID_DeInit, - USBD_CCID_Setup, - NULL, /*EP0_TxSent*/ - NULL, /*EP0_RxReady*/ - USBD_CCID_DataIn, - USBD_CCID_DataOut, - NULL, /*SOF */ - NULL, /*ISOIn*/ - NULL, /*ISOOut*/ -#ifdef USE_USBD_COMPOSITE - NULL, - NULL, - NULL, - NULL, -#else - USBD_CCID_GetHSCfgDesc, - USBD_CCID_GetFSCfgDesc, - USBD_CCID_GetOtherSpeedCfgDesc, - USBD_CCID_GetDeviceQualifierDescriptor, -#endif /* USE_USBD_COMPOSITE */ -}; - -#ifndef USE_USBD_COMPOSITE - -/* USB CCID device Configuration Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_CCID_CfgDesc[USB_CCID_CONFIG_DESC_SIZ] __ALIGN_END = -{ - /* Configuration Descriptor */ - 0x09, /* bLength: Configuration Descriptor size */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - USB_CCID_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */ - 0x00, - 0x01, /* bNumInterfaces: 1 interface */ - 0x01, /* bConfigurationValue: */ - 0x00, /* iConfiguration: */ -#if (USBD_SELF_POWERED == 1U) - 0xC0, /* bmAttributes: Bus Powered according to user configuration */ -#else - 0x80, /* bmAttributes: Bus Powered according to user configuration */ -#endif /* USBD_SELF_POWERED */ - USBD_MAX_POWER, /* MaxPower (mA) */ - - /******************** CCID **** interface ********************/ - CCID_INTERFACE_DESC_SIZE, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x03, /* bNumEndpoints: 3 endpoints used */ - USB_DEVICE_CLASS_CCID, /* bInterfaceClass: user's interface for CCID */ - 0x00, /* bInterfaceSubClass : No subclass, - can be changed but no description in USB 2.0 Spec */ - 0x00, /* nInterfaceProtocol : None */ - 0x00, /* iInterface */ - - /******************* CCID class descriptor ********************/ - CCID_CLASS_DESC_SIZE, /* bLength: CCID Descriptor size */ - CCID_DESC_TYPE, /* bDescriptorType: Functional Descriptor type. */ - 0x10, /* bcdCCID(LSB): CCID Class Spec release number (1.1) */ - 0x01, /* bcdCCID(MSB) */ - - 0x00, /* bMaxSlotIndex :highest available slot on this device */ - CCID_VOLTAGE_SUPP, /* bVoltageSupport: bVoltageSupport: 5v, 3v and 1.8v */ - LOBYTE(USBD_CCID_PROTOCOL), /* dwProtocols: supports T=0 and T=1 */ - HIBYTE(USBD_CCID_PROTOCOL), - 0x00, - 0x00, - LOBYTE(USBD_CCID_DEFAULT_CLOCK_FREQ), /* dwDefaultClock: 3.6Mhz */ - HIBYTE(USBD_CCID_DEFAULT_CLOCK_FREQ), - 0x00, - 0x00, - LOBYTE(USBD_CCID_MAX_CLOCK_FREQ), /* dwMaximumClock */ - HIBYTE(USBD_CCID_MAX_CLOCK_FREQ), - 0x00, - 0x00, - 0x00, /* bNumClockSupported */ - LOBYTE(USBD_CCID_DEFAULT_DATA_RATE), /* dwDataRate: 9677 bps */ - HIBYTE(USBD_CCID_DEFAULT_DATA_RATE), - 0x00, - 0x00, - - LOBYTE(USBD_CCID_MAX_DATA_RATE), /* dwMaxDataRate */ - HIBYTE(USBD_CCID_MAX_DATA_RATE), - 0x00, - 0x00, - 0x35, /* bNumDataRatesSupported */ - - LOBYTE(USBD_CCID_MAX_INF_FIELD_SIZE), /* dwMaxIFSD: maximum IFSD supported for T=1 */ - HIBYTE(USBD_CCID_MAX_INF_FIELD_SIZE), - 0x00, - 0x00, - 0x00, 0x00, 0x00, 0x00, /* dwSynchProtocols */ - 0x00, 0x00, 0x00, 0x00, /* dwMechanical: no special characteristics */ - - 0xBA, 0x04, EXCHANGE_LEVEL_FEATURE, 0x00, /* dwFeatures */ - LOBYTE(CCID_MAX_BLOCK_SIZE_HEADER), /* dwMaxCCIDMessageLength: Maximum block size + header*/ - HIBYTE(CCID_MAX_BLOCK_SIZE_HEADER), - 0x00, - 0x00, - 0x00, /* bClassGetResponse*/ - 0x00, /* bClassEnvelope */ - 0x00, 0x00, /* wLcdLayout : 0000h no LCD. */ - 0x03, /* bPINSupport : PIN verification and PIN modification */ - 0x01, /* bMaxCCIDBusySlots */ - - /******************** CCID Endpoints ********************/ - CCID_ENDPOINT_DESC_SIZE, /* Endpoint descriptor length = 7 */ - USB_DESC_TYPE_ENDPOINT, /* Endpoint descriptor type */ - CCID_IN_EP, /* Endpoint address (IN, address 1) */ - USBD_EP_TYPE_BULK, /* Bulk endpoint type */ - - LOBYTE(CCID_DATA_FS_MAX_PACKET_SIZE), - HIBYTE(CCID_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* Polling interval in milliseconds */ - CCID_ENDPOINT_DESC_SIZE, /* Endpoint descriptor length = 7 */ - USB_DESC_TYPE_ENDPOINT, /* Endpoint descriptor type */ - CCID_OUT_EP, /* Endpoint address (OUT, address 1) */ - USBD_EP_TYPE_BULK, /* Bulk endpoint type */ - - LOBYTE(CCID_DATA_FS_MAX_PACKET_SIZE), - HIBYTE(CCID_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* Polling interval in milliseconds */ - CCID_ENDPOINT_DESC_SIZE, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType:*/ - CCID_CMD_EP, /* bEndpointAddress: Endpoint Address (IN) */ - USBD_EP_TYPE_INTR, /* bmAttributes: Interrupt endpoint */ - LOBYTE(CCID_CMD_PACKET_SIZE), - HIBYTE(CCID_CMD_PACKET_SIZE), - CCID_CMD_FS_BINTERVAL /* Polling interval in milliseconds */ -}; - -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_CCID_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = -{ - USB_LEN_DEV_QUALIFIER_DESC, - USB_DESC_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x01, - 0x00, -}; -#endif /* USE_USBD_COMPOSITE */ - -/** - * @} - */ - -/** @defgroup USBD_CCID_Private_Functions - * @{ - */ - -/** - * @brief USBD_CCID_Init - * Initialize the CCID interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_CCID_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - USBD_CCID_HandleTypeDef *hccid; - UNUSED(cfgidx); - - /* Allocate CCID structure */ - hccid = (USBD_CCID_HandleTypeDef *)USBD_malloc(sizeof(USBD_CCID_HandleTypeDef)); - - if (hccid == NULL) - { - pdev->pClassDataCmsit[pdev->classId] = NULL; - return (uint8_t)USBD_EMEM; - } - - pdev->pClassDataCmsit[pdev->classId] = (void *)hccid; - pdev->pClassData = pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - CCIDInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - CCIDOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - CCIDCmdEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Init the CCID parameters into a state where it can receive a new command message */ - hccid->USBD_CCID_Param.bAbortRequestFlag = 0U; - hccid->USBD_CCID_Param.bSeq = 0U; - hccid->USBD_CCID_Param.bSlot = 0U; - hccid->MaxPcktLen = (pdev->dev_speed == USBD_SPEED_HIGH) ? \ - CCID_DATA_HS_MAX_PACKET_SIZE : CCID_DATA_FS_MAX_PACKET_SIZE; - - /* Open EP IN */ - (void)USBD_LL_OpenEP(pdev, CCIDInEpAdd, USBD_EP_TYPE_BULK, (uint16_t)hccid->MaxPcktLen); - pdev->ep_in[CCIDInEpAdd & 0xFU].is_used = 1U; - - /* Open EP OUT */ - (void)USBD_LL_OpenEP(pdev, CCIDOutEpAdd, USBD_EP_TYPE_BULK, (uint16_t)hccid->MaxPcktLen); - pdev->ep_out[CCIDOutEpAdd & 0xFU].is_used = 1U; - - /* Open INTR EP IN */ - (void)USBD_LL_OpenEP(pdev, CCIDCmdEpAdd, - USBD_EP_TYPE_INTR, CCID_CMD_PACKET_SIZE); - pdev->ep_in[CCIDCmdEpAdd & 0xFU].is_used = 1U; - - /* Init physical Interface components */ - ((USBD_CCID_ItfTypeDef *)pdev->pUserData[pdev->classId])->Init(pdev); - - /* Prepare Out endpoint to receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, CCIDOutEpAdd, - hccid->data, hccid->MaxPcktLen); - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CCID_DeInit - * DeInitialize the CCID layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_CCID_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - CCIDInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - CCIDOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - CCIDCmdEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Close EP IN */ - (void)USBD_LL_CloseEP(pdev, CCIDInEpAdd); - pdev->ep_in[CCIDInEpAdd & 0xFU].is_used = 0U; - - /* Close EP OUT */ - (void)USBD_LL_CloseEP(pdev, CCIDOutEpAdd); - pdev->ep_out[CCIDOutEpAdd & 0xFU].is_used = 0U; - - /* Close EP Command */ - (void)USBD_LL_CloseEP(pdev, CCIDCmdEpAdd); - pdev->ep_in[CCIDCmdEpAdd & 0xFU].is_used = 0U; - - /* DeInit physical Interface components */ - if (pdev->pClassDataCmsit[pdev->classId] != NULL) - { - ((USBD_CCID_ItfTypeDef *)pdev->pUserData[pdev->classId])->DeInit(pdev); - (void)USBD_free(pdev->pClassDataCmsit[pdev->classId]); - pdev->pClassDataCmsit[pdev->classId] = NULL; - pdev->pClassData = NULL; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CCID_Setup - * Handle the CCID specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t USBD_CCID_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_CCID_ItfTypeDef *hCCIDitf = (USBD_CCID_ItfTypeDef *)pdev->pUserData[pdev->classId]; - USBD_StatusTypeDef ret = USBD_OK; - uint8_t ifalt = 0U; - uint16_t status_info = 0U; - uint16_t len; - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - /* Class request */ - case USB_REQ_TYPE_CLASS : - if (req->wLength != 0U) - { - len = MIN(CCID_EP0_BUFF_SIZ, req->wLength); - if ((req->bmRequest & 0x80U) != 0U) - { - hCCIDitf->Control(req->bRequest, hccid->data, &len); - (void)USBD_CtlSendData(pdev, hccid->data, len); - } - else - { - (void)USBD_CtlPrepareRx(pdev, hccid->data, len); - } - } - else - { - len = 0U; - hCCIDitf->Control(req->bRequest, (uint8_t *)&req->wValue, &len); - } - break; - - /* Interface & Endpoint request */ - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_STATUS: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, (uint8_t *)&status_info, 2U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_GET_INTERFACE: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, &ifalt, 1U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_SET_INTERFACE: - if (pdev->dev_state != USBD_STATE_CONFIGURED) - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_CLEAR_FEATURE: - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - - return (uint8_t)ret; -} - -/** - * @brief USBD_CCID_DataIn - * Data sent on non-control IN endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t USBD_CCID_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - CCIDInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - CCIDCmdEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (epnum == (CCIDInEpAdd & 0x7FU)) - { - /* Filter the epnum by masking with 0x7f (mask of IN Direction) */ - - /*************** Handle Bulk Transfer IN data completion *****************/ - - switch (hccid->blkt_state) - { - case CCID_STATE_SEND_RESP: - - /* won't wait ack to avoid missing a command */ - hccid->blkt_state = CCID_STATE_IDLE; - - /* Prepare EP to Receive Cmd */ - (void)USBD_LL_PrepareReceive(pdev, CCID_OUT_EP, - hccid->data, hccid->MaxPcktLen); - break; - - default: - break; - } - } - else if (epnum == (CCIDCmdEpAdd & 0x7FU)) - { - /* Filter the epnum by masking with 0x7f (mask of IN Direction) */ - - /*************** Handle Interrupt Transfer IN data completion *****************/ - - (void)USBD_CCID_IntMessage(pdev); - } - else - { - return (uint8_t)USBD_FAIL; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CCID_DataOut - * Data received on non-control Out endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t USBD_CCID_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint16_t CurrPcktLen; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - CCIDOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (hccid == NULL) - { - return (uint8_t)USBD_EMEM; - } - - if (epnum == CCIDOutEpAdd) - { - CurrPcktLen = (uint16_t)USBD_GetRxCount(pdev, epnum); - - switch (hccid->blkt_state) - { - case CCID_STATE_IDLE: - - if (CurrPcktLen >= (uint16_t)CCID_CMD_HEADER_SIZE) - { - hccid->UsbMessageLength = CurrPcktLen; /* Store for future use */ - - /* Fill CCID_BulkOut Data Buffer from USB Buffer */ - (void)USBD_CCID_ReceiveCmdHeader(pdev, (uint8_t *)&hccid->UsbBlkOutData.bMessageType, - (uint16_t)CurrPcktLen); - - /* - Refer : 6 CCID Messages - The response messages always contain the exact same slot number, - and sequence number fields from the header that was contained in - the Bulk-OUT command message. - */ - hccid->UsbBlkInData.bSlot = hccid->UsbBlkOutData.bSlot; - hccid->UsbBlkInData.bSeq = hccid->UsbBlkOutData.bSeq; - - if (CurrPcktLen < hccid->MaxPcktLen) - { - /* Short message, less than the EP Out Size, execute the command, - if parameter like dwLength is too big, the appropriate command will - give an error */ - (void)USBD_CCID_DispatchCommand(pdev); - } - else - { - /* Check if length of data to be sent by host is > buffer size */ - if (hccid->UsbBlkOutData.dwLength > (uint32_t)ABDATA_SIZE) - { - /* Too long data received.... Error ! */ - hccid->blkt_state = CCID_STATE_UNCORRECT_LENGTH; - } - - else - { - /* Expect more data on OUT EP */ - hccid->blkt_state = CCID_STATE_RECEIVE_DATA; - - /* Prepare EP to Receive next Cmd */ - (void)USBD_LL_PrepareReceive(pdev, CCID_OUT_EP, - hccid->data, hccid->MaxPcktLen); - - } /* if (CurrPcktLen == CCID_DATA_MAX_PACKET_SIZE) ends */ - } /* if (CurrPcktLen >= CCID_DATA_MAX_PACKET_SIZE) ends */ - } /* if (CurrPcktLen >= CCID_CMD_HEADER_SIZE) ends */ - else - { - if (CurrPcktLen == 0x00U) /* Zero Length Packet Received */ - { - hccid->blkt_state = CCID_STATE_IDLE; - } - } - - break; - - case CCID_STATE_RECEIVE_DATA: - hccid->UsbMessageLength += CurrPcktLen; - - if (CurrPcktLen < hccid->MaxPcktLen) - { - /* Short message, less than the EP Out Size, execute the command, - if parameter like dwLength is too big, the appropriate command will - give an error */ - - /* Full command is received, process the Command */ - (void)USBD_CCID_ReceiveCmdHeader(pdev, (uint8_t *)&hccid->UsbBlkOutData.bMessageType, - (uint16_t)CurrPcktLen); - - (void)USBD_CCID_DispatchCommand(pdev); - } - else if (CurrPcktLen == hccid->MaxPcktLen) - { - if (hccid->UsbMessageLength < (hccid->UsbBlkOutData.dwLength + (uint32_t)CCID_CMD_HEADER_SIZE)) - { - (void)USBD_CCID_ReceiveCmdHeader(pdev, (uint8_t *)&hccid->UsbBlkOutData.bMessageType, - (uint16_t)CurrPcktLen); /* Copy data */ - - /* Prepare EP to Receive next Cmd */ - (void)USBD_LL_PrepareReceive(pdev, CCID_OUT_EP, - hccid->data, hccid->MaxPcktLen); - } - else if (hccid->UsbMessageLength == (hccid->UsbBlkOutData.dwLength + (uint32_t)CCID_CMD_HEADER_SIZE)) - { - /* Full command is received, process the Command */ - (void)USBD_CCID_ReceiveCmdHeader(pdev, (uint8_t *)&hccid->UsbBlkOutData.bMessageType, - (uint16_t)CurrPcktLen); - - (void)USBD_CCID_DispatchCommand(pdev); - } - else - { - /* Too long data received.... Error ! */ - hccid->blkt_state = CCID_STATE_UNCORRECT_LENGTH; - } - } - else - { - /* Too long data received.... Error ! */ - hccid->blkt_state = CCID_STATE_UNCORRECT_LENGTH; - } - break; - - case CCID_STATE_UNCORRECT_LENGTH: - hccid->blkt_state = CCID_STATE_IDLE; - break; - - default: - break; - } - } - else - { - return (uint8_t)USBD_FAIL; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CCID_DispatchCommand - * Parse the commands and Process command - * @param pdev: device instance - * @retval status value - */ -static uint8_t USBD_CCID_DispatchCommand(USBD_HandleTypeDef *pdev) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint8_t errorCode; - - switch (hccid->UsbBlkOutData.bMessageType) - { - case PC_TO_RDR_ICCPOWERON: - errorCode = PC_to_RDR_IccPowerOn(pdev); - RDR_to_PC_DataBlock(errorCode, pdev); - break; - - case PC_TO_RDR_ICCPOWEROFF: - errorCode = PC_to_RDR_IccPowerOff(pdev); - RDR_to_PC_SlotStatus(errorCode, pdev); - break; - - case PC_TO_RDR_GETSLOTSTATUS: - errorCode = PC_to_RDR_GetSlotStatus(pdev); - RDR_to_PC_SlotStatus(errorCode, pdev); - break; - - case PC_TO_RDR_XFRBLOCK: - errorCode = PC_to_RDR_XfrBlock(pdev); - RDR_to_PC_DataBlock(errorCode, pdev); - break; - - case PC_TO_RDR_GETPARAMETERS: - errorCode = PC_to_RDR_GetParameters(pdev); - RDR_to_PC_Parameters(errorCode, pdev); - break; - - case PC_TO_RDR_RESETPARAMETERS: - errorCode = PC_to_RDR_ResetParameters(pdev); - RDR_to_PC_Parameters(errorCode, pdev); - break; - - case PC_TO_RDR_SETPARAMETERS: - errorCode = PC_to_RDR_SetParameters(pdev); - RDR_to_PC_Parameters(errorCode, pdev); - break; - - case PC_TO_RDR_ESCAPE: - errorCode = PC_to_RDR_Escape(pdev); - RDR_to_PC_Escape(errorCode, pdev); - break; - - case PC_TO_RDR_ICCCLOCK: - errorCode = PC_to_RDR_IccClock(pdev); - RDR_to_PC_SlotStatus(errorCode, pdev); - break; - - case PC_TO_RDR_ABORT: - errorCode = PC_to_RDR_Abort(pdev); - RDR_to_PC_SlotStatus(errorCode, pdev); - break; - - case PC_TO_RDR_T0APDU: - errorCode = PC_TO_RDR_T0Apdu(pdev); - RDR_to_PC_SlotStatus(errorCode, pdev); - break; - - case PC_TO_RDR_MECHANICAL: - errorCode = PC_TO_RDR_Mechanical(pdev); - RDR_to_PC_SlotStatus(errorCode, pdev); - break; - - case PC_TO_RDR_SETDATARATEANDCLOCKFREQUENCY: - errorCode = PC_TO_RDR_SetDataRateAndClockFrequency(pdev); - RDR_to_PC_DataRateAndClockFrequency(errorCode, pdev); - break; - - case PC_TO_RDR_SECURE: - errorCode = PC_TO_RDR_Secure(pdev); - RDR_to_PC_DataBlock(errorCode, pdev); - break; - - default: - RDR_to_PC_SlotStatus(SLOTERROR_CMD_NOT_SUPPORTED, pdev); - break; - } - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CCID_Transfer_Data_Request - * Prepare the request response to be sent to the host - * @param pdev: device instance - * @param dataPointer: Pointer to the data buffer to send - * @param dataLen : number of bytes to send - * @retval status value - */ -uint8_t USBD_CCID_Transfer_Data_Request(USBD_HandleTypeDef *pdev, - uint8_t *dataPointer, uint16_t dataLen) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_CCID_ItfTypeDef *hCCIDitf = (USBD_CCID_ItfTypeDef *)pdev->pUserData[pdev->classId]; - - UNUSED(dataPointer); - - hccid->blkt_state = CCID_STATE_SEND_RESP; - hccid->UsbMessageLength = (uint32_t)dataLen; /* Store for future use */ - - /* use the header declared size packet must be well formed */ - hCCIDitf->Response_SendData(pdev, (uint8_t *)&hccid->UsbBlkInData, - (uint16_t)MIN(CCID_DATA_FS_MAX_PACKET_SIZE, hccid->UsbMessageLength)); - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CCID_ReceiveCmdHeader - * Receive the Data from USB BulkOut Buffer to Pointer - * @param pdev: device instance - * @param pDst: destination address to copy the buffer - * @param u8length: length of data to copy - * @retval status - */ -static uint8_t USBD_CCID_ReceiveCmdHeader(USBD_HandleTypeDef *pdev, - uint8_t *pDst, uint16_t u8length) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint8_t *pdst = pDst; - uint32_t Counter; - - for (Counter = 0U; Counter < u8length; Counter++) - { - *pdst = hccid->data[Counter]; - pdst++; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CCID_IntMessage - * Send the Interrupt-IN data to the host - * @param pdev: device instance - * @retval None - */ -uint8_t USBD_CCID_IntMessage(USBD_HandleTypeDef *pdev) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - CCIDCmdEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Check if there is change in Smartcard Slot status */ - if (CCID_IsSlotStatusChange(pdev) != 0U) - { - /* Check Slot Status is changed. Card is Removed/Fitted */ - RDR_to_PC_NotifySlotChange(pdev); - - /* Set the Slot status */ - ((USBD_CCID_ItfTypeDef *)pdev->pUserData[pdev->classId])->SetSlotStatus(pdev); - - (void)USBD_LL_Transmit(pdev, CCIDCmdEpAdd, hccid->UsbIntData, 2U); - } - else - { - /* Set the Slot status */ - ((USBD_CCID_ItfTypeDef *)pdev->pUserData[pdev->classId])->SetSlotStatus(pdev); - } - - return (uint8_t)USBD_OK; -} - -#ifndef USE_USBD_COMPOSITE -/** - * @brief USBD_CCID_GetHSCfgDesc - * Return configuration descriptor - * @param length pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CCID_GetHSCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CCID_CfgDesc, CCID_IN_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CCID_CfgDesc, CCID_OUT_EP); - USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CCID_CfgDesc, CCID_CMD_EP); - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = CCID_DATA_HS_MAX_PACKET_SIZE; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = CCID_DATA_HS_MAX_PACKET_SIZE; - } - - if (pEpCmdDesc != NULL) - { - pEpCmdDesc->bInterval = CCID_CMD_HS_BINTERVAL; - } - - *length = (uint16_t)sizeof(USBD_CCID_CfgDesc); - return USBD_CCID_CfgDesc; -} -/** - * @brief USBD_CCID_GetFSCfgDesc - * Return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CCID_GetFSCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CCID_CfgDesc, CCID_IN_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CCID_CfgDesc, CCID_OUT_EP); - USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CCID_CfgDesc, CCID_CMD_EP); - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = CCID_DATA_FS_MAX_PACKET_SIZE; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = CCID_DATA_FS_MAX_PACKET_SIZE; - } - - if (pEpCmdDesc != NULL) - { - pEpCmdDesc->bInterval = CCID_CMD_FS_BINTERVAL; - } - - *length = (uint16_t)sizeof(USBD_CCID_CfgDesc); - return USBD_CCID_CfgDesc; -} - -/** - * @brief USBD_CCID_GetOtherSpeedCfgDesc - * Return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CCID_GetOtherSpeedCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CCID_CfgDesc, CCID_IN_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CCID_CfgDesc, CCID_OUT_EP); - USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CCID_CfgDesc, CCID_CMD_EP); - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = CCID_DATA_FS_MAX_PACKET_SIZE; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = CCID_DATA_FS_MAX_PACKET_SIZE; - } - - if (pEpCmdDesc != NULL) - { - pEpCmdDesc->bInterval = CCID_CMD_FS_BINTERVAL; - } - - *length = (uint16_t)sizeof(USBD_CCID_CfgDesc); - return USBD_CCID_CfgDesc; -} - -/** - * @brief USBD_CCID_GetDeviceQualifierDescriptor - * return Device Qualifier descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CCID_GetDeviceQualifierDescriptor(uint16_t *length) -{ - *length = (uint16_t)(sizeof(USBD_CCID_DeviceQualifierDesc)); - return USBD_CCID_DeviceQualifierDesc; -} -#endif /* USE_USBD_COMPOSITE */ - -/** - * @brief USBD_CCID_RegisterInterface - * @param pdev: device instance - * @param fops: CD Interface callback - * @retval status - */ -uint8_t USBD_CCID_RegisterInterface(USBD_HandleTypeDef *pdev, - USBD_CCID_ItfTypeDef *fops) -{ - if (fops == NULL) - { - return (uint8_t)USBD_FAIL; - } - - pdev->pUserData[pdev->classId] = fops; - - return (uint8_t)USBD_OK; -} - -/** - * @} - */ diff --git a/Class/CCID/Src/usbd_ccid_cmd.c b/Class/CCID/Src/usbd_ccid_cmd.c deleted file mode 100644 index c65ac5a..0000000 --- a/Class/CCID/Src/usbd_ccid_cmd.c +++ /dev/null @@ -1,1099 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ccid_cmd.c - * @author MCD Application Team - * @brief CCID command (Bulk-OUT Messages / Bulk-IN Messages) handling - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ccid.h" -#include "usbd_ccid_cmd.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -static uint8_t CCID_CheckCommandParams(USBD_HandleTypeDef *pdev, uint32_t param_type); -static void CCID_UpdateCommandStatus(USBD_HandleTypeDef *pdev, uint8_t cmd_status, uint8_t icc_status); - -/* Private functions ---------------------------------------------------------*/ - -/******************************************************************************/ -/* BULK OUT ROUTINES */ -/******************************************************************************/ - -/** - * @brief PC_to_RDR_IccPowerOn - * PC_TO_RDR_ICCPOWERON message execution, apply voltage and get ATR - * @param pdev: device instance - * @retval status of the command execution - */ -uint8_t PC_to_RDR_IccPowerOn(USBD_HandleTypeDef *pdev) -{ - /* Apply the ICC VCC - * Fills the Response buffer with ICC ATR - * This Command is returned with RDR_to_PC_DataBlock(); - */ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint8_t voltage; - uint8_t sc_voltage = 0U; - uint8_t index; - uint8_t error; - - hccid->UsbBlkInData.dwLength = 0U; /* Reset Number of Bytes in abData */ - - error = CCID_CheckCommandParams(pdev, CHK_PARAM_SLOT | CHK_PARAM_DWLENGTH | - CHK_PARAM_ABRFU2 | CHK_PARAM_CARD_PRESENT | - CHK_PARAM_ABORT); - if (error != 0U) - { - return error; - } - - /* Voltage that is applied to the ICC - 00h Automatic Voltage Selection - 01h 5.0 volts - 02h 3.0 volts - 03h 1.8 volts - */ - /* UsbBlkOutData.bSpecific_0 Contains bPowerSelect */ - voltage = hccid->UsbBlkOutData.bSpecific_0; - if (voltage >= VOLTAGE_SELECTION_1V8) - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_ACTIVE)); - return SLOTERROR_BAD_POWERSELECT; /* The Voltage specified is out of Spec */ - } - - /* Correct Voltage Requested by the Host */ - if ((voltage == VOLTAGE_SELECTION_AUTOMATIC) || (voltage == VOLTAGE_SELECTION_3V)) - { - sc_voltage = SC_VOLTAGE_3V; - } - else - { - if (voltage == VOLTAGE_SELECTION_5V) - { - sc_voltage = SC_VOLTAGE_5V; - } - } - SC_Itf_IccPowerOn(sc_voltage); - - /* Check if the Card has come to Active State*/ - error = CCID_CheckCommandParams(pdev, (uint32_t)CHK_ACTIVE_STATE); - - if (error != 0U) - { - /* Check if Voltage is not Automatic */ - if (voltage != 0U) - { - /* If Specific Voltage requested by Host i.e 3V or 5V*/ - return error; - } - else - { - /* Automatic Voltage selection requested by Host */ - - if (sc_voltage != SC_VOLTAGE_5V) - { - /* If voltage selected was Automatic and 5V is not yet tried */ - sc_voltage = SC_VOLTAGE_5V; - SC_Itf_IccPowerOn(sc_voltage); - - /* Check again the State */ - error = CCID_CheckCommandParams(pdev, (uint32_t)CHK_ACTIVE_STATE); - if (error != 0U) - { - return error; - } - } - else - { - /* Voltage requested from Host was 5V already*/ - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_INACTIVE)); - return error; - } - } /* Voltage Selection was automatic */ - } /* If Active State */ - - /* ATR is received, No Error Condition Found */ - hccid->UsbBlkInData.dwLength = SIZE_OF_ATR; - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_NO_ERROR), (BM_ICC_PRESENT_ACTIVE)); - - for (index = 0U; index < SIZE_OF_ATR; index++) - { - /* Copy the ATR to the Response Buffer */ - hccid->UsbBlkInData.abData[index] = SC_ATR_Table[index]; - } - - return SLOT_NO_ERROR; -} - -/** - * @brief PC_to_RDR_IccPowerOff - * Icc VCC is switched Off - * @param pdev: device instance - * @retval error: status of the command execution - */ -uint8_t PC_to_RDR_IccPowerOff(USBD_HandleTypeDef *pdev) -{ - /* The response to this command is the RDR_to_PC_SlotStatus*/ - uint8_t error; - - error = CCID_CheckCommandParams(pdev, CHK_PARAM_SLOT | CHK_PARAM_ABRFU3 | - CHK_PARAM_DWLENGTH); - if (error != 0U) - { - return error; - } - /* Command is ok, Check for Card Presence */ - if (SC_Detect() != 0U) - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_NO_ERROR), (BM_ICC_PRESENT_INACTIVE)); - } - else - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_NO_ERROR), (BM_ICC_NO_ICC_PRESENT)); - } - - /* Power OFF the card */ - SC_Itf_IccPowerOff(); - - return SLOT_NO_ERROR; -} - -/** - * @brief PC_to_RDR_GetSlotStatus - * Provides the Slot status to the host - * @param pdev: device instance - * @retval status of the command execution - */ -uint8_t PC_to_RDR_GetSlotStatus(USBD_HandleTypeDef *pdev) -{ - uint8_t error; - - error = CCID_CheckCommandParams(pdev, CHK_PARAM_SLOT | CHK_PARAM_DWLENGTH | - CHK_PARAM_CARD_PRESENT | CHK_PARAM_ABRFU3); - if (error != 0U) - { - return error; - } - - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_NO_ERROR), (BM_ICC_PRESENT_ACTIVE)); - return SLOT_NO_ERROR; -} - - -/** - * @brief PC_to_RDR_XfrBlock - * Handles the Block transfer from Host. - * Response to this command message is the RDR_to_PC_DataBlock - * @param pdev: device instance - * @retval status of the command execution - */ -uint8_t PC_to_RDR_XfrBlock(USBD_HandleTypeDef *pdev) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint16_t expectedLength; - - uint8_t error; - - error = CCID_CheckCommandParams(pdev, CHK_PARAM_SLOT | CHK_PARAM_CARD_PRESENT | - CHK_PARAM_ABRFU3 | CHK_PARAM_ABORT | CHK_ACTIVE_STATE); - if (error != 0U) - { - return error; - } - if (hccid->UsbBlkOutData.dwLength > ABDATA_SIZE) - { - /* Check amount of Data Sent by Host is > than memory allocated ? */ - - return SLOTERROR_BAD_DWLENGTH; - } - - /* wLevelParameter = Size of expected data to be returned by the - bulk-IN endpoint */ - expectedLength = (uint8_t)((hccid->UsbBlkOutData.bSpecific_2 << 8) | - hccid->UsbBlkOutData.bSpecific_1); - - hccid->UsbBlkInData.dwLength = (uint16_t)expectedLength; - - error = SC_Itf_XferBlock(&(hccid->UsbBlkOutData.abData[0]), - hccid->UsbBlkOutData.dwLength, - expectedLength, &hccid->UsbBlkInData); - - if (error != SLOT_NO_ERROR) - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_ACTIVE)); - } - else - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_NO_ERROR), (BM_ICC_PRESENT_ACTIVE)); - error = SLOT_NO_ERROR; - } - - return error; -} - -/** - * @brief PC_to_RDR_GetParameters - * Provides the ICC parameters to the host - * Response to this command message is the RDR_to_PC_Parameters - * @param pdev: device instance - * @retval status of the command execution - */ -uint8_t PC_to_RDR_GetParameters(USBD_HandleTypeDef *pdev) -{ - uint8_t error; - - error = CCID_CheckCommandParams(pdev, CHK_PARAM_SLOT | CHK_PARAM_DWLENGTH | - CHK_PARAM_CARD_PRESENT | CHK_PARAM_ABRFU3); - if (error != 0U) - { - return error; - } - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_NO_ERROR), (BM_ICC_PRESENT_ACTIVE)); - - return SLOT_NO_ERROR; -} - -/** - * @brief PC_to_RDR_ResetParameters - * Set the ICC parameters to the default - * Response to this command message is the RDR_to_PC_Parameters - * @param pdev: device instance - * @retval status of the command execution - */ -uint8_t PC_to_RDR_ResetParameters(USBD_HandleTypeDef *pdev) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint8_t error; - - error = CCID_CheckCommandParams(pdev, CHK_PARAM_SLOT | CHK_PARAM_DWLENGTH | - CHK_PARAM_CARD_PRESENT | CHK_PARAM_ABRFU3 | - CHK_ACTIVE_STATE); - if (error != 0U) - { - return error; - } - /* This command resets the slot parameters to their default values */ - hccid->UsbBlkOutData.abData[0] = DEFAULT_FIDI; - hccid->UsbBlkOutData.abData[1] = DEFAULT_T01CONVCHECKSUM; - hccid->UsbBlkOutData.abData[2] = DEFAULT_EXTRA_GUARDTIME; - hccid->UsbBlkOutData.abData[3] = DEFAULT_WAITINGINTEGER; - hccid->UsbBlkOutData.abData[4] = DEFAULT_CLOCKSTOP; - hccid->UsbBlkOutData.abData[5] = 0x00U; - hccid->UsbBlkOutData.abData[6] = 0x00U; - - (void)USBD_memcpy(&ProtocolData, (void const *)(&hccid->UsbBlkOutData.abData[0]), - sizeof(ProtocolData)); - - error = SC_Itf_SetParams(&ProtocolData, ProtocolNUM_OUT); - - if (error != SLOT_NO_ERROR) - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_ACTIVE)); - } - else - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_NO_ERROR), (BM_ICC_PRESENT_ACTIVE)); - error = SLOT_NO_ERROR; - } - - return error; -} -/** - * @brief PC_to_RDR_SetParameters - * Set the ICC parameters to the host defined parameters - * Response to this command message is the RDR_to_PC_Parameters - * @param pdev: device instance - * @retval status of the command execution - */ -uint8_t PC_to_RDR_SetParameters(USBD_HandleTypeDef *pdev) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint8_t error; - - error = CCID_CheckCommandParams(pdev, CHK_PARAM_SLOT | CHK_PARAM_CARD_PRESENT | - CHK_PARAM_ABRFU2 | CHK_ACTIVE_STATE); - if (error != 0U) - { - return error; - } - error = SLOT_NO_ERROR; - - /* for Protocol T=0 (dwLength=00000005h) */ - /* for Protocol T=1 (dwLength=00000007h) */ - if (((hccid->UsbBlkOutData.dwLength == 5U) && (hccid->UsbBlkOutData.bSpecific_0 != 0U)) - || ((hccid->UsbBlkOutData.dwLength == 7U) && (hccid->UsbBlkOutData.bSpecific_0 != 1U))) - { - error = SLOTERROR_BAD_PROTOCOLNUM; - } - if (hccid->UsbBlkOutData.abData[4] != DEFAULT_CLOCKSTOP) - { - error = SLOTERROR_BAD_CLOCKSTOP; - } - if (error != SLOT_NO_ERROR) - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_ACTIVE)); - } - - (void)USBD_memcpy(&ProtocolData, (void const *)(&hccid->UsbBlkOutData.abData[0]), - sizeof(ProtocolData)); - - error = SC_Itf_SetParams(&ProtocolData, ProtocolNUM_OUT); - - if (error != SLOT_NO_ERROR) - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_ACTIVE)); - } - else - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_NO_ERROR), (BM_ICC_PRESENT_ACTIVE)); - error = SLOT_NO_ERROR; - } - - return error; -} -/** - * @brief PC_to_RDR_Escape - * Execute the Escape command. This is user specific Implementation - * Response to this command message is the RDR_to_PC_Escape - * @param pdev: device instance - * @retval status of the command execution - */ -uint8_t PC_to_RDR_Escape(USBD_HandleTypeDef *pdev) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint8_t error; - uint32_t size; - - error = CCID_CheckCommandParams(pdev, CHK_PARAM_SLOT | CHK_PARAM_CARD_PRESENT | - CHK_PARAM_ABRFU3 | CHK_PARAM_ABORT | CHK_ACTIVE_STATE); - - if (error != 0U) - { - return error; - } - error = SC_Itf_Escape(&hccid->UsbBlkOutData.abData[0], hccid->UsbBlkOutData.dwLength, - &hccid->UsbBlkInData.abData[0], &size); - - hccid->UsbBlkInData.dwLength = size; - - if (error != SLOT_NO_ERROR) - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_ACTIVE)); - } - else - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_NO_ERROR), (BM_ICC_PRESENT_ACTIVE)); - } - - return error; -} -/** - * @brief PC_to_RDR_IccClock - * Execute the Clock specific command from host - * Response to this command message is the RDR_to_PC_SlotStatus - * @param pdev: device instance - * @retval status of the command execution - */ -uint8_t PC_to_RDR_IccClock(USBD_HandleTypeDef *pdev) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint8_t error; - - error = CCID_CheckCommandParams(pdev, CHK_PARAM_SLOT | CHK_PARAM_CARD_PRESENT | - CHK_PARAM_ABRFU2 | CHK_PARAM_DWLENGTH | CHK_ACTIVE_STATE); - if (error != 0U) - { - return error; - } - /* bClockCommand : - 00h restarts Clock - 01h Stops Clock in the state shown in the bClockStop field */ - if (hccid->UsbBlkOutData.bSpecific_0 > 1U) - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_ACTIVE)); - return SLOTERROR_BAD_CLOCKCOMMAND; - } - - error = SC_Itf_SetClock(hccid->UsbBlkOutData.bSpecific_0); - - if (error != SLOT_NO_ERROR) - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_ACTIVE)); - } - else - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_NO_ERROR), (BM_ICC_PRESENT_ACTIVE)); - } - - return error; -} -/** - * @brief PC_to_RDR_Abort - * Execute the Abort command from host, This stops all Bulk transfers - * from host and ICC - * Response to this command message is the RDR_to_PC_SlotStatus - * @param pdev: device instance - * @retval status of the command execution - */ -uint8_t PC_to_RDR_Abort(USBD_HandleTypeDef *pdev) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint8_t error; - - error = CCID_CheckCommandParams(pdev, CHK_PARAM_SLOT | CHK_PARAM_ABRFU3 | - CHK_PARAM_DWLENGTH); - if (error != 0U) - { - return error; - } - (void)CCID_CmdAbort(pdev, hccid->UsbBlkOutData.bSlot, hccid->UsbBlkOutData.bSeq); - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_NO_ERROR), (BM_ICC_PRESENT_ACTIVE)); - return SLOT_NO_ERROR; -} - -/** - * @brief CCID_CmdAbort - * Execute the Abort command from Bulk EP or from Control EP, - * This stops all Bulk transfers from host and ICC - * @param pdev: device instance - * @param slot: slot number that host wants to abort - * @param seq : Seq number for PC_to_RDR_Abort - * @retval status of the command execution - */ -uint8_t CCID_CmdAbort(USBD_HandleTypeDef *pdev, uint8_t slot, uint8_t seq) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - uint8_t BSlot = hccid->USBD_CCID_Param.bSlot; - /* This function is called for REQUEST_ABORT & PC_to_RDR_Abort */ - - if (slot >= CCID_NUMBER_OF_SLOTS) - { - /* error from CLASS_REQUEST*/ - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_NO_ICC_PRESENT)); - return SLOTERROR_BAD_SLOT; - } - - if (hccid->USBD_CCID_Param.bAbortRequestFlag == 1U) - { - /* Abort Command was already received from ClassReq or PC_to_RDR */ - if ((hccid->USBD_CCID_Param.bSeq == seq) && (BSlot == slot)) - { - /* CLASS Specific request is already Received, Reset the abort flag */ - hccid->USBD_CCID_Param.bAbortRequestFlag = 0; - } - } - else - { - /* Abort Command was NOT received from ClassReq or PC_to_RDR, - so save them for next ABORT command to verify */ - hccid->USBD_CCID_Param.bAbortRequestFlag = 1U; - hccid->USBD_CCID_Param.bSeq = seq; - hccid->USBD_CCID_Param.bSlot = slot; - } - - return 0; -} - -/** - * @brief PC_TO_RDR_T0Apdu - * Execute the PC_TO_RDR_T0APDU command from host - * Response to this command message is the RDR_to_PC_SlotStatus - * @param pdev: device instance - * @retval status of the command execution - */ -uint8_t PC_TO_RDR_T0Apdu(USBD_HandleTypeDef *pdev) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint8_t error; - - error = CCID_CheckCommandParams(pdev, CHK_PARAM_SLOT | CHK_PARAM_CARD_PRESENT | - CHK_PARAM_DWLENGTH | CHK_PARAM_ABORT); - if (error != 0U) - { - return error; - } - if (hccid->UsbBlkOutData.bSpecific_0 > 0x03U) - { - /* Bit 0 is associated with bClassGetResponse - Bit 1 is associated with bClassEnvelope */ - - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_ACTIVE)); - return SLOTERROR_BAD_BMCHANGES; - } - - error = SC_Itf_T0Apdu(hccid->UsbBlkOutData.bSpecific_0, - hccid->UsbBlkOutData.bSpecific_1, - hccid->UsbBlkOutData.bSpecific_2); - - if (error != SLOT_NO_ERROR) - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_ACTIVE)); - } - else - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_NO_ERROR), (BM_ICC_PRESENT_ACTIVE)); - } - - return error; -} - -/** - * @brief PC_TO_RDR_Mechanical - * Execute the PC_TO_RDR_MECHANICAL command from host - * Response to this command message is the RDR_to_PC_SlotStatus - * @param pdev: device instance - * @retval status of the command execution - */ -uint8_t PC_TO_RDR_Mechanical(USBD_HandleTypeDef *pdev) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint8_t error; - - error = CCID_CheckCommandParams(pdev, CHK_PARAM_SLOT | CHK_PARAM_CARD_PRESENT | - CHK_PARAM_ABRFU2 | CHK_PARAM_DWLENGTH); - if (error != 0U) - { - return error; - } - if (hccid->UsbBlkOutData.bSpecific_0 > 0x05U) - { - /* - 01h Accept Card - 02h Eject Card - 03h Capture Card - 04h Lock Card - 05h Unlock Card - */ - - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_ACTIVE)); - return SLOTERROR_BAD_BFUNCTION_MECHANICAL; - } - - error = SC_Itf_Mechanical(hccid->UsbBlkOutData.bSpecific_0); - - if (error != SLOT_NO_ERROR) - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_ACTIVE)); - } - else - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_NO_ERROR), (BM_ICC_PRESENT_ACTIVE)); - } - - return error; -} - -/** - * @brief PC_TO_RDR_SetDataRateAndClockFrequency - * Set the required Card Frequency and Data rate from the host. - * Response to this command message is the - * RDR_to_PC_DataRateAndClockFrequency - * @param pdev: device instance - * @retval status of the command execution - */ -uint8_t PC_TO_RDR_SetDataRateAndClockFrequency(USBD_HandleTypeDef *pdev) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint8_t error; - uint32_t clockFrequency; - uint32_t dataRate; - uint32_t temp; - - error = CCID_CheckCommandParams(pdev, CHK_PARAM_SLOT | CHK_PARAM_CARD_PRESENT | - CHK_PARAM_ABRFU3); - if (error != 0U) - { - return error; - } - if (hccid->UsbBlkOutData.dwLength != 0x08U) - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_ACTIVE)); - return SLOTERROR_BAD_LENTGH; - } - - /* HERE we avoiding to an unaligned memory access*/ - temp = (uint32_t)(hccid->UsbBlkOutData.abData[0]) & 0x000000FFU; - clockFrequency = temp; - - temp = (uint32_t)(hccid->UsbBlkOutData.abData[1]) & 0x000000FFU; - clockFrequency |= temp << 8; - - temp = (uint32_t)(hccid->UsbBlkOutData.abData[2]) & 0x000000FFU; - clockFrequency |= temp << 16; - - temp = (uint32_t)(hccid->UsbBlkOutData.abData[3]) & 0x000000FFU; - clockFrequency |= temp << 24; - - temp = (uint32_t)(hccid->UsbBlkOutData.abData[4]) & 0x000000FFU; - dataRate = temp; - - temp = (uint32_t)(hccid->UsbBlkOutData.abData[5]) & 0x000000FFU; - dataRate |= temp << 8; - - temp = (uint32_t)(hccid->UsbBlkOutData.abData[6]) & 0x000000FFU; - dataRate |= temp << 16; - - temp = (uint32_t)(hccid->UsbBlkOutData.abData[7]) & 0x000000FFU; - dataRate |= temp << 24; - - error = SC_Itf_SetDataRateAndClockFrequency(clockFrequency, dataRate); - hccid->UsbBlkInData.bError = error; - - if (error != SLOT_NO_ERROR) - { - hccid->UsbBlkInData.dwLength = 0; - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_ACTIVE)); - } - else - { - hccid->UsbBlkInData.dwLength = 8; - - (hccid->UsbBlkInData.abData[0]) = (uint8_t)(clockFrequency & 0x000000FFU) ; - - (hccid->UsbBlkInData.abData[1]) = (uint8_t)((clockFrequency & 0x0000FF00U) >> 8); - - (hccid->UsbBlkInData.abData[2]) = (uint8_t)((clockFrequency & 0x00FF0000U) >> 16); - - (hccid->UsbBlkInData.abData[3]) = (uint8_t)((clockFrequency & 0xFF000000U) >> 24); - - (hccid->UsbBlkInData.abData[4]) = (uint8_t)(dataRate & 0x000000FFU) ; - - (hccid->UsbBlkInData.abData[5]) = (uint8_t)((dataRate & 0x0000FF00U) >> 8); - - (hccid->UsbBlkInData.abData[6]) = (uint8_t)((dataRate & 0x00FF0000U) >> 16); - - (hccid->UsbBlkInData.abData[7]) = (uint8_t)((dataRate & 0xFF000000U) >> 24); - - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_NO_ERROR), (BM_ICC_PRESENT_ACTIVE)); - } - - return error; -} - -/** - * @brief PC_TO_RDR_Secure - * Execute the Secure Command from the host. - * Response to this command message is the RDR_to_PC_DataBlock - * @param pdev: device instance - * @retval status of the command execution - */ -uint8_t PC_TO_RDR_Secure(USBD_HandleTypeDef *pdev) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint8_t error; - uint8_t bBWI; - uint16_t wLevelParameter; - uint32_t responseLen; - - hccid->UsbBlkInData.dwLength = 0; - - error = CCID_CheckCommandParams(pdev, CHK_PARAM_SLOT | CHK_PARAM_CARD_PRESENT | - CHK_PARAM_ABORT); - - if (error != 0U) - { - return error; - } - bBWI = hccid->UsbBlkOutData.bSpecific_0; - wLevelParameter = (hccid->UsbBlkOutData.bSpecific_1 + ((uint16_t)hccid->UsbBlkOutData.bSpecific_2 << 8)); - - if ((EXCHANGE_LEVEL_FEATURE == TPDU_EXCHANGE) || - (EXCHANGE_LEVEL_FEATURE == SHORT_APDU_EXCHANGE)) - { - /* TPDU level & short APDU level, wLevelParameter is RFU, = 0000h */ - if (wLevelParameter != 0U) - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_ACTIVE)); - error = SLOTERROR_BAD_LEVELPARAMETER; - return error; - } - } - - error = SC_Itf_Secure(hccid->UsbBlkOutData.dwLength, bBWI, wLevelParameter, - &(hccid->UsbBlkOutData.abData[0]), &responseLen); - - hccid->UsbBlkInData.dwLength = responseLen; - - if (error != SLOT_NO_ERROR) - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_ACTIVE)); - } - else - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_NO_ERROR), (BM_ICC_PRESENT_ACTIVE)); - } - - return error; -} - -/******************************************************************************/ -/* BULK IN ROUTINES */ -/******************************************************************************/ - -/** - * @brief RDR_to_PC_DataBlock - * Provide the data block response to the host - * Response for PC_to_RDR_IccPowerOn, PC_to_RDR_XfrBlock - * @param errorCode: code to be returned to the host - * @param pdev: device instance - * @retval None - */ -void RDR_to_PC_DataBlock(uint8_t errorCode, USBD_HandleTypeDef *pdev) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint32_t length = CCID_RESPONSE_HEADER_SIZE; - - hccid->UsbBlkInData.bMessageType = RDR_TO_PC_DATABLOCK; - hccid->UsbBlkInData.bError = 0U; - hccid->UsbBlkInData.bSpecific = 0U; /* bChainParameter */ - - if (errorCode == SLOT_NO_ERROR) - { - length += hccid->UsbBlkInData.dwLength; /* Length Specified in Command */ - } - - (void)USBD_CCID_Transfer_Data_Request(pdev, (uint8_t *)&hccid->UsbBlkInData, (uint16_t)length); -} - -/** - * @brief RDR_to_PC_SlotStatus - * Provide the Slot status response to the host - * Response for PC_to_RDR_IccPowerOff - * PC_to_RDR_GetSlotStatus - * PC_to_RDR_IccClock - * PC_to_RDR_T0APDU - * PC_to_RDR_Mechanical - * Also the device sends this response message when it has completed - * aborting a slot after receiving both the Class Specific ABORT request - * and PC_to_RDR_Abort command message. - * @param errorCode: code to be returned to the host - * @param pdev: device instance - * @retval None - */ -void RDR_to_PC_SlotStatus(uint8_t errorCode, USBD_HandleTypeDef *pdev) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint16_t length = CCID_RESPONSE_HEADER_SIZE; - - hccid->UsbBlkInData.bMessageType = RDR_TO_PC_SLOTSTATUS; - hccid->UsbBlkInData.dwLength = 0U; - hccid->UsbBlkInData.bError = 0U; - hccid->UsbBlkInData.bSpecific = 0U; /* bClockStatus = 00h Clock running - 01h Clock stopped in state L - 02h Clock stopped in state H - 03h Clock stopped in an unknown state */ - - if (errorCode == SLOT_NO_ERROR) - { - length += (uint16_t)hccid->UsbBlkInData.dwLength; - } - - (void)USBD_CCID_Transfer_Data_Request(pdev, (uint8_t *)(&hccid->UsbBlkInData), length); -} - -/** - * @brief RDR_to_PC_Parameters - * Provide the data block response to the host - * Response for PC_to_RDR_GetParameters, PC_to_RDR_ResetParameters - * PC_to_RDR_SetParameters - * @param errorCode: code to be returned to the host - * @param pdev: device instance - * @retval None - */ -void RDR_to_PC_Parameters(uint8_t errorCode, USBD_HandleTypeDef *pdev) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint16_t length = CCID_RESPONSE_HEADER_SIZE; - - hccid->UsbBlkInData.bMessageType = RDR_TO_PC_PARAMETERS; - hccid->UsbBlkInData.bError = 0U; - - if (errorCode == SLOT_NO_ERROR) - { - if (ProtocolNUM_OUT == 0x00U) - { - hccid->UsbBlkInData.dwLength = LEN_PROTOCOL_STRUCT_T0; - length += (uint16_t)hccid->UsbBlkInData.dwLength; - } - else - { - hccid->UsbBlkInData.dwLength = LEN_PROTOCOL_STRUCT_T1; - length += (uint16_t)hccid->UsbBlkInData.dwLength; - } - } - else - { - hccid->UsbBlkInData.dwLength = 0; - } - - hccid->UsbBlkInData.abData[0] = ProtocolData.bmFindexDindex; - hccid->UsbBlkInData.abData[1] = ProtocolData.bmTCCKST0; - hccid->UsbBlkInData.abData[2] = ProtocolData.bGuardTimeT0; - hccid->UsbBlkInData.abData[3] = ProtocolData.bWaitingIntegerT0; - hccid->UsbBlkInData.abData[4] = ProtocolData.bClockStop; - hccid->UsbBlkInData.abData[5] = ProtocolData.bIfsc; - hccid->UsbBlkInData.abData[6] = ProtocolData.bNad; - - /* bProtocolNum */ - if (ProtocolNUM_OUT == 0x00U) - { - hccid->UsbBlkInData.bSpecific = BPROTOCOL_NUM_T0; - } - else - { - hccid->UsbBlkInData.bSpecific = BPROTOCOL_NUM_T1; - } - (void)USBD_CCID_Transfer_Data_Request(pdev, (uint8_t *)(&hccid->UsbBlkInData), length); -} - -/** - * @brief RDR_to_PC_Escape - * Provide the Escaped data block response to the host - * Response for PC_to_RDR_Escape - * @param errorCode: code to be returned to the host - * @param pdev: device instance - * @retval None - */ -void RDR_to_PC_Escape(uint8_t errorCode, USBD_HandleTypeDef *pdev) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint32_t length = CCID_RESPONSE_HEADER_SIZE; - - hccid->UsbBlkInData.bMessageType = RDR_TO_PC_ESCAPE; - - hccid->UsbBlkInData.bSpecific = 0U; /* Reserved for Future Use */ - hccid->UsbBlkInData.bError = errorCode; - - if (errorCode == SLOT_NO_ERROR) - { - length += hccid->UsbBlkInData.dwLength; /* Length Specified in Command */ - } - - (void)USBD_CCID_Transfer_Data_Request(pdev, (uint8_t *)(&hccid->UsbBlkInData), (uint16_t)length); -} - -/** - * @brief RDR_to_PC_DataRateAndClockFrequency - * Provide the Clock and Data Rate information to host - * Response for PC_TO_RDR_SetDataRateAndClockFrequency - * @param errorCode: code to be returned to the host - * @param pdev: device instance - * @retval None - */ -void RDR_to_PC_DataRateAndClockFrequency(uint8_t errorCode, USBD_HandleTypeDef *pdev) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint32_t length = CCID_RESPONSE_HEADER_SIZE; - - hccid->UsbBlkInData.bMessageType = RDR_TO_PC_DATARATEANDCLOCKFREQUENCY; - hccid->UsbBlkInData.bError = errorCode; - hccid->UsbBlkInData.bSpecific = 0U; /* Reserved for Future Use */ - - if (errorCode == SLOT_NO_ERROR) - { - length += hccid->UsbBlkInData.dwLength; /* Length Specified in Command */ - } - - (void)USBD_CCID_Transfer_Data_Request(pdev, (uint8_t *)(&hccid->UsbBlkInData), (uint16_t)length); -} - -/** - * @brief RDR_to_PC_NotifySlotChange - * Interrupt message to be sent to the host, Checks the card presence - * status and update the buffer accordingly - * @param pdev: device instance - * @retval None - */ -void RDR_to_PC_NotifySlotChange(USBD_HandleTypeDef *pdev) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - hccid->UsbIntData[OFFSET_INT_BMESSAGETYPE] = RDR_TO_PC_NOTIFYSLOTCHANGE; - - if (SC_Detect() != 0U) - { - /* - SLOT_ICC_PRESENT 0x01 : LSb : (0b = no ICC present, 1b = ICC present) - SLOT_ICC_CHANGE 0x02 : MSb : (0b = no change, 1b = change). - */ - hccid->UsbIntData[OFFSET_INT_BMSLOTICCSTATE] = SLOT_ICC_PRESENT | SLOT_ICC_CHANGE; - } - else - { - hccid->UsbIntData[OFFSET_INT_BMSLOTICCSTATE] = SLOT_ICC_CHANGE; - - /* Power OFF the card */ - SC_Itf_IccPowerOff(); - } -} - - -/** - * @brief CCID_UpdSlotStatus - * Updates the variable for the slot status - * @param pdev: device instance - * @param slotStatus : slot status from the calling function - * @retval None - */ -void CCID_UpdSlotStatus(USBD_HandleTypeDef *pdev, uint8_t slotStatus) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - hccid->SlotStatus.SlotStatus = slotStatus; -} - -/** - * @brief CCID_UpdSlotChange - * Updates the variable for the slot change status - * @param pdev: device instance - * @param changeStatus : slot change status from the calling function - * @retval None - */ -void CCID_UpdSlotChange(USBD_HandleTypeDef *pdev, uint8_t changeStatus) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - hccid->SlotStatus.SlotStatusChange = changeStatus; -} - -/** - * @brief CCID_IsSlotStatusChange - * Provides the value of the variable for the slot change status - * @param pdev: device instance - * @retval slot change status - */ -uint8_t CCID_IsSlotStatusChange(USBD_HandleTypeDef *pdev) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - return hccid->SlotStatus.SlotStatusChange; -} - -/** - * @brief CCID_UpdateCommandStatus - * Updates the variable for the BulkIn status - * @param pdev: device instance - * @param cmd_status : Command change status from the calling function - * @param icc_status : Slot change status from the calling function - * @retval None - */ -static void CCID_UpdateCommandStatus(USBD_HandleTypeDef *pdev, uint8_t cmd_status, uint8_t icc_status) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - hccid->UsbBlkInData.bStatus = (cmd_status | icc_status); -} -/** - * @brief CCID_CheckCommandParams - * Checks the specific parameters requested by the function and update - * status accordingly. This function is called from all - * PC_to_RDR functions - * @param pdev: device instance - * @param param_type : Parameter enum to be checked by calling function - * @retval status - */ -static uint8_t CCID_CheckCommandParams(USBD_HandleTypeDef *pdev, uint32_t param_type) -{ - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint32_t parameter; - uint8_t GetState = SC_GetState(); - - hccid->UsbBlkInData.bStatus = BM_ICC_PRESENT_ACTIVE | BM_COMMAND_STATUS_NO_ERROR; - - parameter = (uint32_t)param_type; - - if ((parameter & CHK_PARAM_SLOT) != 0U) - { - /* - The slot number (bSlot) identifies which ICC slot is being addressed - by the message*/ - - /* SLOT Number is 0 onwards, so always < CCID_NUMBER_OF_SLOTs */ - /* Error Condition !!! */ - if (hccid->UsbBlkOutData.bSlot >= CCID_NUMBER_OF_SLOTS) - { - /* Slot requested is more than supported by Firmware */ - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_NO_ICC_PRESENT)); - return SLOTERROR_BAD_SLOT; - } - } - - if ((parameter & CHK_PARAM_CARD_PRESENT) != 0U) - { - /* Commands Parameters ok, Check the Card Status */ - if (SC_Detect() == 0U) - { - /* Card is Not detected */ - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_NO_ICC_PRESENT)); - return SLOTERROR_ICC_MUTE; - } - } - - /* Check that DwLength is 0 */ - if ((parameter & CHK_PARAM_DWLENGTH) != 0U) - { - if (hccid->UsbBlkOutData.dwLength != 0U) - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_ACTIVE)); - return SLOTERROR_BAD_LENTGH; - } - } - - /* abRFU 2 : Reserved for Future Use*/ - if ((parameter & CHK_PARAM_ABRFU2) != 0U) - { - - if ((hccid->UsbBlkOutData.bSpecific_1 != 0U) || (hccid->UsbBlkOutData.bSpecific_2 != 0U)) - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_ACTIVE)); - return SLOTERROR_BAD_ABRFU_2B; /* bSpecific_1 */ - } - } - - if ((parameter & CHK_PARAM_ABRFU3) != 0U) - { - /* abRFU 3 : Reserved for Future Use*/ - if ((hccid->UsbBlkOutData.bSpecific_0 != 0U) || - (hccid->UsbBlkOutData.bSpecific_1 != 0U) || - (hccid->UsbBlkOutData.bSpecific_2 != 0U)) - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_ACTIVE)); - return SLOTERROR_BAD_ABRFU_3B; - } - } - - if ((parameter & CHK_PARAM_ABORT) != 0U) - { - if (hccid->USBD_CCID_Param.bAbortRequestFlag != 0U) - { - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_INACTIVE)); - return SLOTERROR_CMD_ABORTED; - } - } - - if ((parameter & CHK_ACTIVE_STATE) != 0U) - { - /* Commands Parameters ok, Check the Card Status */ - /* Card is detected */ - - if ((GetState != (uint8_t)SC_ACTIVE_ON_T0) && (GetState != (uint8_t)SC_ACTIVE_ON_T1)) - { - /* Check that from Lower Layers, the SmartCard come to known state */ - CCID_UpdateCommandStatus(pdev, (BM_COMMAND_STATUS_FAILED), (BM_ICC_PRESENT_INACTIVE)); - return SLOTERROR_HW_ERROR; - } - } - - return 0U; -} diff --git a/Class/CCID/Src/usbd_ccid_if_template.c b/Class/CCID/Src/usbd_ccid_if_template.c deleted file mode 100644 index ea3f162..0000000 --- a/Class/CCID/Src/usbd_ccid_if_template.c +++ /dev/null @@ -1,270 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ccid_if_template.c - * @author MCD Application Team - * @brief This file provides all the functions for USB Interface for CCID - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ccid.h" -#include "usbd_ccid_if_template.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -static REP_Command_t REP_command; - -/* Private function prototypes -----------------------------------------------*/ -static uint8_t CCID_Init(USBD_HandleTypeDef *pdev); -static uint8_t CCID_DeInit(USBD_HandleTypeDef *pdev); -static uint8_t CCID_ControlReq(uint8_t req, uint8_t *pbuf, uint16_t *length); -static uint8_t CCID_Response_SendData(USBD_HandleTypeDef *pdev, uint8_t *buf, uint16_t len); -static uint8_t CCID_Send_Process(uint8_t *Command, uint8_t *Data); -static uint8_t CCID_Response_Process(void); -static uint8_t CCID_SetSlotStatus(USBD_HandleTypeDef *pdev); - -/* Private functions ---------------------------------------------------------*/ - -/** - * @} - */ - -USBD_CCID_ItfTypeDef USBD_CCID_If_fops = -{ - CCID_Init, - CCID_DeInit, - CCID_ControlReq, - CCID_Response_SendData, - CCID_Send_Process, - CCID_SetSlotStatus, -}; - -/** - * @brief CCID_Init - * Initialize the CCID USB Layer - * @param pdev: device instance - * @retval status value - */ -uint8_t CCID_Init(USBD_HandleTypeDef *pdev) -{ -#ifdef USE_USBD_COMPOSITE - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; -#else - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassData; -#endif /* USE_USBD_COMPOSITE */ - - /* CCID Related Initialization */ - - hccid->blkt_state = CCID_STATE_IDLE; - - return (uint8_t)USBD_OK; -} - -/** - * @brief CCID_DeInit - * Uninitialize the CCID Machine - * @param pdev: device instance - * @retval status value - */ -uint8_t CCID_DeInit(USBD_HandleTypeDef *pdev) -{ -#ifdef USE_USBD_COMPOSITE - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; -#else - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassData; -#endif /* USE_USBD_COMPOSITE */ - - hccid->blkt_state = CCID_STATE_IDLE; - - return (uint8_t)USBD_OK; -} - -/** - * @brief CCID_ControlReq - * Manage the CCID class requests - * @param Cmd: Command code - * @param Buf: Buffer containing command data (request parameters) - * @param Len: Number of data to be sent (in bytes) - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static uint8_t CCID_ControlReq(uint8_t req, uint8_t *pbuf, uint16_t *length) -{ -#ifdef USE_USBD_COMPOSITE - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)USBD_Device.pClassDataCmsit[USBD_Device.classId]; -#else - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)USBD_Device.pClassData; -#endif /* USE_USBD_COMPOSITE */ - - UNUSED(length); - - switch (req) - { - case REQUEST_ABORT: - /* The wValue field contains the slot number (bSlot) in the low byte - and the sequence number (bSeq) in the high byte.*/ - hccid->slot_nb = ((uint16_t) * pbuf & 0x0fU); - hccid->seq_nb = (((uint16_t) * pbuf & 0xf0U) >> 8); - - if (CCID_CmdAbort(&USBD_Device, (uint8_t)hccid->slot_nb, (uint8_t)hccid->seq_nb) != 0U) - { - /* If error is returned by lower layer : - Generally Slot# may not have matched */ - return (int8_t)USBD_FAIL; - } - break; - - case REQUEST_GET_CLOCK_FREQUENCIES: - - /* User have to fill the pbuf with the GetClockFrequency data buffer */ - - break; - - case REQUEST_GET_DATA_RATES: - - /* User have to fill the pbuf with the GetDataRates data buffer */ - - break; - - default: - break; - } - - UNUSED(pbuf); - - return ((int8_t)USBD_OK); -} - -/** - * @brief CCID_Response_SendData - * Send the data on bulk-in EP - * @param pdev: device instance - * @param buf: pointer to data buffer - * @param len: Data Length - * @retval status value - */ -uint8_t CCID_Response_SendData(USBD_HandleTypeDef *pdev, uint8_t *buf, uint16_t len) -{ - (void)USBD_LL_Transmit(pdev, CCID_IN_EP, buf, len); - return (uint8_t)USBD_OK; -} - -/** - * @brief CCID_SEND_Process - * @param Command: pointer to a buffer containing command header - * @param Data: pointer to a buffer containing data sent from Host - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static uint8_t CCID_Send_Process(uint8_t *Command, uint8_t *Data) -{ - Command_State_t Command_State = Command_NOT_OK; - - /* Initialize ICC APP header */ - uint8_t SC_Command[5] = {0}; - UNUSED(Data); - UNUSED(Command_State); - UNUSED(SC_Command); - - /* Start SC Demo ---------------------------------------------------------*/ - switch (Command[1]) /* type of instruction */ - { - case SC_ENABLE: - /* Add your code here */ - break; - - case SC_VERIFY: - /* Add your code here */ - break; - - case SC_READ_BINARY : - /* Add your code here */ - break; - - case SC_CHANGE : - /* Add your code here */ - break; - - default: - break; - } - - /* check if Command header is OK */ - (void)CCID_Response_Process(); /* Get ICC response */ - - return ((uint8_t)USBD_OK); -} - -/** - * @brief CCID_Response_Process - * @param None - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static uint8_t CCID_Response_Process(void) -{ - switch (REP_command) - { - case REP_OK: - /* Add your code here */ - break; - - case REP_NOT_OK : - /* Add your code here */ - break; - - case REP_NOT_SUPP : - /* Add your code here */ - break; - - case REP_ENABLED : - /* Add your code here */ - break; - - case REP_CHANGE : - /* Add your code here */ - break; - - default: - break; - } - - return ((uint8_t)USBD_OK); -} - -/** - * @brief CCID_SetSlotStatus - * Set Slot Status of the Interrupt Transfer - * @param pdev: device instance - * @retval status - */ -uint8_t CCID_SetSlotStatus(USBD_HandleTypeDef *pdev) -{ - /* Get the CCID handler pointer */ -#ifdef USE_USBD_COMPOSITE - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; -#else - USBD_CCID_HandleTypeDef *hccid = (USBD_CCID_HandleTypeDef *)pdev->pClassData; -#endif /* USE_USBD_COMPOSITE */ - - if ((hccid->SlotStatus.SlotStatus) == 1U) /* Transfer Complete Status - of previous Interrupt transfer */ - { - /* Add your code here */ - } - else - { - /* Add your code here */ - } - - return (uint8_t)USBD_OK; -} diff --git a/Class/CCID/Src/usbd_ccid_sc_if_template.c b/Class/CCID/Src/usbd_ccid_sc_if_template.c deleted file mode 100644 index fddf2d0..0000000 --- a/Class/CCID/Src/usbd_ccid_sc_if_template.c +++ /dev/null @@ -1,473 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ccid_sc_if_template.c - * @author MCD Application Team - * @brief SmartCard Interface file - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ccid_sc_if_template.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* State Machine for the SmartCard Interface */ -static SC_State SCState = SC_POWER_OFF; - -/* APDU Transport Structures */ -SC_ADPU_CommandsTypeDef SC_ADPU; -SC_ADPU_ResponseTypeDef SC_Response; -SC_Param_t SC_Param; -Protocol_01_DataTypeDef ProtocolData; - -/* Extern variables ----------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -static void SC_SaveVoltage(uint8_t voltage); -static void SC_Itf_UpdateParams(void); - -/* Private functions ---------------------------------------------------------*/ -/** - * @brief SC_Itf_IccPowerOn Manages the Warm and Cold Reset - and get the Answer to Reset from ICC - * @param voltage: required by host - * @retval None - */ -void SC_Itf_IccPowerOn(uint8_t voltage) -{ - SCState = SC_POWER_ON; - SC_ADPU.Header.CLA = 0x00U; - SC_ADPU.Header.INS = SC_GET_A2R; - SC_ADPU.Header.P1 = 0x00U; - SC_ADPU.Header.P2 = 0x00U; - SC_ADPU.Body.LC = 0x00U; - - /* Power ON the card */ - SC_PowerCmd(SC_ENABLED); - - /* Configure the Voltage, Even if IO is still not configured */ - SC_VoltageConfig(voltage); - - while ((SCState != SC_ACTIVE_ON_T0) && (SCState != SC_ACTIVE_ON_T1) - && (SCState != SC_NO_INIT)) - { - /* If Either The Card has become Active or Become De-Active */ - SC_Handler(&SCState, &SC_ADPU, &SC_Response); - } - - if ((SCState == SC_ACTIVE_ON_T0) || (SCState == SC_ACTIVE_ON_T1)) - { - SC_Itf_UpdateParams(); - /* Apply the Procedure Type Selection (PTS) */ - SC_PTSConfig(); - - /* Save Voltage for Future use */ - SC_SaveVoltage(voltage); - } - - return; -} - -/** - * @brief SC_Itf_IccPowerOff Power OFF the card - * @param None - * @retval None - */ -void SC_Itf_IccPowerOff(void) -{ - SC_PowerCmd(SC_DISABLED); - SC_SetState(SC_POWER_OFF); - - return; -} - -/** - * @brief Initialize the parameters structures to the default value - * @param None - * @retval None - */ -void SC_Itf_InitParams(void) -{ - /* - FI, the reference to a clock rate conversion factor - over the bits b8 to b5 - - DI, the reference to a baud rate adjustment factor - over the bits b4 to bl - */ - SC_Param.SC_A2R_FiDi = DEFAULT_FIDI; - SC_Param.SC_hostFiDi = DEFAULT_FIDI; - - ProtocolData.bmFindexDindex = DEFAULT_FIDI; - - /* Placeholder, Ignored */ - /* 0 = Direct, first byte of the ICC ATR data. */ - ProtocolData.bmTCCKST0 = DEFAULT_T01CONVCHECKSUM; - - /* Extra GuardTime = 0 etu */ - ProtocolData.bGuardTimeT0 = DEFAULT_EXTRA_GUARDTIME; - ProtocolData.bWaitingIntegerT0 = DEFAULT_WAITINGINTEGER; - ProtocolData.bClockStop = 0U; /* Stopping the Clock is not allowed */ - - /*T=1 protocol */ - ProtocolData.bIfsc = DEFAULT_IFSC; - ProtocolData.bNad = DEFAULT_NAD; - - return; -} - -/** - * @brief Save the A2R Parameters for further usage - * @param None - * @retval None - */ -static void SC_Itf_UpdateParams(void) -{ - /* - FI, the reference to a clock rate conversion factor - over the bits b8 to b5 - DI, the reference to a baud rate adjustment factor - over the bits b4 to bl - */ - SC_Param.SC_A2R_FiDi = SC_A2R.T[0].InterfaceByte[0].Value; - SC_Param.SC_hostFiDi = SC_A2R.T[0].InterfaceByte[0].Value; - - ProtocolData.bmFindexDindex = SC_A2R.T[0].InterfaceByte[0].Value; - - return; -} - -/** - * @brief SC_Itf_SetParams - * Set the parameters for CCID/USART interface - * @param pPtr: pointer to buffer containing the - * parameters to be set in USART - * @param T_01: type of protocol, T=1 or T=0 - * @retval status value - */ -uint8_t SC_Itf_SetParams(Protocol_01_DataTypeDef *pPtr, uint8_t T_01) -{ - /* uint16_t guardTime; */ /* Keep it 16b for handling 8b additions */ - uint32_t fi_new; - uint32_t di_new; - Protocol_01_DataTypeDef New_DataStructure; - fi_new = pPtr->bmFindexDindex; - di_new = pPtr->bmFindexDindex; - - New_DataStructure.bmTCCKST0 = pPtr->bmTCCKST0; - - New_DataStructure.bGuardTimeT0 = pPtr->bGuardTimeT0; - New_DataStructure.bWaitingIntegerT0 = pPtr->bWaitingIntegerT0; - New_DataStructure.bClockStop = pPtr->bClockStop; - if (T_01 == 0x01U) - { - New_DataStructure.bIfsc = pPtr->bIfsc; - New_DataStructure.bNad = pPtr->bNad; - } - else - { - New_DataStructure.bIfsc = 0x00U; - New_DataStructure.bNad = 0x00U; - } - - /* Check for the FIDI Value set by Host */ - di_new &= (uint8_t)0x0F; - if (SC_GetDTableValue(di_new) == 0U) - { - return SLOTERROR_BAD_FIDI; - } - - fi_new >>= 4U; - fi_new &= 0x0FU; - - if (SC_GetDTableValue(fi_new) == 0U) - { - return SLOTERROR_BAD_FIDI; - } - - if ((T_01 == 0x00U) - && (New_DataStructure.bmTCCKST0 != 0x00U) - && (New_DataStructure.bmTCCKST0 != 0x02U)) - { - return SLOTERROR_BAD_T01CONVCHECKSUM; - } - - if ((T_01 == 0x01U) - && (New_DataStructure.bmTCCKST0 != 0x10U) - && (New_DataStructure.bmTCCKST0 != 0x11U) - && (New_DataStructure.bmTCCKST0 != 0x12U) - && (New_DataStructure.bmTCCKST0 != 0x13U)) - { - return SLOTERROR_BAD_T01CONVCHECKSUM; - } - - if ((New_DataStructure.bWaitingIntegerT0 >= 0xA0U) - && ((New_DataStructure.bmTCCKST0 & 0x10U) == 0x10U)) - { - return SLOTERROR_BAD_WAITINGINTEGER; - } - if ((New_DataStructure.bClockStop != 0x00U) - && (New_DataStructure.bClockStop != 0x03U)) - { - return SLOTERROR_BAD_CLOCKSTOP; - } - if (New_DataStructure.bNad != 0x00U) - { - return SLOTERROR_BAD_NAD; - } - /* Put Total GuardTime in USART Settings */ - /* USART_SetGuardTime(SC_USART, (uint8_t)(guardTime + DEFAULT_EXTRA_GUARDTIME)); */ - - /* Save Extra GuardTime Value */ - ProtocolData.bGuardTimeT0 = New_DataStructure.bGuardTimeT0; - ProtocolData.bmTCCKST0 = New_DataStructure.bmTCCKST0; - ProtocolData.bWaitingIntegerT0 = New_DataStructure.bWaitingIntegerT0; - ProtocolData.bClockStop = New_DataStructure.bClockStop; - ProtocolData.bIfsc = New_DataStructure.bIfsc; - ProtocolData.bNad = New_DataStructure.bNad; - - /* Save New bmFindexDindex */ - SC_Param.SC_hostFiDi = pPtr->bmFindexDindex; - SC_PTSConfig(); - - ProtocolData.bmFindexDindex = pPtr->bmFindexDindex; - - return SLOT_NO_ERROR; -} - -/** - * @brief SC_Itf_Escape function from the host - * This is user implementable - * @param ptrEscape: pointer to buffer containing the Escape data - * @param escapeLen: length of escaped data - * @param responseBuff: pointer containing escape buffer response - * @param responseLen: length of escape response buffer - * @retval status value - */ -uint8_t SC_Itf_Escape(uint8_t *ptrEscape, uint32_t escapeLen, - uint8_t *responseBuff, uint32_t *responseLen) -{ - UNUSED(ptrEscape); - UNUSED(escapeLen); - UNUSED(responseBuff); - UNUSED(responseLen); - - /* Manufacturer specific implementation ... */ - /* - uint32_t idx; - uint8_t *pResBuff = responseBuff; - uint8_t *pEscape = ptrEscape; - - for(idx = 0; idx < escapeLen; idx++) - { - *pResBuff = *pEscape; - pResBuff++; - pEscape++; - } - - *responseLen = escapeLen; - */ - return SLOT_NO_ERROR; -} - -/** - * @brief SC_Itf_SetClock function to define Clock Status request from the host. - * This is user implementable - * @param bClockCommand: Clock status from the host - * @retval status value - */ -uint8_t SC_Itf_SetClock(uint8_t bClockCommand) -{ - /* bClockCommand - 00h restarts Clock - 01h Stops Clock in the state shown in the bClockStop - field of the PC_to_RDR_SetParameters command - and RDR_to_PC_Parameters message.*/ - - if (bClockCommand == 0U) - { - /* 00h restarts Clock : Since Clock is always running, PASS this command */ - return SLOT_NO_ERROR; - } - else - { - if (bClockCommand == 1U) - { - return SLOTERROR_BAD_CLOCKCOMMAND; - } - } - - return SLOTERROR_CMD_NOT_SUPPORTED; -} - -/** - * @brief SC_Itf_XferBlock function from the host. - * This is user implementable - * @param ptrBlock : Pointer containing the data from host - * @param blockLen : length of block data for the data transfer - * @param expectedLen: expected length of data transfer - * @param CCID_BulkIn_Data: Pointer containing the CCID Bulk In Data Structure - * @retval status value - */ -uint8_t SC_Itf_XferBlock(uint8_t *ptrBlock, uint32_t blockLen, uint16_t expectedLen, - USBD_CCID_BulkIn_DataTypeDef *CCID_BulkIn_Data) -{ - uint8_t ErrorCode = SLOT_NO_ERROR; - UNUSED(CCID_BulkIn_Data); - UNUSED(expectedLen); - UNUSED(blockLen); - UNUSED(ptrBlock); - - if (ProtocolNUM_OUT == 0x00U) - { - /* Add your code here */ - } - - if (ProtocolNUM_OUT == 0x01U) - { - /* Add your code here */ - } - - if (ErrorCode != SLOT_NO_ERROR) - { - return ErrorCode; - } - - return ErrorCode; -} - - -/** - * @brief SC_Itf_T0Apdu - Class Specific Request from the host to provide supported data rates - * This is Optional function & user implementable - * @param bmChanges : value specifying which parameter is valid in - * command among next bClassGetResponse, bClassEnvelope - * @param bClassGetResponse : Value to force the class byte of the - * header in a Get Response command. - * @param bClassEnvelope : Value to force the class byte of the header - * in a Envelope command. - * @retval status value - */ -uint8_t SC_Itf_T0Apdu(uint8_t bmChanges, uint8_t bClassGetResponse, - uint8_t bClassEnvelope) -{ - UNUSED(bClassEnvelope); - UNUSED(bClassGetResponse); - - /* User have to fill the pbuf with the GetDataRates data buffer */ - - if (bmChanges == 0U) - { - /* Bit cleared indicates that the associated field is not significant and - that default behaviour defined in CCID class descriptor is selected */ - return SLOT_NO_ERROR; - } - - return SLOTERROR_CMD_NOT_SUPPORTED; -} - -/** - * @brief SC_Itf_Mechanical - Mechanical Function being requested by Host - * This is Optional function & user implementable - * @param bFunction : value corresponds to the mechanical function - * being requested by host - * @retval status value - */ -uint8_t SC_Itf_Mechanical(uint8_t bFunction) -{ - UNUSED(bFunction); - - return SLOTERROR_CMD_NOT_SUPPORTED; -} - -/** - * @brief SC_Itf_SetDataRateAndClockFrequency - * Set the Clock and data Rate of the Interface - * This is Optional function & user implementable - * @param dwClockFrequency : value of clock in kHz requested by host - * @param dwDataRate : value of data rate requested by host - * @retval status value - */ -uint8_t SC_Itf_SetDataRateAndClockFrequency(uint32_t dwClockFrequency, - uint32_t dwDataRate) -{ - /* User have to fill the pbuf with the GetDataRates data buffer */ - - if ((dwDataRate == USBD_CCID_DEFAULT_DATA_RATE) && - (dwClockFrequency == USBD_CCID_DEFAULT_CLOCK_FREQ)) - { - return SLOT_NO_ERROR; - } - - return SLOTERROR_CMD_NOT_SUPPORTED; -} - -/** - * @brief SC_Itf_Secure - * Process the Secure command - * This is Optional function & user implementable - * @param dwLength : length of data from the host - * @param bBWI : Block Waiting Timeout sent by host - * @param wLevelParameter : Parameters sent by host - * @param pbuf : buffer containing the data - * @param returnLen : Length of data expected to return - * @retval status value - */ -uint8_t SC_Itf_Secure(uint32_t dwLength, uint8_t bBWI, uint16_t wLevelParameter, - uint8_t *pbuf, uint32_t *returnLen) -{ - UNUSED(pbuf); - UNUSED(wLevelParameter); - UNUSED(bBWI); - UNUSED(dwLength); - *returnLen = 0U; - - return SLOTERROR_CMD_NOT_SUPPORTED; -} - -/** - * @brief SC_SaveVoltage - Saves the voltage value to be saved for further usage - * @param voltage: voltage value to be saved for further usage - * @retval None - */ -static void SC_SaveVoltage(uint8_t voltage) -{ - SC_Param.voltage = voltage; - - return; -} - -/** - * @brief Provides the value of SCState variable - * @param None - * @retval uint8_t SCState - */ -uint8_t SC_GetState(void) -{ - return (uint8_t)SCState; -} - -/** - * @brief Set the value of SCState variable to Off - * @param scState: value of SCState to be updated - * @retval None - */ -void SC_SetState(SC_State scState) -{ - SCState = scState; - - return; -} diff --git a/Class/CCID/Src/usbd_ccid_smartcard_template.c b/Class/CCID/Src/usbd_ccid_smartcard_template.c deleted file mode 100644 index 059aef4..0000000 --- a/Class/CCID/Src/usbd_ccid_smartcard_template.c +++ /dev/null @@ -1,486 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ccid_smartcard_template.c - * @author MCD Application Team - * @brief This file provides all the Smartcard firmware functions. - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/** @addtogroup usbd_ccid_Smartcard - * @{ - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ccid_smartcard_template.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Directories & Files ID */ -/*The following Directories & Files ID can take any of following Values and can - be used in the smartcard application */ -/* -const uint8_t MasterRoot[2] = {0x3F, 0x00}; -const uint8_t GSMDir[2] = {0x7F, 0x20}; -const uint8_t ICCID[2] = {0x2F, 0xE2}; -const uint8_t IMSI[2] = {0x6F, 0x07}; - -__IO uint8_t ICCID_Content[10] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -uint32_t CHV1Status = 0U; - -uint8_t CHV1[8] = {'0', '0', '0', '0', '0', '0', '0', '0'}; -__IO uint8_t IMSI_Content[9] = {0x01, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; -*/ - -/* F Table: Clock Rate Conversion Table from ISO/IEC 7816-3 */ -/* static uint32_t F_Table[16] = {372, 372, 558, 744, 1116, 1488, 1860, 0, 0, 512, 768, - 1024, 1536, 2048, 0, 0 - }; */ - - -/* D Table: Baud Rate Adjustment Factor Table from ISO/IEC 7816-3 */ -static uint32_t D_Table[16] = {0, 1, 2, 4, 8, 16, 32, 64, 12, 20, 0, 0, 0, 0, 0, 0}; - -/* Global variables definition and initialization ----------------------------*/ -SC_ATRTypeDef SC_A2R; -uint8_t SC_ATR_Table[40]; -uint8_t ProtocolNUM_OUT; - -/* Private function prototypes -----------------------------------------------*/ -static void SC_Init(void); -static void SC_DeInit(void); -static void SC_AnswerReq(SC_State *SC_state, uint8_t *card, uint8_t length); /* Ask ATR */ -static uint8_t SC_decode_Answer2reset(uint8_t *card); /* Decode ATR */ -static void SC_SendData(SC_ADPU_CommandsTypeDef *SCADPU, SC_ADPU_ResponseTypeDef *SC_ResponseStatus); -/* static void SC_Reset(GPIO_PinState ResetState); */ - -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief Handles all Smartcard states and serves to send and receive all - * communication data between Smartcard and reader. - * @param SCState: pointer to an SC_State enumeration that will contain the - * Smartcard state. - * @param SC_ADPU: pointer to an SC_ADPU_Commands structure that will be initialized. - * @param SC_Response: pointer to a SC_ADPU_Response structure which will be initialized. - * @retval None - */ -void SC_Handler(SC_State *SCState, SC_ADPU_CommandsTypeDef *SC_ADPU, SC_ADPU_ResponseTypeDef *SC_Response) -{ - uint32_t i; - uint32_t j; - - switch (*SCState) - { - case SC_POWER_ON: - if (SC_ADPU->Header.INS == SC_GET_A2R) - { - /* Smartcard initialization */ - SC_Init(); - - /* Reset Data from SC buffer */ - for (i = 0U; i < 40U; i++) - { - SC_ATR_Table[i] = 0; - } - - /* Reset SC_A2R Structure */ - SC_A2R.TS = 0U; - SC_A2R.T0 = 0U; - - for (i = 0U; i < MAX_PROTOCOLLEVEL; i++) - { - for (j = 0U; j < MAX_INTERFACEBYTE; j++) - { - SC_A2R.T[i].InterfaceByte[j].Status = 0U; - SC_A2R.T[i].InterfaceByte[j].Value = 0U; - } - } - - for (i = 0U; i < HIST_LENGTH; i++) - { - SC_A2R.Historical[i] = 0U; - } - - SC_A2R.Tlength = 0U; - SC_A2R.Hlength = 0U; - - /* Next State */ - *SCState = SC_RESET_LOW; - } - break; - - case SC_RESET_LOW: - if (SC_ADPU->Header.INS == SC_GET_A2R) - { - /* If card is detected then Power ON, Card Reset and wait for an answer) */ - if (SC_Detect() != 0U) - { - while (((*SCState) != SC_POWER_OFF) && ((*SCState) != SC_ACTIVE)) - { - SC_AnswerReq(SCState, &SC_ATR_Table[0], 40U); /* Check for answer to reset */ - } - } - else - { - (*SCState) = SC_POWER_OFF; - } - } - break; - - case SC_ACTIVE: - if (SC_ADPU->Header.INS == SC_GET_A2R) - { - uint8_t protocol = SC_decode_Answer2reset(&SC_ATR_Table[0]); - if (protocol == T0_PROTOCOL) - { - (*SCState) = SC_ACTIVE_ON_T0; - ProtocolNUM_OUT = T0_PROTOCOL; - } - else if (protocol == T1_PROTOCOL) - { - (*SCState) = SC_ACTIVE_ON_T1; - ProtocolNUM_OUT = T1_PROTOCOL; - } - else - { - (*SCState) = SC_POWER_OFF; - } - } - break; - - case SC_ACTIVE_ON_T0: - /* process commands other than ATR */ - SC_SendData(SC_ADPU, SC_Response); - break; - - case SC_ACTIVE_ON_T1: - /* process commands other than ATR */ - SC_SendData(SC_ADPU, SC_Response); - break; - - case SC_POWER_OFF: - SC_DeInit(); /* Disable Smartcard interface */ - break; - - default: - (*SCState) = SC_POWER_OFF; - break; - } -} - -/** - * @brief Enables or disables the power to the Smartcard. - * @param NewState: new state of the Smartcard power supply. - * This parameter can be: SC_ENABLED or SC_DISABLED. - * @retval None - */ -void SC_PowerCmd(SCPowerState NewState) -{ - UNUSED(NewState); - /* enable or disable smartcard pin */ - - return; -} - -/** - * @brief Sets or clears the Smartcard reset pin. - * @param ResetState: this parameter specifies the state of the Smartcard - * reset pin. BitVal must be one of the BitAction enum values: - * @arg Bit_RESET: to clear the port pin. - * @arg Bit_SET: to set the port pin. - * @retval None - */ -/* static void SC_Reset(GPIO_PinState ResetState) -{ - UNUSED(ResetState); - - return; -} -*/ - - -/** - * @brief Resends the byte that failed to be received (by the Smartcard) correctly. - * @param None - * @retval None - */ - -void SC_ParityErrorHandler(void) -{ - /* Add your code here */ - - return; -} - -/** - * @brief Configures the IO speed (BaudRate) communication. - * @param None - * @retval None - */ - -void SC_PTSConfig(void) -{ - /* Add your code here */ - - return; -} - - -/** - * @brief Manages the Smartcard transport layer: send APDU commands and receives - * the APDU response. - * @param SC_ADPU: pointer to a SC_ADPU_Commands structure which will be initialized. - * @param SC_Response: pointer to a SC_ADPU_Response structure which will be initialized. - * @retval None - */ -static void SC_SendData(SC_ADPU_CommandsTypeDef *SCADPU, SC_ADPU_ResponseTypeDef *SC_ResponseStatus) -{ - uint8_t i; - uint8_t SC_Command[5]; - uint8_t SC_DATA[LC_MAX]; - - UNUSED(SCADPU); - - /* Reset response buffer */ - for (i = 0U; i < LC_MAX; i++) - { - SC_ResponseStatus->Data[i] = 0U; - SC_DATA[i] = 0U; - } - - /* User to add code here */ - - /* send command to ICC and get response status */ - USBD_CCID_If_fops.Send_Process((uint8_t *)&SC_Command, (uint8_t *)&SC_DATA); - -} - -/** - * @brief SC_AnswerReq - Requests the reset answer from card. - * @param SC_state: pointer to an SC_State enumeration that will contain the Smartcard state. - * @param atr_buffer: pointer to a buffer which will contain the card ATR. - * @param length: maximum ATR length - * @retval None - */ -static void SC_AnswerReq(SC_State *SC_state, uint8_t *atr_buffer, uint8_t length) -{ - UNUSED(length); - UNUSED(atr_buffer); - - /* to be implemented by USER */ - switch (*SC_state) - { - case SC_RESET_LOW: - /* Check response with reset low */ - (*SC_state) = SC_ACTIVE; - break; - - case SC_ACTIVE: - break; - case SC_RESET_HIGH: - /* Check response with reset high */ - - break; - - case SC_POWER_OFF: - /* Close Connection if no answer received */ - - break; - - default: - (*SC_state) = SC_RESET_LOW; - break; - } - - return; -} - -/** - * @brief SC_decode_Answer2reset - Decodes the Answer to reset received from card. - * @param card: pointer to the buffer containing the card ATR. - * @retval None - */ -static uint8_t SC_decode_Answer2reset(uint8_t *card) -{ - uint32_t i = 0U; - uint32_t flag = 0U; - uint32_t protocol; - uint8_t index = 0U; - uint8_t level = 0U; - - /******************************TS/T0 Decode************************************/ - index++; - SC_A2R.TS = card[index]; /* Initial character */ - - index++; - SC_A2R.T0 = card[index]; /* Format character */ - - /*************************Historical Table Length Decode***********************/ - SC_A2R.Hlength = SC_A2R.T0 & 0x0FU; - - /******************************Protocol Level(1) Decode************************/ - /* Check TD(1) if present */ - if ((SC_A2R.T0 & 0x80U) == 0x80U) - { - flag = 1U; - } - - /* Each bits in the T0 high nibble(b8 to b5) equal to 1 indicates the presence - of a further interface byte */ - for (i = 0U; i < 4U; i++) - { - if ((((SC_A2R.T0 & 0xF0U) >> (4U + i)) & 0x1U) != 0U) - { - SC_A2R.T[level].InterfaceByte[i].Status = 1U; - index++; - SC_A2R.T[level].InterfaceByte[i].Value = card[index]; - SC_A2R.Tlength++; - } - } - - /*****************************T Decode*****************************************/ - if (SC_A2R.T[level].InterfaceByte[3].Status == 1U) - { - /* Only the protocol(parameter T) present in TD(1) is detected - if two or more values of parameter T are present in TD(1), TD(2)..., so the - firmware should be updated to support them */ - protocol = (uint8_t)(SC_A2R.T[level].InterfaceByte[SC_INTERFACEBYTE_TD].Value & 0x0FU); - } - else - { - protocol = 0U; - } - - /* Protocol Level Increment */ - /******************************Protocol Level(n>1) Decode**********************/ - while (flag != 0U) - { - if ((SC_A2R.T[level].InterfaceByte[SC_INTERFACEBYTE_TD].Value & 0x80U) == 0x80U) - { - flag = 1U; - } - else - { - flag = 0U; - } - /* Each bits in the high nibble(b8 to b5) for the TD(i) equal to 1 indicates - the presence of a further interface byte */ - for (i = 0U; i < 4U; i++) - { - if ((((SC_A2R.T[level].InterfaceByte[SC_INTERFACEBYTE_TD].Value & 0xF0U) >> (4U + i)) & 0x1U) != 0U) - { - SC_A2R.T[level + 1U].InterfaceByte[i].Status = 1U; - index++; - SC_A2R.T[level + 1U].InterfaceByte[i].Value = card[index]; - SC_A2R.Tlength++; - } - } - level++; - } - - for (i = 0U; i < SC_A2R.Hlength; i++) - { - SC_A2R.Historical[i] = card[i + 2U + SC_A2R.Tlength]; - } - /*************************************TCK Decode*******************************/ - SC_A2R.TCK = card[SC_A2R.Hlength + 2U + SC_A2R.Tlength]; - - return (uint8_t)protocol; -} - -/** - * @brief Initializes all peripheral used for Smartcard interface. - * @param None - * @retval None - */ -static void SC_Init(void) -{ - /* - Add your initialization code here - */ - - return; -} - - -/** - * @brief Deinitializes all resources used by the Smartcard interface. - * @param None - * @retval None - */ -static void SC_DeInit(void) -{ - /* - Add your deinitialization code here - */ - - return; -} - -/** - * @brief Configures the card power voltage. - * @param SC_Voltage: specifies the card power voltage. - * This parameter can be one of the following values: - * @arg SC_VOLTAGE_5V: 5V cards. - * @arg SC_VOLTAGE_3V: 3V cards. - * @retval None - */ -void SC_VoltageConfig(uint32_t SC_Voltage) -{ - UNUSED(SC_Voltage); - /* Add your code here */ - - return; -} - -/** - * @brief Configures GPIO hardware resources used for Samrtcard. - * @param None - * @retval None - */ -void SC_IOConfig(void) -{ - /* Add your code here */ - - return; -} - -/** - * @brief Detects whether the Smartcard is present or not. - * @param None. - * @retval 1 - Smartcard inserted - * 0 - Smartcard not inserted - */ -uint8_t SC_Detect(void) -{ - uint8_t PIN_State = 0U; - - /* Add your code here */ - - return PIN_State; -} - -/** - * @brief Get the Right Value from the D_Table Index - * @param idx : Index to Read from the Table - * @retval Value read from the Table - */ -uint32_t SC_GetDTableValue(uint32_t idx) -{ - return D_Table[idx]; -} diff --git a/Class/CDC_ECM/Inc/usbd_cdc_ecm.h b/Class/CDC_ECM/Inc/usbd_cdc_ecm.h deleted file mode 100644 index 1284d4d..0000000 --- a/Class/CDC_ECM/Inc/usbd_cdc_ecm.h +++ /dev/null @@ -1,281 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc_ecm.h - * @author MCD Application Team - * @brief header file for the usbd_cdc_ecm.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_CDC_ECM_H -#define __USB_CDC_ECM_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup usbd_cdc_ecm - * @brief This file is the Header file for usbd_cdc_ecm.c - * @{ - */ - - -/** @defgroup usbd_cdc_ecm_Exported_Defines - * @{ - */ -/* Comment this define in order to disable the CDC ECM Notification pipe */ - -#ifndef CDC_ECM_IN_EP -#define CDC_ECM_IN_EP 0x81U /* EP1 for data IN */ -#endif /* CDC_ECM_IN_EP */ -#ifndef CDC_ECM_OUT_EP -#define CDC_ECM_OUT_EP 0x01U /* EP1 for data OUT */ -#endif /* CDC_ECM_OUT_EP */ -#ifndef CDC_ECM_CMD_EP -#define CDC_ECM_CMD_EP 0x82U /* EP2 for CDC ECM commands */ -#endif /* CDC_ECM_CMD_EP */ - -#ifndef CDC_ECM_CMD_ITF_NBR -#define CDC_ECM_CMD_ITF_NBR 0x00U /* Command Interface Number 0 */ -#endif /* CDC_ECM_CMD_ITF_NBR */ - -#ifndef CDC_ECM_COM_ITF_NBR -#define CDC_ECM_COM_ITF_NBR 0x01U /* Communication Interface Number 0 */ -#endif /* CDC_ECM_CMD_ITF_NBR */ - -#ifndef CDC_ECM_HS_BINTERVAL -#define CDC_ECM_HS_BINTERVAL 0x10U -#endif /* CDC_ECM_HS_BINTERVAL */ - -#ifndef CDC_ECM_FS_BINTERVAL -#define CDC_ECM_FS_BINTERVAL 0x10U -#endif /* CDC_ECM_FS_BINTERVAL */ - -#ifndef CDC_ECM_CMD_PACKET_SIZE -#define CDC_ECM_CMD_PACKET_SIZE 16U /* Control Endpoint Packet size */ -#endif /* CDC_ECM_CMD_PACKET_SIZE */ - -#ifndef USBD_SUPPORT_USER_STRING_DESC -#define USBD_SUPPORT_USER_STRING_DESC 1U -#endif /* USBD_SUPPORT_USER_STRING_DESC */ - -/* CDC_ECM Endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */ -#define CDC_ECM_DATA_HS_MAX_PACKET_SIZE 512U /* Endpoint IN & OUT Packet size */ -#define CDC_ECM_DATA_FS_MAX_PACKET_SIZE 64U /* Endpoint IN & OUT Packet size */ - -#define CDC_ECM_CONFIG_DESC_SIZ 79U - -#define CDC_ECM_DATA_BUFFER_SIZE 2000U - -#define CDC_ECM_DATA_HS_IN_PACKET_SIZE CDC_ECM_DATA_HS_MAX_PACKET_SIZE -#define CDC_ECM_DATA_HS_OUT_PACKET_SIZE CDC_ECM_DATA_HS_MAX_PACKET_SIZE - -#define CDC_ECM_DATA_FS_IN_PACKET_SIZE CDC_ECM_DATA_FS_MAX_PACKET_SIZE -#define CDC_ECM_DATA_FS_OUT_PACKET_SIZE CDC_ECM_DATA_FS_MAX_PACKET_SIZE - -/*---------------------------------------------------------------------*/ -/* CDC_ECM definitions */ -/*---------------------------------------------------------------------*/ -#define CDC_ECM_SEND_ENCAPSULATED_COMMAND 0x00U -#define CDC_ECM_GET_ENCAPSULATED_RESPONSE 0x01U -#define CDC_ECM_SET_ETH_MULTICAST_FILTERS 0x40U -#define CDC_ECM_SET_ETH_PWRM_PATTERN_FILTER 0x41U -#define CDC_ECM_GET_ETH_PWRM_PATTERN_FILTER 0x42U -#define CDC_ECM_SET_ETH_PACKET_FILTER 0x43U -#define CDC_ECM_GET_ETH_STATISTIC 0x44U - -#define CDC_ECM_NET_DISCONNECTED 0x00U -#define CDC_ECM_NET_CONNECTED 0x01U - - -/* Ethernet statistics definitions */ -#define CDC_ECM_XMIT_OK_VAL CDC_ECM_ETH_STATS_VAL_ENABLED -#define CDC_ECM_XMIT_OK 0x01U -#define CDC_ECM_RVC_OK 0x02U -#define CDC_ECM_XMIT_ERROR 0x04U -#define CDC_ECM_RCV_ERROR 0x08U -#define CDC_ECM_RCV_NO_BUFFER 0x10U -#define CDC_ECM_DIRECTED_BYTES_XMIT 0x20U -#define CDC_ECM_DIRECTED_FRAMES_XMIT 0x40U -#define CDC_ECM_MULTICAST_BYTES_XMIT 0x80U - -#define CDC_ECM_MULTICAST_FRAMES_XMIT 0x01U -#define CDC_ECM_BROADCAST_BYTES_XMIT 0x02U -#define CDC_ECM_BROADCAST_FRAMES_XMIT 0x04U -#define CDC_ECM_DIRECTED_BYTES_RCV 0x08U -#define CDC_ECM_DIRECTED_FRAMES_RCV 0x10U -#define CDC_ECM_MULTICAST_BYTES_RCV 0x20U -#define CDC_ECM_MULTICAST_FRAMES_RCV 0x40U -#define CDC_ECM_BROADCAST_BYTES_RCV 0x80U - -#define CDC_ECM_BROADCAST_FRAMES_RCV 0x01U -#define CDC_ECM_RCV_CRC_ERROR 0x02U -#define CDC_ECM_TRANSMIT_QUEUE_LENGTH 0x04U -#define CDC_ECM_RCV_ERROR_ALIGNMENT 0x08U -#define CDC_ECM_XMIT_ONE_COLLISION 0x10U -#define CDC_ECM_XMIT_MORE_COLLISIONS 0x20U -#define CDC_ECM_XMIT_DEFERRED 0x40U -#define CDC_ECM_XMIT_MAX_COLLISIONS 0x80U - -#define CDC_ECM_RCV_OVERRUN 0x40U -#define CDC_ECM_XMIT_UNDERRUN 0x40U -#define CDC_ECM_XMIT_HEARTBEAT_FAILURE 0x40U -#define CDC_ECM_XMIT_TIMES_CRS_LOST 0x40U -#define CDC_ECM_XMIT_LATE_COLLISIONS 0x40U - -#define CDC_ECM_ETH_STATS_RESERVED 0xE0U -#define CDC_ECM_BMREQUEST_TYPE_ECM 0xA1U - -/* MAC String index */ -#define CDC_ECM_MAC_STRING_INDEX 6U - -/** - * @} - */ - - -/** @defgroup USBD_CORE_Exported_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -typedef struct -{ - int8_t (* Init)(void); - int8_t (* DeInit)(void); - int8_t (* Control)(uint8_t cmd, uint8_t *pbuf, uint16_t length); - int8_t (* Receive)(uint8_t *Buf, uint32_t *Len); - int8_t (* TransmitCplt)(uint8_t *Buf, uint32_t *Len, uint8_t epnum); - int8_t (* Process)(USBD_HandleTypeDef *pdev); - const uint8_t *pStrDesc; -} USBD_CDC_ECM_ItfTypeDef; - -typedef struct -{ - uint8_t bmRequest; - uint8_t bRequest; - uint16_t wValue; - uint16_t wIndex; - uint16_t wLength; - uint8_t data[8]; -} USBD_CDC_ECM_NotifTypeDef; - -/* - * ECM Class specification revision 1.2 - * Table 3: Ethernet Networking Functional Descriptor - */ - -typedef struct -{ - uint8_t bFunctionLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubType; - uint8_t iMacAddress; - uint8_t bEthernetStatistics3; - uint8_t bEthernetStatistics2; - uint8_t bEthernetStatistics1; - uint8_t bEthernetStatistics0; - uint16_t wMaxSegmentSize; - uint16_t bNumberMCFiltes; - uint8_t bNumberPowerFiltes; -} __PACKED USBD_ECMFuncDescTypeDef; - -typedef struct -{ - uint32_t data[CDC_ECM_DATA_BUFFER_SIZE / 4U]; /* Force 32-bit alignment */ - uint8_t CmdOpCode; - uint8_t CmdLength; - uint8_t Reserved1; /* Reserved Byte to force 4 bytes alignment of following fields */ - uint8_t Reserved2; /* Reserved Byte to force 4 bytes alignment of following fields */ - uint8_t *RxBuffer; - uint8_t *TxBuffer; - uint32_t RxLength; - uint32_t TxLength; - - __IO uint32_t TxState; - __IO uint32_t RxState; - - __IO uint32_t MaxPcktLen; - __IO uint32_t LinkStatus; - __IO uint32_t NotificationStatus; - USBD_CDC_ECM_NotifTypeDef Req; -} USBD_CDC_ECM_HandleTypeDef; - - -/** @defgroup USBD_CORE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Exported_Variables - * @{ - */ - -extern USBD_ClassTypeDef USBD_CDC_ECM; -#define USBD_CDC_ECM_CLASS &USBD_CDC_ECM -/** - * @} - */ - -/** @defgroup USB_CORE_Exported_Functions - * @{ - */ -uint8_t USBD_CDC_ECM_RegisterInterface(USBD_HandleTypeDef *pdev, - USBD_CDC_ECM_ItfTypeDef *fops); - -uint8_t USBD_CDC_ECM_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff); - -uint8_t USBD_CDC_ECM_ReceivePacket(USBD_HandleTypeDef *pdev); - -#ifdef USE_USBD_COMPOSITE -uint8_t USBD_CDC_ECM_TransmitPacket(USBD_HandleTypeDef *pdev, uint8_t ClassId); -uint8_t USBD_CDC_ECM_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff, - uint32_t length, uint8_t ClassId); -#else -uint8_t USBD_CDC_ECM_TransmitPacket(USBD_HandleTypeDef *pdev); -uint8_t USBD_CDC_ECM_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff, - uint32_t length); -#endif /* USE_USBD_COMPOSITE */ -uint8_t USBD_CDC_ECM_SendNotification(USBD_HandleTypeDef *pdev, - USBD_CDC_NotifCodeTypeDef Notif, - uint16_t bVal, uint8_t *pData); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_CDC_ECM_H */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/Class/CDC_ECM/Inc/usbd_cdc_ecm_if_template.h b/Class/CDC_ECM/Inc/usbd_cdc_ecm_if_template.h deleted file mode 100644 index c08f0f3..0000000 --- a/Class/CDC_ECM/Inc/usbd_cdc_ecm_if_template.h +++ /dev/null @@ -1,80 +0,0 @@ -/** - ****************************************************************************** - * @file Inc/usbd_cdc_ecm_if_template.h - * @author MCD Application Team - * @brief Header for usbd_cdc_ecm_if_template.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CDC_ECM_IF_H -#define __USBD_CDC_ECM_IF_H - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_cdc_ecm.h" - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* Ensure this MAC address value is same as MAC_ADDRx declared in STM32xxx_conf.h */ -#define CDC_ECM_MAC_STR_DESC (uint8_t *)"000202030000" -#define CDC_ECM_MAC_ADDR0 0x00U /* 01 */ -#define CDC_ECM_MAC_ADDR1 0x02U /* 02 */ -#define CDC_ECM_MAC_ADDR2 0x02U /* 03 */ -#define CDC_ECM_MAC_ADDR3 0x03U /* 00 */ -#define CDC_ECM_MAC_ADDR4 0x00U /* 00 */ -#define CDC_ECM_MAC_ADDR5 0x00U /* 00 */ - -/* Max Number of Trials waiting for Tx ready */ -#define CDC_ECM_MAX_TX_WAIT_TRIALS 1000000U - -#define CDC_ECM_ETH_STATS_BYTE0 0U -/*(uint8_t)(CDC_ECM_XMIT_OK_VAL | CDC_ECM_RVC_OK_VAL | CDC_ECM_XMIT_ERROR_VAL | \ - CDC_ECM_RCV_ERROR_VAL | CDC_ECM_RCV_NO_BUFFER_VAL | CDC_ECM_DIRECTED_BYTES_XMIT_VAL | \ - CDC_ECM_DIRECTED_FRAMES_XMIT_VAL | CDC_ECM_MULTICAST_BYTES_XMIT_VAL) */ - -#define CDC_ECM_ETH_STATS_BYTE1 0U -/*(uint8_t)(CDC_ECM_MULTICAST_FRAMES_XMIT_VAL | CDC_ECM_BROADCAST_BYTES_XMIT_VAL | \ - CDC_ECM_BROADCAST_FRAMES_XMIT_VAL | CDC_ECM_DIRECTED_BYTES_RCV_VAL | \ - CDC_ECM_DIRECTED_FRAMES_RCV_VAL | CDC_ECM_MULTICAST_BYTES_RCV_VAL | \ - CDC_ECM_MULTICAST_FRAMES_RCV_VAL | CDC_ECM_BROADCAST_BYTES_RCV_VAL) */ - -#define CDC_ECM_ETH_STATS_BYTE2 0U -/*(uint8_t)(CDC_ECM_BROADCAST_FRAMES_RCV_VAL | CDC_ECM_RCV_CRC_ERROR_VAL | \ - CDC_ECM_TRANSMIT_QUEUE_LENGTH_VAL | CDC_ECM_RCV_ERROR_ALIGNMENT_VAL | \ - CDC_ECM_XMIT_ONE_COLLISION_VAL | CDC_ECM_XMIT_MORE_COLLISIONS_VAL | \ - CDC_ECM_XMIT_DEFERRED_VAL | CDC_ECM_XMIT_MAX_COLLISIONS_VAL) */ - -#define CDC_ECM_ETH_STATS_BYTE3 0U -/*(uint8_t)(CDC_ECM_RCV_OVERRUN_VAL | CDC_ECM_XMIT_UNDERRUN_VAL | CDC_ECM_XMIT_HEARTBEAT_FAILURE_VAL | \ - CDC_ECM_XMIT_TIMES_CRS_LOST_VAL | CDC_ECM_XMIT_LATE_COLLISIONS_VAL | CDC_ECM_ETH_STATS_RESERVED) */ - -/* Ethernet Maximum Segment size, typically 1514 bytes */ -#define CDC_ECM_ETH_MAX_SEGSZE 1514U - -/* Number of Ethernet multicast filters */ -#define CDC_ECM_ETH_NBR_MACFILTERS 0U - -/* Number of wakeup power filters */ -#define CDC_ECM_ETH_NBR_PWRFILTERS 0U - - -#define CDC_ECM_CONNECT_SPEED_UPSTREAM 0x004C4B40U /* 5Mbps */ -#define CDC_ECM_CONNECT_SPEED_DOWNSTREAM 0x004C4B40U /* 5Mbps */ - -extern USBD_CDC_ECM_ItfTypeDef USBD_CDC_ECM_fops; - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -#endif /* __USBD_CDC_ECM_IF_H */ - diff --git a/Class/CDC_ECM/Src/usbd_cdc_ecm.c b/Class/CDC_ECM/Src/usbd_cdc_ecm.c deleted file mode 100644 index ec63252..0000000 --- a/Class/CDC_ECM/Src/usbd_cdc_ecm.c +++ /dev/null @@ -1,1046 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc_ecm.c - * @author MCD Application Team - * @brief This file provides the high layer firmware functions to manage the - * following functionalities of the USB CDC_ECM Class: - * - Initialization and Configuration of high and low layer - * - Enumeration as CDC_ECM Device (and enumeration for each implemented memory interface) - * - OUT/IN data transfer - * - Command IN transfer (class requests management) - * - Error management - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* BSPDependencies -- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c" -- "stm32xxxxx_{eval}{discovery}_io.c" -EndBSPDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_cdc_ecm.h" -#include "usbd_ctlreq.h" - -#ifndef __USBD_CDC_ECM_IF_H -#include "usbd_cdc_ecm_if_template.h" -#endif /* __USBD_CDC_ECM_IF_H */ - - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_CDC_ECM - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_CDC_ECM_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_CDC_ECM_Private_Defines - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_CDC_ECM_Private_Macros - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_CDC_ECM_Private_FunctionPrototypes - * @{ - */ - -static uint8_t USBD_CDC_ECM_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_CDC_ECM_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_CDC_ECM_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_CDC_ECM_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_CDC_ECM_EP0_RxReady(USBD_HandleTypeDef *pdev); -static uint8_t USBD_CDC_ECM_Setup(USBD_HandleTypeDef *pdev, - USBD_SetupReqTypedef *req); -#ifndef USE_USBD_COMPOSITE -static uint8_t *USBD_CDC_ECM_GetFSCfgDesc(uint16_t *length); -static uint8_t *USBD_CDC_ECM_GetHSCfgDesc(uint16_t *length); -static uint8_t *USBD_CDC_ECM_GetOtherSpeedCfgDesc(uint16_t *length); -static uint8_t *USBD_CDC_ECM_GetOtherSpeedCfgDesc(uint16_t *length); -#endif /* USE_USBD_COMPOSITE */ -#if (USBD_SUPPORT_USER_STRING_DESC == 1U) -static uint8_t *USBD_CDC_ECM_USRStringDescriptor(USBD_HandleTypeDef *pdev, - uint8_t index, uint16_t *length); -#endif /* USBD_SUPPORT_USER_STRING_DESC */ -#ifndef USE_USBD_COMPOSITE -uint8_t *USBD_CDC_ECM_GetDeviceQualifierDescriptor(uint16_t *length); -#endif /* USE_USBD_COMPOSITE */ -#ifndef USE_USBD_COMPOSITE -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_CDC_ECM_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = -{ - USB_LEN_DEV_QUALIFIER_DESC, - USB_DESC_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x01, - 0x00, -}; -#endif /* USE_USBD_COMPOSITE */ -static uint32_t ConnSpeedTab[2] = {CDC_ECM_CONNECT_SPEED_UPSTREAM, - CDC_ECM_CONNECT_SPEED_DOWNSTREAM - }; - -/** - * @} - */ - -/** @defgroup USBD_CDC_ECM_Private_Variables - * @{ - */ - - -/* CDC_ECM interface class callbacks structure */ -USBD_ClassTypeDef USBD_CDC_ECM = -{ - USBD_CDC_ECM_Init, - USBD_CDC_ECM_DeInit, - USBD_CDC_ECM_Setup, - NULL, /* EP0_TxSent, */ - USBD_CDC_ECM_EP0_RxReady, - USBD_CDC_ECM_DataIn, - USBD_CDC_ECM_DataOut, - NULL, - NULL, - NULL, -#ifdef USE_USBD_COMPOSITE - NULL, - NULL, - NULL, - NULL, -#else - USBD_CDC_ECM_GetHSCfgDesc, - USBD_CDC_ECM_GetFSCfgDesc, - USBD_CDC_ECM_GetOtherSpeedCfgDesc, - USBD_CDC_ECM_GetDeviceQualifierDescriptor, -#endif /* USE_USBD_COMPOSITE */ -#if (USBD_SUPPORT_USER_STRING_DESC == 1U) - USBD_CDC_ECM_USRStringDescriptor, -#endif /* USBD_SUPPORT_USER_STRING_DESC */ -}; -#ifndef USE_USBD_COMPOSITE - -/* USB CDC_ECM device Configuration Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_CDC_ECM_CfgDesc[] __ALIGN_END = -{ - /* Configuration Descriptor */ - 0x09, /* bLength: Configuration Descriptor size */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - LOBYTE(CDC_ECM_CONFIG_DESC_SIZ), /* wTotalLength: Total size of the Config descriptor */ - HIBYTE(CDC_ECM_CONFIG_DESC_SIZ), - 0x02, /* bNumInterfaces: 2 interfaces */ - 0x01, /* bConfigurationValue: Configuration value */ - 0x00, /* iConfiguration: Index of string descriptor - describing the configuration */ -#if (USBD_SELF_POWERED == 1U) - 0xC0, /* bmAttributes: Bus Powered according to user configuration */ -#else - 0x80, /* bmAttributes: Bus Powered according to user configuration */ -#endif /* USBD_SELF_POWERED */ - USBD_MAX_POWER, /* MaxPower (mA) */ - - /*---------------------------------------------------------------------------*/ - /* IAD descriptor */ - 0x08, /* bLength */ - 0x0B, /* bDescriptorType */ - 0x00, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - 0x02, /* bFunctionClass (Wireless Controller) */ - 0x06, /* bFunctionSubClass */ - 0x00, /* bFunctionProtocol */ - 0x00, /* iFunction */ - - /* Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - CDC_ECM_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoint used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x06, /* bInterfaceSubClass: Ethernet Control Model */ - 0x00, /* bInterfaceProtocol: No specific protocol required */ - 0x00, /* iInterface */ - - /* Header Functional Descriptor */ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header functional descriptor */ - 0x10, /* bcd CDC_ECM : spec release number: 1.20 */ - 0x01, - - /* Union Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union functional descriptor */ - CDC_ECM_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ - CDC_ECM_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ - - /* CDC_ECM Functional Descriptor */ - 0x0D, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x0F, /* Ethernet Networking functional descriptor subtype */ - CDC_ECM_MAC_STRING_INDEX, /* Device's MAC string index */ - CDC_ECM_ETH_STATS_BYTE3, /* Ethernet statistics byte 3 (bitmap) */ - CDC_ECM_ETH_STATS_BYTE2, /* Ethernet statistics byte 2 (bitmap) */ - CDC_ECM_ETH_STATS_BYTE1, /* Ethernet statistics byte 1 (bitmap) */ - CDC_ECM_ETH_STATS_BYTE0, /* Ethernet statistics byte 0 (bitmap) */ - LOBYTE(CDC_ECM_ETH_MAX_SEGSZE), - HIBYTE(CDC_ECM_ETH_MAX_SEGSZE), /* wMaxSegmentSize: Ethernet Maximum Segment size, typically 1514 bytes */ - LOBYTE(CDC_ECM_ETH_NBR_MACFILTERS), - HIBYTE(CDC_ECM_ETH_NBR_MACFILTERS), /* wNumberMCFilters: the number of multicast filters */ - CDC_ECM_ETH_NBR_PWRFILTERS, /* bNumberPowerFilters: the number of wakeup power filters */ - - - /* Communication Endpoint Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_ECM_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_ECM_CMD_PACKET_SIZE), /* wMaxPacketSize */ - HIBYTE(CDC_ECM_CMD_PACKET_SIZE), - CDC_ECM_FS_BINTERVAL, /* bInterval */ - - /*----------------------*/ - - /* Data class interface descriptor */ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - CDC_ECM_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC_ECM */ - 0x00, /* bInterfaceSubClass */ - 0x00, /* bInterfaceProtocol */ - 0x00, /* iInterface */ - - /* Endpoint OUT Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_ECM_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_ECM_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize */ - HIBYTE(CDC_ECM_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval */ - - /* Endpoint IN Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_ECM_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_ECM_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize */ - HIBYTE(CDC_ECM_DATA_FS_MAX_PACKET_SIZE), - 0x00 /* bInterval */ -} ; -#endif /* USE_USBD_COMPOSITE */ - -static uint8_t ECMInEpAdd = CDC_ECM_IN_EP; -static uint8_t ECMOutEpAdd = CDC_ECM_OUT_EP; -static uint8_t ECMCmdEpAdd = CDC_ECM_CMD_EP; - -/** - * @} - */ - -/** @defgroup USBD_CDC_ECM_Private_Functions - * @{ - */ - -/** - * @brief USBD_CDC_ECM_Init - * Initialize the CDC_ECM interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_CDC_ECM_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - - USBD_CDC_ECM_HandleTypeDef *hcdc; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - ECMInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - ECMOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - ECMCmdEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - hcdc = (USBD_CDC_ECM_HandleTypeDef *)USBD_malloc(sizeof(USBD_CDC_ECM_HandleTypeDef)); - - if (hcdc == NULL) - { - pdev->pClassDataCmsit[pdev->classId] = NULL; - return (uint8_t)USBD_EMEM; - } - - (void)USBD_memset(hcdc, 0, sizeof(USBD_CDC_ECM_HandleTypeDef)); - - pdev->pClassDataCmsit[pdev->classId] = (void *)hcdc; - pdev->pClassData = pdev->pClassDataCmsit[pdev->classId]; - - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - /* Open EP IN */ - (void)USBD_LL_OpenEP(pdev, ECMInEpAdd, USBD_EP_TYPE_BULK, - CDC_ECM_DATA_HS_IN_PACKET_SIZE); - - pdev->ep_in[ECMInEpAdd & 0xFU].is_used = 1U; - - /* Open EP OUT */ - (void)USBD_LL_OpenEP(pdev, ECMOutEpAdd, USBD_EP_TYPE_BULK, - CDC_ECM_DATA_HS_OUT_PACKET_SIZE); - - pdev->ep_out[ECMOutEpAdd & 0xFU].is_used = 1U; - - /* Set bInterval for CDC ECM CMD Endpoint */ - pdev->ep_in[ECMCmdEpAdd & 0xFU].bInterval = CDC_ECM_HS_BINTERVAL; - } - else - { - /* Open EP IN */ - (void)USBD_LL_OpenEP(pdev, ECMInEpAdd, USBD_EP_TYPE_BULK, - CDC_ECM_DATA_FS_IN_PACKET_SIZE); - - pdev->ep_in[ECMInEpAdd & 0xFU].is_used = 1U; - - /* Open EP OUT */ - (void)USBD_LL_OpenEP(pdev, ECMOutEpAdd, USBD_EP_TYPE_BULK, - CDC_ECM_DATA_FS_OUT_PACKET_SIZE); - - pdev->ep_out[ECMOutEpAdd & 0xFU].is_used = 1U; - - /* Set bInterval for CDC ECM CMD Endpoint */ - pdev->ep_in[ECMCmdEpAdd & 0xFU].bInterval = CDC_ECM_FS_BINTERVAL; - } - - /* Open Command IN EP */ - (void)USBD_LL_OpenEP(pdev, ECMCmdEpAdd, USBD_EP_TYPE_INTR, CDC_ECM_CMD_PACKET_SIZE); - pdev->ep_in[ECMCmdEpAdd & 0xFU].is_used = 1U; - - hcdc->RxBuffer = NULL; - - /* Init physical Interface components */ - ((USBD_CDC_ECM_ItfTypeDef *)pdev->pUserData[pdev->classId])->Init(); - - /* Init Xfer states */ - hcdc->TxState = 0U; - hcdc->RxState = 0U; - hcdc->RxLength = 0U; - hcdc->TxLength = 0U; - hcdc->LinkStatus = 0U; - hcdc->NotificationStatus = 0U; - hcdc->MaxPcktLen = (pdev->dev_speed == USBD_SPEED_HIGH) ? CDC_ECM_DATA_HS_MAX_PACKET_SIZE : \ - CDC_ECM_DATA_FS_MAX_PACKET_SIZE; - - if (hcdc->RxBuffer == NULL) - { - return (uint8_t)USBD_EMEM; - } - - /* Prepare Out endpoint to receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, ECMOutEpAdd, hcdc->RxBuffer, hcdc->MaxPcktLen); - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CDC_ECM_DeInit - * DeInitialize the CDC_ECM layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_CDC_ECM_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - ECMInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - ECMOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - ECMCmdEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Close EP IN */ - (void)USBD_LL_CloseEP(pdev, ECMInEpAdd); - pdev->ep_in[ECMInEpAdd & 0xFU].is_used = 0U; - - /* Close EP OUT */ - (void)USBD_LL_CloseEP(pdev, ECMOutEpAdd); - pdev->ep_out[ECMOutEpAdd & 0xFU].is_used = 0U; - - /* Close Command IN EP */ - (void)USBD_LL_CloseEP(pdev, ECMCmdEpAdd); - pdev->ep_in[ECMCmdEpAdd & 0xFU].is_used = 0U; - pdev->ep_in[ECMCmdEpAdd & 0xFU].bInterval = 0U; - - /* DeInit physical Interface components */ - if (pdev->pClassDataCmsit[pdev->classId] != NULL) - { - ((USBD_CDC_ECM_ItfTypeDef *)pdev->pUserData[pdev->classId])->DeInit(); - USBD_free(pdev->pClassDataCmsit[pdev->classId]); - pdev->pClassDataCmsit[pdev->classId] = NULL; - pdev->pClassData = NULL; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CDC_ECM_Setup - * Handle the CDC_ECM specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t USBD_CDC_ECM_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_CDC_ECM_HandleTypeDef *hcdc = (USBD_CDC_ECM_HandleTypeDef *) pdev->pClassDataCmsit[pdev->classId]; - USBD_CDC_ECM_ItfTypeDef *EcmInterface = (USBD_CDC_ECM_ItfTypeDef *)pdev->pUserData[pdev->classId]; - USBD_StatusTypeDef ret = USBD_OK; - uint16_t len; - uint16_t status_info = 0U; - uint8_t ifalt = 0U; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS : - if (req->wLength != 0U) - { - if ((req->bmRequest & 0x80U) != 0U) - { - EcmInterface->Control(req->bRequest, (uint8_t *)hcdc->data, req->wLength); - - len = MIN(CDC_ECM_DATA_BUFFER_SIZE, req->wLength); - (void)USBD_CtlSendData(pdev, (uint8_t *)hcdc->data, len); - } - else - { - hcdc->CmdOpCode = req->bRequest; - hcdc->CmdLength = (uint8_t)MIN(req->wLength, USB_MAX_EP0_SIZE); - - (void)USBD_CtlPrepareRx(pdev, (uint8_t *)hcdc->data, hcdc->CmdLength); - } - } - else - { - EcmInterface->Control(req->bRequest, (uint8_t *)req, 0U); - } - break; - - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_STATUS: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, (uint8_t *)&status_info, 2U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_GET_INTERFACE: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, &ifalt, 1U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_SET_INTERFACE: - if (pdev->dev_state != USBD_STATE_CONFIGURED) - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_CLEAR_FEATURE: - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - - return (uint8_t)ret; -} - -/** - * @brief USBD_CDC_ECM_DataIn - * Data sent on non-control IN endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t USBD_CDC_ECM_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - USBD_CDC_ECM_HandleTypeDef *hcdc = (USBD_CDC_ECM_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - PCD_HandleTypeDef *hpcd = (PCD_HandleTypeDef *)pdev->pData; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - ECMInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (pdev->pClassDataCmsit[pdev->classId] == NULL) - { - return (uint8_t)USBD_FAIL; - } - - if (epnum == (ECMInEpAdd & 0x7FU)) - { - if ((pdev->ep_in[epnum & 0xFU].total_length > 0U) && - ((pdev->ep_in[epnum & 0xFU].total_length % hpcd->IN_ep[epnum & 0xFU].maxpacket) == 0U)) - { - /* Update the packet total length */ - pdev->ep_in[epnum & 0xFU].total_length = 0U; - - /* Send ZLP */ - (void)USBD_LL_Transmit(pdev, epnum, NULL, 0U); - } - else - { - hcdc->TxState = 0U; - if (((USBD_CDC_ECM_ItfTypeDef *)pdev->pUserData[pdev->classId])->TransmitCplt != NULL) - { - ((USBD_CDC_ECM_ItfTypeDef *)pdev->pUserData[pdev->classId])->TransmitCplt(hcdc->TxBuffer, - &hcdc->TxLength, epnum); - } - } - } - else if (epnum == (ECMCmdEpAdd & 0x7FU)) - { - if (hcdc->NotificationStatus != 0U) - { - (void)USBD_CDC_ECM_SendNotification(pdev, CONNECTION_SPEED_CHANGE, 0U, (uint8_t *)ConnSpeedTab); - - hcdc->NotificationStatus = 0U; - } - } - else - { - return (uint8_t)USBD_FAIL; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CDC_ECM_DataOut - * Data received on non-control Out endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t USBD_CDC_ECM_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - USBD_CDC_ECM_HandleTypeDef *hcdc = (USBD_CDC_ECM_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint32_t CurrPcktLen; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - ECMOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (pdev->pClassDataCmsit[pdev->classId] == NULL) - { - return (uint8_t)USBD_FAIL; - } - - if (epnum == ECMOutEpAdd) - { - /* Get the received data length */ - CurrPcktLen = USBD_LL_GetRxDataSize(pdev, epnum); - - /* Increment the frame length */ - hcdc->RxLength += CurrPcktLen; - - /* If the buffer size is less than max packet size: it is the last packet in current frame */ - if ((CurrPcktLen < hcdc->MaxPcktLen) || (hcdc->RxLength >= CDC_ECM_ETH_MAX_SEGSZE)) - { - /* USB data will be immediately processed, this allow next USB traffic being - NAKed till the end of the application Xfer */ - - /* Process data by application (ie. copy to app buffer or notify user) - hcdc->RxLength must be reset to zero at the end of the call of this function */ - ((USBD_CDC_ECM_ItfTypeDef *)pdev->pUserData[pdev->classId])->Receive(hcdc->RxBuffer, &hcdc->RxLength); - } - else - { - /* Prepare Out endpoint to receive next packet in current/new frame */ - (void)USBD_LL_PrepareReceive(pdev, ECMOutEpAdd, - (uint8_t *)(hcdc->RxBuffer + hcdc->RxLength), - hcdc->MaxPcktLen); - } - } - else - { - return (uint8_t)USBD_FAIL; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CDC_ECM_EP0_RxReady - * Handle EP0 Rx Ready event - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_CDC_ECM_EP0_RxReady(USBD_HandleTypeDef *pdev) -{ - USBD_CDC_ECM_HandleTypeDef *hcdc = (USBD_CDC_ECM_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - if ((pdev->pUserData[pdev->classId] != NULL) && (hcdc->CmdOpCode != 0xFFU)) - { - ((USBD_CDC_ECM_ItfTypeDef *)pdev->pUserData[pdev->classId])->Control(hcdc->CmdOpCode, - (uint8_t *)hcdc->data, - (uint16_t)hcdc->CmdLength); - hcdc->CmdOpCode = 0xFFU; - - } - return (uint8_t)USBD_OK; -} -#ifndef USE_USBD_COMPOSITE -/** - * @brief USBD_CDC_ECM_GetFSCfgDesc - * Return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CDC_ECM_GetFSCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CDC_ECM_CfgDesc, CDC_ECM_CMD_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CDC_ECM_CfgDesc, CDC_ECM_OUT_EP); - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CDC_ECM_CfgDesc, CDC_ECM_IN_EP); - - if (pEpCmdDesc != NULL) - { - pEpCmdDesc->bInterval = CDC_ECM_FS_BINTERVAL; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = CDC_ECM_DATA_FS_MAX_PACKET_SIZE; - } - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = CDC_ECM_DATA_FS_MAX_PACKET_SIZE; - } - - *length = (uint16_t) sizeof(USBD_CDC_ECM_CfgDesc); - return USBD_CDC_ECM_CfgDesc; -} - -/** - * @brief USBD_CDC_ECM_GetHSCfgDesc - * Return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CDC_ECM_GetHSCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CDC_ECM_CfgDesc, CDC_ECM_CMD_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CDC_ECM_CfgDesc, CDC_ECM_OUT_EP); - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CDC_ECM_CfgDesc, CDC_ECM_IN_EP); - - if (pEpCmdDesc != NULL) - { - pEpCmdDesc->bInterval = CDC_ECM_HS_BINTERVAL; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = CDC_ECM_DATA_HS_MAX_PACKET_SIZE; - } - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = CDC_ECM_DATA_HS_MAX_PACKET_SIZE; - } - - *length = (uint16_t) sizeof(USBD_CDC_ECM_CfgDesc); - return USBD_CDC_ECM_CfgDesc; -} - -/** - * @brief USBD_CDC_ECM_GetCfgDesc - * Return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CDC_ECM_GetOtherSpeedCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CDC_ECM_CfgDesc, CDC_ECM_CMD_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CDC_ECM_CfgDesc, CDC_ECM_OUT_EP); - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CDC_ECM_CfgDesc, CDC_ECM_IN_EP); - - if (pEpCmdDesc != NULL) - { - pEpCmdDesc->bInterval = CDC_ECM_FS_BINTERVAL; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = CDC_ECM_DATA_FS_MAX_PACKET_SIZE; - } - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = CDC_ECM_DATA_FS_MAX_PACKET_SIZE; - } - - *length = (uint16_t) sizeof(USBD_CDC_ECM_CfgDesc); - return USBD_CDC_ECM_CfgDesc; -} - -/** - * @brief DeviceQualifierDescriptor - * return Device Qualifier descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -uint8_t *USBD_CDC_ECM_GetDeviceQualifierDescriptor(uint16_t *length) -{ - *length = (uint16_t)sizeof(USBD_CDC_ECM_DeviceQualifierDesc); - - return USBD_CDC_ECM_DeviceQualifierDesc; -} -#endif /* USE_USBD_COMPOSITE */ -/** - * @brief USBD_CDC_ECM_RegisterInterface - * @param pdev: device instance - * @param fops: CD Interface callback - * @retval status - */ -uint8_t USBD_CDC_ECM_RegisterInterface(USBD_HandleTypeDef *pdev, - USBD_CDC_ECM_ItfTypeDef *fops) -{ - if (fops == NULL) - { - return (uint8_t)USBD_FAIL; - } - - pdev->pUserData[pdev->classId] = fops; - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CDC_ECM_USRStringDescriptor - * Manages the transfer of user string descriptors. - * @param pdev: device instance - * @param index: descriptor index - * @param length : pointer data length - * @retval pointer to the descriptor table or NULL if the descriptor is not supported. - */ -#if (USBD_SUPPORT_USER_STRING_DESC == 1U) -static uint8_t *USBD_CDC_ECM_USRStringDescriptor(USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length) -{ - static uint8_t USBD_StrDesc[255]; - - /* Check if the requested string interface is supported */ - if (index == CDC_ECM_MAC_STRING_INDEX) - { - USBD_GetString((uint8_t *)((USBD_CDC_ECM_ItfTypeDef *)pdev->pUserData[pdev->classId])->pStrDesc, - USBD_StrDesc, - length); - - return USBD_StrDesc; - } - /* Not supported Interface Descriptor index */ - else - { - return NULL; - } -} -#endif /* USBD_SUPPORT_USER_STRING_DESC */ - -/** - * @brief USBD_CDC_ECM_SetTxBuffer - * @param pdev: device instance - * @param pbuff: Tx Buffer - * @param length: Tx Buffer length - * @param ClassId: The Class ID - * @retval status - */ -#ifdef USE_USBD_COMPOSITE -uint8_t USBD_CDC_ECM_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff, uint32_t length, uint8_t ClassId) -{ - USBD_CDC_ECM_HandleTypeDef *hcdc = (USBD_CDC_ECM_HandleTypeDef *)pdev->pClassDataCmsit[ClassId]; -#else -uint8_t USBD_CDC_ECM_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff, uint32_t length) -{ - USBD_CDC_ECM_HandleTypeDef *hcdc = (USBD_CDC_ECM_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; -#endif /* USE_USBD_COMPOSITE */ - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - hcdc->TxBuffer = pbuff; - hcdc->TxLength = length; - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CDC_ECM_SetRxBuffer - * @param pdev: device instance - * @param pbuff: Rx Buffer - * @retval status - */ -uint8_t USBD_CDC_ECM_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff) -{ - USBD_CDC_ECM_HandleTypeDef *hcdc = (USBD_CDC_ECM_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - hcdc->RxBuffer = pbuff; - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CDC_ECM_TransmitPacket - * Transmit packet on IN endpoint - * @param pdev: device instance - * @param ClassId: The Class ID - * @retval status - */ -#ifdef USE_USBD_COMPOSITE -uint8_t USBD_CDC_ECM_TransmitPacket(USBD_HandleTypeDef *pdev, uint8_t ClassId) -{ - USBD_CDC_ECM_HandleTypeDef *hcdc = (USBD_CDC_ECM_HandleTypeDef *)pdev->pClassDataCmsit[ClassId]; -#else -uint8_t USBD_CDC_ECM_TransmitPacket(USBD_HandleTypeDef *pdev) -{ - USBD_CDC_ECM_HandleTypeDef *hcdc = (USBD_CDC_ECM_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; -#endif /* USE_USBD_COMPOSITE */ - - USBD_StatusTypeDef ret = USBD_BUSY; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - ECMInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, ClassId); -#endif /* USE_USBD_COMPOSITE */ - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - if (hcdc->TxState == 0U) - { - /* Tx Transfer in progress */ - hcdc->TxState = 1U; - - /* Update the packet total length */ - pdev->ep_in[ECMInEpAdd & 0xFU].total_length = hcdc->TxLength; - - /* Transmit next packet */ - (void)USBD_LL_Transmit(pdev, ECMInEpAdd, hcdc->TxBuffer, hcdc->TxLength); - - ret = USBD_OK; - } - - return (uint8_t)ret; -} - - -/** - * @brief USBD_CDC_ECM_ReceivePacket - * prepare OUT Endpoint for reception - * @param pdev: device instance - * @retval status - */ -uint8_t USBD_CDC_ECM_ReceivePacket(USBD_HandleTypeDef *pdev) -{ - USBD_CDC_ECM_HandleTypeDef *hcdc = (USBD_CDC_ECM_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - ECMOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (pdev->pClassDataCmsit[pdev->classId] == NULL) - { - return (uint8_t)USBD_FAIL; - } - - /* Prepare Out endpoint to receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, ECMOutEpAdd, hcdc->RxBuffer, hcdc->MaxPcktLen); - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CDC_ECM_SendNotification - * Transmit Notification packet on CMD IN interrupt endpoint - * @param pdev: device instance - * Notif: value of the notification type (from CDC_ECM_Notification_TypeDef enumeration list) - * bVal: value of the notification switch (ie. 0x00 or 0x01 for Network Connection notification) - * pData: pointer to data buffer (ie. upstream and downstream connection speed values) - * @retval status - */ -uint8_t USBD_CDC_ECM_SendNotification(USBD_HandleTypeDef *pdev, - USBD_CDC_NotifCodeTypeDef Notif, - uint16_t bVal, uint8_t *pData) -{ - uint32_t Idx; - uint32_t ReqSize = 0U; - USBD_CDC_ECM_HandleTypeDef *hcdc = (USBD_CDC_ECM_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_StatusTypeDef ret = USBD_OK; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - ECMCmdEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Initialize the request fields */ - (hcdc->Req).bmRequest = CDC_ECM_BMREQUEST_TYPE_ECM; - (hcdc->Req).bRequest = (uint8_t)Notif; - - switch ((hcdc->Req).bRequest) - { - case NETWORK_CONNECTION: - (hcdc->Req).wValue = bVal; - (hcdc->Req).wIndex = CDC_ECM_CMD_ITF_NBR; - (hcdc->Req).wLength = 0U; - - for (Idx = 0U; Idx < 8U; Idx++) - { - (hcdc->Req).data[Idx] = 0U; - } - ReqSize = 8U; - break; - - case RESPONSE_AVAILABLE: - (hcdc->Req).wValue = 0U; - (hcdc->Req).wIndex = CDC_ECM_CMD_ITF_NBR; - (hcdc->Req).wLength = 0U; - for (Idx = 0U; Idx < 8U; Idx++) - { - (hcdc->Req).data[Idx] = 0U; - } - ReqSize = 8U; - break; - - case CONNECTION_SPEED_CHANGE: - (hcdc->Req).wValue = 0U; - (hcdc->Req).wIndex = CDC_ECM_CMD_ITF_NBR; - (hcdc->Req).wLength = 0x0008U; - ReqSize = 16U; - - /* Check pointer to data buffer */ - if (pData != NULL) - { - for (Idx = 0U; Idx < 8U; Idx++) - { - (hcdc->Req).data[Idx] = pData[Idx]; - } - } - break; - - default: - ret = USBD_FAIL; - break; - } - - /* Transmit notification packet */ - if (ReqSize != 0U) - { - (void)USBD_LL_Transmit(pdev, ECMCmdEpAdd, (uint8_t *)&hcdc->Req, ReqSize); - } - - return (uint8_t)ret; -} - - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/Class/CDC_ECM/Src/usbd_cdc_ecm_if_template.c b/Class/CDC_ECM/Src/usbd_cdc_ecm_if_template.c deleted file mode 100644 index ebe2d0b..0000000 --- a/Class/CDC_ECM/Src/usbd_cdc_ecm_if_template.c +++ /dev/null @@ -1,274 +0,0 @@ -/** - ****************************************************************************** - * @file Src/usbd_cdc_ecm_if_template.c - * @author MCD Application Team - * @brief Source file for USBD CDC_ECM interface - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ - -#include "usbd_cdc_ecm_if_template.h" -/* - - Include here LwIP files if used - -*/ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Received Data over USB are stored in this buffer */ -#if defined ( __ICCARM__ ) /*!< IAR Compiler */ -#pragma data_alignment=4 -#endif /* ( __ICCARM__ ) */ -__ALIGN_BEGIN static uint8_t UserRxBuffer[CDC_ECM_ETH_MAX_SEGSZE + 100]__ALIGN_END; - -/* Transmitted Data over CDC_ECM (CDC_ECM interface) are stored in this buffer */ -#if defined ( __ICCARM__ ) /*!< IAR Compiler */ -#pragma data_alignment=4 -#endif /* ( __ICCARM__ ) */ -__ALIGN_BEGIN static uint8_t UserTxBuffer[CDC_ECM_ETH_MAX_SEGSZE + 100]__ALIGN_END; - -static uint8_t CDC_ECMInitialized = 0U; - -/* USB handler declaration */ -extern USBD_HandleTypeDef USBD_Device; - -/* Private function prototypes -----------------------------------------------*/ -static int8_t CDC_ECM_Itf_Init(void); -static int8_t CDC_ECM_Itf_DeInit(void); -static int8_t CDC_ECM_Itf_Control(uint8_t cmd, uint8_t *pbuf, uint16_t length); -static int8_t CDC_ECM_Itf_Receive(uint8_t *pbuf, uint32_t *Len); -static int8_t CDC_ECM_Itf_TransmitCplt(uint8_t *pbuf, uint32_t *Len, uint8_t epnum); -static int8_t CDC_ECM_Itf_Process(USBD_HandleTypeDef *pdev); - -USBD_CDC_ECM_ItfTypeDef USBD_CDC_ECM_fops = -{ - CDC_ECM_Itf_Init, - CDC_ECM_Itf_DeInit, - CDC_ECM_Itf_Control, - CDC_ECM_Itf_Receive, - CDC_ECM_Itf_TransmitCplt, - CDC_ECM_Itf_Process, - (uint8_t *)CDC_ECM_MAC_STR_DESC, -}; - -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief CDC_ECM_Itf_Init - * Initializes the CDC_ECM media low layer - * @param None - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t CDC_ECM_Itf_Init(void) -{ - if (CDC_ECMInitialized == 0U) - { - /* - Initialize the TCP/IP stack here - */ - - CDC_ECMInitialized = 1U; - } - - /* Set Application Buffers */ -#ifdef USE_USBD_COMPOSITE - (void)USBD_CDC_ECM_SetTxBuffer(&USBD_Device, UserTxBuffer, 0U, 0U); -#else - (void)USBD_CDC_ECM_SetTxBuffer(&USBD_Device, UserTxBuffer, 0U); -#endif /* USE_USBD_COMPOSITE */ - (void)USBD_CDC_ECM_SetRxBuffer(&USBD_Device, UserRxBuffer); - - return (0); -} - -/** - * @brief CDC_ECM_Itf_DeInit - * DeInitializes the CDC_ECM media low layer - * @param None - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t CDC_ECM_Itf_DeInit(void) -{ -#ifdef USE_USBD_COMPOSITE - USBD_CDC_ECM_HandleTypeDef *hcdc_cdc_ecm = (USBD_CDC_ECM_HandleTypeDef *) \ - (USBD_Device.pClassDataCmsit[USBD_Device.classId]); -#else - USBD_CDC_ECM_HandleTypeDef *hcdc_cdc_ecm = (USBD_CDC_ECM_HandleTypeDef *)(USBD_Device.pClassData); -#endif /* USE_USBD_COMPOSITE */ - - /* Notify application layer that link is down */ - hcdc_cdc_ecm->LinkStatus = 0U; - - return (0); -} - -/** - * @brief CDC_ECM_Itf_Control - * Manage the CDC_ECM class requests - * @param Cmd: Command code - * @param Buf: Buffer containing command data (request parameters) - * @param Len: Number of data to be sent (in bytes) - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t CDC_ECM_Itf_Control(uint8_t cmd, uint8_t *pbuf, uint16_t length) -{ -#ifdef USE_USBD_COMPOSITE - USBD_CDC_ECM_HandleTypeDef *hcdc_cdc_ecm = (USBD_CDC_ECM_HandleTypeDef *) \ - (USBD_Device.pClassDataCmsit[USBD_Device.classId]); -#else - USBD_CDC_ECM_HandleTypeDef *hcdc_cdc_ecm = (USBD_CDC_ECM_HandleTypeDef *)(USBD_Device.pClassData); -#endif /* USE_USBD_COMPOSITE */ - - switch (cmd) - { - case CDC_ECM_SEND_ENCAPSULATED_COMMAND: - /* Add your code here */ - break; - - case CDC_ECM_GET_ENCAPSULATED_RESPONSE: - /* Add your code here */ - break; - - case CDC_ECM_SET_ETH_MULTICAST_FILTERS: - /* Add your code here */ - break; - - case CDC_ECM_SET_ETH_PWRM_PATTERN_FILTER: - /* Add your code here */ - break; - - case CDC_ECM_GET_ETH_PWRM_PATTERN_FILTER: - /* Add your code here */ - break; - - case CDC_ECM_SET_ETH_PACKET_FILTER: - /* Check if this is the first time we enter */ - if (hcdc_cdc_ecm->LinkStatus == 0U) - { - /* - Setup the Link up at TCP/IP level - */ - hcdc_cdc_ecm->LinkStatus = 1U; - - /* Modification for MacOS which doesn't send SetInterface before receiving INs */ - if (hcdc_cdc_ecm->NotificationStatus == 0U) - { - /* Send notification: NETWORK_CONNECTION Event */ - (void)USBD_CDC_ECM_SendNotification(&USBD_Device, NETWORK_CONNECTION, - CDC_ECM_NET_CONNECTED, NULL); - - /* Prepare for sending Connection Speed Change notification */ - hcdc_cdc_ecm->NotificationStatus = 1U; - } - } - /* Add your code here */ - break; - - case CDC_ECM_GET_ETH_STATISTIC: - /* Add your code here */ - break; - - default: - break; - } - UNUSED(length); - UNUSED(pbuf); - - return (0); -} - -/** - * @brief CDC_ECM_Itf_Receive - * Data received over USB OUT endpoint are sent over CDC_ECM interface - * through this function. - * @param Buf: Buffer of data to be transmitted - * @param Len: Number of data received (in bytes) - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t CDC_ECM_Itf_Receive(uint8_t *Buf, uint32_t *Len) -{ - /* Get the CDC_ECM handler pointer */ -#ifdef USE_USBD_COMPOSITE - USBD_CDC_ECM_HandleTypeDef *hcdc_cdc_ecm = (USBD_CDC_ECM_HandleTypeDef *) \ - (USBD_Device.pClassDataCmsit[USBD_Device.classId]); -#else - USBD_CDC_ECM_HandleTypeDef *hcdc_cdc_ecm = (USBD_CDC_ECM_HandleTypeDef *)(USBD_Device.pClassData); -#endif /* USE_USBD_COMPOSITE */ - - /* Call Eth buffer processing */ - hcdc_cdc_ecm->RxState = 1U; - - UNUSED(Len); - UNUSED(Buf); - - return (0); -} - -/** - * @brief CDC_ECM_Itf_TransmitCplt - * Data transmitted callback - * - * @note - * This function is IN transfer complete callback used to inform user that - * the submitted Data is successfully sent over USB. - * - * @param Buf: Buffer of data to be received - * @param Len: Number of data received (in bytes) - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t CDC_ECM_Itf_TransmitCplt(uint8_t *Buf, uint32_t *Len, uint8_t epnum) -{ - UNUSED(Buf); - UNUSED(Len); - UNUSED(epnum); - - return (0); -} - -/** - * @brief CDC_ECM_Itf_Process - * Data received over USB OUT endpoint are sent over CDC_ECM interface - * through this function. - * @param pdef: pointer to the USB Device Handle - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t CDC_ECM_Itf_Process(USBD_HandleTypeDef *pdev) -{ - /* Get the CDC_ECM handler pointer */ -#ifdef USE_USBD_COMPOSITE - USBD_CDC_ECM_HandleTypeDef *hcdc_cdc_ecm = (USBD_CDC_ECM_HandleTypeDef *)(pdev->pClassDataCmsit[pdev->classId]); -#else - USBD_CDC_ECM_HandleTypeDef *hcdc_cdc_ecm = (USBD_CDC_ECM_HandleTypeDef *)(pdev->pClassData); -#endif /* USE_USBD_COMPOSITE */ - - if (hcdc_cdc_ecm == NULL) - { - return (-1); - } - - if (hcdc_cdc_ecm->LinkStatus != 0U) - { - /* - Read a received packet from the Ethernet buffers and send it - to the lwIP for handling - Call here the TCP/IP background tasks. - */ - } - - return (0); -} - diff --git a/Class/CDC_RNDIS/Inc/usbd_cdc_rndis.h b/Class/CDC_RNDIS/Inc/usbd_cdc_rndis.h deleted file mode 100644 index 3a262c3..0000000 --- a/Class/CDC_RNDIS/Inc/usbd_cdc_rndis.h +++ /dev/null @@ -1,529 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc_rndis.h - * @author MCD Application Team - * @brief header file for the usbd_cdc_rndis.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_CDC_RNDIS_H -#define __USB_CDC_RNDIS_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup usbd_cdc_rndis - * @brief This file is the Header file for usbd_cdc_rndis.c - * @{ - */ - - -/** @defgroup usbd_cdc_rndis_Exported_Defines - * @{ - */ -#ifndef CDC_RNDIS_IN_EP -#define CDC_RNDIS_IN_EP 0x81U /* EP1 for data IN */ -#endif /* CDC_RNDIS_IN_EP */ -#ifndef CDC_RNDIS_OUT_EP -#define CDC_RNDIS_OUT_EP 0x01U /* EP1 for data OUT */ -#endif /* CDC_RNDIS_OUT_EP */ -#ifndef CDC_RNDIS_CMD_EP -#define CDC_RNDIS_CMD_EP 0x82U /* EP2 for CDC_RNDIS commands */ -#endif /* CDC_RNDIS_CMD_EP */ - -#ifndef CDC_RNDIS_CMD_ITF_NBR -#define CDC_RNDIS_CMD_ITF_NBR 0x00U /* Command Interface Number 0 */ -#endif /* CDC_RNDIS_CMD_ITF_NBR */ - -#ifndef CDC_RNDIS_COM_ITF_NBR -#define CDC_RNDIS_COM_ITF_NBR 0x01U /* Communication Interface Number 0 */ -#endif /* CDC_RNDIS_CMD_ITF_NBR */ - -#ifndef CDC_RNDIS_HS_BINTERVAL -#define CDC_RNDIS_HS_BINTERVAL 0x10U -#endif /* CDC_RNDIS_HS_BINTERVAL */ - -#ifndef CDC_RNDIS_FS_BINTERVAL -#define CDC_RNDIS_FS_BINTERVAL 0x10U -#endif /* CDC_RNDIS_FS_BINTERVAL */ - -#ifndef CDC_RNDIS_CMD_PACKET_SIZE -#define CDC_RNDIS_CMD_PACKET_SIZE 16U /* Control Endpoint Packet size */ -#endif /* CDC_RNDIS_CMD_PACKET_SIZE */ - -/* CDC_RNDIS Endpoints parameters: you can fine tune these values - depending on the needed baudrates and performance. */ -#define CDC_RNDIS_DATA_HS_MAX_PACKET_SIZE 512U /* Endpoint IN & OUT Packet size */ -#define CDC_RNDIS_DATA_FS_MAX_PACKET_SIZE 64U /* Endpoint IN & OUT Packet size */ - -#define CDC_RNDIS_CONFIG_DESC_SIZ 75U -#define CDC_RNDIS_DATA_HS_IN_PACKET_SIZE CDC_RNDIS_DATA_HS_MAX_PACKET_SIZE -#define CDC_RNDIS_DATA_HS_OUT_PACKET_SIZE CDC_RNDIS_DATA_HS_MAX_PACKET_SIZE - -#define CDC_RNDIS_DATA_FS_IN_PACKET_SIZE CDC_RNDIS_DATA_FS_MAX_PACKET_SIZE -#define CDC_RNDIS_DATA_FS_OUT_PACKET_SIZE CDC_RNDIS_DATA_FS_MAX_PACKET_SIZE - -/*---------------------------------------------------------------------*/ -/* CDC_RNDIS definitions */ -/*---------------------------------------------------------------------*/ - -/** Implemented CDC_RNDIS Version Major */ -#define CDC_RNDIS_VERSION_MAJOR 0x01U - -/* Implemented CDC_RNDIS Version Minor */ -#define CDC_RNDIS_VERSION_MINOR 0x00U - -/* Maximum size in bytes of a CDC_RNDIS control message - which can be sent or received */ -#define CDC_RNDIS_MESSAGE_BUFFER_SIZE 128U - -/* Maximum size in bytes of an Ethernet frame - according to the Ethernet standard */ -#define CDC_RNDIS_ETH_FRAME_SIZE_MAX 1536U - -/* Maximum size allocated for buffer - inside Query messages structures */ -#define CDC_RNDIS_MAX_INFO_BUFF_SZ 200U -#define CDC_RNDIS_MAX_DATA_SZE 2000U - -/* Notification request value for a CDC_RNDIS - Response Available notification */ -#define CDC_RNDIS_NOTIFICATION_RESP_AVAILABLE 0x00000001UL - - -#define CDC_RNDIS_PACKET_MSG_ID 0x00000001UL -#define CDC_RNDIS_INITIALIZE_MSG_ID 0x00000002UL -#define CDC_RNDIS_HALT_MSG_ID 0x00000003UL -#define CDC_RNDIS_QUERY_MSG_ID 0x00000004UL -#define CDC_RNDIS_SET_MSG_ID 0x00000005UL -#define CDC_RNDIS_RESET_MSG_ID 0x00000006UL -#define CDC_RNDIS_INDICATE_STATUS_MSG_ID 0x00000007UL -#define CDC_RNDIS_KEEPALIVE_MSG_ID 0x00000008UL - -#define CDC_RNDIS_INITIALIZE_CMPLT_ID 0x80000002UL -#define CDC_RNDIS_QUERY_CMPLT_ID 0x80000004UL -#define CDC_RNDIS_SET_CMPLT_ID 0x80000005UL -#define CDC_RNDIS_RESET_CMPLT_ID 0x80000006UL -#define CDC_RNDIS_KEEPALIVE_CMPLT_ID 0x80000008UL - -#define CDC_RNDIS_STATUS_SUCCESS 0x00000000UL -#define CDC_RNDIS_STATUS_FAILURE 0xC0000001UL -#define CDC_RNDIS_STATUS_INVALID_DATA 0xC0010015UL -#define CDC_RNDIS_STATUS_NOT_SUPPORTED 0xC00000BBUL -#define CDC_RNDIS_STATUS_MEDIA_CONNECT 0x4001000BUL -#define CDC_RNDIS_STATUS_MEDIA_DISCONNECT 0x4001000CUL -/** Media state */ -#define CDC_RNDIS_MEDIA_STATE_CONNECTED 0x00000000UL -#define CDC_RNDIS_MEDIA_STATE_DISCONNECTED 0x00000001UL - -/** Media types */ -#define CDC_RNDIS_MEDIUM_802_3 0x00000000UL - -#define CDC_RNDIS_DF_CONNECTIONLESS 0x00000001UL -#define CDC_RNDIS_DF_CONNECTION_ORIENTED 0x00000002UL - -/** Hardware status of the underlying NIC */ -#define CDC_RNDIS_HW_STS_READY 0x00000000UL -#define CDC_RNDIS_HW_STS_INITIALIZING 0x00000001UL -#define CDC_RNDIS_HW_STS_RESET 0x00000002UL -#define CDC_RNDIS_HW_STS_CLOSING 0x00000003UL -#define CDC_RNDIS_HW_STS_NOT_READY 0x00000004UL - -/** Packet filter */ -#define CDC_RNDIS_PACKET_DIRECTED 0x00000001UL -#define CDC_RNDIS_PACKET_MULTICAST 0x00000002UL -#define CDC_RNDIS_PACKET_ALL_MULTICAST 0x00000004UL -#define CDC_RNDIS_PACKET_BROADCAST 0x00000008UL -#define CDC_RNDIS_PACKET_SOURCE_ROUTING 0x00000010UL -#define CDC_RNDIS_PACKET_PROMISCUOUS 0x00000020UL -#define CDC_RNDIS_PACKET_SMT 0x00000040UL -#define CDC_RNDIS_PACKET_ALL_LOCAL 0x00000080UL -#define CDC_RNDIS_PACKET_GROUP 0x00001000UL -#define CDC_RNDIS_PACKET_ALL_FUNCTIONAL 0x00002000UL -#define CDC_RNDIS_PACKET_FUNCTIONAL 0x00004000UL -#define CDC_RNDIS_PACKET_MAC_FRAME 0x00008000UL - -#define OID_GEN_SUPPORTED_LIST 0x00010101UL -#define OID_GEN_HARDWARE_STATUS 0x00010102UL -#define OID_GEN_MEDIA_SUPPORTED 0x00010103UL -#define OID_GEN_MEDIA_IN_USE 0x00010104UL -#define OID_GEN_MAXIMUM_FRAME_SIZE 0x00010106UL -#define OID_GEN_MAXIMUM_TOTAL_SIZE 0x00010111UL -#define OID_GEN_LINK_SPEED 0x00010107UL -#define OID_GEN_TRANSMIT_BLOCK_SIZE 0x0001010AUL -#define OID_GEN_RECEIVE_BLOCK_SIZE 0x0001010BUL -#define OID_GEN_VENDOR_ID 0x0001010CUL -#define OID_GEN_VENDOR_DESCRIPTION 0x0001010DUL -#define OID_GEN_CURRENT_PACKET_FILTER 0x0001010EUL -#define OID_GEN_MEDIA_CONNECT_STATUS 0x00010114UL -#define OID_GEN_MAXIMUM_SEND_PACKETS 0x00010115UL -#define OID_GEN_PHYSICAL_MEDIUM 0x00010202UL -#define OID_GEN_XMIT_OK 0x00020101UL -#define OID_GEN_RCV_OK 0x00020102UL -#define OID_GEN_XMIT_ERROR 0x00020103UL -#define OID_GEN_RCV_ERROR 0x00020104UL -#define OID_GEN_RCV_NO_BUFFER 0x00020105UL -#define OID_GEN_CDC_RNDIS_CONFIG_PARAMETER 0x0001021BUL -#define OID_802_3_PERMANENT_ADDRESS 0x01010101UL -#define OID_802_3_CURRENT_ADDRESS 0x01010102UL -#define OID_802_3_MULTICAST_LIST 0x01010103UL -#define OID_802_3_MAXIMUM_LIST_SIZE 0x01010104UL -#define OID_802_3_RCV_ERROR_ALIGNMENT 0x01020101UL -#define OID_802_3_XMIT_ONE_COLLISION 0x01020102UL -#define OID_802_3_XMIT_MORE_COLLISIONS 0x01020103UL - - -#define CDC_RNDIS_SEND_ENCAPSULATED_COMMAND 0x00U -#define CDC_RNDIS_GET_ENCAPSULATED_RESPONSE 0x01U - -#define CDC_RNDIS_NET_DISCONNECTED 0x00U -#define CDC_RNDIS_NET_CONNECTED 0x01U - -#define CDC_RNDIS_BMREQUEST_TYPE_RNDIS 0xA1U -#define CDC_RNDIS_PCKTMSG_DATAOFFSET_OFFSET 8U - -/* MAC String index */ -#define CDC_RNDIS_MAC_STRING_INDEX 6U - -/** - * @} - */ - - -/** @defgroup USBD_CORE_Exported_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -typedef struct _USBD_CDC_RNDIS_Itf -{ - int8_t (* Init)(void); - int8_t (* DeInit)(void); - int8_t (* Control)(uint8_t cmd, uint8_t *pbuf, uint16_t length); - int8_t (* Receive)(uint8_t *Buf, uint32_t *Len); - int8_t (* TransmitCplt)(uint8_t *Buf, uint32_t *Len, uint8_t epnum); - int8_t (* Process)(USBD_HandleTypeDef *pdev); - uint8_t *pStrDesc; -} USBD_CDC_RNDIS_ItfTypeDef; - -/* CDC_RNDIS State values */ -typedef enum -{ - CDC_RNDIS_STATE_UNINITIALIZED = 0, - CDC_RNDIS_STATE_BUS_INITIALIZED = 1, - CDC_RNDIS_STATE_INITIALIZED = 2, - CDC_RNDIS_STATE_DATA_INITIALIZED = 3 -} USBD_CDC_RNDIS_StateTypeDef; - -typedef struct -{ - uint8_t bmRequest; - uint8_t bRequest; - uint16_t wValue; - uint16_t wIndex; - uint16_t wLength; - uint8_t data[8]; -} USBD_CDC_RNDIS_NotifTypeDef; - -typedef struct -{ - uint32_t data[CDC_RNDIS_MAX_DATA_SZE / 4U]; /* Force 32-bit alignment */ - uint8_t CmdOpCode; - uint8_t CmdLength; - uint8_t ResponseRdy; /* Indicates if the Device Response to an CDC_RNDIS msg is ready */ - uint8_t Reserved1; /* Reserved Byte to force 4 bytes alignment of following fields */ - uint8_t *RxBuffer; - uint8_t *TxBuffer; - uint32_t RxLength; - uint32_t TxLength; - - USBD_CDC_RNDIS_NotifTypeDef Req; - USBD_CDC_RNDIS_StateTypeDef State; - - __IO uint32_t TxState; - __IO uint32_t RxState; - - __IO uint32_t MaxPcktLen; - __IO uint32_t LinkStatus; - __IO uint32_t NotificationStatus; - __IO uint32_t PacketFilter; -} USBD_CDC_RNDIS_HandleTypeDef; - -/* Messages Sent by the Host ---------------------*/ - -/* Type define for a CDC_RNDIS Initialize command message */ -typedef struct -{ - uint32_t MsgType; - uint32_t MsgLength; - uint32_t ReqId; - uint32_t MajorVersion; - uint32_t MinorVersion; - uint32_t MaxTransferSize; -} USBD_CDC_RNDIS_InitMsgTypeDef; - -/* Type define for a CDC_RNDIS Halt Message */ -typedef struct -{ - uint32_t MsgType; - uint32_t MsgLength; - uint32_t ReqId; -} USBD_CDC_RNDIS_HaltMsgTypeDef; - -/* Type define for a CDC_RNDIS Query command message */ -typedef struct -{ - uint32_t MsgType; - uint32_t MsgLength; - uint32_t RequestId; - uint32_t Oid; - uint32_t InfoBufLength; - uint32_t InfoBufOffset; - uint32_t DeviceVcHandle; - uint32_t InfoBuf[CDC_RNDIS_MAX_INFO_BUFF_SZ]; -} USBD_CDC_RNDIS_QueryMsgTypeDef; - -/* Type define for a CDC_RNDIS Set command message */ -typedef struct -{ - uint32_t MsgType; - uint32_t MsgLength; - uint32_t ReqId; - uint32_t Oid; - uint32_t InfoBufLength; - uint32_t InfoBufOffset; - uint32_t DeviceVcHandle; - uint32_t InfoBuf[CDC_RNDIS_MAX_INFO_BUFF_SZ]; -} USBD_CDC_RNDIS_SetMsgTypeDef; - -/* Type define for a CDC_RNDIS Reset message */ -typedef struct -{ - uint32_t MsgType; - uint32_t MsgLength; - uint32_t Reserved; -} USBD_CDC_RNDIS_ResetMsgTypeDef; - -/* Type define for a CDC_RNDIS Keepalive command message */ -typedef struct -{ - uint32_t MsgType; - uint32_t MsgLength; - uint32_t ReqId; -} USBD_CDC_RNDIS_KpAliveMsgTypeDef; - - -/* Messages Sent by the Device ---------------------*/ - -/* Type define for a CDC_RNDIS Initialize complete response message */ -typedef struct -{ - uint32_t MsgType; - uint32_t MsgLength; - uint32_t ReqId; - uint32_t Status; - uint32_t MajorVersion; - uint32_t MinorVersion; - uint32_t DeviceFlags; - uint32_t Medium; - uint32_t MaxPacketsPerTransfer; - uint32_t MaxTransferSize; - uint32_t PacketAlignmentFactor; - uint32_t AFListOffset; - uint32_t AFListSize; -} USBD_CDC_RNDIS_InitCpltMsgTypeDef; - -/* Type define for a CDC_RNDIS Query complete response message */ -typedef struct -{ - uint32_t MsgType; - uint32_t MsgLength; - uint32_t ReqId; - uint32_t Status; - uint32_t InfoBufLength; - uint32_t InfoBufOffset; - uint32_t InfoBuf[CDC_RNDIS_MAX_INFO_BUFF_SZ]; -} USBD_CDC_RNDIS_QueryCpltMsgTypeDef; - -/* Type define for a CDC_RNDIS Set complete response message */ -typedef struct -{ - uint32_t MsgType; - uint32_t MsgLength; - uint32_t ReqId; - uint32_t Status; -} USBD_CDC_RNDIS_SetCpltMsgTypeDef; - -/* Type define for a CDC_RNDIS Reset complete message */ -typedef struct -{ - uint32_t MsgType; - uint32_t MsgLength; - uint32_t Status; - uint32_t AddrReset; -} USBD_CDC_RNDIS_ResetCpltMsgTypeDef; - -/* Type define for CDC_RNDIS struct to indicate a change - in the status of the device */ -typedef struct -{ - uint32_t MsgType; - uint32_t MsgLength; - uint32_t Status; - uint32_t StsBufLength; - uint32_t StsBufOffset; -} USBD_CDC_RNDIS_StsChangeMsgTypeDef; - -/* Type define for a CDC_RNDIS Keepalive complete message */ -typedef struct -{ - uint32_t MsgType; - uint32_t MsgLength; - uint32_t ReqId; - uint32_t Status; -} USBD_CDC_RNDIS_KpAliveCpltMsgTypeDef; - - -/* Messages Sent by both Host and Device ---------------------*/ - -/* Type define for a CDC_RNDIS packet message, used to encapsulate - Ethernet packets sent to and from the adapter */ -typedef struct -{ - uint32_t MsgType; - uint32_t MsgLength; - uint32_t DataOffset; - uint32_t DataLength; - uint32_t OOBDataOffset; - uint32_t OOBDataLength; - uint32_t NumOOBDataElements; - uint32_t PerPacketInfoOffset; - uint32_t PerPacketInfoLength; - uint32_t VcHandle; - uint32_t Reserved; -} USBD_CDC_RNDIS_PacketMsgTypeDef; - -/* Miscellaneous types used for parsing ---------------------*/ - -/* The common part for all CDC_RNDIS messages Complete response */ -typedef struct -{ - uint32_t MsgType; - uint32_t MsgLength; - uint32_t ReqId; - uint32_t Status; -} USBD_CDC_RNDIS_CommonCpltMsgTypeDef; - -/* Type define for a single parameter structure */ -typedef struct -{ - uint32_t ParamNameOffset; - uint32_t ParamNameLength; - uint32_t ParamType; - uint32_t ParamValueOffset; - uint32_t ParamValueLength; -} USBD_CDC_RNDIS_ParamStructTypeDef; - - -/* Type define of a single CDC_RNDIS OOB data record */ -typedef struct -{ - uint32_t Size; - uint32_t Type; - uint32_t ClassInfoType; - uint32_t OOBData[sizeof(uint32_t)]; -} USBD_CDC_RNDIS_OOBPacketTypeDef; - -/* Type define for notification structure */ -typedef struct -{ - uint32_t notification; - uint32_t reserved; -} USBD_CDC_RNDIS_NotifStructTypeDef; - -/* This structure will be used to store the type, the size and ID for any - received message from the control endpoint */ -typedef struct -{ - uint32_t MsgType; - uint32_t MsgLength; -} USBD_CDC_RNDIS_CtrlMsgTypeDef; - - -/** @defgroup USBD_CORE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Exported_Variables - * @{ - */ - -extern USBD_ClassTypeDef USBD_CDC_RNDIS; -#define USBD_CDC_RNDIS_CLASS &USBD_CDC_RNDIS -/** - * @} - */ - -/** @defgroup USB_CORE_Exported_Functions - * @{ - */ -uint8_t USBD_CDC_RNDIS_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff); -uint8_t USBD_CDC_RNDIS_ReceivePacket(USBD_HandleTypeDef *pdev); - -uint8_t USBD_CDC_RNDIS_RegisterInterface(USBD_HandleTypeDef *pdev, - USBD_CDC_RNDIS_ItfTypeDef *fops); -#ifdef USE_USBD_COMPOSITE -uint8_t USBD_CDC_RNDIS_TransmitPacket(USBD_HandleTypeDef *pdev, uint8_t ClassId); -uint8_t USBD_CDC_RNDIS_SetTxBuffer(USBD_HandleTypeDef *pdev, - uint8_t *pbuff, uint32_t length, uint8_t ClassId); -#else -uint8_t USBD_CDC_RNDIS_TransmitPacket(USBD_HandleTypeDef *pdev); -uint8_t USBD_CDC_RNDIS_SetTxBuffer(USBD_HandleTypeDef *pdev, - uint8_t *pbuff, uint32_t length); -#endif /* USE_USBD_COMPOSITE */ -uint8_t USBD_CDC_RNDIS_SendNotification(USBD_HandleTypeDef *pdev, - USBD_CDC_NotifCodeTypeDef Notif, - uint16_t bVal, uint8_t *pData); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_CDC_RNDIS_H */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/Class/CDC_RNDIS/Inc/usbd_cdc_rndis_if_template.h b/Class/CDC_RNDIS/Inc/usbd_cdc_rndis_if_template.h deleted file mode 100644 index 14474c6..0000000 --- a/Class/CDC_RNDIS/Inc/usbd_cdc_rndis_if_template.h +++ /dev/null @@ -1,58 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc_rndis_if_template.h - * @author MCD Application Team - * @brief Header for usbd_cdc_rndis_if.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CDC_RNDIS_IF_H -#define __USBD_CDC_RNDIS_IF_H - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_cdc_rndis.h" - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* Ensure this MAC address value is same as MAC_ADDRx declared in STM32xxx_conf.h */ -#define CDC_RNDIS_MAC_STR_DESC (uint8_t *)"000202030000" -#define CDC_RNDIS_MAC_ADDR0 0x00U /* 01 */ -#define CDC_RNDIS_MAC_ADDR1 0x02U /* 02 */ -#define CDC_RNDIS_MAC_ADDR2 0x02U /* 03 */ -#define CDC_RNDIS_MAC_ADDR3 0x03U /* 00 */ -#define CDC_RNDIS_MAC_ADDR4 0x00U /* 00 */ -#define CDC_RNDIS_MAC_ADDR5 0x00U /* 00 */ - -#define USBD_CDC_RNDIS_VENDOR_DESC "STMicroelectronics" -#define USBD_CDC_RNDIS_LINK_SPEED 100000U /* 10Mbps */ -#define USBD_CDC_RNDIS_VID 0x0483U - -/* Max Number of Trials waiting for Tx ready */ -#define CDC_RNDIS_MAX_TX_WAIT_TRIALS 1000000U - -/* Ethernet Maximum Segment size, typically 1514 bytes */ -#define CDC_RNDIS_ETH_MAX_SEGSZE 1514U - -#define CDC_RNDIS_CONNECT_SPEED_UPSTREAM 0x1E000000U -#define CDC_RNDIS_CONNECT_SPEED_DOWNSTREAM 0x1E000000U - - -extern USBD_CDC_RNDIS_ItfTypeDef USBD_CDC_RNDIS_fops; - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -#endif /* __USBD_CDC_RNDIS_IF_H */ - diff --git a/Class/CDC_RNDIS/Src/usbd_cdc_rndis.c b/Class/CDC_RNDIS/Src/usbd_cdc_rndis.c deleted file mode 100644 index 21bb18e..0000000 --- a/Class/CDC_RNDIS/Src/usbd_cdc_rndis.c +++ /dev/null @@ -1,1704 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc_rndis.c - * @author MCD Application Team - * @brief This file provides the high layer firmware functions to manage the - * following functionalities of the USB CDC_RNDIS Class: - * - Initialization and Configuration of high and low layer - * - Enumeration as CDC_RNDIS Device (and enumeration for each implemented memory interface) - * - OUT/IN data transfer - * - Command IN transfer (class requests management) - * - Error management - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - * @verbatim - * - * =================================================================== - * CDC_RNDIS Class Driver Description - * =================================================================== - * This driver manages the "Universal Serial Bus Class Definitions for Communications Devices - * Revision 1.2 November 16, 2007" and the sub-protocol specification of "Universal Serial Bus - * Communications Class Subclass Specification for PSTN Devices Revision 1.2 February 9, 2007" - * This driver implements the following aspects of the specification: - * - Device descriptor management - * - Configuration descriptor management - * - Enumeration as CDC device with 2 data endpoints (IN and OUT) and 1 command endpoint (IN) - * - Requests management (as described in section 6.2 in specification) - * - Abstract Control Model compliant - * - Union Functional collection (using 1 IN endpoint for control) - * - Data interface class - * - * These aspects may be enriched or modified for a specific user application. - * - * This driver doesn't implement the following aspects of the specification - * (but it is possible to manage these features with some modifications on this driver): - * - Any class-specific aspect relative to communication classes should be managed by user application. - * - All communication classes other than PSTN are not managed - * - * @endverbatim - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_cdc_rndis.h" -#include "usbd_ctlreq.h" - -#ifndef __USBD_CDC_RNDIS_IF_H -#include "usbd_cdc_rndis_if_template.h" -#endif /* __USBD_CDC_RNDIS_IF_H */ -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_CDC_RNDIS - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_CDC_RNDIS_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_CDC_RNDIS_Private_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_CDC_RNDIS_Private_Macros - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_CDC_RNDIS_Private_FunctionPrototypes - * @{ - */ - -static uint8_t USBD_CDC_RNDIS_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_CDC_RNDIS_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); - -static uint8_t USBD_CDC_RNDIS_Setup(USBD_HandleTypeDef *pdev, - USBD_SetupReqTypedef *req); - -static uint8_t USBD_CDC_RNDIS_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_CDC_RNDIS_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_CDC_RNDIS_EP0_RxReady(USBD_HandleTypeDef *pdev); -#ifndef USE_USBD_COMPOSITE -static uint8_t *USBD_CDC_RNDIS_GetFSCfgDesc(uint16_t *length); -static uint8_t *USBD_CDC_RNDIS_GetHSCfgDesc(uint16_t *length); -static uint8_t *USBD_CDC_RNDIS_GetOtherSpeedCfgDesc(uint16_t *length); -static uint8_t *USBD_CDC_RNDIS_GetOtherSpeedCfgDesc(uint16_t *length); -#endif /* USE_USBD_COMPOSITE */ -#if (USBD_SUPPORT_USER_STRING_DESC == 1U) -static uint8_t *USBD_CDC_RNDIS_USRStringDescriptor(USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length); -#endif /* USBD_SUPPORT_USER_STRING_DESC */ -#ifndef USE_USBD_COMPOSITE -uint8_t *USBD_CDC_RNDIS_GetDeviceQualifierDescriptor(uint16_t *length); -#endif /* USE_USBD_COMPOSITE */ - -/* CDC_RNDIS Internal messages parsing and construction functions */ -static uint8_t USBD_CDC_RNDIS_MsgParsing(USBD_HandleTypeDef *pdev, uint8_t *RxBuff); -static uint8_t USBD_CDC_RNDIS_ProcessInitMsg(USBD_HandleTypeDef *pdev, USBD_CDC_RNDIS_InitMsgTypeDef *Msg); -static uint8_t USBD_CDC_RNDIS_ProcessHaltMsg(USBD_HandleTypeDef *pdev, USBD_CDC_RNDIS_HaltMsgTypeDef *Msg); -static uint8_t USBD_CDC_RNDIS_ProcessKeepAliveMsg(USBD_HandleTypeDef *pdev, USBD_CDC_RNDIS_KpAliveMsgTypeDef *Msg); -static uint8_t USBD_CDC_RNDIS_ProcessQueryMsg(USBD_HandleTypeDef *pdev, USBD_CDC_RNDIS_QueryMsgTypeDef *Msg); -static uint8_t USBD_CDC_RNDIS_ProcessSetMsg(USBD_HandleTypeDef *pdev, USBD_CDC_RNDIS_SetMsgTypeDef *Msg); -static uint8_t USBD_CDC_RNDIS_ProcessResetMsg(USBD_HandleTypeDef *pdev, USBD_CDC_RNDIS_ResetMsgTypeDef *Msg); -static uint8_t USBD_CDC_RNDIS_ProcessPacketMsg(USBD_HandleTypeDef *pdev, USBD_CDC_RNDIS_PacketMsgTypeDef *Msg); -static uint8_t USBD_CDC_RNDIS_ProcessUnsupportedMsg(USBD_HandleTypeDef *pdev, USBD_CDC_RNDIS_CtrlMsgTypeDef *Msg); - -/* USB Standard Device Descriptor */ -#ifndef USE_USBD_COMPOSITE -__ALIGN_BEGIN static uint8_t USBD_CDC_RNDIS_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = -{ - USB_LEN_DEV_QUALIFIER_DESC, - USB_DESC_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x01, - 0x00, -}; -#endif /* USE_USBD_COMPOSITE */ -static uint8_t MAC_StrDesc[6] = {CDC_RNDIS_MAC_ADDR0, CDC_RNDIS_MAC_ADDR1, CDC_RNDIS_MAC_ADDR2, - CDC_RNDIS_MAC_ADDR3, CDC_RNDIS_MAC_ADDR4, CDC_RNDIS_MAC_ADDR5 - }; - -static uint32_t ConnSpeedTab[2] = {CDC_RNDIS_CONNECT_SPEED_UPSTREAM, - CDC_RNDIS_CONNECT_SPEED_DOWNSTREAM - }; - -static uint8_t EmptyResponse = 0x00U; - -/** - * @} - */ - -/** @defgroup USBD_CDC_RNDIS_Private_Variables - * @{ - */ - - -/* CDC_RNDIS interface class callbacks structure */ -USBD_ClassTypeDef USBD_CDC_RNDIS = -{ - USBD_CDC_RNDIS_Init, - USBD_CDC_RNDIS_DeInit, - USBD_CDC_RNDIS_Setup, - NULL, /* EP0_TxSent, */ - USBD_CDC_RNDIS_EP0_RxReady, - USBD_CDC_RNDIS_DataIn, - USBD_CDC_RNDIS_DataOut, - NULL, - NULL, - NULL, -#ifdef USE_USBD_COMPOSITE - NULL, - NULL, - NULL, - NULL, -#else - USBD_CDC_RNDIS_GetHSCfgDesc, - USBD_CDC_RNDIS_GetFSCfgDesc, - USBD_CDC_RNDIS_GetOtherSpeedCfgDesc, - USBD_CDC_RNDIS_GetDeviceQualifierDescriptor, -#endif /* USE_USBD_COMPOSITE */ -#if (USBD_SUPPORT_USER_STRING_DESC == 1U) - USBD_CDC_RNDIS_USRStringDescriptor, -#endif /* USBD_SUPPORT_USER_STRING_DESC */ -}; -#ifndef USE_USBD_COMPOSITE - -/* USB CDC device Configuration Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_CDC_RNDIS_CfgDesc[] __ALIGN_END = -{ - /* Configuration Descriptor */ - 0x09, /* bLength: Configuration Descriptor size */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - LOBYTE(CDC_RNDIS_CONFIG_DESC_SIZ), /* wTotalLength: Total size of the Config descriptor */ - HIBYTE(CDC_RNDIS_CONFIG_DESC_SIZ), - 0x02, /* bNumInterfaces: 2 interfaces */ - 0x01, /* bConfigurationValue: Configuration value */ - 0x00, /* iConfiguration: Index of string descriptor - describing the configuration */ -#if (USBD_SELF_POWERED == 1U) - 0xC0, /* bmAttributes: Bus Powered according to user configuration */ -#else - 0x80, /* bmAttributes: Bus Powered according to user configuration */ -#endif /* USBD_SELF_POWERED */ - USBD_MAX_POWER, /* MaxPower (mA) */ - - /*---------------------------------------------------------------------------*/ - /* IAD descriptor */ - 0x08, /* bLength */ - 0x0B, /* bDescriptorType */ - 0x00, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - 0xE0, /* bFunctionClass (Wireless Controller) */ - 0x01, /* bFunctionSubClass */ - 0x03, /* bFunctionProtocol */ - 0x00, /* iFunction */ - - /*---------------------------------------------------------------------------*/ - /* Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - CDC_RNDIS_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoint used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass:Abstract Control Model */ - 0xFF, /* bInterfaceProtocol: Common AT commands */ - 0x00, /* iInterface */ - - /* Header Functional Descriptor */ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header functional descriptor */ - 0x10, /* bcdCDC: spec release number: 1.20 */ - 0x01, - - /* Call Management Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - CDC_RNDIS_COM_ITF_NBR, /* bDataInterface: 1 */ - - /* ACM Functional Descriptor */ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x00, /* bmCapabilities */ - - /* Union Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union functional descriptor */ - CDC_RNDIS_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ - CDC_RNDIS_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ - - /* Notification Endpoint Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_RNDIS_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_RNDIS_CMD_PACKET_SIZE), /* wMaxPacketSize */ - HIBYTE(CDC_RNDIS_CMD_PACKET_SIZE), - CDC_RNDIS_FS_BINTERVAL, /* bInterval */ - - /*---------------------------------------------------------------------------*/ - /* Data class interface descriptor */ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - CDC_RNDIS_COM_ITF_NBR, /* 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_RNDIS_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_RNDIS_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_RNDIS_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval */ - - /* Endpoint IN Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - CDC_RNDIS_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_RNDIS_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize */ - HIBYTE(CDC_RNDIS_DATA_FS_MAX_PACKET_SIZE), - 0x00 /* bInterval */ -} ; -#endif /* USE_USBD_COMPOSITE */ - -static uint8_t RNDISInEpAdd = CDC_RNDIS_IN_EP; -static uint8_t RNDISOutEpAdd = CDC_RNDIS_OUT_EP; -static uint8_t RNDISCmdEpAdd = CDC_RNDIS_CMD_EP; - -static const uint32_t CDC_RNDIS_SupportedOIDs[] = -{ - OID_GEN_SUPPORTED_LIST, - OID_GEN_HARDWARE_STATUS, - OID_GEN_MEDIA_SUPPORTED, - OID_GEN_MEDIA_IN_USE, - OID_GEN_MAXIMUM_FRAME_SIZE, - OID_GEN_LINK_SPEED, - OID_GEN_TRANSMIT_BLOCK_SIZE, - OID_GEN_RECEIVE_BLOCK_SIZE, - OID_GEN_VENDOR_ID, - OID_GEN_VENDOR_DESCRIPTION, - OID_GEN_CURRENT_PACKET_FILTER, - OID_GEN_MAXIMUM_TOTAL_SIZE, - OID_GEN_MEDIA_CONNECT_STATUS, - OID_GEN_MAXIMUM_SEND_PACKETS, - OID_802_3_PERMANENT_ADDRESS, - OID_802_3_CURRENT_ADDRESS, - OID_802_3_MULTICAST_LIST, - OID_802_3_MAXIMUM_LIST_SIZE, - OID_802_3_RCV_ERROR_ALIGNMENT, - OID_802_3_XMIT_ONE_COLLISION, - OID_802_3_XMIT_MORE_COLLISIONS, -}; - -/** - * @} - */ - -/** @defgroup USBD_CDC_RNDIS_Private_Functions - * @{ - */ - -/** - * @brief USBD_CDC_RNDIS_Init - * Initialize the CDC CDC_RNDIS interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_CDC_RNDIS_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - USBD_CDC_RNDIS_HandleTypeDef *hcdc; - - hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)USBD_malloc(sizeof(USBD_CDC_RNDIS_HandleTypeDef)); - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - RNDISInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - RNDISOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - RNDISCmdEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (hcdc == NULL) - { - pdev->pClassDataCmsit[pdev->classId] = NULL; - return (uint8_t)USBD_EMEM; - } - - (void)USBD_memset(hcdc, 0, sizeof(USBD_CDC_RNDIS_HandleTypeDef)); - - pdev->pClassDataCmsit[pdev->classId] = (void *)hcdc; - pdev->pClassData = pdev->pClassDataCmsit[pdev->classId]; - - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - /* Open EP IN */ - (void)USBD_LL_OpenEP(pdev, RNDISInEpAdd, USBD_EP_TYPE_BULK, - CDC_RNDIS_DATA_HS_IN_PACKET_SIZE); - - pdev->ep_in[RNDISInEpAdd & 0xFU].is_used = 1U; - - /* Open EP OUT */ - (void)USBD_LL_OpenEP(pdev, RNDISOutEpAdd, USBD_EP_TYPE_BULK, - CDC_RNDIS_DATA_HS_OUT_PACKET_SIZE); - - pdev->ep_out[RNDISOutEpAdd & 0xFU].is_used = 1U; - - /* Set bInterval for CDC RNDIS CMD Endpoint */ - pdev->ep_in[RNDISCmdEpAdd & 0xFU].bInterval = CDC_RNDIS_HS_BINTERVAL; - } - else - { - /* Open EP IN */ - (void)USBD_LL_OpenEP(pdev, RNDISInEpAdd, USBD_EP_TYPE_BULK, - CDC_RNDIS_DATA_FS_IN_PACKET_SIZE); - - pdev->ep_in[RNDISInEpAdd & 0xFU].is_used = 1U; - - /* Open EP OUT */ - (void)USBD_LL_OpenEP(pdev, RNDISOutEpAdd, USBD_EP_TYPE_BULK, - CDC_RNDIS_DATA_FS_OUT_PACKET_SIZE); - - pdev->ep_out[RNDISOutEpAdd & 0xFU].is_used = 1U; - - /* Set bInterval for CDC RNDIS CMD Endpoint */ - pdev->ep_in[RNDISCmdEpAdd & 0xFU].bInterval = CDC_RNDIS_FS_BINTERVAL; - } - - /* Open Command IN EP */ - (void)USBD_LL_OpenEP(pdev, RNDISCmdEpAdd, USBD_EP_TYPE_INTR, CDC_RNDIS_CMD_PACKET_SIZE); - pdev->ep_in[RNDISCmdEpAdd & 0xFU].is_used = 1U; - - hcdc->RxBuffer = NULL; - - /* Init physical Interface components */ - ((USBD_CDC_RNDIS_ItfTypeDef *)pdev->pUserData[pdev->classId])->Init(); - - /* Init the CDC_RNDIS state */ - hcdc->State = CDC_RNDIS_STATE_BUS_INITIALIZED; - - /* Init Xfer states */ - hcdc->TxState = 0U; - hcdc->RxState = 0U; - hcdc->RxLength = 0U; - hcdc->TxLength = 0U; - hcdc->LinkStatus = 0U; - hcdc->NotificationStatus = 0U; - hcdc->MaxPcktLen = (pdev->dev_speed == USBD_SPEED_HIGH) ? CDC_RNDIS_DATA_HS_MAX_PACKET_SIZE : \ - CDC_RNDIS_DATA_FS_MAX_PACKET_SIZE; - - if (hcdc->RxBuffer == NULL) - { - return (uint8_t)USBD_EMEM; - } - - /* Prepare Out endpoint to receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, RNDISOutEpAdd, - hcdc->RxBuffer, hcdc->MaxPcktLen); - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CDC_RNDIS_DeInit - * DeInitialize the CDC layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_CDC_RNDIS_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - RNDISInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - RNDISOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - RNDISCmdEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Close EP IN */ - (void)USBD_LL_CloseEP(pdev, RNDISInEpAdd); - pdev->ep_in[RNDISInEpAdd & 0xFU].is_used = 0U; - - /* Close EP OUT */ - (void)USBD_LL_CloseEP(pdev, RNDISOutEpAdd); - pdev->ep_out[RNDISOutEpAdd & 0xFU].is_used = 0U; - - /* Close Command IN EP */ - (void)USBD_LL_CloseEP(pdev, RNDISCmdEpAdd); - pdev->ep_in[RNDISCmdEpAdd & 0xFU].is_used = 0U; - pdev->ep_in[RNDISCmdEpAdd & 0xFU].bInterval = 0U; - - /* DeInit physical Interface components */ - if (pdev->pClassDataCmsit[pdev->classId] != NULL) - { - ((USBD_CDC_RNDIS_ItfTypeDef *)pdev->pUserData[pdev->classId])->DeInit(); - USBD_free(pdev->pClassDataCmsit[pdev->classId]); - pdev->pClassDataCmsit[pdev->classId] = NULL; - pdev->pClassData = NULL; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CDC_RNDIS_Setup - * Handle the CDC specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t USBD_CDC_RNDIS_Setup(USBD_HandleTypeDef *pdev, - USBD_SetupReqTypedef *req) -{ - USBD_CDC_RNDIS_HandleTypeDef *hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_CDC_RNDIS_CtrlMsgTypeDef *Msg; - uint8_t ifalt = 0U; - uint16_t status_info = 0U; - USBD_StatusTypeDef ret = USBD_OK; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - Msg = (USBD_CDC_RNDIS_CtrlMsgTypeDef *)(void *)hcdc->data; - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS : - if (req->wLength != 0U) - { - /* Control Request Data from Device to Host, send data prepared by device */ - if ((req->bmRequest & 0x80U) != 0U) - { - /* Update opcode and length */ - hcdc->CmdOpCode = req->bRequest; - hcdc->CmdLength = (uint8_t)req->wLength; - - if (hcdc->CmdOpCode == CDC_RNDIS_GET_ENCAPSULATED_RESPONSE) - { - /* Data of Response Message has already been prepared by USBD_CDC_RNDIS_MsgParsing. - Just check that length is corresponding to right expected value */ - if (req->wLength != Msg->MsgLength) - { - } - } - - /* Allow application layer to pre-process data or add own processing before sending response */ - ((USBD_CDC_RNDIS_ItfTypeDef *)pdev->pUserData[pdev->classId])->Control(req->bRequest, - (uint8_t *)hcdc->data, - req->wLength); - /* Check if Response is ready */ - if (hcdc->ResponseRdy != 0U) - { - /* Clear Response Ready flag */ - hcdc->ResponseRdy = 0U; - - /* Send data on control endpoint */ - (void)USBD_CtlSendData(pdev, (uint8_t *)hcdc->data, - MIN(CDC_RNDIS_MAX_DATA_SZE, Msg->MsgLength)); - } - else - { - /* CDC_RNDIS Specification says: If for some reason the device receives a GET ENCAPSULATED RESPONSE - and is unable to respond with a valid data on the Control endpoint, - then it should return a one-byte packet set to 0x00, rather than - stalling the Control endpoint */ - (void)USBD_CtlSendData(pdev, &EmptyResponse, 1U); - } - } - /* Control Request Data from Host to Device: Prepare reception of control data stage */ - else - { - hcdc->CmdOpCode = req->bRequest; - hcdc->CmdLength = (uint8_t)MIN(CDC_RNDIS_MAX_INFO_BUFF_SZ, req->wLength); - - (void)USBD_CtlPrepareRx(pdev, (uint8_t *)hcdc->data, hcdc->CmdLength); - } - } - /* No Data control request: there is no such request for CDC_RNDIS protocol, - so let application layer manage this case */ - else - { - ((USBD_CDC_RNDIS_ItfTypeDef *)pdev->pUserData[pdev->classId])->Control(req->bRequest, - (uint8_t *)req, 0U); - } - break; - - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_STATUS: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, (uint8_t *)&status_info, 2U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_GET_INTERFACE: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, &ifalt, 1U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_SET_INTERFACE: - if (pdev->dev_state != USBD_STATE_CONFIGURED) - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_CLEAR_FEATURE: - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - - return (uint8_t)ret; -} - -/** - * @brief USBD_CDC_RNDIS_DataIn - * Data sent on non-control IN endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t USBD_CDC_RNDIS_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - USBD_CDC_RNDIS_HandleTypeDef *hcdc; - PCD_HandleTypeDef *hpcd = (PCD_HandleTypeDef *)pdev->pData; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - RNDISInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (pdev->pClassDataCmsit[pdev->classId] == NULL) - { - return (uint8_t)USBD_FAIL; - } - - hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (epnum == (RNDISInEpAdd & 0x7FU)) - { - if ((pdev->ep_in[epnum & 0xFU].total_length > 0U) && - ((pdev->ep_in[epnum & 0xFU].total_length % hpcd->IN_ep[epnum & 0xFU].maxpacket) == 0U)) - { - /* Update the packet total length */ - pdev->ep_in[epnum & 0xFU].total_length = 0U; - - /* Send ZLP */ - (void)USBD_LL_Transmit(pdev, epnum, NULL, 0U); - } - else - { - hcdc->TxState = 0U; - - if (((USBD_CDC_RNDIS_ItfTypeDef *)pdev->pUserData[pdev->classId])->TransmitCplt != NULL) - { - ((USBD_CDC_RNDIS_ItfTypeDef *)pdev->pUserData[pdev->classId])->TransmitCplt(hcdc->TxBuffer, \ - &hcdc->TxLength, epnum); - } - } - } - else if (epnum == (RNDISCmdEpAdd & 0x7FU)) - { - if (hcdc->NotificationStatus != 0U) - { - (void)USBD_CDC_RNDIS_SendNotification(pdev, CONNECTION_SPEED_CHANGE, - 0U, (uint8_t *)ConnSpeedTab); - - hcdc->NotificationStatus = 0U; - } - } - else - { - return (uint8_t)USBD_FAIL; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CDC_RNDIS_DataOut - * Data received on non-control Out endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t USBD_CDC_RNDIS_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - USBD_CDC_RNDIS_HandleTypeDef *hcdc; - uint32_t CurrPcktLen; - -#ifdef USE_USBD_COMPOSITE /* Get the Endpoints addresses allocated for this class instance */ - RNDISOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (pdev->pClassDataCmsit[pdev->classId] == NULL) - { - return (uint8_t)USBD_FAIL; - } - - hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (epnum == RNDISOutEpAdd) - { - /* Get the received data length */ - CurrPcktLen = USBD_LL_GetRxDataSize(pdev, epnum); - - /* Increment the frame length */ - hcdc->RxLength += CurrPcktLen; - - /* If the buffer size is less than max packet size: it is the last packet in current frame */ - if ((CurrPcktLen < hcdc->MaxPcktLen) || - (hcdc->RxLength >= (CDC_RNDIS_ETH_MAX_SEGSZE + sizeof(USBD_CDC_RNDIS_PacketMsgTypeDef)))) - { - /* USB data will be immediately processed, this allow next USB traffic being - NAKed till the end of the application Xfer */ - - /* Call data packet message parsing and processing function */ - (void)USBD_CDC_RNDIS_ProcessPacketMsg(pdev, (USBD_CDC_RNDIS_PacketMsgTypeDef *)(void *)hcdc->RxBuffer); - } - else - { - /* Prepare Out endpoint to receive next packet in current/new frame */ - (void)USBD_LL_PrepareReceive(pdev, RNDISOutEpAdd, - (uint8_t *)(hcdc->RxBuffer + hcdc->RxLength), - hcdc->MaxPcktLen); - } - } - else - { - return (uint8_t)USBD_FAIL; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CDC_RNDIS_EP0_RxReady - * Handle EP0 Rx Ready event - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_CDC_RNDIS_EP0_RxReady(USBD_HandleTypeDef *pdev) -{ - USBD_CDC_RNDIS_HandleTypeDef *hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - if ((pdev->pUserData[pdev->classId] != NULL) && (hcdc->CmdOpCode != 0xFFU)) - { - /* Check if the received command is SendEncapsulated command */ - if (hcdc->CmdOpCode == CDC_RNDIS_SEND_ENCAPSULATED_COMMAND) - { - /* Process Received CDC_RNDIS Control Message */ - (void)USBD_CDC_RNDIS_MsgParsing(pdev, (uint8_t *)(hcdc->data)); - - /* Reset the command opcode for next processing */ - hcdc->CmdOpCode = 0xFFU; - } - else - { - /* Reset the command opcode for next processing */ - hcdc->CmdOpCode = 0xFFU; - - /* Ignore the command and return fail */ - return (uint8_t)USBD_FAIL; - } - } - - return (uint8_t)USBD_OK; -} -#ifndef USE_USBD_COMPOSITE -/** - * @brief USBD_CDC_RNDIS_GetFSCfgDesc - * Return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CDC_RNDIS_GetFSCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CDC_RNDIS_CfgDesc, CDC_RNDIS_CMD_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CDC_RNDIS_CfgDesc, CDC_RNDIS_OUT_EP); - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CDC_RNDIS_CfgDesc, CDC_RNDIS_IN_EP); - - if (pEpCmdDesc != NULL) - { - pEpCmdDesc->bInterval = CDC_RNDIS_FS_BINTERVAL; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = CDC_RNDIS_DATA_FS_MAX_PACKET_SIZE; - } - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = CDC_RNDIS_DATA_FS_MAX_PACKET_SIZE; - } - - *length = (uint16_t)(sizeof(USBD_CDC_RNDIS_CfgDesc)); - return USBD_CDC_RNDIS_CfgDesc; -} - -/** - * @brief USBD_CDC_RNDIS_GetHSCfgDesc - * Return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CDC_RNDIS_GetHSCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CDC_RNDIS_CfgDesc, CDC_RNDIS_CMD_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CDC_RNDIS_CfgDesc, CDC_RNDIS_OUT_EP); - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CDC_RNDIS_CfgDesc, CDC_RNDIS_IN_EP); - - if (pEpCmdDesc != NULL) - { - pEpCmdDesc->bInterval = CDC_RNDIS_HS_BINTERVAL; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = CDC_RNDIS_DATA_HS_MAX_PACKET_SIZE; - } - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = CDC_RNDIS_DATA_HS_MAX_PACKET_SIZE; - } - - *length = (uint16_t)(sizeof(USBD_CDC_RNDIS_CfgDesc)); - return USBD_CDC_RNDIS_CfgDesc; -} - -/** - * @brief USBD_CDC_RNDIS_GetOtherSpeedCfgDesc - * Return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CDC_RNDIS_GetOtherSpeedCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CDC_RNDIS_CfgDesc, CDC_RNDIS_CMD_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CDC_RNDIS_CfgDesc, CDC_RNDIS_OUT_EP); - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CDC_RNDIS_CfgDesc, CDC_RNDIS_IN_EP); - - if (pEpCmdDesc != NULL) - { - pEpCmdDesc->bInterval = CDC_RNDIS_FS_BINTERVAL; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = CDC_RNDIS_DATA_FS_MAX_PACKET_SIZE; - } - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = CDC_RNDIS_DATA_FS_MAX_PACKET_SIZE; - } - - *length = (uint16_t)(sizeof(USBD_CDC_RNDIS_CfgDesc)); - return USBD_CDC_RNDIS_CfgDesc; -} - -/** - * @brief DeviceQualifierDescriptor - * return Device Qualifier descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -uint8_t *USBD_CDC_RNDIS_GetDeviceQualifierDescriptor(uint16_t *length) -{ - *length = (uint16_t)(sizeof(USBD_CDC_RNDIS_DeviceQualifierDesc)); - - return USBD_CDC_RNDIS_DeviceQualifierDesc; -} -#endif /* USE_USBD_COMPOSITE */ -/** - * @brief USBD_CDC_RNDIS_RegisterInterface - * @param pdev: device instance - * @param fops: CD Interface callback - * @retval status - */ -uint8_t USBD_CDC_RNDIS_RegisterInterface(USBD_HandleTypeDef *pdev, - USBD_CDC_RNDIS_ItfTypeDef *fops) -{ - if (fops == NULL) - { - return (uint8_t)USBD_FAIL; - } - - pdev->pUserData[pdev->classId] = fops; - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CDC_RNDIS_USRStringDescriptor - * Manages the transfer of user string descriptors. - * @param pdev: device instance - * @param index: descriptor index - * @param length : pointer data length - * @retval pointer to the descriptor table or NULL if the descriptor is not supported. - */ -#if (USBD_SUPPORT_USER_STRING_DESC == 1U) -static uint8_t *USBD_CDC_RNDIS_USRStringDescriptor(USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length) -{ - static uint8_t USBD_StrDesc[255]; - - /* Check if the requested string interface is supported */ - if (index == CDC_RNDIS_MAC_STRING_INDEX) - { - USBD_GetString((uint8_t *)((USBD_CDC_RNDIS_ItfTypeDef *)pdev->pUserData[pdev->classId])->pStrDesc, USBD_StrDesc, - length); - return USBD_StrDesc; - } - /* Not supported Interface Descriptor index */ - else - { - return NULL; - } -} -#endif /* USBD_SUPPORT_USER_STRING_DESC */ - - -/** - * @brief USBD_CDC_RNDIS_SetTxBuffer - * @param pdev: device instance - * @param pbuff: Tx Buffer - * @param length: Tx Buffer length - * @param ClassId: The Class ID - * @retval status - */ -#ifdef USE_USBD_COMPOSITE -uint8_t USBD_CDC_RNDIS_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff, uint32_t length, uint8_t ClassId) -{ - USBD_CDC_RNDIS_HandleTypeDef *hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassDataCmsit[ClassId]; -#else -uint8_t USBD_CDC_RNDIS_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff, uint32_t length) -{ - - USBD_CDC_RNDIS_HandleTypeDef *hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; -#endif /* USE_USBD_COMPOSITE */ - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - hcdc->TxBuffer = pbuff; - hcdc->TxLength = length; - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CDC_RNDIS_SetRxBuffer - * @param pdev: device instance - * @param pbuff: Rx Buffer - * @retval status - */ -uint8_t USBD_CDC_RNDIS_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff) -{ - USBD_CDC_RNDIS_HandleTypeDef *hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - hcdc->RxBuffer = pbuff; - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CDC_RNDIS_TransmitPacket - * Transmit packet on IN endpoint - * @param pdev: device instance - * @param ClassId: The Class ID - * @retval status - */ -#ifdef USE_USBD_COMPOSITE -uint8_t USBD_CDC_RNDIS_TransmitPacket(USBD_HandleTypeDef *pdev, uint8_t ClassId) -{ - USBD_CDC_RNDIS_HandleTypeDef *hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassDataCmsit[ClassId]; -#else -uint8_t USBD_CDC_RNDIS_TransmitPacket(USBD_HandleTypeDef *pdev) -{ - USBD_CDC_RNDIS_HandleTypeDef *hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; -#endif /* USE_USBD_COMPOSITE */ - - USBD_CDC_RNDIS_PacketMsgTypeDef *PacketMsg; - USBD_StatusTypeDef ret = USBD_BUSY; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - RNDISInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, ClassId); -#endif /* USE_USBD_COMPOSITE */ - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - PacketMsg = (USBD_CDC_RNDIS_PacketMsgTypeDef *)(void *)hcdc->TxBuffer; - - if (hcdc->TxState == 0U) - { - /* Tx Transfer in progress */ - hcdc->TxState = 1U; - - /* Format the packet information */ - PacketMsg->MsgType = CDC_RNDIS_PACKET_MSG_ID; - PacketMsg->MsgLength = hcdc->TxLength; - PacketMsg->DataOffset = sizeof(USBD_CDC_RNDIS_PacketMsgTypeDef) - CDC_RNDIS_PCKTMSG_DATAOFFSET_OFFSET; - PacketMsg->DataLength = hcdc->TxLength - sizeof(USBD_CDC_RNDIS_PacketMsgTypeDef); - PacketMsg->OOBDataOffset = 0U; - PacketMsg->OOBDataLength = 0U; - PacketMsg->NumOOBDataElements = 0U; - PacketMsg->PerPacketInfoOffset = 0U; - PacketMsg->PerPacketInfoLength = 0U; - PacketMsg->VcHandle = 0U; - PacketMsg->Reserved = 0U; - - /* Update the packet total length */ - pdev->ep_in[RNDISInEpAdd & 0xFU].total_length = hcdc->TxLength; - - /* Transmit next packet */ - (void)USBD_LL_Transmit(pdev, RNDISInEpAdd, hcdc->TxBuffer, hcdc->TxLength); - - ret = USBD_OK; - } - - return (uint8_t)ret; -} - - -/** - * @brief USBD_CDC_RNDIS_ReceivePacket - * prepare OUT Endpoint for reception - * @param pdev: device instance - * @retval status - */ -uint8_t USBD_CDC_RNDIS_ReceivePacket(USBD_HandleTypeDef *pdev) -{ - USBD_CDC_RNDIS_HandleTypeDef *hcdc; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - RNDISOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (pdev->pClassDataCmsit[pdev->classId] == NULL) - { - return (uint8_t)USBD_FAIL; - } - - hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - /* Prepare Out endpoint to receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, RNDISOutEpAdd, - hcdc->RxBuffer, hcdc->MaxPcktLen); - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CDC_RNDIS_SendNotification - * Transmit Notification packet on CMD IN interrupt endpoint - * @param pdev: device instance - * Notif: value of the notification type (from CDC_RNDIS_Notification_TypeDef enumeration list) - * bVal: value of the notification switch (ie. 0x00 or 0x01 for Network Connection notification) - * pData: pointer to data buffer (ie. upstream and downstream connection speed values) - * @retval status - */ -uint8_t USBD_CDC_RNDIS_SendNotification(USBD_HandleTypeDef *pdev, - USBD_CDC_NotifCodeTypeDef Notif, - uint16_t bVal, uint8_t *pData) -{ - uint32_t Idx; - uint16_t ReqSize = 0U; - USBD_CDC_RNDIS_HandleTypeDef *hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_StatusTypeDef ret = USBD_OK; - - UNUSED(bVal); - UNUSED(pData); - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - RNDISCmdEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Initialize the request fields */ - (hcdc->Req).bmRequest = CDC_RNDIS_BMREQUEST_TYPE_RNDIS; - (hcdc->Req).bRequest = (uint8_t)Notif; - - switch (Notif) - { - case RESPONSE_AVAILABLE: - (hcdc->Req).wValue = 0U; - (hcdc->Req).wIndex = CDC_RNDIS_CMD_ITF_NBR; - (hcdc->Req).wLength = 0U; - - for (Idx = 0U; Idx < 8U; Idx++) - { - (hcdc->Req).data[Idx] = 0U; - } - - ReqSize = 8U; - break; - - default: - ret = USBD_FAIL; - break; - } - - /* Transmit notification packet */ - if (ReqSize != 0U) - { - (void)USBD_LL_Transmit(pdev, RNDISCmdEpAdd, (uint8_t *)&hcdc->Req, ReqSize); - } - - return (uint8_t)ret; -} - - -/* ----------------------------- CDC_RNDIS Messages processing functions ----------------------- */ -/** - * @brief USBD_CDC_RNDIS_MsgParsing - * Parse received message and process it depending on its nature. - * @param pdev: USB Device Handle pointer - * @param RxBuff: Pointer to the message data extracted from SendEncapsulated command - * @retval status - */ -static uint8_t USBD_CDC_RNDIS_MsgParsing(USBD_HandleTypeDef *pdev, uint8_t *RxBuff) -{ - USBD_CDC_RNDIS_CtrlMsgTypeDef *Msg = (USBD_CDC_RNDIS_CtrlMsgTypeDef *)(void *)RxBuff; - static uint8_t ret = (uint8_t)USBD_OK; - - /* Check message type */ - switch (Msg->MsgType) - { - /* CDC_RNDIS Initialize message */ - case CDC_RNDIS_INITIALIZE_MSG_ID: - ret = USBD_CDC_RNDIS_ProcessInitMsg(pdev, (USBD_CDC_RNDIS_InitMsgTypeDef *)(void *)Msg); - break; - - /* CDC_RNDIS Halt message */ - case CDC_RNDIS_HALT_MSG_ID: - ret = USBD_CDC_RNDIS_ProcessHaltMsg(pdev, (USBD_CDC_RNDIS_HaltMsgTypeDef *)(void *)Msg); - break; - - /* CDC_RNDIS Query message */ - case CDC_RNDIS_QUERY_MSG_ID: - ret = USBD_CDC_RNDIS_ProcessQueryMsg(pdev, (USBD_CDC_RNDIS_QueryMsgTypeDef *)(void *)Msg); - break; - - /* CDC_RNDIS Set message */ - case CDC_RNDIS_SET_MSG_ID: - ret = USBD_CDC_RNDIS_ProcessSetMsg(pdev, (USBD_CDC_RNDIS_SetMsgTypeDef *)(void *)Msg); - break; - - /* CDC_RNDIS Reset message */ - case CDC_RNDIS_RESET_MSG_ID: - ret = USBD_CDC_RNDIS_ProcessResetMsg(pdev, (USBD_CDC_RNDIS_ResetMsgTypeDef *)(void *)Msg); - break; - - /* CDC_RNDIS Keep-Alive message */ - case CDC_RNDIS_KEEPALIVE_MSG_ID: - ret = USBD_CDC_RNDIS_ProcessKeepAliveMsg(pdev, (USBD_CDC_RNDIS_KpAliveMsgTypeDef *)(void *)Msg); - break; - - /* CDC_RNDIS unsupported message */ - default: - ret = USBD_CDC_RNDIS_ProcessUnsupportedMsg(pdev, (USBD_CDC_RNDIS_CtrlMsgTypeDef *)(void *)Msg); - break; - } - - return ret; -} - - -/** - * @brief USBD_CDC_RNDIS_ProcessInitMsg - * Parse, extract data and check correctness of CDC_RNDIS INIT_MSG command. - * @param pdev: USB Device Handle pointer - * @param Msg: Pointer to the message data extracted from SendEncapsulated command - * @retval status - */ -static uint8_t USBD_CDC_RNDIS_ProcessInitMsg(USBD_HandleTypeDef *pdev, - USBD_CDC_RNDIS_InitMsgTypeDef *Msg) -{ - /* Get the CDC_RNDIS handle pointer */ - USBD_CDC_RNDIS_HandleTypeDef *hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - /* Get and format the Msg input */ - USBD_CDC_RNDIS_InitMsgTypeDef *InitMessage = (USBD_CDC_RNDIS_InitMsgTypeDef *)Msg; - - /* Use same Msg input buffer as response buffer */ - USBD_CDC_RNDIS_InitCpltMsgTypeDef *InitResponse = (USBD_CDC_RNDIS_InitCpltMsgTypeDef *)(void *)Msg; - - /* Store the Message Request ID */ - uint32_t ReqId = InitMessage->ReqId; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - /* Check correctness of the message (MsgType already checked by entry to this function) */ - if ((InitMessage->MsgLength != sizeof(USBD_CDC_RNDIS_InitMsgTypeDef)) || \ - (InitMessage->MajorVersion < CDC_RNDIS_VERSION_MAJOR)) - { - InitResponse->Status = CDC_RNDIS_STATUS_FAILURE; - } - else - { - InitResponse->Status = CDC_RNDIS_STATUS_SUCCESS; - } - - /* Setup the response buffer content */ - InitResponse->MsgType = CDC_RNDIS_INITIALIZE_CMPLT_ID; - InitResponse->MsgLength = sizeof(USBD_CDC_RNDIS_InitCpltMsgTypeDef); - InitResponse->ReqId = ReqId; - InitResponse->MajorVersion = CDC_RNDIS_VERSION_MAJOR; - InitResponse->MinorVersion = CDC_RNDIS_VERSION_MINOR; - InitResponse->DeviceFlags = CDC_RNDIS_DF_CONNECTIONLESS; - InitResponse->Medium = CDC_RNDIS_MEDIUM_802_3; - InitResponse->MaxPacketsPerTransfer = 1U; - InitResponse->MaxTransferSize = (sizeof(USBD_CDC_RNDIS_PacketMsgTypeDef) + CDC_RNDIS_ETH_FRAME_SIZE_MAX); - InitResponse->PacketAlignmentFactor = 2U; /* Not needed as single packet by transfer set */ - InitResponse->AFListOffset = 0U; /* Reserved for connection-oriented devices. Set value to zero. */ - InitResponse->AFListSize = 0U; /* Reserved for connection-oriented devices. Set value to zero. */ - - /* Set CDC_RNDIS state to INITIALIZED */ - hcdc->State = CDC_RNDIS_STATE_INITIALIZED; - - /* Set Response Ready field in order to send response during next control request */ - hcdc->ResponseRdy = 1U; - - /* Send Notification on Interrupt EP to inform Host that response is ready */ - (void)USBD_CDC_RNDIS_SendNotification(pdev, RESPONSE_AVAILABLE, 0U, NULL); - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CDC_RNDIS_ProcessHaltMsg - * Parse, extract data and check correctness of CDC_RNDIS Halt command. - * @param pdev: USB Device Handle pointer - * @param Msg: Pointer to the message data extracted from SendEncapsulated command - * @retval status - */ -static uint8_t USBD_CDC_RNDIS_ProcessHaltMsg(USBD_HandleTypeDef *pdev, - USBD_CDC_RNDIS_HaltMsgTypeDef *Msg) -{ - /* Get the CDC_RNDIS handle pointer */ - USBD_CDC_RNDIS_HandleTypeDef *hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - /* Set CDC_RNDIS state to INITIALIZED */ - hcdc->State = CDC_RNDIS_STATE_UNINITIALIZED; - - /* No response required for this message, so no notification (RESPONSE_AVAILABLE) is sent */ - - UNUSED(Msg); - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CDC_RNDIS_ProcessKeepAliveMsg - * Parse, extract data and check correctness of CDC_RNDIS KeepAlive command. - * @param pdev: USB Device Handle pointer - * @param Msg: Pointer to the message data extracted from SendEncapsulated command - * @retval status - */ -static uint8_t USBD_CDC_RNDIS_ProcessKeepAliveMsg(USBD_HandleTypeDef *pdev, - USBD_CDC_RNDIS_KpAliveMsgTypeDef *Msg) -{ - /* Get the CDC_RNDIS handle pointer */ - USBD_CDC_RNDIS_HandleTypeDef *hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - /* Use same Msg input buffer as response buffer */ - USBD_CDC_RNDIS_KpAliveCpltMsgTypeDef *InitResponse = (USBD_CDC_RNDIS_KpAliveCpltMsgTypeDef *)(void *)Msg; - - /* Store the Message Request ID */ - uint32_t ReqId = Msg->ReqId; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - /* Check correctness of the message (MsgType already checked by entry to this function) */ - if (Msg->MsgLength != sizeof(USBD_CDC_RNDIS_KpAliveMsgTypeDef)) - { - InitResponse->Status = CDC_RNDIS_STATUS_FAILURE; - } - else - { - InitResponse->Status = CDC_RNDIS_STATUS_SUCCESS; - } - - /* Setup the response buffer content */ - InitResponse->MsgType = CDC_RNDIS_KEEPALIVE_CMPLT_ID; - InitResponse->MsgLength = sizeof(USBD_CDC_RNDIS_KpAliveCpltMsgTypeDef); - InitResponse->ReqId = ReqId; - InitResponse->Status = CDC_RNDIS_STATUS_SUCCESS; - - /* Set Response Ready field in order to send response during next control request */ - hcdc->ResponseRdy = 1U; - - /* Send Notification on Interrupt EP to inform Host that response is ready */ - (void)USBD_CDC_RNDIS_SendNotification(pdev, RESPONSE_AVAILABLE, 0U, NULL); - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CDC_RNDIS_ProcessQueryMsg - * Parse, extract data and check correctness of CDC_RNDIS Query command. - * @param pdev: USB Device Handle pointer - * @param Msg: Pointer to the message data extracted from SendEncapsulated command - * @retval status - */ -static uint8_t USBD_CDC_RNDIS_ProcessQueryMsg(USBD_HandleTypeDef *pdev, - USBD_CDC_RNDIS_QueryMsgTypeDef *Msg) -{ - /* Get the CDC_RNDIS handle pointer */ - USBD_CDC_RNDIS_HandleTypeDef *hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - /* Use same Msg input buffer as response buffer */ - USBD_CDC_RNDIS_QueryCpltMsgTypeDef *QueryResponse = (USBD_CDC_RNDIS_QueryCpltMsgTypeDef *)(void *)Msg; - - /* Store the Message Request ID */ - uint32_t ReqId = Msg->RequestId; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - /* Process the OID depending on its code */ - switch (Msg->Oid) - { - case OID_GEN_SUPPORTED_LIST: - QueryResponse->InfoBufLength = sizeof(CDC_RNDIS_SupportedOIDs); - (void)USBD_memcpy(QueryResponse->InfoBuf, CDC_RNDIS_SupportedOIDs, - sizeof(CDC_RNDIS_SupportedOIDs)); - - QueryResponse->Status = CDC_RNDIS_STATUS_SUCCESS; - break; - - case OID_GEN_HARDWARE_STATUS: - QueryResponse->InfoBufLength = sizeof(uint32_t); - QueryResponse->InfoBuf[0] = CDC_RNDIS_HW_STS_READY; - QueryResponse->Status = CDC_RNDIS_STATUS_SUCCESS; - break; - - case OID_GEN_MEDIA_SUPPORTED: - case OID_GEN_MEDIA_IN_USE: - QueryResponse->InfoBufLength = sizeof(uint32_t); - QueryResponse->InfoBuf[0] = CDC_RNDIS_MEDIUM_802_3; - QueryResponse->Status = CDC_RNDIS_STATUS_SUCCESS; - break; - - case OID_GEN_VENDOR_ID: - QueryResponse->InfoBufLength = sizeof(uint32_t); - QueryResponse->InfoBuf[0] = USBD_CDC_RNDIS_VID; - QueryResponse->Status = CDC_RNDIS_STATUS_SUCCESS; - break; - - case OID_GEN_MAXIMUM_FRAME_SIZE: - case OID_GEN_TRANSMIT_BLOCK_SIZE: - case OID_GEN_RECEIVE_BLOCK_SIZE: - QueryResponse->InfoBufLength = sizeof(uint32_t); - QueryResponse->InfoBuf[0] = CDC_RNDIS_ETH_FRAME_SIZE_MAX; - QueryResponse->Status = CDC_RNDIS_STATUS_SUCCESS; - break; - - case OID_GEN_VENDOR_DESCRIPTION: - QueryResponse->InfoBufLength = (strlen(USBD_CDC_RNDIS_VENDOR_DESC) + 1U); - (void)USBD_memcpy(QueryResponse->InfoBuf, USBD_CDC_RNDIS_VENDOR_DESC, - strlen(USBD_CDC_RNDIS_VENDOR_DESC)); - - QueryResponse->Status = CDC_RNDIS_STATUS_SUCCESS; - break; - - case OID_GEN_MEDIA_CONNECT_STATUS: - QueryResponse->InfoBufLength = sizeof(uint32_t); - QueryResponse->InfoBuf[0] = CDC_RNDIS_MEDIA_STATE_CONNECTED; - QueryResponse->Status = CDC_RNDIS_STATUS_SUCCESS; - break; - - case OID_GEN_MAXIMUM_SEND_PACKETS: - QueryResponse->InfoBufLength = sizeof(uint32_t); - QueryResponse->InfoBuf[0] = 1U; - QueryResponse->Status = CDC_RNDIS_STATUS_SUCCESS; - break; - - case OID_GEN_LINK_SPEED: - QueryResponse->InfoBufLength = sizeof(uint32_t); - QueryResponse->InfoBuf[0] = USBD_CDC_RNDIS_LINK_SPEED; - QueryResponse->Status = CDC_RNDIS_STATUS_SUCCESS; - break; - - case OID_802_3_PERMANENT_ADDRESS: - case OID_802_3_CURRENT_ADDRESS: - QueryResponse->InfoBufLength = 6U; - (void)USBD_memcpy(QueryResponse->InfoBuf, MAC_StrDesc, 6); - QueryResponse->Status = CDC_RNDIS_STATUS_SUCCESS; - break; - - case OID_802_3_MAXIMUM_LIST_SIZE: - QueryResponse->InfoBufLength = sizeof(uint32_t); - QueryResponse->InfoBuf[0] = 1U; /* Only one multicast address supported */ - QueryResponse->Status = CDC_RNDIS_STATUS_SUCCESS; - break; - - case OID_GEN_CURRENT_PACKET_FILTER: - QueryResponse->InfoBufLength = sizeof(uint32_t); - QueryResponse->InfoBuf[0] = 0xFFFFFFU; /* USBD_CDC_RNDIS_DEVICE.packetFilter */ - QueryResponse->Status = CDC_RNDIS_STATUS_SUCCESS; - break; - - case OID_802_3_RCV_ERROR_ALIGNMENT: - case OID_802_3_XMIT_ONE_COLLISION: - case OID_802_3_XMIT_MORE_COLLISIONS: - QueryResponse->InfoBufLength = sizeof(uint32_t); - QueryResponse->InfoBuf[0] = 0U; /* Unused OIDs, return zero */ - QueryResponse->Status = CDC_RNDIS_STATUS_SUCCESS; - break; - - case OID_GEN_MAXIMUM_TOTAL_SIZE: - QueryResponse->InfoBufLength = sizeof(uint32_t); - /* Indicate maximum overall buffer (Ethernet frame and CDC_RNDIS header) the adapter can handle */ - QueryResponse->InfoBuf[0] = (CDC_RNDIS_MESSAGE_BUFFER_SIZE + CDC_RNDIS_ETH_FRAME_SIZE_MAX); - QueryResponse->Status = CDC_RNDIS_STATUS_SUCCESS; - break; - - default: - /* Unknown or unsupported OID */ - QueryResponse->InfoBufLength = 0U; - QueryResponse->Status = CDC_RNDIS_STATUS_FAILURE; - break; - } - - /* Setup the response buffer content */ - QueryResponse->MsgType = CDC_RNDIS_QUERY_CMPLT_ID; - QueryResponse->MsgLength = QueryResponse->InfoBufLength + 24U; - QueryResponse->ReqId = ReqId; - QueryResponse->InfoBufOffset = 16U; - - /* Set Response Ready field in order to send response during next control request */ - hcdc->ResponseRdy = 1U; - - /* Send Notification on Interrupt EP to inform Host that response is ready */ - (void)USBD_CDC_RNDIS_SendNotification(pdev, RESPONSE_AVAILABLE, 0U, NULL); - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CDC_RNDIS_ProcessSetMsg - * Parse, extract data and check correctness of CDC_RNDIS Set Message command. - * @param pdev: USB Device Handle pointer - * @param Msg: Pointer to the message data extracted from SendEncapsulated command - * @retval status - */ -static uint8_t USBD_CDC_RNDIS_ProcessSetMsg(USBD_HandleTypeDef *pdev, - USBD_CDC_RNDIS_SetMsgTypeDef *Msg) -{ - /* Get the CDC_RNDIS handle pointer */ - USBD_CDC_RNDIS_HandleTypeDef *hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - /* Get and format the Msg input */ - USBD_CDC_RNDIS_SetMsgTypeDef *SetMessage = (USBD_CDC_RNDIS_SetMsgTypeDef *)Msg; - - /* Use same Msg input buffer as response buffer */ - USBD_CDC_RNDIS_SetCpltMsgTypeDef *SetResponse = (USBD_CDC_RNDIS_SetCpltMsgTypeDef *)(void *)Msg; - - /* Store the Message Request ID */ - uint32_t ReqId = SetMessage->ReqId; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - switch (SetMessage->Oid) - { - case OID_GEN_CURRENT_PACKET_FILTER: - /* Setup the packet filter value */ - hcdc->PacketFilter = SetMessage->InfoBuf[0]; - SetResponse->Status = CDC_RNDIS_STATUS_SUCCESS; - break; - - case OID_802_3_MULTICAST_LIST: - /* List of multicast addresses on a miniport adapter */ - SetResponse->Status = CDC_RNDIS_STATUS_SUCCESS; - break; - - default: - /* Report an error */ - SetResponse->Status = CDC_RNDIS_STATUS_FAILURE; - break; - } - - /* Prepare response buffer */ - SetResponse->MsgType = CDC_RNDIS_SET_CMPLT_ID; - SetResponse->MsgLength = sizeof(USBD_CDC_RNDIS_SetCpltMsgTypeDef); - SetResponse->ReqId = ReqId; - - /* Set Response Ready field in order to send response during next control request */ - hcdc->ResponseRdy = 1U; - - /* Send Notification on Interrupt EP to inform Host that response is ready */ - (void)USBD_CDC_RNDIS_SendNotification(pdev, RESPONSE_AVAILABLE, 0U, NULL); - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CDC_RNDIS_ProcessResetMsg - * Parse, extract data and check correctness of CDC_RNDIS Set Message command. - * @param pdev: USB Device Handle pointer - * @param Msg: Pointer to the message data extracted from SendEncapsulated command - * @retval status - */ -static uint8_t USBD_CDC_RNDIS_ProcessResetMsg(USBD_HandleTypeDef *pdev, - USBD_CDC_RNDIS_ResetMsgTypeDef *Msg) -{ - /* Get and format the Msg input */ - USBD_CDC_RNDIS_ResetMsgTypeDef *ResetMessage = (USBD_CDC_RNDIS_ResetMsgTypeDef *)Msg; - /* Get the CDC_RNDIS handle pointer */ - USBD_CDC_RNDIS_HandleTypeDef *hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - /* Use same Msg input buffer as response buffer */ - USBD_CDC_RNDIS_ResetCpltMsgTypeDef *ResetResponse = (USBD_CDC_RNDIS_ResetCpltMsgTypeDef *)(void *)Msg; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - if ((ResetMessage->MsgLength != sizeof(USBD_CDC_RNDIS_ResetMsgTypeDef)) || \ - (ResetMessage->Reserved != 0U)) - { - ResetResponse->Status = CDC_RNDIS_STATUS_FAILURE; - } - else - { - ResetResponse->Status = CDC_RNDIS_STATUS_SUCCESS; - } - - /* Prepare response buffer */ - ResetResponse->MsgType = CDC_RNDIS_RESET_CMPLT_ID; - ResetResponse->MsgLength = sizeof(USBD_CDC_RNDIS_ResetCpltMsgTypeDef); - ResetResponse->AddrReset = 0U; - - /* Set CDC_RNDIS state to INITIALIZED */ - hcdc->State = CDC_RNDIS_STATE_BUS_INITIALIZED; - hcdc->LinkStatus = 0U; - - /* Set Response Ready field in order to send response during next control request */ - hcdc->ResponseRdy = 1U; - - /* Send Notification on Interrupt EP to inform Host that response is ready */ - (void)USBD_CDC_RNDIS_SendNotification(pdev, RESPONSE_AVAILABLE, 0U, NULL); - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CDC_RNDIS_ProcessPacketMsg - * Parse, extract data and check correctness of CDC_RNDIS Data Packet. - * @param pdev: USB Device Handle pointer - * @param Msg: Pointer to the message data extracted from Packet - * @retval status - */ -static uint8_t USBD_CDC_RNDIS_ProcessPacketMsg(USBD_HandleTypeDef *pdev, - USBD_CDC_RNDIS_PacketMsgTypeDef *Msg) -{ - uint32_t tmp1; - uint32_t tmp2; - - /* Get the CDC_RNDIS handle pointer */ - USBD_CDC_RNDIS_HandleTypeDef *hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - /* Get and format the Msg input */ - USBD_CDC_RNDIS_PacketMsgTypeDef *PacketMsg = (USBD_CDC_RNDIS_PacketMsgTypeDef *)Msg; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - /* Check correctness of the message */ - if ((PacketMsg->MsgType != CDC_RNDIS_PACKET_MSG_ID)) - { - return (uint8_t)USBD_FAIL; - } - - /* Point to the payload and update the message length */ - - /* Use temporary storage variables to comply with MISRA-C 2012 rule of (+) operand allowed types */ - tmp1 = (uint32_t)PacketMsg; - tmp2 = (uint32_t)(PacketMsg->DataOffset); - hcdc->RxBuffer = (uint8_t *)(tmp1 + tmp2 + CDC_RNDIS_PCKTMSG_DATAOFFSET_OFFSET); - hcdc->RxLength = PacketMsg->DataLength; - - /* Process data by application */ - ((USBD_CDC_RNDIS_ItfTypeDef *)pdev->pUserData[pdev->classId])->Receive(hcdc->RxBuffer, &hcdc->RxLength); - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CDC_RNDIS_ProcessUnsupportedMsg - * Parse, extract data and check correctness of CDC_RNDIS KeepAlive command. - * @param pdev: USB Device Handle pointer - * @param Msg: Pointer to the message data extracted from SendEncapsulated command - * @retval status - */ -static uint8_t USBD_CDC_RNDIS_ProcessUnsupportedMsg(USBD_HandleTypeDef *pdev, - USBD_CDC_RNDIS_CtrlMsgTypeDef *Msg) -{ - /* Get the CDC_RNDIS handle pointer */ - USBD_CDC_RNDIS_HandleTypeDef *hcdc = (USBD_CDC_RNDIS_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - /* Use same Msg input buffer as response buffer */ - USBD_CDC_RNDIS_StsChangeMsgTypeDef *Response = (USBD_CDC_RNDIS_StsChangeMsgTypeDef *)(void *)Msg; - - if (hcdc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - /* Setup the response buffer content */ - Response->MsgType = CDC_RNDIS_INDICATE_STATUS_MSG_ID; - Response->MsgLength = sizeof(USBD_CDC_RNDIS_StsChangeMsgTypeDef); - Response->Status = CDC_RNDIS_STATUS_NOT_SUPPORTED; - Response->StsBufLength = 0U; - Response->StsBufOffset = 20U; - - /* Set Response Ready field in order to send response during next control request */ - hcdc->ResponseRdy = 1U; - - /* Send Notification on Interrupt EP to inform Host that response is ready */ - (void)USBD_CDC_RNDIS_SendNotification(pdev, RESPONSE_AVAILABLE, 0U, NULL); - - UNUSED(Msg); - - return (uint8_t)USBD_OK; -} - - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ diff --git a/Class/CDC_RNDIS/Src/usbd_cdc_rndis_if_template.c b/Class/CDC_RNDIS/Src/usbd_cdc_rndis_if_template.c deleted file mode 100644 index 6cffddd..0000000 --- a/Class/CDC_RNDIS/Src/usbd_cdc_rndis_if_template.c +++ /dev/null @@ -1,261 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc_rndis_if_template.c - * @author MCD Application Team - * @brief Source file for USBD CDC_RNDIS interface template - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ - -/* Include TCP/IP stack header files */ -/* -#include "lwip/opt.h" -#include "lwip/init.h" -#include "lwip/dhcp.h" -#include "lwip/netif.h" -#include "lwip/timeouts.h" -#include "netif/etharp.h" -#include "http_cgi_ssi.h" -#include "ethernetif.h" -*/ - -#include "usbd_cdc_rndis_if_template.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Received Data over USB are stored in this buffer */ -#if defined ( __ICCARM__ ) /*!< IAR Compiler */ -#pragma data_alignment=4 -#endif /* __ICCARM__ */ -__ALIGN_BEGIN uint8_t UserRxBuffer[CDC_RNDIS_ETH_MAX_SEGSZE + 100] __ALIGN_END; - -/* Transmitted Data over CDC_RNDIS (CDC_RNDIS interface) are stored in this buffer */ -#if defined ( __ICCARM__ ) /*!< IAR Compiler */ -#pragma data_alignment=4 -#endif /* __ICCARM__ */ -__ALIGN_BEGIN static uint8_t UserTxBuffer[CDC_RNDIS_ETH_MAX_SEGSZE + 100] __ALIGN_END; - -static uint8_t CDC_RNDISInitialized = 0U; - -/* USB handler declaration */ -extern USBD_HandleTypeDef USBD_Device; - - -/* Private function prototypes -----------------------------------------------*/ -static int8_t CDC_RNDIS_Itf_Init(void); -static int8_t CDC_RNDIS_Itf_DeInit(void); -static int8_t CDC_RNDIS_Itf_Control(uint8_t cmd, uint8_t *pbuf, uint16_t length); -static int8_t CDC_RNDIS_Itf_Receive(uint8_t *pbuf, uint32_t *Len); -static int8_t CDC_RNDIS_Itf_TransmitCplt(uint8_t *pbuf, uint32_t *Len, uint8_t epnum); -static int8_t CDC_RNDIS_Itf_Process(USBD_HandleTypeDef *pdev); - -USBD_CDC_RNDIS_ItfTypeDef USBD_CDC_RNDIS_fops = -{ - CDC_RNDIS_Itf_Init, - CDC_RNDIS_Itf_DeInit, - CDC_RNDIS_Itf_Control, - CDC_RNDIS_Itf_Receive, - CDC_RNDIS_Itf_TransmitCplt, - CDC_RNDIS_Itf_Process, - (uint8_t *)CDC_RNDIS_MAC_STR_DESC, -}; - -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief CDC_RNDIS_Itf_Init - * Initializes the CDC_RNDIS media low layer - * @param None - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t CDC_RNDIS_Itf_Init(void) -{ - if (CDC_RNDISInitialized == 0U) - { - /* - Initialize the LwIP stack - Add your code here - - */ - - CDC_RNDISInitialized = 1U; - } - - /* Set Application Buffers */ -#ifdef USE_USBD_COMPOSITE - (void)USBD_CDC_RNDIS_SetTxBuffer(&USBD_Device, UserTxBuffer, 0U, 0U); -#else - (void)USBD_CDC_RNDIS_SetTxBuffer(&USBD_Device, UserTxBuffer, 0U); -#endif /* USE_USBD_COMPOSITE */ - (void)USBD_CDC_RNDIS_SetRxBuffer(&USBD_Device, UserRxBuffer); - - return (0); -} - -/** - * @brief CDC_RNDIS_Itf_DeInit - * DeInitializes the CDC_RNDIS media low layer - * @param None - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t CDC_RNDIS_Itf_DeInit(void) -{ -#ifdef USE_USBD_COMPOSITE - USBD_CDC_RNDIS_HandleTypeDef *hcdc_cdc_rndis = (USBD_CDC_RNDIS_HandleTypeDef *) \ - (USBD_Device.pClassDataCmsit[USBD_Device.classId]); -#else - USBD_CDC_RNDIS_HandleTypeDef *hcdc_cdc_rndis = (USBD_CDC_RNDIS_HandleTypeDef *)(USBD_Device.pClassData); -#endif /* USE_USBD_COMPOSITE */ - - /* - Add your code here - */ - - /* Notify application layer that link is down */ - hcdc_cdc_rndis->LinkStatus = 0U; - - return (0); -} - -/** - * @brief CDC_RNDIS_Itf_Control - * Manage the CDC_RNDIS class requests - * @param Cmd: Command code - * @param Buf: Buffer containing command data (request parameters) - * @param Len: Number of data to be sent (in bytes) - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t CDC_RNDIS_Itf_Control(uint8_t cmd, uint8_t *pbuf, uint16_t length) -{ -#ifdef USE_USBD_COMPOSITE - USBD_CDC_RNDIS_HandleTypeDef *hcdc_cdc_rndis = (USBD_CDC_RNDIS_HandleTypeDef *) \ - (USBD_Device.pClassDataCmsit[USBD_Device.classId]); -#else - USBD_CDC_RNDIS_HandleTypeDef *hcdc_cdc_rndis = (USBD_CDC_RNDIS_HandleTypeDef *)(USBD_Device.pClassData); -#endif /* USE_USBD_COMPOSITE */ - - switch (cmd) - { - case CDC_RNDIS_SEND_ENCAPSULATED_COMMAND: - /* Add your code here */ - break; - - case CDC_RNDIS_GET_ENCAPSULATED_RESPONSE: - /* Check if this is the first time we enter */ - if (hcdc_cdc_rndis->LinkStatus == 0U) - { - /* Setup the Link up at TCP/IP stack level */ - hcdc_cdc_rndis->LinkStatus = 1U; - /* - Add your code here - */ - } - /* Add your code here */ - break; - - default: - /* Add your code here */ - break; - } - - UNUSED(length); - UNUSED(pbuf); - - return (0); -} - -/** - * @brief CDC_RNDIS_Itf_Receive - * Data received over USB OUT endpoint are sent over CDC_RNDIS interface - * through this function. - * @param Buf: Buffer of data to be transmitted - * @param Len: Number of data received (in bytes) - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t CDC_RNDIS_Itf_Receive(uint8_t *Buf, uint32_t *Len) -{ - /* Get the CDC_RNDIS handler pointer */ -#ifdef USE_USBD_COMPOSITE - USBD_CDC_RNDIS_HandleTypeDef *hcdc_cdc_rndis = (USBD_CDC_RNDIS_HandleTypeDef *) \ - (USBD_Device.pClassDataCmsit[USBD_Device.classId]); -#else - USBD_CDC_RNDIS_HandleTypeDef *hcdc_cdc_rndis = (USBD_CDC_RNDIS_HandleTypeDef *)(USBD_Device.pClassData); -#endif /* USE_USBD_COMPOSITE */ - - /* Call Eth buffer processing */ - hcdc_cdc_rndis->RxState = 1U; - - UNUSED(Buf); - UNUSED(Len); - - return (0); -} - -/** - * @brief CDC_RNDIS_Itf_TransmitCplt - * Data transmitted callback - * - * @note - * This function is IN transfer complete callback used to inform user that - * the submitted Data is successfully sent over USB. - * - * @param Buf: Buffer of data to be received - * @param Len: Number of data received (in bytes) - * @param epnum: EP number - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t CDC_RNDIS_Itf_TransmitCplt(uint8_t *Buf, uint32_t *Len, uint8_t epnum) -{ - UNUSED(Buf); - UNUSED(Len); - UNUSED(epnum); - - return (0); -} - -/** - * @brief CDC_RNDIS_Itf_Process - * Data received over USB OUT endpoint are sent over CDC_RNDIS interface - * through this function. - * @param pdef: pointer to the USB Device Handle - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t CDC_RNDIS_Itf_Process(USBD_HandleTypeDef *pdev) -{ - /* Get the CDC_RNDIS handler pointer */ -#ifdef USE_USBD_COMPOSITE - USBD_CDC_RNDIS_HandleTypeDef *hcdc_cdc_rndis = (USBD_CDC_RNDIS_HandleTypeDef *)(pdev->pClassDataCmsit[pdev->classId]); -#else - USBD_CDC_RNDIS_HandleTypeDef *hcdc_cdc_rndis = (USBD_CDC_RNDIS_HandleTypeDef *)(pdev->pClassData); -#endif /* USE_USBD_COMPOSITE */ - - if (hcdc_cdc_rndis == NULL) - { - return (-1); - } - - if (hcdc_cdc_rndis->LinkStatus != 0U) - { - /* - Add your code here - Read a received packet from the Ethernet buffers and send it - to the lwIP for handling - */ - } - - return (0); -} - diff --git a/Class/CompositeBuilder/Inc/usbd_composite_builder.h b/Class/CompositeBuilder/Inc/usbd_composite_builder.h deleted file mode 100644 index 3a8aac3..0000000 --- a/Class/CompositeBuilder/Inc/usbd_composite_builder.h +++ /dev/null @@ -1,289 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_composite_builder.h - * @author MCD Application Team - * @brief Header for the usbd_composite_builder.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_COMPOSITE_BUILDER_H__ -#define __USBD_COMPOSITE_BUILDER_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" - -#if USBD_CMPSIT_ACTIVATE_HID == 1U -#include "usbd_hid.h" -#endif /* USBD_CMPSIT_ACTIVATE_HID */ - -#if USBD_CMPSIT_ACTIVATE_MSC == 1U -#include "usbd_msc.h" -#endif /* USBD_CMPSIT_ACTIVATE_MSC */ - -#if USBD_CMPSIT_ACTIVATE_CDC == 1U -#include "usbd_cdc.h" -#endif /* USBD_CMPSIT_ACTIVATE_CDC */ - -#if USBD_CMPSIT_ACTIVATE_DFU == 1U -#include "usbd_dfu.h" -#endif /* USBD_CMPSIT_ACTIVATE_DFU */ - -#if USBD_CMPSIT_ACTIVATE_RNDIS == 1U -#include "usbd_cdc_rndis.h" -#endif /* USBD_CMPSIT_ACTIVATE_RNDIS */ - -#if USBD_CMPSIT_ACTIVATE_CDC_ECM == 1U -#include "usbd_cdc_ecm.h" - -#ifndef __USBD_CDC_ECM_IF_H -#include "usbd_cdc_ecm_if_template.h" -#endif /* __USBD_CDC_ECM_IF_H */ -#endif /* USBD_CMPSIT_ACTIVATE_CDC_ECM */ - -#if USBD_CMPSIT_ACTIVATE_AUDIO == 1 -#include "usbd_audio.h" -#endif /* USBD_CMPSIT_ACTIVATE_AUDIO */ - -#if USBD_CMPSIT_ACTIVATE_CUSTOMHID == 1 -#include "usbd_customhid.h" -#endif /* USBD_CMPSIT_ACTIVATE_CUSTOMHID */ - -#if USBD_CMPSIT_ACTIVATE_VIDEO == 1 -#include "usbd_video.h" -#endif /* USBD_CMPSIT_ACTIVATE_VIDEO */ - -#if USBD_CMPSIT_ACTIVATE_PRINTER == 1 -#include "usbd_printer.h" -#endif /* USBD_CMPSIT_ACTIVATE_PRINTER */ - -#if USBD_CMPSIT_ACTIVATE_CCID == 1U -#include "usbd_ccid.h" -#endif /* USBD_CMPSIT_ACTIVATE_CCID */ - -#if USBD_CMPSIT_ACTIVATE_MTP == 1U -#include "usbd_mtp.h" -#endif /* USBD_CMPSIT_ACTIVATE_MTP */ - -/* Private defines -----------------------------------------------------------*/ -/* By default all classes are deactivated, in order to activate a class - define its value to zero */ -#ifndef USBD_CMPSIT_ACTIVATE_HID -#define USBD_CMPSIT_ACTIVATE_HID 0U -#endif /* USBD_CMPSIT_ACTIVATE_HID */ - -#ifndef USBD_CMPSIT_ACTIVATE_MSC -#define USBD_CMPSIT_ACTIVATE_MSC 0U -#endif /* USBD_CMPSIT_ACTIVATE_MSC */ - -#ifndef USBD_CMPSIT_ACTIVATE_DFU -#define USBD_CMPSIT_ACTIVATE_DFU 0U -#endif /* USBD_CMPSIT_ACTIVATE_DFU */ - -#ifndef USBD_CMPSIT_ACTIVATE_CDC -#define USBD_CMPSIT_ACTIVATE_CDC 0U -#endif /* USBD_CMPSIT_ACTIVATE_CDC */ - -#ifndef USBD_CMPSIT_ACTIVATE_CDC_ECM -#define USBD_CMPSIT_ACTIVATE_CDC_ECM 0U -#endif /* USBD_CMPSIT_ACTIVATE_CDC_ECM */ - -#ifndef USBD_CMPSIT_ACTIVATE_RNDIS -#define USBD_CMPSIT_ACTIVATE_RNDIS 0U -#endif /* USBD_CMPSIT_ACTIVATE_RNDIS */ - -#ifndef USBD_CMPSIT_ACTIVATE_AUDIO -#define USBD_CMPSIT_ACTIVATE_AUDIO 0U -#endif /* USBD_CMPSIT_ACTIVATE_AUDIO */ - -#ifndef USBD_CMPSIT_ACTIVATE_CUSTOMHID -#define USBD_CMPSIT_ACTIVATE_CUSTOMHID 0U -#endif /* USBD_CMPSIT_ACTIVATE_CUSTOMHID */ - -#ifndef USBD_CMPSIT_ACTIVATE_VIDEO -#define USBD_CMPSIT_ACTIVATE_VIDEO 0U -#endif /* USBD_CMPSIT_ACTIVATE_VIDEO */ - -#ifndef USBD_CMPSIT_ACTIVATE_PRINTER -#define USBD_CMPSIT_ACTIVATE_PRINTER 0U -#endif /* USBD_CMPSIT_ACTIVATE_PRINTER */ - -#ifndef USBD_CMPSIT_ACTIVATE_CCID -#define USBD_CMPSIT_ACTIVATE_CCID 0U -#endif /* USBD_CMPSIT_ACTIVATE_CCID */ - -#ifndef USBD_CMPSIT_ACTIVATE_MTP -#define USBD_CMPSIT_ACTIVATE_MTP 0U -#endif /* USBD_CMPSIT_ACTIVATE_MTP */ - - -/* This is the maximum supported configuration descriptor size - User may define this value in usbd_conf.h in order to optimize footprint */ -#ifndef USBD_CMPST_MAX_CONFDESC_SZ -#define USBD_CMPST_MAX_CONFDESC_SZ 300U -#endif /* USBD_CMPST_MAX_CONFDESC_SZ */ - -#ifndef USBD_CONFIG_STR_DESC_IDX -#define USBD_CONFIG_STR_DESC_IDX 4U -#endif /* USBD_CONFIG_STR_DESC_IDX */ - -/* Exported types ------------------------------------------------------------*/ -/* USB Iad descriptors structure */ -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bFirstInterface; - uint8_t bInterfaceCount; - uint8_t bFunctionClass; - uint8_t bFunctionSubClass; - uint8_t bFunctionProtocol; - uint8_t iFunction; -} USBD_IadDescTypeDef; - -/* USB interface descriptors structure */ -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bInterfaceNumber; - uint8_t bAlternateSetting; - uint8_t bNumEndpoints; - uint8_t bInterfaceClass; - uint8_t bInterfaceSubClass; - uint8_t bInterfaceProtocol; - uint8_t iInterface; -} USBD_IfDescTypeDef; - -#if (USBD_CMPSIT_ACTIVATE_CDC == 1) || (USBD_CMPSIT_ACTIVATE_RNDIS == 1) || (USBD_CMPSIT_ACTIVATE_CDC_ECM == 1) -typedef struct -{ - /* - * CDC Class specification revision 1.2 - * Table 15: Class-Specific Descriptor Header Format - */ - /* Header Functional Descriptor */ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint16_t bcdCDC; -} __PACKED USBD_CDCHeaderFuncDescTypeDef; - -typedef struct -{ - /* Call Management Functional Descriptor */ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bmCapabilities; - uint8_t bDataInterface; -} USBD_CDCCallMgmFuncDescTypeDef; - -typedef struct -{ - /* ACM Functional Descriptor */ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bmCapabilities; -} USBD_CDCACMFuncDescTypeDef; - -typedef struct -{ - /* - * CDC Class specification revision 1.2 - * Table 16: Union Interface Functional Descriptor - */ - /* Union Functional Descriptor */ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bMasterInterface; - uint8_t bSlaveInterface; -} USBD_CDCUnionFuncDescTypeDef; - -#endif /* (USBD_CMPSIT_ACTIVATE_CDC == 1) || (USBD_CMPSIT_ACTIVATE_RNDIS == 1) || (USBD_CMPSIT_ACTIVATE_CDC_ECM == 1)*/ - -extern USBD_ClassTypeDef USBD_CMPSIT; - -/* Exported functions prototypes ---------------------------------------------*/ -uint8_t USBD_CMPSIT_AddToConfDesc(USBD_HandleTypeDef *pdev); - -#ifdef USE_USBD_COMPOSITE -uint8_t USBD_CMPSIT_AddClass(USBD_HandleTypeDef *pdev, - USBD_ClassTypeDef *pclass, - USBD_CompositeClassTypeDef class, - uint8_t cfgidx); - -uint32_t USBD_CMPSIT_SetClassID(USBD_HandleTypeDef *pdev, - USBD_CompositeClassTypeDef Class, - uint32_t Instance); - -uint32_t USBD_CMPSIT_GetClassID(USBD_HandleTypeDef *pdev, - USBD_CompositeClassTypeDef Class, - uint32_t Instance); -#endif /* USE_USBD_COMPOSITE */ - -uint8_t USBD_CMPST_ClearConfDesc(USBD_HandleTypeDef *pdev); - -/* Private macro -----------------------------------------------------------*/ -#define __USBD_CMPSIT_SET_EP(epadd, eptype, epsize, HSinterval, FSinterval) \ - do { \ - /* Append Endpoint descriptor to Configuration descriptor */ \ - pEpDesc = ((USBD_EpDescTypeDef*)((uint32_t)pConf + *Sze)); \ - pEpDesc->bLength = (uint8_t)sizeof(USBD_EpDescTypeDef); \ - pEpDesc->bDescriptorType = USB_DESC_TYPE_ENDPOINT; \ - pEpDesc->bEndpointAddress = (epadd); \ - pEpDesc->bmAttributes = (eptype); \ - pEpDesc->wMaxPacketSize = (uint16_t)(epsize); \ - if(speed == (uint8_t)USBD_SPEED_HIGH) \ - { \ - pEpDesc->bInterval = HSinterval; \ - } \ - else \ - { \ - pEpDesc->bInterval = FSinterval; \ - } \ - *Sze += (uint32_t)sizeof(USBD_EpDescTypeDef); \ - } while(0) - -#define __USBD_CMPSIT_SET_IF(ifnum, alt, eps, class, subclass, protocol, istring) \ - do { \ - /* Interface Descriptor */ \ - pIfDesc = ((USBD_IfDescTypeDef*)((uint32_t)pConf + *Sze)); \ - pIfDesc->bLength = (uint8_t)sizeof(USBD_IfDescTypeDef); \ - pIfDesc->bDescriptorType = USB_DESC_TYPE_INTERFACE; \ - pIfDesc->bInterfaceNumber = ifnum; \ - pIfDesc->bAlternateSetting = alt; \ - pIfDesc->bNumEndpoints = eps; \ - pIfDesc->bInterfaceClass = class; \ - pIfDesc->bInterfaceSubClass = subclass; \ - pIfDesc->bInterfaceProtocol = protocol; \ - pIfDesc->iInterface = istring; \ - *Sze += (uint32_t)sizeof(USBD_IfDescTypeDef); \ - } while(0) - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_COMPOSITE_BUILDER_H__ */ - -/** - * @} - */ - diff --git a/Class/CompositeBuilder/Src/usbd_composite_builder.c b/Class/CompositeBuilder/Src/usbd_composite_builder.c deleted file mode 100644 index dc4bae9..0000000 --- a/Class/CompositeBuilder/Src/usbd_composite_builder.c +++ /dev/null @@ -1,1884 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_composite_builder.c - * @author MCD Application Team - * @brief This file provides all the composite builder functions. - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - * @verbatim - * - * =================================================================== - * Composite Builder Description - * =================================================================== - * - * The composite builder builds the configuration descriptors based on - * the selection of classes by user. - * It includes all USB Device classes in order to instantiate their - * descriptors, but for better management, it is possible to optimize - * footprint by removing unused classes. It is possible to do so by - * commenting the relative define in usbd_conf.h. - * - * @endverbatim - * - ****************************************************************************** - */ - -/* BSPDependencies -- None -EndBSPDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_composite_builder.h" - -#ifdef USE_USBD_COMPOSITE - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup CMPSIT_CORE - * @brief Mass storage core module - * @{ - */ - -/** @defgroup CMPSIT_CORE_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup CMPSIT_CORE_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup CMPSIT_CORE_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup CMPSIT_CORE_Private_FunctionPrototypes - * @{ - */ -/* uint8_t USBD_CMPSIT_Init (USBD_HandleTypeDef *pdev, - uint8_t cfgidx); */ /* Function not used for the moment */ - -/* uint8_t USBD_CMPSIT_DeInit (USBD_HandleTypeDef *pdev, - uint8_t cfgidx); */ /* Function not used for the moment */ - -uint8_t *USBD_CMPSIT_GetFSCfgDesc(uint16_t *length); -#ifdef USE_USB_HS -uint8_t *USBD_CMPSIT_GetHSCfgDesc(uint16_t *length); -#endif /* USE_USB_HS */ - -uint8_t *USBD_CMPSIT_GetOtherSpeedCfgDesc(uint16_t *length); - -uint8_t *USBD_CMPSIT_GetDeviceQualifierDescriptor(uint16_t *length); - -static uint8_t USBD_CMPSIT_FindFreeIFNbr(USBD_HandleTypeDef *pdev); - -static void USBD_CMPSIT_AddConfDesc(uint32_t Conf, __IO uint32_t *pSze); - -static void USBD_CMPSIT_AssignEp(USBD_HandleTypeDef *pdev, uint8_t Add, uint8_t Type, uint32_t Sze); - - -#if USBD_CMPSIT_ACTIVATE_HID == 1U -static void USBD_CMPSIT_HIDMouseDesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed); -#endif /* USBD_CMPSIT_ACTIVATE_HID == 1U */ - -#if USBD_CMPSIT_ACTIVATE_MSC == 1U -static void USBD_CMPSIT_MSCDesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed); -#endif /* USBD_CMPSIT_ACTIVATE_MSC == 1U */ - -#if USBD_CMPSIT_ACTIVATE_CDC == 1U -static void USBD_CMPSIT_CDCDesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed); -#endif /* USBD_CMPSIT_ACTIVATE_CDC == 1U */ - -#if USBD_CMPSIT_ACTIVATE_DFU == 1U -static void USBD_CMPSIT_DFUDesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed); -#endif /* USBD_CMPSIT_ACTIVATE_DFU == 1U */ - -#if USBD_CMPSIT_ACTIVATE_RNDIS == 1U -static void USBD_CMPSIT_RNDISDesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed); -#endif /* USBD_CMPSIT_ACTIVATE_RNDIS == 1U */ - -#if USBD_CMPSIT_ACTIVATE_CDC_ECM == 1U -static void USBD_CMPSIT_CDC_ECMDesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed); -#endif /* USBD_CMPSIT_ACTIVATE_CDC_ECM == 1U */ - -#if USBD_CMPSIT_ACTIVATE_AUDIO == 1U -static void USBD_CMPSIT_AUDIODesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed); -#endif /* USBD_CMPSIT_ACTIVATE_AUDIO == 1U */ - -#if USBD_CMPSIT_ACTIVATE_CUSTOMHID == 1 -static void USBD_CMPSIT_CUSTOMHIDDesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed); -#endif /* USBD_CMPSIT_ACTIVATE_CUSTOMHID == 1U */ - -#if USBD_CMPSIT_ACTIVATE_VIDEO == 1U -static void USBD_CMPSIT_VIDEODesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed); -#endif /* USBD_CMPSIT_ACTIVATE_VIDEO == 1U */ - -#if USBD_CMPSIT_ACTIVATE_PRINTER == 1U -static void USBD_CMPSIT_PRNTDesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed); -#endif /* USBD_CMPSIT_ACTIVATE_PRINTER == 1U */ - -#if USBD_CMPSIT_ACTIVATE_CCID == 1U -static void USBD_CMPSIT_CCIDDesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed); -#endif /* USBD_CMPSIT_ACTIVATE_CCID == 1U */ - -#if USBD_CMPSIT_ACTIVATE_MTP == 1U -static void USBD_CMPSIT_MTPDesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed); -#endif /* USBD_CMPSIT_ACTIVATE_MTP == 1U */ - -/** - * @} - */ - - -/** @defgroup CMPSIT_CORE_Private_Variables - * @{ - */ -/* This structure is used only for the Configuration descriptors and Device Qualifier */ -USBD_ClassTypeDef USBD_CMPSIT = -{ - NULL, /* Init, */ - NULL, /* DeInit, */ - NULL, /* Setup, */ - NULL, /* EP0_TxSent, */ - NULL, /* EP0_RxReady, */ - NULL, /* DataIn, */ - NULL, /* DataOut, */ - NULL, /* SOF, */ - NULL, - NULL, -#ifdef USE_USB_HS - USBD_CMPSIT_GetHSCfgDesc, -#else - NULL, -#endif /* USE_USB_HS */ - USBD_CMPSIT_GetFSCfgDesc, - USBD_CMPSIT_GetOtherSpeedCfgDesc, - USBD_CMPSIT_GetDeviceQualifierDescriptor, -#if (USBD_SUPPORT_USER_STRING_DESC == 1U) - NULL, -#endif /* USBD_SUPPORT_USER_STRING_DESC */ -}; - -/* The generic configuration descriptor buffer that will be filled by builder - Size of the buffer is the maximum possible configuration descriptor size. */ -__ALIGN_BEGIN static uint8_t USBD_CMPSIT_FSCfgDesc[USBD_CMPST_MAX_CONFDESC_SZ] __ALIGN_END = {0}; -static uint8_t *pCmpstFSConfDesc = USBD_CMPSIT_FSCfgDesc; -/* Variable that dynamically holds the current size of the configuration descriptor */ -static __IO uint32_t CurrFSConfDescSz = 0U; - -#ifdef USE_USB_HS -__ALIGN_BEGIN static uint8_t USBD_CMPSIT_HSCfgDesc[USBD_CMPST_MAX_CONFDESC_SZ] __ALIGN_END = {0}; -static uint8_t *pCmpstHSConfDesc = USBD_CMPSIT_HSCfgDesc; -/* Variable that dynamically holds the current size of the configuration descriptor */ -static __IO uint32_t CurrHSConfDescSz = 0U; -#endif /* USE_USB_HS */ - -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_CMPSIT_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = -{ - USB_LEN_DEV_QUALIFIER_DESC, /* bLength */ - USB_DESC_TYPE_DEVICE_QUALIFIER, /* bDescriptorType */ - 0x00, /* bcdDevice low */ - 0x02, /* bcdDevice high */ - 0xEF, /* Class */ - 0x02, /* SubClass */ - 0x01, /* Protocol */ - 0x40, /* bMaxPacketSize0 */ - 0x01, /* bNumConfigurations */ - 0x00, /* bReserved */ -}; - -/** - * @} - */ - - -/** @defgroup CMPSIT_CORE_Private_Functions - * @{ - */ - -/** - * @brief USBD_CMPSIT_AddClass - * Register a class in the class builder - * @param pdev: device instance - * @param pclass: pointer to the class structure to be added - * @param class: type of the class to be added (from USBD_CompositeClassTypeDef) - * @param cfgidx: configuration index - * @retval status - */ -uint8_t USBD_CMPSIT_AddClass(USBD_HandleTypeDef *pdev, - USBD_ClassTypeDef *pclass, - USBD_CompositeClassTypeDef class, - uint8_t cfgidx) -{ - if ((pdev->classId < USBD_MAX_SUPPORTED_CLASS) && (pdev->tclasslist[pdev->classId].Active == 0U)) - { - /* Store the class parameters in the global tab */ - pdev->pClass[pdev->classId] = pclass; - pdev->tclasslist[pdev->classId].ClassId = pdev->classId; - pdev->tclasslist[pdev->classId].Active = 1U; - pdev->tclasslist[pdev->classId].ClassType = class; - - /* Call configuration descriptor builder and endpoint configuration builder */ - if (USBD_CMPSIT_AddToConfDesc(pdev) != (uint8_t)USBD_OK) - { - return (uint8_t)USBD_FAIL; - } - } - - UNUSED(cfgidx); - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CMPSIT_AddToConfDesc - * Add a new class to the configuration descriptor - * @param pdev: device instance - * @retval status - */ -uint8_t USBD_CMPSIT_AddToConfDesc(USBD_HandleTypeDef *pdev) -{ - uint8_t idxIf = 0U; - uint8_t iEp = 0U; - - /* For the first class instance, start building the config descriptor common part */ - if (pdev->classId == 0U) - { - /* Add configuration and IAD descriptors */ - USBD_CMPSIT_AddConfDesc((uint32_t)pCmpstFSConfDesc, &CurrFSConfDescSz); -#ifdef USE_USB_HS - USBD_CMPSIT_AddConfDesc((uint32_t)pCmpstHSConfDesc, &CurrHSConfDescSz); -#endif /* USE_USB_HS */ - } - - switch (pdev->tclasslist[pdev->classId].ClassType) - { -#if USBD_CMPSIT_ACTIVATE_HID == 1 - case CLASS_TYPE_HID: - /* Setup Max packet sizes (for HID, no dependency on USB Speed, both HS/FS have same packet size) */ - pdev->tclasslist[pdev->classId].CurrPcktSze = HID_EPIN_SIZE; - - /* Find the first available interface slot and Assign number of interfaces */ - idxIf = USBD_CMPSIT_FindFreeIFNbr(pdev); - pdev->tclasslist[pdev->classId].NumIf = 1U; - pdev->tclasslist[pdev->classId].Ifs[0] = idxIf; - - /* Assign endpoint numbers */ - pdev->tclasslist[pdev->classId].NumEps = 1U; /* EP1_IN */ - - /* Set IN endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[0]; - - /* Assign IN Endpoint */ - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_INTR, pdev->tclasslist[pdev->classId].CurrPcktSze); - - /* Configure and Append the Descriptor */ - USBD_CMPSIT_HIDMouseDesc(pdev, (uint32_t)pCmpstFSConfDesc, &CurrFSConfDescSz, (uint8_t)USBD_SPEED_FULL); - -#ifdef USE_USB_HS - USBD_CMPSIT_HIDMouseDesc(pdev, (uint32_t)pCmpstHSConfDesc, &CurrHSConfDescSz, (uint8_t)USBD_SPEED_HIGH); -#endif /* USE_USB_HS */ - - break; -#endif /* USBD_CMPSIT_ACTIVATE_HID */ - -#if USBD_CMPSIT_ACTIVATE_MSC == 1 - case CLASS_TYPE_MSC: - /* Setup default Max packet size */ - pdev->tclasslist[pdev->classId].CurrPcktSze = MSC_MAX_FS_PACKET; - - /* Find the first available interface slot and Assign number of interfaces */ - idxIf = USBD_CMPSIT_FindFreeIFNbr(pdev); - pdev->tclasslist[pdev->classId].NumIf = 1U; - pdev->tclasslist[pdev->classId].Ifs[0] = idxIf; - - /* Assign endpoint numbers */ - pdev->tclasslist[pdev->classId].NumEps = 2U; /* EP1_IN, EP1_OUT */ - - /* Set IN endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[0]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_BULK, pdev->tclasslist[pdev->classId].CurrPcktSze); - - /* Set OUT endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[1]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_BULK, pdev->tclasslist[pdev->classId].CurrPcktSze); - - /* Configure and Append the Descriptor */ - USBD_CMPSIT_MSCDesc(pdev, (uint32_t)pCmpstFSConfDesc, &CurrFSConfDescSz, (uint8_t)USBD_SPEED_FULL); - -#ifdef USE_USB_HS - USBD_CMPSIT_MSCDesc(pdev, (uint32_t)pCmpstHSConfDesc, &CurrHSConfDescSz, (uint8_t)USBD_SPEED_HIGH); -#endif /* USE_USB_HS */ - - break; -#endif /* USBD_CMPSIT_ACTIVATE_MSC */ - -#if USBD_CMPSIT_ACTIVATE_CDC == 1 - case CLASS_TYPE_CDC: - /* Setup default Max packet size for FS device */ - pdev->tclasslist[pdev->classId].CurrPcktSze = CDC_DATA_FS_MAX_PACKET_SIZE; - - /* Find the first available interface slot and Assign number of interfaces */ - idxIf = USBD_CMPSIT_FindFreeIFNbr(pdev); - pdev->tclasslist[pdev->classId].NumIf = 2U; - pdev->tclasslist[pdev->classId].Ifs[0] = idxIf; - pdev->tclasslist[pdev->classId].Ifs[1] = (uint8_t)(idxIf + 1U); - - /* Assign endpoint numbers */ - pdev->tclasslist[pdev->classId].NumEps = 3U; - - /* Set IN endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[0]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_BULK, pdev->tclasslist[pdev->classId].CurrPcktSze); - - /* Set OUT endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[1]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_BULK, pdev->tclasslist[pdev->classId].CurrPcktSze); - - /* Set the second IN endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[2]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_INTR, CDC_CMD_PACKET_SIZE); - - /* Configure and Append the Descriptor */ - USBD_CMPSIT_CDCDesc(pdev, (uint32_t)pCmpstFSConfDesc, &CurrFSConfDescSz, (uint8_t)USBD_SPEED_FULL); - -#ifdef USE_USB_HS - USBD_CMPSIT_CDCDesc(pdev, (uint32_t)pCmpstHSConfDesc, &CurrHSConfDescSz, (uint8_t)USBD_SPEED_HIGH); -#endif /* USE_USB_HS */ - - break; -#endif /* USBD_CMPSIT_ACTIVATE_CDC */ - -#if USBD_CMPSIT_ACTIVATE_DFU == 1 - case CLASS_TYPE_DFU: - /* Setup Max packet sizes (for DFU, no dependency on USB Speed, both HS/FS have same packet size) */ - pdev->tclasslist[pdev->classId].CurrPcktSze = 64U; - - /* Find the first available interface slot and Assign number of interfaces */ - idxIf = USBD_CMPSIT_FindFreeIFNbr(pdev); - pdev->tclasslist[pdev->classId].NumIf = 1U; - pdev->tclasslist[pdev->classId].Ifs[0] = idxIf; - - /* Assign endpoint numbers */ - pdev->tclasslist[pdev->classId].NumEps = 0U; /* only EP0 is used */ - - /* Configure and Append the Descriptor */ - USBD_CMPSIT_DFUDesc(pdev, (uint32_t)pCmpstFSConfDesc, &CurrFSConfDescSz, (uint8_t)USBD_SPEED_FULL); - -#ifdef USE_USB_HS - USBD_CMPSIT_DFUDesc(pdev, (uint32_t)pCmpstHSConfDesc, &CurrHSConfDescSz, (uint8_t)USBD_SPEED_HIGH); -#endif /* USE_USB_HS */ - - break; -#endif /* USBD_CMPSIT_ACTIVATE_DFU */ - -#if USBD_CMPSIT_ACTIVATE_RNDIS == 1 - case CLASS_TYPE_RNDIS: - /* Setup default Max packet size */ - pdev->tclasslist[pdev->classId].CurrPcktSze = CDC_RNDIS_DATA_FS_MAX_PACKET_SIZE; - - /* Find the first available interface slot and Assign number of interfaces */ - idxIf = USBD_CMPSIT_FindFreeIFNbr(pdev); - pdev->tclasslist[pdev->classId].NumIf = 2U; - pdev->tclasslist[pdev->classId].Ifs[0] = idxIf; - pdev->tclasslist[pdev->classId].Ifs[1] = (uint8_t)(idxIf + 1U); - - /* Assign endpoint numbers */ - pdev->tclasslist[pdev->classId].NumEps = 3U; - - /* Set IN endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[0]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_BULK, pdev->tclasslist[pdev->classId].CurrPcktSze); - - /* Set OUT endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[1]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_BULK, pdev->tclasslist[pdev->classId].CurrPcktSze); - - /* Set the second IN endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[2]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_INTR, CDC_RNDIS_CMD_PACKET_SIZE); - - /* Configure and Append the Descriptor */ - USBD_CMPSIT_RNDISDesc(pdev, (uint32_t)pCmpstFSConfDesc, &CurrFSConfDescSz, (uint8_t)USBD_SPEED_FULL); - -#ifdef USE_USB_HS - USBD_CMPSIT_RNDISDesc(pdev, (uint32_t)pCmpstHSConfDesc, &CurrHSConfDescSz, (uint8_t)USBD_SPEED_HIGH); -#endif /* USE_USB_HS */ - - break; -#endif /* USBD_CMPSIT_ACTIVATE_RNDIS */ - -#if USBD_CMPSIT_ACTIVATE_CDC_ECM == 1 - case CLASS_TYPE_ECM: - /* Setup default Max packet size */ - pdev->tclasslist[pdev->classId].CurrPcktSze = CDC_ECM_DATA_FS_MAX_PACKET_SIZE; - - /* Find the first available interface slot and Assign number of interfaces */ - idxIf = USBD_CMPSIT_FindFreeIFNbr(pdev); - pdev->tclasslist[pdev->classId].NumIf = 2U; - pdev->tclasslist[pdev->classId].Ifs[0] = idxIf; - pdev->tclasslist[pdev->classId].Ifs[1] = (uint8_t)(idxIf + 1U); - - /* Assign endpoint numbers */ - pdev->tclasslist[pdev->classId].NumEps = 3U; /* EP1_IN, EP1_OUT,CMD_EP2 */ - - /* Set IN endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[0]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_BULK, pdev->tclasslist[pdev->classId].CurrPcktSze); - - /* Set OUT endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[1]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_BULK, pdev->tclasslist[pdev->classId].CurrPcktSze); - - /* Set the second IN endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[2]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_INTR, CDC_ECM_CMD_PACKET_SIZE); - - /* Configure and Append the Descriptor */ - USBD_CMPSIT_CDC_ECMDesc(pdev, (uint32_t)pCmpstFSConfDesc, &CurrFSConfDescSz, (uint8_t)USBD_SPEED_FULL); - -#ifdef USE_USB_HS - USBD_CMPSIT_CDC_ECMDesc(pdev, (uint32_t)pCmpstHSConfDesc, &CurrHSConfDescSz, (uint8_t)USBD_SPEED_HIGH); -#endif /* USE_USB_HS */ - - break; -#endif /* USBD_CMPSIT_ACTIVATE_CDC_ECM */ - -#if USBD_CMPSIT_ACTIVATE_AUDIO == 1 - case CLASS_TYPE_AUDIO: - /* Setup Max packet sizes*/ - pdev->tclasslist[pdev->classId].CurrPcktSze = USBD_AUDIO_GetEpPcktSze(pdev, 0U, 0U); - - /* Find the first available interface slot and Assign number of interfaces */ - idxIf = USBD_CMPSIT_FindFreeIFNbr(pdev); - pdev->tclasslist[pdev->classId].NumIf = 2U; - pdev->tclasslist[pdev->classId].Ifs[0] = idxIf; - pdev->tclasslist[pdev->classId].Ifs[1] = (uint8_t)(idxIf + 1U); - - /* Assign endpoint numbers */ - pdev->tclasslist[pdev->classId].NumEps = 1U; /* EP1_OUT*/ - - /* Set OUT endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[0]; - - /* Assign OUT Endpoint */ - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_ISOC, pdev->tclasslist[pdev->classId].CurrPcktSze); - - /* Configure and Append the Descriptor (only FS mode supported) */ - USBD_CMPSIT_AUDIODesc(pdev, (uint32_t)pCmpstFSConfDesc, &CurrFSConfDescSz, (uint8_t)USBD_SPEED_FULL); - - break; -#endif /* USBD_CMPSIT_ACTIVATE_AUDIO */ - -#if USBD_CMPSIT_ACTIVATE_CUSTOMHID == 1 - case CLASS_TYPE_CHID: - /* Setup Max packet sizes */ - pdev->tclasslist[pdev->classId].CurrPcktSze = CUSTOM_HID_EPOUT_SIZE; - - /* Find the first available interface slot and Assign number of interfaces */ - idxIf = USBD_CMPSIT_FindFreeIFNbr(pdev); - pdev->tclasslist[pdev->classId].NumIf = 1U; - pdev->tclasslist[pdev->classId].Ifs[0] = idxIf; - - /* Assign endpoint numbers */ - pdev->tclasslist[pdev->classId].NumEps = 2U; /* EP1_IN, EP1_OUT */ - - /* Set IN endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[0]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_INTR,CUSTOM_HID_EPIN_SIZE); - - /* Set OUT endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[1]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_INTR, CUSTOM_HID_EPOUT_SIZE); - - /* Configure and Append the Descriptor */ - USBD_CMPSIT_CUSTOMHIDDesc(pdev, (uint32_t)pCmpstFSConfDesc, &CurrFSConfDescSz, (uint8_t)USBD_SPEED_FULL); - -#ifdef USE_USB_HS - USBD_CMPSIT_CUSTOMHIDDesc(pdev, (uint32_t)pCmpstHSConfDesc, &CurrHSConfDescSz, (uint8_t)USBD_SPEED_HIGH); -#endif /* USE_USB_HS */ - - break; -#endif /* USBD_CMPSIT_ACTIVATE_CUSTOMHID */ - -#if USBD_CMPSIT_ACTIVATE_VIDEO == 1 - case CLASS_TYPE_VIDEO: - /* Setup default Max packet size */ - pdev->tclasslist[pdev->classId].CurrPcktSze = UVC_ISO_FS_MPS; - - /* Find the first available interface slot and Assign number of interfaces */ - idxIf = USBD_CMPSIT_FindFreeIFNbr(pdev); - pdev->tclasslist[pdev->classId].NumIf = 2U; - pdev->tclasslist[pdev->classId].Ifs[0] = idxIf; - pdev->tclasslist[pdev->classId].Ifs[1] = (uint8_t)(idxIf + 1U); - - /* Assign endpoint numbers */ - pdev->tclasslist[pdev->classId].NumEps = 1U; /* EP1_IN */ - - /* Set IN endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[0]; - - /* Assign IN Endpoint */ - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_ISOC, pdev->tclasslist[pdev->classId].CurrPcktSze); - - /* Configure and Append the Descriptor */ - USBD_CMPSIT_VIDEODesc(pdev, (uint32_t)pCmpstFSConfDesc, &CurrFSConfDescSz, (uint8_t)USBD_SPEED_FULL); - -#ifdef USE_USB_HS - USBD_CMPSIT_VIDEODesc(pdev, (uint32_t)pCmpstHSConfDesc, &CurrHSConfDescSz, (uint8_t)USBD_SPEED_HIGH); -#endif /* USE_USB_HS */ - - break; -#endif /* USBD_CMPSIT_ACTIVATE_VIDEO */ - -#if USBD_CMPSIT_ACTIVATE_PRINTER == 1 - case CLASS_TYPE_PRINTER: - - /* Setup default Max packet size */ - pdev->tclasslist[pdev->classId].CurrPcktSze = PRNT_DATA_FS_MAX_PACKET_SIZE; - - /* Find the first available interface slot and Assign number of interfaces */ - idxIf = USBD_CMPSIT_FindFreeIFNbr(pdev); - pdev->tclasslist[pdev->classId].NumIf = 1U; - pdev->tclasslist[pdev->classId].Ifs[0] = idxIf; - - /* Assign endpoint numbers */ - pdev->tclasslist[pdev->classId].NumEps = 2U; - - /* Set IN endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[0]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_BULK, pdev->tclasslist[pdev->classId].CurrPcktSze); - - /* Set OUT endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[1]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_BULK, pdev->tclasslist[pdev->classId].CurrPcktSze); - - /* Configure and Append the Descriptor */ - USBD_CMPSIT_PRNTDesc(pdev, (uint32_t)pCmpstFSConfDesc, &CurrFSConfDescSz, (uint8_t)USBD_SPEED_FULL); - -#ifdef USE_USB_HS - USBD_CMPSIT_PRNTDesc(pdev, (uint32_t)pCmpstHSConfDesc, &CurrHSConfDescSz, (uint8_t)USBD_SPEED_HIGH); -#endif /* USE_USB_HS */ - - break; -#endif /* USBD_CMPSIT_ACTIVATE_PRINTER */ - -#if USBD_CMPSIT_ACTIVATE_CCID == 1 - - case CLASS_TYPE_CCID: - /* Setup default Max packet size */ - pdev->tclasslist[pdev->classId].CurrPcktSze = CCID_DATA_FS_MAX_PACKET_SIZE; - - /* Find the first available interface slot and Assign number of interfaces */ - idxIf = USBD_CMPSIT_FindFreeIFNbr(pdev); - pdev->tclasslist[pdev->classId].NumIf = 1U; - pdev->tclasslist[pdev->classId].Ifs[0] = idxIf; - - /* Assign endpoint numbers */ - pdev->tclasslist[pdev->classId].NumEps = 3U; - - /* Set IN endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[0]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_BULK, pdev->tclasslist[pdev->classId].CurrPcktSze); - - /* Set OUT endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[1]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_BULK, pdev->tclasslist[pdev->classId].CurrPcktSze); - - /* Set the second IN endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[2]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_INTR, CCID_CMD_PACKET_SIZE); - - /* Configure and Append the Descriptor */ - USBD_CMPSIT_CCIDDesc(pdev, (uint32_t)pCmpstFSConfDesc, &CurrFSConfDescSz, (uint8_t)USBD_SPEED_FULL); - -#ifdef USE_USB_HS - USBD_CMPSIT_CCIDDesc(pdev, (uint32_t)pCmpstHSConfDesc, &CurrHSConfDescSz, (uint8_t)USBD_SPEED_HIGH); -#endif /* USE_USB_HS */ - - break; -#endif /* USBD_CMPSIT_ACTIVATE_CCID */ - -#if USBD_CMPSIT_ACTIVATE_MTP == 1 - - case CLASS_TYPE_MTP: - /* Setup default Max packet sizes */ - pdev->tclasslist[pdev->classId].CurrPcktSze = MTP_DATA_MAX_FS_PACKET_SIZE; - - /* Find the first available interface slot and Assign number of interfaces */ - idxIf = USBD_CMPSIT_FindFreeIFNbr(pdev); - pdev->tclasslist[pdev->classId].NumIf = 1U; - pdev->tclasslist[pdev->classId].Ifs[0] = idxIf; - - /* Assign endpoint numbers */ - pdev->tclasslist[pdev->classId].NumEps = 3U; - - /* Set IN endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[0]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_BULK, pdev->tclasslist[pdev->classId].CurrPcktSze); - - /* Set OUT endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[1]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_BULK, pdev->tclasslist[pdev->classId].CurrPcktSze); - - /* Set the second IN endpoint slot */ - iEp = pdev->tclasslist[pdev->classId].EpAdd[2]; - USBD_CMPSIT_AssignEp(pdev, iEp, USBD_EP_TYPE_INTR, MTP_CMD_PACKET_SIZE); - - /* Configure and Append the Descriptor */ - USBD_CMPSIT_MTPDesc(pdev, (uint32_t)pCmpstFSConfDesc, &CurrFSConfDescSz, (uint8_t)USBD_SPEED_FULL); - -#ifdef USE_USB_HS - USBD_CMPSIT_MTPDesc(pdev, (uint32_t)pCmpstHSConfDesc, &CurrHSConfDescSz, (uint8_t)USBD_SPEED_HIGH); -#endif /* USE_USB_HS */ - - break; -#endif /* USBD_CMPSIT_ACTIVATE_MTP */ - - default: - UNUSED(idxIf); - UNUSED(iEp); - UNUSED(USBD_CMPSIT_FindFreeIFNbr); - UNUSED(USBD_CMPSIT_AssignEp); - break; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CMPSIT_GetFSCfgDesc - * return configuration descriptor for both FS and HS modes - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -uint8_t *USBD_CMPSIT_GetFSCfgDesc(uint16_t *length) -{ - *length = (uint16_t)CurrFSConfDescSz; - - return USBD_CMPSIT_FSCfgDesc; -} - -#ifdef USE_USB_HS -/** - * @brief USBD_CMPSIT_GetHSCfgDesc - * return configuration descriptor for both FS and HS modes - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -uint8_t *USBD_CMPSIT_GetHSCfgDesc(uint16_t *length) -{ - *length = (uint16_t)CurrHSConfDescSz; - - return USBD_CMPSIT_HSCfgDesc; -} -#endif /* USE_USB_HS */ - -/** - * @brief USBD_CMPSIT_GetOtherSpeedCfgDesc - * return other speed configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -uint8_t *USBD_CMPSIT_GetOtherSpeedCfgDesc(uint16_t *length) -{ - *length = (uint16_t)CurrFSConfDescSz; - - return USBD_CMPSIT_FSCfgDesc; -} - -/** - * @brief DeviceQualifierDescriptor - * return Device Qualifier descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -uint8_t *USBD_CMPSIT_GetDeviceQualifierDescriptor(uint16_t *length) -{ - *length = (uint16_t)(sizeof(USBD_CMPSIT_DeviceQualifierDesc)); - return USBD_CMPSIT_DeviceQualifierDesc; -} - -/** - * @brief USBD_CMPSIT_FindFreeIFNbr - * Find the first interface available slot - * @param pdev: device instance - * @retval The interface number to be used - */ -static uint8_t USBD_CMPSIT_FindFreeIFNbr(USBD_HandleTypeDef *pdev) -{ - uint32_t idx = 0U; - - /* Unroll all already activated classes */ - for (uint32_t i = 0U; i < pdev->NumClasses; i++) - { - /* Unroll each class interfaces */ - for (uint32_t j = 0U; j < pdev->tclasslist[i].NumIf; j++) - { - /* Increment the interface counter index */ - idx++; - } - } - - /* Return the first available interface slot */ - return (uint8_t)idx; -} - -/** - * @brief USBD_CMPSIT_AddToConfDesc - * Add a new class to the configuration descriptor - * @param pdev: device instance - * @retval none - */ -static void USBD_CMPSIT_AddConfDesc(uint32_t Conf, __IO uint32_t *pSze) -{ - /* Intermediate variable to comply with MISRA-C Rule 11.3 */ - USBD_ConfigDescTypeDef *ptr = (USBD_ConfigDescTypeDef *)Conf; - - ptr->bLength = (uint8_t)sizeof(USBD_ConfigDescTypeDef); - ptr->bDescriptorType = USB_DESC_TYPE_CONFIGURATION; - ptr->wTotalLength = 0U; - ptr->bNumInterfaces = 0U; - ptr->bConfigurationValue = 1U; - ptr->iConfiguration = USBD_CONFIG_STR_DESC_IDX; - -#if (USBD_SELF_POWERED == 1U) - ptr->bmAttributes = 0xC0U; /* bmAttributes: Self Powered according to user configuration */ -#else - ptr->bmAttributes = 0x80U; /* bmAttributes: Bus Powered according to user configuration */ -#endif /* USBD_SELF_POWERED */ - - ptr->bMaxPower = USBD_MAX_POWER; - - *pSze += sizeof(USBD_ConfigDescTypeDef); -} - -/** - * @brief USBD_CMPSIT_AssignEp - * Assign and endpoint - * @param pdev: device instance - * @param Add: Endpoint address - * @param Type: Endpoint type - * @param Sze: Endpoint max packet size - * @retval none - */ -static void USBD_CMPSIT_AssignEp(USBD_HandleTypeDef *pdev, uint8_t Add, uint8_t Type, uint32_t Sze) -{ - uint32_t idx = 0U; - - /* Find the first available endpoint slot */ - while (((idx < (pdev->tclasslist[pdev->classId]).NumEps) && \ - ((pdev->tclasslist[pdev->classId].Eps[idx].is_used) != 0U))) - { - /* Increment the index */ - idx++; - } - - /* Configure the endpoint */ - pdev->tclasslist[pdev->classId].Eps[idx].add = Add; - pdev->tclasslist[pdev->classId].Eps[idx].type = Type; - pdev->tclasslist[pdev->classId].Eps[idx].size = (uint8_t)Sze; - pdev->tclasslist[pdev->classId].Eps[idx].is_used = 1U; -} - -#if USBD_CMPSIT_ACTIVATE_HID == 1 -/** - * @brief USBD_CMPSIT_HIDMouseDesc - * Configure and Append the HID Mouse Descriptor - * @param pdev: device instance - * @param pConf: Configuration descriptor pointer - * @param Sze: pointer to the current configuration descriptor size - * @retval None - */ -static void USBD_CMPSIT_HIDMouseDesc(USBD_HandleTypeDef *pdev, uint32_t pConf, - __IO uint32_t *Sze, uint8_t speed) -{ - static USBD_IfDescTypeDef *pIfDesc; - static USBD_EpDescTypeDef *pEpDesc; - static USBD_HIDDescTypeDef *pHidMouseDesc; - - /* Append HID Interface descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_IF(pdev->tclasslist[pdev->classId].Ifs[0], 0U, \ - (uint8_t)(pdev->tclasslist[pdev->classId].NumEps), 0x03U, 0x01U, 0x02U, 0U); - - /* Append HID Functional descriptor to Configuration descriptor */ - pHidMouseDesc = ((USBD_HIDDescTypeDef *)(pConf + *Sze)); - pHidMouseDesc->bLength = (uint8_t)sizeof(USBD_HIDDescTypeDef); - pHidMouseDesc->bDescriptorType = HID_DESCRIPTOR_TYPE; - pHidMouseDesc->bcdHID = 0x0111U; - pHidMouseDesc->bCountryCode = 0x00U; - pHidMouseDesc->bNumDescriptors = 0x01U; - pHidMouseDesc->bHIDDescriptorType = 0x22U; - pHidMouseDesc->wItemLength = HID_MOUSE_REPORT_DESC_SIZE; - *Sze += (uint32_t)sizeof(USBD_HIDDescTypeDef); - - /* Append Endpoint descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP(pdev->tclasslist[pdev->classId].Eps[0].add, USBD_EP_TYPE_INTR, HID_EPIN_SIZE, \ - HID_HS_BINTERVAL, HID_FS_BINTERVAL); - - /* Update Config Descriptor and IAD descriptor */ - ((USBD_ConfigDescTypeDef *)pConf)->bNumInterfaces += 1U; - ((USBD_ConfigDescTypeDef *)pConf)->wTotalLength = (uint16_t)(*Sze); -} -#endif /* USBD_CMPSIT_ACTIVATE_HID == 1 */ - -#if USBD_CMPSIT_ACTIVATE_MSC == 1 -/** - * @brief USBD_CMPSIT_MSCDesc - * Configure and Append the MSC Descriptor - * @param pdev: device instance - * @param pConf: Configuration descriptor pointer - * @param Sze: pointer to the current configuration descriptor size - * @retval None - */ -static void USBD_CMPSIT_MSCDesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed) -{ - USBD_IfDescTypeDef *pIfDesc; - USBD_EpDescTypeDef *pEpDesc; - - /* Append MSC Interface descriptor */ - __USBD_CMPSIT_SET_IF((pdev->tclasslist[pdev->classId].Ifs[0]), (0U), \ - (uint8_t)(pdev->tclasslist[pdev->classId].NumEps), (0x08U), (0x06U), (0x50U), (0U)); - - if (speed == (uint8_t)USBD_SPEED_HIGH) - { - pdev->tclasslist[pdev->classId].CurrPcktSze = MSC_MAX_HS_PACKET; - } - - /* Append Endpoint descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP((pdev->tclasslist[pdev->classId].Eps[0].add), (USBD_EP_TYPE_BULK), \ - (pdev->tclasslist[pdev->classId].CurrPcktSze), (0U), (0U)); - - /* Append Endpoint descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP((pdev->tclasslist[pdev->classId].Eps[1].add), (USBD_EP_TYPE_BULK), \ - (pdev->tclasslist[pdev->classId].CurrPcktSze), (0U), (0U)); - - /* Update Config Descriptor and IAD descriptor */ - ((USBD_ConfigDescTypeDef *)pConf)->bNumInterfaces += 1U; - ((USBD_ConfigDescTypeDef *)pConf)->wTotalLength = (uint16_t)(*Sze); -} -#endif /* USBD_CMPSIT_ACTIVATE_MSC == 1 */ - -#if USBD_CMPSIT_ACTIVATE_CDC == 1 -/** - * @brief USBD_CMPSIT_MSCDesc - * Configure and Append the HID Mouse Descriptor - * @param pdev: device instance - * @param pConf: Configuration descriptor pointer - * @param Sze: pointer to the current configuration descriptor size - * @retval None - */ -static void USBD_CMPSIT_CDCDesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed) -{ - static USBD_IfDescTypeDef *pIfDesc; - static USBD_EpDescTypeDef *pEpDesc; - static USBD_CDCHeaderFuncDescTypeDef *pHeadDesc; - static USBD_CDCCallMgmFuncDescTypeDef *pCallMgmDesc; - static USBD_CDCACMFuncDescTypeDef *pACMDesc; - static USBD_CDCUnionFuncDescTypeDef *pUnionDesc; -#if USBD_COMPOSITE_USE_IAD == 1 - static USBD_IadDescTypeDef *pIadDesc; -#endif /* USBD_COMPOSITE_USE_IAD == 1 */ - -#if USBD_COMPOSITE_USE_IAD == 1 - pIadDesc = ((USBD_IadDescTypeDef *)(pConf + *Sze)); - pIadDesc->bLength = (uint8_t)sizeof(USBD_IadDescTypeDef); - pIadDesc->bDescriptorType = USB_DESC_TYPE_IAD; /* IAD descriptor */ - pIadDesc->bFirstInterface = pdev->tclasslist[pdev->classId].Ifs[0]; - pIadDesc->bInterfaceCount = 2U; /* 2 interfaces */ - pIadDesc->bFunctionClass = 0x02U; - pIadDesc->bFunctionSubClass = 0x02U; - pIadDesc->bFunctionProtocol = 0x01U; - pIadDesc->iFunction = 0U; /* String Index */ - *Sze += (uint32_t)sizeof(USBD_IadDescTypeDef); -#endif /* USBD_COMPOSITE_USE_IAD == 1 */ - - /* Control Interface Descriptor */ - __USBD_CMPSIT_SET_IF(pdev->tclasslist[pdev->classId].Ifs[0], 0U, 1U, 0x02, 0x02U, 0x01U, 0U); - - /* Control interface headers */ - pHeadDesc = ((USBD_CDCHeaderFuncDescTypeDef *)((uint32_t)pConf + *Sze)); - /* Header Functional Descriptor*/ - pHeadDesc->bLength = 0x05U; - pHeadDesc->bDescriptorType = 0x24U; - pHeadDesc->bDescriptorSubtype = 0x00U; - pHeadDesc->bcdCDC = 0x0110U; - *Sze += (uint32_t)sizeof(USBD_CDCHeaderFuncDescTypeDef); - - /* Call Management Functional Descriptor */ - pCallMgmDesc = ((USBD_CDCCallMgmFuncDescTypeDef *)((uint32_t)pConf + *Sze)); - pCallMgmDesc->bLength = 0x05U; - pCallMgmDesc->bDescriptorType = 0x24U; - pCallMgmDesc->bDescriptorSubtype = 0x01U; - pCallMgmDesc->bmCapabilities = 0x00U; - pCallMgmDesc->bDataInterface = pdev->tclasslist[pdev->classId].Ifs[1]; - *Sze += (uint32_t)sizeof(USBD_CDCCallMgmFuncDescTypeDef); - - /* ACM Functional Descriptor*/ - pACMDesc = ((USBD_CDCACMFuncDescTypeDef *)((uint32_t)pConf + *Sze)); - pACMDesc->bLength = 0x04U; - pACMDesc->bDescriptorType = 0x24U; - pACMDesc->bDescriptorSubtype = 0x02U; - pACMDesc->bmCapabilities = 0x02U; - *Sze += (uint32_t)sizeof(USBD_CDCACMFuncDescTypeDef); - - /* Union Functional Descriptor*/ - pUnionDesc = ((USBD_CDCUnionFuncDescTypeDef *)((uint32_t)pConf + *Sze)); - pUnionDesc->bLength = 0x05U; - pUnionDesc->bDescriptorType = 0x24U; - pUnionDesc->bDescriptorSubtype = 0x06U; - pUnionDesc->bMasterInterface = pdev->tclasslist[pdev->classId].Ifs[0]; - pUnionDesc->bSlaveInterface = pdev->tclasslist[pdev->classId].Ifs[1]; - *Sze += (uint32_t)sizeof(USBD_CDCUnionFuncDescTypeDef); - - /* Append Endpoint descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP(pdev->tclasslist[pdev->classId].Eps[2].add, \ - USBD_EP_TYPE_INTR, CDC_CMD_PACKET_SIZE, CDC_HS_BINTERVAL, CDC_FS_BINTERVAL); - - /* Data Interface Descriptor */ - __USBD_CMPSIT_SET_IF(pdev->tclasslist[pdev->classId].Ifs[1], 0U, 2U, 0x0A, 0U, 0U, 0U); - - if (speed == (uint8_t)USBD_SPEED_HIGH) - { - pdev->tclasslist[pdev->classId].CurrPcktSze = CDC_DATA_HS_MAX_PACKET_SIZE; - } - - /* Append Endpoint descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP((pdev->tclasslist[pdev->classId].Eps[0].add), \ - (USBD_EP_TYPE_BULK), (pdev->tclasslist[pdev->classId].CurrPcktSze), (0U), (0U)); - - /* Append Endpoint descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP((pdev->tclasslist[pdev->classId].Eps[1].add), \ - (USBD_EP_TYPE_BULK), (pdev->tclasslist[pdev->classId].CurrPcktSze), (0U), (0U)); - - /* Update Config Descriptor and IAD descriptor */ - ((USBD_ConfigDescTypeDef *)pConf)->bNumInterfaces += 2U; - ((USBD_ConfigDescTypeDef *)pConf)->wTotalLength = (uint16_t)(*Sze); -} -#endif /* USBD_CMPSIT_ACTIVATE_CDC == 1 */ - -#if USBD_CMPSIT_ACTIVATE_DFU == 1 -/** - * @brief USBD_CMPSIT_DFUDesc - * Configure and Append the DFU Descriptor - * @param pdev: device instance - * @param pConf: Configuration descriptor pointer - * @param Sze: pointer to the current configuration descriptor size - * @retval None - */ -static void USBD_CMPSIT_DFUDesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed) -{ - static USBD_IfDescTypeDef *pIfDesc; - static USBD_DFUFuncDescTypeDef *pDFUFuncDesc; - uint32_t idx; - UNUSED(speed); - - for (idx = 0U; idx < USBD_DFU_MAX_ITF_NUM; idx++) - { - /* Append DFU Interface descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_IF(pdev->tclasslist[pdev->classId].Ifs[0], (uint8_t)idx, 0U, 0xFEU, 0x01U, 0x02U, \ - (uint8_t)USBD_IDX_INTERFACE_STR + 1U + (uint8_t)idx); - } - - /* Append DFU Functional descriptor to Configuration descriptor */ - pDFUFuncDesc = ((USBD_DFUFuncDescTypeDef *)(pConf + *Sze)); - pDFUFuncDesc->bLength = (uint8_t)sizeof(USBD_DFUFuncDescTypeDef); - pDFUFuncDesc->bDescriptorType = DFU_DESCRIPTOR_TYPE; - pDFUFuncDesc->bmAttributes = USBD_DFU_BM_ATTRIBUTES; - pDFUFuncDesc->wDetachTimeout = USBD_DFU_DETACH_TIMEOUT; - pDFUFuncDesc->wTransferSze = USBD_DFU_XFER_SIZE; - pDFUFuncDesc->bcdDFUVersion = 0x011AU; - *Sze += (uint32_t)sizeof(USBD_DFUFuncDescTypeDef); - - /* Update Config Descriptor and IAD descriptor */ - ((USBD_ConfigDescTypeDef *)pConf)->bNumInterfaces += 1U; - ((USBD_ConfigDescTypeDef *)pConf)->wTotalLength = (uint16_t)(*Sze); - - UNUSED(idx); -} -#endif /* USBD_CMPSIT_ACTIVATE_DFU == 1 */ - -#if USBD_CMPSIT_ACTIVATE_CDC_ECM == 1 -/** - * @brief USBD_CMPSIT_CDC_ECMDesc - * Configure and Append the CDC_ECM Descriptor - * @param pdev: device instance - * @param pConf: Configuration descriptor pointer - * @param Sze: pointer to the current configuration descriptor size - * @retval None - */ -static void USBD_CMPSIT_CDC_ECMDesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed) -{ - static USBD_IfDescTypeDef *pIfDesc; - static USBD_EpDescTypeDef *pEpDesc; - static USBD_ECMFuncDescTypeDef *pFuncDesc; - static USBD_IadDescTypeDef *pIadDesc; - - static USBD_CDCHeaderFuncDescTypeDef *pHeadDesc; - static USBD_CDCUnionFuncDescTypeDef *pUnionDesc; - -#if USBD_COMPOSITE_USE_IAD == 1 - pIadDesc = ((USBD_IadDescTypeDef *)(pConf + *Sze)); - pIadDesc->bLength = (uint8_t)sizeof(USBD_IadDescTypeDef); - pIadDesc->bDescriptorType = USB_DESC_TYPE_IAD; /* IAD descriptor */ - pIadDesc->bFirstInterface = pdev->tclasslist[pdev->classId].Ifs[0]; - pIadDesc->bInterfaceCount = 2U; /* 2 interfaces */ - pIadDesc->bFunctionClass = 0x02U; - pIadDesc->bFunctionSubClass = 0x06U; - pIadDesc->bFunctionProtocol = 0x00U; - pIadDesc->iFunction = 0U; /* String Index */ - *Sze += (uint32_t)sizeof(USBD_IadDescTypeDef); -#endif /* USBD_COMPOSITE_USE_IAD == 1 */ - - /* Append ECM Interface descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_IF(pdev->tclasslist[pdev->classId].Ifs[0], 0U, 1U, 0x02U, 0x06U, 0U, 0U); - - /* Append ECM header functional descriptor to Configuration descriptor */ - pHeadDesc = ((USBD_CDCHeaderFuncDescTypeDef *)(pConf + *Sze)); - pHeadDesc->bLength = (uint8_t)sizeof(USBD_CDCHeaderFuncDescTypeDef); - pHeadDesc->bDescriptorType = USBD_FUNC_DESCRIPTOR_TYPE; - pHeadDesc->bDescriptorSubtype = 0x00U; - pHeadDesc->bcdCDC = 0x1000U; - *Sze += (uint32_t)sizeof(USBD_CDCHeaderFuncDescTypeDef); - - /* Append ECM functional descriptor to Configuration descriptor */ - pFuncDesc = ((USBD_ECMFuncDescTypeDef *)(pConf + *Sze)); - pFuncDesc->bFunctionLength = (uint8_t)sizeof(USBD_ECMFuncDescTypeDef); - pFuncDesc->bDescriptorType = USBD_FUNC_DESCRIPTOR_TYPE; - pFuncDesc->bDescriptorSubType = USBD_DESC_SUBTYPE_ACM; - pFuncDesc->iMacAddress = CDC_ECM_MAC_STRING_INDEX; - pFuncDesc->bEthernetStatistics3 = CDC_ECM_ETH_STATS_BYTE3; - pFuncDesc->bEthernetStatistics2 = CDC_ECM_ETH_STATS_BYTE2; - pFuncDesc->bEthernetStatistics1 = CDC_ECM_ETH_STATS_BYTE1; - pFuncDesc->bEthernetStatistics0 = CDC_ECM_ETH_STATS_BYTE0; - pFuncDesc->wMaxSegmentSize = CDC_ECM_ETH_MAX_SEGSZE; - pFuncDesc->bNumberMCFiltes = CDC_ECM_ETH_NBR_MACFILTERS; - pFuncDesc->bNumberPowerFiltes = CDC_ECM_ETH_NBR_PWRFILTERS; - *Sze += (uint32_t)sizeof(USBD_ECMFuncDescTypeDef); - - /* Append ECM Union functional descriptor to Configuration descriptor */ - pUnionDesc = ((USBD_CDCUnionFuncDescTypeDef *)(pConf + *Sze)); - pUnionDesc->bLength = (uint8_t)sizeof(USBD_CDCUnionFuncDescTypeDef); - pUnionDesc->bDescriptorType = 0x24U; - pUnionDesc->bDescriptorSubtype = 0x06U; - pUnionDesc->bMasterInterface = pdev->tclasslist[pdev->classId].Ifs[0]; - pUnionDesc->bSlaveInterface = pdev->tclasslist[pdev->classId].Ifs[1]; - *Sze += (uint32_t)sizeof(USBD_CDCUnionFuncDescTypeDef); - - /* Append ECM Communication IN Endpoint Descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP(pdev->tclasslist[pdev->classId].Eps[2].add, USBD_EP_TYPE_INTR, CDC_ECM_CMD_PACKET_SIZE, \ - CDC_ECM_HS_BINTERVAL, CDC_ECM_FS_BINTERVAL); - - /* Append ECM Data class interface descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_IF(pdev->tclasslist[pdev->classId].Ifs[1], 0U, 2U, 0x0AU, 0U, 0U, 0U); - - if (speed == (uint8_t)USBD_SPEED_HIGH) - { - pdev->tclasslist[pdev->classId].CurrPcktSze = CDC_ECM_DATA_HS_MAX_PACKET_SIZE; - } - - /* Append ECM OUT Endpoint Descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP((pdev->tclasslist[pdev->classId].Eps[0].add), (USBD_EP_TYPE_BULK), \ - (pdev->tclasslist[pdev->classId].CurrPcktSze), (CDC_ECM_HS_BINTERVAL), (CDC_ECM_FS_BINTERVAL)); - - /* Append ECM IN Endpoint Descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP((pdev->tclasslist[pdev->classId].Eps[1].add), (USBD_EP_TYPE_BULK), \ - (pdev->tclasslist[pdev->classId].CurrPcktSze), (CDC_ECM_HS_BINTERVAL), (CDC_ECM_FS_BINTERVAL)); - - /* Update Config Descriptor and IAD descriptor */ - ((USBD_ConfigDescTypeDef *)pConf)->bNumInterfaces += 2U; - ((USBD_ConfigDescTypeDef *)pConf)->wTotalLength = (uint16_t)(*Sze); -} -#endif /* USBD_CMPSIT_ACTIVATE_CDC_ECM */ - -#if USBD_CMPSIT_ACTIVATE_AUDIO == 1 -/** - * @brief USBD_CMPSIT_AUDIODesc - * Configure and Append the AUDIO Descriptor - * @param pdev: device instance - * @param pConf: Configuration descriptor pointer - * @param Sze: pointer to the current configuration descriptor size - * @retval None - */ -static void USBD_CMPSIT_AUDIODesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed) -{ - static USBD_IfDescTypeDef *pIfDesc; - static USBD_IadDescTypeDef *pIadDesc; - UNUSED(speed); - - /* Append AUDIO Interface descriptor to Configuration descriptor */ - USBD_SpeakerIfDescTypeDef *pSpIfDesc; - USBD_SpeakerInDescTypeDef *pSpInDesc; - USBD_SpeakerFeatureDescTypeDef *pSpFDesc; - USBD_SpeakerOutDescTypeDef *pSpOutDesc; - USBD_SpeakerStreamIfDescTypeDef *pSpStrDesc; - USBD_SpeakerIIIFormatIfDescTypeDef *pSpIIIDesc; - USBD_SpeakerEndDescTypeDef *pSpEpDesc; - USBD_SpeakerEndStDescTypeDef *pSpEpStDesc; - -#if USBD_COMPOSITE_USE_IAD == 1 - pIadDesc = ((USBD_IadDescTypeDef *)(pConf + *Sze)); - pIadDesc->bLength = (uint8_t)sizeof(USBD_IadDescTypeDef); - pIadDesc->bDescriptorType = USB_DESC_TYPE_IAD; /* IAD descriptor */ - pIadDesc->bFirstInterface = pdev->tclasslist[pdev->classId].Ifs[0]; - pIadDesc->bInterfaceCount = 2U; /* 2 interfaces */ - pIadDesc->bFunctionClass = USB_DEVICE_CLASS_AUDIO; - pIadDesc->bFunctionSubClass = AUDIO_SUBCLASS_AUDIOCONTROL; - pIadDesc->bFunctionProtocol = AUDIO_PROTOCOL_UNDEFINED; - pIadDesc->iFunction = 0U; /* String Index */ - *Sze += (uint32_t)sizeof(USBD_IadDescTypeDef); -#endif /* USBD_COMPOSITE_USE_IAD == 1 */ - - /* Append AUDIO Interface descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_IF(pdev->tclasslist[pdev->classId].Ifs[0], 0U, 0U, USB_DEVICE_CLASS_AUDIO, \ - AUDIO_SUBCLASS_AUDIOCONTROL, AUDIO_PROTOCOL_UNDEFINED, 0U); - - /* Append AUDIO USB Speaker Class-specific AC Interface descriptor to Configuration descriptor */ - pSpIfDesc = ((USBD_SpeakerIfDescTypeDef *)(pConf + *Sze)); - pSpIfDesc->bLength = (uint8_t)sizeof(USBD_IfDescTypeDef); - pSpIfDesc->bDescriptorType = AUDIO_INTERFACE_DESCRIPTOR_TYPE; - pSpIfDesc->bDescriptorSubtype = AUDIO_CONTROL_HEADER; - pSpIfDesc->bcdADC = 0x0100U; - pSpIfDesc->wTotalLength = 0x0027U; - pSpIfDesc->bInCollection = 0x01U; - pSpIfDesc->baInterfaceNr = 0x01U; - *Sze += (uint32_t)sizeof(USBD_IfDescTypeDef); - - /* Append USB Speaker Input Terminal Descriptor to Configuration descriptor*/ - pSpInDesc = ((USBD_SpeakerInDescTypeDef *)(pConf + *Sze)); - pSpInDesc->bLength = (uint8_t)sizeof(USBD_SpeakerInDescTypeDef); - pSpInDesc->bDescriptorType = AUDIO_INTERFACE_DESCRIPTOR_TYPE; - pSpInDesc->bDescriptorSubtype = AUDIO_CONTROL_INPUT_TERMINAL; - pSpInDesc->bTerminalID = 0x01U; - pSpInDesc->wTerminalType = 0x0101U; - pSpInDesc->bAssocTerminal = 0x00U; - pSpInDesc->bNrChannels = 0x01U; - pSpInDesc->wChannelConfig = 0x0000U; - pSpInDesc->iChannelNames = 0x00U; - pSpInDesc->iTerminal = 0x00U; - *Sze += (uint32_t)sizeof(USBD_SpeakerInDescTypeDef); - - /*Append USB Speaker Audio Feature Unit Descriptor to Configuration descriptor */ - pSpFDesc = ((USBD_SpeakerFeatureDescTypeDef *)(pConf + *Sze)); - pSpFDesc->bLength = (uint8_t)sizeof(USBD_SpeakerFeatureDescTypeDef); - pSpFDesc->bDescriptorType = AUDIO_INTERFACE_DESCRIPTOR_TYPE; - pSpFDesc->bDescriptorSubtype = AUDIO_CONTROL_FEATURE_UNIT; - pSpFDesc->bUnitID = AUDIO_OUT_STREAMING_CTRL; - pSpFDesc->bSourceID = 0x01U; - pSpFDesc->bControlSize = 0x01U; - pSpFDesc->bmaControls = AUDIO_CONTROL_MUTE; - pSpFDesc->iTerminal = 0x00U; - *Sze += (uint32_t)sizeof(USBD_SpeakerFeatureDescTypeDef); - - /*Append USB Speaker Output Terminal Descriptor to Configuration descriptor*/ - pSpOutDesc = ((USBD_SpeakerOutDescTypeDef *)(pConf + *Sze)); - pSpOutDesc->bLength = (uint8_t)sizeof(USBD_SpeakerOutDescTypeDef); - pSpOutDesc->bDescriptorType = AUDIO_INTERFACE_DESCRIPTOR_TYPE; - pSpOutDesc->bDescriptorSubtype = AUDIO_CONTROL_OUTPUT_TERMINAL; - pSpOutDesc->bTerminalID = 0x03U; - pSpOutDesc->wTerminalType = 0x0301U; - pSpOutDesc->bAssocTerminal = 0x00U; - pSpOutDesc->bSourceID = 0x02U; - pSpOutDesc->iTerminal = 0x00U; - *Sze += (uint32_t)sizeof(USBD_SpeakerOutDescTypeDef); - - /* USB Speaker Standard AS Interface Descriptor - Audio Streaming Zero Bandwidth */ - /* Interface 1, Alternate Setting 0*/ - __USBD_CMPSIT_SET_IF(pdev->tclasslist[pdev->classId].Ifs[1], 0U, 0U, USB_DEVICE_CLASS_AUDIO, \ - AUDIO_SUBCLASS_AUDIOSTREAMING, AUDIO_PROTOCOL_UNDEFINED, 0U); - - /* USB Speaker Standard AS Interface Descriptor -Audio Streaming Operational */ - /* Interface 1, Alternate Setting 1*/ - __USBD_CMPSIT_SET_IF(pdev->tclasslist[pdev->classId].Ifs[1], 0x01U, 0x01U, USB_DEVICE_CLASS_AUDIO, \ - AUDIO_SUBCLASS_AUDIOSTREAMING, AUDIO_PROTOCOL_UNDEFINED, 0U); - - /* USB Speaker Audio Streaming Interface Descriptor */ - pSpStrDesc = ((USBD_SpeakerStreamIfDescTypeDef *)(pConf + *Sze)); - pSpStrDesc->bLength = (uint8_t)sizeof(USBD_SpeakerStreamIfDescTypeDef); - pSpStrDesc->bDescriptorType = AUDIO_INTERFACE_DESCRIPTOR_TYPE; - pSpStrDesc->bDescriptorSubtype = AUDIO_STREAMING_GENERAL; - pSpStrDesc->bTerminalLink = 0x01U; - pSpStrDesc->bDelay = 0x01U; - pSpStrDesc->wFormatTag = 0x0001U; - *Sze += (uint32_t)sizeof(USBD_SpeakerStreamIfDescTypeDef); - - /* USB Speaker Audio Type III Format Interface Descriptor */ - pSpIIIDesc = ((USBD_SpeakerIIIFormatIfDescTypeDef *)(pConf + *Sze)); - pSpIIIDesc->bLength = (uint8_t)sizeof(USBD_SpeakerIIIFormatIfDescTypeDef); - pSpIIIDesc->bDescriptorType = AUDIO_INTERFACE_DESCRIPTOR_TYPE; - pSpIIIDesc->bDescriptorSubtype = AUDIO_STREAMING_FORMAT_TYPE; - pSpIIIDesc->bFormatType = AUDIO_FORMAT_TYPE_I; - pSpIIIDesc->bNrChannels = 0x02U; - pSpIIIDesc->bSubFrameSize = 0x02U; - pSpIIIDesc->bBitResolution = 16U; - pSpIIIDesc->bSamFreqType = 1U; - pSpIIIDesc->tSamFreq2 = 0x80U; - pSpIIIDesc->tSamFreq1 = 0xBBU; - pSpIIIDesc->tSamFreq0 = 0x00U; - *Sze += (uint32_t)sizeof(USBD_SpeakerIIIFormatIfDescTypeDef); - - /* Endpoint 1 - Standard Descriptor */ - pSpEpDesc = ((USBD_SpeakerEndDescTypeDef *)(pConf + *Sze)); - pSpEpDesc->bLength = 0x09U; - pSpEpDesc->bDescriptorType = USB_DESC_TYPE_ENDPOINT; - pSpEpDesc->bEndpointAddress = pdev->tclasslist[pdev->classId].Eps[0].add; - pSpEpDesc->bmAttributes = USBD_EP_TYPE_ISOC; - pSpEpDesc->wMaxPacketSize = (uint16_t)USBD_AUDIO_GetEpPcktSze(pdev, 0U, 0U); - pSpEpDesc->bInterval = 0x01U; - pSpEpDesc->bRefresh = 0x00U; - pSpEpDesc->bSynchAddress = 0x00U; - *Sze += 0x09U; - - /* Endpoint - Audio Streaming Descriptor*/ - pSpEpStDesc = ((USBD_SpeakerEndStDescTypeDef *)(pConf + *Sze)); - pSpEpStDesc->bLength = (uint8_t)sizeof(USBD_SpeakerEndStDescTypeDef); - pSpEpStDesc->bDescriptorType = AUDIO_ENDPOINT_DESCRIPTOR_TYPE; - pSpEpStDesc->bDescriptor = AUDIO_ENDPOINT_GENERAL; - pSpEpStDesc->bmAttributes = 0x00U; - pSpEpStDesc->bLockDelayUnits = 0x00U; - pSpEpStDesc->wLockDelay = 0x0000U; - *Sze += (uint32_t)sizeof(USBD_SpeakerEndStDescTypeDef); - - /* Update Config Descriptor and IAD descriptor */ - ((USBD_ConfigDescTypeDef *)pConf)->bNumInterfaces += 2U; - ((USBD_ConfigDescTypeDef *)pConf)->wTotalLength = (uint16_t)(*Sze); -} -#endif /* USBD_CMPSIT_ACTIVATE_AUDIO */ - -#if USBD_CMPSIT_ACTIVATE_RNDIS == 1 -/** - * @brief USBD_CMPSIT_MSCDesc - * Configure and Append the CDC_RNDIS Descriptor - * @param pdev: device instance - * @param pConf: Configuration descriptor pointer - * @param Sze: pointer to the current configuration descriptor size - * @retval None - */ -static void USBD_CMPSIT_RNDISDesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed) -{ - static USBD_IfDescTypeDef *pIfDesc; - static USBD_EpDescTypeDef *pEpDesc; - static USBD_CDCHeaderFuncDescTypeDef *pHeadDesc; - static USBD_CDCCallMgmFuncDescTypeDef *pCallMgmDesc; - static USBD_CDCACMFuncDescTypeDef *pACMDesc; - static USBD_CDCUnionFuncDescTypeDef *pUnionDesc; - static USBD_IadDescTypeDef *pIadDesc; - -#if USBD_COMPOSITE_USE_IAD == 1 - pIadDesc = ((USBD_IadDescTypeDef *)(pConf + *Sze)); - pIadDesc->bLength = (uint8_t)sizeof(USBD_IadDescTypeDef); - pIadDesc->bDescriptorType = USB_DESC_TYPE_IAD; /* IAD descriptor */ - pIadDesc->bFirstInterface = pdev->tclasslist[pdev->classId].Ifs[0]; - pIadDesc->bInterfaceCount = 2U; /* 2 interfaces */ - pIadDesc->bFunctionClass = 0xE0U; - pIadDesc->bFunctionSubClass = 0x01U; - pIadDesc->bFunctionProtocol = 0x03U; - pIadDesc->iFunction = 0U; /* String Index */ - *Sze += (uint32_t)sizeof(USBD_IadDescTypeDef); -#endif /* USBD_COMPOSITE_USE_IAD == 1 */ - - /* Control Interface Descriptor */ - __USBD_CMPSIT_SET_IF(pdev->tclasslist[pdev->classId].Ifs[0], 0U, 1U, 0x02, 0x02, 0xFF, 0U); - - /* Control interface headers */ - pHeadDesc = ((USBD_CDCHeaderFuncDescTypeDef *)(pConf + *Sze)); - /* Header Functional Descriptor*/ - pHeadDesc->bLength = (uint8_t)sizeof(USBD_CDCHeaderFuncDescTypeDef); - pHeadDesc->bDescriptorType = 0x24U; - pHeadDesc->bDescriptorSubtype = 0x00U; - pHeadDesc->bcdCDC = 0x0110U; - *Sze += (uint32_t)sizeof(USBD_CDCHeaderFuncDescTypeDef); - - /* Call Management Functional Descriptor*/ - pCallMgmDesc = ((USBD_CDCCallMgmFuncDescTypeDef *)(pConf + *Sze)); - pCallMgmDesc->bLength = (uint8_t)sizeof(USBD_CDCCallMgmFuncDescTypeDef); - pCallMgmDesc->bDescriptorType = 0x24U; - pCallMgmDesc->bDescriptorSubtype = 0x01U; - pCallMgmDesc->bmCapabilities = 0x00U; - pCallMgmDesc->bDataInterface = pdev->tclasslist[pdev->classId].Ifs[1]; - *Sze += (uint32_t)sizeof(USBD_CDCCallMgmFuncDescTypeDef); - - /* ACM Functional Descriptor*/ - pACMDesc = ((USBD_CDCACMFuncDescTypeDef *)(pConf + *Sze)); - pACMDesc->bLength = (uint8_t)sizeof(USBD_CDCACMFuncDescTypeDef); - pACMDesc->bDescriptorType = 0x24U; - pACMDesc->bDescriptorSubtype = 0x02U; - pACMDesc->bmCapabilities = 0x00U; - *Sze += (uint32_t)sizeof(USBD_CDCACMFuncDescTypeDef); - - /* Union Functional Descriptor*/ - pUnionDesc = ((USBD_CDCUnionFuncDescTypeDef *)(pConf + *Sze)); - pUnionDesc->bLength = (uint8_t)sizeof(USBD_CDCUnionFuncDescTypeDef); - pUnionDesc->bDescriptorType = 0x24U; - pUnionDesc->bDescriptorSubtype = 0x06U; - pUnionDesc->bMasterInterface = pdev->tclasslist[pdev->classId].Ifs[0]; - pUnionDesc->bSlaveInterface = pdev->tclasslist[pdev->classId].Ifs[1]; - *Sze += (uint32_t)sizeof(USBD_CDCUnionFuncDescTypeDef); - - /* Append Endpoint descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP(pdev->tclasslist[pdev->classId].Eps[2].add, USBD_EP_TYPE_INTR, \ - CDC_RNDIS_CMD_PACKET_SIZE, CDC_RNDIS_HS_BINTERVAL, CDC_RNDIS_FS_BINTERVAL); - - /* Data Interface Descriptor */ - __USBD_CMPSIT_SET_IF(pdev->tclasslist[pdev->classId].Ifs[1], 0U, 2U, 0x0AU, 0x00U, 0x00U, 0U); - - if (speed == (uint8_t)USBD_SPEED_HIGH) - { - pdev->tclasslist[pdev->classId].CurrPcktSze = CDC_RNDIS_DATA_HS_MAX_PACKET_SIZE; - } - - /* Append Endpoint descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP((pdev->tclasslist[pdev->classId].Eps[0].add), (USBD_EP_TYPE_BULK), \ - (pdev->tclasslist[pdev->classId].CurrPcktSze), (0U), (0U)); - - /* Append Endpoint descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP((pdev->tclasslist[pdev->classId].Eps[1].add), (USBD_EP_TYPE_BULK), \ - (pdev->tclasslist[pdev->classId].CurrPcktSze), (0U), (0U)); - - /* Update Config Descriptor and IAD descriptor */ - ((USBD_ConfigDescTypeDef *)pConf)->bNumInterfaces += 2U; - ((USBD_ConfigDescTypeDef *)pConf)->wTotalLength = (uint16_t)(*Sze); -} -#endif /* USBD_CMPSIT_ACTIVATE_RNDIS == 1 */ - -#if USBD_CMPSIT_ACTIVATE_CUSTOMHID == 1 -/** - * @brief USBD_CMPSIT_CUSTOMHIDDesc - * Configure and Append the MSC Descriptor - * @param pdev: device instance - * @param pConf: Configuration descriptor pointer - * @param Sze: pointer to the current configuration descriptor size - * @retval None - */ -static void USBD_CMPSIT_CUSTOMHIDDesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed) -{ - static USBD_IfDescTypeDef *pIfDesc; - static USBD_EpDescTypeDef *pEpDesc; - static USBD_DescTypeDef *pDesc; - - /* Control Interface Descriptor */ - __USBD_CMPSIT_SET_IF(pdev->tclasslist[pdev->classId].Ifs[0], 0U, 2U, 3U, 0U, 0U, 0U); - - /* Descriptor of CUSTOM_HID */ - pDesc = ((USBD_DescTypeDef *)((uint32_t)pConf + *Sze)); - pDesc->bLength = 0x09U; - pDesc->bDescriptorTypeCHID = CUSTOM_HID_DESCRIPTOR_TYPE; - pDesc->bcdCUSTOM_HID = 0x0111U; - pDesc->bCountryCode = 0x00U; - pDesc->bNumDescriptors = 0x01U; - pDesc->bDescriptorType = 0x22U; -#ifdef USBD_CUSTOMHID_REPORT_DESC_SIZE_ENABLED - pDesc->wItemLength = ((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData[pdev->classId])->wReportDescLen; -#else - pDesc->wItemLength = USBD_CUSTOM_HID_REPORT_DESC_SIZE; -#endif /* USBD_CUSTOMHID_REPORT_DESC_SIZE_ENABLED */ - - *Sze += (uint32_t)sizeof(USBD_DescTypeDef); - - /* Descriptor of Custom HID endpoints */ - /* Append Endpoint descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP(pdev->tclasslist[pdev->classId].Eps[0].add, \ - USBD_EP_TYPE_INTR, CUSTOM_HID_EPIN_SIZE, CUSTOM_HID_HS_BINTERVAL, CUSTOM_HID_FS_BINTERVAL); - - /* Append Endpoint descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP(pdev->tclasslist[pdev->classId].Eps[1].add, \ - USBD_EP_TYPE_INTR, CUSTOM_HID_EPOUT_SIZE, CUSTOM_HID_HS_BINTERVAL, CUSTOM_HID_FS_BINTERVAL); - - /* Update Config Descriptor and IAD descriptor */ - ((USBD_ConfigDescTypeDef *)pConf)->bNumInterfaces += 1U; - ((USBD_ConfigDescTypeDef *)pConf)->wTotalLength = (uint16_t)(*Sze); -} -#endif /* USBD_CMPSIT_ACTIVATE_CUSTOMHID == 1U */ - -#if USBD_CMPSIT_ACTIVATE_VIDEO == 1 -/** - * @brief USBD_CMPSIT_VIDEODesc - * Configure and Append the VIDEO Descriptor - * @param pdev: device instance - * @param pConf: Configuration descriptor pointer - * @param Sze: pointer to the current configuration descriptor size - * @retval None - */ -static void USBD_CMPSIT_VIDEODesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed) -{ -#ifdef USBD_UVC_FORMAT_UNCOMPRESSED - __ALIGN_BEGIN static uint8_t usbd_uvc_guid[16] __ALIGN_END = {DBVAL(UVC_UNCOMPRESSED_GUID), 0x00, 0x00, 0x10, - 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 - }; -#endif /* USBD_UVC_FORMAT_UNCOMPRESSED */ - static USBD_IfDescTypeDef *pIfDesc; - static USBD_IadDescTypeDef *pIadDesc; - - /* Append AUDIO Interface descriptor to Configuration descriptor */ - USBD_specificVCInDescTypeDef *pSVCInDesc; - USBD_InputTerminalDescTypeDef *pInTerDesc; - USBD_OutputTerminalDescTypeDef *pOuTerDesc; - USBD_ClassSpecificVsHeaderDescTypeDef *pSpHeaDesc; - USBD_PayloadFormatDescTypeDef *pPayForDesc; -#ifdef USBD_UVC_FORMAT_UNCOMPRESSED - USBD_ColorMatchingDescTypeDef *pColMaDesc; -#endif /* USBD_UVC_FORMAT_UNCOMPRESSED */ - USBD_StandardVCDataEPDescTypeDef *pSVCDEP; - USBD_VIDEO_VSFrameDescTypeDef *pClassSpecVS; - -#if USBD_COMPOSITE_USE_IAD == 1 - pIadDesc = ((USBD_IadDescTypeDef *)(pConf + *Sze)); - pIadDesc->bLength = (uint8_t)sizeof(USBD_IadDescTypeDef); - pIadDesc->bDescriptorType = USB_DESC_TYPE_IAD; /* IAD descriptor */ - pIadDesc->bFirstInterface = pdev->tclasslist[pdev->classId].Ifs[0]; - pIadDesc->bInterfaceCount = 2U; /* 2 interfaces */ - pIadDesc->bFunctionClass = UVC_CC_VIDEO; - pIadDesc->bFunctionSubClass = SC_VIDEO_INTERFACE_COLLECTION; - pIadDesc->bFunctionProtocol = PC_PROTOCOL_UNDEFINED; - pIadDesc->iFunction = 0U; /* String Index */ - *Sze += (uint32_t)sizeof(USBD_IadDescTypeDef); -#endif /* USBD_COMPOSITE_USE_IAD == 1 */ - - /* Append VIDEO Interface descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_IF(pdev->tclasslist[pdev->classId].Ifs[0], 0U, 0U, UVC_CC_VIDEO, 1U, PC_PROTOCOL_UNDEFINED, 0U); - - /* Append Class-specific VC Interface Descriptor to Configuration descriptor*/ - pSVCInDesc = ((USBD_specificVCInDescTypeDef *)(pConf + *Sze)); - pSVCInDesc->bLength = (uint8_t)sizeof(USBD_specificVCInDescTypeDef); - pSVCInDesc->bDescriptorType = CS_INTERFACE; - pSVCInDesc->bDescriptorSubtype = VC_HEADER; - pSVCInDesc->bcdUVC = UVC_VERSION; - pSVCInDesc->wTotalLength = 0x001EU; - pSVCInDesc->dwClockFrequency = 0x02DC6C00U; - pSVCInDesc->baInterfaceNr = 0x01U; - pSVCInDesc->iTerminal = 0x01U; - *Sze += (uint32_t)sizeof(USBD_specificVCInDescTypeDef); - - /*Append Input Terminal Descriptor to Configuration descriptor */ - pInTerDesc = ((USBD_InputTerminalDescTypeDef *)(pConf + *Sze)); - pInTerDesc->bLength = (uint8_t)sizeof(USBD_InputTerminalDescTypeDef); - pInTerDesc->bDescriptorType = CS_INTERFACE; - pInTerDesc->bDescriptorSubtype = VC_INPUT_TERMINAL; - pInTerDesc->bTerminalID = 0x01U; - pInTerDesc->wTerminalType = ITT_VENDOR_SPECIFIC; - pInTerDesc->bAssocTerminal = 0x00U; - pInTerDesc->iTerminal = 0x00U; - *Sze += (uint32_t)sizeof(USBD_InputTerminalDescTypeDef); - - /* Append Output Terminal Descriptor to Configuration descriptor */ - pOuTerDesc = ((USBD_OutputTerminalDescTypeDef *)(pConf + *Sze)); - pOuTerDesc->bLength = (uint8_t)sizeof(USBD_OutputTerminalDescTypeDef); - pOuTerDesc->bDescriptorType = CS_INTERFACE; - pOuTerDesc->bDescriptorSubtype = VC_OUTPUT_TERMINAL; - pOuTerDesc->bTerminalID = 0x02U; - pOuTerDesc->wTerminalType = TT_STREAMING; - pOuTerDesc->bAssocTerminal = 0x00U; - pOuTerDesc->bSourceID = 0x01U; - pOuTerDesc->iTerminal = 0x00U; - *Sze += (uint32_t)sizeof(USBD_OutputTerminalDescTypeDef); - - /* Standard VS (Video Streaming) Interface Descriptor */ - /* Interface 1, Alternate Setting 0 = Zero Bandwidth*/ - __USBD_CMPSIT_SET_IF(pdev->tclasslist[pdev->classId].Ifs[1], 0U, 0U, UVC_CC_VIDEO, \ - SC_VIDEOSTREAMING, PC_PROTOCOL_UNDEFINED, 0U); - - /* Append Class-specific VS Header Descriptor (Input) to Configuration descriptor */ - pSpHeaDesc = ((USBD_ClassSpecificVsHeaderDescTypeDef *)(pConf + *Sze)); - pSpHeaDesc->bLength = (uint8_t)sizeof(USBD_ClassSpecificVsHeaderDescTypeDef); - pSpHeaDesc->bDescriptorType = CS_INTERFACE; - pSpHeaDesc->bDescriptorSubtype = VS_INPUT_HEADER; - pSpHeaDesc->bNumFormats = 0x4D01U; - pSpHeaDesc->bVideoControlSize = 0x00U; - pSpHeaDesc->bEndPointAddress = UVC_IN_EP; - pSpHeaDesc->bmInfo = 0x00U; - pSpHeaDesc->bTerminalLink = 0x02U; - pSpHeaDesc->bStillCaptureMethod = 0x00U; - pSpHeaDesc->bTriggerSupport = 0x00U; - pSpHeaDesc->bTriggerUsage = 0x00U; - pSpHeaDesc->bControlSize = 0x01U; - pSpHeaDesc->bmaControls = 0x00U; - *Sze += (uint32_t)sizeof(USBD_ClassSpecificVsHeaderDescTypeDef); - - /* Append Payload Format Descriptor to Configuration descriptor */ - pPayForDesc = ((USBD_PayloadFormatDescTypeDef *)(pConf + *Sze)); - pPayForDesc->bLength = (uint8_t)sizeof(USBD_PayloadFormatDescTypeDef); - pPayForDesc->bDescriptorType = CS_INTERFACE; - pPayForDesc->bDescriptorSubType = VS_FORMAT_SUBTYPE; - pPayForDesc->bFormatIndex = 0x01U; - pPayForDesc->bNumFrameDescriptor = 0x01U; -#ifdef USBD_UVC_FORMAT_UNCOMPRESSED - (void)USBD_memcpy(pPayForDesc->pGiudFormat, usbd_uvc_guid, 16); - pPayForDesc->bBitsPerPixel = UVC_BITS_PER_PIXEL; -#else - pPayForDesc->bmFlags = 0x01U; -#endif /* USBD_UVC_FORMAT_UNCOMPRESSED */ - pPayForDesc->bDefaultFrameIndex = 0x01U; - pPayForDesc->bAspectRatioX = 0x00U; - pPayForDesc->bAspectRatioY = 0x00U; - pPayForDesc->bInterlaceFlags = 0x00U; - pPayForDesc->bCopyProtect = 0x00U; - *Sze += (uint32_t)sizeof(USBD_PayloadFormatDescTypeDef); - - /* Append Class-specific VS (Video Streaming) Frame Descriptor to Configuration descriptor */ - pClassSpecVS = ((USBD_VIDEO_VSFrameDescTypeDef *)(pConf + *Sze)); - pClassSpecVS->bLength = (uint8_t)sizeof(USBD_VIDEO_VSFrameDescTypeDef); - pClassSpecVS->bDescriptorType = CS_INTERFACE; - pClassSpecVS->bDescriptorSubType = VS_FRAME_SUBTYPE; - pClassSpecVS->bFrameIndex = 0x01U; - -#ifdef USBD_UVC_FORMAT_UNCOMPRESSED - pClassSpecVS->bmCapabilities = 0x00U; -#else - pClassSpecVS->bmCapabilities = 0x02U; -#endif /* USBD_UVC_FORMAT_UNCOMPRESSED */ - - pClassSpecVS->wWidth = UVC_WIDTH; - pClassSpecVS->wHeight = UVC_HEIGHT; - - if (speed == (uint8_t)USBD_SPEED_HIGH) - { - pClassSpecVS->dwMinBitRate = UVC_MIN_BIT_RATE(UVC_CAM_FPS_HS); - pClassSpecVS->dwMaxBitRate = UVC_MAX_BIT_RATE(UVC_CAM_FPS_HS); - pClassSpecVS->dwDefaultFrameInterval = UVC_INTERVAL(UVC_CAM_FPS_HS); - pClassSpecVS->dwMinFrameInterval = UVC_INTERVAL(UVC_CAM_FPS_HS); - } - else - { - pClassSpecVS->dwMinBitRate = UVC_MIN_BIT_RATE(UVC_CAM_FPS_FS); - pClassSpecVS->dwMaxBitRate = UVC_MAX_BIT_RATE(UVC_CAM_FPS_FS); - pClassSpecVS->dwDefaultFrameInterval = UVC_INTERVAL(UVC_CAM_FPS_FS); - pClassSpecVS->dwMinFrameInterval = UVC_INTERVAL(UVC_CAM_FPS_FS); - } - - pClassSpecVS->dwMaxVideoFrameBufSize = UVC_MAX_FRAME_SIZE; - pClassSpecVS->bFrameIntervalType = 0x01U; - - *Sze += (uint32_t)sizeof(USBD_VIDEO_VSFrameDescTypeDef); - -#ifdef USBD_UVC_FORMAT_UNCOMPRESSED - /* Append Color Matching Descriptor to Configuration descriptor */ - pColMaDesc = ((USBD_ColorMatchingDescTypeDef *)(pConf + *Sze)); - pColMaDesc->bLength = (uint8_t)sizeof(USBD_ColorMatchingDescTypeDef); - pColMaDesc->bDescriptorType = CS_INTERFACE; - pColMaDesc->bDescriptorSubType = VS_COLORFORMAT; - pColMaDesc->bColorPrimarie = UVC_COLOR_PRIMARIE; - pColMaDesc->bTransferCharacteristics = UVC_TFR_CHARACTERISTICS; - pColMaDesc->bMatrixCoefficients = UVC_MATRIX_COEFFICIENTS; - *Sze += (uint32_t)sizeof(USBD_ColorMatchingDescTypeDef); -#endif /* USBD_UVC_FORMAT_UNCOMPRESSED */ - - /* USB Standard VS Interface Descriptor - data transfer mode */ - /* Interface 1, Alternate Setting 1*/ - __USBD_CMPSIT_SET_IF(1U, 1U, 1U, UVC_CC_VIDEO, SC_VIDEOSTREAMING, PC_PROTOCOL_UNDEFINED, 0U); - - /* Standard VS (Video Streaming) data Endpoint */ - pSVCDEP = ((USBD_StandardVCDataEPDescTypeDef *)(pConf + *Sze)); - pSVCDEP->bLength = (uint8_t)sizeof(USBD_StandardVCDataEPDescTypeDef); - pSVCDEP->bDescriptorType = USB_DESC_TYPE_ENDPOINT; - pSVCDEP->bEndpointAddress = UVC_IN_EP; - pSVCDEP->bmAttributes = 0x05U; - pSVCDEP->bInterval = 0x01U; - - if (speed == (uint8_t)USBD_SPEED_HIGH) - { - pSVCDEP->wMaxPacketSize = UVC_ISO_HS_MPS; - } - else - { - pSVCDEP->wMaxPacketSize = UVC_ISO_FS_MPS; - } - - *Sze += (uint32_t)sizeof(USBD_StandardVCDataEPDescTypeDef); - - /* Update Config Descriptor and IAD descriptor */ - ((USBD_ConfigDescTypeDef *)pConf)->bNumInterfaces += 2U; - ((USBD_ConfigDescTypeDef *)pConf)->wTotalLength = (uint16_t)(*Sze); -} -#endif /* USBD_CMPSIT_ACTIVATE_VIDEO == 1 */ - -#if USBD_CMPSIT_ACTIVATE_PRINTER == 1 -/** - * @brief USBD_CMPSIT_PRINTERDesc - * Configure and Append the PRINTER Descriptor - * @param pdev: device instance - * @param pConf: Configuration descriptor pointer - * @param Sze: pointer to the current configuration descriptor size - * @retval None - */ -static void USBD_CMPSIT_PRNTDesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed) -{ - static USBD_IfDescTypeDef *pIfDesc; - static USBD_EpDescTypeDef *pEpDesc; - - /* Control Interface Descriptor */ - __USBD_CMPSIT_SET_IF(pdev->tclasslist[pdev->classId].Ifs[0], 0U, 0x02, 0x07, 0x01U, USB_PRNT_BIDIRECTIONAL, 0U); - - if (speed == (uint8_t)USBD_SPEED_HIGH) - { - pdev->tclasslist[pdev->classId].CurrPcktSze = PRNT_DATA_HS_MAX_PACKET_SIZE; - } - - /* Append Endpoint descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP((pdev->tclasslist[pdev->classId].Eps[1].add), \ - (USBD_EP_TYPE_BULK), (pdev->tclasslist[pdev->classId].CurrPcktSze), (0U), (0U)); - - /* Append Endpoint descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP((pdev->tclasslist[pdev->classId].Eps[0].add), \ - (USBD_EP_TYPE_BULK), (pdev->tclasslist[pdev->classId].CurrPcktSze), (0U), (0U)); - - /* Update Config Descriptor and IAD descriptor */ - ((USBD_ConfigDescTypeDef *)pConf)->bNumInterfaces += 1U; - ((USBD_ConfigDescTypeDef *)pConf)->wTotalLength = (uint16_t)(*Sze); -} -#endif /* USBD_CMPSIT_ACTIVATE_PRINTER == 1 */ - -#if USBD_CMPSIT_ACTIVATE_CCID == 1 -/** - * @brief USBD_CMPSIT_CCIDDesc - * Configure and Append the CCID Descriptor - * @param pdev: device instance - * @param pConf: Configuration descriptor pointer - * @param Sze: pointer to the current configuration descriptor size - * @retval None - */ -static void USBD_CMPSIT_CCIDDesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed) -{ - static USBD_IfDescTypeDef *pIfDesc; - static USBD_EpDescTypeDef *pEpDesc; - static USBD_CCID_DescTypeDef *pDesc; - - /* Control Interface Descriptor */ - __USBD_CMPSIT_SET_IF(pdev->tclasslist[pdev->classId].Ifs[0], 0U, 0x03, 0x0BU, 0U, 0U, 0U); - - /* Control interface headers */ - pDesc = ((USBD_CCID_DescTypeDef *)((uint32_t)pConf + *Sze)); - - /* Device Descriptor */ - pDesc->bLength = 0x36U; - pDesc->bDescriptorType = 0x21U; - pDesc->bcdCCID = 0x0110U; - pDesc->bMaxSlotIndex = 0x00U; - pDesc->bVoltageSupport = CCID_VOLTAGE_SUPP; - pDesc->dwProtocols = USBD_CCID_PROTOCOL; - pDesc->dwDefaultClock = USBD_CCID_DEFAULT_CLOCK_FREQ; - pDesc->dwMaximumClock = USBD_CCID_MAX_CLOCK_FREQ; - pDesc->bNumClockSupported = 0x00U; - pDesc->dwDataRate = USBD_CCID_DEFAULT_DATA_RATE; - pDesc->dwMaxDataRate = USBD_CCID_MAX_DATA_RATE; - pDesc->bNumDataRatesSupported = 0x35U; - pDesc->dwMaxIFSD = USBD_CCID_MAX_INF_FIELD_SIZE; - pDesc->dwSynchProtocols = 0U; - pDesc->dwMechanical = 0U; - pDesc->dwFeatures = 0x000104BAU; - pDesc->dwMaxCCIDMessageLength = CCID_MAX_BLOCK_SIZE_HEADER; - pDesc->bClassGetResponse = 0U; - pDesc->bClassEnvelope = 0U; - pDesc->wLcdLayout = 0U; - pDesc->bPINSupport = 0x03U; - pDesc->bMaxCCIDBusySlots = 0x01U; - - *Sze += (uint32_t)sizeof(USBD_CCID_DescTypeDef); - - if (speed == (uint8_t)USBD_SPEED_HIGH) - { - pdev->tclasslist[pdev->classId].CurrPcktSze = CCID_DATA_HS_MAX_PACKET_SIZE; - } - - /* Append Endpoint descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP((pdev->tclasslist[pdev->classId].Eps[0].add), \ - (USBD_EP_TYPE_BULK), (pdev->tclasslist[pdev->classId].CurrPcktSze), (0U), (0U)); - - /* Append Endpoint descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP((pdev->tclasslist[pdev->classId].Eps[1].add), \ - (USBD_EP_TYPE_BULK), (pdev->tclasslist[pdev->classId].CurrPcktSze), (0U), (0U)); - - /* Append Endpoint descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP(pdev->tclasslist[pdev->classId].Eps[2].add, \ - USBD_EP_TYPE_INTR, CCID_CMD_PACKET_SIZE, CCID_CMD_HS_BINTERVAL, CCID_CMD_FS_BINTERVAL); - - /* Update Config Descriptor and IAD descriptor */ - ((USBD_ConfigDescTypeDef *)pConf)->bNumInterfaces += 1U; - ((USBD_ConfigDescTypeDef *)pConf)->wTotalLength = (uint16_t)(*Sze); -} -#endif /* USBD_CMPSIT_ACTIVATE_CCID == 1 */ - -#if USBD_CMPSIT_ACTIVATE_MTP == 1 -/** - * @brief USBD_CMPSIT_MTPDesc - * Configure and Append the MTP Descriptor - * @param pdev: device instance - * @param pConf: Configuration descriptor pointer - * @param Sze: pointer to the current configuration descriptor size - * @retval None - */ -static void USBD_CMPSIT_MTPDesc(USBD_HandleTypeDef *pdev, uint32_t pConf, __IO uint32_t *Sze, uint8_t speed) -{ - USBD_IfDescTypeDef *pIfDesc; - USBD_EpDescTypeDef *pEpDesc; - - /* Append MTP Interface descriptor */ - __USBD_CMPSIT_SET_IF((pdev->tclasslist[pdev->classId].Ifs[0]), (0U), \ - (uint8_t)(pdev->tclasslist[pdev->classId].NumEps), USB_MTP_INTRERFACE_CLASS, \ - USB_MTP_INTRERFACE_SUB_CLASS, USB_MTP_INTRERFACE_PROTOCOL, (0U)); - - if (speed == (uint8_t)USBD_SPEED_HIGH) - { - pdev->tclasslist[pdev->classId].CurrPcktSze = MTP_DATA_MAX_HS_PACKET_SIZE; - } - - /* Append Endpoint descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP((pdev->tclasslist[pdev->classId].Eps[0].add), (USBD_EP_TYPE_BULK), \ - (pdev->tclasslist[pdev->classId].CurrPcktSze), (0U), (0U)); - - /* Append Endpoint descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP((pdev->tclasslist[pdev->classId].Eps[1].add), (USBD_EP_TYPE_BULK), \ - (pdev->tclasslist[pdev->classId].CurrPcktSze), (0U), (0U)); - - /* Append Endpoint descriptor to Configuration descriptor */ - __USBD_CMPSIT_SET_EP(pdev->tclasslist[pdev->classId].Eps[2].add, \ - USBD_EP_TYPE_INTR, MTP_CMD_PACKET_SIZE, MTP_HS_BINTERVAL, MTP_FS_BINTERVAL); - - /* Update Config Descriptor and IAD descriptor */ - ((USBD_ConfigDescTypeDef *)pConf)->bNumInterfaces += 1U; - ((USBD_ConfigDescTypeDef *)pConf)->wTotalLength = (uint16_t)(*Sze); -} -#endif /* USBD_CMPSIT_ACTIVATE_MTP == 1 */ - -/** - * @brief USBD_CMPSIT_SetClassID - * Find and set the class ID relative to selected class type and instance - * @param pdev: device instance - * @param Class: Class type, can be CLASS_TYPE_NONE if requested to find class from setup request - * @param Instance: Instance number of the class (0 if first/unique instance, >0 otherwise) - * @retval The Class ID, The pdev->classId is set with the value of the selected class ID. - */ -uint32_t USBD_CMPSIT_SetClassID(USBD_HandleTypeDef *pdev, USBD_CompositeClassTypeDef Class, uint32_t Instance) -{ - uint32_t idx; - uint32_t inst = 0U; - - /* Unroll all already activated classes */ - for (idx = 0U; idx < pdev->NumClasses; idx++) - { - /* Check if the class correspond to the requested type and if it is active */ - if (((USBD_CompositeClassTypeDef)(pdev->tclasslist[idx].ClassType) == Class) && - ((pdev->tclasslist[idx].Active) == 1U)) - { - if (inst == Instance) - { - /* Set the new class ID */ - pdev->classId = idx; - - /* Return the class ID value */ - return (idx); - } - else - { - /* Increment instance index and look for next instance */ - inst++; - } - } - } - - /* No class found, return 0xFF */ - return 0xFFU; -} - -/** - * @brief USBD_CMPSIT_GetClassID - * Returns the class ID relative to selected class type and instance - * @param pdev: device instance - * @param Class: Class type, can be CLASS_TYPE_NONE if requested to find class from setup request - * @param Instance: Instance number of the class (0 if first/unique instance, >0 otherwise) - * @retval The Class ID (this function does not set the pdev->classId field. - */ -uint32_t USBD_CMPSIT_GetClassID(USBD_HandleTypeDef *pdev, USBD_CompositeClassTypeDef Class, uint32_t Instance) -{ - uint32_t idx; - uint32_t inst = 0U; - - /* Unroll all already activated classes */ - for (idx = 0U; idx < pdev->NumClasses; idx++) - { - /* Check if the class correspond to the requested type and if it is active */ - if (((USBD_CompositeClassTypeDef)(pdev->tclasslist[idx].ClassType) == Class) && - ((pdev->tclasslist[idx].Active) == 1U)) - { - if (inst == Instance) - { - /* Return the class ID value */ - return (idx); - } - else - { - /* Increment instance index and look for next instance */ - inst++; - } - } - } - - /* No class found, return 0xFF */ - return 0xFFU; -} - -/** - * @brief USBD_CMPST_ClearConfDesc - * Reset the configuration descriptor - * @param pdev: device instance (reserved for future use) - * @retval Status. - */ -uint8_t USBD_CMPST_ClearConfDesc(USBD_HandleTypeDef *pdev) -{ - UNUSED(pdev); - - /* Reset the configuration descriptor pointer to default value and its size to zero */ - pCmpstFSConfDesc = USBD_CMPSIT_FSCfgDesc; - CurrFSConfDescSz = 0U; - -#ifdef USE_USB_HS - pCmpstHSConfDesc = USBD_CMPSIT_HSCfgDesc; - CurrHSConfDescSz = 0U; -#endif /* USE_USB_HS */ - - /* All done, can't fail */ - return (uint8_t)USBD_OK; -} - -#endif /* USE_USBD_COMPOSITE */ - -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - - diff --git a/Class/CustomHID/Inc/usbd_customhid.h b/Class/CustomHID/Inc/usbd_customhid.h deleted file mode 100644 index f81a708..0000000 --- a/Class/CustomHID/Inc/usbd_customhid.h +++ /dev/null @@ -1,205 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_customhid.h - * @author MCD Application Team - * @brief header file for the usbd_customhid.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_CUSTOMHID_H -#define __USB_CUSTOMHID_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_CUSTOM_HID - * @brief This file is the Header file for USBD_customhid.c - * @{ - */ - - -/** @defgroup USBD_CUSTOM_HID_Exported_Defines - * @{ - */ -#ifndef CUSTOM_HID_EPIN_ADDR -#define CUSTOM_HID_EPIN_ADDR 0x81U -#endif /* CUSTOM_HID_EPIN_ADDR */ - -#ifndef CUSTOM_HID_EPIN_SIZE -#define CUSTOM_HID_EPIN_SIZE 0x02U -#endif /* CUSTOM_HID_EPIN_SIZE */ - -#ifndef CUSTOM_HID_EPOUT_ADDR -#define CUSTOM_HID_EPOUT_ADDR 0x01U -#endif /* CUSTOM_HID_EPOUT_ADDR */ - -#ifndef CUSTOM_HID_EPOUT_SIZE -#define CUSTOM_HID_EPOUT_SIZE 0x02U -#endif /* CUSTOM_HID_EPOUT_SIZE*/ - -#define USB_CUSTOM_HID_CONFIG_DESC_SIZ 41U -#define USB_CUSTOM_HID_DESC_SIZ 9U - -#ifndef CUSTOM_HID_HS_BINTERVAL -#define CUSTOM_HID_HS_BINTERVAL 0x05U -#endif /* CUSTOM_HID_HS_BINTERVAL */ - -#ifndef CUSTOM_HID_FS_BINTERVAL -#define CUSTOM_HID_FS_BINTERVAL 0x05U -#endif /* CUSTOM_HID_FS_BINTERVAL */ - -#ifndef USBD_CUSTOMHID_OUTREPORT_BUF_SIZE -#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE 0x02U -#endif /* USBD_CUSTOMHID_OUTREPORT_BUF_SIZE */ - -#ifndef USBD_CUSTOM_HID_REPORT_DESC_SIZE -#define USBD_CUSTOM_HID_REPORT_DESC_SIZE 163U -#endif /* USBD_CUSTOM_HID_REPORT_DESC_SIZE */ - -#define CUSTOM_HID_DESCRIPTOR_TYPE 0x21U -#define CUSTOM_HID_REPORT_DESC 0x22U - -#define CUSTOM_HID_REQ_SET_PROTOCOL 0x0BU -#define CUSTOM_HID_REQ_GET_PROTOCOL 0x03U - -#define CUSTOM_HID_REQ_SET_IDLE 0x0AU -#define CUSTOM_HID_REQ_GET_IDLE 0x02U - -#define CUSTOM_HID_REQ_SET_REPORT 0x09U -#define CUSTOM_HID_REQ_GET_REPORT 0x01U -/** - * @} - */ - - -/** @defgroup USBD_CORE_Exported_TypesDefinitions - * @{ - */ -typedef enum -{ - CUSTOM_HID_IDLE = 0U, - CUSTOM_HID_BUSY, -} CUSTOM_HID_StateTypeDef; - -typedef struct _USBD_CUSTOM_HID_Itf -{ - uint8_t *pReport; -#ifdef USBD_CUSTOMHID_REPORT_DESC_SIZE_ENABLED - uint16_t wReportDescLen; -#endif /* USBD_CUSTOMHID_REPORT_DESC_SIZE_ENABLED */ - int8_t (* Init)(void); - int8_t (* DeInit)(void); -#ifdef USBD_CUSTOMHID_REPORT_BUFFER_EVENT_ENABLED - int8_t (* OutEvent)(uint8_t *report_buffer); -#else - int8_t (* OutEvent)(uint8_t event_idx, uint8_t state); -#endif /* USBD_CUSTOMHID_REPORT_BUFFER_EVENT_ENABLED */ -#ifdef USBD_CUSTOMHID_CTRL_REQ_COMPLETE_CALLBACK_ENABLED - int8_t (* CtrlReqComplete)(uint8_t request, uint16_t wLength); -#endif /* USBD_CUSTOMHID_CTRL_REQ_COMPLETE_CALLBACK_ENABLED */ -#ifdef USBD_CUSTOMHID_CTRL_REQ_GET_REPORT_ENABLED - uint8_t *(* GetReport)(uint16_t *ReportLength); -#endif /* USBD_CUSTOMHID_CTRL_REQ_GET_REPORT_ENABLED */ -} USBD_CUSTOM_HID_ItfTypeDef; - -typedef struct -{ - uint8_t Report_buf[USBD_CUSTOMHID_OUTREPORT_BUF_SIZE]; - uint32_t Protocol; - uint32_t IdleState; - uint32_t AltSetting; - uint32_t IsReportAvailable; - CUSTOM_HID_StateTypeDef state; -} USBD_CUSTOM_HID_HandleTypeDef; - -/* - * HID Class specification version 1.1 - * 6.2.1 HID Descriptor - */ - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorTypeCHID; - uint16_t bcdCUSTOM_HID; - uint8_t bCountryCode; - uint8_t bNumDescriptors; - uint8_t bDescriptorType; - uint16_t wItemLength; -} __PACKED USBD_DescTypeDef; - -/** - * @} - */ - - - -/** @defgroup USBD_CORE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Exported_Variables - * @{ - */ - -extern USBD_ClassTypeDef USBD_CUSTOM_HID; -#define USBD_CUSTOM_HID_CLASS &USBD_CUSTOM_HID -/** - * @} - */ - -/** @defgroup USB_CORE_Exported_Functions - * @{ - */ -#ifdef USE_USBD_COMPOSITE -uint8_t USBD_CUSTOM_HID_SendReport(USBD_HandleTypeDef *pdev, - uint8_t *report, uint16_t len, uint8_t ClassId); -#else -uint8_t USBD_CUSTOM_HID_SendReport(USBD_HandleTypeDef *pdev, - uint8_t *report, uint16_t len); -#endif /* USE_USBD_COMPOSITE */ -uint8_t USBD_CUSTOM_HID_ReceivePacket(USBD_HandleTypeDef *pdev); - -uint8_t USBD_CUSTOM_HID_RegisterInterface(USBD_HandleTypeDef *pdev, - USBD_CUSTOM_HID_ItfTypeDef *fops); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_CUSTOMHID_H */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/Class/CustomHID/Inc/usbd_customhid_if_template.h b/Class/CustomHID/Inc/usbd_customhid_if_template.h deleted file mode 100644 index e2a04af..0000000 --- a/Class/CustomHID/Inc/usbd_customhid_if_template.h +++ /dev/null @@ -1,41 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_customhid_if_template.h - * @author MCD Application Team - * @brief Header for usbd_customhid_if_template.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CUSTOMHID_IF_TEMPLATE_H -#define __USBD_CUSTOMHID_IF_TEMPLATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_customhid.h" - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ -extern USBD_CUSTOM_HID_ItfTypeDef USBD_CustomHID_template_fops; - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_CUSTOMHID_IF_TEMPLATE_H */ - diff --git a/Class/CustomHID/Src/usbd_customhid.c b/Class/CustomHID/Src/usbd_customhid.c deleted file mode 100644 index 83de04d..0000000 --- a/Class/CustomHID/Src/usbd_customhid.c +++ /dev/null @@ -1,833 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_customhid.c - * @author MCD Application Team - * @brief This file provides the CUSTOM_HID core functions. - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - * @verbatim - * - * =================================================================== - * CUSTOM_HID Class Description - * =================================================================== - * This module manages the CUSTOM_HID class V1.11 following the "Device Class Definition - * for Human Interface Devices (CUSTOM_HID) Version 1.11 Jun 27, 2001". - * This driver implements the following aspects of the specification: - * - The Boot Interface Subclass - * - Usage Page : Generic Desktop - * - Usage : Vendor - * - Collection : Application - * - * @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 - * - ****************************************************************************** - */ - -/* BSPDependencies -- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c" -- "stm32xxxxx_{eval}{discovery}_io.c" -EndBSPDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_customhid.h" -#include "usbd_ctlreq.h" - - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_CUSTOM_HID - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_CUSTOM_HID_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_CUSTOM_HID_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_CUSTOM_HID_Private_Macros - * @{ - */ -/** - * @} - */ -/** @defgroup USBD_CUSTOM_HID_Private_FunctionPrototypes - * @{ - */ - -static uint8_t USBD_CUSTOM_HID_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_CUSTOM_HID_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_CUSTOM_HID_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); - -static uint8_t USBD_CUSTOM_HID_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_CUSTOM_HID_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_CUSTOM_HID_EP0_RxReady(USBD_HandleTypeDef *pdev); -#ifndef USE_USBD_COMPOSITE -static uint8_t *USBD_CUSTOM_HID_GetFSCfgDesc(uint16_t *length); -static uint8_t *USBD_CUSTOM_HID_GetHSCfgDesc(uint16_t *length); -static uint8_t *USBD_CUSTOM_HID_GetOtherSpeedCfgDesc(uint16_t *length); -static uint8_t *USBD_CUSTOM_HID_GetDeviceQualifierDesc(uint16_t *length); -#endif /* USE_USBD_COMPOSITE */ -/** - * @} - */ - -/** @defgroup USBD_CUSTOM_HID_Private_Variables - * @{ - */ - -USBD_ClassTypeDef USBD_CUSTOM_HID = -{ - USBD_CUSTOM_HID_Init, - USBD_CUSTOM_HID_DeInit, - USBD_CUSTOM_HID_Setup, - NULL, /*EP0_TxSent*/ - USBD_CUSTOM_HID_EP0_RxReady, /*EP0_RxReady*/ /* STATUS STAGE IN */ - USBD_CUSTOM_HID_DataIn, /*DataIn*/ - USBD_CUSTOM_HID_DataOut, - NULL, /*SOF */ - NULL, - NULL, -#ifdef USE_USBD_COMPOSITE - NULL, - NULL, - NULL, - NULL, -#else - USBD_CUSTOM_HID_GetHSCfgDesc, - USBD_CUSTOM_HID_GetFSCfgDesc, - USBD_CUSTOM_HID_GetOtherSpeedCfgDesc, - USBD_CUSTOM_HID_GetDeviceQualifierDesc, -#endif /* USE_USBD_COMPOSITE */ -}; - -#ifndef USE_USBD_COMPOSITE -/* USB CUSTOM_HID device FS Configuration Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgDesc[USB_CUSTOM_HID_CONFIG_DESC_SIZ] __ALIGN_END = -{ - 0x09, /* bLength: Configuration Descriptor size */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - LOBYTE(USB_CUSTOM_HID_CONFIG_DESC_SIZ), /* wTotalLength: Bytes returned */ - HIBYTE(USB_CUSTOM_HID_CONFIG_DESC_SIZ), - 0x01, /* bNumInterfaces: 1 interface */ - 0x01, /* bConfigurationValue: Configuration value */ - 0x00, /* iConfiguration: Index of string descriptor - describing the configuration */ -#if (USBD_SELF_POWERED == 1U) - 0xC0, /* bmAttributes: Bus Powered according to user configuration */ -#else - 0x80, /* bmAttributes: Bus Powered according to user configuration */ -#endif /* USBD_SELF_POWERED */ - USBD_MAX_POWER, /* MaxPower (mA) */ - - /************** Descriptor of CUSTOM HID interface ****************/ - /* 09 */ - 0x09, /* bLength: Interface Descriptor size*/ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints*/ - 0x03, /* bInterfaceClass: CUSTOM_HID */ - 0x00, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ - 0x00, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ - 0x00, /* iInterface: Index of string descriptor */ - /******************** Descriptor of CUSTOM_HID *************************/ - /* 18 */ - 0x09, /* bLength: CUSTOM_HID Descriptor size */ - CUSTOM_HID_DESCRIPTOR_TYPE, /* bDescriptorType: CUSTOM_HID */ - 0x11, /* bCUSTOM_HIDUSTOM_HID: CUSTOM_HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of CUSTOM_HID class descriptors - to follow */ - 0x22, /* bDescriptorType */ - LOBYTE(USBD_CUSTOM_HID_REPORT_DESC_SIZE), /* wItemLength: Total length of Report descriptor */ - HIBYTE(USBD_CUSTOM_HID_REPORT_DESC_SIZE), - /******************** Descriptor of Custom HID endpoints ********************/ - /* 27 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: */ - - CUSTOM_HID_EPIN_ADDR, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - LOBYTE(CUSTOM_HID_EPIN_SIZE), /* wMaxPacketSize: 2 Bytes max */ - HIBYTE(CUSTOM_HID_EPIN_SIZE), - CUSTOM_HID_FS_BINTERVAL, /* bInterval: Polling Interval */ - /* 34 */ - - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: */ - CUSTOM_HID_EPOUT_ADDR, /* bEndpointAddress: Endpoint Address (OUT) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - LOBYTE(CUSTOM_HID_EPOUT_SIZE), /* wMaxPacketSize: 2 Bytes max */ - HIBYTE(CUSTOM_HID_EPOUT_SIZE), - CUSTOM_HID_FS_BINTERVAL, /* bInterval: Polling Interval */ - /* 41 */ -}; -#endif /* USE_USBD_COMPOSITE */ - -/* USB CUSTOM_HID device Configuration Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_Desc[USB_CUSTOM_HID_DESC_SIZ] __ALIGN_END = -{ - /* 18 */ - 0x09, /* bLength: CUSTOM_HID Descriptor size */ - CUSTOM_HID_DESCRIPTOR_TYPE, /* bDescriptorType: CUSTOM_HID */ - 0x11, /* bCUSTOM_HIDUSTOM_HID: CUSTOM_HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of CUSTOM_HID class descriptors - to follow */ - 0x22, /* bDescriptorType */ - LOBYTE(USBD_CUSTOM_HID_REPORT_DESC_SIZE), /* wItemLength: Total length of Report descriptor */ - HIBYTE(USBD_CUSTOM_HID_REPORT_DESC_SIZE), -}; - -#ifndef USE_USBD_COMPOSITE -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = -{ - USB_LEN_DEV_QUALIFIER_DESC, - USB_DESC_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x01, - 0x00, -}; -#endif /* USE_USBD_COMPOSITE */ - -static uint8_t CUSTOMHIDInEpAdd = CUSTOM_HID_EPIN_ADDR; -static uint8_t CUSTOMHIDOutEpAdd = CUSTOM_HID_EPOUT_ADDR; -/** - * @} - */ - -/** @defgroup USBD_CUSTOM_HID_Private_Functions - * @{ - */ - -/** - * @brief USBD_CUSTOM_HID_Init - * Initialize the CUSTOM_HID interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_CUSTOM_HID_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - USBD_CUSTOM_HID_HandleTypeDef *hhid; - - hhid = (USBD_CUSTOM_HID_HandleTypeDef *)USBD_malloc(sizeof(USBD_CUSTOM_HID_HandleTypeDef)); - - if (hhid == NULL) - { - pdev->pClassDataCmsit[pdev->classId] = NULL; - return (uint8_t)USBD_EMEM; - } - - pdev->pClassDataCmsit[pdev->classId] = (void *)hhid; - pdev->pClassData = pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - CUSTOMHIDInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); - CUSTOMHIDOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - pdev->ep_in[CUSTOMHIDInEpAdd & 0xFU].bInterval = CUSTOM_HID_HS_BINTERVAL; - pdev->ep_out[CUSTOMHIDOutEpAdd & 0xFU].bInterval = CUSTOM_HID_HS_BINTERVAL; - } - else /* LOW and FULL-speed endpoints */ - { - pdev->ep_in[CUSTOMHIDInEpAdd & 0xFU].bInterval = CUSTOM_HID_FS_BINTERVAL; - pdev->ep_out[CUSTOMHIDOutEpAdd & 0xFU].bInterval = CUSTOM_HID_FS_BINTERVAL; - } - - /* Open EP IN */ - (void)USBD_LL_OpenEP(pdev, CUSTOMHIDInEpAdd, USBD_EP_TYPE_INTR, - CUSTOM_HID_EPIN_SIZE); - - pdev->ep_in[CUSTOMHIDInEpAdd & 0xFU].is_used = 1U; - - if (USBD_CUSTOMHID_OUTREPORT_BUF_SIZE < CUSTOM_HID_EPOUT_SIZE) - { - return (uint8_t)USBD_FAIL; - } - - /* Open EP OUT */ - (void)USBD_LL_OpenEP(pdev, CUSTOMHIDOutEpAdd, USBD_EP_TYPE_INTR, - CUSTOM_HID_EPOUT_SIZE); - - pdev->ep_out[CUSTOMHIDOutEpAdd & 0xFU].is_used = 1U; - - hhid->state = CUSTOM_HID_IDLE; - - ((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData[pdev->classId])->Init(); - -#ifndef USBD_CUSTOMHID_OUT_PREPARE_RECEIVE_DISABLED - /* Prepare Out endpoint to receive 1st packet */ - (void)USBD_LL_PrepareReceive(pdev, CUSTOMHIDOutEpAdd, hhid->Report_buf, - USBD_CUSTOMHID_OUTREPORT_BUF_SIZE); -#endif /* USBD_CUSTOMHID_OUT_PREPARE_RECEIVE_DISABLED */ - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CUSTOM_HID_Init - * DeInitialize the CUSTOM_HID layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_CUSTOM_HID_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - CUSTOMHIDInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); - CUSTOMHIDOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Close CUSTOM_HID EP IN */ - (void)USBD_LL_CloseEP(pdev, CUSTOMHIDInEpAdd); - pdev->ep_in[CUSTOMHIDInEpAdd & 0xFU].is_used = 0U; - pdev->ep_in[CUSTOMHIDInEpAdd & 0xFU].bInterval = 0U; - - /* Close CUSTOM_HID EP OUT */ - (void)USBD_LL_CloseEP(pdev, CUSTOMHIDOutEpAdd); - pdev->ep_out[CUSTOMHIDOutEpAdd & 0xFU].is_used = 0U; - pdev->ep_out[CUSTOMHIDOutEpAdd & 0xFU].bInterval = 0U; - - /* Free allocated memory */ - if (pdev->pClassDataCmsit[pdev->classId] != NULL) - { - ((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData[pdev->classId])->DeInit(); - USBD_free(pdev->pClassDataCmsit[pdev->classId]); - pdev->pClassDataCmsit[pdev->classId] = NULL; - pdev->pClassData = NULL; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CUSTOM_HID_Setup - * Handle the CUSTOM_HID specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t USBD_CUSTOM_HID_Setup(USBD_HandleTypeDef *pdev, - USBD_SetupReqTypedef *req) -{ - USBD_CUSTOM_HID_HandleTypeDef *hhid = (USBD_CUSTOM_HID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint16_t len = 0U; -#ifdef USBD_CUSTOMHID_CTRL_REQ_GET_REPORT_ENABLED - uint16_t ReportLength = 0U; -#endif /* USBD_CUSTOMHID_CTRL_REQ_GET_REPORT_ENABLED */ - uint8_t *pbuf = NULL; - uint16_t status_info = 0U; - USBD_StatusTypeDef ret = USBD_OK; - - if (hhid == NULL) - { - return (uint8_t)USBD_FAIL; - } - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS: - switch (req->bRequest) - { - case CUSTOM_HID_REQ_SET_PROTOCOL: - hhid->Protocol = (uint8_t)(req->wValue); - break; - - case CUSTOM_HID_REQ_GET_PROTOCOL: - (void)USBD_CtlSendData(pdev, (uint8_t *)&hhid->Protocol, 1U); - break; - - case CUSTOM_HID_REQ_SET_IDLE: - hhid->IdleState = (uint8_t)(req->wValue >> 8); - break; - - case CUSTOM_HID_REQ_GET_IDLE: - (void)USBD_CtlSendData(pdev, (uint8_t *)&hhid->IdleState, 1U); - break; - - case CUSTOM_HID_REQ_SET_REPORT: -#ifdef USBD_CUSTOMHID_CTRL_REQ_COMPLETE_CALLBACK_ENABLED - if (((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData[pdev->classId])->CtrlReqComplete != NULL) - { - /* Let the application decide when to enable EP0 to receive the next report */ - ((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData[pdev->classId])->CtrlReqComplete(req->bRequest, - req->wLength); - } -#endif /* USBD_CUSTOMHID_CTRL_REQ_COMPLETE_CALLBACK_ENABLED */ -#ifndef USBD_CUSTOMHID_EP0_OUT_PREPARE_RECEIVE_DISABLED - - if (req->wLength > USBD_CUSTOMHID_OUTREPORT_BUF_SIZE) - { - /* Stall EP0 */ - USBD_CtlError(pdev, req); - return USBD_FAIL; - } - - hhid->IsReportAvailable = 1U; - - (void)USBD_CtlPrepareRx(pdev, hhid->Report_buf, req->wLength); -#endif /* USBD_CUSTOMHID_EP0_OUT_PREPARE_RECEIVE_DISABLED */ - break; -#ifdef USBD_CUSTOMHID_CTRL_REQ_GET_REPORT_ENABLED - case CUSTOM_HID_REQ_GET_REPORT: - if (((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData[pdev->classId])->GetReport != NULL) - { - ReportLength = req->wLength; - - /* Get report data buffer */ - pbuf = ((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData[pdev->classId])->GetReport(&ReportLength); - } - - if ((pbuf != NULL) && (ReportLength != 0U)) - { - len = MIN(ReportLength, req->wLength); - - /* Send the report data over EP0 */ - (void)USBD_CtlSendData(pdev, pbuf, len); - } - else - { -#ifdef USBD_CUSTOMHID_CTRL_REQ_COMPLETE_CALLBACK_ENABLED - if (((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData[pdev->classId])->CtrlReqComplete != NULL) - { - /* Let the application decide what to do, keep EP0 data phase in NAK state and - use USBD_CtlSendData() when data become available or stall the EP0 data phase */ - ((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData[pdev->classId])->CtrlReqComplete(req->bRequest, - req->wLength); - } - else - { - /* Stall EP0 if no data available */ - USBD_CtlError(pdev, req); - } -#else - /* Stall EP0 if no data available */ - USBD_CtlError(pdev, req); -#endif /* USBD_CUSTOMHID_CTRL_REQ_COMPLETE_CALLBACK_ENABLED */ - } - break; -#endif /* USBD_CUSTOMHID_CTRL_REQ_GET_REPORT_ENABLED */ - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - break; - - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_STATUS: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, (uint8_t *)&status_info, 2U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_GET_DESCRIPTOR: - if ((req->wValue >> 8) == CUSTOM_HID_REPORT_DESC) - { - len = MIN(USBD_CUSTOM_HID_REPORT_DESC_SIZE, req->wLength); - pbuf = ((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData[pdev->classId])->pReport; - } - else - { - if ((req->wValue >> 8) == CUSTOM_HID_DESCRIPTOR_TYPE) - { - pbuf = USBD_CUSTOM_HID_Desc; - len = MIN(USB_CUSTOM_HID_DESC_SIZ, req->wLength); - } - } - - if (pbuf != NULL) - { - (void)USBD_CtlSendData(pdev, pbuf, len); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_GET_INTERFACE: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, (uint8_t *)&hhid->AltSetting, 1U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_SET_INTERFACE: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - hhid->AltSetting = (uint8_t)(req->wValue); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_CLEAR_FEATURE: - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - return (uint8_t)ret; -} - -/** - * @brief USBD_CUSTOM_HID_SendReport - * Send CUSTOM_HID Report - * @param pdev: device instance - * @param buff: pointer to report - * @param ClassId: The Class ID - * @retval status - */ -#ifdef USE_USBD_COMPOSITE -uint8_t USBD_CUSTOM_HID_SendReport(USBD_HandleTypeDef *pdev, - uint8_t *report, uint16_t len, uint8_t ClassId) -{ - USBD_CUSTOM_HID_HandleTypeDef *hhid = (USBD_CUSTOM_HID_HandleTypeDef *)pdev->pClassDataCmsit[ClassId]; -#else -uint8_t USBD_CUSTOM_HID_SendReport(USBD_HandleTypeDef *pdev, - uint8_t *report, uint16_t len) -{ - USBD_CUSTOM_HID_HandleTypeDef *hhid = (USBD_CUSTOM_HID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; -#endif /* USE_USBD_COMPOSITE */ - - if (hhid == NULL) - { - return (uint8_t)USBD_FAIL; - } - -#ifdef USE_USBD_COMPOSITE - /* Get Endpoint IN address allocated for this class instance */ - CUSTOMHIDInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, ClassId); -#endif /* USE_USBD_COMPOSITE */ - - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (hhid->state == CUSTOM_HID_IDLE) - { - hhid->state = CUSTOM_HID_BUSY; - (void)USBD_LL_Transmit(pdev, CUSTOMHIDInEpAdd, report, len); - } - else - { - return (uint8_t)USBD_BUSY; - } - } - return (uint8_t)USBD_OK; -} -#ifndef USE_USBD_COMPOSITE -/** - * @brief USBD_CUSTOM_HID_GetFSCfgDesc - * return FS configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CUSTOM_HID_GetFSCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CUSTOM_HID_CfgDesc, CUSTOM_HID_EPIN_ADDR); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CUSTOM_HID_CfgDesc, CUSTOM_HID_EPOUT_ADDR); - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = CUSTOM_HID_EPIN_SIZE; - pEpInDesc->bInterval = CUSTOM_HID_FS_BINTERVAL; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = CUSTOM_HID_EPOUT_SIZE; - pEpOutDesc->bInterval = CUSTOM_HID_FS_BINTERVAL; - } - - *length = (uint16_t)sizeof(USBD_CUSTOM_HID_CfgDesc); - return USBD_CUSTOM_HID_CfgDesc; -} - -/** - * @brief USBD_CUSTOM_HID_GetHSCfgDesc - * return HS configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CUSTOM_HID_GetHSCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CUSTOM_HID_CfgDesc, CUSTOM_HID_EPIN_ADDR); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CUSTOM_HID_CfgDesc, CUSTOM_HID_EPOUT_ADDR); - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = CUSTOM_HID_EPIN_SIZE; - pEpInDesc->bInterval = CUSTOM_HID_HS_BINTERVAL; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = CUSTOM_HID_EPOUT_SIZE; - pEpOutDesc->bInterval = CUSTOM_HID_HS_BINTERVAL; - } - - *length = (uint16_t)sizeof(USBD_CUSTOM_HID_CfgDesc); - return USBD_CUSTOM_HID_CfgDesc; -} - -/** - * @brief USBD_CUSTOM_HID_GetOtherSpeedCfgDesc - * return other speed configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CUSTOM_HID_GetOtherSpeedCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CUSTOM_HID_CfgDesc, CUSTOM_HID_EPIN_ADDR); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CUSTOM_HID_CfgDesc, CUSTOM_HID_EPOUT_ADDR); - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = CUSTOM_HID_EPIN_SIZE; - pEpInDesc->bInterval = CUSTOM_HID_FS_BINTERVAL; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = CUSTOM_HID_EPOUT_SIZE; - pEpOutDesc->bInterval = CUSTOM_HID_FS_BINTERVAL; - } - - *length = (uint16_t)sizeof(USBD_CUSTOM_HID_CfgDesc); - return USBD_CUSTOM_HID_CfgDesc; -} -#endif /* USE_USBD_COMPOSITE */ - -/** - * @brief USBD_CUSTOM_HID_DataIn - * handle data IN Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_CUSTOM_HID_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - UNUSED(epnum); - - /* Ensure that the FIFO is empty before a new transfer, this condition could - be caused by a new transfer before the end of the previous transfer */ - ((USBD_CUSTOM_HID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId])->state = CUSTOM_HID_IDLE; - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_CUSTOM_HID_DataOut - * handle data OUT Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_CUSTOM_HID_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - UNUSED(epnum); - USBD_CUSTOM_HID_HandleTypeDef *hhid; - - if (pdev->pClassDataCmsit[pdev->classId] == NULL) - { - return (uint8_t)USBD_FAIL; - } - - hhid = (USBD_CUSTOM_HID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - /* USB data will be immediately processed, this allow next USB traffic being - NAKed till the end of the application processing */ - -#ifdef USBD_CUSTOMHID_REPORT_BUFFER_EVENT_ENABLED - ((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData[pdev->classId])->OutEvent(hhid->Report_buf); -#else - ((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData[pdev->classId])->OutEvent(hhid->Report_buf[0], - hhid->Report_buf[1]); -#endif /* USBD_CUSTOMHID_REPORT_BUFFER_EVENT_ENABLED */ - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CUSTOM_HID_ReceivePacket - * prepare OUT Endpoint for reception - * @param pdev: device instance - * @retval status - */ -uint8_t USBD_CUSTOM_HID_ReceivePacket(USBD_HandleTypeDef *pdev) -{ - USBD_CUSTOM_HID_HandleTypeDef *hhid; - - if (pdev->pClassDataCmsit[pdev->classId] == NULL) - { - return (uint8_t)USBD_FAIL; - } - -#ifdef USE_USBD_COMPOSITE - /* Get OUT Endpoint address allocated for this class instance */ - CUSTOMHIDOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - hhid = (USBD_CUSTOM_HID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - /* Resume USB Out process */ - (void)USBD_LL_PrepareReceive(pdev, CUSTOMHIDOutEpAdd, hhid->Report_buf, - USBD_CUSTOMHID_OUTREPORT_BUF_SIZE); - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_CUSTOM_HID_EP0_RxReady - * Handles control request data. - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_CUSTOM_HID_EP0_RxReady(USBD_HandleTypeDef *pdev) -{ - USBD_CUSTOM_HID_HandleTypeDef *hhid = (USBD_CUSTOM_HID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hhid == NULL) - { - return (uint8_t)USBD_FAIL; - } - - if (hhid->IsReportAvailable == 1U) - { -#ifdef USBD_CUSTOMHID_REPORT_BUFFER_EVENT_ENABLED - ((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData[pdev->classId])->OutEvent(hhid->Report_buf); -#else - ((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData[pdev->classId])->OutEvent(hhid->Report_buf[0], - hhid->Report_buf[1]); -#endif /* USBD_CUSTOMHID_REPORT_BUFFER_EVENT_ENABLED */ - hhid->IsReportAvailable = 0U; - } - - return (uint8_t)USBD_OK; -} - -#ifndef USE_USBD_COMPOSITE -/** - * @brief DeviceQualifierDescriptor - * return Device Qualifier descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_CUSTOM_HID_GetDeviceQualifierDesc(uint16_t *length) -{ - *length = (uint16_t)sizeof(USBD_CUSTOM_HID_DeviceQualifierDesc); - - return USBD_CUSTOM_HID_DeviceQualifierDesc; -} -#endif /* USE_USBD_COMPOSITE */ -/** - * @brief USBD_CUSTOM_HID_RegisterInterface - * @param pdev: device instance - * @param fops: CUSTOMHID Interface callback - * @retval status - */ -uint8_t USBD_CUSTOM_HID_RegisterInterface(USBD_HandleTypeDef *pdev, - USBD_CUSTOM_HID_ItfTypeDef *fops) -{ - if (fops == NULL) - { - return (uint8_t)USBD_FAIL; - } - - pdev->pUserData[pdev->classId] = fops; - - return (uint8_t)USBD_OK; -} -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - diff --git a/Class/CustomHID/Src/usbd_customhid_if_template.c b/Class/CustomHID/Src/usbd_customhid_if_template.c deleted file mode 100644 index e5a7e73..0000000 --- a/Class/CustomHID/Src/usbd_customhid_if_template.c +++ /dev/null @@ -1,172 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_customhid_if_template.c - * @author MCD Application Team - * @brief USB Device Custom HID interface file. - * This template should be copied to the user folder, renamed and customized - * following user needs. - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* BSPDependencies -- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c" -- "stm32xxxxx_{eval}{discovery}_io.c" -EndBSPDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_customhid_if_template.h" -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ - -static int8_t TEMPLATE_CUSTOM_HID_Init(void); -static int8_t TEMPLATE_CUSTOM_HID_DeInit(void); -#ifdef USBD_CUSTOMHID_REPORT_BUFFER_EVENT_ENABLED -static int8_t TEMPLATE_CUSTOM_HID_OutEvent(uint8_t *report_buffer); -#else -static int8_t TEMPLATE_CUSTOM_HID_OutEvent(uint8_t event_idx, uint8_t state); -#endif /* USBD_CUSTOMHID_REPORT_BUFFER_EVENT_ENABLED */ - -#ifdef USBD_CUSTOMHID_CTRL_REQ_COMPLETE_CALLBACK_ENABLED -static int8_t TEMPLATE_CUSTOM_HID_CtrlReqComplete(uint8_t request, uint16_t wLength); -#endif /* USBD_CUSTOMHID_CTRL_REQ_COMPLETE_CALLBACK_ENABLED */ - -#ifdef USBD_CUSTOMHID_CTRL_REQ_GET_REPORT_ENABLED -static uint8_t *TEMPLATE_CUSTOM_HID_GetReport(uint16_t *ReportLength); -#endif /* USBD_CUSTOMHID_CTRL_REQ_GET_REPORT_ENABLED */ -/* Private variables ---------------------------------------------------------*/ -extern USBD_HandleTypeDef USBD_Device; - -__ALIGN_BEGIN static uint8_t TEMPLATE_CUSTOM_HID_ReportDesc[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END = {0}; - -USBD_CUSTOM_HID_ItfTypeDef USBD_CustomHID_template_fops = -{ - TEMPLATE_CUSTOM_HID_ReportDesc, -#ifdef USBD_CUSTOMHID_REPORT_DESC_SIZE_ENABLED - USBD_CUSTOM_HID_REPORT_DESC_SIZE, -#endif /* USBD_CUSTOMHID_REPORT_DESC_SIZE_ENABLED */ - TEMPLATE_CUSTOM_HID_Init, - TEMPLATE_CUSTOM_HID_DeInit, - TEMPLATE_CUSTOM_HID_OutEvent, -#ifdef USBD_CUSTOMHID_CTRL_REQ_COMPLETE_CALLBACK_ENABLED - TEMPLATE_CUSTOM_HID_CtrlReqComplete, -#endif /* USBD_CUSTOMHID_CTRL_REQ_COMPLETE_CALLBACK_ENABLED */ -#ifdef USBD_CUSTOMHID_CTRL_REQ_GET_REPORT_ENABLED - TEMPLATE_CUSTOM_HID_GetReport, -#endif /* USBD_CUSTOMHID_CTRL_REQ_GET_REPORT_ENABLED */ -}; - -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief TEMPLATE_CUSTOM_HID_Init - * Initializes the CUSTOM HID media low layer - * @param None - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t TEMPLATE_CUSTOM_HID_Init(void) -{ - return (0); -} - -/** - * @brief TEMPLATE_CUSTOM_HID_DeInit - * DeInitializes the CUSTOM HID media low layer - * @param None - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t TEMPLATE_CUSTOM_HID_DeInit(void) -{ - /* - Add your deinitialization code here - */ - return (0); -} - - -/** - * @brief TEMPLATE_CUSTOM_HID_Control - * Manage the CUSTOM HID class events - * @param event_idx: event index - * @param state: event state - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ - -#ifdef USBD_CUSTOMHID_REPORT_BUFFER_EVENT_ENABLED -static int8_t TEMPLATE_CUSTOM_HID_OutEvent(uint8_t *report_buffer) -{ - UNUSED(report_buffer); -#else -static int8_t TEMPLATE_CUSTOM_HID_OutEvent(uint8_t event_idx, uint8_t state) -{ - UNUSED(event_idx); - UNUSED(state); -#endif /* USBD_CUSTOMHID_REPORT_BUFFER_EVENT_ENABLED */ - - /* Start next USB packet transfer once data processing is completed */ - if (USBD_CUSTOM_HID_ReceivePacket(&USBD_Device) != (uint8_t)USBD_OK) - { - return -1; - } - - return (0); -} - -#ifdef USBD_CUSTOMHID_CTRL_REQ_COMPLETE_CALLBACK_ENABLED -/** - * @brief TEMPLATE_CUSTOM_HID_CtrlReqComplete - * Manage the CUSTOM HID control request complete - * @param request: control request - * @param wLength: request wLength - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t TEMPLATE_CUSTOM_HID_CtrlReqComplete(uint8_t request, uint16_t wLength) -{ - UNUSED(wLength); - - switch (request) - { - case CUSTOM_HID_REQ_SET_REPORT: - - break; - - case CUSTOM_HID_REQ_GET_REPORT: - - break; - - default: - break; - } - - return (0); -} -#endif /* USBD_CUSTOMHID_CTRL_REQ_COMPLETE_CALLBACK_ENABLED */ - - -#ifdef USBD_CUSTOMHID_CTRL_REQ_GET_REPORT_ENABLED -/** - * @brief TEMPLATE_CUSTOM_HID_GetReport - * Manage the CUSTOM HID control Get Report request - * @param event_idx: event index - * @param state: event state - * @retval return pointer to HID report - */ -static uint8_t *TEMPLATE_CUSTOM_HID_GetReport(uint16_t *ReportLength) -{ - UNUSED(ReportLength); - uint8_t *pbuff = NULL; - - return (pbuff); -} -#endif /* USBD_CUSTOMHID_CTRL_REQ_GET_REPORT_ENABLED */ diff --git a/Class/DFU/Inc/usbd_dfu.h b/Class/DFU/Inc/usbd_dfu.h deleted file mode 100644 index ab74e24..0000000 --- a/Class/DFU/Inc/usbd_dfu.h +++ /dev/null @@ -1,271 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_dfu.h - * @author MCD Application Team - * @brief Header file for the usbd_dfu.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_DFU_H -#define __USB_DFU_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_DFU - * @brief This file is the Header file for usbd_dfu.c - * @{ - */ - - -/** @defgroup USBD_DFU_Exported_Defines - * @{ - */ -#ifndef USBD_DFU_MAX_ITF_NUM -#define USBD_DFU_MAX_ITF_NUM 1U -#endif /* USBD_DFU_MAX_ITF_NUM */ - -#ifndef USBD_DFU_XFER_SIZE -#define USBD_DFU_XFER_SIZE 1024U -#endif /* USBD_DFU_XFER_SIZE */ - -#ifndef USBD_DFU_APP_DEFAULT_ADD -#define USBD_DFU_APP_DEFAULT_ADD 0x08008000U /* The first sector (32 KB) is reserved for DFU code */ -#endif /* USBD_DFU_APP_DEFAULT_ADD */ - -#ifndef USBD_DFU_BM_ATTRIBUTES -#define USBD_DFU_BM_ATTRIBUTES 0x0BU -#endif /* USBD_DFU_BM_ATTRIBUTES */ - -#ifndef USBD_DFU_DETACH_TIMEOUT -#define USBD_DFU_DETACH_TIMEOUT 0xFFU -#endif /* USBD_DFU_DETACH_TIMEOUT */ - -#define USB_DFU_CONFIG_DESC_SIZ (18U + (9U * USBD_DFU_MAX_ITF_NUM)) -#define USB_DFU_DESC_SIZ 9U - -#define DFU_DESCRIPTOR_TYPE 0x21U - -#define DFU_VENDOR_CMD_MAX 32U - - -/**************************************************/ -/* DFU Requests DFU states */ -/**************************************************/ -#define APP_STATE_IDLE 0U -#define APP_STATE_DETACH 1U -#define DFU_STATE_IDLE 2U -#define DFU_STATE_DNLOAD_SYNC 3U -#define DFU_STATE_DNLOAD_BUSY 4U -#define DFU_STATE_DNLOAD_IDLE 5U -#define DFU_STATE_MANIFEST_SYNC 6U -#define DFU_STATE_MANIFEST 7U -#define DFU_STATE_MANIFEST_WAIT_RESET 8U -#define DFU_STATE_UPLOAD_IDLE 9U -#define DFU_STATE_ERROR 10U - -/**************************************************/ -/* DFU errors */ -/**************************************************/ -#define DFU_ERROR_NONE 0x00U -#define DFU_ERROR_TARGET 0x01U -#define DFU_ERROR_FILE 0x02U -#define DFU_ERROR_WRITE 0x03U -#define DFU_ERROR_ERASE 0x04U -#define DFU_ERROR_CHECK_ERASED 0x05U -#define DFU_ERROR_PROG 0x06U -#define DFU_ERROR_VERIFY 0x07U -#define DFU_ERROR_ADDRESS 0x08U -#define DFU_ERROR_NOTDONE 0x09U -#define DFU_ERROR_FIRMWARE 0x0AU -#define DFU_ERROR_VENDOR 0x0BU -#define DFU_ERROR_USB 0x0CU -#define DFU_ERROR_POR 0x0DU -#define DFU_ERROR_UNKNOWN 0x0EU -#define DFU_ERROR_STALLEDPKT 0x0FU - -/**************************************************/ -/* DFU Manifestation State */ -/**************************************************/ -#define DFU_MANIFEST_COMPLETE 0x00U -#define DFU_MANIFEST_IN_PROGRESS 0x01U - - -/**************************************************/ -/* Special Commands with Download Request */ -/**************************************************/ -#define DFU_CMD_GETCOMMANDS 0x00U -#define DFU_CMD_SETADDRESSPOINTER 0x21U -#define DFU_CMD_ERASE 0x41U - -#define DFU_MEDIA_ERASE 0x00U -#define DFU_MEDIA_PROGRAM 0x01U - -/**************************************************/ -/* Other defines */ -/**************************************************/ -/* Bit Detach capable = bit 3 in bmAttributes field */ -#define DFU_DETACH_MASK (1U << 3) -#define DFU_MANIFEST_MASK (1U << 2) -#define DFU_STATUS_DEPTH 6U - -#define IS_DFU_DOWNLOAD 0x0DFDFU -#define IS_DFU_UPLOAD 0x1DFDFU -#define IS_DFU_SETADDRESSPOINTER 0x2DFDFU -#define IS_DFU_PHY_ADDRESS 0x3DFDFU - -typedef enum -{ - DFU_DETACH = 0U, - DFU_DNLOAD, - DFU_UPLOAD, - DFU_GETSTATUS, - DFU_CLRSTATUS, - DFU_GETSTATE, - DFU_ABORT -} DFU_RequestTypeDef; - -typedef void (*pFunction)(void); - - -/********** Descriptor of DFU interface 0 Alternate setting n ****************/ -#define USBD_DFU_IF_DESC(n) \ - 0x09, /* bLength: Interface Descriptor size */ \ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType */ \ - 0x00, /* bInterfaceNumber: Number of Interface */ \ - (n), /* bAlternateSetting: Alternate setting */ \ - 0x00, /* bNumEndpoints*/ \ - 0xFE, /* bInterfaceClass: Application Specific Class Code */ \ - 0x01, /* bInterfaceSubClass : Device Firmware Upgrade Code */ \ - 0x02, /* nInterfaceProtocol: DFU mode protocol */ \ - USBD_IDX_INTERFACE_STR + (n) + 1U /* iInterface: Index of string descriptor */ - -#define TRANSFER_SIZE_BYTES(size) ((uint8_t)(size)), ((uint8_t)((size) >> 8)) - -#define IS_PROTECTED_AREA(add) (uint8_t)((((add) >= 0x08000000) && ((add) < (APP_DEFAULT_ADD))) ? 1 : 0) - -/** - * @} - */ - - -/** @defgroup USBD_CORE_Exported_TypesDefinitions - * @{ - */ - -typedef struct -{ - union - { - uint32_t d32[USBD_DFU_XFER_SIZE / 4U]; - uint8_t d8[USBD_DFU_XFER_SIZE]; - } buffer; - - uint32_t wblock_num; - uint32_t wlength; - uint32_t data_ptr; - uint32_t app_addr_ptr; - uint32_t alt_setting; - - uint8_t dev_status[DFU_STATUS_DEPTH]; - uint8_t ReservedForAlign[2]; - uint8_t dev_state; - uint8_t manif_state; -} USBD_DFU_HandleTypeDef; - -typedef struct -{ - const uint8_t *pStrDesc; - uint16_t (* Init)(void); - uint16_t (* DeInit)(void); - uint16_t (* Erase)(uint32_t Add); - uint16_t (* Write)(uint8_t *src, uint8_t *dest, uint32_t Len); - uint8_t *(* Read)(uint8_t *src, uint8_t *dest, uint32_t Len); - uint16_t (* GetStatus)(uint32_t Add, uint8_t cmd, uint8_t *buff); -#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U) - uint16_t (* GetVendorCMD)(uint8_t *cmd, uint8_t *cmdlength); - uint16_t (* VendorDownloadCMD)(uint8_t *pbuf, uint32_t BlockNumber, uint32_t wlength, uint32_t *status); - uint16_t (* VendorUploadCMD)(uint32_t Add, uint32_t BlockNumber, uint32_t *status); -#endif /* USBD_DFU_VENDOR_CMD_ENABLED */ -#if (USBD_DFU_VENDOR_CHECK_ENABLED == 1U) - uint16_t (* VendorCheck)(uint8_t *pbuf, uint32_t ReqType, uint32_t *status); -#endif /* USBD_DFU_VENDOR_CHECK_ENABLED */ -#if (USBD_DFU_VENDOR_EXIT_ENABLED == 1U) - uint16_t (* LeaveDFU)(uint32_t Add); -#endif /* USBD_DFU_VENDOR_EXIT_ENABLED */ -} USBD_DFU_MediaTypeDef; - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bmAttributes; - uint16_t wDetachTimeout; - uint16_t wTransferSze; - uint16_t bcdDFUVersion; -} __PACKED USBD_DFUFuncDescTypeDef; - -/** - * @} - */ - - - -/** @defgroup USBD_CORE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Exported_Variables - * @{ - */ - -extern USBD_ClassTypeDef USBD_DFU; -#define USBD_DFU_CLASS &USBD_DFU -/** - * @} - */ - -/** @defgroup USB_CORE_Exported_Functions - * @{ - */ -uint8_t USBD_DFU_RegisterMedia(USBD_HandleTypeDef *pdev, - USBD_DFU_MediaTypeDef *fops); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_DFU_H */ -/** - * @} - */ - -/** - * @} - */ diff --git a/Class/DFU/Inc/usbd_dfu_media_template.h b/Class/DFU/Inc/usbd_dfu_media_template.h deleted file mode 100644 index 7be25d4..0000000 --- a/Class/DFU/Inc/usbd_dfu_media_template.h +++ /dev/null @@ -1,95 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_dfu_media_template.h - * @author MCD Application Team - * @brief header file for the usbd_dfu_media_template.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_DFU_MEDIA_TEMPLATE_H -#define __USBD_DFU_MEDIA_TEMPLATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_dfu.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_MEDIA - * @brief header file for the usbd_dfu_media_template.c file - * @{ - */ - -/** @defgroup USBD_MEDIA_Exported_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_MEDIA_Exported_Types - * @{ - */ - - -/** - * @} - */ - - - -/** @defgroup USBD_MEDIA_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_MEDIA_Exported_Variables - * @{ - */ -extern USBD_DFU_MediaTypeDef USBD_DFU_MEDIA_Template_fops; -/** - * @} - */ - -/** @defgroup USBD_MEDIA_Exported_FunctionsPrototype - * @{ - */ - - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_DFU_MEDIA_TEMPLATE_H */ - -/** - * @} - */ - -/** - * @} - */ diff --git a/Class/DFU/Src/usbd_dfu.c b/Class/DFU/Src/usbd_dfu.c deleted file mode 100644 index 67ba12c..0000000 --- a/Class/DFU/Src/usbd_dfu.c +++ /dev/null @@ -1,1400 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_dfu.c - * @author MCD Application Team - * @brief This file provides the DFU core functions. - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - * @verbatim - * - * =================================================================== - * DFU Class Driver Description - * =================================================================== - * This driver manages the DFU class V1.1 following the "Device Class Specification for - * Device Firmware Upgrade Version 1.1 Aug 5, 2004". - * This driver implements the following aspects of the specification: - * - Device descriptor management - * - Configuration descriptor management - * - Enumeration as DFU device (in DFU mode only) - * - Requests management (supporting ST DFU sub-protocol) - * - Memory operations management (Download/Upload/Erase/Detach/GetState/GetStatus) - * - DFU state machine implementation. - * - * @note - * ST DFU sub-protocol is compliant with DFU protocol and use sub-requests to manage - * memory addressing, commands processing, specific memories operations (ie. Erase) ... - * As required by the DFU specification, only endpoint 0 is used in this application. - * Other endpoints and functions may be added to the application (ie. DFU ...) - * - * These aspects may be enriched or modified for a specific user application. - * - * This driver doesn't implement the following aspects of the specification - * (but it is possible to manage these features with some modifications on this driver): - * - Manifestation Tolerant mode - * - * @endverbatim - * - ****************************************************************************** - */ - -/* BSPDependencies -- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c" -- "stm32xxxxx_{eval}{discovery}_io.c" -EndBSPDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_dfu.h" -#include "usbd_ctlreq.h" - - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_DFU - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_DFU_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_DFU_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_DFU_Private_Macros - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_DFU_Private_FunctionPrototypes - * @{ - */ - -static uint8_t USBD_DFU_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_DFU_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_DFU_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static uint8_t USBD_DFU_EP0_RxReady(USBD_HandleTypeDef *pdev); -static uint8_t USBD_DFU_EP0_TxReady(USBD_HandleTypeDef *pdev); -static uint8_t USBD_DFU_SOF(USBD_HandleTypeDef *pdev); - -#ifndef USE_USBD_COMPOSITE -static uint8_t *USBD_DFU_GetCfgDesc(uint16_t *length); -static uint8_t *USBD_DFU_GetDeviceQualifierDesc(uint16_t *length); -#endif /* USE_USBD_COMPOSITE */ - -#if (USBD_SUPPORT_USER_STRING_DESC == 1U) -static uint8_t *USBD_DFU_GetUsrStringDesc(USBD_HandleTypeDef *pdev, - uint8_t index, uint16_t *length); -#endif /* USBD_SUPPORT_USER_STRING_DESC */ - -static void DFU_Detach(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void DFU_Download(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void DFU_Upload(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void DFU_GetStatus(USBD_HandleTypeDef *pdev); -static void DFU_ClearStatus(USBD_HandleTypeDef *pdev); -static void DFU_GetState(USBD_HandleTypeDef *pdev); -static void DFU_Abort(USBD_HandleTypeDef *pdev); -static void DFU_Leave(USBD_HandleTypeDef *pdev); -static void *USBD_DFU_GetDfuFuncDesc(uint8_t *pConfDesc); - -/** - * @} - */ - -/** @defgroup USBD_DFU_Private_Variables - * @{ - */ - -USBD_ClassTypeDef USBD_DFU = -{ - USBD_DFU_Init, - USBD_DFU_DeInit, - USBD_DFU_Setup, - USBD_DFU_EP0_TxReady, - USBD_DFU_EP0_RxReady, - NULL, - NULL, - USBD_DFU_SOF, - NULL, - NULL, -#ifdef USE_USBD_COMPOSITE - NULL, - NULL, - NULL, - NULL, -#else - USBD_DFU_GetCfgDesc, - USBD_DFU_GetCfgDesc, - USBD_DFU_GetCfgDesc, - USBD_DFU_GetDeviceQualifierDesc, -#endif /* USE_USBD_COMPOSITE */ -#if (USBD_SUPPORT_USER_STRING_DESC == 1U) - USBD_DFU_GetUsrStringDesc -#endif /* USBD_SUPPORT_USER_STRING_DESC */ -}; - -#ifndef USE_USBD_COMPOSITE -/* USB DFU device Configuration Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_DFU_CfgDesc[USB_DFU_CONFIG_DESC_SIZ] __ALIGN_END = -{ - 0x09, /* bLength: Configuration Descriptor size */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - USB_DFU_CONFIG_DESC_SIZ, /* wTotalLength: Bytes returned */ - 0x00, - 0x01, /* bNumInterfaces: 1 interface */ - 0x01, /* bConfigurationValue: Configuration value */ - 0x02, /* iConfiguration: Index of string descriptor - describing the configuration */ -#if (USBD_SELF_POWERED == 1U) - 0xC0, /* bmAttributes: Bus Powered according to user configuration */ -#else - 0x80, /* bmAttributes: Bus Powered according to user configuration */ -#endif /* USBD_SELF_POWERED */ - USBD_MAX_POWER, /* MaxPower (mA) */ - /* 09 */ - - /********** Descriptor of DFU interface 0 Alternate setting 0 **************/ - USBD_DFU_IF_DESC(0U), /* This interface is mandatory for all devices */ - -#if (USBD_DFU_MAX_ITF_NUM > 1U) - /********** Descriptor of DFU interface 0 Alternate setting 1 **************/ - USBD_DFU_IF_DESC(1), -#endif /* (USBD_DFU_MAX_ITF_NUM > 1) */ - -#if (USBD_DFU_MAX_ITF_NUM > 2U) - /********** Descriptor of DFU interface 0 Alternate setting 2 **************/ - USBD_DFU_IF_DESC(2), -#endif /* (USBD_DFU_MAX_ITF_NUM > 2) */ - -#if (USBD_DFU_MAX_ITF_NUM > 3U) - /********** Descriptor of DFU interface 0 Alternate setting 3 **************/ - USBD_DFU_IF_DESC(3), -#endif /* (USBD_DFU_MAX_ITF_NUM > 3) */ - -#if (USBD_DFU_MAX_ITF_NUM > 4U) - /********** Descriptor of DFU interface 0 Alternate setting 4 **************/ - USBD_DFU_IF_DESC(4), -#endif /* (USBD_DFU_MAX_ITF_NUM > 4) */ - -#if (USBD_DFU_MAX_ITF_NUM > 5U) - /********** Descriptor of DFU interface 0 Alternate setting 5 **************/ - USBD_DFU_IF_DESC(5), -#endif /* (USBD_DFU_MAX_ITF_NUM > 5) */ - -#if (USBD_DFU_MAX_ITF_NUM > 6U) -#error "ERROR: usbd_dfu_core.c: Modify the file to support more descriptors!" -#endif /* (USBD_DFU_MAX_ITF_NUM > 6) */ - - /******************** DFU Functional Descriptor********************/ - 0x09, /* blength = 9 Bytes */ - DFU_DESCRIPTOR_TYPE, /* DFU Functional Descriptor */ - 0x0B, /* bmAttribute: - bitCanDnload = 1 (bit 0) - bitCanUpload = 1 (bit 1) - bitManifestationTolerant = 0 (bit 2) - bitWillDetach = 1 (bit 3) - Reserved (bit4-6) - bitAcceleratedST = 0 (bit 7) */ - 0xFF, /* DetachTimeOut= 255 ms*/ - 0x00, - /* WARNING: In DMA mode the multiple MPS packets feature is still not supported - ==> In this case, when using DMA USBD_DFU_XFER_SIZE should be set to 64 in usbd_conf.h */ - TRANSFER_SIZE_BYTES(USBD_DFU_XFER_SIZE), /* TransferSize = 1024 Byte */ - 0x1A, /* bcdDFUVersion */ - 0x01 - /***********************************************************/ - /* 9*/ -}; - -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_DFU_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = -{ - USB_LEN_DEV_QUALIFIER_DESC, - USB_DESC_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x01, - 0x00, -}; -#endif /* USE_USBD_COMPOSITE */ - -/** - * @} - */ - -/** @defgroup USBD_DFU_Private_Functions - * @{ - */ - -/** - * @brief USBD_DFU_Init - * Initialize the DFU interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_DFU_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - - USBD_DFU_HandleTypeDef *hdfu; - - /* Allocate Audio structure */ - hdfu = (USBD_DFU_HandleTypeDef *)USBD_malloc(sizeof(USBD_DFU_HandleTypeDef)); - - if (hdfu == NULL) - { - pdev->pClassDataCmsit[pdev->classId] = NULL; - return (uint8_t)USBD_EMEM; - } - - pdev->pClassDataCmsit[pdev->classId] = (void *)hdfu; - pdev->pClassData = pdev->pClassDataCmsit[pdev->classId]; - - hdfu->alt_setting = 0U; - hdfu->data_ptr = USBD_DFU_APP_DEFAULT_ADD; - hdfu->wblock_num = 0U; - hdfu->wlength = 0U; - - hdfu->manif_state = DFU_MANIFEST_COMPLETE; - hdfu->dev_state = DFU_STATE_IDLE; - - hdfu->dev_status[0] = DFU_ERROR_NONE; - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = DFU_STATE_IDLE; - hdfu->dev_status[5] = 0U; - - /* Initialize Hardware layer */ - if (((USBD_DFU_MediaTypeDef *)pdev->pUserData[pdev->classId])->Init() != USBD_OK) - { - return (uint8_t)USBD_FAIL; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_DFU_DeInit - * De-Initialize the DFU layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_DFU_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - USBD_DFU_HandleTypeDef *hdfu; - - if (pdev->pClassDataCmsit[pdev->classId] == NULL) - { - return (uint8_t)USBD_EMEM; - } - - hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - hdfu->wblock_num = 0U; - hdfu->wlength = 0U; - - hdfu->dev_state = DFU_STATE_IDLE; - hdfu->dev_status[0] = DFU_ERROR_NONE; - hdfu->dev_status[4] = DFU_STATE_IDLE; - - /* DeInit physical Interface components and Hardware Layer */ - ((USBD_DFU_MediaTypeDef *)pdev->pUserData[pdev->classId])->DeInit(); - USBD_free(pdev->pClassDataCmsit[pdev->classId]); - pdev->pClassDataCmsit[pdev->classId] = NULL; - pdev->pClassData = NULL; - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_DFU_Setup - * Handle the DFU specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t USBD_DFU_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_StatusTypeDef ret = USBD_OK; - uint8_t *pbuf; - uint16_t len; - uint16_t status_info = 0U; - - if (hdfu == NULL) - { - return (uint8_t)USBD_FAIL; - } - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS: - switch (req->bRequest) - { - case DFU_DNLOAD: - DFU_Download(pdev, req); - break; - - case DFU_UPLOAD: - DFU_Upload(pdev, req); - break; - - case DFU_GETSTATUS: - DFU_GetStatus(pdev); - break; - - case DFU_CLRSTATUS: - DFU_ClearStatus(pdev); - break; - - case DFU_GETSTATE: - DFU_GetState(pdev); - break; - - case DFU_ABORT: - DFU_Abort(pdev); - break; - - case DFU_DETACH: - DFU_Detach(pdev, req); - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - break; - - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_STATUS: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, (uint8_t *)&status_info, 2U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_GET_DESCRIPTOR: - if ((req->wValue >> 8) == DFU_DESCRIPTOR_TYPE) - { - pbuf = (uint8_t *)USBD_DFU_GetDfuFuncDesc(pdev->pConfDesc); - - if (pbuf != NULL) - { - len = MIN(USB_DFU_DESC_SIZ, req->wLength); - (void)USBD_CtlSendData(pdev, pbuf, len); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - } - break; - - case USB_REQ_GET_INTERFACE: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, (uint8_t *)&hdfu->alt_setting, 1U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_SET_INTERFACE: - if ((uint8_t)(req->wValue) < USBD_DFU_MAX_ITF_NUM) - { - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - hdfu->alt_setting = (uint8_t)(req->wValue); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - } - else - { - /* Call the error management function (command will be NAKed */ - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_CLEAR_FEATURE: - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - - return (uint8_t)ret; -} - -#ifndef USE_USBD_COMPOSITE -/** - * @brief USBD_DFU_GetCfgDesc - * return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_DFU_GetCfgDesc(uint16_t *length) -{ - *length = (uint16_t)sizeof(USBD_DFU_CfgDesc); - - return USBD_DFU_CfgDesc; -} -#endif /* USE_USBD_COMPOSITE */ - -/** - * @brief USBD_DFU_EP0_RxReady - * handle EP0 Rx Ready event - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_DFU_EP0_RxReady(USBD_HandleTypeDef *pdev) -{ - UNUSED(pdev); - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_DFU_EP0_TxReady - * handle EP0 TRx Ready event - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_DFU_EP0_TxReady(USBD_HandleTypeDef *pdev) -{ - USBD_SetupReqTypedef req; - uint32_t app_addr_ptr; - uint32_t addr; - USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_DFU_MediaTypeDef *DfuInterface = (USBD_DFU_MediaTypeDef *)pdev->pUserData[pdev->classId]; -#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U) || (USBD_DFU_VENDOR_CHECK_ENABLED == 1U) - uint32_t VendorStatus = 0U; -#endif /* USBD_DFU_VENDOR_CMD_ENABLED */ - - if (hdfu == NULL) - { - return (uint8_t)USBD_FAIL; - } - - if (hdfu->dev_state == DFU_STATE_DNLOAD_BUSY) - { - /* Decode the Special Command */ - if (hdfu->wblock_num == 0U) - { - if (hdfu->wlength == 1U) - { - if (hdfu->buffer.d8[0] == DFU_CMD_GETCOMMANDS) - { - /* Nothing to do */ - } -#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U) - else - { - /* Vendor specific DFU CMD */ - if (DfuInterface->VendorDownloadCMD(hdfu->buffer.d8, hdfu->wblock_num, - hdfu->wlength, &VendorStatus) != USBD_OK) - { - /* Update the state machine */ - hdfu->dev_state = DFU_STATE_ERROR; - hdfu->dev_status[0] = (uint8_t)VendorStatus; - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - return (uint8_t)USBD_FAIL; - } - } -#endif /* USBD_DFU_VENDOR_CMD_ENABLED */ - } - else if (hdfu->wlength == 5U) - { - if (hdfu->buffer.d8[0] == DFU_CMD_SETADDRESSPOINTER) - { -#if (USBD_DFU_VENDOR_CHECK_ENABLED == 1U) - if (DfuInterface->VendorCheck(hdfu->buffer.d8, IS_DFU_SETADDRESSPOINTER, &VendorStatus) != USBD_OK) - { - /* Update the state machine */ - hdfu->dev_state = DFU_STATE_ERROR; - hdfu->dev_status[0] = (uint8_t)VendorStatus; - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - return (uint8_t)USBD_FAIL; - } -#endif /* USBD_DFU_VENDOR_CHECK_ENABLED */ - - hdfu->data_ptr = hdfu->buffer.d8[1]; - hdfu->data_ptr += (uint32_t)hdfu->buffer.d8[2] << 8; - hdfu->data_ptr += (uint32_t)hdfu->buffer.d8[3] << 16; - hdfu->data_ptr += (uint32_t)hdfu->buffer.d8[4] << 24; - } - else if (hdfu->buffer.d8[0] == DFU_CMD_ERASE) - { -#if (USBD_DFU_VENDOR_CHECK_ENABLED == 1U) - if (DfuInterface->VendorCheck(hdfu->buffer.d8, IS_DFU_DOWNLOAD, &VendorStatus) != USBD_OK) - { - /* Update the state machine */ - hdfu->dev_state = DFU_STATE_ERROR; - hdfu->dev_status[0] = (uint8_t)VendorStatus; - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - return (uint8_t)USBD_FAIL; - } -#endif /* USBD_DFU_VENDOR_CHECK_ENABLED */ - - app_addr_ptr = hdfu->buffer.d8[1]; - app_addr_ptr += (uint32_t)hdfu->buffer.d8[2] << 8; - app_addr_ptr += (uint32_t)hdfu->buffer.d8[3] << 16; - app_addr_ptr += (uint32_t)hdfu->buffer.d8[4] << 24; - - if (DfuInterface->Erase(app_addr_ptr) != USBD_OK) - { - /* Update the state machine */ - hdfu->dev_state = DFU_STATE_ERROR; - hdfu->dev_status[0] = DFU_ERROR_VENDOR; - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - return (uint8_t)USBD_FAIL; - } - } -#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U) - else - { - /* Vendor specific DFU CMD */ - if (DfuInterface->VendorDownloadCMD(hdfu->buffer.d8, hdfu->wblock_num, - hdfu->wlength, &VendorStatus) != USBD_OK) - { - /* Update the state machine */ - hdfu->dev_state = DFU_STATE_ERROR; - hdfu->dev_status[0] = (uint8_t)VendorStatus; - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - return (uint8_t)USBD_FAIL; - } - } -#else - else - { - return (uint8_t)USBD_FAIL; - } -#endif /* USBD_DFU_VENDOR_CMD_ENABLED */ - } - else - { -#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U) - if (hdfu->wlength > 0U) - { -#if (USBD_DFU_VENDOR_CHECK_ENABLED == 1U) - if (DfuInterface->VendorCheck(hdfu->buffer.d8, IS_DFU_DOWNLOAD, &VendorStatus) != USBD_OK) - { - /* Update the state machine */ - hdfu->dev_state = DFU_STATE_ERROR; - hdfu->dev_status[0] = (uint8_t)VendorStatus; - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - return (uint8_t)USBD_FAIL; - } -#endif /* USBD_DFU_VENDOR_CHECK_ENABLED */ - - /* Vendor specific DFU CMD */ - if (DfuInterface->VendorDownloadCMD(hdfu->buffer.d8, hdfu->wblock_num, - hdfu->wlength, &VendorStatus) != USBD_OK) - { - /* Update the state machine */ - hdfu->dev_state = DFU_STATE_ERROR; - hdfu->dev_status[0] = (uint8_t)VendorStatus; - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - return (uint8_t)USBD_FAIL; - } - } - else - { - /* Reset the block number */ - hdfu->wblock_num = 0U; - - /* Call the error management function (command will be NAKed) */ - req.bmRequest = 0U; - req.wLength = 1U; - USBD_CtlError(pdev, &req); - } -#else - /* Reset the global length and block number */ - hdfu->wlength = 0U; - hdfu->wblock_num = 0U; - - /* Call the error management function (command will be NAKed) */ - req.bmRequest = 0U; - req.wLength = 1U; - USBD_CtlError(pdev, &req); -#endif /* USBD_DFU_VENDOR_CMD_ENABLED */ - } - } - /* Regular Download Command */ - else - { - if (hdfu->wblock_num > 1U) - { -#if (USBD_DFU_VENDOR_CHECK_ENABLED == 1U) - if (DfuInterface->VendorCheck(hdfu->buffer.d8, IS_DFU_DOWNLOAD, &VendorStatus) != USBD_OK) - { - /* Update the state machine */ - hdfu->dev_state = DFU_STATE_ERROR; - hdfu->dev_status[0] = (uint8_t)VendorStatus; - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - return (uint8_t)USBD_FAIL; - } -#endif /* USBD_DFU_VENDOR_CHECK_ENABLED */ - - /* Decode the required address */ - addr = ((hdfu->wblock_num - 2U) * USBD_DFU_XFER_SIZE) + hdfu->data_ptr; - - /* Perform the write operation */ - if (DfuInterface->Write(hdfu->buffer.d8, (uint8_t *)addr, hdfu->wlength) != USBD_OK) - { - /* Update the state machine */ - hdfu->dev_state = DFU_STATE_ERROR; - hdfu->dev_status[0] = DFU_ERROR_VENDOR; - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - return (uint8_t)USBD_FAIL; - } - } - } - - /* Reset the global length and block number */ - hdfu->wlength = 0U; - hdfu->wblock_num = 0U; - - /* Update the state machine */ - hdfu->dev_state = DFU_STATE_DNLOAD_SYNC; - - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - } - else if (hdfu->dev_state == DFU_STATE_MANIFEST)/* Manifestation in progress */ - { - /* Start leaving DFU mode */ - DFU_Leave(pdev); - } - else - { - return (uint8_t)USBD_FAIL; - } - - return (uint8_t)USBD_OK; -} -/** - * @brief USBD_DFU_SOF - * handle SOF event - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_DFU_SOF(USBD_HandleTypeDef *pdev) -{ - UNUSED(pdev); - - return (uint8_t)USBD_OK; -} - -#ifndef USE_USBD_COMPOSITE -/** - * @brief DeviceQualifierDescriptor - * return Device Qualifier descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_DFU_GetDeviceQualifierDesc(uint16_t *length) -{ - *length = (uint16_t)sizeof(USBD_DFU_DeviceQualifierDesc); - - return USBD_DFU_DeviceQualifierDesc; -} -#endif /* USE_USBD_COMPOSITE */ - -/** - * @brief USBD_DFU_GetUsrStringDesc - * Manages the transfer of memory interfaces string descriptors. - * @param pdev: device instance - * @param index: descriptor index - * @param length : pointer data length - * @retval pointer to the descriptor table or NULL if the descriptor is not supported. - */ -#if (USBD_SUPPORT_USER_STRING_DESC == 1U) -static uint8_t *USBD_DFU_GetUsrStringDesc(USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length) -{ - static uint8_t USBD_StrDesc[255]; - USBD_DFU_MediaTypeDef *DfuInterface = (USBD_DFU_MediaTypeDef *)pdev->pUserData[pdev->classId]; - - /* Check if the requested string interface is supported */ - if (index <= (USBD_IDX_INTERFACE_STR + USBD_DFU_MAX_ITF_NUM)) - { - USBD_GetString((uint8_t *)DfuInterface->pStrDesc, USBD_StrDesc, length); - return USBD_StrDesc; - } - else - { - /* Not supported Interface Descriptor index */ - *length = 0U; - return NULL; - } -} -#endif /* USBD_SUPPORT_USER_STRING_DESC */ - -/** - * @brief USBD_MSC_RegisterStorage - * @param pdev: device instance - * @param fops: storage callback - * @retval status - */ -uint8_t USBD_DFU_RegisterMedia(USBD_HandleTypeDef *pdev, - USBD_DFU_MediaTypeDef *fops) -{ - if (fops == NULL) - { - return (uint8_t)USBD_FAIL; - } - - pdev->pUserData[pdev->classId] = fops; - - return (uint8_t)USBD_OK; -} - -/****************************************************************************** - DFU Class requests management - ******************************************************************************/ -/** - * @brief DFU_Detach - * Handles the DFU DETACH request. - * @param pdev: device instance - * @param req: pointer to the request structure. - * @retval None. - */ -static void DFU_Detach(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_DFUFuncDescTypeDef *pDfuFunc = (USBD_DFUFuncDescTypeDef *)USBD_DFU_GetDfuFuncDesc(pdev->pConfDesc); - - if ((hdfu == NULL) || (pDfuFunc == NULL)) - { - return; - } - - if ((hdfu->dev_state == DFU_STATE_IDLE) || - (hdfu->dev_state == DFU_STATE_DNLOAD_SYNC) || - (hdfu->dev_state == DFU_STATE_DNLOAD_IDLE) || - (hdfu->dev_state == DFU_STATE_MANIFEST_SYNC) || - (hdfu->dev_state == DFU_STATE_UPLOAD_IDLE)) - { - /* Update the state machine */ - hdfu->dev_state = DFU_STATE_IDLE; - hdfu->dev_status[0] = DFU_ERROR_NONE; - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; /*bwPollTimeout=0ms*/ - hdfu->dev_status[4] = hdfu->dev_state; - hdfu->dev_status[5] = 0U; /*iString*/ - hdfu->wblock_num = 0U; - hdfu->wlength = 0U; - } - - /* Check the detach capability in the DFU functional descriptor */ - if ((pDfuFunc->bmAttributes & DFU_DETACH_MASK) != 0U) - { - /* Perform an Attach-Detach operation on USB bus */ - (void)USBD_Stop(pdev); - (void)USBD_Start(pdev); - } - else - { - /* Wait for the period of time specified in Detach request */ - USBD_Delay((uint32_t)req->wValue); - } -} - -/** - * @brief DFU_Download - * Handles the DFU DNLOAD request. - * @param pdev: device instance - * @param req: pointer to the request structure - * @retval None - */ -static void DFU_Download(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - -#if (USBD_DFU_VENDOR_CHECK_ENABLED == 1U) - USBD_DFU_MediaTypeDef *DfuInterface = (USBD_DFU_MediaTypeDef *)pdev->pUserData[pdev->classId]; - uint32_t VendorStatus = 0U; -#endif /* USBD_DFU_VENDOR_CHECK_ENABLED */ - - if (hdfu == NULL) - { - return; - } - - /* Data setup request */ - if (req->wLength > 0U) - { - if ((hdfu->dev_state == DFU_STATE_IDLE) || (hdfu->dev_state == DFU_STATE_DNLOAD_IDLE)) - { - /* Update the global length and block number */ - hdfu->wblock_num = req->wValue; - hdfu->wlength = MIN(req->wLength, USBD_DFU_XFER_SIZE); - - /* Update the state machine */ - hdfu->dev_state = DFU_STATE_DNLOAD_SYNC; - hdfu->dev_status[4] = hdfu->dev_state; - - /* Prepare the reception of the buffer over EP0 */ - (void)USBD_CtlPrepareRx(pdev, (uint8_t *)hdfu->buffer.d8, hdfu->wlength); - } - /* Unsupported state */ - else - { - /* Call the error management function (command will be NAKed */ - USBD_CtlError(pdev, req); - } - } - /* 0 Data DNLOAD request */ - else - { - /* End of DNLOAD operation */ - if ((hdfu->dev_state == DFU_STATE_DNLOAD_IDLE) || (hdfu->dev_state == DFU_STATE_IDLE)) - { -#if (USBD_DFU_VENDOR_CHECK_ENABLED == 1U) - if (DfuInterface->VendorCheck(hdfu->buffer.d8, IS_DFU_SETADDRESSPOINTER, &VendorStatus) != USBD_OK) - { - /* Update the state machine */ - hdfu->dev_state = DFU_STATE_ERROR; - hdfu->dev_status[0] = (uint8_t)VendorStatus; - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - } - else -#endif /* USBD_DFU_VENDOR_CHECK_ENABLED */ - { - hdfu->manif_state = DFU_MANIFEST_IN_PROGRESS; - hdfu->dev_state = DFU_STATE_MANIFEST_SYNC; - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - } - } - else - { - /* Call the error management function (command will be NAKed */ - USBD_CtlError(pdev, req); - } - } -} - -/** - * @brief DFU_Upload - * Handles the DFU UPLOAD request. - * @param pdev: instance - * @param req: pointer to the request structure - * @retval status - */ -static void DFU_Upload(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_DFU_MediaTypeDef *DfuInterface = (USBD_DFU_MediaTypeDef *)pdev->pUserData[pdev->classId]; - uint8_t *phaddr; - uint32_t addr; - uint32_t CmdLength; -#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U) - uint32_t VendorStatus = 0U; - uint8_t VendorCmdLength = 0U; - uint8_t VendorCmdBuffer[DFU_VENDOR_CMD_MAX]; - uint8_t idx; -#endif /* USBD_DFU_VENDOR_CMD_ENABLED */ - - if (hdfu == NULL) - { - return; - } - - /* Data setup request */ - if (req->wLength > 0U) - { - if ((hdfu->dev_state == DFU_STATE_IDLE) || (hdfu->dev_state == DFU_STATE_UPLOAD_IDLE)) - { - /* Update the global length and block number */ - hdfu->wblock_num = req->wValue; - hdfu->wlength = MIN(req->wLength, USBD_DFU_XFER_SIZE); - - /* DFU Get Command */ - if (hdfu->wblock_num == 0U) - { - /* Update the state machine */ - hdfu->dev_state = (hdfu->wlength > 3U) ? DFU_STATE_IDLE : DFU_STATE_UPLOAD_IDLE; - - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - - /* Store the values of all supported commands */ - hdfu->buffer.d8[0] = DFU_CMD_GETCOMMANDS; - hdfu->buffer.d8[1] = DFU_CMD_SETADDRESSPOINTER; - hdfu->buffer.d8[2] = DFU_CMD_ERASE; - - CmdLength = 3U; - -#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U) - if (DfuInterface->GetVendorCMD != NULL) - { - (void)DfuInterface->GetVendorCMD(VendorCmdBuffer, (uint8_t *)&VendorCmdLength); - - for (idx = 0U; idx < MIN(VendorCmdLength, DFU_VENDOR_CMD_MAX); idx++) - { - hdfu->buffer.d8[idx + 3U] = VendorCmdBuffer[idx]; - } - - CmdLength += MIN(VendorCmdLength, DFU_VENDOR_CMD_MAX); - } -#endif /* USBD_DFU_VENDOR_CMD_ENABLED */ - - /* Send the status data over EP0 */ - (void)USBD_CtlSendData(pdev, (uint8_t *)(&(hdfu->buffer.d8[0])), CmdLength); - } - else if (hdfu->wblock_num > 1U) - { - hdfu->dev_state = DFU_STATE_UPLOAD_IDLE; - - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - -#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U) - /* Vendor specific DFU CMD */ - if (DfuInterface->VendorUploadCMD(hdfu->data_ptr, hdfu->wblock_num, &VendorStatus) != USBD_OK) - { - /* Update the state machine */ - hdfu->dev_state = DFU_ERROR_STALLEDPKT; - hdfu->dev_status[0] = (uint8_t)VendorStatus; - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - - /* Call the error management function (command will be NAKed) */ - USBD_CtlError(pdev, req); - } - - if (VendorStatus == IS_DFU_PHY_ADDRESS) -#endif /* USBD_DFU_VENDOR_CMD_ENABLED */ - { - addr = ((hdfu->wblock_num - 2U) * USBD_DFU_XFER_SIZE) + hdfu->data_ptr; - - /* Return the physical address where data are stored */ - phaddr = DfuInterface->Read((uint8_t *)addr, hdfu->buffer.d8, hdfu->wlength); - - if (phaddr == NULL) - { - hdfu->dev_state = DFU_ERROR_STALLEDPKT; - - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - - /* Call the error management function (command will be NAKed) */ - USBD_CtlError(pdev, req); - } - else - { - /* Send the status data over EP0 */ - (void)USBD_CtlSendData(pdev, phaddr, hdfu->wlength); - } - } - } - else /* unsupported hdfu->wblock_num */ - { - hdfu->dev_state = DFU_ERROR_STALLEDPKT; - - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - - /* Call the error management function (command will be NAKed) */ - USBD_CtlError(pdev, req); - } - } - /* Unsupported state */ - else - { - hdfu->wlength = 0U; - hdfu->wblock_num = 0U; - - /* Call the error management function (command will be NAKed) */ - USBD_CtlError(pdev, req); - } - } - /* No Data setup request */ - else - { - hdfu->dev_state = DFU_STATE_IDLE; - - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - } -} - -/** - * @brief DFU_GetStatus - * Handles the DFU GETSTATUS request. - * @param pdev: instance - * @retval status - */ -static void DFU_GetStatus(USBD_HandleTypeDef *pdev) -{ - USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_DFU_MediaTypeDef *DfuInterface = (USBD_DFU_MediaTypeDef *)pdev->pUserData[pdev->classId]; - USBD_DFUFuncDescTypeDef *pDfuFunc = (USBD_DFUFuncDescTypeDef *)USBD_DFU_GetDfuFuncDesc(pdev->pConfDesc); - - if ((hdfu == NULL) || (DfuInterface == NULL) || (pDfuFunc == NULL)) - { - return; - } - - switch (hdfu->dev_state) - { - case DFU_STATE_DNLOAD_SYNC: - if (hdfu->wlength != 0U) - { - hdfu->dev_state = DFU_STATE_DNLOAD_BUSY; - - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - - if ((hdfu->wblock_num == 0U) && (hdfu->buffer.d8[0] == DFU_CMD_ERASE)) - { - DfuInterface->GetStatus(hdfu->data_ptr, DFU_MEDIA_ERASE, hdfu->dev_status); - } - else - { - DfuInterface->GetStatus(hdfu->data_ptr, DFU_MEDIA_PROGRAM, hdfu->dev_status); - } - } - else /* (hdfu->wlength == 0U) */ - { - hdfu->dev_state = DFU_STATE_DNLOAD_IDLE; - - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - } - break; - - case DFU_STATE_MANIFEST_SYNC: - if (hdfu->manif_state == DFU_MANIFEST_IN_PROGRESS) - { - hdfu->dev_state = DFU_STATE_MANIFEST; - - hdfu->dev_status[1] = 1U; /* bwPollTimeout = 1ms */ - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - } - else - { - if ((hdfu->manif_state == DFU_MANIFEST_COMPLETE) && - ((pDfuFunc->bmAttributes & DFU_MANIFEST_MASK) != 0U)) - { - hdfu->dev_state = DFU_STATE_IDLE; - - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - } - } - break; - - default: - break; - } - - /* Send the status data over EP0 */ - (void)USBD_CtlSendData(pdev, (uint8_t *)(&(hdfu->dev_status[0])), 6U); -} - -/** - * @brief DFU_ClearStatus - * Handles the DFU CLRSTATUS request. - * @param pdev: device instance - * @retval status - */ -static void DFU_ClearStatus(USBD_HandleTypeDef *pdev) -{ - USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hdfu == NULL) - { - return; - } - - if (hdfu->dev_state == DFU_STATE_ERROR) - { - hdfu->dev_state = DFU_STATE_IDLE; - hdfu->dev_status[0] = DFU_ERROR_NONE; /* bStatus */ - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; /* bwPollTimeout=0ms */ - hdfu->dev_status[4] = hdfu->dev_state; /* bState */ - hdfu->dev_status[5] = 0U; /* iString */ - } - else - { - /* State Error */ - hdfu->dev_state = DFU_STATE_ERROR; - hdfu->dev_status[0] = DFU_ERROR_UNKNOWN; /* bStatus */ - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; /* bwPollTimeout=0ms */ - hdfu->dev_status[4] = hdfu->dev_state; /* bState */ - hdfu->dev_status[5] = 0U; /* iString */ - } -} - -/** - * @brief DFU_GetState - * Handles the DFU GETSTATE request. - * @param pdev: device instance - * @retval None - */ -static void DFU_GetState(USBD_HandleTypeDef *pdev) -{ - USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hdfu == NULL) - { - return; - } - - /* Return the current state of the DFU interface */ - (void)USBD_CtlSendData(pdev, &hdfu->dev_state, 1U); -} - -/** - * @brief DFU_Abort - * Handles the DFU ABORT request. - * @param pdev: device instance - * @retval None - */ -static void DFU_Abort(USBD_HandleTypeDef *pdev) -{ - USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hdfu == NULL) - { - return; - } - - if ((hdfu->dev_state == DFU_STATE_IDLE) || - (hdfu->dev_state == DFU_STATE_DNLOAD_SYNC) || - (hdfu->dev_state == DFU_STATE_DNLOAD_IDLE) || - (hdfu->dev_state == DFU_STATE_MANIFEST_SYNC) || - (hdfu->dev_state == DFU_STATE_UPLOAD_IDLE)) - { - hdfu->dev_state = DFU_STATE_IDLE; - hdfu->dev_status[0] = DFU_ERROR_NONE; - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; /* bwPollTimeout=0ms */ - hdfu->dev_status[4] = hdfu->dev_state; - hdfu->dev_status[5] = 0U; /* iString */ - hdfu->wblock_num = 0U; - hdfu->wlength = 0U; - } -} - -/** - * @brief DFU_Leave - * Handles the sub-protocol DFU leave DFU mode request (leaves DFU mode - * and resets device to jump to user loaded code). - * @param pdev: device instance - * @retval None - */ -static void DFU_Leave(USBD_HandleTypeDef *pdev) -{ - USBD_DFU_HandleTypeDef *hdfu = (USBD_DFU_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_DFU_MediaTypeDef *DfuInterface = (USBD_DFU_MediaTypeDef *)pdev->pUserData[pdev->classId]; - USBD_DFUFuncDescTypeDef *pDfuFunc = (USBD_DFUFuncDescTypeDef *)USBD_DFU_GetDfuFuncDesc(pdev->pConfDesc); - - if ((hdfu == NULL) || (DfuInterface == NULL) || (pDfuFunc == NULL)) - { - return; - } - - hdfu->manif_state = DFU_MANIFEST_COMPLETE; - - if ((pDfuFunc->bmAttributes & DFU_MANIFEST_MASK) != 0U) - { - hdfu->dev_state = DFU_STATE_MANIFEST_SYNC; - - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - return; - } - else - { - hdfu->dev_state = DFU_STATE_MANIFEST_WAIT_RESET; - - hdfu->dev_status[1] = 0U; - hdfu->dev_status[2] = 0U; - hdfu->dev_status[3] = 0U; - hdfu->dev_status[4] = hdfu->dev_state; - - /* Disconnect the USB device */ - (void)USBD_Stop(pdev); - -#if (USBD_DFU_VENDOR_EXIT_ENABLED == 1U) - /* Jump should be ensured by user application */ - DfuInterface->LeaveDFU(hdfu->data_ptr); -#else - /* Generate system reset to allow jumping to the user code */ - NVIC_SystemReset(); -#endif /* USBD_DFU_VENDOR_EXIT_ENABLED */ - - /* The next instructions will not be reached (system reset) */ - } -} - -/** - * @brief USBD_DFU_GetDfuFuncDesc - * This function return the DFU descriptor - * @param pdev: device instance - * @param pConfDesc: pointer to Bos descriptor - * @retval pointer to the DFU descriptor - */ -static void *USBD_DFU_GetDfuFuncDesc(uint8_t *pConfDesc) -{ - USBD_ConfigDescTypeDef *desc = (USBD_ConfigDescTypeDef *)(void *)pConfDesc; - USBD_DescHeaderTypeDef *pdesc = (USBD_DescHeaderTypeDef *)(void *)pConfDesc; - uint8_t *pDfuDesc = NULL; - uint16_t ptr; - - if (desc->wTotalLength > desc->bLength) - { - ptr = desc->bLength; - - while (ptr < desc->wTotalLength) - { - pdesc = USBD_GetNextDesc((uint8_t *)pdesc, &ptr); - - if (pdesc->bDescriptorType == DFU_DESCRIPTOR_TYPE) - { - pDfuDesc = (uint8_t *)pdesc; - break; - } - } - } - return pDfuDesc; -} - -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - diff --git a/Class/DFU/Src/usbd_dfu_media_template.c b/Class/DFU/Src/usbd_dfu_media_template.c deleted file mode 100644 index 3f961f6..0000000 --- a/Class/DFU/Src/usbd_dfu_media_template.c +++ /dev/null @@ -1,250 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_dfu_media_template.c - * @author MCD Application Team - * @brief Memory management layer - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* BSPDependencies -- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c" -- "stm32xxxxx_{eval}{discovery}_io.c" -EndBSPDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_dfu_media_template.h" - - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -/* Extern function prototypes ------------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ -uint16_t MEM_If_Init(void); -uint16_t MEM_If_Erase(uint32_t Add); -uint16_t MEM_If_Write(uint8_t *src, uint8_t *dest, uint32_t Len); -uint8_t *MEM_If_Read(uint8_t *src, uint8_t *dest, uint32_t Len); -uint16_t MEM_If_DeInit(void); -uint16_t MEM_If_GetStatus(uint32_t Add, uint8_t Cmd, uint8_t *buffer); -#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U) -uint16_t MEM_If_GetVendorCMD(uint8_t *cmd, uint8_t *cmdlength); -uint16_t MEM_If_VendorDownloadCMD(uint8_t *pbuf, uint32_t BlockNumber, uint32_t wlength, uint32_t *status); -uint16_t MEM_If_VendorUploadCMD(uint32_t Add, uint32_t BlockNumber, uint32_t *status); -#endif /* USBD_DFU_VENDOR_CMD_ENABLED */ -#if (USBD_DFU_VENDOR_CHECK_ENABLED == 1U) -uint16_t MEM_If_VendorCheck(uint8_t *pbuf, uint32_t ReqType, uint32_t *status); -#endif /* USBD_DFU_VENDOR_CHECK_ENABLED */ -#if (USBD_DFU_VENDOR_EXIT_ENABLED == 1U) -uint16_t MEM_If_LeaveDFU(uint32_t Add); -#endif /* USBD_DFU_VENDOR_EXIT_ENABLED */ - -USBD_DFU_MediaTypeDef USBD_DFU_MEDIA_Template_fops = -{ - (uint8_t *)"DFU MEDIA", - MEM_If_Init, - MEM_If_DeInit, - MEM_If_Erase, - MEM_If_Write, - MEM_If_Read, - MEM_If_GetStatus, -#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U) - MEM_If_GetVendorCMD, - MEM_If_VendorDownloadCMD, - MEM_If_VendorUploadCMD, -#endif /* USBD_DFU_VENDOR_CMD_ENABLED */ -#if (USBD_DFU_VENDOR_CHECK_ENABLED == 1U) - MEM_If_VendorCheck, -#endif /* USBD_DFU_VENDOR_CHECK_ENABLED */ -#if (USBD_DFU_VENDOR_EXIT_ENABLED == 1U) - MEM_If_LeaveDFU -#endif /* USBD_DFU_VENDOR_EXIT_ENABLED */ -}; - -/** - * @brief MEM_If_Init - * Memory initialization routine. - * @param None - * @retval 0 if operation is successful, MAL_FAIL else. - */ -uint16_t MEM_If_Init(void) -{ - return 0; -} - -/** - * @brief MEM_If_DeInit - * Memory deinitialization routine. - * @param None - * @retval 0 if operation is successful, MAL_FAIL else. - */ -uint16_t MEM_If_DeInit(void) -{ - return 0; -} - -/** - * @brief MEM_If_Erase - * Erase sector. - * @param Add: Address of sector to be erased. - * @retval 0 if operation is successful, MAL_FAIL else. - */ -uint16_t MEM_If_Erase(uint32_t Add) -{ - UNUSED(Add); - - return 0; -} - -/** - * @brief MEM_If_Write - * Memory write routine. - * @param Add: Address to be written to. - * @param Len: Number of data to be written (in bytes). - * @retval 0 if operation is successful, MAL_FAIL else. - */ -uint16_t MEM_If_Write(uint8_t *src, uint8_t *dest, uint32_t Len) -{ - UNUSED(src); - UNUSED(dest); - UNUSED(Len); - - return 0; -} - -/** - * @brief MEM_If_Read - * Memory read routine. - * @param Add: Address to be read from. - * @param Len: Number of data to be read (in bytes). - * @retval Pointer to the physical address where data should be read. - */ -uint8_t *MEM_If_Read(uint8_t *src, uint8_t *dest, uint32_t Len) -{ - UNUSED(src); - UNUSED(dest); - UNUSED(Len); - - /* Return a valid address to avoid HardFault */ - return NULL; -} - -/** - * @brief Flash_If_GetStatus - * Memory read routine. - * @param Add: Address to be read from. - * @param cmd: Number of data to be read (in bytes). - * @retval Pointer to the physical address where data should be read. - */ -uint16_t MEM_If_GetStatus(uint32_t Add, uint8_t Cmd, uint8_t *buffer) -{ - UNUSED(Add); - UNUSED(buffer); - - switch (Cmd) - { - case DFU_MEDIA_PROGRAM: - - break; - - case DFU_MEDIA_ERASE: - default: - - break; - } - return (0); -} - -#if (USBD_DFU_VENDOR_CMD_ENABLED == 1U) -/** - * @brief Get supported vendor specific commands - * @param pointer to supported vendor commands - * @param pointer to length of supported vendor commands - * @retval 0 if operation is successful - */ -uint16_t MEM_If_GetVendorCMD(uint8_t *cmd, uint8_t *cmdlength) -{ - UNUSED(cmd); - UNUSED(cmdlength); - - return 0U; -} - -/** - * @brief Vendor specific download commands - * @param pbuf DFU data buffer - * @param BlockNumber DFU memory block number - * @param wLength DFU request length - * @param pointer to DFU status - * @retval 0 if operation is successful - */ -uint16_t MEM_If_VendorDownloadCMD(uint8_t *pbuf, uint32_t BlockNumber, uint32_t wlength, uint32_t *status) -{ - UNUSED(pbuf); - UNUSED(BlockNumber); - UNUSED(wlength); - UNUSED(status); - - return 0U; -} - - -/** - * @brief Vendor specific upload commands - * @param Add memory Address - * @param BlockNumber DFU memory block number - * @param pointer to DFU status - * @retval 0 if operation is successful - */ -uint16_t MEM_If_VendorUploadCMD(uint32_t Add, uint32_t BlockNumber, uint32_t *status) -{ - UNUSED(Add); - UNUSED(BlockNumber); - UNUSED(status); - - return 0U; -} -#endif /* USBD_DFU_VENDOR_CMD_ENABLED */ - -#if (USBD_DFU_VENDOR_CHECK_ENABLED == 1U) -/** - * @brief Vendor memory check - * @param pbuf DFU data buffer - * @param ReqType IS_DFU_SETADDRESSPOINTER/DOWNLOAD/UPLOAD - * @param pointer to DFU status - * @retval 0 if operation is successful - */ -uint16_t MEM_If_VendorCheck(uint8_t *pbuf, uint32_t ReqType, uint32_t *status) -{ - UNUSED(pbuf); - UNUSED(ReqType); - UNUSED(status); - - return 0U; -} -#endif /* USBD_DFU_VENDOR_CHECK_ENABLED */ - -#if (USBD_DFU_VENDOR_EXIT_ENABLED == 1U) -/** - * @brief Vendor Leave DFU - * @param Application address - * @retval 0 if operation is successful - */ -uint16_t MEM_If_LeaveDFU(uint32_t Add) -{ - UNUSED(Add); - - return 0U; -} -#endif /* USBD_DFU_VENDOR_EXIT_ENABLED */ diff --git a/Class/HID/Inc/usbd_hid.h b/Class/HID/Inc/usbd_hid.h deleted file mode 100644 index 8b22a8d..0000000 --- a/Class/HID/Inc/usbd_hid.h +++ /dev/null @@ -1,160 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_hid.h - * @author MCD Application Team - * @brief Header file for the usbd_hid_core.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_HID_H -#define __USB_HID_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_HID - * @brief This file is the Header file for usbd_hid.c - * @{ - */ - - -/** @defgroup USBD_HID_Exported_Defines - * @{ - */ -#ifndef HID_EPIN_ADDR -#define HID_EPIN_ADDR 0x81U -#endif /* HID_EPIN_ADDR */ -#define HID_EPIN_SIZE 0x04U - -#define USB_HID_CONFIG_DESC_SIZ 34U -#define USB_HID_DESC_SIZ 9U -#define HID_MOUSE_REPORT_DESC_SIZE 74U - -#define HID_DESCRIPTOR_TYPE 0x21U -#define HID_REPORT_DESC 0x22U - -#ifndef HID_HS_BINTERVAL -#define HID_HS_BINTERVAL 0x07U -#endif /* HID_HS_BINTERVAL */ - -#ifndef HID_FS_BINTERVAL -#define HID_FS_BINTERVAL 0x0AU -#endif /* HID_FS_BINTERVAL */ - -#define USBD_HID_REQ_SET_PROTOCOL 0x0BU -#define USBD_HID_REQ_GET_PROTOCOL 0x03U - -#define USBD_HID_REQ_SET_IDLE 0x0AU -#define USBD_HID_REQ_GET_IDLE 0x02U - -#define USBD_HID_REQ_SET_REPORT 0x09U -#define USBD_HID_REQ_GET_REPORT 0x01U -/** - * @} - */ - - -/** @defgroup USBD_CORE_Exported_TypesDefinitions - * @{ - */ -typedef enum -{ - USBD_HID_IDLE = 0, - USBD_HID_BUSY, -} USBD_HID_StateTypeDef; - - -typedef struct -{ - uint32_t Protocol; - uint32_t IdleState; - uint32_t AltSetting; - USBD_HID_StateTypeDef state; -} USBD_HID_HandleTypeDef; - -/* - * HID Class specification version 1.1 - * 6.2.1 HID Descriptor - */ - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint16_t bcdHID; - uint8_t bCountryCode; - uint8_t bNumDescriptors; - uint8_t bHIDDescriptorType; - uint16_t wItemLength; -} __PACKED USBD_HIDDescTypeDef; - -/** - * @} - */ - - - -/** @defgroup USBD_CORE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Exported_Variables - * @{ - */ - -extern USBD_ClassTypeDef USBD_HID; -#define USBD_HID_CLASS &USBD_HID -/** - * @} - */ - -/** @defgroup USB_CORE_Exported_Functions - * @{ - */ -#ifdef USE_USBD_COMPOSITE -uint8_t USBD_HID_SendReport(USBD_HandleTypeDef *pdev, uint8_t *report, uint16_t len, uint8_t ClassId); -#else -uint8_t USBD_HID_SendReport(USBD_HandleTypeDef *pdev, uint8_t *report, uint16_t len); -#endif /* USE_USBD_COMPOSITE */ -uint32_t USBD_HID_GetPollingInterval(USBD_HandleTypeDef *pdev); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_HID_H */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/Class/HID/Src/usbd_hid.c b/Class/HID/Src/usbd_hid.c deleted file mode 100644 index fdf7578..0000000 --- a/Class/HID/Src/usbd_hid.c +++ /dev/null @@ -1,650 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_hid.c - * @author MCD Application Team - * @brief This file provides the HID core functions. - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - * @verbatim - * - * =================================================================== - * HID Class Description - * =================================================================== - * This module manages the HID class V1.11 following the "Device Class Definition - * for Human Interface Devices (HID) Version 1.11 Jun 27, 2001". - * This driver implements the following aspects of the specification: - * - The Boot Interface Subclass - * - The Mouse protocol - * - Usage Page : Generic Desktop - * - Usage : Joystick - * - Collection : Application - * - * @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 - * - ****************************************************************************** - */ - -/* BSPDependencies -- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c" -- "stm32xxxxx_{eval}{discovery}_io.c" -EndBSPDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_hid.h" -#include "usbd_ctlreq.h" - - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_HID - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_HID_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_HID_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_HID_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_HID_Private_FunctionPrototypes - * @{ - */ - -static uint8_t USBD_HID_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_HID_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_HID_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static uint8_t USBD_HID_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); -#ifndef USE_USBD_COMPOSITE -static uint8_t *USBD_HID_GetFSCfgDesc(uint16_t *length); -static uint8_t *USBD_HID_GetHSCfgDesc(uint16_t *length); -static uint8_t *USBD_HID_GetOtherSpeedCfgDesc(uint16_t *length); -static uint8_t *USBD_HID_GetDeviceQualifierDesc(uint16_t *length); -#endif /* USE_USBD_COMPOSITE */ -/** - * @} - */ - -/** @defgroup USBD_HID_Private_Variables - * @{ - */ - -USBD_ClassTypeDef USBD_HID = -{ - USBD_HID_Init, - USBD_HID_DeInit, - USBD_HID_Setup, - NULL, /* EP0_TxSent */ - NULL, /* EP0_RxReady */ - USBD_HID_DataIn, /* DataIn */ - NULL, /* DataOut */ - NULL, /* SOF */ - NULL, - NULL, -#ifdef USE_USBD_COMPOSITE - NULL, - NULL, - NULL, - NULL, -#else - USBD_HID_GetHSCfgDesc, - USBD_HID_GetFSCfgDesc, - USBD_HID_GetOtherSpeedCfgDesc, - USBD_HID_GetDeviceQualifierDesc, -#endif /* USE_USBD_COMPOSITE */ -}; - -#ifndef USE_USBD_COMPOSITE -/* USB HID device FS Configuration Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END = -{ - 0x09, /* bLength: Configuration Descriptor size */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - USB_HID_CONFIG_DESC_SIZ, /* wTotalLength: Bytes returned */ - 0x00, - 0x01, /* bNumInterfaces: 1 interface */ - 0x01, /* bConfigurationValue: Configuration value */ - 0x00, /* iConfiguration: Index of string descriptor - describing the configuration */ -#if (USBD_SELF_POWERED == 1U) - 0xE0, /* bmAttributes: Bus Powered according to user configuration */ -#else - 0xA0, /* bmAttributes: Bus Powered according to user configuration */ -#endif /* USBD_SELF_POWERED */ - USBD_MAX_POWER, /* MaxPower (mA) */ - - /************** Descriptor of Joystick Mouse interface ****************/ - /* 09 */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints */ - 0x03, /* bInterfaceClass: HID */ - 0x01, /* bInterfaceSubClass : 1=BOOT, 0=no boot */ - 0x02, /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */ - 0, /* iInterface: Index of string descriptor */ - /******************** Descriptor of Joystick Mouse HID ********************/ - /* 18 */ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */ - 0x11, /* bcdHID: HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ - 0x22, /* bDescriptorType */ - HID_MOUSE_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ - 0x00, - /******************** Descriptor of Mouse endpoint ********************/ - /* 27 */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType:*/ - - HID_EPIN_ADDR, /* bEndpointAddress: Endpoint Address (IN) */ - 0x03, /* bmAttributes: Interrupt endpoint */ - HID_EPIN_SIZE, /* wMaxPacketSize: 4 Bytes max */ - 0x00, - HID_FS_BINTERVAL, /* bInterval: Polling Interval */ - /* 34 */ -}; -#endif /* USE_USBD_COMPOSITE */ - -/* USB HID device Configuration Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_HID_Desc[USB_HID_DESC_SIZ] __ALIGN_END = -{ - /* 18 */ - 0x09, /* bLength: HID Descriptor size */ - HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */ - 0x11, /* bcdHID: HID Class Spec release number */ - 0x01, - 0x00, /* bCountryCode: Hardware target country */ - 0x01, /* bNumDescriptors: Number of HID class descriptors to follow */ - 0x22, /* bDescriptorType */ - HID_MOUSE_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */ - 0x00, -}; - -#ifndef USE_USBD_COMPOSITE -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_HID_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = -{ - USB_LEN_DEV_QUALIFIER_DESC, - USB_DESC_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x01, - 0x00, -}; -#endif /* USE_USBD_COMPOSITE */ - -__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END = -{ - 0x05, 0x01, /* Usage Page (Generic Desktop Ctrls) */ - 0x09, 0x02, /* Usage (Mouse) */ - 0xA1, 0x01, /* Collection (Application) */ - 0x09, 0x01, /* Usage (Pointer) */ - 0xA1, 0x00, /* Collection (Physical) */ - 0x05, 0x09, /* Usage Page (Button) */ - 0x19, 0x01, /* Usage Minimum (0x01) */ - 0x29, 0x03, /* Usage Maximum (0x03) */ - 0x15, 0x00, /* Logical Minimum (0) */ - 0x25, 0x01, /* Logical Maximum (1) */ - 0x95, 0x03, /* Report Count (3) */ - 0x75, 0x01, /* Report Size (1) */ - 0x81, 0x02, /* Input (Data,Var,Abs) */ - 0x95, 0x01, /* Report Count (1) */ - 0x75, 0x05, /* Report Size (5) */ - 0x81, 0x01, /* Input (Const,Array,Abs) */ - 0x05, 0x01, /* Usage Page (Generic Desktop Ctrls) */ - 0x09, 0x30, /* Usage (X) */ - 0x09, 0x31, /* Usage (Y) */ - 0x09, 0x38, /* Usage (Wheel) */ - 0x15, 0x81, /* Logical Minimum (-127) */ - 0x25, 0x7F, /* Logical Maximum (127) */ - 0x75, 0x08, /* Report Size (8) */ - 0x95, 0x03, /* Report Count (3) */ - 0x81, 0x06, /* Input (Data,Var,Rel) */ - 0xC0, /* End Collection */ - 0x09, 0x3C, /* Usage (Motion Wakeup) */ - 0x05, 0xFF, /* Usage Page (Reserved 0xFF) */ - 0x09, 0x01, /* Usage (0x01) */ - 0x15, 0x00, /* Logical Minimum (0) */ - 0x25, 0x01, /* Logical Maximum (1) */ - 0x75, 0x01, /* Report Size (1) */ - 0x95, 0x02, /* Report Count (2) */ - 0xB1, 0x22, /* Feature (Data,Var,Abs,NoWrp) */ - 0x75, 0x06, /* Report Size (6) */ - 0x95, 0x01, /* Report Count (1) */ - 0xB1, 0x01, /* Feature (Const,Array,Abs,NoWrp) */ - 0xC0 /* End Collection */ -}; - -static uint8_t HIDInEpAdd = HID_EPIN_ADDR; - -/** - * @} - */ - -/** @defgroup USBD_HID_Private_Functions - * @{ - */ - -/** - * @brief USBD_HID_Init - * Initialize the HID interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_HID_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - - USBD_HID_HandleTypeDef *hhid; - - hhid = (USBD_HID_HandleTypeDef *)USBD_malloc(sizeof(USBD_HID_HandleTypeDef)); - - if (hhid == NULL) - { - pdev->pClassDataCmsit[pdev->classId] = NULL; - return (uint8_t)USBD_EMEM; - } - - pdev->pClassDataCmsit[pdev->classId] = (void *)hhid; - pdev->pClassData = pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - HIDInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - pdev->ep_in[HIDInEpAdd & 0xFU].bInterval = HID_HS_BINTERVAL; - } - else /* LOW and FULL-speed endpoints */ - { - pdev->ep_in[HIDInEpAdd & 0xFU].bInterval = HID_FS_BINTERVAL; - } - - /* Open EP IN */ - (void)USBD_LL_OpenEP(pdev, HIDInEpAdd, USBD_EP_TYPE_INTR, HID_EPIN_SIZE); - pdev->ep_in[HIDInEpAdd & 0xFU].is_used = 1U; - - hhid->state = USBD_HID_IDLE; - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_HID_DeInit - * DeInitialize the HID layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_HID_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - HIDInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Close HID EPs */ - (void)USBD_LL_CloseEP(pdev, HIDInEpAdd); - pdev->ep_in[HIDInEpAdd & 0xFU].is_used = 0U; - pdev->ep_in[HIDInEpAdd & 0xFU].bInterval = 0U; - - /* Free allocated memory */ - if (pdev->pClassDataCmsit[pdev->classId] != NULL) - { - (void)USBD_free(pdev->pClassDataCmsit[pdev->classId]); - pdev->pClassDataCmsit[pdev->classId] = NULL; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_HID_Setup - * Handle the HID specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t USBD_HID_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_HID_HandleTypeDef *hhid = (USBD_HID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_StatusTypeDef ret = USBD_OK; - uint16_t len; - uint8_t *pbuf; - uint16_t status_info = 0U; - - if (hhid == NULL) - { - return (uint8_t)USBD_FAIL; - } - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS : - switch (req->bRequest) - { - case USBD_HID_REQ_SET_PROTOCOL: - hhid->Protocol = (uint8_t)(req->wValue); - break; - - case USBD_HID_REQ_GET_PROTOCOL: - (void)USBD_CtlSendData(pdev, (uint8_t *)&hhid->Protocol, 1U); - break; - - case USBD_HID_REQ_SET_IDLE: - hhid->IdleState = (uint8_t)(req->wValue >> 8); - break; - - case USBD_HID_REQ_GET_IDLE: - (void)USBD_CtlSendData(pdev, (uint8_t *)&hhid->IdleState, 1U); - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - break; - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_STATUS: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, (uint8_t *)&status_info, 2U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_GET_DESCRIPTOR: - if ((req->wValue >> 8) == HID_REPORT_DESC) - { - len = MIN(HID_MOUSE_REPORT_DESC_SIZE, req->wLength); - pbuf = HID_MOUSE_ReportDesc; - } - else if ((req->wValue >> 8) == HID_DESCRIPTOR_TYPE) - { - pbuf = USBD_HID_Desc; - len = MIN(USB_HID_DESC_SIZ, req->wLength); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - (void)USBD_CtlSendData(pdev, pbuf, len); - break; - - case USB_REQ_GET_INTERFACE : - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, (uint8_t *)&hhid->AltSetting, 1U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_SET_INTERFACE: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - hhid->AltSetting = (uint8_t)(req->wValue); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_CLEAR_FEATURE: - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - - return (uint8_t)ret; -} - - -/** - * @brief USBD_HID_SendReport - * Send HID Report - * @param pdev: device instance - * @param buff: pointer to report - * @param ClassId: The Class ID - * @retval status - */ -#ifdef USE_USBD_COMPOSITE -uint8_t USBD_HID_SendReport(USBD_HandleTypeDef *pdev, uint8_t *report, uint16_t len, uint8_t ClassId) -{ - USBD_HID_HandleTypeDef *hhid = (USBD_HID_HandleTypeDef *)pdev->pClassDataCmsit[ClassId]; -#else -uint8_t USBD_HID_SendReport(USBD_HandleTypeDef *pdev, uint8_t *report, uint16_t len) -{ - USBD_HID_HandleTypeDef *hhid = (USBD_HID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; -#endif /* USE_USBD_COMPOSITE */ - - if (hhid == NULL) - { - return (uint8_t)USBD_FAIL; - } - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - HIDInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, ClassId); -#endif /* USE_USBD_COMPOSITE */ - - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (hhid->state == USBD_HID_IDLE) - { - hhid->state = USBD_HID_BUSY; - (void)USBD_LL_Transmit(pdev, HIDInEpAdd, report, len); - } - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_HID_GetPollingInterval - * return polling interval from endpoint descriptor - * @param pdev: device instance - * @retval polling interval - */ -uint32_t USBD_HID_GetPollingInterval(USBD_HandleTypeDef *pdev) -{ - uint32_t polling_interval; - - /* HIGH-speed endpoints */ - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - /* Sets the data transfer polling interval for high speed transfers. - Values between 1..16 are allowed. Values correspond to interval - of 2 ^ (bInterval-1). This option (8 ms, corresponds to HID_HS_BINTERVAL */ - polling_interval = (((1U << (HID_HS_BINTERVAL - 1U))) / 8U); - } - else /* LOW and FULL-speed endpoints */ - { - /* Sets the data transfer polling interval for low and full - speed transfers */ - polling_interval = HID_FS_BINTERVAL; - } - - return ((uint32_t)(polling_interval)); -} - -#ifndef USE_USBD_COMPOSITE -/** - * @brief USBD_HID_GetCfgFSDesc - * return FS configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_HID_GetFSCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpDesc = USBD_GetEpDesc(USBD_HID_CfgDesc, HID_EPIN_ADDR); - - if (pEpDesc != NULL) - { - pEpDesc->bInterval = HID_FS_BINTERVAL; - } - - *length = (uint16_t)sizeof(USBD_HID_CfgDesc); - return USBD_HID_CfgDesc; -} - -/** - * @brief USBD_HID_GetCfgHSDesc - * return HS configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_HID_GetHSCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpDesc = USBD_GetEpDesc(USBD_HID_CfgDesc, HID_EPIN_ADDR); - - if (pEpDesc != NULL) - { - pEpDesc->bInterval = HID_HS_BINTERVAL; - } - - *length = (uint16_t)sizeof(USBD_HID_CfgDesc); - return USBD_HID_CfgDesc; -} - -/** - * @brief USBD_HID_GetOtherSpeedCfgDesc - * return other speed configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_HID_GetOtherSpeedCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpDesc = USBD_GetEpDesc(USBD_HID_CfgDesc, HID_EPIN_ADDR); - - if (pEpDesc != NULL) - { - pEpDesc->bInterval = HID_FS_BINTERVAL; - } - - *length = (uint16_t)sizeof(USBD_HID_CfgDesc); - return USBD_HID_CfgDesc; -} -#endif /* USE_USBD_COMPOSITE */ - -/** - * @brief USBD_HID_DataIn - * handle data IN Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_HID_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - UNUSED(epnum); - /* Ensure that the FIFO is empty before a new transfer, this condition could - be caused by a new transfer before the end of the previous transfer */ - ((USBD_HID_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId])->state = USBD_HID_IDLE; - - return (uint8_t)USBD_OK; -} - -#ifndef USE_USBD_COMPOSITE -/** - * @brief DeviceQualifierDescriptor - * return Device Qualifier descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_HID_GetDeviceQualifierDesc(uint16_t *length) -{ - *length = (uint16_t)sizeof(USBD_HID_DeviceQualifierDesc); - - return USBD_HID_DeviceQualifierDesc; -} -#endif /* USE_USBD_COMPOSITE */ -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - diff --git a/Class/MSC/Inc/usbd_msc.h b/Class/MSC/Inc/usbd_msc.h deleted file mode 100644 index c9c26cb..0000000 --- a/Class/MSC/Inc/usbd_msc.h +++ /dev/null @@ -1,137 +0,0 @@ -/** - ****************************************************************************** - * @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 is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* 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 - -#ifndef MSC_EPIN_ADDR -#define MSC_EPIN_ADDR 0x81U -#endif /* MSC_EPIN_ADDR */ - -#ifndef MSC_EPOUT_ADDR -#define MSC_EPOUT_ADDR 0x01U -#endif /* MSC_EPOUT_ADDR */ - -#ifndef MSC_BOT_MAX_LUN -#define MSC_BOT_MAX_LUN 0x2U -#endif /* MSC_BOT_MAX_LUN */ - -/** - * @} - */ - -/** @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 -{ - uint16_t size; - uint32_t nbr; - uint32_t addr; - uint32_t len; -} USBD_MSC_BOT_LUN_TypeDef; - -typedef struct -{ - uint32_t max_lun; - uint32_t interface; - uint8_t bot_state; - uint8_t bot_status; - uint32_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; - uint8_t scsi_medium_state; - - USBD_MSC_BOT_LUN_TypeDef scsi_blk[MSC_BOT_MAX_LUN]; -} USBD_MSC_BOT_HandleTypeDef; - -/* Structure for MSC process */ -extern USBD_ClassTypeDef USBD_MSC; -#define USBD_MSC_CLASS &USBD_MSC - -uint8_t USBD_MSC_RegisterStorage(USBD_HandleTypeDef *pdev, - USBD_StorageTypeDef *fops); -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_MSC_H */ -/** - * @} - */ diff --git a/Class/MSC/Inc/usbd_msc_bot.h b/Class/MSC/Inc/usbd_msc_bot.h deleted file mode 100644 index 8550a39..0000000 --- a/Class/MSC/Inc/usbd_msc_bot.h +++ /dev/null @@ -1,146 +0,0 @@ -/** - ****************************************************************************** - * @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 is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* 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 */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/Class/MSC/Inc/usbd_msc_data.h b/Class/MSC/Inc/usbd_msc_data.h deleted file mode 100644 index a321c91..0000000 --- a/Class/MSC/Inc/usbd_msc_data.h +++ /dev/null @@ -1,106 +0,0 @@ -/** - ****************************************************************************** - * @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 is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* 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 0x04U -#define MODE_SENSE10_LEN 0x08U -#define LENGTH_INQUIRY_PAGE00 0x06U -#define LENGTH_INQUIRY_PAGE80 0x08U -#define LENGTH_FORMAT_CAPACITIES 0x14U -#define DIAGNOSTIC_DATA_LEN 0x08U -#define LOG_PAGE_DATA_LEN 0x10U - -/** - * @} - */ - - -/** @defgroup USBD_INFO_Exported_TypesDefinitions - * @{ - */ -/** - * @} - */ - - - -/** @defgroup USBD_INFO_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_INFO_Exported_Variables - * @{ - */ -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]; -extern uint8_t MSC_Diagnostic_Data[DIAGNOSTIC_DATA_LEN]; -extern uint8_t MSC_Log_Page_Data[LOG_PAGE_DATA_LEN]; - -/** - * @} - */ - -/** @defgroup USBD_INFO_Exported_FunctionsPrototype - * @{ - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_MSC_DATA_H */ - -/** - * @} - */ - -/** - * @} - */ diff --git a/Class/MSC/Inc/usbd_msc_scsi.h b/Class/MSC/Inc/usbd_msc_scsi.h deleted file mode 100644 index 6000c2b..0000000 --- a/Class/MSC/Inc/usbd_msc_scsi.h +++ /dev/null @@ -1,183 +0,0 @@ -/** - ****************************************************************************** - * @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 is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* 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_READ_FORMAT_CAPACITIES 0x23U -#define SCSI_RECEIVE_DIAGNOSTIC_RESULTS 0x1CU -#define SCSI_SEND_DIAGNOSTIC 0x1DU -#define SCSI_REPORT_LUNS 0xA0U - -#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 MSC_VENDOR_SPECIFIC 9U -#define COPY_ABORTED 10U -#define ABORTED_COMMAND 11U -#define VOLUME_OVERFLOW 13U -#define MISCOMPARE 14U - -#define INVALID_CDB 0x20U -#define INVALID_FIELD_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 REQUEST_SENSE_DATA_LEN 0x12U -#define STANDARD_INQUIRY_DATA_LEN 0x24U -#define BLKVFY 0x04U - -#define SCSI_MEDIUM_UNLOCKED 0x00U -#define SCSI_MEDIUM_LOCKED 0x01U -#define SCSI_MEDIUM_EJECTED 0x02U -/** - * @} - */ - - -/** @defgroup USBD_SCSI_Exported_TypesDefinitions - * @{ - */ - -typedef struct _SENSE_ITEM -{ - uint8_t Skey; - union - { - struct _ASCs - { - uint8_t ASC; - uint8_t ASCQ; - } b; - uint8_t ASC; - uint8_t *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 */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/Class/MSC/Inc/usbd_msc_storage_template.h b/Class/MSC/Inc/usbd_msc_storage_template.h deleted file mode 100644 index cb8b89a..0000000 --- a/Class/MSC/Inc/usbd_msc_storage_template.h +++ /dev/null @@ -1,96 +0,0 @@ -/** - ****************************************************************************** - * @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 is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* 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 */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/Class/MSC/Src/usbd_msc.c b/Class/MSC/Src/usbd_msc.c deleted file mode 100644 index d02af8b..0000000 --- a/Class/MSC/Src/usbd_msc.c +++ /dev/null @@ -1,581 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_msc.c - * @author MCD Application Team - * @brief This file provides all the MSC core functions. - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - * @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 - * - ****************************************************************************** - */ - -/* 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); - -#ifndef USE_USBD_COMPOSITE -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); -#endif /* USE_USBD_COMPOSITE */ -/** - * @} - */ - - -/** @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, -#ifdef USE_USBD_COMPOSITE - NULL, - NULL, - NULL, - NULL, -#else - USBD_MSC_GetHSCfgDesc, - USBD_MSC_GetFSCfgDesc, - USBD_MSC_GetOtherSpeedCfgDesc, - USBD_MSC_GetDeviceQualifierDescriptor, -#endif /* USE_USBD_COMPOSITE */ -}; - -/* USB Mass storage device Configuration Descriptor */ -#ifndef USE_USBD_COMPOSITE -/* USB Mass storage device Configuration Descriptor */ -/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */ -__ALIGN_BEGIN static uint8_t USBD_MSC_CfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END = -{ - 0x09, /* bLength: Configuration Descriptor size */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - USB_MSC_CONFIG_DESC_SIZ, - - 0x00, - 0x01, /* bNumInterfaces: 1 interface */ - 0x01, /* bConfigurationValue */ - 0x04, /* iConfiguration */ -#if (USBD_SELF_POWERED == 1U) - 0xC0, /* bmAttributes: Bus Powered according to user configuration */ -#else - 0x80, /* bmAttributes: Bus Powered according to user configuration */ -#endif /* USBD_SELF_POWERED */ - USBD_MAX_POWER, /* MaxPower (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 */ -}; - -/* USB Standard Device Descriptor */ -__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, - 0x02, - 0x00, - 0x00, - 0x00, - MSC_MAX_FS_PACKET, - 0x01, - 0x00, -}; -#endif /* USE_USBD_COMPOSITE */ - -uint8_t MSCInEpAdd = MSC_EPIN_ADDR; -uint8_t MSCOutEpAdd = MSC_EPOUT_ADDR; - -/** - * @} - */ - - -/** @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) -{ - UNUSED(cfgidx); - USBD_MSC_BOT_HandleTypeDef *hmsc; - - hmsc = (USBD_MSC_BOT_HandleTypeDef *)USBD_malloc(sizeof(USBD_MSC_BOT_HandleTypeDef)); - - if (hmsc == NULL) - { - pdev->pClassDataCmsit[pdev->classId] = NULL; - return (uint8_t)USBD_EMEM; - } - - pdev->pClassDataCmsit[pdev->classId] = (void *)hmsc; - pdev->pClassData = pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - MSCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - MSCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - /* Open EP OUT */ - (void)USBD_LL_OpenEP(pdev, MSCOutEpAdd, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); - pdev->ep_out[MSCOutEpAdd & 0xFU].is_used = 1U; - - /* Open EP IN */ - (void)USBD_LL_OpenEP(pdev, MSCInEpAdd, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET); - pdev->ep_in[MSCInEpAdd & 0xFU].is_used = 1U; - } - else - { - /* Open EP OUT */ - (void)USBD_LL_OpenEP(pdev, MSCOutEpAdd, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); - pdev->ep_out[MSCOutEpAdd & 0xFU].is_used = 1U; - - /* Open EP IN */ - (void)USBD_LL_OpenEP(pdev, MSCInEpAdd, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET); - pdev->ep_in[MSCInEpAdd & 0xFU].is_used = 1U; - } - - /* Init the BOT layer */ - MSC_BOT_Init(pdev); - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_MSC_DeInit - * 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) -{ - UNUSED(cfgidx); - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - MSCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - MSCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Close MSC EPs */ - (void)USBD_LL_CloseEP(pdev, MSCOutEpAdd); - pdev->ep_out[MSCOutEpAdd & 0xFU].is_used = 0U; - - /* Close EP IN */ - (void)USBD_LL_CloseEP(pdev, MSCInEpAdd); - pdev->ep_in[MSCInEpAdd & 0xFU].is_used = 0U; - - /* Free MSC Class Resources */ - if (pdev->pClassDataCmsit[pdev->classId] != NULL) - { - /* De-Init the BOT layer */ - MSC_BOT_DeInit(pdev); - - (void)USBD_free(pdev->pClassDataCmsit[pdev->classId]); - pdev->pClassDataCmsit[pdev->classId] = NULL; - pdev->pClassData = NULL; - } - - return (uint8_t)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 = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_StatusTypeDef ret = USBD_OK; - uint32_t max_lun; - uint16_t status_info = 0U; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - MSCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - MSCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (hmsc == NULL) - { - return (uint8_t)USBD_FAIL; - } - - 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)) - { - max_lun = (uint32_t)((USBD_StorageTypeDef *)pdev->pUserData[pdev->classId])->GetMaxLun(); - hmsc->max_lun = (max_lun > MSC_BOT_MAX_LUN) ? MSC_BOT_MAX_LUN : max_lun; - (void)USBD_CtlSendData(pdev, (uint8_t *)&hmsc->max_lun, 1U); - } - 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) - { - (void)USBD_CtlSendData(pdev, (uint8_t *)&status_info, 2U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_GET_INTERFACE: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, (uint8_t *)&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: - 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); - - /* 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 (uint8_t)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 (uint8_t)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 (uint8_t)USBD_OK; -} -#ifndef USE_USBD_COMPOSITE -/** - * @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) -{ - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_MSC_CfgDesc, MSC_EPIN_ADDR); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_MSC_CfgDesc, MSC_EPOUT_ADDR); - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = MSC_MAX_HS_PACKET; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = MSC_MAX_HS_PACKET; - } - - *length = (uint16_t)sizeof(USBD_MSC_CfgDesc); - return USBD_MSC_CfgDesc; -} - -/** - * @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) -{ - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_MSC_CfgDesc, MSC_EPIN_ADDR); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_MSC_CfgDesc, MSC_EPOUT_ADDR); - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = MSC_MAX_FS_PACKET; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = MSC_MAX_FS_PACKET; - } - - *length = (uint16_t)sizeof(USBD_MSC_CfgDesc); - return USBD_MSC_CfgDesc; -} - -/** - * @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) -{ - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_MSC_CfgDesc, MSC_EPIN_ADDR); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_MSC_CfgDesc, MSC_EPOUT_ADDR); - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = MSC_MAX_FS_PACKET; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = MSC_MAX_FS_PACKET; - } - - *length = (uint16_t)sizeof(USBD_MSC_CfgDesc); - return USBD_MSC_CfgDesc; -} -/** - * @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 = (uint16_t)sizeof(USBD_MSC_DeviceQualifierDesc); - - return USBD_MSC_DeviceQualifierDesc; -} -#endif /* USE_USBD_COMPOSITE */ -/** - * @brief USBD_MSC_RegisterStorage - * @param fops: storage callback - * @retval status - */ -uint8_t USBD_MSC_RegisterStorage(USBD_HandleTypeDef *pdev, USBD_StorageTypeDef *fops) -{ - if (fops == NULL) - { - return (uint8_t)USBD_FAIL; - } - - pdev->pUserData[pdev->classId] = fops; - - return (uint8_t)USBD_OK; -} - -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - diff --git a/Class/MSC/Src/usbd_msc_bot.c b/Class/MSC/Src/usbd_msc_bot.c deleted file mode 100644 index e1cb63c..0000000 --- a/Class/MSC/Src/usbd_msc_bot.c +++ /dev/null @@ -1,478 +0,0 @@ -/** - ****************************************************************************** - * @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 is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* 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 - * @{ - */ -extern uint8_t MSCInEpAdd; -extern uint8_t MSCOutEpAdd; -/** - * @} - */ - - -/** @defgroup MSC_BOT_Private_FunctionPrototypes - * @{ - */ -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); -/** - * @} - */ - - -/** @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 = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - MSCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - MSCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (hmsc == NULL) - { - return; - } - - hmsc->bot_state = USBD_BOT_IDLE; - hmsc->bot_status = USBD_BOT_STATUS_NORMAL; - - hmsc->scsi_sense_tail = 0U; - hmsc->scsi_sense_head = 0U; - hmsc->scsi_medium_state = SCSI_MEDIUM_UNLOCKED; - - ((USBD_StorageTypeDef *)pdev->pUserData[pdev->classId])->Init(0U); - - (void)USBD_LL_FlushEP(pdev, MSCOutEpAdd); - (void)USBD_LL_FlushEP(pdev, MSCInEpAdd); - - /* Prepare EP to Receive First BOT Cmd */ - (void)USBD_LL_PrepareReceive(pdev, MSCOutEpAdd, (uint8_t *)&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 = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - MSCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - MSCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (hmsc == NULL) - { - return; - } - - hmsc->bot_state = USBD_BOT_IDLE; - hmsc->bot_status = USBD_BOT_STATUS_RECOVERY; - - (void)USBD_LL_ClearStallEP(pdev, MSCInEpAdd); - (void)USBD_LL_ClearStallEP(pdev, MSCOutEpAdd); - - /* Prepare EP to Receive First BOT Cmd */ - (void)USBD_LL_PrepareReceive(pdev, MSCOutEpAdd, (uint8_t *)&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 = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hmsc != NULL) - { - 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) -{ - UNUSED(epnum); - - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hmsc == NULL) - { - return; - } - - 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) -{ - UNUSED(epnum); - - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hmsc == NULL) - { - return; - } - - 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 = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - MSCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - MSCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (hmsc == NULL) - { - return; - } - - hmsc->csw.dTag = hmsc->cbw.dTag; - hmsc->csw.dDataResidue = hmsc->cbw.dDataLength; - - if ((USBD_LL_GetRxDataSize(pdev, MSCOutEpAdd) != USBD_BOT_CBW_LENGTH) || - (hmsc->cbw.dSignature != USBD_BOT_CBW_SIGNATURE) || - (hmsc->cbw.bLUN > hmsc->max_lun) || (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, uint32_t len) -{ - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - uint32_t length; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - MSCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - MSCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (hmsc == NULL) - { - return; - } - - length = MIN(hmsc->cbw.dDataLength, len); - - hmsc->csw.dDataResidue -= len; - hmsc->csw.bStatus = USBD_CSW_CMD_PASSED; - hmsc->bot_state = USBD_BOT_SEND_DATA; - - (void)USBD_LL_Transmit(pdev, MSCInEpAdd, 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 = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - MSCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - MSCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (hmsc == NULL) - { - return; - } - - hmsc->csw.dSignature = USBD_BOT_CSW_SIGNATURE; - hmsc->csw.bStatus = CSW_Status; - hmsc->bot_state = USBD_BOT_IDLE; - - (void)USBD_LL_Transmit(pdev, MSCInEpAdd, (uint8_t *)&hmsc->csw, - USBD_BOT_CSW_LENGTH); - - /* Prepare EP to Receive next Cmd */ - (void)USBD_LL_PrepareReceive(pdev, MSCOutEpAdd, (uint8_t *)&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 = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - MSCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - MSCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (hmsc == NULL) - { - return; - } - - if ((hmsc->cbw.bmFlags == 0U) && - (hmsc->cbw.dDataLength != 0U) && - (hmsc->bot_status == USBD_BOT_STATUS_NORMAL)) - { - (void)USBD_LL_StallEP(pdev, MSCOutEpAdd); - } - - (void)USBD_LL_StallEP(pdev, MSCInEpAdd); - - if (hmsc->bot_status == USBD_BOT_STATUS_ERROR) - { - (void)USBD_LL_StallEP(pdev, MSCInEpAdd); - (void)USBD_LL_StallEP(pdev, MSCOutEpAdd); - } -} - -/** - * @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 = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - MSCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - MSCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (hmsc == NULL) - { - return; - } - - if (hmsc->bot_status == USBD_BOT_STATUS_ERROR) /* Bad CBW Signature */ - { - (void)USBD_LL_StallEP(pdev, MSCInEpAdd); - (void)USBD_LL_StallEP(pdev, MSCOutEpAdd); - } - else if (((epnum & 0x80U) == 0x80U) && (hmsc->bot_status != USBD_BOT_STATUS_RECOVERY)) - { - MSC_BOT_SendCSW(pdev, USBD_CSW_CMD_FAILED); - } - else - { - return; - } -} -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - diff --git a/Class/MSC/Src/usbd_msc_data.c b/Class/MSC/Src/usbd_msc_data.c deleted file mode 100644 index 333a87a..0000000 --- a/Class/MSC/Src/usbd_msc_data.c +++ /dev/null @@ -1,164 +0,0 @@ -/** - ****************************************************************************** - * @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 is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* 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 */ -uint8_t MSC_Page00_Inquiry_Data[LENGTH_INQUIRY_PAGE00] = -{ - 0x00, - 0x00, - 0x00, - (LENGTH_INQUIRY_PAGE00 - 4U), - 0x00, - 0x80 -}; - -/* 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] = -{ - 0x03, /* MODE DATA LENGTH. The number of bytes that follow. */ - 0x00, /* MEDIUM TYPE. 00h for SBC devices. */ - 0x00, /* DEVICE-SPECIFIC PARAMETER. For SBC devices: - * bit 7: WP. Set to 1 if the media is write-protected. - * bits 6..5: reserved - * bit 4: DPOFUA. Set to 1 if the device supports the DPO and FUA bits - * bits 3..0: reserved */ - 0x00 /* BLOCK DESCRIPTOR LENGTH */ -}; - - -/* USB Mass storage sense 10 Data */ -uint8_t MSC_Mode_Sense10_data[MODE_SENSE10_LEN] = -{ - 0x00, /* MODE DATA LENGTH MSB. */ - 0x06, /* MODE DATA LENGTH LSB. The number of bytes that follow. */ - 0x00, /* MEDIUM TYPE. 00h for SBC devices. */ - 0x00, /* DEVICE-SPECIFIC PARAMETER. For SBC devices: - * bit 7: WP. Set to 1 if the media is write-protected. - * bits 6..5: reserved - * bit 4: DPOFUA. Set to 1 if the device supports the DPO and FUA bits - * bits 3..0: reserved */ - 0x00, /* LONGLBA Set to zero */ - 0x00, /* Reserved */ - 0x00, /* BLOCK DESCRIPTOR LENGTH MSB. */ - 0x00 /* BLOCK DESCRIPTOR LENGTH LSB. */ -}; - -uint8_t MSC_Diagnostic_Data[DIAGNOSTIC_DATA_LEN] = -{ - 0x00, /* Byte 0: ADDITIONAL LENGTH (MSB) */ - 0x00, /* Byte 1: ADDITIONAL LENGTH (LSB) */ - 0x00, /* Byte 2: FRU CODE (most probable) */ - 0x00, /* Byte 3: FRU CODE */ - 0x00, /* Byte 4: FRU CODE */ - 0x00, /* Byte 5: FRU CODE (least probable) */ - 0x00, /* Byte 6: ERROR CODE (MSB) */ - 0x00, /* Byte 7: ERROR CODE (LSB) */ -}; - -/** - * @} - */ - - -/** @defgroup MSC_DATA_Private_FunctionPrototypes - * @{ - */ -/** - * @} - */ - - -/** @defgroup MSC_DATA_Private_Functions - * @{ - */ - -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - diff --git a/Class/MSC/Src/usbd_msc_scsi.c b/Class/MSC/Src/usbd_msc_scsi.c deleted file mode 100644 index 25f9423..0000000 --- a/Class/MSC/Src/usbd_msc_scsi.c +++ /dev/null @@ -1,1323 +0,0 @@ -/** - ****************************************************************************** - * @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 is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* 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 - * @{ - */ -extern uint8_t MSCInEpAdd; -extern uint8_t MSCOutEpAdd; -/** - * @} - */ - - -/** @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_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_ReportLuns(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params); -static int8_t SCSI_ReceiveDiagnosticResults(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); - -static int8_t SCSI_UpdateBotData(USBD_MSC_BOT_HandleTypeDef *hmsc, - uint8_t *pBuff, uint16_t length); -/** - * @} - */ - - -/** @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) -{ - int8_t ret; - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hmsc == NULL) - { - return -1; - } - - switch (cmd[0]) - { - case SCSI_TEST_UNIT_READY: - ret = SCSI_TestUnitReady(pdev, lun, cmd); - break; - - case SCSI_REQUEST_SENSE: - ret = SCSI_RequestSense(pdev, lun, cmd); - break; - - case SCSI_INQUIRY: - ret = SCSI_Inquiry(pdev, lun, cmd); - break; - - case SCSI_START_STOP_UNIT: - ret = SCSI_StartStopUnit(pdev, lun, cmd); - break; - - case SCSI_ALLOW_MEDIUM_REMOVAL: - ret = SCSI_AllowPreventRemovable(pdev, lun, cmd); - break; - - case SCSI_MODE_SENSE6: - ret = SCSI_ModeSense6(pdev, lun, cmd); - break; - - case SCSI_MODE_SENSE10: - ret = SCSI_ModeSense10(pdev, lun, cmd); - break; - - case SCSI_READ_FORMAT_CAPACITIES: - ret = SCSI_ReadFormatCapacity(pdev, lun, cmd); - break; - - case SCSI_READ_CAPACITY10: - ret = SCSI_ReadCapacity10(pdev, lun, cmd); - break; - - case SCSI_READ_CAPACITY16: - ret = SCSI_ReadCapacity16(pdev, lun, cmd); - break; - - case SCSI_READ10: - ret = SCSI_Read10(pdev, lun, cmd); - break; - - case SCSI_READ12: - ret = SCSI_Read12(pdev, lun, cmd); - break; - - case SCSI_WRITE10: - ret = SCSI_Write10(pdev, lun, cmd); - break; - - case SCSI_WRITE12: - ret = SCSI_Write12(pdev, lun, cmd); - break; - - case SCSI_VERIFY10: - ret = SCSI_Verify10(pdev, lun, cmd); - break; - - case SCSI_REPORT_LUNS: - ret = SCSI_ReportLuns(pdev, lun, cmd); - break; - - case SCSI_RECEIVE_DIAGNOSTIC_RESULTS: - ret = SCSI_ReceiveDiagnosticResults(pdev, lun, cmd); - break; - - default: - SCSI_SenseCode(pdev, lun, ILLEGAL_REQUEST, INVALID_CDB); - ret = -1; - break; - } - - return ret; -} - - -/** - * @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) -{ - UNUSED(params); - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hmsc == NULL) - { - return -1; - } - - /* case 9 : Hi > D0 */ - if (hmsc->cbw.dDataLength != 0U) - { - 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); - hmsc->bot_state = USBD_BOT_NO_DATA; - return -1; - } - - if (((USBD_StorageTypeDef *)pdev->pUserData[pdev->classId])->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 = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hmsc == NULL) - { - return -1; - } - - if (hmsc->cbw.dDataLength == 0U) - { - SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB); - return -1; - } - - 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_FIELD_IN_COMMAND); - - return -1; - } - } - else - { - - pPage = (uint8_t *) & ((USBD_StorageTypeDef *)pdev->pUserData[pdev->classId]) \ - ->pInquiry[lun * STANDARD_INQUIRY_DATA_LEN]; - len = (uint16_t)pPage[4] + 5U; - - if (params[4] <= len) - { - len = params[4]; - } - - (void)SCSI_UpdateBotData(hmsc, 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) -{ - UNUSED(params); - int8_t ret; - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_MSC_BOT_LUN_TypeDef *p_scsi_blk = &hmsc->scsi_blk[lun]; - - if (hmsc == NULL) - { - return -1; - } - - ret = ((USBD_StorageTypeDef *)pdev->pUserData[pdev->classId])->GetCapacity(lun, &p_scsi_blk->nbr, - &p_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[0] = (uint8_t)((p_scsi_blk->nbr - 1U) >> 24); - hmsc->bot_data[1] = (uint8_t)((p_scsi_blk->nbr - 1U) >> 16); - hmsc->bot_data[2] = (uint8_t)((p_scsi_blk->nbr - 1U) >> 8); - hmsc->bot_data[3] = (uint8_t)(p_scsi_blk->nbr - 1U); - - hmsc->bot_data[4] = (uint8_t)(p_scsi_blk->size >> 24); - hmsc->bot_data[5] = (uint8_t)(p_scsi_blk->size >> 16); - hmsc->bot_data[6] = (uint8_t)(p_scsi_blk->size >> 8); - hmsc->bot_data[7] = (uint8_t)(p_scsi_blk->size); - - hmsc->bot_data_length = 8U; - - return 0; -} - - -/** - * @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); - uint32_t idx; - int8_t ret; - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_MSC_BOT_LUN_TypeDef *p_scsi_blk = &hmsc->scsi_blk[lun]; - - if (hmsc == NULL) - { - return -1; - } - - ret = ((USBD_StorageTypeDef *)pdev->pUserData[pdev->classId])->GetCapacity(lun, &p_scsi_blk->nbr, - &p_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)((p_scsi_blk->nbr - 1U) >> 24); - hmsc->bot_data[5] = (uint8_t)((p_scsi_blk->nbr - 1U) >> 16); - hmsc->bot_data[6] = (uint8_t)((p_scsi_blk->nbr - 1U) >> 8); - hmsc->bot_data[7] = (uint8_t)(p_scsi_blk->nbr - 1U); - - hmsc->bot_data[8] = (uint8_t)(p_scsi_blk->size >> 24); - hmsc->bot_data[9] = (uint8_t)(p_scsi_blk->size >> 16); - hmsc->bot_data[10] = (uint8_t)(p_scsi_blk->size >> 8); - hmsc->bot_data[11] = (uint8_t)(p_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 - * @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) -{ - UNUSED(params); - uint16_t blk_size; - uint32_t blk_nbr; - uint16_t i; - int8_t ret; - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hmsc == NULL) - { - return -1; - } - - ret = ((USBD_StorageTypeDef *)pdev->pUserData[pdev->classId])->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; - } - - 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) -{ - UNUSED(lun); - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint16_t len = MODE_SENSE6_LEN; - - if (hmsc == NULL) - { - return -1; - } - - /* Check If media is write-protected */ - if (((USBD_StorageTypeDef *)pdev->pUserData[pdev->classId])->IsWriteProtected(lun) != 0) - { - MSC_Mode_Sense6_data[2] |= (0x1U << 7); /* Set the WP (write protection) bit */ - } - else - { - MSC_Mode_Sense10_data[2] &= ~(0x1U << 7); /* Clear the WP (write protection) bit */ - } - - 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 - * @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) -{ - UNUSED(lun); - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint16_t len = MODE_SENSE10_LEN; - - if (hmsc == NULL) - { - return -1; - } - - /* Check If media is write-protected */ - if (((USBD_StorageTypeDef *)pdev->pUserData[pdev->classId])->IsWriteProtected(lun) != 0) - { - MSC_Mode_Sense10_data[3] |= (0x1U << 7); /* Set the WP (write protection) bit */ - } - else - { - MSC_Mode_Sense10_data[3] &= ~(0x1U << 7); /* Clear the WP (write protection) bit */ - } - - 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 - * @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) -{ - UNUSED(lun); - uint8_t i; - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hmsc == NULL) - { - return -1; - } - - 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] = (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 Code - * @retval none - - */ -void SCSI_SenseCode(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t sKey, uint8_t ASC) -{ - UNUSED(lun); - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hmsc == NULL) - { - return; - } - - 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 - * @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) -{ - UNUSED(lun); - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hmsc == NULL) - { - return -1; - } - - if ((hmsc->scsi_medium_state == SCSI_MEDIUM_LOCKED) && ((params[4] & 0x3U) == 2U)) - { - SCSI_SenseCode(pdev, lun, ILLEGAL_REQUEST, INVALID_FIELD_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 = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hmsc == NULL) - { - return -1; - } - - 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 - * @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 = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_MSC_BOT_LUN_TypeDef *p_scsi_blk = &hmsc->scsi_blk[lun]; - - if (hmsc == NULL) - { - return -1; - } - - 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 (((USBD_StorageTypeDef *)pdev->pUserData[pdev->classId])->IsReady(lun) != 0) - { - SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); - return -1; - } - - p_scsi_blk->addr = ((uint32_t)params[2] << 24) | - ((uint32_t)params[3] << 16) | - ((uint32_t)params[4] << 8) | - (uint32_t)params[5]; - - p_scsi_blk->len = ((uint32_t)params[7] << 8) | (uint32_t)params[8]; - - if (SCSI_CheckAddressRange(pdev, lun, p_scsi_blk->addr, p_scsi_blk->len) < 0) - { - return -1; /* error */ - } - - /* cases 4,5 : Hi <> Dn */ - if (hmsc->cbw.dDataLength != (p_scsi_blk->len * p_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 = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_MSC_BOT_LUN_TypeDef *p_scsi_blk = &hmsc->scsi_blk[lun]; - - if (hmsc == NULL) - { - return -1; - } - - 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 (((USBD_StorageTypeDef *)pdev->pUserData[pdev->classId])->IsReady(lun) != 0) - { - SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); - return -1; - } - - p_scsi_blk->addr = ((uint32_t)params[2] << 24) | - ((uint32_t)params[3] << 16) | - ((uint32_t)params[4] << 8) | - (uint32_t)params[5]; - - p_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, p_scsi_blk->addr, p_scsi_blk->len) < 0) - { - return -1; /* error */ - } - - /* cases 4,5 : Hi <> Dn */ - if (hmsc->cbw.dDataLength != (p_scsi_blk->len * p_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 - * @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 = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_MSC_BOT_LUN_TypeDef *p_scsi_blk = &hmsc->scsi_blk[lun]; - uint32_t len; - - if (hmsc == NULL) - { - return -1; - } - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - MSCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - 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 (((USBD_StorageTypeDef *)pdev->pUserData[pdev->classId])->IsReady(lun) != 0) - { - SCSI_SenseCode(pdev, lun, NOT_READY, MEDIUM_NOT_PRESENT); - return -1; - } - - /* Check If media is write-protected */ - if (((USBD_StorageTypeDef *)pdev->pUserData[pdev->classId])->IsWriteProtected(lun) != 0) - { - SCSI_SenseCode(pdev, lun, NOT_READY, WRITE_PROTECTED); - return -1; - } - - p_scsi_blk->addr = ((uint32_t)params[2] << 24) | - ((uint32_t)params[3] << 16) | - ((uint32_t)params[4] << 8) | - (uint32_t)params[5]; - - p_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, p_scsi_blk->addr, p_scsi_blk->len) < 0) - { - return -1; /* error */ - } - - len = p_scsi_blk->len * p_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, MSCOutEpAdd, 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 = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_MSC_BOT_LUN_TypeDef *p_scsi_blk = &hmsc->scsi_blk[lun]; - uint32_t len; - - if (hmsc == NULL) - { - return -1; - } -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - MSCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - 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 (((USBD_StorageTypeDef *)pdev->pUserData[pdev->classId])->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 (((USBD_StorageTypeDef *)pdev->pUserData[pdev->classId])->IsWriteProtected(lun) != 0) - { - SCSI_SenseCode(pdev, lun, NOT_READY, WRITE_PROTECTED); - hmsc->bot_state = USBD_BOT_NO_DATA; - return -1; - } - - p_scsi_blk->addr = ((uint32_t)params[2] << 24) | - ((uint32_t)params[3] << 16) | - ((uint32_t)params[4] << 8) | - (uint32_t)params[5]; - - p_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, p_scsi_blk->addr, p_scsi_blk->len) < 0) - { - return -1; /* error */ - } - - len = p_scsi_blk->len * p_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, MSCOutEpAdd, 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 = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_MSC_BOT_LUN_TypeDef *p_scsi_blk = &hmsc->scsi_blk[lun]; - - if (hmsc == NULL) - { - return -1; - } - - if ((params[1] & 0x02U) == 0x02U) - { - SCSI_SenseCode(pdev, lun, ILLEGAL_REQUEST, INVALID_FIELD_IN_COMMAND); - return -1; /* Error, Verify Mode Not supported*/ - } - - if (SCSI_CheckAddressRange(pdev, lun, p_scsi_blk->addr, p_scsi_blk->len) < 0) - { - return -1; /* error */ - } - - hmsc->bot_data_length = 0U; - - return 0; -} - -/** - * @brief SCSI_ReportLuns12 - * Process ReportLuns command - * @retval status - */ -static int8_t SCSI_ReportLuns(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) -{ - USBD_MSC_BOT_HandleTypeDef *hmsc; - uint32_t lun_list_length; - uint32_t total_length; - uint8_t lun_idx; - - UNUSED(lun); - UNUSED(params); - - /* Define the report LUNs buffer Each LUN entry is 8 bytes */ - static uint8_t lun_report[8U * (MSC_BOT_MAX_LUN + 1U)]; - - hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hmsc == NULL) - { - return -1; - } - - /* Initialize the report LUNs buffer */ - (void)USBD_memset(lun_report, 0, sizeof(lun_report)); - - /* Set the LUN list length in the first 4 bytes */ - lun_list_length = 8U * (hmsc->max_lun + 1U); - lun_report[0] = (uint8_t)(lun_list_length >> 24); - lun_report[1] = (uint8_t)(lun_list_length >> 16); - lun_report[2] = (uint8_t)(lun_list_length >> 8); - lun_report[3] = (uint8_t)(lun_list_length & 0xFFU); - - /* Update the LUN list */ - for (lun_idx = 0U; lun_idx <= hmsc->max_lun; lun_idx++) - { - /* LUN identifier is placed at the second byte of each 8-byte entry */ - lun_report[(8U * (lun_idx + 1U)) + 1U] = lun_idx; - } - - /* Calculate the total length of the report LUNs buffer */ - total_length = lun_list_length + 8U; - - /* Update the BOT data with the report LUNs buffer */ - (void)SCSI_UpdateBotData(hmsc, lun_report, (uint16_t)total_length); - - return 0; -} - -/** - * @brief SCSI_ReceiveDiagnosticResults - * Process SCSI_Receive Diagnostic Results command - * @param lun: Logical unit number - * @param params: Command parameters - * @retval status - */ -static int8_t SCSI_ReceiveDiagnosticResults(USBD_HandleTypeDef *pdev, uint8_t lun, uint8_t *params) -{ - UNUSED(lun); - USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint16_t allocation_length; - - /* Extract the allocation length from the CDB */ - allocation_length = (((uint16_t)params[3] << 8) | (uint16_t)params[4]); - - if (allocation_length == 0U) - { - return 0; - } - - /* Ensure the allocation length does not exceed the diagnostic data length */ - if (allocation_length > DIAGNOSTIC_DATA_LEN) - { - allocation_length = DIAGNOSTIC_DATA_LEN; - } - - /* Send the diagnostic data to the host */ - (void)SCSI_UpdateBotData(hmsc, MSC_Diagnostic_Data, allocation_length); - - 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 = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_MSC_BOT_LUN_TypeDef *p_scsi_blk = &hmsc->scsi_blk[lun]; - - if (hmsc == NULL) - { - return -1; - } - - if ((blk_offset + blk_nbr) > p_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 = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_MSC_BOT_LUN_TypeDef *p_scsi_blk = &hmsc->scsi_blk[lun]; - uint32_t len; - - if (hmsc == NULL) - { - return -1; - } - - len = p_scsi_blk->len * p_scsi_blk->size; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - MSCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - len = MIN(len, MSC_MEDIA_PACKET); - - if (((USBD_StorageTypeDef *)pdev->pUserData[pdev->classId])->Read(lun, hmsc->bot_data, - p_scsi_blk->addr, - (len / p_scsi_blk->size)) < 0) - { - SCSI_SenseCode(pdev, lun, HARDWARE_ERROR, UNRECOVERED_READ_ERROR); - return -1; - } - - (void)USBD_LL_Transmit(pdev, MSCInEpAdd, hmsc->bot_data, len); - - p_scsi_blk->addr += (len / p_scsi_blk->size); - p_scsi_blk->len -= (len / p_scsi_blk->size); - - /* case 6 : Hi = Di */ - hmsc->csw.dDataResidue -= len; - - if (p_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 = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_MSC_BOT_LUN_TypeDef *p_scsi_blk = &hmsc->scsi_blk[lun]; - uint32_t len; - - if (hmsc == NULL) - { - return -1; - } - - len = p_scsi_blk->len * p_scsi_blk->size; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - MSCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - len = MIN(len, MSC_MEDIA_PACKET); - - if (((USBD_StorageTypeDef *)pdev->pUserData[pdev->classId])->Write(lun, hmsc->bot_data, p_scsi_blk->addr, - (len / p_scsi_blk->size)) < 0) - { - SCSI_SenseCode(pdev, lun, HARDWARE_ERROR, WRITE_FAULT); - return -1; - } - - p_scsi_blk->addr += (len / p_scsi_blk->size); - p_scsi_blk->len -= (len / p_scsi_blk->size); - - /* case 12 : Ho = Do */ - hmsc->csw.dDataResidue -= len; - - if (p_scsi_blk->len == 0U) - { - MSC_BOT_SendCSW(pdev, USBD_CSW_CMD_PASSED); - } - else - { - len = MIN((p_scsi_blk->len * p_scsi_blk->size), MSC_MEDIA_PACKET); - - /* Prepare EP to Receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, MSCOutEpAdd, hmsc->bot_data, len); - } - - return 0; -} - - -/** - * @brief SCSI_UpdateBotData - * fill the requested Data to transmit buffer - * @param hmsc handler - * @param pBuff: 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; - - if (hmsc == NULL) - { - return -1; - } - - hmsc->bot_data_length = len; - - while (len != 0U) - { - len--; - hmsc->bot_data[len] = pBuff[len]; - } - - return 0; -} -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ - diff --git a/Class/MSC/Src/usbd_msc_storage_template.c b/Class/MSC/Src/usbd_msc_storage_template.c deleted file mode 100644 index 2163943..0000000 --- a/Class/MSC/Src/usbd_msc_storage_template.c +++ /dev/null @@ -1,191 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_msc_storage_template.c - * @author MCD Application Team - * @brief Memory management layer - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* 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, - -}; - -/** - * @brief Initializes the storage unit (medium) - * @param lun: Logical unit number - * @retval Status (0 : OK / -1 : Error) - */ -int8_t STORAGE_Init(uint8_t lun) -{ - UNUSED(lun); - - return (0); -} - -/** - * @brief Returns the medium capacity. - * @param lun: Logical unit number - * @param block_num: Number of total block number - * @param block_size: Block size - * @retval Status (0: OK / -1: Error) - */ -int8_t STORAGE_GetCapacity(uint8_t lun, uint32_t *block_num, uint16_t *block_size) -{ - UNUSED(lun); - - *block_num = STORAGE_BLK_NBR; - *block_size = STORAGE_BLK_SIZ; - return (0); -} - - -/** - * @brief Checks whether the medium is ready. - * @param lun: Logical unit number - * @retval Status (0: OK / -1: Error) - */ -int8_t STORAGE_IsReady(uint8_t lun) -{ - UNUSED(lun); - - return (0); -} - -/** - * @brief Checks whether the medium is write protected. - * @param lun: Logical unit number - * @retval Status (0: write enabled / -1: otherwise) - */ -int8_t STORAGE_IsWriteProtected(uint8_t lun) -{ - UNUSED(lun); - - return 0; -} - -/** - * @brief Reads data from the medium. - * @param lun: Logical unit number - * @param buf: data buffer - * @param blk_addr: Logical block address - * @param blk_len: Blocks number - * @retval Status (0: OK / -1: Error) - */ -int8_t STORAGE_Read(uint8_t lun, uint8_t *buf, - uint32_t blk_addr, uint16_t blk_len) -{ - UNUSED(lun); - UNUSED(buf); - UNUSED(blk_addr); - UNUSED(blk_len); - - return 0; -} - -/** - * @brief Writes data into the medium. - * @param lun: Logical unit number - * @param buf: data buffer - * @param blk_addr: Logical block address - * @param blk_len: Blocks number - * @retval Status (0 : OK / -1 : Error) - */ -int8_t STORAGE_Write(uint8_t lun, uint8_t *buf, - uint32_t blk_addr, uint16_t blk_len) -{ - UNUSED(lun); - UNUSED(buf); - UNUSED(blk_addr); - UNUSED(blk_len); - - return (0); -} - -/** - * @brief Returns the Max Supported LUNs. - * @param None - * @retval Lun(s) number - */ -int8_t STORAGE_GetMaxLun(void) -{ - return (STORAGE_LUN_NBR - 1); -} - - diff --git a/Class/MTP/Inc/usbd_mtp.h b/Class/MTP/Inc/usbd_mtp.h deleted file mode 100644 index 77807f3..0000000 --- a/Class/MTP/Inc/usbd_mtp.h +++ /dev/null @@ -1,361 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_mtp.h - * @author MCD Application Team - * @brief header file for the usbd_mtp.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_MTP_H -#define __USB_MTP_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" -#include "usbd_ctlreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_MTP - * @brief This file is the header file for usbd_mtp.c - * @{ - */ - - -/** @defgroup USBD_MTP_Exported_Defines - * @{ - */ -#ifndef MTP_IN_EP -#define MTP_IN_EP 0x81U /* EP1 for data IN */ -#endif /* MTP_IN_EP */ -#ifndef MTP_OUT_EP -#define MTP_OUT_EP 0x01U /* EP1 for data OUT */ -#endif /* MTP_OUT_EP */ -#ifndef MTP_CMD_EP -#define MTP_CMD_EP 0x82U /* EP2 for MTP commands */ -#endif /* MTP_CMD_EP */ - -#ifndef MTP_CMD_ITF_NBR -#define MTP_CMD_ITF_NBR 0x00U /* Command Interface Number 0 */ -#endif /* MTP_CMD_ITF_NBR */ - -#ifndef MTP_COM_ITF_NBR -#define MTP_COM_ITF_NBR 0x01U /* Communication Interface Number 0 */ -#endif /* MTP_CMD_ITF_NBR */ - -#ifndef MTP_HS_BINTERVAL -#define MTP_HS_BINTERVAL 0x10U -#endif /* MTP_HS_BINTERVAL */ - -#ifndef MTP_FS_BINTERVAL -#define MTP_FS_BINTERVAL 0x10U -#endif /* MTP_FS_BINTERVAL */ - -#ifndef MTP_CMD_PACKET_SIZE -#define MTP_CMD_PACKET_SIZE 8U /* Control Endpoint Packet size */ -#endif /* MTP_CMD_PACKET_SIZE */ - -#define MTP_DATA_MAX_HS_PACKET_SIZE 512U -#define MTP_DATA_MAX_FS_PACKET_SIZE 64U /* Endpoint IN & OUT Packet size */ - -#define MTP_MEDIA_PACKET 512U -#define MTP_CONT_HEADER_SIZE 12U - -#define MTP_CONFIG_DESC_SIZ 39U -#define MTP_INTERFACE_DESC_SIZE 0x09U -#define USB_MTP_INTRERFACE_CLASS 0x06U -#define USB_MTP_INTRERFACE_SUB_CLASS 0x01U -#define USB_MTP_INTRERFACE_PROTOCOL 0x01U -#define MTP_ENDPOINT_DESC_SIZE 0x07U - -/*---------------------------------------------------------------------*/ -/* MTP definitions */ -/*---------------------------------------------------------------------*/ - -/* MTP class requests */ -#define MTP_REQ_CANCEL 0x64U -#define MTP_REQ_GET_EXT_EVENT_DATA 0x65U -#define MTP_REQ_RESET 0x66U -#define MTP_REQ_GET_DEVICE_STATUS 0x67U - - -/* Max info items size */ -#define MTP_SUPPORTED_OPERATIONS_NBR 100U -#define MTP_SUPPORTED_EVENTS_NBR 100U -#define MTP_SUPPORTED_PROPRIETIES_NBR 100U -#define MTP_CAPTURE_FORMATS_NBR 100U -#define MTP_IMAGE_FORMATS_NBR 100U -#define MTP_MAX_STR_SIZE 255U - -/* MTP response code */ -#define MTP_RESPONSE_OK 0x2001U -#define MTP_RESPONSE_GENERAL_ERROR 0x2002U -#define MTP_RESPONSE_PARAMETER_NOT_SUPPORTED 0x2006U -#define MTP_RESPONSE_INCOMPLETE_TRANSFER 0x2007U -#define MTP_RESPONSE_INVALID_STORAGE_ID 0x2008U -#define MTP_RESPONSE_INVALID_OBJECT_HANDLE 0x2009U -#define MTP_RESPONSE_DEVICEPROP_NOT_SUPPORTED 0x200AU -#define MTP_RESPONSE_STORE_FULL 0x200CU -#define MTP_RESPONSE_ACCESS_DENIED 0x200FU -#define MTP_RESPONSE_STORE_NOT_AVAILABLE 0x2013U -#define MTP_RESPONSE_SPECIFICATION_BY_FORMAT_NOT_SUPPORTED 0x2014U -#define MTP_RESPONSE_NO_VALID_OBJECT_INFO 0x2015U -#define MTP_RESPONSE_DEVICE_BUSY 0x2019U -#define MTP_RESPONSE_INVALID_PARENT_OBJECT 0x201AU -#define MTP_RESPONSE_INVALID_PARAMETER 0x201DU -#define MTP_RESPONSE_SESSION_ALREADY_OPEN 0x201EU -#define MTP_RESPONSE_TRANSACTION_CANCELLED 0x201FU -#define MTP_RESPONSE_INVALID_OBJECT_PROP_CODE 0xA801U -#define MTP_RESPONSE_SPECIFICATION_BY_GROUP_UNSUPPORTED 0xA807U -#define MTP_RESPONSE_OBJECT_PROP_NOT_SUPPORTED 0xA80AU - -/* - * MTP Class specification Revision 1.1 - * Appendix A. Object Formats - */ - -/* MTP Object format codes */ -#define MTP_OBJ_FORMAT_UNDEFINED 0x3000U -#define MTP_OBJ_FORMAT_ASSOCIATION 0x3001U -#define MTP_OBJ_FORMAT_SCRIPT 0x3002U -#define MTP_OBJ_FORMAT_EXECUTABLE 0x3003U -#define MTP_OBJ_FORMAT_TEXT 0x3004U -#define MTP_OBJ_FORMAT_HTML 0x3005U -#define MTP_OBJ_FORMAT_DPOF 0x3006U -#define MTP_OBJ_FORMAT_AIFF 0x3007U -#define MTP_OBJ_FORMAT_WAV 0x3008U -#define MTP_OBJ_FORMAT_MP3 0x3009U -#define MTP_OBJ_FORMAT_AVI 0x300AU -#define MTP_OBJ_FORMAT_MPEG 0x300BU -#define MTP_OBJ_FORMAT_ASF 0x300CU -#define MTP_OBJ_FORMAT_DEFINED 0x3800U -#define MTP_OBJ_FORMAT_EXIF_JPEG 0x3801U -#define MTP_OBJ_FORMAT_TIFF_EP 0x3802U -#define MTP_OBJ_FORMAT_FLASHPIX 0x3803U -#define MTP_OBJ_FORMAT_BMP 0x3804U -#define MTP_OBJ_FORMAT_CIFF 0x3805U -#define MTP_OBJ_FORMAT_UNDEFINED_RESERVED0 0x3806U -#define MTP_OBJ_FORMAT_GIF 0x3807U -#define MTP_OBJ_FORMAT_JFIF 0x3808U -#define MTP_OBJ_FORMAT_CD 0x3809U -#define MTP_OBJ_FORMAT_PICT 0x380AU -#define MTP_OBJ_FORMAT_PNG 0x380BU -#define MTP_OBJ_FORMAT_UNDEFINED_RESERVED1 0x380CU -#define MTP_OBJ_FORMAT_TIFF 0x380DU -#define MTP_OBJ_FORMAT_TIFF_IT 0x380EU -#define MTP_OBJ_FORMAT_JP2 0x380FU -#define MTP_OBJ_FORMAT_JPX 0x3810U -#define MTP_OBJ_FORMAT_UNDEFINED_FIRMWARE 0xB802U -#define MTP_OBJ_FORMAT_WINDOWS_IMAGE_FORMAT 0xB881U -#define MTP_OBJ_FORMAT_UNDEFINED_AUDIO 0xB900U -#define MTP_OBJ_FORMAT_WMA 0xB901U -#define MTP_OBJ_FORMAT_OGG 0xB902U -#define MTP_OBJ_FORMAT_AAC 0xB903U -#define MTP_OBJ_FORMAT_AUDIBLE 0xB904U -#define MTP_OBJ_FORMAT_FLAC 0xB906U -#define MTP_OBJ_FORMAT_UNDEFINED_VIDEO 0xB980U -#define MTP_OBJ_FORMAT_WMV 0xB981U -#define MTP_OBJ_FORMAT_MP4_CONTAINER 0xB982U -#define MTP_OBJ_FORMAT_MP2 0xB983U -#define MTP_OBJ_FORMAT_3GP_CONTAINER 0xB984U -/** - * @} - */ - - -/** @defgroup USBD_CORE_Exported_TypesDefinitions - * @{ - */ - -/** - * @} - */ - - -/* MTP Session state */ -typedef enum -{ - MTP_SESSION_NOT_OPENED = 0x00, - MTP_SESSION_OPENED = 0x01, -} MTP_SessionStateTypeDef; - -/* MTP response phases */ -typedef enum -{ - MTP_PHASE_IDLE = 0x00, - MTP_RESPONSE_PHASE = 0x01, - MTP_READ_DATA = 0x02, - MTP_RECEIVE_DATA = 0x03, -} MTP_ResponsePhaseTypeDef; - -typedef struct -{ - uint32_t temp_length; - uint32_t prv_len; - uint32_t totallen; - uint32_t rx_length; - uint32_t readbytes; /* File write/read counts */ -} MTP_DataLengthTypeDef; - -typedef enum -{ - RECEIVE_IDLE_STATE = 0x00U, - RECEIVE_COMMAND_DATA = 0x01U, - RECEIVE_FIRST_DATA = 0x02U, - RECEIVE_REST_OF_DATA = 0x03U, - SEND_RESPONSE = 0x04U, -} MTP_RECEIVE_DATA_STATUS; - -typedef struct -{ - uint32_t length; - uint16_t type; - uint16_t code; - uint32_t trans_id; - uint32_t Param1; - uint32_t Param2; - uint32_t Param3; - uint32_t Param4; - uint32_t Param5; -} MTP_OperationsTypeDef; - -typedef struct -{ - uint32_t length; - uint16_t type; - uint16_t code; - uint32_t trans_id; - uint8_t data[MTP_MEDIA_PACKET]; -} MTP_GenericContainerTypeDef; - -#if defined ( __GNUC__ ) -typedef __PACKED_STRUCT -#else -__packed typedef struct -#endif /* __GNUC__ */ -{ - uint32_t Storage_id; - uint16_t ObjectFormat; - uint16_t ProtectionStatus; - uint32_t ObjectCompressedSize; - uint16_t ThumbFormat; - uint32_t ThumbCompressedSize; - uint32_t ThumbPixWidth; - uint32_t ThumbPixHeight; - uint32_t ImagePixWidth; - uint32_t ImagePixHeight; - uint32_t ImageBitDepth; - uint32_t ParentObject; - uint16_t AssociationType; - uint32_t AssociationDesc; - uint32_t SequenceNumber; - uint8_t Filename_len; - uint16_t Filename[255]; - uint32_t CaptureDate; - uint32_t ModificationDate; - uint8_t Keywords; -} MTP_ObjectInfoTypeDef; - -typedef struct -{ - uint32_t alt_setting; - uint32_t dev_status; - uint32_t ResponseLength; - uint32_t ResponseCode; - __IO uint16_t MaxPcktLen; - uint32_t rx_buff[MTP_MEDIA_PACKET / 4U]; /* Force 32-bit alignment */ - MTP_ResponsePhaseTypeDef MTP_ResponsePhase; - MTP_SessionStateTypeDef MTP_SessionState; - MTP_RECEIVE_DATA_STATUS RECEIVE_DATA_STATUS; - MTP_OperationsTypeDef OperationsContainer; - MTP_GenericContainerTypeDef GenericContainer; -} USBD_MTP_HandleTypeDef; - -/** @defgroup USBD_CORE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Exported_Variables - * @{ - */ - -extern USBD_ClassTypeDef USBD_MTP; -#define USBD_MTP_CLASS &USBD_MTP - -/** - * @} - */ - -/** @defgroup USB_CORE_Exported_Functions - * @{ - */ - -typedef struct _USBD_MTP_ItfTypeDef -{ - uint8_t (*Init)(void); - uint8_t (*DeInit)(void); - uint32_t (*ReadData)(uint32_t Param1, uint8_t *buff, MTP_DataLengthTypeDef *data_length); - uint16_t (*Create_NewObject)(MTP_ObjectInfoTypeDef ObjectInfo, uint32_t objhandle); - - uint32_t (*GetIdx)(uint32_t Param3, uint32_t *obj_handle); - uint32_t (*GetParentObject)(uint32_t Param); - uint16_t (*GetObjectFormat)(uint32_t Param); - uint8_t (*GetObjectName_len)(uint32_t Param); - void (*GetObjectName)(uint32_t Param, uint8_t obj_len, uint16_t *buf); - uint32_t (*GetObjectSize)(uint32_t Param); - uint64_t (*GetMaxCapability)(void); - uint64_t (*GetFreeSpaceInBytes)(void); - uint32_t (*GetNewIndex)(uint16_t objformat); - void (*WriteData)(uint16_t len, uint8_t buff[]); - uint32_t (*GetContainerLength)(uint32_t Param1); - uint16_t (*DeleteObject)(uint32_t Param1); - void (*Cancel)(uint32_t Phase); - uint32_t *ScratchBuff; - uint32_t ScratchBuffSze; -} USBD_MTP_ItfTypeDef; - -/** - * @} - */ -/** @defgroup USB_CORE_Exported_Functions - * @{ - */ -uint8_t USBD_MTP_RegisterInterface(USBD_HandleTypeDef *pdev, USBD_MTP_ItfTypeDef *fops); - - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_MTP_H */ -/** - * @} - */ - -/** - * @} - */ diff --git a/Class/MTP/Inc/usbd_mtp_if_template.h b/Class/MTP/Inc/usbd_mtp_if_template.h deleted file mode 100644 index d86e250..0000000 --- a/Class/MTP/Inc/usbd_mtp_if_template.h +++ /dev/null @@ -1,96 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_mtp_if_template.h - * @author MCD Application Team - * @brief Header file for the usbd_mtp_if_template.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_MTP_IF_TEMPLATE_H -#define __USBD_MTP_IF_TEMPLATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_mtp.h" - -/* Exported Define -----------------------------------------------------------*/ -#define USBD_MTP_DEVICE_PROP_SUPPORTED 1U -#define USBD_MTP_CAPTURE_FORMAT_SUPPORTED 1U -#define USBD_MTP_VEND_EXT_DESC_SUPPORTED 1U -#define USBD_MTP_EVENTS_SUPPORTED 1U - -#if USBD_MTP_EVENTS_SUPPORTED == 1 -#define SUPP_EVENTS_LEN (uint8_t)((uint8_t)sizeof(SuppEvents) / 2U) -#else -#define SUPP_EVENTS_LEN 0U -#endif /* USBD_MTP_EVENTS_SUPPORTED */ - -#if USBD_MTP_VEND_EXT_DESC_SUPPORTED == 1 -#define VEND_EXT_DESC_LEN (sizeof(VendExtDesc) / 2U) -#else -#define VEND_EXT_DESC_LEN 0U -#endif /* USBD_MTP_VEND_EXT_DESC_SUPPORTED */ - -#if USBD_MTP_CAPTURE_FORMAT_SUPPORTED == 1 -#define SUPP_CAPT_FORMAT_LEN (uint8_t)((uint8_t)sizeof(SuppCaptFormat) / 2U) -#else -#define SUPP_CAPT_FORMAT_LEN 0U -#endif /* USBD_MTP_CAPTURE_FORMAT_SUPPORTED */ - -#if USBD_MTP_DEVICE_PROP_SUPPORTED == 1 -#define SUPP_DEVICE_PROP_LEN (uint8_t)((uint8_t)sizeof(DevicePropSupp) / 2U) -#else -#define SUPP_DEVICE_PROP_LEN 0U -#endif /* USBD_MTP_DEVICE_PROP_SUPPORTED */ - -#define MTP_IF_SCRATCH_BUFF_SZE 1024U - -/* Exported types ------------------------------------------------------------*/ -extern USBD_MTP_ItfTypeDef USBD_MTP_fops; - -/* Exported macros -----------------------------------------------------------*/ -/* Exported variables --------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -static const uint16_t Manuf[] = {'S', 'T', 'M', 0}; /* last 2 bytes must be 0*/ -static const uint16_t Model[] = {'S', 'T', 'M', '3', '2', 0}; /* last 2 bytes must be 0*/ -static const uint16_t VendExtDesc[] = {'m', 'i', 'c', 'r', 'o', 's', 'o', 'f', 't', '.', - 'c', 'o', 'm', ':', ' ', '1', '.', '0', ';', ' ', 0 - }; /* last 2 bytes must be 0*/ -/*SerialNbr shall be 32 character hexadecimal string for legacy compatibility reasons */ -static const uint16_t SerialNbr[] = {'0', '0', '0', '0', '1', '0', '0', '0', '0', '1', '0', '0', '0', '0', - '1', '0', '0', '0', '0', '1', '0', '0', '0', '0', '1', '0', '0', '0', - '0', '1', '0', '0', 0 - }; /* last 2 bytes must be 0*/ -static const uint16_t DeviceVers[] = {'V', '1', '.', '0', '0', 0}; /* last 2 bytes must be 0*/ - -static const uint16_t DefaultFileName[] = {'N', 'e', 'w', ' ', 'F', 'o', 'l', 'd', 'e', 'r', 0}; - -static const uint16_t DevicePropDefVal[] = {'S', 'T', 'M', '3', '2', 0}; /* last 2 bytes must be 0*/ -static const uint16_t DevicePropCurDefVal[] = {'S', 'T', 'M', '3', '2', ' ', 'V', '1', '.', '0', 0}; - - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_MTP_IF_TEMPLATE_H */ - diff --git a/Class/MTP/Inc/usbd_mtp_opt.h b/Class/MTP/Inc/usbd_mtp_opt.h deleted file mode 100644 index 4dee923..0000000 --- a/Class/MTP/Inc/usbd_mtp_opt.h +++ /dev/null @@ -1,681 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_mtp_opt.h - * @author MCD Application Team - * @brief header file for the usbd_mtp_opt.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_MTP_OPT_H__ -#define __USBD_MTP_OPT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#ifndef __USBD_MTP_IF_H -#include "usbd_mtp_if_template.h" -#endif /* __USBD_MTP_IF_H */ -#include "usbd_mtp.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_MTP_OPT - * @brief This file is the header file for usbd_mtp_opt.c - * @{ - */ - - -/** @defgroup USBD_MTP_OPT_Exported_Defines - * @{ - */ - -/* - * MTP Class specification Revision 1.1 - * Appendix B. Object Properties - */ - -/* MTP OBJECT PROPERTIES supported*/ -#define MTP_OB_PROP_STORAGE_ID 0xDC01U -#define MTP_OB_PROP_OBJECT_FORMAT 0xDC02U -#define MTP_OB_PROP_PROTECTION_STATUS 0xDC03U -#define MTP_OB_PROP_OBJECT_SIZE 0xDC04U -#define MTP_OB_PROP_ASSOC_TYPE 0xDC05U -#define MTP_OB_PROP_ASSOC_DESC 0xDC06U -#define MTP_OB_PROP_OBJ_FILE_NAME 0xDC07U -#define MTP_OB_PROP_DATE_CREATED 0xDC08U -#define MTP_OB_PROP_DATE_MODIFIED 0xDC09U -#define MTP_OB_PROP_KEYWORDS 0xDC0AU -#define MTP_OB_PROP_PARENT_OBJECT 0xDC0BU -#define MTP_OB_PROP_ALLOWED_FOLD_CONTENTS 0xDC0CU -#define MTP_OB_PROP_HIDDEN 0xDC0DU -#define MTP_OB_PROP_SYSTEM_OBJECT 0xDC0EU -#define MTP_OB_PROP_PERS_UNIQ_OBJ_IDEN 0xDC41U -#define MTP_OB_PROP_SYNCID 0xDC42U -#define MTP_OB_PROP_PROPERTY_BAG 0xDC43U -#define MTP_OB_PROP_NAME 0xDC44U -#define MTP_OB_PROP_CREATED_BY 0xDC45U -#define MTP_OB_PROP_ARTIST 0xDC46U -#define MTP_OB_PROP_DATE_AUTHORED 0xDC47U -#define MTP_OB_PROP_DESCRIPTION 0xDC48U -#define MTP_OB_PROP_URL_REFERENCE 0xDC49U -#define MTP_OB_PROP_LANGUAGELOCALE 0xDC4AU -#define MTP_OB_PROP_COPYRIGHT_INFORMATION 0xDC4BU -#define MTP_OB_PROP_SOURCE 0xDC4CU -#define MTP_OB_PROP_ORIGIN_LOCATION 0xDC4DU -#define MTP_OB_PROP_DATE_ADDED 0xDC4EU -#define MTP_OB_PROP_NON_CONSUMABLE 0xDC4FU -#define MTP_OB_PROP_CORRUPTUNPLAYABLE 0xDC50U -#define MTP_OB_PROP_PRODUCERSERIALNUMBER 0xDC51U -#define MTP_OB_PROP_REPRESENTATIVE_SAMPLE_FORMAT 0xDC81U -#define MTP_OB_PROP_REPRESENTATIVE_SAMPLE_SIZE 0xDC82U -#define MTP_OB_PROP_REPRESENTATIVE_SAMPLE_HEIGHT 0xDC83U -#define MTP_OB_PROP_REPRESENTATIVE_SAMPLE_WIDTH 0xDC84U -#define MTP_OB_PROP_REPRESENTATIVE_SAMPLE_DURATION 0xDC85U -#define MTP_OB_PROP_REPRESENTATIVE_SAMPLE_DATA 0xDC86U -#define MTP_OB_PROP_WIDTH 0xDC87U -#define MTP_OB_PROP_HEIGHT 0xDC88U -#define MTP_OB_PROP_DURATION 0xDC89U -#define MTP_OB_PROP_RATING 0xDC8AU -#define MTP_OB_PROP_TRACK 0xDC8BU -#define MTP_OB_PROP_GENRE 0xDC8CU -#define MTP_OB_PROP_CREDITS 0xDC8DU -#define MTP_OB_PROP_LYRICS 0xDC8EU -#define MTP_OB_PROP_SUBSCRIPTION_CONTENT_ID 0xDC8FU -#define MTP_OB_PROP_PRODUCED_BY 0xDC90U -#define MTP_OB_PROP_USE_COUNT 0xDC91U -#define MTP_OB_PROP_SKIP_COUNT 0xDC92U -#define MTP_OB_PROP_LAST_ACCESSED 0xDC93U -#define MTP_OB_PROP_PARENTAL_RATING 0xDC94U -#define MTP_OB_PROP_META_GENRE 0xDC95U -#define MTP_OB_PROP_COMPOSER 0xDC96U -#define MTP_OB_PROP_EFFECTIVE_RATING 0xDC97U -#define MTP_OB_PROP_SUBTITLE 0xDC98U -#define MTP_OB_PROP_ORIGINAL_RELEASE_DATE 0xDC99U -#define MTP_OB_PROP_ALBUM_NAME 0xDC9AU -#define MTP_OB_PROP_ALBUM_ARTIST 0xDC9BU -#define MTP_OB_PROP_MOOD 0xDC9CU -#define MTP_OB_PROP_DRM_STATUS 0xDC9DU -#define MTP_OB_PROP_SUB_DESCRIPTION 0xDC9EU -#define MTP_OB_PROP_IS_CROPPED 0xDCD1U -#define MTP_OB_PROP_IS_COLOUR_CORRECTED 0xDCD2U -#define MTP_OB_PROP_IMAGE_BIT_DEPTH 0xDCD3U -#define MTP_OB_PROP_FNUMBER 0xDCD4U -#define MTP_OB_PROP_EXPOSURE_TIME 0xDCD5U -#define MTP_OB_PROP_EXPOSURE_INDEX 0xDCD6U -#define MTP_OB_PROP_TOTAL_BITRATE 0xDE91U -#define MTP_OB_PROP_BITRATE_TYPE 0xDE92U -#define MTP_OB_PROP_SAMPLE_RATE 0xDE93U -#define MTP_OB_PROP_NUMBER_OF_CHANNELS 0xDE94U -#define MTP_OB_PROP_AUDIO_BITDEPTH 0xDE95U -#define MTP_OB_PROP_SCAN_TYPE 0xDE97U -#define MTP_OB_PROP_AUDIO_WAVE_CODEC 0xDE99U -#define MTP_OB_PROP_AUDIO_BITRATE 0xDE9AU -#define MTP_OB_PROP_VIDEO_FOURCC_CODEC 0xDE9BU -#define MTP_OB_PROP_VIDEO_BITRATE 0xDE9CU -#define MTP_OB_PROP_FRAMES_PER_THOUSAND_SECONDS 0xDE9DU -#define MTP_OB_PROP_KEYFRAME_DISTANCE 0xDE9EU -#define MTP_OB_PROP_BUFFER_SIZE 0xDE9FU -#define MTP_OB_PROP_ENCODING_QUALITY 0xDEA0U -#define MTP_OB_PROP_ENCODING_PROFILE 0xDEA1U -#define MTP_OB_PROP_DISPLAY_NAME 0xDCE0U -#define MTP_OB_PROP_BODY_TEXT 0xDCE1U -#define MTP_OB_PROP_SUBJECT 0xDCE2U -#define MTP_OB_PROP_PRIORITY 0xDCE3U -#define MTP_OB_PROP_GIVEN_NAME 0xDD00U -#define MTP_OB_PROP_MIDDLE_NAMES 0xDD01U -#define MTP_OB_PROP_FAMILY_NAME 0xDD02U -#define MTP_OB_PROP_PREFIX 0xDD03U -#define MTP_OB_PROP_SUFFIX 0xDD04U -#define MTP_OB_PROP_PHONETIC_GIVEN_NAME 0xDD05U -#define MTP_OB_PROP_PHONETIC_FAMILY_NAME 0xDD06U -#define MTP_OB_PROP_EMAIL_PRIMARY 0xDD07U -#define MTP_OB_PROP_EMAIL_PERSONAL_1 0xDD08U -#define MTP_OB_PROP_EMAIL_PERSONAL_2 0xDD09U -#define MTP_OB_PROP_EMAIL_BUSINESS_1 0xDD0AU -#define MTP_OB_PROP_EMAIL_BUSINESS_2 0xDD0BU -#define MTP_OB_PROP_EMAIL_OTHERS 0xDD0CU -#define MTP_OB_PROP_PHONE_NUMBER_PRIMARY 0xDD0DU -#define MTP_OB_PROP_PHONE_NUMBER_PERSONAL 0xDD0EU -#define MTP_OB_PROP_PHONE_NUMBER_PERSONAL_2 0xDD0FU -#define MTP_OB_PROP_PHONE_NUMBER_BUSINESS 0xDD10U -#define MTP_OB_PROP_PHONE_NUMBER_BUSINESS_2 0xDD11U -#define MTP_OB_PROP_PHONE_NUMBER_MOBILE 0xDD12U -#define MTP_OB_PROP_PHONE_NUMBER_MOBILE_2 0xDD13U -#define MTP_OB_PROP_FAX_NUMBER_PRIMARY 0xDD14U -#define MTP_OB_PROP_FAX_NUMBER_PERSONAL 0xDD15U -#define MTP_OB_PROP_FAX_NUMBER_BUSINESS 0xDD16U -#define MTP_OB_PROP_PAGER_NUMBER 0xDD17U -#define MTP_OB_PROP_PHONE_NUMBER_OTHERS 0xDD18U -#define MTP_OB_PROP_PRIMARY_WEB_ADDRESS 0xDD19U -#define MTP_OB_PROP_PERSONAL_WEB_ADDRESS 0xDD1AU -#define MTP_OB_PROP_BUSINESS_WEB_ADDRESS 0xDD1BU -#define MTP_OB_PROP_INSTANT_MESSENGER_ADDRESS 0xDD1CU -#define MTP_OB_PROP_INSTANT_MESSENGER_ADDRESS_2 0xDD1DU -#define MTP_OB_PROP_INSTANT_MESSENGER_ADDRESS_3 0xDD1EU -#define MTP_OB_PROP_POSTAL_ADDRESS_PERSONAL_FULL 0xDD1FU -#define MTP_OB_PROP_POSTAL_ADDRESS_PERSONAL_LINE_1 0xDD20U -#define MTP_OB_PROP_POSTAL_ADDRESS_PERSONAL_LINE_2 0xDD21U -#define MTP_OB_PROP_POSTAL_ADDRESS_PERSONAL_CITY 0xDD22U -#define MTP_OB_PROP_POSTAL_ADDRESS_PERSONAL_REGION 0xDD23U -#define MTP_OB_PROP_POSTAL_ADDRESS_PERSONAL_POSTAL_CODE 0xDD24U -#define MTP_OB_PROP_POSTAL_ADDRESS_PERSONAL_COUNTRY 0xDD25U -#define MTP_OB_PROP_POSTAL_ADDRESS_BUSINESS_FULL 0xDD26U -#define MTP_OB_PROP_POSTAL_ADDRESS_BUSINESS_LINE_1 0xDD27U -#define MTP_OB_PROP_POSTAL_ADDRESS_BUSINESS_LINE_2 0xDD28U -#define MTP_OB_PROP_POSTAL_ADDRESS_BUSINESS_CITY 0xDD29U -#define MTP_OB_PROP_POSTAL_ADDRESS_BUSINESS_REGION 0xDD2AU -#define MTP_OB_PROP_POSTAL_ADDRESS_BUSINESS_POSTAL_CODE 0xDD2BU -#define MTP_OB_PROP_POSTAL_ADDRESS_BUSINESS_COUNTRY 0xDD2CU -#define MTP_OB_PROP_POSTAL_ADDRESS_OTHER_FULL 0xDD2DU -#define MTP_OB_PROP_POSTAL_ADDRESS_OTHER_LINE_1 0xDD2EU -#define MTP_OB_PROP_POSTAL_ADDRESS_OTHER_LINE_2 0xDD2FU -#define MTP_OB_PROP_POSTAL_ADDRESS_OTHER_CITY 0xDD30U -#define MTP_OB_PROP_POSTAL_ADDRESS_OTHER_REGION 0xDD31U -#define MTP_OB_PROP_POSTAL_ADDRESS_OTHER_POSTAL_CODE 0xDD32U -#define MTP_OB_PROP_POSTAL_ADDRESS_OTHER_COUNTRY 0xDD33U -#define MTP_OB_PROP_ORGANIZATION_NAME 0xDD34U -#define MTP_OB_PROP_PHONETIC_ORGANIZATION_NAME 0xDD35U -#define MTP_OB_PROP_ROLE 0xDD36U -#define MTP_OB_PROP_BIRTHDATE 0xDD37U -#define MTP_OB_PROP_MESSAGE_TO 0xDD40U -#define MTP_OB_PROP_MESSAGE_CC 0xDD41U -#define MTP_OB_PROP_MESSAGE_BCC 0xDD42U -#define MTP_OB_PROP_MESSAGE_READ 0xDD43U -#define MTP_OB_PROP_MESSAGE_RECEIVED_TIME 0xDD44U -#define MTP_OB_PROP_MESSAGE_SENDER 0xDD45U -#define MTP_OB_PROP_ACT_BEGIN_TIME 0xDD50U -#define MTP_OB_PROP_ACT_END_TIME 0xDD51U -#define MTP_OB_PROP_ACT_LOCATION 0xDD52U -#define MTP_OB_PROP_ACT_REQUIRED_ATTENDEES 0xDD54U -#define MTP_OB_PROP_ACT_OPTIONAL_ATTENDEES 0xDD55U -#define MTP_OB_PROP_ACT_RESOURCES 0xDD56U -#define MTP_OB_PROP_ACT_ACCEPTED 0xDD57U -#define MTP_OB_PROP_OWNER 0xDD5DU -#define MTP_OB_PROP_EDITOR 0xDD5EU -#define MTP_OB_PROP_WEBMASTER 0xDD5FU -#define MTP_OB_PROP_URL_SOURCE 0xDD60U -#define MTP_OB_PROP_URL_DESTINATION 0xDD61U -#define MTP_OB_PROP_TIME_BOOKMARK 0xDD62U -#define MTP_OB_PROP_OBJECT_BOOKMARK 0xDD63U -#define MTP_OB_PROP_BYTE_BOOKMARK 0xDD64U -#define MTP_OB_PROP_LAST_BUILD_DATE 0xDD70U -#define MTP_OB_PROP_TIME_TO_LIVE 0xDD71U -#define MTP_OB_PROP_MEDIA_GUID 0xDD72U - -/* MTP event codes*/ -#define MTP_EVENT_UNDEFINED 0x4000U -#define MTP_EVENT_CANCELTRANSACTION 0x4001U -#define MTP_EVENT_OBJECTADDED 0x4002U -#define MTP_EVENT_OBJECTREMOVED 0x4003U -#define MTP_EVENT_STOREADDED 0x4004U -#define MTP_EVENT_STOREREMOVED 0x4005U -#define MTP_EVENT_DEVICEPROPCHANGED 0x4006U -#define MTP_EVENT_OBJECTINFOCHANGED 0x4007U -#define MTP_EVENT_DEVICEINFOCHANGED 0x4008U -#define MTP_EVENT_REQUESTOBJECTTRANSFER 0x4009U -#define MTP_EVENT_STOREFULL 0x400AU -#define MTP_EVENT_DEVICERESET 0x400BU -#define MTP_EVENT_STORAGEINFOCHANGED 0x400CU -#define MTP_EVENT_CAPTURECOMPLETE 0x400DU -#define MTP_EVENT_UNREPORTEDSTATUS 0x400EU -#define MTP_EVENT_OBJECTPROPCHANGED 0xC801U -#define MTP_EVENT_OBJECTPROPDESCCHANGED 0xC802U -#define MTP_EVENT_OBJECTREFERENCESCHANGED 0xC803U - -/* - * MTP Class specification Revision 1.1 - * Appendix D. Operations - */ - -/* Operations code */ -#define MTP_OP_GET_DEVICE_INFO 0x1001U -#define MTP_OP_OPEN_SESSION 0x1002U -#define MTP_OP_CLOSE_SESSION 0x1003U -#define MTP_OP_GET_STORAGE_IDS 0x1004U -#define MTP_OP_GET_STORAGE_INFO 0x1005U -#define MTP_OP_GET_NUM_OBJECTS 0x1006U -#define MTP_OP_GET_OBJECT_HANDLES 0x1007U -#define MTP_OP_GET_OBJECT_INFO 0x1008U -#define MTP_OP_GET_OBJECT 0x1009U -#define MTP_OP_GET_THUMB 0x100AU -#define MTP_OP_DELETE_OBJECT 0x100BU -#define MTP_OP_SEND_OBJECT_INFO 0x100CU -#define MTP_OP_SEND_OBJECT 0x100DU -#define MTP_OP_FORMAT_STORE 0x100FU -#define MTP_OP_RESET_DEVICE 0x1010U -#define MTP_OP_GET_DEVICE_PROP_DESC 0x1014U -#define MTP_OP_GET_DEVICE_PROP_VALUE 0x1015U -#define MTP_OP_SET_DEVICE_PROP_VALUE 0x1016U -#define MTP_OP_RESET_DEVICE_PROP_VALUE 0x1017U -#define MTP_OP_TERMINATE_OPEN_CAPTURE 0x1018U -#define MTP_OP_MOVE_OBJECT 0x1019U -#define MTP_OP_COPY_OBJECT 0x101AU -#define MTP_OP_GET_PARTIAL_OBJECT 0x101BU -#define MTP_OP_INITIATE_OPEN_CAPTURE 0x101CU -#define MTP_OP_GET_OBJECT_PROPS_SUPPORTED 0x9801U -#define MTP_OP_GET_OBJECT_PROP_DESC 0x9802U -#define MTP_OP_GET_OBJECT_PROP_VALUE 0x9803U -#define MTP_OP_SET_OBJECT_PROP_VALUE 0x9804U -#define MTP_OP_GET_OBJECT_PROPLIST 0x9805U -#define MTP_OP_GET_OBJECT_PROP_REFERENCES 0x9810U -#define MTP_OP_GETSERVICEIDS 0x9301U -#define MTP_OP_GETSERVICEINFO 0x9302U -#define MTP_OP_GETSERVICECAPABILITIES 0x9303U -#define MTP_OP_GETSERVICEPROPDESC 0x9304U - -/* - * MTP Class specification Revision 1.1 - * Appendix C. Device Properties - */ - -/* MTP device properties code*/ -#define MTP_DEV_PROP_UNDEFINED 0x5000U -#define MTP_DEV_PROP_BATTERY_LEVEL 0x5001U -#define MTP_DEV_PROP_FUNCTIONAL_MODE 0x5002U -#define MTP_DEV_PROP_IMAGE_SIZE 0x5003U -#define MTP_DEV_PROP_COMPRESSION_SETTING 0x5004U -#define MTP_DEV_PROP_WHITE_BALANCE 0x5005U -#define MTP_DEV_PROP_RGB_GAIN 0x5006U -#define MTP_DEV_PROP_F_NUMBER 0x5007U -#define MTP_DEV_PROP_FOCAL_LENGTH 0x5008U -#define MTP_DEV_PROP_FOCUS_DISTANCE 0x5009U -#define MTP_DEV_PROP_FOCUS_MODE 0x500AU -#define MTP_DEV_PROP_EXPOSURE_METERING_MODE 0x500BU -#define MTP_DEV_PROP_FLASH_MODE 0x500CU -#define MTP_DEV_PROP_EXPOSURE_TIME 0x500DU -#define MTP_DEV_PROP_EXPOSURE_PROGRAM_MODE 0x500EU -#define MTP_DEV_PROP_EXPOSURE_INDEX 0x500FU -#define MTP_DEV_PROP_EXPOSURE_BIAS_COMPENSATION 0x5010U -#define MTP_DEV_PROP_DATETIME 0x5011U -#define MTP_DEV_PROP_CAPTURE_DELAY 0x5012U -#define MTP_DEV_PROP_STILL_CAPTURE_MODE 0x5013U -#define MTP_DEV_PROP_CONTRAST 0x5014U -#define MTP_DEV_PROP_SHARPNESS 0x5015U -#define MTP_DEV_PROP_DIGITAL_ZOOM 0x5016U -#define MTP_DEV_PROP_EFFECT_MODE 0x5017U -#define MTP_DEV_PROP_BURST_NUMBER 0x5018U -#define MTP_DEV_PROP_BURST_INTERVAL 0x5019U -#define MTP_DEV_PROP_TIMELAPSE_NUMBER 0x501AU -#define MTP_DEV_PROP_TIMELAPSE_INTERVAL 0x501BU -#define MTP_DEV_PROP_FOCUS_METERING_MODE 0x501CU -#define MTP_DEV_PROP_UPLOAD_URL 0x501DU -#define MTP_DEV_PROP_ARTIST 0x501EU -#define MTP_DEV_PROP_COPYRIGHT_INFO 0x501FU -#define MTP_DEV_PROP_SYNCHRONIZATION_PARTNER 0xD401U -#define MTP_DEV_PROP_DEVICE_FRIENDLY_NAME 0xD402U -#define MTP_DEV_PROP_VOLUME 0xD403U -#define MTP_DEV_PROP_SUPPORTEDFORMATSORDERED 0xD404U -#define MTP_DEV_PROP_DEVICEICON 0xD405U -#define MTP_DEV_PROP_PLAYBACK_RATE 0xD410U -#define MTP_DEV_PROP_PLAYBACK_OBJECT 0xD411U -#define MTP_DEV_PROP_PLAYBACK_CONTAINER 0xD412U -#define MTP_DEV_PROP_SESSION_INITIATOR_VERSION_INFO 0xD406U -#define MTP_DEV_PROP_PERCEIVED_DEVICE_TYPE 0xD407U - - -/* Container Types */ -#define MTP_CONT_TYPE_UNDEFINED 0U -#define MTP_CONT_TYPE_COMMAND 1U -#define MTP_CONT_TYPE_DATA 2U -#define MTP_CONT_TYPE_RESPONSE 3U -#define MTP_CONT_TYPE_EVENT 4U - -#ifndef MTP_STORAGE_ID -#define MTP_STORAGE_ID 0x00010001U /* SD card is inserted*/ -#endif /* MTP_STORAGE_ID */ - -#define MTP_NBR_STORAGE_ID 1U -#define FREE_SPACE_IN_OBJ_NOT_USED 0xFFFFFFFFU - -/* MTP storage type */ -#define MTP_STORAGE_UNDEFINED 0U -#define MTP_STORAGE_FIXED_ROM 0x0001U -#define MTP_STORAGE_REMOVABLE_ROM 0x0002U -#define MTP_STORAGE_FIXED_RAM 0x0003U -#define MTP_STORAGE_REMOVABLE_RAM 0x0004U - -/* MTP file system type */ -#define MTP_FILESYSTEM_UNDEFINED 0U -#define MTP_FILESYSTEM_GENERIC_FLAT 0x0001U -#define MTP_FILESYSTEM_GENERIC_HIERARCH 0x0002U -#define MTP_FILESYSTEM_DCF 0x0003U - -/* MTP access capability */ -#define MTP_ACCESS_CAP_RW 0U /* read write */ -#define MTP_ACCESS_CAP_RO_WITHOUT_DEL 0x0001U -#define MTP_ACCESS_CAP_RO_WITH_DEL 0x0002U - -/* MTP standard data types supported */ -#define MTP_DATATYPE_INT8 0x0001U -#define MTP_DATATYPE_UINT8 0x0002U -#define MTP_DATATYPE_INT16 0x0003U -#define MTP_DATATYPE_UINT16 0x0004U -#define MTP_DATATYPE_INT32 0x0005U -#define MTP_DATATYPE_UINT32 0x0006U -#define MTP_DATATYPE_INT64 0x0007U -#define MTP_DATATYPE_UINT64 0x0008U -#define MTP_DATATYPE_UINT128 0x000AU -#define MTP_DATATYPE_STR 0xFFFFU - -/* MTP reading only or reading/writing */ -#define MTP_PROP_GET 0x00U -#define MTP_PROP_GET_SET 0x01U - - -/* MTP functional mode */ -#define STANDARD_MODE 0U -#define SLEEP_STATE 1U -#define FUNCTIONAL_MODE STANDARD_MODE - -/* MTP device info */ -#define STANDARD_VERSION 100U -#define VEND_EXT_ID 0x06U -#define VEND_EXT_VERSION 100U -#define MANUF_LEN (sizeof(Manuf) / 2U) -#define MODEL_LEN (sizeof(Model) / 2U) -#define SUPP_OP_LEN (sizeof(SuppOP) / 2U) -#define SERIAL_NBR_LEN (sizeof(SerialNbr) / 2U) -#define DEVICE_VERSION_LEN (sizeof(DeviceVers) / 2U) -#define SUPP_IMG_FORMAT_LEN (sizeof(SuppImgFormat) / 2U) -#define SUPP_OBJ_PROP_LEN (sizeof(ObjectPropSupp) / 2U) - -#ifndef MAX_FILE_NAME -#define MAX_FILE_NAME 255U -#endif /* MAX_FILE_NAME */ - -#ifndef MAX_OBJECT_HANDLE_LEN -#define MAX_OBJECT_HANDLE_LEN 100U -#endif /* MAX_OBJECT_HANDLE_LEN */ - -#ifndef DEVICE_PROP_DESC_DEF_LEN -#define DEVICE_PROP_DESC_DEF_LEN (uint8_t)(sizeof(DevicePropDefVal) / 2U) -#endif /* DEVICE_PROP_DESC_DEF_LEN */ - -#ifndef DEVICE_PROP_DESC_CUR_LEN -#define DEVICE_PROP_DESC_CUR_LEN (uint8_t)(sizeof(DevicePropCurDefVal) / 2U) -#endif /* DEVICE_PROP_DESC_CUR_LEN */ - -#ifndef DEFAULT_FILE_NAME_LEN -#define DEFAULT_FILE_NAME_LEN (uint8_t)(sizeof(DefaultFileName) / 2U) -#endif /* DEFAULT_FILE_NAME_LEN */ - -/** - * @} - */ - - -/** @defgroup USBD_MTP_OPT_Exported_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -static const uint16_t SuppOP[] = { MTP_OP_GET_DEVICE_INFO, MTP_OP_OPEN_SESSION, MTP_OP_CLOSE_SESSION, - MTP_OP_GET_STORAGE_IDS, MTP_OP_GET_STORAGE_INFO, MTP_OP_GET_NUM_OBJECTS, - MTP_OP_GET_OBJECT_HANDLES, MTP_OP_GET_OBJECT_INFO, MTP_OP_GET_OBJECT, - MTP_OP_DELETE_OBJECT, MTP_OP_SEND_OBJECT_INFO, MTP_OP_SEND_OBJECT, - MTP_OP_GET_DEVICE_PROP_DESC, MTP_OP_GET_DEVICE_PROP_VALUE, - MTP_OP_SET_OBJECT_PROP_VALUE, MTP_OP_GET_OBJECT_PROP_VALUE, - MTP_OP_GET_OBJECT_PROPS_SUPPORTED, MTP_OP_GET_OBJECT_PROPLIST, - MTP_OP_GET_OBJECT_PROP_DESC, MTP_OP_GET_OBJECT_PROP_REFERENCES - }; - -static const uint16_t SuppEvents[] = {MTP_EVENT_OBJECTADDED}; -static const uint16_t SuppImgFormat[] = {MTP_OBJ_FORMAT_UNDEFINED, MTP_OBJ_FORMAT_TEXT, MTP_OBJ_FORMAT_ASSOCIATION, - MTP_OBJ_FORMAT_EXECUTABLE, MTP_OBJ_FORMAT_WAV, MTP_OBJ_FORMAT_MP3, - MTP_OBJ_FORMAT_EXIF_JPEG, MTP_OBJ_FORMAT_MPEG, MTP_OBJ_FORMAT_MP4_CONTAINER, - MTP_OBJ_FORMAT_WINDOWS_IMAGE_FORMAT, MTP_OBJ_FORMAT_PNG, MTP_OBJ_FORMAT_WMA, - MTP_OBJ_FORMAT_WMV - }; - -static const uint16_t SuppCaptFormat[] = {MTP_OBJ_FORMAT_UNDEFINED, MTP_OBJ_FORMAT_ASSOCIATION, MTP_OBJ_FORMAT_TEXT}; - -/* required for all object format : storageID, objectFormat, ObjectCompressedSize, -persistent unique object identifier, name*/ -static const uint16_t ObjectPropSupp[] = {MTP_OB_PROP_STORAGE_ID, MTP_OB_PROP_OBJECT_FORMAT, MTP_OB_PROP_OBJECT_SIZE, - MTP_OB_PROP_OBJ_FILE_NAME, MTP_OB_PROP_PARENT_OBJECT, MTP_OB_PROP_NAME, - MTP_OB_PROP_PERS_UNIQ_OBJ_IDEN, MTP_OB_PROP_PROTECTION_STATUS - }; - -static const uint16_t DevicePropSupp[] = {MTP_DEV_PROP_DEVICE_FRIENDLY_NAME, MTP_DEV_PROP_BATTERY_LEVEL}; - -/* for all mtp struct */ -typedef struct -{ - uint32_t StorageIDS_len; - uint32_t StorageIDS[MTP_NBR_STORAGE_ID]; -} MTP_StorageIDSTypeDef; - -#if defined ( __GNUC__ ) -typedef __PACKED_STRUCT -#else -__packed typedef struct -#endif /* __GNUC__ */ -{ - uint8_t FileName_len; - uint16_t FileName[MAX_FILE_NAME]; -} MTP_FileNameTypeDef; - - -typedef struct -{ - uint32_t ObjectHandle_len; - uint32_t ObjectHandle[MAX_OBJECT_HANDLE_LEN]; -} MTP_ObjectHandleTypeDef; - -#if defined ( __GNUC__ ) -typedef __PACKED_STRUCT -#else -__packed typedef struct -#endif /* __GNUC__ */ -{ - uint32_t ObjectPropSupp_len; - uint16_t ObjectPropSupp[SUPP_OBJ_PROP_LEN]; -} MTP_ObjectPropSuppTypeDef; - - -#if defined ( __GNUC__ ) -typedef __PACKED_STRUCT -#else -__packed typedef struct -#endif /* __GNUC__ */ -{ - uint16_t StorageType; - uint16_t FilesystemType; - uint16_t AccessCapability; - uint64_t MaxCapability; - uint64_t FreeSpaceInBytes; - uint32_t FreeSpaceInObjects; - uint8_t StorageDescription; - uint8_t VolumeLabel; -} MTP_StorageInfoTypedef; - -typedef union -{ - uint16_t str[100]; - uint8_t u8; - int8_t i8; - uint16_t u16; - int16_t i16; - uint32_t u32; - int32_t i32; - uint64_t u64; - int64_t i64; -} MTP_PropertyValueTypedef; - -#if defined ( __GNUC__ ) -typedef __PACKED_STRUCT -#else -__packed typedef struct -#endif /* __GNUC__ */ -{ - uint16_t ObjectPropertyCode; - uint16_t DataType; - uint8_t GetSet; - uint8_t *DefValue; - uint32_t GroupCode; - uint8_t FormFlag; -} MTP_ObjectPropDescTypeDef; - - -#if defined ( __GNUC__ ) -typedef __PACKED_STRUCT -#else -__packed typedef struct -#endif /* __GNUC__ */ -{ - uint32_t ObjectHandle; - uint16_t PropertyCode; - uint16_t Datatype; - uint8_t *propval; -} MTP_PropertiesTypedef; - -#if defined ( __GNUC__ ) -typedef __PACKED_STRUCT -#else -__packed typedef struct -#endif /* __GNUC__ */ -{ - uint32_t MTP_Properties_len; - MTP_PropertiesTypedef MTP_Properties[SUPP_OBJ_PROP_LEN]; -} MTP_PropertiesListTypedef; - - -#if defined ( __GNUC__ ) -typedef __PACKED_STRUCT -#else -__packed typedef struct -#endif /* __GNUC__ */ -{ - uint32_t ref_len; - uint32_t ref[1]; -} MTP_RefTypeDef; - -#if defined ( __GNUC__ ) -typedef __PACKED_STRUCT -#else -__packed typedef struct -#endif /* __GNUC__ */ -{ - uint16_t DevicePropertyCode; - uint16_t DataType; - uint8_t GetSet; - uint8_t DefValue_len; - uint16_t DefValue[DEVICE_PROP_DESC_DEF_LEN]; - uint8_t curDefValue_len; - uint16_t curDefValue[DEVICE_PROP_DESC_CUR_LEN]; - uint8_t FormFlag; -} MTP_DevicePropDescTypeDef; - -/* MTP device info structure */ -#if defined ( __GNUC__ ) -typedef __PACKED_STRUCT -#else -__packed typedef struct -#endif /* __GNUC__ */ -{ - uint16_t StandardVersion; - uint32_t VendorExtensionID; - uint16_t VendorExtensionVersion; - uint8_t VendorExtensionDesc_len; -#if USBD_MTP_VEND_EXT_DESC_SUPPORTED == 1 - uint16_t VendorExtensionDesc[VEND_EXT_DESC_LEN]; -#endif /* USBD_MTP_VEND_EXT_DESC_SUPPORTED */ - uint16_t FunctionalMode; - uint32_t OperationsSupported_len; - uint16_t OperationsSupported[SUPP_OP_LEN]; - uint32_t EventsSupported_len; -#if USBD_MTP_EVENTS_SUPPORTED == 1 - uint16_t EventsSupported[SUPP_EVENTS_LEN]; -#endif /* USBD_MTP_EVENTS_SUPPORTED */ - uint32_t DevicePropertiesSupported_len; -#if USBD_MTP_DEVICE_PROP_SUPPORTED == 1 - uint16_t DevicePropertiesSupported[SUPP_DEVICE_PROP_LEN]; -#endif /* USBD_MTP_DEVICE_PROP_SUPPORTED */ - uint32_t CaptureFormats_len; -#if USBD_MTP_CAPTURE_FORMAT_SUPPORTED == 1 - uint16_t CaptureFormats[SUPP_CAPT_FORMAT_LEN]; -#endif /* USBD_MTP_CAPTURE_FORMAT_SUPPORTED */ - uint32_t ImageFormats_len; - uint16_t ImageFormats[SUPP_IMG_FORMAT_LEN]; - uint8_t Manufacturer_len; - uint16_t Manufacturer[MANUF_LEN]; - uint8_t Model_len; - uint16_t Model[MODEL_LEN]; - uint8_t DeviceVersion_len; - uint16_t DeviceVersion[DEVICE_VERSION_LEN]; - uint8_t SerialNumber_len; - uint16_t SerialNumber[SERIAL_NBR_LEN]; -} MTP_DeviceInfoTypedef; - -/** @defgroup USBD_MTP_OPT_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_MTP_OPT_Exported_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_MTP_OPT_Exported_Functions - * @{ - */ - -void USBD_MTP_OPT_CreateObjectHandle(USBD_HandleTypeDef *pdev); -void USBD_MTP_OPT_GetDeviceInfo(USBD_HandleTypeDef *pdev); -void USBD_MTP_OPT_GetStorageIDS(USBD_HandleTypeDef *pdev); -void USBD_MTP_OPT_GetStorageInfo(USBD_HandleTypeDef *pdev); -void USBD_MTP_OPT_GetObjectHandle(USBD_HandleTypeDef *pdev); -void USBD_MTP_OPT_GetObjectInfo(USBD_HandleTypeDef *pdev); -void USBD_MTP_OPT_GetObjectReferences(USBD_HandleTypeDef *pdev); -void USBD_MTP_OPT_GetObjectPropSupp(USBD_HandleTypeDef *pdev); -void USBD_MTP_OPT_GetObjectPropDesc(USBD_HandleTypeDef *pdev); -void USBD_MTP_OPT_GetObjectPropValue(USBD_HandleTypeDef *pdev); -void USBD_MTP_OPT_GetObjectPropList(USBD_HandleTypeDef *pdev); -void USBD_MTP_OPT_GetDevicePropDesc(USBD_HandleTypeDef *pdev); -void USBD_MTP_OPT_SendObjectInfo(USBD_HandleTypeDef *pdev, uint8_t *buff, uint32_t len); -void USBD_MTP_OPT_SendObject(USBD_HandleTypeDef *pdev, uint8_t *buff, uint32_t len); -void USBD_MTP_OPT_GetObject(USBD_HandleTypeDef *pdev); -void USBD_MTP_OPT_DeleteObject(USBD_HandleTypeDef *pdev); - - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_MTP_OPT_H__ */ -/** - * @} - */ - -/** - * @} - */ diff --git a/Class/MTP/Inc/usbd_mtp_storage.h b/Class/MTP/Inc/usbd_mtp_storage.h deleted file mode 100644 index ba01901..0000000 --- a/Class/MTP/Inc/usbd_mtp_storage.h +++ /dev/null @@ -1,118 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_mtp_storage.h - * @author MCD Application Team - * @brief header file for the usbd_mtp_storage.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_MTP_STORAGE_H__ -#define __USBD_MTP_STORAGE_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ctlreq.h" -#include "usbd_mtp_opt.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_MTP_STORAGE - * @brief This file is the header file for usbd_template_core.c - * @{ - */ - - -/** @defgroup USBD_MTP_STORAGE_Exported_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_MTP_STORAGE_Exported_TypesDefinitions - * @{ - */ - -typedef enum -{ - DATA_TYPE = 0x00, - REP_TYPE = 0x01, -} MTP_CONTAINER_TYPE; - - -typedef enum -{ - READ_FIRST_DATA = 0x00, - READ_REST_OF_DATA = 0x01, -} MTP_READ_DATA_STATUS; - - -/** - * @} - */ - - - -/** @defgroup USBD_MTP_STORAGE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_MTP_STORAGE_Exported_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_MTP_STORAGE_Exported_Functions - * @{ - */ - -uint8_t USBD_MTP_STORAGE_Init(USBD_HandleTypeDef *pdev); -uint8_t USBD_MTP_STORAGE_DeInit(USBD_HandleTypeDef *pdev); -void USBD_MTP_STORAGE_Cancel(USBD_HandleTypeDef *pdev, MTP_ResponsePhaseTypeDef MTP_ResponsePhase); -uint8_t USBD_MTP_STORAGE_ReadData(USBD_HandleTypeDef *pdev); -uint8_t USBD_MTP_STORAGE_SendContainer(USBD_HandleTypeDef *pdev, MTP_CONTAINER_TYPE CONT_TYPE); -uint8_t USBD_MTP_STORAGE_ReceiveOpt(USBD_HandleTypeDef *pdev); -uint8_t USBD_MTP_STORAGE_ReceiveData(USBD_HandleTypeDef *pdev); - - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_MTP_STORAGE_H */ -/** - * @} - */ - -/** - * @} - */ diff --git a/Class/MTP/Src/usbd_mtp.c b/Class/MTP/Src/usbd_mtp.c deleted file mode 100644 index b0950e8..0000000 --- a/Class/MTP/Src/usbd_mtp.c +++ /dev/null @@ -1,701 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_mtp.c - * @author MCD Application Team - * @brief This file provides the high layer firmware functions to manage the - * following functionalities of the USB MTP Class: - * - Initialization and Configuration of high and low layer - * - Enumeration as MTP Device (and enumeration for each implemented memory interface) - * - OUT/IN data transfer - * - Command IN transfer (class requests management) - * - Error management - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - * @verbatim - * - * =================================================================== - * MTP Class Driver Description - * =================================================================== - * This driver manages the "Universal Serial Bus Class Definitions for Media Transfer Protocol - * Revision 1.1 April 6, 2011" - * This driver implements the following aspects of the specification: - * - Device descriptor management - * - Configuration descriptor management - * - Enumeration as MTP device with 2 data endpoints (IN and OUT) and 1 command endpoint (IN) - * - Requests management - * - * - * @endverbatim - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_mtp.h" -#include "usbd_mtp_storage.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_MTP - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_MTP_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_MTP_Private_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_MTP_Private_Macros - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_MTP_Private_FunctionPrototypes - * @{ - */ -static uint8_t USBD_MTP_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_MTP_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_MTP_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static uint8_t USBD_MTP_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_MTP_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); - -#ifndef USE_USBD_COMPOSITE -static uint8_t *USBD_MTP_GetHSCfgDesc(uint16_t *length); -static uint8_t *USBD_MTP_GetFSCfgDesc(uint16_t *length); -static uint8_t *USBD_MTP_GetOtherSpeedCfgDesc(uint16_t *length); -static uint8_t *USBD_MTP_GetDeviceQualifierDescriptor(uint16_t *length); -#endif /* USE_USBD_COMPOSITE */ - -/** - * @} - */ - -/** @defgroup USBD_MTP_Private_Variables - * @{ - */ - - -/* MTP interface class callbacks structure */ -USBD_ClassTypeDef USBD_MTP = -{ - USBD_MTP_Init, - USBD_MTP_DeInit, - USBD_MTP_Setup, - NULL, /*EP0_TxSent*/ - NULL, /*EP0_RxReady*/ - USBD_MTP_DataIn, - USBD_MTP_DataOut, - NULL, /*SOF */ - NULL, /*ISOIn*/ - NULL, /*ISOOut*/ -#ifdef USE_USBD_COMPOSITE - NULL, - NULL, - NULL, - NULL, -#else - USBD_MTP_GetHSCfgDesc, - USBD_MTP_GetFSCfgDesc, - USBD_MTP_GetOtherSpeedCfgDesc, - USBD_MTP_GetDeviceQualifierDescriptor, -#endif /* USE_USBD_COMPOSITE */ -}; - -#ifndef USE_USBD_COMPOSITE - -/* USB MTP device Configuration Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_MTP_CfgDesc[MTP_CONFIG_DESC_SIZ] __ALIGN_END = -{ - /* Configuration Descriptor */ - 0x09, /* bLength: Configuration Descriptor size */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - LOBYTE(MTP_CONFIG_DESC_SIZ), /* wTotalLength: Total size of the Config descriptor */ - HIBYTE(MTP_CONFIG_DESC_SIZ), - 0x01, /* bNumInterfaces: 1 interface */ - 0x01, /* bConfigurationValue: Configuration value */ - 0x00, /* iConfiguration: Index of string descriptor - describing the configuration */ -#if (USBD_SELF_POWERED == 1U) - 0xC0, /* bmAttributes: Bus Powered according to user configuration */ -#else - 0x80, /* bmAttributes: Bus Powered according to user configuration */ -#endif /* USBD_SELF_POWERED */ - USBD_MAX_POWER, /* MaxPower (mA) */ - - /******************** MTP **** interface ********************/ - MTP_INTERFACE_DESC_SIZE, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface descriptor type */ - MTP_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x03, /* bNumEndpoints: */ - USB_MTP_INTRERFACE_CLASS, /* bInterfaceClass: bInterfaceClass: user's interface for MTP */ - USB_MTP_INTRERFACE_SUB_CLASS, /* bInterfaceSubClass:Abstract Control Model */ - USB_MTP_INTRERFACE_PROTOCOL, /* bInterfaceProtocol: Common AT commands */ - 0x00, /* iInterface: */ - - /******************** MTP Endpoints ********************/ - MTP_ENDPOINT_DESC_SIZE, /* Endpoint descriptor length = 7 */ - USB_DESC_TYPE_ENDPOINT, /* Endpoint descriptor type */ - MTP_IN_EP, /* Endpoint address (IN, address 1) */ - USBD_EP_TYPE_BULK, /* Bulk endpoint type */ - LOBYTE(MTP_DATA_MAX_FS_PACKET_SIZE), - HIBYTE(MTP_DATA_MAX_FS_PACKET_SIZE), - 0x00, /* Polling interval in milliseconds */ - - MTP_ENDPOINT_DESC_SIZE, /* Endpoint descriptor length = 7 */ - USB_DESC_TYPE_ENDPOINT, /* Endpoint descriptor type */ - MTP_OUT_EP, /* Endpoint address (OUT, address 1) */ - USBD_EP_TYPE_BULK, /* Bulk endpoint type */ - LOBYTE(MTP_DATA_MAX_FS_PACKET_SIZE), - HIBYTE(MTP_DATA_MAX_FS_PACKET_SIZE), - 0x00, /* Polling interval in milliseconds */ - - MTP_ENDPOINT_DESC_SIZE, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType:*/ - MTP_CMD_EP, /* bEndpointAddress: Endpoint Address (IN) */ - USBD_EP_TYPE_INTR, /* bmAttributes: Interrupt endpoint */ - LOBYTE(MTP_CMD_PACKET_SIZE), - HIBYTE(MTP_CMD_PACKET_SIZE), - MTP_FS_BINTERVAL /* Polling interval in milliseconds */ -}; - -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_MTP_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = -{ - USB_LEN_DEV_QUALIFIER_DESC, - USB_DESC_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x01, - 0x00, -}; -#endif /* USE_USBD_COMPOSITE */ - -uint8_t MTPInEpAdd = MTP_IN_EP; -uint8_t MTPOutEpAdd = MTP_OUT_EP; -uint8_t MTPCmdEpAdd = MTP_CMD_EP; - -/** - * @} - */ - -/** @defgroup USBD_MTP_Private_Functions - * @{ - */ - -/** - * @brief USBD_MTP_Init - * Initialize the MTP interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_MTP_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - USBD_MTP_HandleTypeDef *hmtp; - - hmtp = (USBD_MTP_HandleTypeDef *)USBD_malloc(sizeof(USBD_MTP_HandleTypeDef)); - - if (hmtp == NULL) - { - pdev->pClassDataCmsit[pdev->classId] = NULL; - return (uint8_t)USBD_EMEM; - } - - /* Setup the pClassData pointer */ - pdev->pClassDataCmsit[pdev->classId] = (void *)hmtp; - pdev->pClassData = pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - MTPInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - MTPOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - MTPCmdEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - - /* Initialize all variables */ - (void)USBD_memset(hmtp, 0, sizeof(USBD_MTP_HandleTypeDef)); - - /* Setup the max packet size according to selected speed */ - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - hmtp->MaxPcktLen = MTP_DATA_MAX_HS_PACKET_SIZE; - } - else - { - hmtp->MaxPcktLen = MTP_DATA_MAX_FS_PACKET_SIZE; - } - - /* Open EP IN */ - (void)USBD_LL_OpenEP(pdev, MTPInEpAdd, USBD_EP_TYPE_BULK, hmtp->MaxPcktLen); - pdev->ep_in[MTPInEpAdd & 0xFU].is_used = 1U; - - /* Open EP OUT */ - (void)USBD_LL_OpenEP(pdev, MTPOutEpAdd, USBD_EP_TYPE_BULK, hmtp->MaxPcktLen); - pdev->ep_out[MTPOutEpAdd & 0xFU].is_used = 1U; - - /* Open INTR EP IN */ - (void)USBD_LL_OpenEP(pdev, MTPCmdEpAdd, USBD_EP_TYPE_INTR, MTP_CMD_PACKET_SIZE); - pdev->ep_in[MTPCmdEpAdd & 0xFU].is_used = 1U; - - /* Init the MTP layer */ - (void)USBD_MTP_STORAGE_Init(pdev); - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_MTP_DeInit - * DeInitialize the MTP layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_MTP_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this MTP class instance */ - MTPInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - MTPOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - MTPCmdEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Close EP IN */ - (void)USBD_LL_CloseEP(pdev, MTPInEpAdd); - pdev->ep_in[MTPInEpAdd & 0xFU].is_used = 0U; - - /* Close EP OUT */ - (void)USBD_LL_CloseEP(pdev, MTPOutEpAdd); - pdev->ep_out[MTPOutEpAdd & 0xFU].is_used = 0U; - - /* Close EP Command */ - (void)USBD_LL_CloseEP(pdev, MTPCmdEpAdd); - pdev->ep_in[MTPCmdEpAdd & 0xFU].is_used = 0U; - - /* Free MTP Class Resources */ - if (pdev->pClassDataCmsit[pdev->classId] != NULL) - { - /* De-Init the MTP layer */ - (void)USBD_MTP_STORAGE_DeInit(pdev); - - (void)USBD_free(pdev->pClassDataCmsit[pdev->classId]); - pdev->pClassDataCmsit[pdev->classId] = NULL; - pdev->pClassData = NULL; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_MTP_Setup - * Handle the MTP specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t USBD_MTP_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_StatusTypeDef ret = USBD_OK; - uint16_t len = 0U; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this MTP class instance */ - MTPOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (hmtp == NULL) - { - return (uint8_t)USBD_FAIL; - } - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - /* Class request */ - case USB_REQ_TYPE_CLASS : - switch (req->bRequest) - { - case MTP_REQ_CANCEL: - len = MIN(hmtp->MaxPcktLen, req->wLength); - (void)USBD_CtlPrepareRx(pdev, (uint8_t *)(hmtp->rx_buff), len); - break; - - case MTP_REQ_GET_EXT_EVENT_DATA: - break; - - case MTP_REQ_RESET: - /* Stop low layer file system operations if any */ - USBD_MTP_STORAGE_Cancel(pdev, MTP_PHASE_IDLE); - - (void)USBD_LL_PrepareReceive(pdev, MTPOutEpAdd, (uint8_t *)&hmtp->rx_buff, hmtp->MaxPcktLen); - break; - - case MTP_REQ_GET_DEVICE_STATUS: - switch (hmtp->MTP_ResponsePhase) - { - case MTP_READ_DATA : - len = 4U; - hmtp->dev_status = ((uint32_t)MTP_RESPONSE_DEVICE_BUSY << 16) | len; - break; - - case MTP_RECEIVE_DATA : - len = 4U; - hmtp->dev_status = ((uint32_t)MTP_RESPONSE_TRANSACTION_CANCELLED << 16) | len; - break; - - case MTP_PHASE_IDLE : - len = 4U; - hmtp->dev_status = ((uint32_t)MTP_RESPONSE_OK << 16) | len; - break; - - default: - break; - } - (void)USBD_CtlSendData(pdev, (uint8_t *)&hmtp->dev_status, len); - 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_INTERFACE : - - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - hmtp->alt_setting = 0U; - (void)USBD_CtlSendData(pdev, (uint8_t *)&hmtp->alt_setting, 1U); - } - break; - - case USB_REQ_SET_INTERFACE : - if (pdev->dev_state != USBD_STATE_CONFIGURED) - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_CLEAR_FEATURE: - - /* Re-activate the EP */ - (void)USBD_LL_CloseEP(pdev, (uint8_t)req->wIndex); - - if ((((uint8_t)req->wIndex) & 0x80U) == 0x80U) - { - (void)USBD_LL_OpenEP(pdev, ((uint8_t)req->wIndex), USBD_EP_TYPE_BULK, hmtp->MaxPcktLen); - } - else - { - (void)USBD_LL_OpenEP(pdev, ((uint8_t)req->wIndex), USBD_EP_TYPE_BULK, hmtp->MaxPcktLen); - } - break; - - default: - break; - } - break; - - default: - break; - } - return (uint8_t)ret; -} - -/** - * @brief USBD_MTP_DataIn - * Data sent on non-control IN endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t USBD_MTP_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - UNUSED(epnum); - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint16_t len; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this MTP class instance */ - MTPInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - MTPOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (epnum == (MTPInEpAdd & 0x7FU)) - { - switch (hmtp->MTP_ResponsePhase) - { - case MTP_RESPONSE_PHASE : - (void)USBD_MTP_STORAGE_SendContainer(pdev, REP_TYPE); - - /* prepare to receive next operation */ - len = MIN(hmtp->MaxPcktLen, pdev->request.wLength); - - (void)USBD_LL_PrepareReceive(pdev, MTPOutEpAdd, (uint8_t *)&hmtp->rx_buff, len); - hmtp->MTP_ResponsePhase = MTP_PHASE_IDLE; - break; - - case MTP_READ_DATA : - (void)USBD_MTP_STORAGE_ReadData(pdev); - - /* prepare to receive next operation */ - len = MIN(hmtp->MaxPcktLen, pdev->request.wLength); - - (void)USBD_LL_PrepareReceive(pdev, MTPInEpAdd, (uint8_t *)&hmtp->rx_buff, len); - break; - - case MTP_PHASE_IDLE : - /* prepare to receive next operation */ - len = MIN(hmtp->MaxPcktLen, pdev->request.wLength); - - (void)USBD_LL_PrepareReceive(pdev, MTPOutEpAdd, (uint8_t *)&hmtp->rx_buff, len); - - break; - default: - break; - } - } - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_MTP_DataOut - * Data received on non-control Out endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t USBD_MTP_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - UNUSED(epnum); - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint16_t len; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this MTP class instance */ - MTPOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - (void)USBD_MTP_STORAGE_ReceiveOpt(pdev); - - switch (hmtp->MTP_ResponsePhase) - { - case MTP_RESPONSE_PHASE : - - if (hmtp->ResponseLength == MTP_CONT_HEADER_SIZE) - { - (void)USBD_MTP_STORAGE_SendContainer(pdev, REP_TYPE); - hmtp->MTP_ResponsePhase = MTP_PHASE_IDLE; - } - else - { - (void)USBD_MTP_STORAGE_SendContainer(pdev, DATA_TYPE); - } - break; - - case MTP_READ_DATA : - (void)USBD_MTP_STORAGE_ReadData(pdev); - break; - - case MTP_RECEIVE_DATA : - (void)USBD_MTP_STORAGE_ReceiveData(pdev); - - /* prepare endpoint to receive operations */ - len = MIN(hmtp->MaxPcktLen, pdev->request.wLength); - - (void)USBD_LL_PrepareReceive(pdev, MTPOutEpAdd, (uint8_t *)&hmtp->rx_buff, len); - break; - - case MTP_PHASE_IDLE : - /* prepare to receive next operation */ - len = MIN(hmtp->MaxPcktLen, pdev->request.wLength); - - (void)USBD_LL_PrepareReceive(pdev, MTPOutEpAdd, (uint8_t *)&hmtp->rx_buff, len); - break; - - default: - break; - } - - return (uint8_t)USBD_OK; -} - -#ifndef USE_USBD_COMPOSITE -/** - * @brief USBD_MTP_GetHSCfgDesc - * Return configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_MTP_GetHSCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_MTP_CfgDesc, MTP_IN_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_MTP_CfgDesc, MTP_OUT_EP); - USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_MTP_CfgDesc, MTP_CMD_EP); - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = MTP_DATA_MAX_HS_PACKET_SIZE; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = MTP_DATA_MAX_HS_PACKET_SIZE; - } - - if (pEpCmdDesc != NULL) - { - pEpCmdDesc->bInterval = MTP_HS_BINTERVAL; - } - - *length = (uint16_t)sizeof(USBD_MTP_CfgDesc); - return USBD_MTP_CfgDesc; -} - -/** - * @brief USBD_MTP_GetFSCfgDesc - * Return configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_MTP_GetFSCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_MTP_CfgDesc, MTP_IN_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_MTP_CfgDesc, MTP_OUT_EP); - USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_MTP_CfgDesc, MTP_CMD_EP); - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = MTP_DATA_MAX_FS_PACKET_SIZE; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = MTP_DATA_MAX_FS_PACKET_SIZE; - } - - if (pEpCmdDesc != NULL) - { - pEpCmdDesc->bInterval = MTP_FS_BINTERVAL; - } - - *length = (uint16_t)sizeof(USBD_MTP_CfgDesc); - return USBD_MTP_CfgDesc; -} - -/** - * @brief USBD_MTP_GetOtherSpeedCfgDesc - * Return configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_MTP_GetOtherSpeedCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_MTP_CfgDesc, MTP_IN_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_MTP_CfgDesc, MTP_OUT_EP); - USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_MTP_CfgDesc, MTP_CMD_EP); - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = MTP_DATA_MAX_FS_PACKET_SIZE; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = MTP_DATA_MAX_FS_PACKET_SIZE; - } - - if (pEpCmdDesc != NULL) - { - pEpCmdDesc->bInterval = MTP_FS_BINTERVAL; - } - - *length = (uint16_t)sizeof(USBD_MTP_CfgDesc); - return USBD_MTP_CfgDesc; -} - -/** - * @brief USBD_MTP_GetDeviceQualifierDescriptor - * return Device Qualifier descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_MTP_GetDeviceQualifierDescriptor(uint16_t *length) -{ - *length = (uint16_t)(sizeof(USBD_MTP_DeviceQualifierDesc)); - return USBD_MTP_DeviceQualifierDesc; -} -#endif /* USE_USBD_COMPOSITE */ - -/** - * @brief USBD_MTP_RegisterInterface - * @param pdev: device instance - * @param fops: CD Interface callback - * @retval status - */ -uint8_t USBD_MTP_RegisterInterface(USBD_HandleTypeDef *pdev, USBD_MTP_ItfTypeDef *fops) -{ - if (fops == NULL) - { - return (uint8_t)USBD_FAIL; - } - - pdev->pUserData[pdev->classId] = fops; - - return (uint8_t)USBD_OK; -} - -/** - * @} - */ - -/** - * @} - */ - diff --git a/Class/MTP/Src/usbd_mtp_if_template.c b/Class/MTP/Src/usbd_mtp_if_template.c deleted file mode 100644 index baeb9ca..0000000 --- a/Class/MTP/Src/usbd_mtp_if_template.c +++ /dev/null @@ -1,347 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_mtp_if.c - * @author MCD Application Team - * @brief Source file for USBD MTP file list_files. - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_mtp_if_template.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -/* -static FILE MyFile; -static FATFS SDFatFs; -static char SDPath[4]; -static FolderLevel Fold_Lvl; -static FOLD_INFTypeDef FoldStruct; -static FILE_INFTypeDef FileStruct; -static SD_Object_TypeDef sd_object; -*/ -extern USBD_HandleTypeDef USBD_Device; - -uint32_t idx[200]; -uint32_t parent; -/* static char path[255]; */ -uint32_t sc_buff[MTP_IF_SCRATCH_BUFF_SZE / 4U]; -uint32_t sc_len = 0U; -uint32_t pckt_cnt = 1U; -uint32_t foldsize; - -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private function prototypes -----------------------------------------------*/ -static uint8_t USBD_MTP_Itf_Init(void); -static uint8_t USBD_MTP_Itf_DeInit(void); -static uint32_t USBD_MTP_Itf_ReadData(uint32_t Param1, uint8_t *buff, MTP_DataLengthTypeDef *data_length); -static uint16_t USBD_MTP_Itf_Create_NewObject(MTP_ObjectInfoTypeDef ObjectInfo, uint32_t objhandle); - -static uint32_t USBD_MTP_Itf_GetIdx(uint32_t Param3, uint32_t *obj_handle); -static uint32_t USBD_MTP_Itf_GetParentObject(uint32_t Param); -static uint16_t USBD_MTP_Itf_GetObjectFormat(uint32_t Param); -static uint8_t USBD_MTP_Itf_GetObjectName_len(uint32_t Param); -static void USBD_MTP_Itf_GetObjectName(uint32_t Param, uint8_t obj_len, uint16_t *buf); -static uint32_t USBD_MTP_Itf_GetObjectSize(uint32_t Param); -static uint64_t USBD_MTP_Itf_GetMaxCapability(void); -static uint64_t USBD_MTP_Itf_GetFreeSpaceInBytes(void); -static uint32_t USBD_MTP_Itf_GetNewIndex(uint16_t objformat); -static void USBD_MTP_Itf_WriteData(uint16_t len, uint8_t *buff); -static uint32_t USBD_MTP_Itf_GetContainerLength(uint32_t Param1); -static uint16_t USBD_MTP_Itf_DeleteObject(uint32_t Param1); - -static void USBD_MTP_Itf_Cancel(uint32_t Phase); -/* static uint32_t USBD_MTP_Get_idx_to_delete(uint32_t Param, uint8_t *tab); */ - -USBD_MTP_ItfTypeDef USBD_MTP_fops = -{ - USBD_MTP_Itf_Init, - USBD_MTP_Itf_DeInit, - USBD_MTP_Itf_ReadData, - USBD_MTP_Itf_Create_NewObject, - USBD_MTP_Itf_GetIdx, - USBD_MTP_Itf_GetParentObject, - USBD_MTP_Itf_GetObjectFormat, - USBD_MTP_Itf_GetObjectName_len, - USBD_MTP_Itf_GetObjectName, - USBD_MTP_Itf_GetObjectSize, - USBD_MTP_Itf_GetMaxCapability, - USBD_MTP_Itf_GetFreeSpaceInBytes, - USBD_MTP_Itf_GetNewIndex, - USBD_MTP_Itf_WriteData, - USBD_MTP_Itf_GetContainerLength, - USBD_MTP_Itf_DeleteObject, - USBD_MTP_Itf_Cancel, - sc_buff, - MTP_IF_SCRATCH_BUFF_SZE, -}; - -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief USBD_MTP_Itf_Init - * Initialize the file system Layer - * @param None - * @retval status value - */ -static uint8_t USBD_MTP_Itf_Init(void) -{ - return 0; -} - -/** - * @brief USBD_MTP_Itf_DeInit - * Uninitialize the file system Layer - * @param None - * @retval status value - */ -static uint8_t USBD_MTP_Itf_DeInit(void) -{ - return 0; -} - -/** - * @brief USBD_MTP_Itf_GetIdx - * Get all object handle - * @param Param3: current object handle - * @param obj_handle: all objects handle (subfolders/files) in current object - * @retval number of object handle in current object - */ -static uint32_t USBD_MTP_Itf_GetIdx(uint32_t Param3, uint32_t *obj_handle) -{ - uint32_t count = 0U; - UNUSED(Param3); - UNUSED(obj_handle); - - return count; -} - -/** - * @brief USBD_MTP_Itf_GetParentObject - * Get parent object - * @param Param: object handle (object index) - * @retval parent object - */ -static uint32_t USBD_MTP_Itf_GetParentObject(uint32_t Param) -{ - uint32_t parentobj = 0U; - UNUSED(Param); - - return parentobj; -} - -/** - * @brief USBD_MTP_Itf_GetObjectFormat - * Get object format - * @param Param: object handle (object index) - * @retval object format - */ -static uint16_t USBD_MTP_Itf_GetObjectFormat(uint32_t Param) -{ - uint16_t objformat = 0U; - UNUSED(Param); - - return objformat; -} - -/** - * @brief USBD_MTP_Itf_GetObjectName_len - * Get object name length - * @param Param: object handle (object index) - * @retval object name length - */ -static uint8_t USBD_MTP_Itf_GetObjectName_len(uint32_t Param) -{ - uint8_t obj_len = 0U; - UNUSED(Param); - - return obj_len; -} - -/** - * @brief USBD_MTP_Itf_GetObjectName - * Get object name - * @param Param: object handle (object index) - * @param obj_len: length of object name - * @param buf: pointer to object name - * @retval object size in SD card - */ -static void USBD_MTP_Itf_GetObjectName(uint32_t Param, uint8_t obj_len, uint16_t *buf) -{ - UNUSED(Param); - UNUSED(obj_len); - UNUSED(buf); - - return; -} - -/** - * @brief USBD_MTP_Itf_GetObjectSize - * Get size of current object - * @param Param: object handle (object index) - * @retval object size in SD card - */ -static uint32_t USBD_MTP_Itf_GetObjectSize(uint32_t Param) -{ - uint32_t ObjCompSize = 0U; - UNUSED(Param); - - return ObjCompSize; -} - -/** - * @brief USBD_MTP_Itf_Create_NewObject - * Create new object in SD card and store necessary information for future use - * @param ObjectInfo: object information to use - * @param objhandle: object handle (object index) - * @retval None - */ -static uint16_t USBD_MTP_Itf_Create_NewObject(MTP_ObjectInfoTypeDef ObjectInfo, uint32_t objhandle) -{ - uint16_t rep_code = 0U; - UNUSED(ObjectInfo); - UNUSED(objhandle); - - return rep_code; -} - -/** - * @brief USBD_MTP_Itf_GetMaxCapability - * Get max capability in SD card - * @param None - * @retval max capability - */ -static uint64_t USBD_MTP_Itf_GetMaxCapability(void) -{ - uint64_t max_cap = 0U; - - return max_cap; -} - -/** - * @brief USBD_MTP_Itf_GetFreeSpaceInBytes - * Get free space in bytes in SD card - * @param None - * @retval free space in bytes - */ -static uint64_t USBD_MTP_Itf_GetFreeSpaceInBytes(void) -{ - uint64_t f_space_inbytes = 0U; - - return f_space_inbytes; -} - -/** - * @brief USBD_MTP_Itf_GetNewIndex - * Create new object handle - * @param objformat: object format - * @retval object handle - */ -static uint32_t USBD_MTP_Itf_GetNewIndex(uint16_t objformat) -{ - uint32_t n_index = 0U; - UNUSED(objformat); - - return n_index; -} - -/** - * @brief USBD_MTP_Itf_WriteData - * Write file data to SD card - * @param len: size of data to write - * @param buff: data to write in SD card - * @retval None - */ -static void USBD_MTP_Itf_WriteData(uint16_t len, uint8_t *buff) -{ - UNUSED(len); - UNUSED(buff); - - return; -} - -/** - * @brief USBD_MTP_Itf_GetContainerLength - * Get length of generic container - * @param Param1: object handle - * @retval length of generic container - */ -static uint32_t USBD_MTP_Itf_GetContainerLength(uint32_t Param1) -{ - uint32_t length = 0U; - UNUSED(Param1); - - return length; -} - -/** - * @brief USBD_MTP_Itf_DeleteObject - * delete object from SD card - * @param Param1: object handle (file/folder index) - * @retval response code - */ -static uint16_t USBD_MTP_Itf_DeleteObject(uint32_t Param1) -{ - uint16_t rep_code = 0U; - UNUSED(Param1); - - return rep_code; -} - -/** - * @brief USBD_MTP_Get_idx_to_delete - * Get all files/foldres index to delete with descending order ( max depth) - * @param Param: object handle (file/folder index) - * @param tab: pointer to list of files/folders to delete - * @retval Number of files/folders to delete - */ -/* static uint32_t USBD_MTP_Get_idx_to_delete(uint32_t Param, uint8_t *tab) -{ - uint32_t cnt = 0U; - - return cnt; -} -*/ - -/** - * @brief USBD_MTP_Itf_ReadData - * Read data from SD card - * @param Param1: object handle - * @param buff: pointer to data to be read - * @param temp_length: current data size read - * @retval necessary information for next read/finish reading - */ -static uint32_t USBD_MTP_Itf_ReadData(uint32_t Param1, uint8_t *buff, MTP_DataLengthTypeDef *data_length) -{ - UNUSED(Param1); - UNUSED(buff); - UNUSED(data_length); - - return 0U; -} - -/** - * @brief USBD_MTP_Itf_Cancel - * Close opened folder/file while cancelling transaction - * @param MTP_ResponsePhase: MTP current state - * @retval None - */ -static void USBD_MTP_Itf_Cancel(uint32_t Phase) -{ - UNUSED(Phase); - - /* Make sure to close open file while canceling transaction */ - - return; -} diff --git a/Class/MTP/Src/usbd_mtp_opt.c b/Class/MTP/Src/usbd_mtp_opt.c deleted file mode 100644 index 9a49717..0000000 --- a/Class/MTP/Src/usbd_mtp_opt.c +++ /dev/null @@ -1,1267 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_mtp_opt.c - * @author MCD Application Team - * @brief This file includes the PTP operations layer - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_mtp_opt.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -static uint8_t ObjInfo_buff[255]; -static uint32_t objhandle; -static uint16_t obj_format; -static uint32_t storage_id; - -static MTP_DeviceInfoTypedef MTP_DeviceInfo; -static MTP_StorageIDSTypeDef MTP_StorageIDS; -static MTP_StorageInfoTypedef MTP_StorageInfo; -static MTP_ObjectHandleTypeDef MTP_ObjectHandle; -static MTP_ObjectInfoTypeDef MTP_ObjectInfo; -static MTP_ObjectPropSuppTypeDef MTP_ObjectPropSupp; -static MTP_ObjectPropDescTypeDef MTP_ObjectPropDesc; -static MTP_PropertiesListTypedef MTP_PropertiesList; -static MTP_RefTypeDef MTP_Ref; -static MTP_PropertyValueTypedef MTP_PropertyValue; -static MTP_FileNameTypeDef MTP_FileName; -static MTP_DevicePropDescTypeDef MTP_DevicePropDesc; - -/* Private function prototypes -----------------------------------------------*/ -static void MTP_Get_DeviceInfo(void); -static void MTP_Get_StorageIDS(void); -static void MTP_Get_PayloadContent(USBD_HandleTypeDef *pdev); -static void MTP_Get_ObjectInfo(USBD_HandleTypeDef *pdev); -static void MTP_Get_StorageInfo(USBD_HandleTypeDef *pdev); -static void MTP_Get_ObjectHandle(USBD_HandleTypeDef *pdev); -static void MTP_Get_ObjectPropSupp(void); -static void MTP_Get_ObjectPropDesc(USBD_HandleTypeDef *pdev); -static void MTP_Get_ObjectPropList(USBD_HandleTypeDef *pdev); -static void MTP_Get_DevicePropDesc(void); -static uint8_t *MTP_Get_ObjectPropValue(USBD_HandleTypeDef *pdev); -static uint32_t MTP_build_data_propdesc(USBD_HandleTypeDef *pdev, MTP_ObjectPropDescTypeDef def); -static uint32_t MTP_build_data_ObjInfo(USBD_HandleTypeDef *pdev, MTP_ObjectInfoTypeDef objinfo); -static uint32_t MTP_build_data_proplist(USBD_HandleTypeDef *pdev, - MTP_PropertiesListTypedef proplist, uint32_t idx); - -/* Private functions ---------------------------------------------------------*/ - -/** - * @} - */ - - -/** - * @brief USBD_MTP_OPT_CreateObjectHandle - * Open a new session - * @param pdev: device instance - * @retval None - */ -void USBD_MTP_OPT_CreateObjectHandle(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hmtp->OperationsContainer.Param1 == 0U) /* Param1 == Session ID*/ - { - hmtp->ResponseCode = MTP_RESPONSE_INVALID_PARAMETER; - } - /* driver supports single session */ - else if (hmtp->MTP_SessionState == MTP_SESSION_OPENED) - { - hmtp->ResponseCode = MTP_RESPONSE_SESSION_ALREADY_OPEN; - } - else - { - hmtp->ResponseCode = MTP_RESPONSE_OK; - hmtp->MTP_SessionState = MTP_SESSION_OPENED; - } - - hmtp->GenericContainer.trans_id = hmtp->OperationsContainer.trans_id; - hmtp->GenericContainer.type = MTP_CONT_TYPE_RESPONSE; - hmtp->ResponseLength = MTP_CONT_HEADER_SIZE; - hmtp->GenericContainer.length = hmtp->ResponseLength; -} - -/** - * @brief USBD_MTP_OPT_GetDeviceInfo - * Get all device information - * @param pdev: device instance - * @retval None - */ -void USBD_MTP_OPT_GetDeviceInfo(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hmtp->MTP_SessionState == MTP_SESSION_NOT_OPENED) /* no session opened */ - { - /* if GetDevice Info called outside a session then SessionID and Transaction_ID shall be 0x00000000*/ - /* Param1 == session ID*/ - if ((hmtp->OperationsContainer.Param1 == 0U) && (hmtp->OperationsContainer.trans_id == 0U)) - { - hmtp->ResponseCode = MTP_RESPONSE_OK; - } - else - { - hmtp->GenericContainer.trans_id = hmtp->OperationsContainer.trans_id; - hmtp->GenericContainer.type = MTP_CONT_TYPE_RESPONSE; - hmtp->ResponseCode = MTP_RESPONSE_INVALID_PARAMETER; - hmtp->GenericContainer.length = MTP_CONT_HEADER_SIZE; - } - } - else - { - hmtp->ResponseCode = MTP_RESPONSE_OK; - } - - if (hmtp->ResponseCode == MTP_RESPONSE_OK) - { - hmtp->GenericContainer.code = MTP_OP_GET_DEVICE_INFO; - hmtp->GenericContainer.trans_id = hmtp->OperationsContainer.trans_id; - hmtp->GenericContainer.type = MTP_CONT_TYPE_DATA; - - (void)MTP_Get_PayloadContent(pdev); - - hmtp->ResponseLength = sizeof(MTP_DeviceInfo) + MTP_CONT_HEADER_SIZE; - hmtp->GenericContainer.length = hmtp->ResponseLength; - } -} - -/** - * @brief USBD_MTP_OPT_GetStorageIDS - * Get Storage IDs - * @param pdev: device instance - * @retval None - */ -void USBD_MTP_OPT_GetStorageIDS(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - hmtp->GenericContainer.code = MTP_OP_GET_STORAGE_IDS; - hmtp->GenericContainer.trans_id = hmtp->OperationsContainer.trans_id; - hmtp->GenericContainer.type = MTP_CONT_TYPE_DATA; - - (void)MTP_Get_PayloadContent(pdev); - - hmtp->ResponseLength = sizeof(MTP_StorageIDS) + MTP_CONT_HEADER_SIZE; - hmtp->GenericContainer.length = hmtp->ResponseLength; - - hmtp->ResponseCode = MTP_RESPONSE_OK; -} - -/** - * @brief USBD_MTP_OPT_GetStorageInfo - * Get Storage information - * @param pdev: device instance - * @retval None - */ -void USBD_MTP_OPT_GetStorageInfo(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - hmtp->GenericContainer.code = MTP_OP_GET_STORAGE_INFO; - hmtp->GenericContainer.trans_id = hmtp->OperationsContainer.trans_id; - hmtp->GenericContainer.type = MTP_CONT_TYPE_DATA; - - (void)MTP_Get_PayloadContent(pdev); - - hmtp->ResponseLength = sizeof(MTP_StorageInfo) + MTP_CONT_HEADER_SIZE; - hmtp->GenericContainer.length = hmtp->ResponseLength; - - hmtp->ResponseCode = MTP_RESPONSE_OK; -} - -/** - * @brief USBD_MTP_OPT_GetObjectHandle - * Get all object handles - * @param pdev: device instance - * @retval None - */ -void USBD_MTP_OPT_GetObjectHandle(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - hmtp->GenericContainer.code = MTP_OP_GET_OBJECT_HANDLES; - hmtp->GenericContainer.trans_id = hmtp->OperationsContainer.trans_id; - hmtp->GenericContainer.type = MTP_CONT_TYPE_DATA; - - (void)MTP_Get_PayloadContent(pdev); - - hmtp->ResponseLength = hmtp->ResponseLength + MTP_CONT_HEADER_SIZE; - hmtp->GenericContainer.length = hmtp->ResponseLength; - - hmtp->ResponseCode = MTP_RESPONSE_OK; -} - -/** - * @brief USBD_MTP_OPT_GetObjectInfo - * Get all information about the object - * @param pdev: device instance - * @retval None - */ -void USBD_MTP_OPT_GetObjectInfo(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - hmtp->GenericContainer.code = MTP_OP_GET_OBJECT_INFO; - hmtp->GenericContainer.trans_id = hmtp->OperationsContainer.trans_id; - hmtp->GenericContainer.type = MTP_CONT_TYPE_DATA; - - (void)MTP_Get_PayloadContent(pdev); - - hmtp->ResponseLength = hmtp->ResponseLength + MTP_CONT_HEADER_SIZE; - hmtp->GenericContainer.length = hmtp->ResponseLength; - - hmtp->ResponseCode = MTP_RESPONSE_OK; -} - -/** - * @brief USBD_MTP_OPT_GetObjectReferences - * Get object references - * @param pdev: device instance - * @retval None - */ -void USBD_MTP_OPT_GetObjectReferences(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - hmtp->GenericContainer.code = MTP_OP_GET_OBJECT_PROP_REFERENCES; - hmtp->GenericContainer.trans_id = hmtp->OperationsContainer.trans_id; - hmtp->GenericContainer.type = MTP_CONT_TYPE_DATA; - - (void)MTP_Get_PayloadContent(pdev); - - hmtp->ResponseLength = sizeof(MTP_Ref) + MTP_CONT_HEADER_SIZE; - hmtp->GenericContainer.length = hmtp->ResponseLength; - - hmtp->ResponseCode = MTP_RESPONSE_OK; -} - -/** - * @brief USBD_MTP_OPT_GetObjectPropSupp - * Get all object properties supported - * @param pdev: device instance - * @retval None - */ -void USBD_MTP_OPT_GetObjectPropSupp(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - hmtp->GenericContainer.code = MTP_OP_GET_OBJECT_PROPS_SUPPORTED; - hmtp->GenericContainer.trans_id = hmtp->OperationsContainer.trans_id; - hmtp->GenericContainer.type = MTP_CONT_TYPE_DATA; - - (void)MTP_Get_PayloadContent(pdev); - - hmtp->ResponseLength = sizeof(MTP_ObjectPropSupp) + MTP_CONT_HEADER_SIZE; - hmtp->GenericContainer.length = hmtp->ResponseLength; - - hmtp->ResponseCode = MTP_RESPONSE_OK; -} - -/** - * @brief USBD_MTP_OPT_GetObjectPropDesc - * Get all descriptions about object properties - * @param pdev: device instance - * @retval None - */ -void USBD_MTP_OPT_GetObjectPropDesc(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - hmtp->GenericContainer.code = MTP_OP_GET_OBJECT_PROP_DESC; - hmtp->GenericContainer.trans_id = hmtp->OperationsContainer.trans_id; - hmtp->GenericContainer.type = MTP_CONT_TYPE_DATA; - - (void)MTP_Get_PayloadContent(pdev); - - hmtp->ResponseLength = hmtp->ResponseLength + MTP_CONT_HEADER_SIZE; - hmtp->GenericContainer.length = hmtp->ResponseLength; - - hmtp->ResponseCode = MTP_RESPONSE_OK; -} - -/** - * @brief USBD_MTP_OPT_GetObjectPropList - * Get the list of object properties - * @param pdev: device instance - * @retval None - */ -void USBD_MTP_OPT_GetObjectPropList(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - hmtp->GenericContainer.code = MTP_OP_GET_OBJECT_PROPLIST; - hmtp->GenericContainer.trans_id = hmtp->OperationsContainer.trans_id; - hmtp->GenericContainer.type = MTP_CONT_TYPE_DATA; - - (void)MTP_Get_PayloadContent(pdev); - - hmtp->ResponseLength = hmtp->ResponseLength + MTP_CONT_HEADER_SIZE; - hmtp->GenericContainer.length = hmtp->ResponseLength; - - hmtp->ResponseCode = MTP_RESPONSE_OK; -} - -/** - * @brief USBD_MTP_OPT_GetObjectPropValue - * Get current value of the object property - * @param pdev: device instance - * @retval None - */ -void USBD_MTP_OPT_GetObjectPropValue(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - hmtp->GenericContainer.code = MTP_OP_GET_OBJECT_PROP_VALUE; - hmtp->GenericContainer.trans_id = hmtp->OperationsContainer.trans_id; - hmtp->GenericContainer.type = MTP_CONT_TYPE_DATA; - - (void)MTP_Get_PayloadContent(pdev); - - hmtp->ResponseLength = hmtp->ResponseLength + MTP_CONT_HEADER_SIZE; - hmtp->GenericContainer.length = hmtp->ResponseLength; - - hmtp->ResponseCode = MTP_RESPONSE_OK; -} - -/** - * @brief USBD_MTP_OPT_GetObject - * Get binary data from an object - * @param pdev: device instance - * @retval None - */ -void USBD_MTP_OPT_GetObject(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_MTP_ItfTypeDef *hmtpif = (USBD_MTP_ItfTypeDef *)pdev->pUserData[pdev->classId]; - - hmtp->GenericContainer.length = hmtpif->GetContainerLength(hmtp->OperationsContainer.Param1); - hmtp->GenericContainer.trans_id = hmtp->OperationsContainer.trans_id; - hmtp->GenericContainer.type = MTP_CONT_TYPE_DATA; - - hmtp->ResponseCode = MTP_RESPONSE_OK; -} - -/** - * @brief USBD_MTP_OPT_GetDevicePropDesc - * Get The DevicePropDesc dataset - * @param pdev: device instance - * @retval None - */ -void USBD_MTP_OPT_GetDevicePropDesc(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - hmtp->GenericContainer.code = MTP_OP_GET_DEVICE_PROP_DESC; - hmtp->GenericContainer.trans_id = hmtp->OperationsContainer.trans_id; - hmtp->GenericContainer.type = MTP_CONT_TYPE_DATA; - - (void)MTP_Get_PayloadContent(pdev); - - hmtp->ResponseLength = sizeof(MTP_DevicePropDesc) + MTP_CONT_HEADER_SIZE; - hmtp->GenericContainer.length = hmtp->ResponseLength; - - hmtp->ResponseCode = MTP_RESPONSE_OK; -} - -/** - * @brief USBD_MTP_OPT_SendObject - * Send object from host to MTP device - * @param pdev: device instance - * @retval None - */ -void USBD_MTP_OPT_SendObject(USBD_HandleTypeDef *pdev, uint8_t *buff, uint32_t len) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_MTP_ItfTypeDef *hmtpif = (USBD_MTP_ItfTypeDef *)pdev->pUserData[pdev->classId]; - static uint32_t tmp = 0U; - - switch (hmtp->RECEIVE_DATA_STATUS) - { - case RECEIVE_IDLE_STATE: - hmtp->RECEIVE_DATA_STATUS = RECEIVE_COMMAND_DATA; - break; - case RECEIVE_COMMAND_DATA: - hmtp->RECEIVE_DATA_STATUS = RECEIVE_FIRST_DATA; - break; - case RECEIVE_FIRST_DATA: - if ((uint16_t)len < (hmtp->MaxPcktLen - MTP_CONT_HEADER_SIZE)) - { - hmtp->GenericContainer.code = MTP_RESPONSE_OK; - hmtp->GenericContainer.trans_id = hmtp->OperationsContainer.trans_id; - hmtp->GenericContainer.type = MTP_CONT_TYPE_RESPONSE; - hmtp->ResponseLength = MTP_CONT_HEADER_SIZE; - hmtp->GenericContainer.length = hmtp->ResponseLength; - - hmtp->RECEIVE_DATA_STATUS = RECEIVE_IDLE_STATE; - } - else - { - hmtp->RECEIVE_DATA_STATUS = RECEIVE_REST_OF_DATA; - } - tmp = (uint32_t)buff; - hmtpif->WriteData(len, (uint8_t *)(tmp + 12U)); - break; - - case RECEIVE_REST_OF_DATA: - hmtpif->WriteData(len, buff); - break; - - case SEND_RESPONSE: - hmtpif->WriteData(0, buff); /* send 0 length to stop write process */ - hmtp->GenericContainer.code = MTP_RESPONSE_OK; - hmtp->GenericContainer.trans_id = hmtp->OperationsContainer.trans_id; - hmtp->GenericContainer.type = MTP_CONT_TYPE_RESPONSE; - hmtp->ResponseLength = MTP_CONT_HEADER_SIZE; - hmtp->GenericContainer.length = hmtp->ResponseLength; - - hmtp->RECEIVE_DATA_STATUS = RECEIVE_IDLE_STATE; - break; - - default: - break; - } - - hmtp->ResponseCode = MTP_RESPONSE_OK; -} - -/** - * @brief USBD_MTP_OPT_SendObjectInfo - * Send the object information from host to MTP device - * @param pdev: device instance - * @retval None - */ -void USBD_MTP_OPT_SendObjectInfo(USBD_HandleTypeDef *pdev, uint8_t *buff, uint32_t len) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_MTP_ItfTypeDef *hmtpif = (USBD_MTP_ItfTypeDef *)pdev->pUserData[pdev->classId]; - MTP_ObjectInfoTypeDef ObjectInfo; - uint8_t dataLength = offsetof(MTP_ObjectInfoTypeDef, Filename); - uint8_t *tmp; - - switch (hmtp->RECEIVE_DATA_STATUS) - { - case RECEIVE_IDLE_STATE: - hmtp->RECEIVE_DATA_STATUS = RECEIVE_COMMAND_DATA; - break; - - case RECEIVE_COMMAND_DATA: - /* store object handle and storage id for future use */ - if (hmtp->OperationsContainer.Param2 == 0xFFFFFFFFU) - { - objhandle = 0U; - } - else - { - objhandle = hmtp->OperationsContainer.Param2; - } - storage_id = hmtp->OperationsContainer.Param1; - hmtp->RECEIVE_DATA_STATUS = RECEIVE_FIRST_DATA; - break; - - case RECEIVE_FIRST_DATA: - tmp = buff; - - (void)USBD_memcpy(ObjInfo_buff, tmp + 12U, - (uint16_t)(hmtp->MaxPcktLen - MTP_CONT_HEADER_SIZE)); - - hmtp->RECEIVE_DATA_STATUS = RECEIVE_REST_OF_DATA; - break; - - case RECEIVE_REST_OF_DATA: - - (void)USBD_memcpy(ObjInfo_buff + len, buff, hmtp->MaxPcktLen); - - break; - - case SEND_RESPONSE: - (void)USBD_memcpy((uint8_t *)&ObjectInfo, ObjInfo_buff, dataLength); - (void)USBD_memcpy((uint8_t *)&ObjectInfo.Filename, (ObjInfo_buff + dataLength), - ((uint32_t)(ObjectInfo.Filename_len) * 2U)); - - obj_format = ObjectInfo.ObjectFormat; - - hmtp->ResponseCode = hmtpif->Create_NewObject(ObjectInfo, objhandle); - hmtp->GenericContainer.code = (uint16_t)hmtp->ResponseCode; - hmtp->ResponseLength = MTP_CONT_HEADER_SIZE + (sizeof(uint32_t) * 3U); /* Header + 3 Param */ - hmtp->GenericContainer.length = hmtp->ResponseLength; - hmtp->GenericContainer.type = MTP_CONT_TYPE_RESPONSE; - hmtp->GenericContainer.trans_id = hmtp->OperationsContainer.trans_id; - - (void)MTP_Get_PayloadContent(pdev); - - hmtp->RECEIVE_DATA_STATUS = RECEIVE_IDLE_STATE; - break; - - default: - break; - } -} - -/** - * @brief USBD_MTP_OPT_DeleteObject - * Delete the object from the device - * @param pdev: device instance - * @retval None - */ -void USBD_MTP_OPT_DeleteObject(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_MTP_ItfTypeDef *hmtpif = (USBD_MTP_ItfTypeDef *)pdev->pUserData[pdev->classId]; - - hmtp->GenericContainer.trans_id = hmtp->OperationsContainer.trans_id; - hmtp->GenericContainer.type = MTP_CONT_TYPE_RESPONSE; - hmtp->ResponseLength = MTP_CONT_HEADER_SIZE; - hmtp->GenericContainer.length = hmtp->ResponseLength; - hmtp->ResponseCode = hmtpif->DeleteObject(hmtp->OperationsContainer.Param1); -} - -/** - * @brief MTP_Get_PayloadContent - * Get the payload data of generic container - * @param pdev: device instance - * @retval None - */ -static void MTP_Get_PayloadContent(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_MTP_ItfTypeDef *hmtpif = (USBD_MTP_ItfTypeDef *)pdev->pUserData[pdev->classId]; - uint8_t *buffer = hmtp->GenericContainer.data; - uint32_t i; - uint32_t n_idx; - - switch (hmtp->OperationsContainer.code) - { - case MTP_OP_GET_DEVICE_INFO: - (void)MTP_Get_DeviceInfo(); - (void)USBD_memcpy(buffer, (const uint8_t *)&MTP_DeviceInfo, sizeof(MTP_DeviceInfo)); - - for (i = 0U; i < sizeof(MTP_StorageIDS); i++) - { - hmtp->GenericContainer.data[i] = buffer[i]; - } - break; - - case MTP_OP_GET_STORAGE_IDS: - (void)MTP_Get_StorageIDS(); - (void)USBD_memcpy(buffer, (const uint8_t *)&MTP_StorageIDS, sizeof(MTP_StorageIDS)); - - for (i = 0U; i < sizeof(MTP_StorageIDS); i++) - { - hmtp->GenericContainer.data[i] = buffer[i]; - } - break; - - case MTP_OP_GET_STORAGE_INFO: - (void)MTP_Get_StorageInfo(pdev); - (void)USBD_memcpy(buffer, (const uint8_t *)&MTP_StorageInfo, sizeof(MTP_StorageInfo)); - - for (i = 0U; i < sizeof(MTP_StorageInfo); i++) - { - hmtp->GenericContainer.data[i] = buffer[i]; - } - break; - - case MTP_OP_GET_OBJECT_HANDLES: - (void)MTP_Get_ObjectHandle(pdev); - (void)USBD_memcpy(buffer, (const uint8_t *)&MTP_ObjectHandle, hmtp->ResponseLength); - - for (i = 0U; i < hmtp->ResponseLength; i++) - { - hmtp->GenericContainer.data[i] = buffer[i]; - } - break; - - case MTP_OP_GET_OBJECT_INFO: - (void)MTP_Get_ObjectInfo(pdev); - break; - - case MTP_OP_GET_OBJECT_PROPS_SUPPORTED: - (void)MTP_Get_ObjectPropSupp(); - (void)USBD_memcpy(buffer, (const uint8_t *)&MTP_ObjectPropSupp, sizeof(MTP_ObjectPropSupp)); - - for (i = 0U; i < sizeof(MTP_ObjectPropSupp); i++) - { - hmtp->GenericContainer.data[i] = buffer[i]; - } - break; - - case MTP_OP_GET_OBJECT_PROP_DESC: - (void)MTP_Get_ObjectPropDesc(pdev); - hmtp->ResponseLength = MTP_build_data_propdesc(pdev, MTP_ObjectPropDesc); - break; - - case MTP_OP_GET_OBJECT_PROP_REFERENCES: - MTP_Ref.ref_len = 0U; - (void)USBD_memcpy(buffer, (const uint8_t *)&MTP_Ref.ref_len, sizeof(MTP_Ref.ref_len)); - - for (i = 0U; i < sizeof(MTP_Ref.ref_len); i++) - { - hmtp->GenericContainer.data[i] = buffer[i]; - } - break; - - case MTP_OP_GET_OBJECT_PROPLIST: - (void)MTP_Get_ObjectPropList(pdev); - break; - - case MTP_OP_GET_OBJECT_PROP_VALUE: - buffer = MTP_Get_ObjectPropValue(pdev); - for (i = 0U; i < hmtp->ResponseLength; i++) - { - hmtp->GenericContainer.data[i] = buffer[i]; - } - - break; - - case MTP_OP_GET_DEVICE_PROP_DESC: - (void)MTP_Get_DevicePropDesc(); - (void)USBD_memcpy(buffer, (const uint8_t *)&MTP_DevicePropDesc, sizeof(MTP_DevicePropDesc)); - for (i = 0U; i < sizeof(MTP_DevicePropDesc); i++) - { - hmtp->GenericContainer.data[i] = buffer[i]; - } - break; - - case MTP_OP_SEND_OBJECT_INFO: - n_idx = hmtpif->GetNewIndex(obj_format); - (void)USBD_memcpy(hmtp->GenericContainer.data, (const uint8_t *)&storage_id, sizeof(uint32_t)); - (void)USBD_memcpy(hmtp->GenericContainer.data + 4U, (const uint8_t *)&objhandle, sizeof(uint32_t)); - (void)USBD_memcpy(hmtp->GenericContainer.data + 8U, (const uint8_t *)&n_idx, sizeof(uint32_t)); - break; - - case MTP_OP_GET_OBJECT: - break; - - default: - break; - } -} - -/** - * @brief MTP_Get_DeviceInfo - * Fill the MTP_DeviceInfo struct - * @param pdev: device instance - * @retval None - */ -static void MTP_Get_DeviceInfo(void) -{ - MTP_DeviceInfo.StandardVersion = STANDARD_VERSION; - MTP_DeviceInfo.VendorExtensionID = VEND_EXT_ID; - MTP_DeviceInfo.VendorExtensionVersion = VEND_EXT_VERSION; - MTP_DeviceInfo.VendorExtensionDesc_len = (uint8_t)VEND_EXT_DESC_LEN; - uint32_t i; - -#if USBD_MTP_VEND_EXT_DESC_SUPPORTED == 1 - for (i = 0U; i < VEND_EXT_DESC_LEN; i++) - { - MTP_DeviceInfo.VendorExtensionDesc[i] = VendExtDesc[i]; - } -#endif /* USBD_MTP_VEND_EXT_DESC_SUPPORTED */ - - MTP_DeviceInfo.FunctionalMode = FUNCTIONAL_MODE; /* device supports one mode , standard mode */ - - /* All supported operation */ - MTP_DeviceInfo.OperationsSupported_len = SUPP_OP_LEN; - for (i = 0U; i < SUPP_OP_LEN; i++) - { - MTP_DeviceInfo.OperationsSupported[i] = SuppOP[i]; - } - - MTP_DeviceInfo.EventsSupported_len = SUPP_EVENTS_LEN; /* event that are currently generated by the device*/ - -#if USBD_MTP_EVENTS_SUPPORTED == 1 - for (i = 0U; i < SUPP_EVENTS_LEN; i++) - { - MTP_DeviceInfo.EventsSupported[i] = SuppEvents[i]; - } -#endif /* USBD_MTP_EVENTS_SUPPORTED */ - - MTP_DeviceInfo.DevicePropertiesSupported_len = SUPP_DEVICE_PROP_LEN; - -#if USBD_MTP_DEVICE_PROP_SUPPORTED == 1 - for (i = 0U; i < SUPP_DEVICE_PROP_LEN; i++) - { - MTP_DeviceInfo.DevicePropertiesSupported[i] = DevicePropSupp[i]; - } -#endif /* USBD_MTP_DEVICE_PROP_SUPPORTED */ - - MTP_DeviceInfo.CaptureFormats_len = SUPP_CAPT_FORMAT_LEN; - -#if USBD_MTP_CAPTURE_FORMAT_SUPPORTED == 1 - for (i = 0U; i < SUPP_CAPT_FORMAT_LEN; i++) - { - MTP_DeviceInfo.CaptureFormats[i] = SuppCaptFormat[i]; - } -#endif /* USBD_MTP_CAPTURE_FORMAT_SUPPORTED */ - - MTP_DeviceInfo.ImageFormats_len = SUPP_IMG_FORMAT_LEN; /* number of image formats that are supported by the device*/ - for (i = 0U; i < SUPP_IMG_FORMAT_LEN; i++) - { - MTP_DeviceInfo.ImageFormats[i] = SuppImgFormat[i]; - } - - MTP_DeviceInfo.Manufacturer_len = (uint8_t)MANUF_LEN; - for (i = 0U; i < MANUF_LEN; i++) - { - MTP_DeviceInfo.Manufacturer[i] = Manuf[i]; - } - - MTP_DeviceInfo.Model_len = (uint8_t)MODEL_LEN; - for (i = 0U; i < MODEL_LEN; i++) - { - MTP_DeviceInfo.Model[i] = Model[i]; - } - - MTP_DeviceInfo.DeviceVersion_len = (uint8_t)DEVICE_VERSION_LEN; - for (i = 0U; i < DEVICE_VERSION_LEN; i++) - { - MTP_DeviceInfo.DeviceVersion[i] = DeviceVers[i]; - } - - MTP_DeviceInfo.SerialNumber_len = (uint8_t)SERIAL_NBR_LEN; - for (i = 0U; i < SERIAL_NBR_LEN; i++) - { - MTP_DeviceInfo.SerialNumber[i] = SerialNbr[i]; - } -} - -/** - * @brief MTP_Get_StorageInfo - * Fill the MTP_StorageInfo struct - * @param pdev: device instance - * @retval None - */ -static void MTP_Get_StorageInfo(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_ItfTypeDef *hmtpif = (USBD_MTP_ItfTypeDef *)pdev->pUserData[pdev->classId]; - - MTP_StorageInfo.StorageType = MTP_STORAGE_REMOVABLE_RAM; - MTP_StorageInfo.FilesystemType = MTP_FILESYSTEM_GENERIC_FLAT; - MTP_StorageInfo.AccessCapability = MTP_ACCESS_CAP_RW; - MTP_StorageInfo.MaxCapability = hmtpif->GetMaxCapability(); - MTP_StorageInfo.FreeSpaceInBytes = hmtpif->GetFreeSpaceInBytes(); - MTP_StorageInfo.FreeSpaceInObjects = FREE_SPACE_IN_OBJ_NOT_USED; /* not used */ - MTP_StorageInfo.StorageDescription = 0U; - MTP_StorageInfo.VolumeLabel = 0U; -} - -/** - * @brief MTP_Get_ObjectHandle - * Fill the MTP_ObjectHandle struct - * @param pdev: device instance - * @retval None - */ -static void MTP_Get_ObjectHandle(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_MTP_ItfTypeDef *hmtpif = (USBD_MTP_ItfTypeDef *)pdev->pUserData[pdev->classId]; - - MTP_ObjectHandle.ObjectHandle_len = (uint32_t)(hmtpif->GetIdx(hmtp->OperationsContainer.Param3, - MTP_ObjectHandle.ObjectHandle)); - - hmtp->ResponseLength = (MTP_ObjectHandle.ObjectHandle_len * sizeof(uint32_t)) + sizeof(uint32_t); -} - -/** - * @brief MTP_Get_ObjectPropSupp - * Fill the MTP_ObjectPropSupp struct - * @param pdev: device instance - * @retval None - */ -static void MTP_Get_ObjectPropSupp(void) -{ - uint32_t i; - - MTP_ObjectPropSupp.ObjectPropSupp_len = SUPP_OBJ_PROP_LEN; - - for (i = 0U; i < SUPP_OBJ_PROP_LEN; i++) - { - MTP_ObjectPropSupp.ObjectPropSupp[i] = ObjectPropSupp[i]; - } -} - -/** - * @brief MTP_Get_ObjectPropDesc - * Fill the MTP_ObjectPropDesc struct - * @param pdev: device instance - * @retval None - */ -static void MTP_Get_ObjectPropDesc(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint16_t undef_format = MTP_OBJ_FORMAT_UNDEFINED; - uint32_t storageid = MTP_STORAGE_ID; - - switch (hmtp->OperationsContainer.Param1) /* switch obj prop code */ - { - case MTP_OB_PROP_OBJECT_FORMAT : - MTP_ObjectPropDesc.ObjectPropertyCode = (uint16_t)(hmtp->OperationsContainer.Param1); - MTP_ObjectPropDesc.DataType = MTP_DATATYPE_UINT16; - MTP_ObjectPropDesc.GetSet = MTP_PROP_GET; - MTP_ObjectPropDesc.DefValue = (uint8_t *)&undef_format; - MTP_ObjectPropDesc.GroupCode = 0U; - MTP_ObjectPropDesc.FormFlag = 0U; - break; - - case MTP_OB_PROP_STORAGE_ID : - MTP_ObjectPropDesc.ObjectPropertyCode = (uint16_t)(hmtp->OperationsContainer.Param1); - MTP_ObjectPropDesc.DataType = MTP_DATATYPE_UINT32; - MTP_ObjectPropDesc.GetSet = MTP_PROP_GET; - MTP_ObjectPropDesc.DefValue = (uint8_t *)&storageid; - MTP_ObjectPropDesc.GroupCode = 0U; - MTP_ObjectPropDesc.FormFlag = 0U; - break; - - case MTP_OB_PROP_OBJ_FILE_NAME : - MTP_ObjectPropDesc.ObjectPropertyCode = (uint16_t)(hmtp->OperationsContainer.Param1); - MTP_ObjectPropDesc.DataType = MTP_DATATYPE_STR; - MTP_ObjectPropDesc.GetSet = MTP_PROP_GET; - MTP_FileName.FileName_len = DEFAULT_FILE_NAME_LEN; - (void)USBD_memcpy((void *) & (MTP_FileName.FileName), (const void *)DefaultFileName, sizeof(DefaultFileName)); - MTP_ObjectPropDesc.DefValue = (uint8_t *)&MTP_FileName; - MTP_ObjectPropDesc.GroupCode = 0U; - MTP_ObjectPropDesc.FormFlag = 0U; - break; - - case MTP_OB_PROP_PARENT_OBJECT : - MTP_ObjectPropDesc.ObjectPropertyCode = (uint16_t)(hmtp->OperationsContainer.Param1); - MTP_ObjectPropDesc.DataType = MTP_DATATYPE_STR; - MTP_ObjectPropDesc.GetSet = MTP_PROP_GET; - MTP_ObjectPropDesc.DefValue = 0U; - MTP_ObjectPropDesc.GroupCode = 0U; - MTP_ObjectPropDesc.FormFlag = 0U; - break; - - case MTP_OB_PROP_OBJECT_SIZE : - MTP_ObjectPropDesc.ObjectPropertyCode = (uint16_t)(hmtp->OperationsContainer.Param1); - MTP_ObjectPropDesc.DataType = MTP_DATATYPE_UINT64; - MTP_ObjectPropDesc.GetSet = MTP_PROP_GET; - MTP_ObjectPropDesc.DefValue = 0U; - MTP_ObjectPropDesc.GroupCode = 0U; - MTP_ObjectPropDesc.FormFlag = 0U; - break; - - case MTP_OB_PROP_NAME : - MTP_ObjectPropDesc.ObjectPropertyCode = (uint16_t)(hmtp->OperationsContainer.Param1); - MTP_ObjectPropDesc.DataType = MTP_DATATYPE_STR; - MTP_ObjectPropDesc.GetSet = MTP_PROP_GET; - MTP_FileName.FileName_len = DEFAULT_FILE_NAME_LEN; - (void)USBD_memcpy((void *) & (MTP_FileName.FileName), - (const void *)DefaultFileName, sizeof(DefaultFileName)); - - MTP_ObjectPropDesc.DefValue = (uint8_t *)&MTP_FileName; - MTP_ObjectPropDesc.GroupCode = 0U; - MTP_ObjectPropDesc.FormFlag = 0U; - break; - - case MTP_OB_PROP_PERS_UNIQ_OBJ_IDEN : - MTP_ObjectPropDesc.ObjectPropertyCode = (uint16_t)(hmtp->OperationsContainer.Param1); - MTP_ObjectPropDesc.DataType = MTP_DATATYPE_UINT128; - MTP_ObjectPropDesc.GetSet = MTP_PROP_GET; - MTP_ObjectPropDesc.DefValue = 0U; - MTP_ObjectPropDesc.GroupCode = 0U; - MTP_ObjectPropDesc.FormFlag = 0U; - break; - - case MTP_OB_PROP_PROTECTION_STATUS : - MTP_ObjectPropDesc.ObjectPropertyCode = (uint16_t)(hmtp->OperationsContainer.Param1); - MTP_ObjectPropDesc.DataType = MTP_DATATYPE_UINT16; - MTP_ObjectPropDesc.GetSet = MTP_PROP_GET_SET; - MTP_ObjectPropDesc.DefValue = 0U; - MTP_ObjectPropDesc.GroupCode = 0U; - MTP_ObjectPropDesc.FormFlag = 0U; - break; - - default: - break; - } -} - -/** - * @brief MTP_Get_ObjectPropValue - * Get the property value - * @param pdev: device instance - * @retval None - */ -static uint8_t *MTP_Get_ObjectPropValue(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_MTP_ItfTypeDef *hmtpif = (USBD_MTP_ItfTypeDef *)pdev->pUserData[pdev->classId]; - static uint8_t buf[512]; - - /* Add all other supported object properties */ - switch (hmtp->OperationsContainer.Param2) - { - case MTP_OB_PROP_STORAGE_ID: - MTP_PropertyValue.u32 = MTP_STORAGE_ID; - (void)USBD_memcpy(buf, (const uint8_t *)&MTP_PropertyValue, sizeof(uint32_t)); - hmtp->ResponseLength = sizeof(uint32_t); - break; - - case MTP_OB_PROP_OBJECT_FORMAT: - MTP_PropertyValue.u16 = hmtpif->GetObjectFormat(hmtp->OperationsContainer.Param1); - (void)USBD_memcpy(buf, (const uint8_t *)&MTP_PropertyValue, sizeof(uint16_t)); - hmtp->ResponseLength = sizeof(uint16_t); - break; - - case MTP_OB_PROP_OBJ_FILE_NAME: - MTP_FileName.FileName_len = hmtpif->GetObjectName_len(hmtp->OperationsContainer.Param1); - hmtpif->GetObjectName(hmtp->OperationsContainer.Param1, MTP_FileName.FileName_len, (uint16_t *)buf); - (void)USBD_memcpy(MTP_FileName.FileName, (uint16_t *)buf, ((uint32_t)MTP_FileName.FileName_len * 2U) + 1U); - - hmtp->ResponseLength = ((uint32_t)MTP_FileName.FileName_len * 2U) + 1U; - break; - - case MTP_OB_PROP_PARENT_OBJECT : - MTP_PropertyValue.u32 = hmtpif->GetParentObject(hmtp->OperationsContainer.Param1); - (void)USBD_memcpy(buf, (const uint8_t *)&MTP_PropertyValue, sizeof(uint32_t)); - hmtp->ResponseLength = sizeof(uint32_t); - break; - - case MTP_OB_PROP_OBJECT_SIZE : - MTP_PropertyValue.u64 = hmtpif->GetObjectSize(hmtp->OperationsContainer.Param1); - (void)USBD_memcpy(buf, (const uint8_t *)&MTP_PropertyValue, sizeof(uint64_t)); - hmtp->ResponseLength = sizeof(uint64_t); - break; - - default: - break; - } - - return buf; -} - -/** - * @brief MTP_Get_ObjectPropList - * Get the object property list data to be transmitted - * @param pdev: device instance - * @retval None - */ -static void MTP_Get_ObjectPropList(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_MTP_ItfTypeDef *hmtpif = (USBD_MTP_ItfTypeDef *)pdev->pUserData[pdev->classId]; - uint16_t filename[255]; - uint32_t storageid = MTP_STORAGE_ID; - uint32_t default_val = 0U; - uint32_t i; - uint16_t format; - uint64_t objsize; - uint32_t parent_proval; - - MTP_PropertiesList.MTP_Properties_len = SUPP_OBJ_PROP_LEN; - hmtp->ResponseLength = 4U; /* size of MTP_PropertiesList.MTP_Properties_len */ - (void)USBD_memcpy(hmtp->GenericContainer.data, - (const uint8_t *)&MTP_PropertiesList.MTP_Properties_len, hmtp->ResponseLength); - - for (i = 0U; i < SUPP_OBJ_PROP_LEN; i++) - { - MTP_PropertiesList.MTP_Properties[i].ObjectHandle = hmtp->OperationsContainer.Param1; - - switch (ObjectPropSupp[i]) - { - case MTP_OB_PROP_STORAGE_ID : - MTP_PropertiesList.MTP_Properties[i].PropertyCode = MTP_OB_PROP_STORAGE_ID; - MTP_PropertiesList.MTP_Properties[i].Datatype = MTP_DATATYPE_UINT32; - MTP_PropertiesList.MTP_Properties[i].propval = (uint8_t *)&storageid; - break; - - case MTP_OB_PROP_OBJECT_FORMAT : - MTP_PropertiesList.MTP_Properties[i].PropertyCode = MTP_OB_PROP_OBJECT_FORMAT; - MTP_PropertiesList.MTP_Properties[i].Datatype = MTP_DATATYPE_UINT16; - format = hmtpif->GetObjectFormat(hmtp->OperationsContainer.Param1); - MTP_PropertiesList.MTP_Properties[i].propval = (uint8_t *)&format; - break; - - case MTP_OB_PROP_OBJ_FILE_NAME: - MTP_PropertiesList.MTP_Properties[i].PropertyCode = MTP_OB_PROP_OBJ_FILE_NAME; - MTP_PropertiesList.MTP_Properties[i].Datatype = MTP_DATATYPE_STR; - /* MTP_FileName.FileName_len value shall be set before USBD_MTP_FS_GetObjectName */ - MTP_FileName.FileName_len = hmtpif->GetObjectName_len(hmtp->OperationsContainer.Param1); - hmtpif->GetObjectName(hmtp->OperationsContainer.Param1, MTP_FileName.FileName_len, filename); - (void)USBD_memcpy(MTP_FileName.FileName, filename, ((uint32_t)MTP_FileName.FileName_len * 2U) + 1U); - MTP_PropertiesList.MTP_Properties[i].propval = (uint8_t *)&MTP_FileName; - break; - - case MTP_OB_PROP_PARENT_OBJECT : - MTP_PropertiesList.MTP_Properties[i].PropertyCode = MTP_OB_PROP_PARENT_OBJECT; - MTP_PropertiesList.MTP_Properties[i].Datatype = MTP_DATATYPE_UINT32; - parent_proval = hmtpif->GetParentObject(hmtp->OperationsContainer.Param1); - MTP_PropertiesList.MTP_Properties[i].propval = (uint8_t *)&parent_proval; - break; - - case MTP_OB_PROP_OBJECT_SIZE : - MTP_PropertiesList.MTP_Properties[i].PropertyCode = MTP_OB_PROP_OBJECT_SIZE; - MTP_PropertiesList.MTP_Properties[i].Datatype = MTP_DATATYPE_UINT64; - objsize = hmtpif->GetObjectSize(hmtp->OperationsContainer.Param1); - MTP_PropertiesList.MTP_Properties[i].propval = (uint8_t *)&objsize; - break; - - case MTP_OB_PROP_NAME : - MTP_PropertiesList.MTP_Properties[i].PropertyCode = MTP_OB_PROP_NAME; - MTP_PropertiesList.MTP_Properties[i].Datatype = MTP_DATATYPE_STR; - /* MTP_FileName.FileName_len value shall be set before USBD_MTP_FS_GetObjectName */ - MTP_FileName.FileName_len = hmtpif->GetObjectName_len(hmtp->OperationsContainer.Param1); - hmtpif->GetObjectName(hmtp->OperationsContainer.Param1, MTP_FileName.FileName_len, filename); - (void)USBD_memcpy(MTP_FileName.FileName, filename, ((uint32_t)MTP_FileName.FileName_len * 2U) + 1U); - MTP_PropertiesList.MTP_Properties[i].propval = (uint8_t *)&MTP_FileName; - break; - - case MTP_OB_PROP_PERS_UNIQ_OBJ_IDEN : - MTP_PropertiesList.MTP_Properties[i].PropertyCode = MTP_OB_PROP_PERS_UNIQ_OBJ_IDEN; - MTP_PropertiesList.MTP_Properties[i].Datatype = MTP_DATATYPE_UINT128; - MTP_PropertiesList.MTP_Properties[i].propval = (uint8_t *)&hmtp->OperationsContainer.Param1; - break; - - case MTP_OB_PROP_PROTECTION_STATUS : - MTP_PropertiesList.MTP_Properties[i].PropertyCode = MTP_OB_PROP_PROTECTION_STATUS; - MTP_PropertiesList.MTP_Properties[i].Datatype = MTP_DATATYPE_UINT16; - MTP_PropertiesList.MTP_Properties[i].propval = (uint8_t *)&default_val; - break; - - default: - break; - } - - hmtp->ResponseLength = MTP_build_data_proplist(pdev, MTP_PropertiesList, i); - } -} - -/** - * @brief MTP_Get_DevicePropDesc - * Fill the MTP_DevicePropDesc struct - * @param pdev: device instance - * @retval None - */ -static void MTP_Get_DevicePropDesc(void) -{ - MTP_DevicePropDesc.DevicePropertyCode = MTP_DEV_PROP_DEVICE_FRIENDLY_NAME; - MTP_DevicePropDesc.DataType = MTP_DATATYPE_STR; - MTP_DevicePropDesc.GetSet = MTP_PROP_GET_SET; - MTP_DevicePropDesc.DefValue_len = DEVICE_PROP_DESC_DEF_LEN; - uint32_t i; - - for (i = 0U; i < (sizeof(DevicePropDefVal) / 2U); i++) - { - MTP_DevicePropDesc.DefValue[i] = DevicePropDefVal[i]; - } - - MTP_DevicePropDesc.curDefValue_len = DEVICE_PROP_DESC_CUR_LEN; - - for (i = 0U; i < (sizeof(DevicePropCurDefVal) / 2U); i++) - { - MTP_DevicePropDesc.curDefValue[i] = DevicePropCurDefVal[i]; - } - - MTP_DevicePropDesc.FormFlag = 0U; -} - -/** - * @brief MTP_Get_ObjectInfo - * Fill the MTP_ObjectInfo struct - * @param pdev: device instance - * @retval None - */ -static void MTP_Get_ObjectInfo(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_ItfTypeDef *hmtpif = (USBD_MTP_ItfTypeDef *)pdev->pUserData[pdev->classId]; - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint16_t filename[255]; - - MTP_ObjectInfo.Storage_id = MTP_STORAGE_ID; - MTP_ObjectInfo.ObjectFormat = hmtpif->GetObjectFormat(hmtp->OperationsContainer.Param1); - MTP_ObjectInfo.ObjectCompressedSize = hmtpif->GetObjectSize(hmtp->OperationsContainer.Param1); - MTP_ObjectInfo.ProtectionStatus = 0U; - MTP_ObjectInfo.ThumbFormat = MTP_OBJ_FORMAT_UNDEFINED; - MTP_ObjectInfo.ThumbCompressedSize = 0U; - MTP_ObjectInfo.ThumbPixWidth = 0U; /* not supported or not an image */ - MTP_ObjectInfo.ThumbPixHeight = 0U; - MTP_ObjectInfo.ImagePixWidth = 0U; - MTP_ObjectInfo.ImagePixHeight = 0U; - MTP_ObjectInfo.ImageBitDepth = 0U; - MTP_ObjectInfo.ParentObject = hmtpif->GetParentObject(hmtp->OperationsContainer.Param1); - MTP_ObjectInfo.AssociationType = 0U; - MTP_ObjectInfo.AssociationDesc = 0U; - MTP_ObjectInfo.SequenceNumber = 0U; - - /* we have to get this value before MTP_ObjectInfo.Filename */ - MTP_ObjectInfo.Filename_len = hmtpif->GetObjectName_len(hmtp->OperationsContainer.Param1); - hmtpif->GetObjectName(hmtp->OperationsContainer.Param1, MTP_ObjectInfo.Filename_len, filename); - (void)USBD_memcpy(MTP_ObjectInfo.Filename, filename, ((uint32_t)MTP_FileName.FileName_len * 2U) + 1U); - - MTP_ObjectInfo.CaptureDate = 0U; - MTP_ObjectInfo.ModificationDate = 0U; - MTP_ObjectInfo.Keywords = 0U; - hmtp->ResponseLength = MTP_build_data_ObjInfo(pdev, MTP_ObjectInfo); -} - -/** - * @brief MTP_Get_StorageIDS - * Fill the MTP_StorageIDS struct - * @param pdev: device instance - * @retval None - */ -static void MTP_Get_StorageIDS(void) -{ - MTP_StorageIDS.StorageIDS_len = MTP_NBR_STORAGE_ID; - MTP_StorageIDS.StorageIDS[0] = MTP_STORAGE_ID; -} - -/** - * @brief MTP_build_data_propdesc - * Copy the MTP_ObjectPropDesc dataset to the payload data - * @param pdev: device instance - * @retval None - */ -static uint32_t MTP_build_data_propdesc(USBD_HandleTypeDef *pdev, MTP_ObjectPropDescTypeDef def) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint8_t DefValue_size = (MTP_FileName.FileName_len * 2U) + 1U; - uint32_t dataLength = offsetof(MTP_ObjectPropDescTypeDef, DefValue); - - (void)USBD_memcpy(hmtp->GenericContainer.data, (const uint8_t *)&def, dataLength); - - switch (def.DataType) - { - case MTP_DATATYPE_UINT16: - (void)USBD_memcpy(hmtp->GenericContainer.data + dataLength, def.DefValue, sizeof(uint16_t)); - dataLength += sizeof(uint16_t); - break; - - case MTP_DATATYPE_UINT32: - (void)USBD_memcpy(hmtp->GenericContainer.data + dataLength, def.DefValue, sizeof(uint32_t)); - dataLength += sizeof(uint32_t); - break; - - case MTP_DATATYPE_UINT64: - (void)USBD_memcpy(hmtp->GenericContainer.data + dataLength, def.DefValue, sizeof(uint64_t)); - dataLength += sizeof(uint64_t); - break; - - case MTP_DATATYPE_STR: - (void)USBD_memcpy(hmtp->GenericContainer.data + dataLength, def.DefValue, DefValue_size); - dataLength += DefValue_size; - break; - - case MTP_DATATYPE_UINT128: - (void)USBD_memcpy(hmtp->GenericContainer.data + dataLength, def.DefValue, (sizeof(uint64_t) * 2U)); - dataLength += (sizeof(uint64_t) * 2U); - break; - - default: - break; - } - - (void)USBD_memcpy(hmtp->GenericContainer.data + dataLength, - (const uint8_t *)&MTP_ObjectPropDesc.GroupCode, sizeof(MTP_ObjectPropDesc.GroupCode)); - - dataLength += sizeof(MTP_ObjectPropDesc.GroupCode); - - (void)USBD_memcpy(hmtp->GenericContainer.data + dataLength, - (const uint8_t *)&MTP_ObjectPropDesc.FormFlag, sizeof(MTP_ObjectPropDesc.FormFlag)); - - dataLength += sizeof(MTP_ObjectPropDesc.FormFlag); - - return dataLength; -} - -/** - * @brief MTP_build_data_proplist - * Copy the MTP_PropertiesList dataset to the payload data - * @param pdev: device instance - * @retval None - */ -static uint32_t MTP_build_data_proplist(USBD_HandleTypeDef *pdev, - MTP_PropertiesListTypedef proplist, uint32_t idx) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint8_t propval_size = (MTP_FileName.FileName_len * 2U) + 1U; - uint32_t dataLength; - - dataLength = offsetof(MTP_PropertiesTypedef, propval); - - (void)USBD_memcpy(hmtp->GenericContainer.data + hmtp->ResponseLength, - (const uint8_t *)&proplist.MTP_Properties[idx], dataLength); - - dataLength += hmtp->ResponseLength; - - switch (proplist.MTP_Properties[idx].Datatype) - { - case MTP_DATATYPE_UINT16: - (void)USBD_memcpy(hmtp->GenericContainer.data + dataLength, - proplist.MTP_Properties[idx].propval, sizeof(uint16_t)); - - dataLength += sizeof(uint16_t); - break; - - case MTP_DATATYPE_UINT32: - (void)USBD_memcpy(hmtp->GenericContainer.data + dataLength, - proplist.MTP_Properties[idx].propval, sizeof(uint32_t)); - - dataLength += sizeof(uint32_t); - break; - - case MTP_DATATYPE_STR: - (void)USBD_memcpy(hmtp->GenericContainer.data + dataLength, - proplist.MTP_Properties[idx].propval, propval_size); - - dataLength += propval_size; - break; - - case MTP_DATATYPE_UINT64: - (void)USBD_memcpy(hmtp->GenericContainer.data + dataLength, - proplist.MTP_Properties[idx].propval, sizeof(uint64_t)); - - dataLength += sizeof(uint64_t); - break; - - case MTP_DATATYPE_UINT128: - (void)USBD_memcpy(hmtp->GenericContainer.data + dataLength, - proplist.MTP_Properties[idx].propval, (sizeof(uint64_t) * 2U)); - - dataLength += (sizeof(uint64_t) * 2U); - break; - - default: - break; - } - - return dataLength; -} - -/** - * @brief MTP_build_data_ObjInfo - * Copy the MTP_ObjectInfo dataset to the payload data - * @param pdev: device instance - * @retval None - */ -static uint32_t MTP_build_data_ObjInfo(USBD_HandleTypeDef *pdev, MTP_ObjectInfoTypeDef objinfo) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint32_t ObjInfo_len = offsetof(MTP_ObjectInfoTypeDef, Filename); - - (void)USBD_memcpy(hmtp->GenericContainer.data, (const uint8_t *)&objinfo, ObjInfo_len); - (void)USBD_memcpy(hmtp->GenericContainer.data + ObjInfo_len, - (const uint8_t *)&objinfo.Filename, objinfo.Filename_len * sizeof(uint16_t)); - - ObjInfo_len = ObjInfo_len + (objinfo.Filename_len * sizeof(uint16_t)); - - (void)USBD_memcpy(hmtp->GenericContainer.data + ObjInfo_len, - (const uint8_t *)&objinfo.CaptureDate, sizeof(objinfo.CaptureDate)); - - ObjInfo_len = ObjInfo_len + sizeof(objinfo.CaptureDate); - - return ObjInfo_len; -} diff --git a/Class/MTP/Src/usbd_mtp_storage.c b/Class/MTP/Src/usbd_mtp_storage.c deleted file mode 100644 index ca35354..0000000 --- a/Class/MTP/Src/usbd_mtp_storage.c +++ /dev/null @@ -1,489 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_mtp_storage.c - * @author MCD Application Team - * @brief This file provides all the transfer command functions for MTP - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_mtp_storage.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -extern uint8_t MTPInEpAdd; -extern uint8_t MTPOutEpAdd; - -/* Private variables ---------------------------------------------------------*/ -static MTP_DataLengthTypeDef MTP_DataLength; -static MTP_READ_DATA_STATUS ReadDataStatus; - -/* Private function prototypes -----------------------------------------------*/ -static uint8_t USBD_MTP_STORAGE_DecodeOperations(USBD_HandleTypeDef *pdev); -static uint8_t USBD_MTP_STORAGE_ReceiveContainer(USBD_HandleTypeDef *pdev, uint32_t *pDst, uint32_t len); -static uint8_t USBD_MTP_STORAGE_SendData(USBD_HandleTypeDef *pdev, uint8_t *buf, uint32_t len); - -/* Private functions ---------------------------------------------------------*/ -/** - * @} - */ - -/** - * @brief USBD_MTP_STORAGE_Init - * Initialize the MTP USB Layer - * @param pdev: device instance - * @retval status value - */ -uint8_t USBD_MTP_STORAGE_Init(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - MTPOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Initialize the HW layyer of the file system */ - (void)((USBD_MTP_ItfTypeDef *)pdev->pUserData[pdev->classId])->Init(); - - /* Prepare EP to Receive First Operation */ - (void)USBD_LL_PrepareReceive(pdev, MTPOutEpAdd, (uint8_t *)&hmtp->rx_buff, - hmtp->MaxPcktLen); - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_MTP_STORAGE_DeInit - * Uninitialize the MTP Machine - * @param pdev: device instance - * @retval status value - */ -uint8_t USBD_MTP_STORAGE_DeInit(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - /* DeInit physical Interface components */ - hmtp->MTP_SessionState = MTP_SESSION_NOT_OPENED; - - /* Stop low layer file system operations if any */ - USBD_MTP_STORAGE_Cancel(pdev, MTP_PHASE_IDLE); - - /* Free low layer file system resources */ - (void)((USBD_MTP_ItfTypeDef *)pdev->pUserData[pdev->classId])->DeInit(); - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_MTP_STORAGE_ReadData - * Read data from device objects and send it to the host - * @param pdev: device instance - * @retval status value - */ -uint8_t USBD_MTP_STORAGE_ReadData(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint32_t *data_buff; - uint32_t buffer_size; - - /* Get the data buffer pointer from the low layer interface */ - data_buff = ((USBD_MTP_ItfTypeDef *)pdev->pUserData[pdev->classId])->ScratchBuff; - - /* Get Data Buffer Size */ - buffer_size = ((USBD_MTP_ItfTypeDef *)pdev->pUserData[pdev->classId])->ScratchBuffSze; - - if ((data_buff == NULL) || (buffer_size < MTP_CONT_HEADER_SIZE)) - { - return (uint8_t)USBD_FAIL; - } - - switch (ReadDataStatus) - { - case READ_FIRST_DATA: - /* Reset the data length */ - MTP_DataLength.temp_length = 0U; - - /* Add the container header to the data buffer */ - (void)USBD_memcpy((uint8_t *)data_buff, (uint8_t *)&hmtp->GenericContainer, MTP_CONT_HEADER_SIZE); - - /* Perform the low layer read operation on the scratch buffer - * first packet expected data length: MPS - MTP_CONT_HEADER_SIZE - */ - (void)((USBD_MTP_ItfTypeDef *)pdev->pUserData[pdev->classId])->ReadData(hmtp->OperationsContainer.Param1, - (uint8_t *)data_buff + - MTP_CONT_HEADER_SIZE, &MTP_DataLength); - - /* Start USB data transmission to the host */ - (void)USBD_MTP_STORAGE_SendData(pdev, (uint8_t *)data_buff, - MIN((MTP_DataLength.readbytes + MTP_CONT_HEADER_SIZE), buffer_size)); - - /* Check if this will be the last packet to send ? */ - if (MTP_DataLength.readbytes < ((uint32_t)hmtp->MaxPcktLen - MTP_CONT_HEADER_SIZE)) - { - /* Move to response phase */ - hmtp->MTP_ResponsePhase = MTP_RESPONSE_PHASE; - } - else - { - /* Continue to the next packets sending */ - ReadDataStatus = READ_REST_OF_DATA; - } - break; - - case READ_REST_OF_DATA: - /* Perform the low layer read operation on the scratch buffer */ - (void)((USBD_MTP_ItfTypeDef *)pdev->pUserData[pdev->classId])->ReadData(hmtp->OperationsContainer.Param1, - (uint8_t *)data_buff, &MTP_DataLength); - - /* Check if more data need to be sent */ - if (MTP_DataLength.temp_length == MTP_DataLength.totallen) - { - /* Start USB data transmission to the host */ - (void)USBD_MTP_STORAGE_SendData(pdev, (uint8_t *)data_buff, MIN(MTP_DataLength.readbytes, buffer_size)); - - /* Move to response phase */ - hmtp->MTP_ResponsePhase = MTP_RESPONSE_PHASE; - - /* Reset the state machine */ - ReadDataStatus = READ_FIRST_DATA; - } - else - { - /* Start USB data transmission to the host */ - (void)USBD_MTP_STORAGE_SendData(pdev, (uint8_t *)data_buff, MIN(MTP_DataLength.readbytes, buffer_size)); - - /* Keep the state machine into sending next packet of data */ - ReadDataStatus = READ_REST_OF_DATA; - } - break; - - default: - break; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_MTP_STORAGE_SendContainer - * Send generic container to the host - * @param pdev: device instance - * @retval status value - */ -uint8_t USBD_MTP_STORAGE_SendContainer(USBD_HandleTypeDef *pdev, MTP_CONTAINER_TYPE CONT_TYPE) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - switch (CONT_TYPE) - { - case DATA_TYPE: - /* send header + data : hmtp->ResponseLength = header size + data size */ - (void)USBD_MTP_STORAGE_SendData(pdev, (uint8_t *)&hmtp->GenericContainer, MIN(sizeof(MTP_GenericContainerTypeDef), - hmtp->ResponseLength)); - break; - case REP_TYPE: - /* send header without data */ - hmtp->GenericContainer.code = (uint16_t)hmtp->ResponseCode; - hmtp->ResponseLength = MTP_CONT_HEADER_SIZE; - hmtp->GenericContainer.length = hmtp->ResponseLength; - hmtp->GenericContainer.type = MTP_CONT_TYPE_RESPONSE; - - (void)USBD_MTP_STORAGE_SendData(pdev, (uint8_t *)&hmtp->GenericContainer, MIN(sizeof(MTP_GenericContainerTypeDef), - hmtp->ResponseLength)); - break; - default: - break; - } - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_MTP_STORAGE_ReceiveOpt - * Data length Packet Received from host - * @param pdev: device instance - * @retval status value - */ -uint8_t USBD_MTP_STORAGE_ReceiveOpt(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint32_t *pMsgBuffer; -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - MTPOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - MTP_DataLength.rx_length = USBD_GetRxCount(pdev, MTPOutEpAdd); - - switch (hmtp->RECEIVE_DATA_STATUS) - { - case RECEIVE_REST_OF_DATA: - /* we don't need to do anything here because we receive only data without operation header*/ - break; - - case RECEIVE_FIRST_DATA: - /* Expected Data Length Packet Received */ - pMsgBuffer = (uint32_t *) &hmtp->OperationsContainer; - - /* Fill hmtp->OperationsContainer Data Buffer from USB Buffer */ - (void)USBD_MTP_STORAGE_ReceiveContainer(pdev, pMsgBuffer, MTP_DataLength.rx_length); - break; - - default: - /* Expected Data Length Packet Received */ - pMsgBuffer = (uint32_t *) &hmtp->OperationsContainer; - - /* Fill hmtp->OperationsContainer Data Buffer from USB Buffer */ - (void)USBD_MTP_STORAGE_ReceiveContainer(pdev, pMsgBuffer, MTP_DataLength.rx_length); - (void)USBD_MTP_STORAGE_DecodeOperations(pdev); - break; - - } - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_MTP_STORAGE_ReceiveData - * Receive objects or object info from host - * @param pdev: device instance - * @retval status value - */ -uint8_t USBD_MTP_STORAGE_ReceiveData(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - switch (hmtp->RECEIVE_DATA_STATUS) - { - case RECEIVE_COMMAND_DATA : - if (hmtp->OperationsContainer.type == MTP_CONT_TYPE_COMMAND) - { - MTP_DataLength.temp_length = 0; - MTP_DataLength.prv_len = 0; - (void)USBD_MTP_STORAGE_DecodeOperations(pdev); - - } - break; - - case RECEIVE_FIRST_DATA : - if (hmtp->OperationsContainer.type == MTP_CONT_TYPE_DATA) - { - MTP_DataLength.totallen = hmtp->OperationsContainer.length; - MTP_DataLength.temp_length = MTP_DataLength.rx_length; - MTP_DataLength.rx_length = MTP_DataLength.temp_length - MTP_CONT_HEADER_SIZE; - (void)USBD_MTP_STORAGE_DecodeOperations(pdev); - - if (MTP_DataLength.temp_length < hmtp->MaxPcktLen) /* we received all data, we don't need to go to next state */ - { - hmtp->RECEIVE_DATA_STATUS = SEND_RESPONSE; - (void)USBD_MTP_STORAGE_DecodeOperations(pdev); - - /* send response header after receiving all data successfully */ - (void)USBD_MTP_STORAGE_SendContainer(pdev, DATA_TYPE); - } - } - - break; - - case RECEIVE_REST_OF_DATA : - MTP_DataLength.prv_len = MTP_DataLength.temp_length - MTP_CONT_HEADER_SIZE; - (void)USBD_MTP_STORAGE_DecodeOperations(pdev); - MTP_DataLength.temp_length = MTP_DataLength.temp_length + MTP_DataLength.rx_length; - - if (MTP_DataLength.temp_length == MTP_DataLength.totallen) /* we received all data*/ - { - hmtp->RECEIVE_DATA_STATUS = SEND_RESPONSE; - (void)USBD_MTP_STORAGE_DecodeOperations(pdev); - - /* send response header after receiving all data successfully */ - (void)USBD_MTP_STORAGE_SendContainer(pdev, DATA_TYPE); - } - break; - - default : - break; - } - - return (uint8_t)USBD_OK; -} - - -/** - * @brief USBD_MTP_STORAGE_DecodeOperations - * Parse the operations and Process operations - * @param pdev: device instance - * @retval status value - */ -static uint8_t USBD_MTP_STORAGE_DecodeOperations(USBD_HandleTypeDef *pdev) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - switch (hmtp->OperationsContainer.code) - { - case MTP_OP_GET_DEVICE_INFO: - USBD_MTP_OPT_GetDeviceInfo(pdev); - hmtp->MTP_ResponsePhase = MTP_RESPONSE_PHASE; - break; - - case MTP_OP_OPEN_SESSION: - USBD_MTP_OPT_CreateObjectHandle(pdev); - hmtp->MTP_ResponsePhase = MTP_RESPONSE_PHASE; - break; - - case MTP_OP_GET_STORAGE_IDS: - USBD_MTP_OPT_GetStorageIDS(pdev); - hmtp->MTP_ResponsePhase = MTP_RESPONSE_PHASE; - break; - - case MTP_OP_GET_STORAGE_INFO: - USBD_MTP_OPT_GetStorageInfo(pdev); - hmtp->MTP_ResponsePhase = MTP_RESPONSE_PHASE; - break; - - case MTP_OP_GET_OBJECT_HANDLES: - USBD_MTP_OPT_GetObjectHandle(pdev); - hmtp->MTP_ResponsePhase = MTP_RESPONSE_PHASE; - break; - - case MTP_OP_GET_OBJECT_INFO: - USBD_MTP_OPT_GetObjectInfo(pdev); - hmtp->MTP_ResponsePhase = MTP_RESPONSE_PHASE; - break; - - case MTP_OP_GET_OBJECT_PROP_REFERENCES: - USBD_MTP_OPT_GetObjectReferences(pdev); - hmtp->MTP_ResponsePhase = MTP_RESPONSE_PHASE; - break; - - case MTP_OP_GET_OBJECT_PROPS_SUPPORTED: - USBD_MTP_OPT_GetObjectPropSupp(pdev); - hmtp->MTP_ResponsePhase = MTP_RESPONSE_PHASE; - break; - - case MTP_OP_GET_OBJECT_PROP_DESC: - USBD_MTP_OPT_GetObjectPropDesc(pdev); - hmtp->MTP_ResponsePhase = MTP_RESPONSE_PHASE; - break; - - case MTP_OP_GET_OBJECT_PROPLIST: - USBD_MTP_OPT_GetObjectPropList(pdev); - hmtp->MTP_ResponsePhase = MTP_RESPONSE_PHASE; - break; - - case MTP_OP_GET_OBJECT_PROP_VALUE: - USBD_MTP_OPT_GetObjectPropValue(pdev); - hmtp->MTP_ResponsePhase = MTP_RESPONSE_PHASE; - break; - - case MTP_OP_GET_DEVICE_PROP_DESC: - USBD_MTP_OPT_GetDevicePropDesc(pdev); - hmtp->MTP_ResponsePhase = MTP_RESPONSE_PHASE; - break; - - case MTP_OP_GET_OBJECT: - USBD_MTP_OPT_GetObject(pdev); - hmtp->MTP_ResponsePhase = MTP_READ_DATA; - break; - - case MTP_OP_SEND_OBJECT_INFO: - USBD_MTP_OPT_SendObjectInfo(pdev, (uint8_t *)(hmtp->rx_buff), MTP_DataLength.prv_len); - hmtp->MTP_ResponsePhase = MTP_RECEIVE_DATA; - break; - - case MTP_OP_SEND_OBJECT: - USBD_MTP_OPT_SendObject(pdev, (uint8_t *)(hmtp->rx_buff), MTP_DataLength.rx_length); - hmtp->MTP_ResponsePhase = MTP_RECEIVE_DATA; - break; - - case MTP_OP_DELETE_OBJECT: - USBD_MTP_OPT_DeleteObject(pdev); - hmtp->MTP_ResponsePhase = MTP_RESPONSE_PHASE; - break; - - default: - break; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_MTP_STORAGE_ReceiveContainer - * Receive the Data from USB BulkOut Buffer to Pointer - * @param pdev: device instance - * @param pDst: destination address to copy the buffer - * @param len: length of data to copy - * @retval status value - */ -static uint8_t USBD_MTP_STORAGE_ReceiveContainer(USBD_HandleTypeDef *pdev, - uint32_t *pDst, uint32_t len) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - uint32_t Counter; - uint32_t *pdst = pDst; - - if ((pDst == NULL) || (len > MTP_MEDIA_PACKET)) - { - return (uint8_t)USBD_FAIL; - } - - for (Counter = 0U; Counter < len; Counter++) - { - *pdst = (hmtp->rx_buff[Counter]); - pdst++; - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_MTP_STORAGE_Cancel - * Reinitialize all states and cancel transfer through Bulk transfer - * @param pdev: device instance - * @param MTP_ResponsePhase: MTP current state - * @retval None - */ -void USBD_MTP_STORAGE_Cancel(USBD_HandleTypeDef *pdev, - MTP_ResponsePhaseTypeDef MTP_ResponsePhase) -{ - USBD_MTP_HandleTypeDef *hmtp = (USBD_MTP_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - hmtp->MTP_ResponsePhase = MTP_PHASE_IDLE; - ReadDataStatus = READ_FIRST_DATA; - hmtp->RECEIVE_DATA_STATUS = RECEIVE_IDLE_STATE; - - if (MTP_ResponsePhase == MTP_RECEIVE_DATA) - { - ((USBD_MTP_ItfTypeDef *)pdev->pUserData[pdev->classId])->Cancel(1U); - } - else - { - ((USBD_MTP_ItfTypeDef *)pdev->pUserData[pdev->classId])->Cancel(0U); - } -} - -/** - * @brief USBD_MTP_STORAGE_SendData - * Send the data on bulk-in EP - * @param pdev: device instance - * @param buf: pointer to data buffer - * @param len: Data Length - * @retval status value - */ -static uint8_t USBD_MTP_STORAGE_SendData(USBD_HandleTypeDef *pdev, uint8_t *buf, uint32_t len) -{ -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - MTPInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - (void)USBD_LL_Transmit(pdev, MTPInEpAdd, buf, len); - - return (uint8_t)USBD_OK; -} diff --git a/Class/Printer/Inc/usbd_printer.h b/Class/Printer/Inc/usbd_printer.h deleted file mode 100644 index bf00b9c..0000000 --- a/Class/Printer/Inc/usbd_printer.h +++ /dev/null @@ -1,161 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_printer.h - * @author MCD Application Team - * @brief header file for the usbd_printer.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_PRNT_H -#define __USB_PRNT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup usbd_PRNT - * @brief This file is the Header file for usbd_PRNT.c - * @{ - */ - - -/** @defgroup usbd_PRNT_Exported_Defines - * @{ - */ -#ifndef PRNT_IN_EP -#define PRNT_IN_EP 0x81U /* Default: EP1 for data IN */ -#endif /* PRNT_IN_EP */ - -#ifndef PRNT_OUT_EP -#define PRNT_OUT_EP 0x01U /* Default: EP1 for data OUT */ -#endif /* PRNT_OUT_EP */ - -#ifndef PRNT_DATA_HS_MAX_PACKET_SIZE -#define PRNT_DATA_HS_MAX_PACKET_SIZE 512U /* Endpoint IN & OUT Packet size */ -#endif /* PRNT_DATA_HS_MAX_PACKET_SIZE */ - -#ifndef PRNT_DATA_FS_MAX_PACKET_SIZE -#define PRNT_DATA_FS_MAX_PACKET_SIZE 64U /* Endpoint IN & OUT Packet size */ -#endif /* PRNT_DATA_FS_MAX_PACKET_SIZE */ - -#define USB_PRNT_CONFIG_DESC_SIZ 32U -#define PRNT_DATA_HS_IN_PACKET_SIZE PRNT_DATA_HS_MAX_PACKET_SIZE -#define PRNT_DATA_HS_OUT_PACKET_SIZE PRNT_DATA_HS_MAX_PACKET_SIZE - -#define PRNT_DATA_FS_IN_PACKET_SIZE PRNT_DATA_FS_MAX_PACKET_SIZE -#define PRNT_DATA_FS_OUT_PACKET_SIZE PRNT_DATA_FS_MAX_PACKET_SIZE - -/*---------------------------------------------------------------------*/ -/* PRNT definitions */ -/*---------------------------------------------------------------------*/ -#define PRNT_STATUS_PAPER_EMPTY 0x10U -#define PRNT_STATUS_SELECTED 0x08U -#define PRNT_STATUS_NO_ERROR 0x00U - -#define USB_PRNT_SUBCLASS 0x01U - -#define USB_PRNT_UNIDIRECTIONAL 0x01U -#define USB_PRNT_BIDIRECTIONAL 0x02U - -/* USB PRNT Request types */ -#define PRNT_GET_DEVICE_ID 0x00U -#define PRNT_GET_PORT_STATUS 0x01U -#define PRNT_SOFT_RESET 0x02U -/** - * @} - */ - - -/** @defgroup USBD_CORE_Exported_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -typedef struct _USBD_PRNT_Itf -{ - int8_t (* Init)(void); - int8_t (* DeInit)(void); - int8_t (* Control_req)(uint8_t req, uint8_t *pbuf, uint16_t *length); - int8_t (* Receive)(uint8_t *Buf, uint32_t *Len); - -} USBD_PRNT_ItfTypeDef; - -typedef struct -{ - uint32_t data[PRNT_DATA_HS_MAX_PACKET_SIZE / 4U]; /* Force 32-bit alignment */ - uint8_t CmdOpCode; - uint8_t CmdLength; - uint8_t *RxBuffer; - uint8_t *TxBuffer; - uint32_t RxLength; - uint32_t TxLength; - - __IO uint32_t TxState; - __IO uint32_t RxState; -} USBD_PRNT_HandleTypeDef; - - - -/** @defgroup USBD_CORE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Exported_Variables - * @{ - */ - -extern USBD_ClassTypeDef USBD_PRNT; -#define USBD_PRNT_CLASS &USBD_PRNT -/** - * @} - */ - -/** @defgroup USB_CORE_Exported_Functions - * @{ - */ -uint8_t USBD_PRNT_RegisterInterface(USBD_HandleTypeDef *pdev, USBD_PRNT_ItfTypeDef *fops); -uint8_t USBD_PRNT_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff); -uint8_t USBD_PRNT_ReceivePacket(USBD_HandleTypeDef *pdev); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_PRNT_H */ -/** - * @} - */ - -/** - * @} - */ - diff --git a/Class/Printer/Inc/usbd_printer_if_template.h b/Class/Printer/Inc/usbd_printer_if_template.h deleted file mode 100644 index 7765eed..0000000 --- a/Class/Printer/Inc/usbd_printer_if_template.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_printer_if_template.h - * @author MCD Application Team - * @brief Header for usbd_PRNT_if_template.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_PRNT_IF_TEMPLATE_H -#define __USBD_PRNT_IF_TEMPLATE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_printer.h" - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -extern USBD_PRNT_ItfTypeDef USBD_PRNT_Template_fops; - -/* Exported macro ------------------------------------------------------------*/ -/* Exported functions ------------------------------------------------------- */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_PRNT_IF_TEMPLATE_H */ - diff --git a/Class/Printer/Src/usbd_printer.c b/Class/Printer/Src/usbd_printer.c deleted file mode 100644 index 7c1a4ba..0000000 --- a/Class/Printer/Src/usbd_printer.c +++ /dev/null @@ -1,660 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_printer.c - * @author MCD Application Team - * @brief This file provides the high layer firmware functions to manage the - * following functionalities of the USB printer Class: - * - Initialization and Configuration of high and low layer - * - Enumeration as printer Device (and enumeration for each implemented memory interface) - * - OUT data transfer - * - Command OUT transfer (class requests management) - * - Error management - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - * @verbatim - * - * =================================================================== - * PRINTER Class Driver Description - * =================================================================== - * This driver manages the "Universal Serial Bus Class Definitions for Communications Devices - * Revision 1.2 November 16, 2007" and the sub-protocol specification of "Universal Serial Bus - * printer Class Subclass Specification for PSTN Devices Revision 1.2 February 9, 2007" - * This driver implements the following aspects of the specification: - * - Device descriptor management - * - Configuration descriptor management - * - Enumeration as printer device with 2 data endpoints (IN and OUT) - * - Control Requests management (PRNT_GET_DEVICE_ID,PRNT_GET_PORT_STATUS,PRNT_SOFT_RESET) - * - protocol USB_PRNT_BIDIRECTIONAL - * - * - * - * These aspects may be enriched or modified for a specific user application. - * - * This driver doesn't implement the following aspects of the specification - * (but it is possible to manage these features with some modifications on this driver): - * - Any class-specific aspect relative to communication classes should be managed by user application. - * - All communication classes other than PSTN are not managed - * - * @endverbatim - * - ****************************************************************************** - */ - -/* BSPDependencies -- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c" -- "stm32xxxxx_{eval}{discovery}_io.c" -EndBSPDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_printer.h" -#include "usbd_ctlreq.h" - - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_PRNT - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_PRNT_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ -static uint32_t usbd_PRNT_altset = 0U; - -/** @defgroup USBD_PRNT_Private_Defines - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_PRNT_Private_Macros - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_PRNT_Private_FunctionPrototypes - * @{ - */ -static uint8_t USBD_PRNT_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_PRNT_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_PRNT_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static uint8_t USBD_PRNT_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_PRNT_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); - -#ifndef USE_USBD_COMPOSITE -static uint8_t *USBD_PRNT_GetFSCfgDesc(uint16_t *length); -static uint8_t *USBD_PRNT_GetHSCfgDesc(uint16_t *length); -static uint8_t *USBD_PRNT_GetOtherSpeedCfgDesc(uint16_t *length); -static uint8_t *USBD_PRNT_GetOtherSpeedCfgDesc(uint16_t *length); -uint8_t *USBD_PRNT_GetDeviceQualifierDescriptor(uint16_t *length); -#endif /* USE_USBD_COMPOSITE */ -/** - * @} - */ - -/** @defgroup USBD_PRNT_Private_Variables - * @{ - */ - -/* PRNT interface class callbacks structure */ -USBD_ClassTypeDef USBD_PRNT = -{ - USBD_PRNT_Init, - USBD_PRNT_DeInit, - USBD_PRNT_Setup, - NULL, - NULL, - USBD_PRNT_DataIn, - USBD_PRNT_DataOut, - NULL, - NULL, - NULL, -#ifdef USE_USBD_COMPOSITE - NULL, - NULL, - NULL, - NULL, -#else - USBD_PRNT_GetHSCfgDesc, - USBD_PRNT_GetFSCfgDesc, - USBD_PRNT_GetOtherSpeedCfgDesc, - USBD_PRNT_GetDeviceQualifierDescriptor, -#endif /* USE_USBD_COMPOSITE */ -}; - -#ifndef USE_USBD_COMPOSITE -/* USB PRNT device Configuration Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_PRNT_CfgDesc[] __ALIGN_END = -{ - /*Configuration Descriptor*/ - 0x09, /* bLength: Configuration Descriptor size */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - USB_PRNT_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */ - 0x00, - 0x01, /* bNumInterfaces: 1 interface */ - 0x01, /* bConfigurationValue: Configuration value */ - 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ -#if (USBD_SELF_POWERED == 1U) - 0xC0, /* bmAttributes: Self Powered according to user configuration */ -#else - 0x80, /* bmAttributes: Bus Powered according to user configuration */ -#endif /* USBD_SELF_POWERED */ - USBD_MAX_POWER, /* MaxPower in mA */ - - /*Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - 0x00, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: 2 endpoints used */ - 0x07, /* bInterfaceClass: Communication Interface Class */ - 0x01, /* bInterfaceSubClass: Abstract Control Model */ - USB_PRNT_BIDIRECTIONAL, /* bDeviceProtocol */ - 0x00, /* iInterface */ - - /*Endpoint IN Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - PRNT_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(PRNT_DATA_FS_IN_PACKET_SIZE), /* wMaxPacketSize */ - HIBYTE(PRNT_DATA_FS_IN_PACKET_SIZE), - 0x00, /* bInterval */ - - /*Endpoint OUT Descriptor*/ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - PRNT_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(PRNT_DATA_FS_OUT_PACKET_SIZE),/* wMaxPacketSize */ - HIBYTE(PRNT_DATA_FS_OUT_PACKET_SIZE), - 0x00 /* bInterval */ -}; - -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_PRNT_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = -{ - USB_LEN_DEV_QUALIFIER_DESC, - USB_DESC_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x01, - 0x00, -}; -#endif /* USE_USBD_COMPOSITE */ - -static uint8_t PRNTInEpAdd = PRNT_IN_EP; -static uint8_t PRNTOutEpAdd = PRNT_OUT_EP; - -/** - * @} - */ - -/** @defgroup USBD_PRNT_Private_Functions - * @{ - */ - -/** - * @brief USBD_PRNT_Init - * Initialize the PRNT interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_PRNT_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - - USBD_PRNT_HandleTypeDef *hPRNT; - uint16_t mps; - - hPRNT = (USBD_PRNT_HandleTypeDef *)USBD_malloc(sizeof(USBD_PRNT_HandleTypeDef)); - - if (hPRNT == NULL) - { - pdev->pClassDataCmsit[pdev->classId] = NULL; - return (uint8_t)USBD_EMEM; - } - - (void)USBD_memset(hPRNT, 0, sizeof(USBD_PRNT_HandleTypeDef)); - - /* Setup the pClassData pointer */ - pdev->pClassDataCmsit[pdev->classId] = (void *)hPRNT; - pdev->pClassData = pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - PRNTInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - PRNTOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Setup the max packet size according to selected speed */ - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - mps = PRNT_DATA_HS_IN_PACKET_SIZE; - } - else - { - mps = PRNT_DATA_FS_IN_PACKET_SIZE; - } - - /* Open EP IN */ - (void)USBD_LL_OpenEP(pdev, PRNTInEpAdd, USBD_EP_TYPE_BULK, mps); - - /* Set endpoint as used */ - pdev->ep_in[PRNTInEpAdd & 0xFU].is_used = 1U; - - /* Open EP OUT */ - (void)USBD_LL_OpenEP(pdev, PRNTOutEpAdd, USBD_EP_TYPE_BULK, mps); - - /* Set endpoint as used */ - pdev->ep_out[PRNTOutEpAdd & 0xFU].is_used = 1U; - - hPRNT->RxBuffer = NULL; - - /* Init physical Interface components */ - ((USBD_PRNT_ItfTypeDef *)pdev->pUserData[pdev->classId])->Init(); - - if (hPRNT->RxBuffer == NULL) - { - return (uint8_t)USBD_EMEM; - } - - /* Prepare Out endpoint to receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, PRNTOutEpAdd, hPRNT->RxBuffer, mps); - - /* End of initialization phase */ - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_PRNT_DeInit - * DeInitialize the PRNT layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_PRNT_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - PRNTInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - PRNTOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Close EP IN */ - (void)USBD_LL_CloseEP(pdev, PRNTInEpAdd); - pdev->ep_in[PRNTInEpAdd & 0xFU].is_used = 0U; - - /* Close EP OUT */ - (void)USBD_LL_CloseEP(pdev, PRNTOutEpAdd); - pdev->ep_out[PRNTOutEpAdd & 0xFU].is_used = 0U; - - /* DeInit physical Interface components */ - if (pdev->pClassDataCmsit[pdev->classId] != NULL) - { - ((USBD_PRNT_ItfTypeDef *)pdev->pUserData[pdev->classId])->DeInit(); - (void)USBD_free(pdev->pClassDataCmsit[pdev->classId]); - pdev->pClassDataCmsit[pdev->classId] = NULL; - pdev->pClassData = NULL; - } - - return 0U; -} - -/** - * @brief USBD_PRNT_Setup - * Handle the PRNT specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t USBD_PRNT_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_PRNT_HandleTypeDef *hPRNT = (USBD_PRNT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - USBD_PRNT_ItfTypeDef *hPRNTitf = (USBD_PRNT_ItfTypeDef *)pdev->pUserData[pdev->classId]; - - USBD_StatusTypeDef ret = USBD_OK; - uint16_t status_info = 0U; - uint16_t data_length; - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS : - if (req->wLength != 0U) - { - data_length = MIN(req->wLength, PRNT_DATA_HS_MAX_PACKET_SIZE); - - if ((req->bmRequest & 0x80U) != 0U) - { - /* Call the User class interface function to process the command */ - hPRNTitf->Control_req(req->bRequest, (uint8_t *)hPRNT->data, &data_length); - - /* Return the answer to host */ - (void) USBD_CtlSendData(pdev, (uint8_t *)hPRNT->data, data_length); - } - else - { - /* Prepare for control data reception */ - (void) USBD_CtlPrepareRx(pdev, (uint8_t *)hPRNT->data, data_length); - } - } - else - { - data_length = 0U; - hPRNTitf->Control_req(req->bRequest, (uint8_t *)req, &data_length); - } - break; - - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_STATUS: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, (uint8_t *)&status_info, 2U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_GET_INTERFACE: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, (uint8_t *)&usbd_PRNT_altset, 1U); - } - else - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_SET_INTERFACE: - if (pdev->dev_state != USBD_STATE_CONFIGURED) - { - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_CLEAR_FEATURE: - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - - return (uint8_t)ret; -} - -/** - * @brief USBD_PRNT_DataIn - * Data sent on non-control IN endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t USBD_PRNT_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - USBD_PRNT_HandleTypeDef *hPRNT = (USBD_PRNT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - PCD_HandleTypeDef *hpcd = pdev->pData; - - if (hPRNT == NULL) - { - return (uint8_t)USBD_FAIL; - } - - if ((pdev->ep_in[epnum & 0xFU].total_length > 0U) && - ((pdev->ep_in[epnum & 0xFU].total_length % hpcd->IN_ep[epnum & 0xFU].maxpacket) == 0U)) - { - /* Update the packet total length */ - pdev->ep_in[epnum & 0xFU].total_length = 0U; - - /* Send ZLP */ - (void) USBD_LL_Transmit(pdev, epnum, NULL, 0U); - } - else - { - hPRNT->TxState = 0U; - } - - return (uint8_t)USBD_OK; -} -/** - * @brief USBD_PRNT_DataOut - * Data received on non-control Out endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t USBD_PRNT_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - USBD_PRNT_HandleTypeDef *hPRNT = (USBD_PRNT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - - if (hPRNT == NULL) - { - return (uint8_t)USBD_FAIL; - } - - /* Get the received data length */ - hPRNT->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 */ - ((USBD_PRNT_ItfTypeDef *)pdev->pUserData[pdev->classId])->Receive(hPRNT->RxBuffer, &hPRNT->RxLength); - - return (uint8_t)USBD_OK; -} - -#ifndef USE_USBD_COMPOSITE -/** - * @brief USBD_PRNT_GetFSCfgDesc - * Return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_PRNT_GetFSCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_PRNT_CfgDesc, PRNT_IN_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_PRNT_CfgDesc, PRNT_OUT_EP); - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = PRNT_DATA_FS_IN_PACKET_SIZE; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = PRNT_DATA_FS_OUT_PACKET_SIZE; - } - - *length = (uint16_t) sizeof(USBD_PRNT_CfgDesc); - return USBD_PRNT_CfgDesc; -} - -/** - * @brief USBD_PRNT_GetHSCfgDesc - * Return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_PRNT_GetHSCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_PRNT_CfgDesc, PRNT_IN_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_PRNT_CfgDesc, PRNT_OUT_EP); - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = PRNT_DATA_HS_IN_PACKET_SIZE; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = PRNT_DATA_HS_OUT_PACKET_SIZE; - } - - *length = (uint16_t) sizeof(USBD_PRNT_CfgDesc); - return USBD_PRNT_CfgDesc; -} - -/** - * @brief USBD_PRNT_GetOtherSpeedCfgDesc - * Return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_PRNT_GetOtherSpeedCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_PRNT_CfgDesc, PRNT_IN_EP); - USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_PRNT_CfgDesc, PRNT_OUT_EP); - - if (pEpInDesc != NULL) - { - pEpInDesc->wMaxPacketSize = PRNT_DATA_FS_IN_PACKET_SIZE; - } - - if (pEpOutDesc != NULL) - { - pEpOutDesc->wMaxPacketSize = PRNT_DATA_FS_OUT_PACKET_SIZE; - } - - *length = (uint16_t) sizeof(USBD_PRNT_CfgDesc); - return USBD_PRNT_CfgDesc; -} - -/** - * @brief USBD_PRNT_GetDeviceQualifierDescriptor - * return Device Qualifier descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -uint8_t *USBD_PRNT_GetDeviceQualifierDescriptor(uint16_t *length) -{ - *length = (uint16_t)sizeof(USBD_PRNT_DeviceQualifierDesc); - return USBD_PRNT_DeviceQualifierDesc; -} -#endif /* USE_USBD_COMPOSITE */ - -/** - * @brief USBD_PRNT_RegisterInterface - * @param pdev: device instance - * @param fops: Interface callbacks - * @retval status - */ -uint8_t USBD_PRNT_RegisterInterface(USBD_HandleTypeDef *pdev, USBD_PRNT_ItfTypeDef *fops) -{ - /* Check if the fops pointer is valid */ - if (fops == NULL) - { - return (uint8_t)USBD_FAIL; - } - - /* Setup the fops pointer */ - pdev->pUserData[pdev->classId] = fops; - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_PRNT_SetRxBuffer - * @param pdev: device instance - * @param pbuff: Rx Buffer - * @retval status - */ -uint8_t USBD_PRNT_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff) -{ - USBD_PRNT_HandleTypeDef *hPRNT = (USBD_PRNT_HandleTypeDef *) pdev->pClassDataCmsit[pdev->classId]; - - hPRNT->RxBuffer = pbuff; - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_PRNT_ReceivePacket - * prepare OUT Endpoint for reception - * @param pdev: device instance - * @retval status - */ -uint8_t USBD_PRNT_ReceivePacket(USBD_HandleTypeDef *pdev) -{ - USBD_PRNT_HandleTypeDef *hPRNT = (USBD_PRNT_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - PRNTInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); - PRNTOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (hPRNT == NULL) - { - return (uint8_t)USBD_FAIL; - } - - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - /* Prepare Out endpoint to receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, PRNTOutEpAdd, hPRNT->RxBuffer, - PRNT_DATA_HS_OUT_PACKET_SIZE); - } - else - { - /* Prepare Out endpoint to receive next packet */ - (void)USBD_LL_PrepareReceive(pdev, PRNTOutEpAdd, hPRNT->RxBuffer, - PRNT_DATA_FS_OUT_PACKET_SIZE); - } - - return (uint8_t)USBD_OK; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ diff --git a/Class/Printer/Src/usbd_printer_if_template.c b/Class/Printer/Src/usbd_printer_if_template.c deleted file mode 100644 index 8b63db0..0000000 --- a/Class/Printer/Src/usbd_printer_if_template.c +++ /dev/null @@ -1,206 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_printer_if_template.c - * @author MCD Application Team - * @brief Generic media access Layer. - ****************************************************************************** - * @attention - * - * Copyright (c) 2021 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_printer_if_template.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_PRNT - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_PRNT_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_PRNT_Private_Defines - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_PRNT_Private_Macros - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_PRNT_Private_FunctionPrototypes - * @{ - */ - -static int8_t TEMPLATE_Init(void); -static int8_t TEMPLATE_DeInit(void); -static int8_t TEMPLATE_Control_req(uint8_t req, uint8_t *pbuf, uint16_t *length); -static int8_t TEMPLATE_Receive(uint8_t *pbuf, uint32_t *Len); - -/*printer Private function prototypes*/ -void TEMPLATE_PRNT_PageEndManager(uint8_t *Buf, uint32_t Len); - -USBD_PRNT_ItfTypeDef USBD_PRNT_Template_fops = -{ - TEMPLATE_Init, - TEMPLATE_DeInit, - TEMPLATE_Control_req, - TEMPLATE_Receive -}; - -static uint8_t PRNT_DEVICE_ID[] = -{ - 0x00, 0x6D, - 'M', 'A', 'N', 'U', 'F', 'A', 'C', 'T', 'U', 'R', 'E', 'R', ':', - 'S', 'T', 'M', 'i', 'c', 'r', 'o', 'e', 'l', 'e', 'c', 't', 'r', 'o', 'n', 'i', 'c', 's', ';', - 'C', 'O', 'M', 'M', 'A', 'N', 'D', ' ', 'S', 'E', 'T', ':', - 'P', 'D', 'L', ',', 'P', 'C', 'P', ';', - 'M', 'O', 'D', 'E', 'L', ':', - 'U', 'S', 'B', 'P', 'r', 'i', 'n', 't', 'e', 'r', ';', - 'C', 'O', 'M', 'M', 'E', 'N', 'T', ':', - 'G', 'o', 'o', 'd', ' ', '!', ';', - 'A', 'C', 'T', 'I', 'V', 'E', ' ', 'C', 'O', 'M', 'M', 'A', 'N', 'D', ' ', 'S', 'E', 'T', ':', - 'P', 'C', 'P', ';' -}; - -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief TEMPLATE_Init - * Initializes the PRNT media low layer - * @param None - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t TEMPLATE_Init(void) -{ - /* - Add your initialization code here - */ - return (0); -} - -/** - * @brief TEMPLATE_DeInit - * DeInitializes the PRNT media low layer - * @param None - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t TEMPLATE_DeInit(void) -{ - /* - Add your deinitialization code here - */ - return (0); -} - - -/** - * @brief TEMPLATE_Receive - * Data received over USB OUT endpoint are sent over PRNT interface - * through this function. - * - * @note - * This function will issue a NAK packet on any OUT packet received on - * USB endpoint until exiting this function. If you exit this function - * before transfer is complete on PRNT interface (ie. using DMA controller) - * it will result in receiving more data while previous ones are still - * not sent. - * - * @param Buf: Buffer of data to be received - * @param Len: Number of data received (in bytes) - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t TEMPLATE_Receive(uint8_t *Buf, uint32_t *Len) -{ - UNUSED(Buf); - UNUSED(Len); - - return (0); -} - - -/** - * @brief TEMPLATE_Control_req - * Manage the PRNT class requests - * @param req: Command code - * @param pbuf: Buffer containing command data (request parameters) - * @param length: Number of data to be sent (in bytes) - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t TEMPLATE_Control_req(uint8_t req, uint8_t *pbuf, uint16_t *length) -{ - uint32_t i = 0U; - - /* Check on the setup request value */ - switch (req) - { - /* Get Printer Device ID request */ - case PRNT_GET_DEVICE_ID: - /* Not using for loop here due to MISRA-C2012-Rule-16.1 */ - while (i < sizeof(PRNT_DEVICE_ID)) - { - pbuf[i] = PRNT_DEVICE_ID[i]; - i++; - } - *length = (uint16_t)i; - break; - - /* Get Printer current status */ - case PRNT_GET_PORT_STATUS: - pbuf[0] = PRNT_STATUS_PAPER_EMPTY | - PRNT_STATUS_SELECTED | - PRNT_STATUS_NO_ERROR; - - *length = 1U; - break; - - /* Printer SOFT RESET request: cleanup pending tasks */ - case PRNT_SOFT_RESET: - break; - - default: - /* Unknown commands are not managed */ - break; - } - - return (0); -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - diff --git a/Class/Template/Inc/usbd_template.h b/Class/Template/Inc/usbd_template.h deleted file mode 100644 index be31437..0000000 --- a/Class/Template/Inc/usbd_template.h +++ /dev/null @@ -1,98 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_template_core.h - * @author MCD Application Team - * @brief Header file for the usbd_template_core.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_TEMPLATE_CORE_H -#define __USB_TEMPLATE_CORE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_TEMPLATE - * @brief This file is the header file for usbd_template_core.c - * @{ - */ - - -/** @defgroup USBD_TEMPLATE_Exported_Defines - * @{ - */ -#define TEMPLATE_EPIN_ADDR 0x81U -#define TEMPLATE_EPIN_SIZE 0x10U - -#define USB_TEMPLATE_CONFIG_DESC_SIZ 64U - -/** - * @} - */ - - -/** @defgroup USBD_CORE_Exported_TypesDefinitions - * @{ - */ - -/** - * @} - */ - - - -/** @defgroup USBD_CORE_Exported_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Exported_Variables - * @{ - */ - -extern USBD_ClassTypeDef USBD_TEMPLATE_ClassDriver; -/** - * @} - */ - -/** @defgroup USB_CORE_Exported_Functions - * @{ - */ -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_TEMPLATE_CORE_H */ -/** - * @} - */ - -/** - * @} - */ diff --git a/Class/Template/Src/usbd_template.c b/Class/Template/Src/usbd_template.c deleted file mode 100644 index 947ae91..0000000 --- a/Class/Template/Src/usbd_template.c +++ /dev/null @@ -1,365 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_template.c - * @author MCD Application Team - * @brief This file provides the HID core functions. - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2015 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - * @verbatim - * - * =================================================================== - * TEMPLATE 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 - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_template.h" -#include "usbd_ctlreq.h" - - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_TEMPLATE - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_TEMPLATE_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - - -/** @defgroup USBD_TEMPLATE_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_TEMPLATE_Private_Macros - * @{ - */ - -/** - * @} - */ - - - - -/** @defgroup USBD_TEMPLATE_Private_FunctionPrototypes - * @{ - */ - - -static uint8_t USBD_TEMPLATE_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_TEMPLATE_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_TEMPLATE_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static uint8_t USBD_TEMPLATE_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_TEMPLATE_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_TEMPLATE_EP0_RxReady(USBD_HandleTypeDef *pdev); -static uint8_t USBD_TEMPLATE_EP0_TxReady(USBD_HandleTypeDef *pdev); -static uint8_t USBD_TEMPLATE_SOF(USBD_HandleTypeDef *pdev); -static uint8_t USBD_TEMPLATE_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_TEMPLATE_IsoOutIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); - -static uint8_t *USBD_TEMPLATE_GetCfgDesc(uint16_t *length); -static uint8_t *USBD_TEMPLATE_GetDeviceQualifierDesc(uint16_t *length); -/** - * @} - */ - -/** @defgroup USBD_TEMPLATE_Private_Variables - * @{ - */ - -USBD_ClassTypeDef USBD_TEMPLATE_ClassDriver = -{ - USBD_TEMPLATE_Init, - USBD_TEMPLATE_DeInit, - USBD_TEMPLATE_Setup, - USBD_TEMPLATE_EP0_TxReady, - USBD_TEMPLATE_EP0_RxReady, - USBD_TEMPLATE_DataIn, - USBD_TEMPLATE_DataOut, - USBD_TEMPLATE_SOF, - USBD_TEMPLATE_IsoINIncomplete, - USBD_TEMPLATE_IsoOutIncomplete, - USBD_TEMPLATE_GetCfgDesc, - USBD_TEMPLATE_GetCfgDesc, - USBD_TEMPLATE_GetCfgDesc, - USBD_TEMPLATE_GetDeviceQualifierDesc, -}; - -#if defined ( __ICCARM__ ) /*!< IAR Compiler */ -#pragma data_alignment=4 -#endif /* __ICCARM__ */ -/* USB TEMPLATE device Configuration Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_TEMPLATE_CfgDesc[USB_TEMPLATE_CONFIG_DESC_SIZ] __ALIGN_END = -{ - 0x09, /* bLength: Configuration Descriptor size */ - USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION, /* bDescriptorType: Configuration */ - USB_TEMPLATE_CONFIG_DESC_SIZ, - /* wTotalLength: Bytes returned */ - 0x00, - 0x01, /*bNumInterfaces: 1 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 */ - - /********** Descriptor of TEMPLATE interface 0 Alternate setting 0 **************/ - -}; - -#if defined ( __ICCARM__ ) /*!< IAR Compiler */ -#pragma data_alignment=4 -#endif /* __ICCARM__ */ -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_TEMPLATE_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = -{ - USB_LEN_DEV_QUALIFIER_DESC, - USB_DESC_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, - 0x40, - 0x01, - 0x00, -}; - -/** - * @} - */ - -/** @defgroup USBD_TEMPLATE_Private_Functions - * @{ - */ - -/** - * @brief USBD_TEMPLATE_Init - * Initialize the TEMPLATE interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_TEMPLATE_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_TEMPLATE_Init - * DeInitialize the TEMPLATE layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_TEMPLATE_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_TEMPLATE_Setup - * Handle the TEMPLATE specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t USBD_TEMPLATE_Setup(USBD_HandleTypeDef *pdev, - USBD_SetupReqTypedef *req) -{ - USBD_StatusTypeDef ret = USBD_OK; - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS : - switch (req->bRequest) - { - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - break; - - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - break; - - default: - USBD_CtlError(pdev, req); - ret = USBD_FAIL; - break; - } - - return (uint8_t)ret; -} - -/** - * @brief USBD_TEMPLATE_GetCfgDesc - * return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_TEMPLATE_GetCfgDesc(uint16_t *length) -{ - *length = (uint16_t)sizeof(USBD_TEMPLATE_CfgDesc); - return USBD_TEMPLATE_CfgDesc; -} - -/** - * @brief USBD_TEMPLATE_GetDeviceQualifierDesc - * return Device Qualifier descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -uint8_t *USBD_TEMPLATE_GetDeviceQualifierDesc(uint16_t *length) -{ - *length = (uint16_t)sizeof(USBD_TEMPLATE_DeviceQualifierDesc); - return USBD_TEMPLATE_DeviceQualifierDesc; -} - -/** - * @brief USBD_TEMPLATE_DataIn - * handle data IN Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_TEMPLATE_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_TEMPLATE_EP0_RxReady - * handle EP0 Rx Ready event - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_TEMPLATE_EP0_RxReady(USBD_HandleTypeDef *pdev) -{ - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_TEMPLATE_EP0_TxReady - * handle EP0 TRx Ready event - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_TEMPLATE_EP0_TxReady(USBD_HandleTypeDef *pdev) -{ - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_TEMPLATE_SOF - * handle SOF event - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_TEMPLATE_SOF(USBD_HandleTypeDef *pdev) -{ - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_TEMPLATE_IsoINIncomplete - * handle data ISO IN Incomplete event - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_TEMPLATE_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_TEMPLATE_IsoOutIncomplete - * handle data ISO OUT Incomplete event - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_TEMPLATE_IsoOutIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - - return (uint8_t)USBD_OK; -} -/** - * @brief USBD_TEMPLATE_DataOut - * handle data OUT Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_TEMPLATE_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - - return (uint8_t)USBD_OK; -} - -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ diff --git a/Class/VIDEO/Inc/usbd_video.h b/Class/VIDEO/Inc/usbd_video.h deleted file mode 100644 index 5c9c4fd..0000000 --- a/Class/VIDEO/Inc/usbd_video.h +++ /dev/null @@ -1,559 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_video.h - * @author MCD Application Team - * @brief header file for the usbd_video.c file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2020 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_VIDEO_H -#define __USBD_VIDEO_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_VIDEO - * @brief This file is the Header file for usbd_video.c - * @{ - */ - - -/** @defgroup usbd_VIDEO_Exported_Defines - * @{ - */ - -/* USB Video device class specification version 1.10 */ -#ifdef UVC_1_0 -#define UVC_VERSION 0x0100U /* UVC 1.0 */ -#else -#define UVC_VERSION 0x0110U /* UVC 1.1 */ -#endif /* UVC_1_0 */ - -/* bEndpointAddress in Endpoint Descriptor */ -#ifndef UVC_IN_EP -#define UVC_IN_EP 0x81U -#endif /* UVC_IN_EP */ - -/* These defines shall be updated in the usbd_conf.h file */ -#ifndef UVC_WIDTH -#define UVC_WIDTH 400U -#endif /* UVC_WIDTH */ - -#ifndef UVC_HEIGHT -#define UVC_HEIGHT 240U -#endif /* UVC_HEIGHT */ - -#ifndef UVC_CAM_FPS_FS -#define UVC_CAM_FPS_FS 10U -#endif /* UVC_CAM_FPS_FS */ - -#ifndef UVC_CAM_FPS_HS -#define UVC_CAM_FPS_HS 5U -#endif /* UVC_CAM_FPS_HS */ - -#ifndef UVC_PACKET_SIZE -#define UVC_PACKET_SIZE 512U -#endif /* UVC_PACKET_SIZE */ - -#ifndef UVC_MAX_FRAME_SIZE -#define UVC_MAX_FRAME_SIZE (UVC_WIDTH * UVC_HEIGHT * 16U / 2U) -#endif /* UVC_MAX_FRAME_SIZE */ - -#ifndef UVC_COLOR_PRIMARIE -#define UVC_COLOR_PRIMARIE 0x01U -#endif /* UVC_COLOR_PRIMARIE */ - -#ifndef UVC_TFR_CHARACTERISTICS -#define UVC_TFR_CHARACTERISTICS 0x01U -#endif /* UVC_TFR_CHARACTERISTICS */ - -#ifndef UVC_MATRIX_COEFFICIENTS -#define UVC_MATRIX_COEFFICIENTS 0x04U -#endif /* UVC_MATRIX_COEFFICIENTS */ - -#ifndef UVC_BITS_PER_PIXEL -#define UVC_BITS_PER_PIXEL 12U -#endif /* UVC_BITS_PER_PIXEL */ - -#define UVC_GUID_YUY2 0x32595559U -#define UVC_GUID_NV12 0x3231564EU - -#ifndef UVC_UNCOMPRESSED_GUID -#define UVC_UNCOMPRESSED_GUID UVC_GUID_NV12 -#endif /* UVC_UNCOMPRESSED_GUID */ - -#define UVC_INTERVAL(n) (10000000U/(n)) - -#define UVC_MIN_BIT_RATE(n) (UVC_WIDTH * UVC_HEIGHT * 16U * (n)) /* 16 bit */ -#define UVC_MAX_BIT_RATE(n) (UVC_WIDTH * UVC_HEIGHT * 16U * (n)) /* 16 bit */ - -#define UVC_PACKETS_IN_FRAME(n) (UVC_MAX_FRAME_SIZE / (n)) - -#ifndef UVC_ISO_FS_MPS -#define UVC_ISO_FS_MPS 256U -#endif /* UVC_ISO_FS_MPS */ - -#ifndef UVC_ISO_HS_MPS -#define UVC_ISO_HS_MPS 512U -#endif /* UVC_ISO_HS_MPS */ - -#ifndef UVC_HEADER_PACKET_CNT -#define UVC_HEADER_PACKET_CNT 0x01U -#endif /* UVC_HEADER_PACKET_CNT */ - - -#define UVC_REQ_READ_MASK 0x80U -#define UVC_VC_IF_NUM 0x00U -#define UVC_VS_IF_NUM 0x01U -#define UVC_TOTAL_IF_NUM 0x02U - -#ifdef USBD_UVC_FORMAT_UNCOMPRESSED -#define UVC_CONFIG_DESC_SIZ (0x88U + 0x16U) -#else -#define UVC_CONFIG_DESC_SIZ 0x88U -#endif /* USBD_UVC_FORMAT_UNCOMPRESSED */ - -#define USBD_VC_GIUD_FORMAT_SIZE 16U - -#define UVC_TOTAL_BUF_SIZE 0x04U - -#define UVC_VC_EP_DESC_SIZE 0x05U -#define UVC_STREAMING_EP_DESC_SIZE 0x07U -#define UVC_EP_DESC_TYPE 0x25U - -/* Video Interface Class Codes*/ -#define UVC_CC_VIDEO 0x0EU - -#define UVC_PLAY_STATUS_STOP 0x00U -#define UVC_PLAY_STATUS_READY 0x01U -#define UVC_PLAY_STATUS_STREAMING 0x02U - -#ifndef WBVAL -#define WBVAL(x) ((x) & 0xFFU),(((x) >> 8) & 0xFFU) -#endif /* WBVAL */ -#ifndef DBVAL -#define DBVAL(x) ((x)& 0xFFU),(((x) >> 8) & 0xFFU),(((x)>> 16) & 0xFFU),(((x) >> 24) & 0xFFU) -#endif /* DBVAL */ - -/* Video Interface Protocol Codes */ -#define PC_PROTOCOL_UNDEFINED 0x00U - -#define VIDEO_VC_IF_HEADER_DESC_SIZE 0x0DU -#define VIDEO_IN_TERMINAL_DESC_SIZE 0x08U -#define VIDEO_OUT_TERMINAL_DESC_SIZE 0x09U -#define VIDEO_VS_IF_IN_HEADER_DESC_SIZE 0x0EU - -#define VS_FORMAT_UNCOMPRESSED_DESC_SIZE 0x1BU -#define VS_FORMAT_MJPEG_DESC_SIZE 0x0BU -#define VS_FRAME_DESC_SIZE 0x1EU -#define VS_COLOR_MATCHING_DESC_SIZE 0x06U - -#ifdef USBD_UVC_FORMAT_UNCOMPRESSED -#define VS_FORMAT_DESC_SIZE VS_FORMAT_UNCOMPRESSED_DESC_SIZE -#define VS_FORMAT_SUBTYPE VS_FORMAT_UNCOMPRESSED -#define VS_FRAME_SUBTYPE VS_FRAME_UNCOMPRESSED - -#define VC_HEADER_SIZE (VIDEO_VS_IF_IN_HEADER_DESC_SIZE + \ - VS_FORMAT_UNCOMPRESSED_DESC_SIZE + \ - VS_FRAME_DESC_SIZE + \ - VS_COLOR_MATCHING_DESC_SIZE) -#else -#define VS_FORMAT_DESC_SIZE VS_FORMAT_MJPEG_DESC_SIZE -#define VS_FORMAT_SUBTYPE VS_FORMAT_MJPEG -#define VS_FRAME_SUBTYPE VS_FRAME_MJPEG - -#define VC_HEADER_SIZE (VIDEO_VS_IF_IN_HEADER_DESC_SIZE + \ - VS_FORMAT_DESC_SIZE + \ - VS_FRAME_DESC_SIZE) -#endif /* USBD_UVC_FORMAT_UNCOMPRESSED */ - -/* - * Video Class specification release 1.1 - * Appendix A. Video Device Class Codes defines - */ - -/* Video Interface Subclass values */ -#define SC_UNDEFINED 0x00U -#define SC_VIDEOCONTROL 0x01U -#define SC_VIDEOSTREAMING 0x02U -#define SC_VIDEO_INTERFACE_COLLECTION 0x03U - -/* Video Class-Specific Descriptor Types */ -#define CS_UNDEFINED 0x20U -#define CS_DEVICE 0x21U -#define CS_CONFIGURATION 0x22U -#define CS_STRING 0x23U -#define CS_INTERFACE 0x24U -#define CS_ENDPOINT 0x25U - -/* Video Class-Specific VideoControl Interface Descriptor Subtypes */ -#define VC_DESCRIPTOR_UNDEFINED 0x00U -#define VC_HEADER 0x01U -#define VC_INPUT_TERMINAL 0x02U -#define VC_OUTPUT_TERMINAL 0x03U -#define VC_SELECTOR_UNIT 0x04U -#define VC_PROCESSING_UNIT 0x05U -#define VC_EXTENSION_UNIT 0x06U - -/* Video Class-Specific VideoStreaming Interface Descriptor Subtypes */ -#define VS_UNDEFINED 0x00U -#define VS_INPUT_HEADER 0x01U -#define VS_OUTPUT_HEADER 0x02U -#define VS_STILL_IMAGE_FRAME 0x03U -#define VS_FORMAT_UNCOMPRESSED 0x04U -#define VS_FRAME_UNCOMPRESSED 0x05U -#define VS_FORMAT_MJPEG 0x06U -#define VS_FRAME_MJPEG 0x07U -#define VS_FORMAT_MPEG2TS 0x0AU -#define VS_FORMAT_DV 0x0CU -#define VS_COLORFORMAT 0x0DU -#define VS_FORMAT_FRAME_BASED 0x10U -#define VS_FRAME_FRAME_BASED 0x11U -#define VS_FORMAT_STREAM_BASED 0x12U - -/* Video Class-Specific Request values */ -#define UVC_RQ_UNDEFINED 0x00U -#define UVC_SET_CUR 0x01U -#define UVC_GET_CUR 0x81U -#define UVC_GET_MIN 0x82U -#define UVC_GET_MAX 0x83U -#define UVC_GET_RES 0x84U -#define UVC_GET_LEN 0x85U -#define UVC_GET_INFO 0x86U -#define UVC_GET_DEF 0x87U - -/* VideoControl Interface Control Selectors */ -#define VC_CONTROL_UNDEFINED 0x00U -#define VC_VIDEO_POWER_MODE_CONTROL 0x01U -#define VC_REQUEST_ERROR_CODE_CONTROL 0x02U - -/* Request Error Code Control */ -#define UVC_NO_ERROR_ERR 0x00U -#define UVC_NOT_READY_ERR 0x01U -#define UVC_WRONG_STATE_ERR 0x02U -#define UVC_POWER_ERR 0x03U -#define UVC_OUT_OF_RANGE_ERR 0x04U -#define UVC_INVALID_UNIT_ERR 0x05U -#define UVC_INVALID_CONTROL_ERR 0x06U -#define UVC_INVALID_REQUEST_ERR 0x07U -#define UVC_UNKNOWN_ERR 0xFFU - -/*Terminal Control Selectors*/ -#define TE_CONTROL_UNDEFINED 0x00U - -/* Selector Unit Control Selectors */ -#define SU_CONTROL_UNDEFINED 0x00U -#define SU_INPUT_SELECT_CONTROL 0x01U - -/* Camera Terminal Control Selectors */ -#define CT_CONTROL_UNDEFINED 0x00U -#define CT_SCANNING_MODE_CONTROL 0x01U -#define CT_AE_MODE_CONTROL 0x02U -#define CT_AE_PRIORITY_CONTROL 0x03U -#define CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04U -#define CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05U -#define CT_FOCUS_ABSOLUTE_CONTROL 0x06U -#define CT_FOCUS_RELATIVE_CONTROL 0x07U -#define CT_FOCUS_AUTO_CONTROL 0x08U -#define CT_IRIS_ABSOLUTE_CONTROL 0x09U -#define CT_IRIS_RELATIVE_CONTROL 0x0AU -#define CT_ZOOM_ABSOLUTE_CONTROL 0x0BU -#define CT_ZOOM_RELATIVE_CONTROL 0x0CU -#define CT_PANTILT_ABSOLUTE_CONTROL 0x0DU -#define CT_PANTILT_RELATIVE_CONTROL 0x0EU -#define CT_ROLL_ABSOLUTE_CONTROL 0x0FU -#define CT_ROLL_RELATIVE_CONTROL 0x10U -#define CT_PRIVACY_CONTROL 0x11U - -/* Processing Unit Control Selectors */ -#define PU_CONTROL_UNDEFINED 0x00U -#define PU_BACKLIGHT_COMPENSATION_CONTROL 0x01U -#define PU_BRIGHTNESS_CONTROL 0x02U -#define PU_CONTRAST_CONTROL 0x03U -#define PU_GAIN_CONTROL 0x04U -#define PU_POWER_LINE_FREQUENCY_CONTROL 0x05U -#define PU_HUE_CONTROL 0x06U -#define PU_SATURATION_CONTROL 0x07U -#define PU_SHARPNESS_CONTROL 0x08U -#define PU_GAMMA_CONTROL 0x09U -#define PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0AU -#define PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0BU -#define PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0CU -#define PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0DU -#define PU_DIGITAL_MULTIPLIER_CONTROL 0x0EU -#define PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0FU -#define PU_HUE_AUTO_CONTROL 0x10U -#define PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11U -#define PU_ANALOG_LOCK_STATUS_CONTROL 0x12U - -/*Extension Unit Control Selectors */ -#define XU_CONTROL_UNDEFINED 0x00U - -/* VideoStreaming Interface Control Selectors */ -#define VS_CONTROL_UNDEFINED 0x00U -#define VS_PROBE_CONTROL 0x100U -#define VS_COMMIT_CONTROL 0x200U -#define VS_STILL_PROBE_CONTROL 0x03U -#define VS_STILL_COMMIT_CONTROL 0x04U -#define VS_STILL_IMAGE_TRIGGER_CONTROL 0x05U -#define VS_STREAM_ERROR_CODE_CONTROL 0x06U -#define VS_GENERATE_KEY_FRAME_CONTROL 0x07U -#define VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08U -#define VS_SYNC_DELAY_CONTROL 0x09U - - -/* Control Capabilities */ -#define UVC_SUPPORTS_GET 0x01U -#define UVC_SUPPORTS_SET 0x02U -#define UVC_STATE_DISABLED 0x04U -#define UVC_AUTOUPDATE_CONTROL 0x08U -#define UVC_ASYNCHRONOUS_CONTROL 0x10U - -/* USB Terminal Types */ -#define TT_VENDOR_SPECIFIC 0x0100U -#define TT_STREAMING 0x0101U - -/* Input Terminal Types */ -#define ITT_VENDOR_SPECIFIC 0x0200U -#define ITT_CAMERA 0x0201U -#define ITT_MEDIA_TRANSPORT_INPUT 0x0202U - -/*Output Terminal Types */ -#define OTT_VENDOR_SPECIFIC 0x0300U -#define OTT_DISPLAY 0x0301U -#define OTT_MEDIA_TRANSPORT_OUTPUT 0x0302U - -/* External Terminal Types */ -#define EXTERNAL_VENDOR_SPECIFIC 0x0400U -#define COMPOSITE_CONNECTOR 0x0401U -#define SVIDEO_CONNECTOR 0x0402U -#define COMPONENT_CONNECTOR 0x0403U - - -/* VIDEO Commands enumeration */ -typedef enum -{ - VIDEO_CMD_START = 1U, - VIDEO_CMD_PLAY, - VIDEO_CMD_STOP, -} VIDEO_CMD_TypeDef; - -typedef enum -{ - VIDEO_OFFSET_NONE = 0U, - VIDEO_OFFSET_HALF, - VIDEO_OFFSET_FULL, - VIDEO_OFFSET_UNKNOWN, -} VIDEO_OffsetTypeDef; - -typedef struct -{ - uint8_t cmd; - uint8_t data[USB_MAX_EP0_SIZE]; - uint8_t len; - uint8_t unit; -} USBD_VIDEO_ControlTypeDef; - -typedef struct -{ - uint32_t interface; - uint32_t uvc_state; - uint32_t uvc_size; - uint8_t *uvc_buffer; - VIDEO_OffsetTypeDef offset; - USBD_VIDEO_ControlTypeDef control; -} USBD_VIDEO_HandleTypeDef; - -typedef struct -{ - int8_t (* Init)(void); - int8_t (* DeInit)(void); - int8_t (* Control)(uint8_t, uint8_t *, uint16_t); - int8_t (* Data)(uint8_t **, uint16_t *, uint16_t *); -} USBD_VIDEO_ItfTypeDef; - -/* UVC uses only 26 first bytes */ -typedef struct -{ - uint16_t bmHint; - uint8_t bFormatIndex; - uint8_t bFrameIndex; - uint32_t dwFrameInterval; - uint16_t wKeyFrameRate; - uint16_t wPFrameRate; - uint16_t wCompQuality; - uint16_t wCompWindowSize; - uint16_t wDelay; - uint32_t dwMaxVideoFrameSize; - uint32_t dwMaxPayloadTransferSize; - uint32_t dwClockFrequency; - uint8_t bmFramingInfo; - uint8_t bPreferedVersion; - uint8_t bMinVersion; - uint8_t bMaxVersion; -} __PACKED USBD_VideoControlTypeDef; - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bInterfaceNumber; - uint8_t bAlternateSetting; - uint8_t bNumEndpoints; - uint8_t bInterfaceClass; - uint8_t bInterfaceSubClass; - uint8_t bInterfaceProtocol; - uint8_t iFunction; -} __PACKED USBD_StandardVCIfDescTypeDef; - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint16_t bcdUVC; - uint16_t wTotalLength; - uint32_t dwClockFrequency; - uint8_t baInterfaceNr; - uint8_t iTerminal; -} __PACKED USBD_specificVCInDescTypeDef; - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bTerminalID; - uint16_t wTerminalType; - uint8_t bAssocTerminal; - uint8_t iTerminal; -} __PACKED USBD_InputTerminalDescTypeDef; - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint8_t bTerminalID; - uint16_t wTerminalType; - uint8_t bAssocTerminal; - uint8_t bSourceID; - uint8_t iTerminal; -} __PACKED USBD_OutputTerminalDescTypeDef; - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubtype; - uint16_t bNumFormats; - uint8_t bVideoControlSize; - uint8_t bEndPointAddress; - uint8_t bmInfo; - uint8_t bTerminalLink; - uint8_t bStillCaptureMethod; - uint8_t bTriggerSupport; - uint8_t bTriggerUsage; - uint8_t bControlSize; - uint8_t bmaControls; -} __PACKED USBD_ClassSpecificVsHeaderDescTypeDef; - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubType; - uint8_t bFormatIndex; - uint8_t bNumFrameDescriptor; -#ifdef USBD_UVC_FORMAT_UNCOMPRESSED - uint8_t pGiudFormat[USBD_VC_GIUD_FORMAT_SIZE]; - uint8_t bBitsPerPixel; -#else - uint8_t bmFlags; -#endif /* USBD_UVC_FORMAT_UNCOMPRESSED */ - uint8_t bDefaultFrameIndex; - uint8_t bAspectRatioX; - uint8_t bAspectRatioY; - uint8_t bInterlaceFlags; - uint8_t bCopyProtect; -} __PACKED USBD_PayloadFormatDescTypeDef; - -#ifdef USBD_UVC_FORMAT_UNCOMPRESSED -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubType; - uint8_t bColorPrimarie; - uint8_t bTransferCharacteristics; - uint8_t bMatrixCoefficients; -} __PACKED USBD_ColorMatchingDescTypeDef; -#endif /* USBD_UVC_FORMAT_UNCOMPRESSED */ - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bEndpointAddress; - uint8_t bmAttributes; - uint16_t wMaxPacketSize; - uint8_t bInterval; -} __PACKED USBD_StandardVCDataEPDescTypeDef; - -typedef struct -{ - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bDescriptorSubType; - uint8_t bFrameIndex; - uint8_t bmCapabilities; - uint16_t wWidth; - uint16_t wHeight; - uint32_t dwMinBitRate; - uint32_t dwMaxBitRate; - uint32_t dwMaxVideoFrameBufSize; - uint32_t dwDefaultFrameInterval; - uint8_t bFrameIntervalType; - uint32_t dwMinFrameInterval; -} __PACKED USBD_VIDEO_VSFrameDescTypeDef; - -extern USBD_ClassTypeDef USBD_VIDEO; -#define USBD_VIDEO_CLASS &USBD_VIDEO -/** - * @} - */ - -/** @defgroup USB_CORE_Exported_Functions - * @{ - */ - -uint8_t USBD_VIDEO_RegisterInterface(USBD_HandleTypeDef *pdev, USBD_VIDEO_ItfTypeDef *fops); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* _USBD_VIDEO_H_ */ diff --git a/Class/VIDEO/Inc/usbd_video_if_template.h b/Class/VIDEO/Inc/usbd_video_if_template.h deleted file mode 100644 index bc5b8fa..0000000 --- a/Class/VIDEO/Inc/usbd_video_if_template.h +++ /dev/null @@ -1,156 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_video_if_template.h - * @author MCD Application Team - * @brief Template Header file for the video Interface application layer functions - ****************************************************************************** - * @attention - * - * Copyright (c) 2020 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_VIDEO_IF_H__ -#define __USBD_VIDEO_IF_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_video.h" - -/* USER CODE BEGIN INCLUDE */ - -/* USER CODE END INCLUDE */ - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @brief For Usb device. - * @{ - */ - -/** @defgroup USBD_VIDEO_IF - * @brief Usb VIDEO interface device module. - * @{ - */ - -/** @defgroup USBD_VIDEO_IF_Exported_Defines - * @brief Defines. - * @{ - */ - -/* USER CODE BEGIN EXPORTED_DEFINES */ - -/* USER CODE END EXPORTED_DEFINES */ - -/** - * @} - */ - -/** @defgroup USBD_VIDEO_IF_Exported_Types - * @brief Types. - * @{ - */ - -/* USER CODE BEGIN EXPORTED_TYPES */ - -/* USER CODE END EXPORTED_TYPES */ - -/** - * @} - */ - -/** @defgroup USBD_VIDEO_IF_Exported_Macros - * @brief Aliases. - * @{ - */ - -/* USER CODE BEGIN EXPORTED_MACRO */ - -/* USER CODE END EXPORTED_MACRO */ - -/** - * @} - */ - -/** @defgroup USBD_VIDEO_IF_Exported_Variables - * @brief Public variables. - * @{ - */ - -/** VIDEO_IF Interface callback. */ -extern USBD_VIDEO_ItfTypeDef USBD_VIDEO_fops_FS; - -/* USER CODE BEGIN EXPORTED_VARIABLES */ - -/* USER CODE END EXPORTED_VARIABLES */ - -/** - * @} - */ - -/** @defgroup USBD_VIDEO_IF_Exported_FunctionsPrototype - * @brief Public functions declaration. - * @{ - */ - -/** - * @brief Manages the DMA full transfer complete event. - * @retval None - */ -void TransferComplete_CallBack_FS(void); - -/** - * @brief Manages the DMA half transfer complete event. - * @retval None - */ -void HalfTransfer_CallBack_FS(void); - - - -#define IMG_NBR 1U -#define IMAGE_SIZE 0x1U - -const uint8_t image[] = {0x00}; -const uint8_t *tImagesList[] = {image}; -uint16_t tImagesSizes[] = {IMAGE_SIZE}; - -/* Time laps between video frames in ms. - Please adjust this value depending on required speed. - Please note that this define uses the system HAL_Delay() which uses the systick. - In case of changes on HAL_Delay, please ensure the values in ms correspond. */ -#ifdef USE_USB_HS -#define USBD_VIDEO_IMAGE_LAPS 160U -#else -#define USBD_VIDEO_IMAGE_LAPS 80U -#endif /* USE_USB_HS */ - -/* USER CODE BEGIN EXPORTED_FUNCTIONS */ - -/* USER CODE END EXPORTED_FUNCTIONS */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* USBD_VIDEO_IF_H_ */ - diff --git a/Class/VIDEO/Src/usbd_video.c b/Class/VIDEO/Src/usbd_video.c deleted file mode 100644 index 0e580ba..0000000 --- a/Class/VIDEO/Src/usbd_video.c +++ /dev/null @@ -1,1092 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_video.c - * @author MCD Application Team - * @brief This file provides the Video core functions. - * - ****************************************************************************** - * @attention - * - * Copyright (c) 2020 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - * @verbatim - * - * =================================================================== - * VIDEO Class Description - * =================================================================== - * This driver manages the Video Class 1.1 following the "USB Device Class Definition for - * Video Devices V1.0 Mar 18, 98". - * This driver implements the following aspects of the specification: - * - Device descriptor management - * - Configuration descriptor management - * - Interface Association Descriptor - * -Standard VC Interface Descriptor = interface 0 - * -Standard Vs Interface Descriptor = interface 1 - * - 1 Video Streaming Interface - * - 1 Video Streaming Endpoint - * - 1 Video Terminal Input (camera) - * - Video Class-Specific AC Interfaces - * - Video Class-Specific AS Interfaces - * - VideoControl Requests - * - Video Synchronization type: Asynchronous - * The current Video class version supports the following Video features: - * - image JPEG format - * - Asynchronous Endpoints - * - * @note In HS mode and when the USB DMA is used, all variables and data structures - * dealing with the DMA during the transaction process should be 32-bit aligned. - * - * - * @endverbatim - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_video.h" -#include "usbd_ctlreq.h" -#include "usbd_core.h" -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - -/** @defgroup USBD_VIDEO - * @brief USB Device Video Class core module - * @{ - */ - -/** @defgroup USBD_VIDEO_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_VIDEO_Private_Defines - * @{ - */ - -/** - * @} - */ - - -/** @defgroup USBD_VIDEO_Private_Macros - * @{ - */ - -/* VIDEO Device library callbacks */ -static uint8_t USBD_VIDEO_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_VIDEO_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_VIDEO_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); - -#ifndef USE_USBD_COMPOSITE -static uint8_t *USBD_VIDEO_GetFSCfgDesc(uint16_t *length); -static uint8_t *USBD_VIDEO_GetHSCfgDesc(uint16_t *length); -static uint8_t *USBD_VIDEO_GetOtherSpeedCfgDesc(uint16_t *length); -static uint8_t *USBD_VIDEO_GetDeviceQualifierDesc(uint16_t *length); -#endif /* USE_USBD_COMPOSITE */ - -static uint8_t USBD_VIDEO_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_VIDEO_SOF(USBD_HandleTypeDef *pdev); -static uint8_t USBD_VIDEO_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); - -/* VIDEO Requests management functions */ -static void VIDEO_REQ_GetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void VIDEO_REQ_SetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); - -#ifndef USE_USBD_COMPOSITE -static void *USBD_VIDEO_GetVSFrameDesc(uint8_t *pConfDesc); -#endif /* USE_USBD_COMPOSITE */ - -static void *USBD_VIDEO_GetVideoHeaderDesc(uint8_t *pConfDesc); - -/** - * @} - */ - -/** @defgroup USBD_VIDEO_Private_Variables - * @{ - */ - -USBD_ClassTypeDef USBD_VIDEO = -{ - USBD_VIDEO_Init, - USBD_VIDEO_DeInit, - USBD_VIDEO_Setup, - NULL, - NULL, - USBD_VIDEO_DataIn, - NULL, - USBD_VIDEO_SOF, - USBD_VIDEO_IsoINIncomplete, - NULL, -#ifdef USE_USBD_COMPOSITE - NULL, - NULL, - NULL, - NULL, -#else - USBD_VIDEO_GetHSCfgDesc, - USBD_VIDEO_GetFSCfgDesc, - USBD_VIDEO_GetOtherSpeedCfgDesc, - USBD_VIDEO_GetDeviceQualifierDesc, -#endif /* USE_USBD_COMPOSITE */ -}; - -/* USB VIDEO device Configuration Descriptor (same for all speeds thanks to user defines) */ -__ALIGN_BEGIN static uint8_t USBD_VIDEO_CfgDesc[] __ALIGN_END = -{ - /* Configuration 1 */ - USB_CONF_DESC_SIZE, /* bLength: Configuration Descriptor size */ - USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ - LOBYTE(UVC_CONFIG_DESC_SIZ), /* wTotalLength: no of returned bytes */ - HIBYTE(UVC_CONFIG_DESC_SIZ), - 0x02, /* bNumInterfaces: 2 interfaces */ - 0x01, /* bConfigurationValue: Configuration value */ - 0x00, /* iConfiguration: Index of string descriptor - describing the configuration */ -#if (USBD_SELF_POWERED == 1U) - 0xC0, /* bmAttributes: Bus Powered according to user configuration */ -#else - 0x80, /* bmAttributes: Bus Powered according to user configuration */ -#endif /* USBD_SELF_POWERED */ - USBD_MAX_POWER, /* bMaxPower in mA according to user configuration */ - - /* Interface Association Descriptor */ - USB_IAD_DESC_SIZE, /* bLength: Interface Association Descriptor size */ - USB_DESC_TYPE_IAD, /* bDescriptorType: interface association */ - 0x00, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - UVC_CC_VIDEO, /* bFunctionClass: Video class */ - SC_VIDEO_INTERFACE_COLLECTION, /* bFunctionSubClass: Video Interface Collection */ - PC_PROTOCOL_UNDEFINED, /* bInterfaceProtocol: protocol undefined */ - 0x00, /* iFunction */ - - /* Standard VC (Video Control) Interface Descriptor = interface 0 */ - USB_IF_DESC_SIZE, /* bLength: interface descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: interface */ - UVC_VC_IF_NUM, /* bInterfaceNumber: interface number */ - 0x00, /* bAlternateSetting: index of this alternate setting */ - 0x00, /* bNumEndpoints: No endpoints used for this interface */ - UVC_CC_VIDEO, /* bInterfaceClass: Video Class */ - SC_VIDEOCONTROL, /* bInterfaceSubClass: Video Control */ - PC_PROTOCOL_UNDEFINED, /* bInterfaceProtocol: protocol is undefined */ - 0x00, /* iFunction: index of string descriptor relative to this item */ - - /* Class-specific VC Interface Descriptor */ - VIDEO_VC_IF_HEADER_DESC_SIZE, /* bLength */ - CS_INTERFACE, /* bDescriptorType */ - VC_HEADER, /* bDescriptorSubtype */ - LOBYTE(UVC_VERSION), - HIBYTE(UVC_VERSION), /* bcdUVC: UVC1.0 or UVC1.1 revision */ - VS_FRAME_DESC_SIZE, /* wTotalLength: total size of class-specific descriptors */ - 0x00, - 0x00, /* dwClockFrequency: not used. 48 Mhz value is set, but not used */ - 0x6C, - 0xDC, - 0x02, - 0x01, /* bInCollection: number of streaming interfaces */ - 0x01, /* baInterfaceNr(1): VideoStreaming interface 1 is part - of VC interface */ - /* Input Terminal Descriptor */ - VIDEO_IN_TERMINAL_DESC_SIZE, /* bLength: Input terminal descriptor size */ - CS_INTERFACE, /* bDescriptorType: INTERFACE */ - VC_INPUT_TERMINAL, /* bDescriptorSubtype: INPUT_TERMINAL */ - 0x01, /* bTerminalID: ID of this Terminal */ - LOBYTE(ITT_VENDOR_SPECIFIC), /* wTerminalType: 0x0200 ITT_VENDOR_SPECIFIC */ - HIBYTE(ITT_VENDOR_SPECIFIC), - 0x00, /* bAssocTerminal: no Terminal is associated */ - 0x00, /* iTerminal: index of string descriptor relative to this item */ - - /* Output Terminal Descriptor */ - VIDEO_OUT_TERMINAL_DESC_SIZE, /* bLength: output terminal descriptor size */ - CS_INTERFACE, /* bDescriptorType */ - VC_OUTPUT_TERMINAL, /* bDescriptorSubtype */ - 0x02, /* bTerminalID */ - LOBYTE(TT_STREAMING), /* wTerminalType: USB streaming terminal */ - HIBYTE(TT_STREAMING), - 0x00, /* bAssocTerminal: no Terminal is associated */ - 0x01, /* bSourceID: input is connected to output unit ID 1 */ - 0x00, /* iTerminal: index of string descriptor relative to this item */ - - /* Standard VS (Video Streaming) Interface Descriptor = interface 1, alternate setting 0 = Zero Bandwidth - (when no data are sent from the device) */ - USB_IF_DESC_SIZE, /* bLength: interface descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType */ - UVC_VS_IF_NUM, /* bInterfaceNumber */ - 0x00, /* bAlternateSetting */ - 0x00, /* bNumEndpoints: no endpoints used for alternate setting 0 */ - UVC_CC_VIDEO, /* bInterfaceClass */ - SC_VIDEOSTREAMING, /* bInterfaceSubClass */ - PC_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ - 0x00, /* iInterface: index of string descriptor relative to this item */ - - /* Class-specific VS Header Descriptor (Input) */ - VIDEO_VS_IF_IN_HEADER_DESC_SIZE, /* bLength */ - CS_INTERFACE, /* bDescriptorType */ - VS_INPUT_HEADER, /* bDescriptorSubtype */ - 0x01, /* bNumFormats: 1 format descriptor is used */ - VC_HEADER_SIZE, - 0x00, /* Total size of Video Control Specific Descriptors */ - UVC_IN_EP, /* bEndPointAddress: In endpoint is used for the alternate setting */ - 0x00, /* bmInfo: dynamic format change not supported */ - 0x02, /* bTerminalLink: output to terminal ID 2 */ - 0x00, /* bStillCaptureMethod: not supported */ - 0x00, /* bTriggerSupport: not supported */ - 0x00, /* bTriggerUsage: not supported */ - 0x01, /* bControlSize: 1 byte field size */ - 0x00, /* bmaControls: No specific controls used */ - - /* Payload Format Descriptor */ - VS_FORMAT_DESC_SIZE, /* blength */ - CS_INTERFACE, /* bDescriptorType */ - VS_FORMAT_SUBTYPE, /* bDescriptorSubType */ - 0x01, /* bFormatIndex */ - 0x01, /* bNumFrameDescriptor */ -#ifdef USBD_UVC_FORMAT_UNCOMPRESSED - DBVAL(UVC_UNCOMPRESSED_GUID), /* Giud Format: YUY2 {32595559-0000-0010-8000-00AA00389B71} */ - 0x00, 0x00, - 0x10, 0x00, - 0x80, 0x00, - 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71, - UVC_BITS_PER_PIXEL, /* bBitsPerPixel : Number of bits per pixel */ -#else - 0x01, /* bmFlags: FixedSizeSamples */ -#endif /* USBD_UVC_FORMAT_UNCOMPRESSED */ - 0x01, /* bDefaultFrameIndex: default frame used is frame 1 - (only one frame used) */ - 0x00, /* bAspectRatioX: not required by specification */ - 0x00, /* bAspectRatioY: not required by specification */ - 0x00, /* bInterlaceFlags: non interlaced stream */ - 0x00, /* bCopyProtect: no protection restrictions */ - - /* Class-specific VS (Video Streaming) Frame Descriptor */ - VS_FRAME_DESC_SIZE, /* bLength */ - CS_INTERFACE, /* bDescriptorType */ - VS_FRAME_SUBTYPE, /* bDescriptorSubType */ - 0x01, /* bFrameIndex */ -#ifdef USBD_UVC_FORMAT_UNCOMPRESSED - 0x00, /* bmCapabilities: no till image capture */ -#else - 0x02, /* bmCapabilities: fixed frame rate supported */ -#endif /* USBD_UVC_FORMAT_UNCOMPRESSED */ - WBVAL(UVC_WIDTH), /* wWidth: Image Frame Width */ - WBVAL(UVC_HEIGHT), /* wHeight: Image Frame Height */ - DBVAL(UVC_MIN_BIT_RATE(UVC_CAM_FPS_FS)), /* dwMinBitRate: Minimum supported bit rate in bits/s */ - DBVAL(UVC_MAX_BIT_RATE(UVC_CAM_FPS_FS)), /* dwMaxBitRate: Maximum supported bit rate in bits/s */ - DBVAL(UVC_MAX_FRAME_SIZE), /* dwMaxVideoFrameBufSize: Maximum video frame size, in bytes */ - DBVAL(UVC_INTERVAL(UVC_CAM_FPS_FS)), /* dwDefaultFrameInterval: following number of FPS */ - 0x01, /* bFrameIntervalType: Discrete frame interval type */ - DBVAL(UVC_INTERVAL(UVC_CAM_FPS_FS)), /* dwMinFrameInterval: One supported value of interval (FPS) */ - -#ifdef USBD_UVC_FORMAT_UNCOMPRESSED - /* Color Matching Descriptor */ - VS_COLOR_MATCHING_DESC_SIZE, /* bLength */ - CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */ - VS_COLORFORMAT, /* bDescriptorSubType: VS_COLORFORMAT */ - UVC_COLOR_PRIMARIE, /* bColorPrimarie: 1: BT.709, sRGB (default) */ - UVC_TFR_CHARACTERISTICS, /* bTransferCharacteristics: 1: BT.709 (default) */ - UVC_MATRIX_COEFFICIENTS, /* bMatrixCoefficients: 4: BT.601, (default) */ -#endif /* USBD_UVC_FORMAT_UNCOMPRESSED */ - - /* Standard VS Interface Descriptor = interface 1, alternate setting 1 = data transfer mode */ - USB_IF_DESC_SIZE, /* bLength */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType */ - UVC_VS_IF_NUM, /* bInterfaceNumber */ - 0x01, /* bAlternateSetting */ - 0x01, /* bNumEndpoints: one endpoint is used */ - UVC_CC_VIDEO, /* bInterfaceClass */ - SC_VIDEOSTREAMING, /* bInterfaceSubClass */ - PC_PROTOCOL_UNDEFINED, /* bInterfaceProtocol */ - 0x00, /* iInterface: index of string descriptor relative to this item */ - - /* Standard VS (Video Streaming) data Endpoint */ - USB_EP_DESC_SIZE, /* bLength */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType */ - UVC_IN_EP, /* bEndpointAddress */ - 0x05, /* bmAttributes: ISO transfer */ - LOBYTE(UVC_ISO_FS_MPS), /* wMaxPacketSize */ - LOBYTE(UVC_ISO_FS_MPS), - 0x01, /* bInterval: 1 frame interval */ -}; - -#ifndef USE_USBD_COMPOSITE -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_VIDEO_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = -{ - USB_LEN_DEV_QUALIFIER_DESC, - USB_DESC_TYPE_DEVICE_QUALIFIER, - 0x00, - 0x02, - 0xEF, - 0x02, - 0x01, - 0x40, - 0x01, - 0x00, -}; -#endif /* USE_USBD_COMPOSITE */ - -static uint8_t VIDEOinEpAdd = UVC_IN_EP; - -/* Video Commit data structure */ -static USBD_VideoControlTypeDef video_Commit_Control = -{ - .bmHint = 0x0000U, - .bFormatIndex = 0x01U, - .bFrameIndex = 0x01U, - .dwFrameInterval = UVC_INTERVAL(UVC_CAM_FPS_FS), - .wKeyFrameRate = 0x0000U, - .wPFrameRate = 0x0000U, - .wCompQuality = 0x0000U, - .wCompWindowSize = 0x0000U, - .wDelay = 0x0000U, - .dwMaxVideoFrameSize = 0x0000U, - .dwMaxPayloadTransferSize = 0x00000000U, - .dwClockFrequency = 0x00000000U, - .bmFramingInfo = 0x00U, - .bPreferedVersion = 0x00U, - .bMinVersion = 0x00U, - .bMaxVersion = 0x00U, -}; - -/* Video Probe data structure */ -static USBD_VideoControlTypeDef video_Probe_Control = -{ - .bmHint = 0x0000U, - .bFormatIndex = 0x01U, - .bFrameIndex = 0x01U, - .dwFrameInterval = UVC_INTERVAL(UVC_CAM_FPS_FS), - .wKeyFrameRate = 0x0000U, - .wPFrameRate = 0x0000U, - .wCompQuality = 0x0000U, - .wCompWindowSize = 0x0000U, - .wDelay = 0x0000U, - .dwMaxVideoFrameSize = 0x0000U, - .dwMaxPayloadTransferSize = 0x00000000U, - .dwClockFrequency = 0x00000000U, - .bmFramingInfo = 0x00U, - .bPreferedVersion = 0x00U, - .bMinVersion = 0x00U, - .bMaxVersion = 0x00U, -}; - -/** - * @} - */ - -/** @defgroup USBD_VIDEO_Private_Functions - * @{ - */ - -/** - * @brief USBD_VIDEO_Init - * Initialize the VIDEO interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_VIDEO_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - USBD_VIDEO_HandleTypeDef *hVIDEO; - - /* Allocate memory for the video control structure */ - hVIDEO = (USBD_VIDEO_HandleTypeDef *)USBD_malloc(sizeof(USBD_VIDEO_HandleTypeDef)); - - /* Check if allocated point is NULL, then exit with error code */ - if (hVIDEO == NULL) - { - return (uint8_t)USBD_FAIL; - } - - /* Assign the pClassData pointer to the allocated structure */ - pdev->pClassDataCmsit[pdev->classId] = (void *)hVIDEO; - pdev->pClassData = pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - VIDEOinEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_ISOC, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Open EP IN */ - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - (void)USBD_LL_OpenEP(pdev, VIDEOinEpAdd, USBD_EP_TYPE_ISOC, UVC_ISO_HS_MPS); - - pdev->ep_in[VIDEOinEpAdd & 0xFU].is_used = 1U; - pdev->ep_in[VIDEOinEpAdd & 0xFU].maxpacket = UVC_ISO_HS_MPS; - } - else - { - (void)USBD_LL_OpenEP(pdev, VIDEOinEpAdd, USBD_EP_TYPE_ISOC, UVC_ISO_FS_MPS); - - pdev->ep_in[VIDEOinEpAdd & 0xFU].is_used = 1U; - pdev->ep_in[VIDEOinEpAdd & 0xFU].maxpacket = UVC_ISO_FS_MPS; - } - - /* Init physical Interface components */ - ((USBD_VIDEO_ItfTypeDef *)pdev->pUserData[pdev->classId])->Init(); - - /* Init Xfer states */ - hVIDEO->interface = 0U; - - /* Some calls to unused variables, to comply with MISRA-C 2012 rules */ - UNUSED(USBD_VIDEO_CfgDesc); - UNUSED(cfgidx); - - /* Exit with no error code */ - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_VIDEO_DeInit - * DeInitialize the VIDEO layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_VIDEO_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - - /* Check if the video structure pointer is valid */ - if (pdev->pClassDataCmsit[pdev->classId] == NULL) - { - return (uint8_t)USBD_FAIL; - } - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - VIDEOinEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_ISOC, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Close EP IN */ - (void)USBD_LL_CloseEP(pdev, VIDEOinEpAdd); - pdev->ep_in[VIDEOinEpAdd & 0xFU].is_used = 0U; - - /* DeInit physical Interface components */ - ((USBD_VIDEO_ItfTypeDef *)pdev->pUserData[pdev->classId])->DeInit(); - USBD_free(pdev->pClassDataCmsit[pdev->classId]); - pdev->pClassDataCmsit[pdev->classId] = NULL; - pdev->pClassData = NULL; - - /* Exit with no error code */ - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_VIDEO_Setup - * Handle the VIDEO specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t USBD_VIDEO_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_VIDEO_HandleTypeDef *hVIDEO = (USBD_VIDEO_HandleTypeDef *) pdev->pClassDataCmsit[pdev->classId]; - uint8_t ret = (uint8_t)USBD_OK; - uint16_t status_info = 0U; - uint16_t len; - uint8_t *pbuf; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - VIDEOinEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_ISOC, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - /* Class Requests -------------------------------*/ - case USB_REQ_TYPE_CLASS: - switch (req->bRequest) - { - case UVC_GET_CUR: - case UVC_GET_DEF: - case UVC_GET_MIN: - case UVC_GET_MAX: - VIDEO_REQ_GetCurrent(pdev, req); - break; - - case UVC_GET_RES: - case UVC_GET_LEN: - case UVC_GET_INFO: - break; - - case UVC_SET_CUR: - VIDEO_REQ_SetCurrent(pdev, req); - break; - - default: - (void) USBD_CtlError(pdev, req); - ret = (uint8_t)USBD_FAIL; - break; - } - break; - - /* Standard Requests -------------------------------*/ - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_STATUS: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void) USBD_CtlSendData(pdev, (uint8_t *)&status_info, 2U); - } - else - { - USBD_CtlError(pdev, req); - ret = (uint8_t)USBD_FAIL; - } - break; - - case USB_REQ_GET_DESCRIPTOR: - if ((req->wValue >> 8) == CS_DEVICE) - { - pbuf = (uint8_t *)USBD_VIDEO_GetVideoHeaderDesc(pdev->pConfDesc); - if (pbuf != NULL) - { - len = MIN((uint16_t)USB_CONF_DESC_SIZE, (uint16_t)req->wLength); - (void)USBD_CtlSendData(pdev, pbuf, len); - } - else - { - USBD_CtlError(pdev, req); - ret = (uint8_t)USBD_FAIL; - } - } - break; - - case USB_REQ_GET_INTERFACE : - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void)USBD_CtlSendData(pdev, (uint8_t *)&hVIDEO->interface, 1U); - } - else - { - USBD_CtlError(pdev, req); - ret = (uint8_t)USBD_FAIL; - } - break; - - case USB_REQ_SET_INTERFACE : - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (req->wValue <= USBD_MAX_NUM_INTERFACES) - { - hVIDEO->interface = LOBYTE(req->wValue); - if (hVIDEO->interface == 1U) - { - /* Start Streaming (First endpoint writing will be done on next SOF) */ - (void)USBD_LL_FlushEP(pdev, VIDEOinEpAdd); - hVIDEO->uvc_state = UVC_PLAY_STATUS_READY; - } - else - { - /* Stop Streaming */ - hVIDEO->uvc_state = UVC_PLAY_STATUS_STOP; - (void)USBD_LL_FlushEP(pdev, VIDEOinEpAdd); - } - } - else - { - /* Call the error management function (command will be NAKed) */ - USBD_CtlError(pdev, req); - ret = (uint8_t)USBD_FAIL; - } - } - else - { - USBD_CtlError(pdev, req); - ret = (uint8_t)USBD_FAIL; - } - break; - - case USB_REQ_CLEAR_FEATURE: - break; - - default: - USBD_CtlError(pdev, req); - ret = (uint8_t)USBD_FAIL; - break; - } - break; - - default: - USBD_CtlError(pdev, req); - ret = (uint8_t)USBD_FAIL; - break; - } - - return ret; -} - -/** - * @brief USBD_VIDEO_DataIn - * handle data IN Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_VIDEO_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - USBD_VIDEO_HandleTypeDef *hVIDEO = (USBD_VIDEO_HandleTypeDef *) pdev->pClassDataCmsit[pdev->classId]; - static uint8_t packet[UVC_PACKET_SIZE + (UVC_HEADER_PACKET_CNT * 2U)] = {0x00U}; - static uint8_t *Pcktdata = packet; - static uint16_t PcktIdx = 0U; - static uint16_t PcktSze = UVC_PACKET_SIZE; - static uint8_t payload_header[2] = {0x02U, 0x00U}; - uint8_t i = 0U; - uint32_t RemainData = 0U; - uint32_t DataOffset = 0U; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - VIDEOinEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_ISOC, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Check if the Streaming has already been started */ - if (hVIDEO->uvc_state == UVC_PLAY_STATUS_STREAMING) - { - /* Get the current packet buffer, index and size from the application layer */ - ((USBD_VIDEO_ItfTypeDef *)pdev->pUserData[pdev->classId])->Data(&Pcktdata, &PcktSze, &PcktIdx); - - /* Check if end of current image has been reached */ - if (PcktSze > 2U) - { - /* Check if this is the first packet in current image */ - if (PcktIdx == 0U) - { - /* Set the packet start index */ - payload_header[1] ^= 0x01U; - } - - RemainData = PcktSze; - - /* fill the Transmit buffer */ - while (RemainData > 0U) - { - packet[((DataOffset + 0U) * i)] = payload_header[0]; - packet[((DataOffset + 0U) * i) + 1U] = payload_header[1]; - - if (RemainData > pdev->ep_in[VIDEOinEpAdd & 0xFU].maxpacket) - { - DataOffset = pdev->ep_in[VIDEOinEpAdd & 0xFU].maxpacket; - (void)USBD_memcpy((packet + ((DataOffset + 0U) * i) + 2U), - Pcktdata + ((DataOffset - 2U) * i), (DataOffset - 2U)); - - RemainData -= DataOffset; - i++; - } - else - { - (void)USBD_memcpy((packet + ((DataOffset + 0U) * i) + 2U), - Pcktdata + ((DataOffset - 2U) * i), (RemainData - 2U)); - - RemainData = 0U; - } - } - } - else - { - /* Add the packet header */ - packet[0] = payload_header[0]; - packet[1] = payload_header[1]; - } - - hVIDEO->uvc_buffer = (uint8_t *)&packet; - hVIDEO->uvc_size = (uint32_t)PcktSze; - - /* Transmit the packet on Endpoint */ - (void)USBD_LL_Transmit(pdev, (uint8_t)(epnum | 0x80U), - hVIDEO->uvc_buffer, hVIDEO->uvc_size); - } - - /* Exit with no error code */ - return (uint8_t) USBD_OK; -} - -/** - * @brief USBD_VIDEO_SOF - * handle SOF event - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_VIDEO_SOF(USBD_HandleTypeDef *pdev) -{ - USBD_VIDEO_HandleTypeDef *hVIDEO = (USBD_VIDEO_HandleTypeDef *) pdev->pClassDataCmsit[pdev->classId]; - uint8_t payload[2] = {0x02U, 0x00U}; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - VIDEOinEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_ISOC, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - /* Check if the Streaming has already been started by SetInterface AltSetting 1 */ - if (hVIDEO->uvc_state == UVC_PLAY_STATUS_READY) - { - hVIDEO->uvc_buffer = (uint8_t *)&payload; - hVIDEO->uvc_size = 2U; - - /* Transmit the first packet indicating that Streaming is starting */ - (void)USBD_LL_Transmit(pdev, VIDEOinEpAdd, hVIDEO->uvc_buffer, hVIDEO->uvc_size); - - /* Enable Streaming state */ - hVIDEO->uvc_state = UVC_PLAY_STATUS_STREAMING; - } - - /* Exit with no error code */ - return (uint8_t)USBD_OK; -} - -/** - * @brief USBD_VIDEO_IsoINIncomplete - * handle data ISO IN Incomplete event - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_VIDEO_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - USBD_VIDEO_HandleTypeDef *hVIDEO = (USBD_VIDEO_HandleTypeDef *) pdev->pClassDataCmsit[pdev->classId]; - -#ifdef USE_USBD_COMPOSITE - /* Get the Endpoints addresses allocated for this class instance */ - VIDEOinEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_ISOC, (uint8_t)pdev->classId); -#endif /* USE_USBD_COMPOSITE */ - - if (epnum == (VIDEOinEpAdd & 0xFU)) - { - (void)USBD_LL_Transmit(pdev, VIDEOinEpAdd, hVIDEO->uvc_buffer, hVIDEO->uvc_size); - } - - return (uint8_t)USBD_OK; -} - -/** - * @brief VIDEO_Req_GetCurrent - * Handles the GET_CUR VIDEO control request. - * @param pdev: instance - * @param req: setup class request - * @retval status - */ -static void VIDEO_REQ_GetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_VIDEO_HandleTypeDef *hVIDEO; - hVIDEO = (USBD_VIDEO_HandleTypeDef *)(pdev->pClassDataCmsit[pdev->classId]); - static __IO uint8_t EntityStatus[8] = {0}; - - /* Reset buffer to zeros */ - (void) USBD_memset(hVIDEO->control.data, 0, USB_MAX_EP0_SIZE); - - /* Manage Video Control interface requests */ - if (LOBYTE(req->wIndex) == 0x00U) - { - if (HIBYTE(req->wValue) == 0x02U) - { - /* Get the status of the current requested Entity */ - EntityStatus[0] = 0x06U; - - /* Send current status */ - (void) USBD_CtlSendData(pdev, (uint8_t *)&EntityStatus, 1U); - } - else - { - /* Unknown request */ - USBD_CtlError(pdev, req); - } - } - /* Manage Video Streaming interface requests */ - else - { - if (LOBYTE(req->wValue) == (uint8_t)VS_PROBE_CONTROL) - { - /* Update bPreferedVersion, bMinVersion and bMaxVersion which must be set only by Device */ - video_Probe_Control.bPreferedVersion = 0x00U; - video_Probe_Control.bMinVersion = 0x00U; - video_Probe_Control.bMaxVersion = 0x00U; - video_Probe_Control.dwMaxVideoFrameSize = UVC_MAX_FRAME_SIZE; - - video_Probe_Control.dwClockFrequency = 0x02DC6C00U; - - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - video_Probe_Control.dwFrameInterval = (UVC_INTERVAL(UVC_CAM_FPS_HS)); - video_Probe_Control.dwMaxPayloadTransferSize = UVC_ISO_HS_MPS; - } - else - { - video_Probe_Control.dwFrameInterval = (UVC_INTERVAL(UVC_CAM_FPS_FS)); - video_Probe_Control.dwMaxPayloadTransferSize = UVC_ISO_FS_MPS; - } - - /* Probe Request */ - (void)USBD_CtlSendData(pdev, (uint8_t *)&video_Probe_Control, - MIN(req->wLength, sizeof(USBD_VideoControlTypeDef))); - } - else if (LOBYTE(req->wValue) == (uint8_t)VS_COMMIT_CONTROL) - { - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - video_Commit_Control.dwFrameInterval = (UVC_INTERVAL(UVC_CAM_FPS_HS)); - video_Commit_Control.dwMaxPayloadTransferSize = UVC_ISO_HS_MPS; - } - else - { - video_Commit_Control.dwFrameInterval = (UVC_INTERVAL(UVC_CAM_FPS_FS)); - video_Commit_Control.dwMaxPayloadTransferSize = UVC_ISO_FS_MPS; - } - - /* Commit Request */ - (void)USBD_CtlSendData(pdev, (uint8_t *)&video_Commit_Control, - MIN(req->wLength, sizeof(USBD_VideoControlTypeDef))); - } - else - { - /* Send the current state */ - (void) USBD_CtlSendData(pdev, hVIDEO->control.data, - MIN(req->wLength, USB_MAX_EP0_SIZE)); - } - } -} - -/** - * @brief VIDEO_Req_SetCurrent - * Handles the SET_CUR VIDEO control request. - * @param pdev: instance - * @param req: setup class request - * @retval status - */ -static void VIDEO_REQ_SetCurrent(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - - /* Check that the request has control data */ - if (req->wLength > 0U) - { - /* Prepare the reception of the buffer over EP0 */ - if (req->wValue == (uint16_t)VS_PROBE_CONTROL) - { - /* Probe Request */ - (void) USBD_CtlPrepareRx(pdev, (uint8_t *)&video_Probe_Control, - MIN(req->wLength, sizeof(USBD_VideoControlTypeDef))); - } - else if (req->wValue == (uint16_t)VS_COMMIT_CONTROL) - { - /* Commit Request */ - (void) USBD_CtlPrepareRx(pdev, (uint8_t *)&video_Commit_Control, - MIN(req->wLength, sizeof(USBD_VideoControlTypeDef))); - } - else - { - (void)USBD_LL_StallEP(pdev, 0x80U); - } - } -} - -#ifndef USE_USBD_COMPOSITE -/** - * @brief USBD_VIDEO_GetFSCfgDesc - * return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_VIDEO_GetFSCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpDesc = USBD_GetEpDesc(USBD_VIDEO_CfgDesc, VIDEOinEpAdd); - USBD_VIDEO_VSFrameDescTypeDef *pVSFrameDesc = USBD_VIDEO_GetVSFrameDesc(USBD_VIDEO_CfgDesc); - - if (pEpDesc != NULL) - { - pEpDesc->wMaxPacketSize = UVC_ISO_FS_MPS; - } - - if (pVSFrameDesc != NULL) - { - pVSFrameDesc->dwMinBitRate = UVC_MIN_BIT_RATE(UVC_CAM_FPS_FS); - pVSFrameDesc->dwMaxBitRate = UVC_MAX_BIT_RATE(UVC_CAM_FPS_FS); - pVSFrameDesc->dwDefaultFrameInterval = UVC_INTERVAL(UVC_CAM_FPS_FS); - pVSFrameDesc->dwMinFrameInterval = UVC_INTERVAL(UVC_CAM_FPS_FS); - } - - *length = (uint16_t)(sizeof(USBD_VIDEO_CfgDesc)); - return USBD_VIDEO_CfgDesc; -} - -/** - * @brief USBD_VIDEO_GetHSCfgDesc - * return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_VIDEO_GetHSCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpDesc = USBD_GetEpDesc(USBD_VIDEO_CfgDesc, VIDEOinEpAdd); - USBD_VIDEO_VSFrameDescTypeDef *pVSFrameDesc = USBD_VIDEO_GetVSFrameDesc(USBD_VIDEO_CfgDesc); - - if (pEpDesc != NULL) - { - pEpDesc->wMaxPacketSize = UVC_ISO_HS_MPS; - } - - if (pVSFrameDesc != NULL) - { - pVSFrameDesc->dwMinBitRate = UVC_MIN_BIT_RATE(UVC_CAM_FPS_HS); - pVSFrameDesc->dwMaxBitRate = UVC_MAX_BIT_RATE(UVC_CAM_FPS_HS); - pVSFrameDesc->dwDefaultFrameInterval = UVC_INTERVAL(UVC_CAM_FPS_HS); - pVSFrameDesc->dwMinFrameInterval = UVC_INTERVAL(UVC_CAM_FPS_HS); - } - - *length = (uint16_t)(sizeof(USBD_VIDEO_CfgDesc)); - return USBD_VIDEO_CfgDesc; -} - -/** - * @brief USBD_VIDEO_GetOtherSpeedCfgDesc - * return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_VIDEO_GetOtherSpeedCfgDesc(uint16_t *length) -{ - USBD_EpDescTypeDef *pEpDesc = USBD_GetEpDesc(USBD_VIDEO_CfgDesc, VIDEOinEpAdd); - USBD_VIDEO_VSFrameDescTypeDef *pVSFrameDesc = USBD_VIDEO_GetVSFrameDesc(USBD_VIDEO_CfgDesc); - - if (pEpDesc != NULL) - { - pEpDesc->wMaxPacketSize = UVC_ISO_FS_MPS; - } - - if (pVSFrameDesc != NULL) - { - pVSFrameDesc->dwMinBitRate = UVC_MIN_BIT_RATE(UVC_CAM_FPS_FS); - pVSFrameDesc->dwMaxBitRate = UVC_MAX_BIT_RATE(UVC_CAM_FPS_FS); - pVSFrameDesc->dwDefaultFrameInterval = UVC_INTERVAL(UVC_CAM_FPS_FS); - pVSFrameDesc->dwMinFrameInterval = UVC_INTERVAL(UVC_CAM_FPS_FS); - } - - *length = (uint16_t)(sizeof(USBD_VIDEO_CfgDesc)); - return USBD_VIDEO_CfgDesc; -} - -/** - * @brief DeviceQualifierDescriptor - * return Device Qualifier descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t *USBD_VIDEO_GetDeviceQualifierDesc(uint16_t *length) -{ - *length = (uint16_t)(sizeof(USBD_VIDEO_DeviceQualifierDesc)); - return USBD_VIDEO_DeviceQualifierDesc; -} - -/** - * @brief USBD_VIDEO_GetVSFrameDesc - * This function return the Video Endpoint descriptor - * @param pdev: device instance - * @param pConfDesc: pointer to Bos descriptor - * @retval pointer to video endpoint descriptor - */ -static void *USBD_VIDEO_GetVSFrameDesc(uint8_t *pConfDesc) -{ - USBD_DescHeaderTypeDef *pdesc = (USBD_DescHeaderTypeDef *)(void *)pConfDesc; - USBD_ConfigDescTypeDef *desc = (USBD_ConfigDescTypeDef *)(void *)pConfDesc; - USBD_VIDEO_VSFrameDescTypeDef *pVSFrameDesc = NULL; - uint16_t ptr; - - if (desc->wTotalLength > desc->bLength) - { - ptr = desc->bLength; - - while (ptr < desc->wTotalLength) - { - pdesc = USBD_GetNextDesc((uint8_t *)pdesc, &ptr); - - if (((pdesc->bDescriptorSubType == VS_FRAME_MJPEG) || - (pdesc->bDescriptorSubType == VS_FRAME_UNCOMPRESSED)) && - (pdesc->bLength == VS_FRAME_DESC_SIZE)) - { - pVSFrameDesc = (USBD_VIDEO_VSFrameDescTypeDef *)(void *)pdesc; - break; - } - } - } - - return (void *)pVSFrameDesc; -} -#endif /* USE_USBD_COMPOSITE */ - -/** - * @brief USBD_VIDEO_GetVideoHeaderDesc - * This function return the Video Header descriptor - * @param pdev: device instance - * @param pConfDesc: pointer to Bos descriptor - * @retval pointer to the Video Header descriptor - */ -static void *USBD_VIDEO_GetVideoHeaderDesc(uint8_t *pConfDesc) -{ - USBD_ConfigDescTypeDef *desc = (USBD_ConfigDescTypeDef *)(void *)pConfDesc; - USBD_DescHeaderTypeDef *pdesc = (USBD_DescHeaderTypeDef *)(void *)pConfDesc; - uint8_t *pVideoDesc = NULL; - uint16_t ptr; - - if (desc->wTotalLength > desc->bLength) - { - ptr = desc->bLength; - - while (ptr < desc->wTotalLength) - { - pdesc = USBD_GetNextDesc((uint8_t *)pdesc, &ptr); - if ((pdesc->bDescriptorType == CS_INTERFACE) && - (pdesc->bDescriptorSubType == VC_HEADER)) - { - pVideoDesc = (uint8_t *)pdesc; - break; - } - } - } - return pVideoDesc; -} - -/** - * @brief USBD_VIDEO_RegisterInterface - * @param pdev: instance - * @param fops: VIDEO interface callback - * @retval status - */ -uint8_t USBD_VIDEO_RegisterInterface(USBD_HandleTypeDef *pdev, USBD_VIDEO_ItfTypeDef *fops) -{ - /* Check if the FOPS pointer is valid */ - if (fops == NULL) - { - return (uint8_t)USBD_FAIL; - } - - /* Assign the FOPS pointer */ - pdev->pUserData[pdev->classId] = fops; - - /* Exit with no error code */ - return (uint8_t)USBD_OK; -} - -/** - * @} - */ - - -/** - * @} - */ - - -/** - * @} - */ diff --git a/Class/VIDEO/Src/usbd_video_if_template.c b/Class/VIDEO/Src/usbd_video_if_template.c deleted file mode 100644 index 5b6f2ae..0000000 --- a/Class/VIDEO/Src/usbd_video_if_template.c +++ /dev/null @@ -1,298 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_video_if_template.c - * @author MCD Application Team - * @brief Template file for Video Interface application layer functions - ****************************************************************************** - * @attention - * - * Copyright (c) 2020 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_video_if_template.h" - -/* Include you image binary file here - Binary image template shall provide: - - tImagesList: table containing pointers to all images - - tImagesSizes: table containing sizes of each image respectively - - img_count: global image counter variable - - IMG_NBR: Total image number - - To generate such file, it is possible to use tools converting video to MJPEG then to JPEG images. - */ -/* #include "img_bin.h" */ - -/* USER CODE BEGIN INCLUDE */ - -/* USER CODE END INCLUDE */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ - -/* USER CODE BEGIN PV */ -/* Private variables ---------------------------------------------------------*/ -uint8_t img_count; -/* USER CODE END PV */ - -/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @brief Usb device library. - * @{ - */ - -/** @addtogroup USBD_VIDEO_IF - * @{ - */ - -/** @defgroup USBD_VIDEO_IF_Private_TypesDefinitions - * @brief Private types. - * @{ - */ - -/* USER CODE BEGIN PRIVATE_TYPES */ - -/* USER CODE END PRIVATE_TYPES */ - -/** - * @} - */ - -/** @defgroup USBD_VIDEO_IF_Private_Defines - * @brief Private defines. - * @{ - */ - -/* USER CODE BEGIN PRIVATE_DEFINES */ - -/* USER CODE END PRIVATE_DEFINES */ - -/** - * @} - */ - -/** @defgroup USBD_VIDEO_IF_Private_Macros - * @brief Private macros. - * @{ - */ - -/* USER CODE BEGIN PRIVATE_MACRO */ - -/* USER CODE END PRIVATE_MACRO */ - -/** - * @} - */ - -/** @defgroup USBD_VIDEO_IF_Private_Variables - * @brief Private variables. - * @{ - */ - -/* USER CODE BEGIN PRIVATE_VARIABLES */ - -/* USER CODE END PRIVATE_VARIABLES */ - -/** - * @} - */ - -/** @defgroup USBD_VIDEO_IF_Exported_Variables - * @brief Public variables. - * @{ - */ - - - -/* USER CODE BEGIN EXPORTED_VARIABLES */ - -/* USER CODE END EXPORTED_VARIABLES */ - -/** - * @} - */ - -/** @defgroup USBD_VIDEO_IF_Private_FunctionPrototypes - * @brief Private functions declaration. - * @{ - */ - -static int8_t VIDEO_Itf_Init(void); -static int8_t VIDEO_Itf_DeInit(void); -static int8_t VIDEO_Itf_Control(uint8_t cmd, uint8_t *pbuf, uint16_t length); -static int8_t VIDEO_Itf_Data(uint8_t **pbuf, uint16_t *psize, uint16_t *pcktidx); - - -/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */ - -/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */ - -/** - * @} - */ - -USBD_VIDEO_ItfTypeDef USBD_VIDEO_fops_FS = -{ - VIDEO_Itf_Init, - VIDEO_Itf_DeInit, - VIDEO_Itf_Control, - VIDEO_Itf_Data, -}; - -/* Private functions ---------------------------------------------------------*/ -/** - * @brief Initializes the VIDEO media low layer over USB FS IP - * @param VIDEOFreq: VIDEO frequency used to play the VIDEO stream. - * @param Volume: Initial volume level (from 0 (Mute) to 100 (Max)) - * @param options: Reserved for future use - * @retval USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t VIDEO_Itf_Init(void) -{ - /* - Add your initialization code here - */ - - return (0); -} - -/** - * @brief TEMPLATE_DeInit - * DeInitializes the UVC media low layer - * @param None - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t VIDEO_Itf_DeInit(void) -{ - /* - Add your deinitialization code here - */ - return (0); -} - - -/** - * @brief TEMPLATE_Control - * Manage the UVC class requests - * @param Cmd: Command code - * @param Buf: Buffer containing command data (request parameters) - * @param Len: Number of data to be sent (in bytes) - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t VIDEO_Itf_Control(uint8_t cmd, uint8_t *pbuf, uint16_t length) -{ - UNUSED(cmd); - UNUSED(pbuf); - UNUSED(length); - - return (0); -} - -/** - * @brief TEMPLATE_Data - * Manage the UVC data packets - * @param pbuf: pointer to the buffer data to be filled - * @param psize: pointer tot he current packet size to be filled - * @param pcktidx: pointer to the current packet index in the current image - * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL - */ -static int8_t VIDEO_Itf_Data(uint8_t **pbuf, uint16_t *psize, uint16_t *pcktidx) -{ - /* - Implementation of this function is mandatory to provide the video data to the USB video class - This function shall parse the MJPEG images and provide each time the buffer packet relative to - current packet index and its size. - If the packet is the first packet in the current MJPEG image, then packet size shall be zero and - the pbuf is ignored and pcktidx shall be zero. - Below is typical implementation of this function based on a binary image template. - - Binary image template shall provide: - - tImagesList: table containing pointers to all images - - tImagesSizes: table containing sizes of each image respectively - - img_count: global image counter variable - - IMG_NBR: Total image number - - To generate such file, it is possible to use tools converting video to MJPEG then to JPEG images. - - */ - const uint8_t *(*ImagePtr) = tImagesList; - uint32_t packet_count = (tImagesSizes[img_count]) / ((UVC_PACKET_SIZE - (UVC_HEADER_PACKET_CNT * 2U))); - uint32_t packet_remainder = (tImagesSizes[img_count]) % ((UVC_PACKET_SIZE - (UVC_HEADER_PACKET_CNT * 2U))); - static uint8_t packet_index = 0U; - - /* Check if end of current image has been reached */ - if (packet_index < packet_count) - { - /* Set the current packet size */ - *psize = (uint16_t)UVC_PACKET_SIZE; - - /* Get the pointer to the next packet to be transmitted */ - *pbuf = (uint8_t *)(*(ImagePtr + img_count) + \ - (packet_index * ((uint16_t)(UVC_PACKET_SIZE - (UVC_HEADER_PACKET_CNT * 2U))))); - } - else if ((packet_index == packet_count)) - { - if (packet_remainder != 0U) - { - /* Get the pointer to the next packet to be transmitted */ - *pbuf = (uint8_t *)(*(ImagePtr + img_count) + \ - (packet_index * ((uint16_t)(UVC_PACKET_SIZE - (UVC_HEADER_PACKET_CNT * 2U))))); - - /* Set the current packet size */ - *psize = (uint16_t)(packet_remainder + (UVC_HEADER_PACKET_CNT * 2U)); - } - else - { - packet_index++; - - /* New image to be started, send only the packet header */ - *psize = 2; - } - } - else - { - /* New image to be started, send only the packet header */ - *psize = 2; - } - - /* Update the packet index */ - *pcktidx = packet_index; - - /* Increment the packet count and check if it reached the end of current image buffer */ - if (packet_index++ >= (packet_count + 1U)) - { - /* Reset the packet count to zero */ - packet_index = 0U; - - /* Move to the next image in the images table */ - - img_count++; - USBD_Delay(USBD_VIDEO_IMAGE_LAPS); - /* Check if images count has been reached, then reset to zero (go back to first image in circular loop) */ - if (img_count == IMG_NBR) - { - img_count = 0U; - } - } - - return (0); -} - -/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */ - -/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */ - -/** - * @} - */ - -/** - * @} - */