forked from stm/stm32-mw-usb-device
Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f47b5b5fd5 | |||
| e0c91cd704 | |||
| f8285acc0a | |||
| 4b03f967a1 | |||
| 20ee676f01 | |||
| 1e00ea2791 | |||
| c542db9e20 | |||
|
|
2a0a3521ac | ||
|
|
0b06460a43 | ||
|
|
7b5e6886d2 | ||
|
|
bd79085c18 | ||
|
|
dccc30a45a | ||
|
|
2022e75b01 | ||
|
|
555ce2b1f7 | ||
|
|
69fa8a86ad | ||
|
|
06808a92fe | ||
|
|
5af065de85 |
@@ -1,218 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_audio.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief header file for the usbd_audio.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __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 */
|
|
||||||
|
|
||||||
#define AUDIO_OUT_EP 0x01U
|
|
||||||
#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;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @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 __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __USB_AUDIO_H */
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_audio_if_template.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief Header for usbd_audio_if_template.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USBD_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 */
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,873 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_audio.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief This file provides the Audio core functions.
|
|
||||||
*
|
|
||||||
* @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
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* BSPDependencies
|
|
||||||
- "stm32xxxxx_{eval}{discovery}.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)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @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);
|
|
||||||
|
|
||||||
static uint8_t *USBD_AUDIO_GetCfgDesc(uint16_t *length);
|
|
||||||
static uint8_t *USBD_AUDIO_GetDeviceQualifierDesc(uint16_t *length);
|
|
||||||
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);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @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,
|
|
||||||
USBD_AUDIO_GetCfgDesc,
|
|
||||||
USBD_AUDIO_GetCfgDesc,
|
|
||||||
USBD_AUDIO_GetCfgDesc,
|
|
||||||
USBD_AUDIO_GetDeviceQualifierDesc,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* 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 109 bytes*/
|
|
||||||
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_MAX_POWER, /* bMaxPower = 100 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 = 39*/
|
|
||||||
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,
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @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_malloc(sizeof(USBD_AUDIO_HandleTypeDef));
|
|
||||||
|
|
||||||
if (haudio == NULL)
|
|
||||||
{
|
|
||||||
pdev->pClassData = NULL;
|
|
||||||
return (uint8_t)USBD_EMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdev->pClassData = (void *)haudio;
|
|
||||||
|
|
||||||
if (pdev->dev_speed == USBD_SPEED_HIGH)
|
|
||||||
{
|
|
||||||
pdev->ep_out[AUDIO_OUT_EP & 0xFU].bInterval = AUDIO_HS_BINTERVAL;
|
|
||||||
}
|
|
||||||
else /* LOW and FULL-speed endpoints */
|
|
||||||
{
|
|
||||||
pdev->ep_out[AUDIO_OUT_EP & 0xFU].bInterval = AUDIO_FS_BINTERVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Open EP OUT */
|
|
||||||
(void)USBD_LL_OpenEP(pdev, AUDIO_OUT_EP, USBD_EP_TYPE_ISOC, AUDIO_OUT_PACKET);
|
|
||||||
pdev->ep_out[AUDIO_OUT_EP & 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)->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, AUDIO_OUT_EP, 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);
|
|
||||||
|
|
||||||
/* Open EP OUT */
|
|
||||||
(void)USBD_LL_CloseEP(pdev, AUDIO_OUT_EP);
|
|
||||||
pdev->ep_out[AUDIO_OUT_EP & 0xFU].is_used = 0U;
|
|
||||||
pdev->ep_out[AUDIO_OUT_EP & 0xFU].bInterval = 0U;
|
|
||||||
|
|
||||||
/* DeInit physical Interface components */
|
|
||||||
if (pdev->pClassData != NULL)
|
|
||||||
{
|
|
||||||
((USBD_AUDIO_ItfTypeDef *)pdev->pUserData)->DeInit(0U);
|
|
||||||
(void)USBD_free(pdev->pClassData);
|
|
||||||
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->pClassData;
|
|
||||||
|
|
||||||
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 = USBD_AUDIO_CfgDesc + 18;
|
|
||||||
len = MIN(USB_AUDIO_DESC_SIZ, req->wLength);
|
|
||||||
|
|
||||||
(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 *)&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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_AUDIO_GetCfgDesc
|
|
||||||
* return configuration descriptor
|
|
||||||
* @param speed : current device speed
|
|
||||||
* @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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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->pClassData;
|
|
||||||
|
|
||||||
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)->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
|
|
||||||
* @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->pClassData == NULL)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
haudio = (USBD_AUDIO_HandleTypeDef *)pdev->pClassData;
|
|
||||||
|
|
||||||
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)->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)
|
|
||||||
{
|
|
||||||
UNUSED(pdev);
|
|
||||||
UNUSED(epnum);
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
haudio = (USBD_AUDIO_HandleTypeDef *)pdev->pClassData;
|
|
||||||
|
|
||||||
if (haudio == NULL)
|
|
||||||
{
|
|
||||||
return (uint8_t)USBD_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (epnum == AUDIO_OUT_EP)
|
|
||||||
{
|
|
||||||
/* Get received data packet length */
|
|
||||||
PacketSize = (uint16_t)USBD_LL_GetRxDataSize(pdev, epnum);
|
|
||||||
|
|
||||||
/* Packet received Callback */
|
|
||||||
((USBD_AUDIO_ItfTypeDef *)pdev->pUserData)->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)->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, AUDIO_OUT_EP,
|
|
||||||
&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: 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->pClassData;
|
|
||||||
|
|
||||||
if (haudio == NULL)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
(void)USBD_memset(haudio->control.data, 0, 64U);
|
|
||||||
|
|
||||||
/* Send the current mute state */
|
|
||||||
(void)USBD_CtlSendData(pdev, haudio->control.data, req->wLength);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief AUDIO_Req_SetCurrent
|
|
||||||
* Handles the SET_CUR Audio control request.
|
|
||||||
* @param pdev: 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->pClassData;
|
|
||||||
|
|
||||||
if (haudio == NULL)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (req->wLength != 0U)
|
|
||||||
{
|
|
||||||
/* Prepare the reception of the buffer over EP0 */
|
|
||||||
(void)USBD_CtlPrepareRx(pdev, haudio->control.data, req->wLength);
|
|
||||||
|
|
||||||
haudio->control.cmd = AUDIO_REQ_SET_CUR; /* Set the request value */
|
|
||||||
haudio->control.len = (uint8_t)req->wLength; /* Set the request data length */
|
|
||||||
haudio->control.unit = HIBYTE(req->wIndex); /* Set the request target unit */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_AUDIO_RegisterInterface
|
|
||||||
* @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 = fops;
|
|
||||||
|
|
||||||
return (uint8_t)USBD_OK;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,201 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_cdc_if_template.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief Generic media access Layer.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* BSPDependencies
|
|
||||||
- "stm32xxxxx_{eval}{discovery}.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);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
||||||
@@ -1,163 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_billboard.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief Header file for the usbd_billboard.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2019 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __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
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __USB_BB_H */
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,504 +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
|
|
||||||
* @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
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2019 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_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
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @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
|
|
||||||
};
|
|
||||||
|
|
||||||
/* 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_MAX_POWER, /* MaxPower 100 mA: this current is used for detecting Vbus */
|
|
||||||
/* 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_MAX_POWER, /* MaxPower 100 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
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -6,13 +6,12 @@
|
|||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @attention
|
* @attention
|
||||||
*
|
*
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
* Copyright (c) 2015 STMicroelectronics.
|
||||||
* All rights reserved.</center></h2>
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
* in the root directory of this software component.
|
||||||
* the License. You may obtain a copy of the License at:
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
*
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
@@ -41,9 +40,15 @@ extern "C" {
|
|||||||
/** @defgroup usbd_cdc_Exported_Defines
|
/** @defgroup usbd_cdc_Exported_Defines
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
#ifndef CDC_IN_EP
|
||||||
#define CDC_IN_EP 0x81U /* EP1 for data IN */
|
#define CDC_IN_EP 0x81U /* EP1 for data IN */
|
||||||
|
#endif /* CDC_IN_EP */
|
||||||
|
#ifndef CDC_OUT_EP
|
||||||
#define CDC_OUT_EP 0x01U /* EP1 for data OUT */
|
#define CDC_OUT_EP 0x01U /* EP1 for data OUT */
|
||||||
|
#endif /* CDC_OUT_EP */
|
||||||
|
#ifndef CDC_CMD_EP
|
||||||
#define CDC_CMD_EP 0x82U /* EP2 for CDC commands */
|
#define CDC_CMD_EP 0x82U /* EP2 for CDC commands */
|
||||||
|
#endif /* CDC_CMD_EP */
|
||||||
|
|
||||||
#ifndef CDC_HS_BINTERVAL
|
#ifndef CDC_HS_BINTERVAL
|
||||||
#define CDC_HS_BINTERVAL 0x10U
|
#define CDC_HS_BINTERVAL 0x10U
|
||||||
@@ -53,10 +58,13 @@ extern "C" {
|
|||||||
#define CDC_FS_BINTERVAL 0x10U
|
#define CDC_FS_BINTERVAL 0x10U
|
||||||
#endif /* CDC_FS_BINTERVAL */
|
#endif /* CDC_FS_BINTERVAL */
|
||||||
|
|
||||||
|
#ifndef CDC_CMD_PACKET_SIZE
|
||||||
|
#define CDC_CMD_PACKET_SIZE 8U /* Control Endpoint Packet size */
|
||||||
|
#endif /* CDC_CMD_PACKET_SIZE */
|
||||||
|
|
||||||
/* CDC Endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */
|
/* CDC Endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */
|
||||||
#define CDC_DATA_HS_MAX_PACKET_SIZE 512U /* Endpoint IN & OUT Packet size */
|
#define CDC_DATA_HS_MAX_PACKET_SIZE 512U /* Endpoint IN & OUT Packet size */
|
||||||
#define CDC_DATA_FS_MAX_PACKET_SIZE 64U /* Endpoint IN & OUT Packet size */
|
#define CDC_DATA_FS_MAX_PACKET_SIZE 64U /* Endpoint IN & OUT Packet size */
|
||||||
#define CDC_CMD_PACKET_SIZE 8U /* Control Endpoint Packet size */
|
|
||||||
|
|
||||||
#define USB_CDC_CONFIG_DESC_SIZ 67U
|
#define USB_CDC_CONFIG_DESC_SIZ 67U
|
||||||
#define CDC_DATA_HS_IN_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE
|
#define CDC_DATA_HS_IN_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE
|
||||||
@@ -111,7 +119,7 @@ typedef struct _USBD_CDC_Itf
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint32_t data[CDC_DATA_HS_MAX_PACKET_SIZE / 4U]; /* Force 32bits alignment */
|
uint32_t data[CDC_DATA_HS_MAX_PACKET_SIZE / 4U]; /* Force 32-bit alignment */
|
||||||
uint8_t CmdOpCode;
|
uint8_t CmdOpCode;
|
||||||
uint8_t CmdLength;
|
uint8_t CmdLength;
|
||||||
uint8_t *RxBuffer;
|
uint8_t *RxBuffer;
|
||||||
@@ -149,12 +157,17 @@ extern USBD_ClassTypeDef USBD_CDC;
|
|||||||
uint8_t USBD_CDC_RegisterInterface(USBD_HandleTypeDef *pdev,
|
uint8_t USBD_CDC_RegisterInterface(USBD_HandleTypeDef *pdev,
|
||||||
USBD_CDC_ItfTypeDef *fops);
|
USBD_CDC_ItfTypeDef *fops);
|
||||||
|
|
||||||
|
#ifdef USE_USBD_COMPOSITE
|
||||||
|
uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff,
|
||||||
|
uint32_t length, uint8_t ClassId);
|
||||||
|
uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev, uint8_t ClassId);
|
||||||
|
#else
|
||||||
uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff,
|
uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff,
|
||||||
uint32_t length);
|
uint32_t length);
|
||||||
|
uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev);
|
||||||
|
#endif /* USE_USBD_COMPOSITE */
|
||||||
uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff);
|
uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff);
|
||||||
uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev);
|
uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev);
|
||||||
uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev);
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
@@ -172,4 +185,3 @@ uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev);
|
|||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|||||||
@@ -6,13 +6,12 @@
|
|||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @attention
|
* @attention
|
||||||
*
|
*
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
* Copyright (c) 2015 STMicroelectronics.
|
||||||
* All rights reserved.</center></h2>
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
* in the root directory of this software component.
|
||||||
* the License. You may obtain a copy of the License at:
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
*
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
@@ -30,11 +29,14 @@ extern "C" {
|
|||||||
|
|
||||||
/* Exported types ------------------------------------------------------------*/
|
/* Exported types ------------------------------------------------------------*/
|
||||||
/* Exported constants --------------------------------------------------------*/
|
/* Exported constants --------------------------------------------------------*/
|
||||||
|
#define APP_RX_DATA_SIZE 64
|
||||||
|
#define APP_TX_DATA_SIZE 64
|
||||||
|
|
||||||
extern USBD_CDC_ItfTypeDef USBD_CDC_Template_fops;
|
extern USBD_CDC_ItfTypeDef USBD_CDC_Template_fops;
|
||||||
|
|
||||||
/* Exported macro ------------------------------------------------------------*/
|
/* Exported macro ------------------------------------------------------------*/
|
||||||
/* Exported functions ------------------------------------------------------- */
|
/* Exported functions ------------------------------------------------------- */
|
||||||
|
uint8_t TEMPLATE_Transmit(uint8_t* Buf, uint16_t Len);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
@@ -42,4 +44,3 @@ extern USBD_CDC_ItfTypeDef USBD_CDC_Template_fops;
|
|||||||
|
|
||||||
#endif /* __USBD_CDC_IF_TEMPLATE_H */
|
#endif /* __USBD_CDC_IF_TEMPLATE_H */
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -10,6 +10,17 @@
|
|||||||
* - Command IN transfer (class requests management)
|
* - Command IN transfer (class requests management)
|
||||||
* - Error management
|
* - Error management
|
||||||
*
|
*
|
||||||
|
******************************************************************************
|
||||||
|
* @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
|
* @verbatim
|
||||||
*
|
*
|
||||||
* ===================================================================
|
* ===================================================================
|
||||||
@@ -37,17 +48,6 @@
|
|||||||
* @endverbatim
|
* @endverbatim
|
||||||
*
|
*
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* BSPDependencies
|
/* BSPDependencies
|
||||||
@@ -105,13 +105,14 @@ static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *re
|
|||||||
static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum);
|
static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum);
|
||||||
static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum);
|
static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum);
|
||||||
static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev);
|
static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev);
|
||||||
|
#ifndef USE_USBD_COMPOSITE
|
||||||
static uint8_t *USBD_CDC_GetFSCfgDesc(uint16_t *length);
|
static uint8_t *USBD_CDC_GetFSCfgDesc(uint16_t *length);
|
||||||
static uint8_t *USBD_CDC_GetHSCfgDesc(uint16_t *length);
|
static uint8_t *USBD_CDC_GetHSCfgDesc(uint16_t *length);
|
||||||
static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length);
|
static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length);
|
||||||
static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length);
|
|
||||||
uint8_t *USBD_CDC_GetDeviceQualifierDescriptor(uint16_t *length);
|
uint8_t *USBD_CDC_GetDeviceQualifierDescriptor(uint16_t *length);
|
||||||
|
#endif /* USE_USBD_COMPOSITE */
|
||||||
|
|
||||||
|
#ifndef USE_USBD_COMPOSITE
|
||||||
/* USB Standard Device Descriptor */
|
/* USB Standard Device Descriptor */
|
||||||
__ALIGN_BEGIN static uint8_t USBD_CDC_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END =
|
__ALIGN_BEGIN static uint8_t USBD_CDC_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END =
|
||||||
{
|
{
|
||||||
@@ -126,7 +127,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_
|
|||||||
0x01,
|
0x01,
|
||||||
0x00,
|
0x00,
|
||||||
};
|
};
|
||||||
|
#endif /* USE_USBD_COMPOSITE */
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
@@ -142,232 +143,47 @@ USBD_ClassTypeDef USBD_CDC =
|
|||||||
USBD_CDC_Init,
|
USBD_CDC_Init,
|
||||||
USBD_CDC_DeInit,
|
USBD_CDC_DeInit,
|
||||||
USBD_CDC_Setup,
|
USBD_CDC_Setup,
|
||||||
NULL, /* EP0_TxSent, */
|
NULL, /* EP0_TxSent */
|
||||||
USBD_CDC_EP0_RxReady,
|
USBD_CDC_EP0_RxReady,
|
||||||
USBD_CDC_DataIn,
|
USBD_CDC_DataIn,
|
||||||
USBD_CDC_DataOut,
|
USBD_CDC_DataOut,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
|
#ifdef USE_USBD_COMPOSITE
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
#else
|
||||||
USBD_CDC_GetHSCfgDesc,
|
USBD_CDC_GetHSCfgDesc,
|
||||||
USBD_CDC_GetFSCfgDesc,
|
USBD_CDC_GetFSCfgDesc,
|
||||||
USBD_CDC_GetOtherSpeedCfgDesc,
|
USBD_CDC_GetOtherSpeedCfgDesc,
|
||||||
USBD_CDC_GetDeviceQualifierDescriptor,
|
USBD_CDC_GetDeviceQualifierDescriptor,
|
||||||
|
#endif /* USE_USBD_COMPOSITE */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef USE_USBD_COMPOSITE
|
||||||
/* USB CDC device Configuration Descriptor */
|
/* USB CDC device Configuration Descriptor */
|
||||||
__ALIGN_BEGIN static uint8_t USBD_CDC_CfgHSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END =
|
__ALIGN_BEGIN static uint8_t USBD_CDC_CfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END =
|
||||||
{
|
{
|
||||||
/* Configuration Descriptor */
|
/* Configuration Descriptor */
|
||||||
0x09, /* bLength: Configuration Descriptor size */
|
0x09, /* bLength: Configuration Descriptor size */
|
||||||
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
|
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
|
||||||
USB_CDC_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */
|
USB_CDC_CONFIG_DESC_SIZ, /* wTotalLength */
|
||||||
0x00,
|
|
||||||
0x02, /* bNumInterfaces: 2 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_MAX_POWER, /* MaxPower 100 mA */
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Interface Descriptor */
|
|
||||||
0x09, /* bLength: Interface Descriptor size */
|
|
||||||
USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */
|
|
||||||
0x00, /* bInterfaceNumber: Number of Interface */
|
|
||||||
0x00, /* bAlternateSetting: Alternate setting */
|
|
||||||
0x01, /* bNumEndpoints: One endpoints used */
|
|
||||||
0x02, /* bInterfaceClass: Communication Interface Class */
|
|
||||||
0x02, /* bInterfaceSubClass: Abstract Control Model */
|
|
||||||
0x01, /* bInterfaceProtocol: Common AT commands */
|
|
||||||
0x00, /* iInterface: */
|
|
||||||
|
|
||||||
/* Header Functional Descriptor */
|
|
||||||
0x05, /* bLength: Endpoint Descriptor size */
|
|
||||||
0x24, /* bDescriptorType: CS_INTERFACE */
|
|
||||||
0x00, /* bDescriptorSubtype: Header Func Desc */
|
|
||||||
0x10, /* bcdCDC: spec release number */
|
|
||||||
0x01,
|
|
||||||
|
|
||||||
/* Call Management Functional Descriptor */
|
|
||||||
0x05, /* bFunctionLength */
|
|
||||||
0x24, /* bDescriptorType: CS_INTERFACE */
|
|
||||||
0x01, /* bDescriptorSubtype: Call Management Func Desc */
|
|
||||||
0x00, /* bmCapabilities: D0+D1 */
|
|
||||||
0x01, /* bDataInterface: 1 */
|
|
||||||
|
|
||||||
/* ACM Functional Descriptor */
|
|
||||||
0x04, /* bFunctionLength */
|
|
||||||
0x24, /* bDescriptorType: CS_INTERFACE */
|
|
||||||
0x02, /* bDescriptorSubtype: Abstract Control Management desc */
|
|
||||||
0x02, /* bmCapabilities */
|
|
||||||
|
|
||||||
/* Union Functional Descriptor */
|
|
||||||
0x05, /* bFunctionLength */
|
|
||||||
0x24, /* bDescriptorType: CS_INTERFACE */
|
|
||||||
0x06, /* bDescriptorSubtype: Union func desc */
|
|
||||||
0x00, /* bMasterInterface: Communication class interface */
|
|
||||||
0x01, /* bSlaveInterface0: Data Class Interface */
|
|
||||||
|
|
||||||
/* Endpoint 2 Descriptor */
|
|
||||||
0x07, /* bLength: Endpoint Descriptor size */
|
|
||||||
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */
|
|
||||||
CDC_CMD_EP, /* bEndpointAddress */
|
|
||||||
0x03, /* bmAttributes: Interrupt */
|
|
||||||
LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */
|
|
||||||
HIBYTE(CDC_CMD_PACKET_SIZE),
|
|
||||||
CDC_HS_BINTERVAL, /* bInterval: */
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Data class interface descriptor */
|
|
||||||
0x09, /* bLength: Endpoint Descriptor size */
|
|
||||||
USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */
|
|
||||||
0x01, /* bInterfaceNumber: Number of Interface */
|
|
||||||
0x00, /* bAlternateSetting: Alternate setting */
|
|
||||||
0x02, /* bNumEndpoints: Two endpoints used */
|
|
||||||
0x0A, /* bInterfaceClass: CDC */
|
|
||||||
0x00, /* bInterfaceSubClass: */
|
|
||||||
0x00, /* bInterfaceProtocol: */
|
|
||||||
0x00, /* iInterface: */
|
|
||||||
|
|
||||||
/* Endpoint OUT Descriptor */
|
|
||||||
0x07, /* bLength: Endpoint Descriptor size */
|
|
||||||
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */
|
|
||||||
CDC_OUT_EP, /* bEndpointAddress */
|
|
||||||
0x02, /* bmAttributes: Bulk */
|
|
||||||
LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */
|
|
||||||
HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE),
|
|
||||||
0x00, /* bInterval: ignore for Bulk transfer */
|
|
||||||
|
|
||||||
/* Endpoint IN Descriptor */
|
|
||||||
0x07, /* bLength: Endpoint Descriptor size */
|
|
||||||
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */
|
|
||||||
CDC_IN_EP, /* bEndpointAddress */
|
|
||||||
0x02, /* bmAttributes: Bulk */
|
|
||||||
LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */
|
|
||||||
HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE),
|
|
||||||
0x00 /* bInterval: ignore for Bulk transfer */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* USB CDC device Configuration Descriptor */
|
|
||||||
__ALIGN_BEGIN static uint8_t USBD_CDC_CfgFSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END =
|
|
||||||
{
|
|
||||||
/* Configuration Descriptor */
|
|
||||||
0x09, /* bLength: Configuration Descriptor size */
|
|
||||||
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
|
|
||||||
USB_CDC_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */
|
|
||||||
0x00,
|
|
||||||
0x02, /* bNumInterfaces: 2 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_MAX_POWER, /* MaxPower 100 mA */
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Interface Descriptor */
|
|
||||||
0x09, /* bLength: Interface Descriptor size */
|
|
||||||
USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */
|
|
||||||
/* Interface descriptor type */
|
|
||||||
0x00, /* bInterfaceNumber: Number of Interface */
|
|
||||||
0x00, /* bAlternateSetting: Alternate setting */
|
|
||||||
0x01, /* bNumEndpoints: One endpoints used */
|
|
||||||
0x02, /* bInterfaceClass: Communication Interface Class */
|
|
||||||
0x02, /* bInterfaceSubClass: Abstract Control Model */
|
|
||||||
0x01, /* bInterfaceProtocol: Common AT commands */
|
|
||||||
0x00, /* iInterface: */
|
|
||||||
|
|
||||||
/* Header Functional Descriptor */
|
|
||||||
0x05, /* bLength: Endpoint Descriptor size */
|
|
||||||
0x24, /* bDescriptorType: CS_INTERFACE */
|
|
||||||
0x00, /* bDescriptorSubtype: Header Func Desc */
|
|
||||||
0x10, /* bcdCDC: spec release number */
|
|
||||||
0x01,
|
|
||||||
|
|
||||||
/* Call Management Functional Descriptor */
|
|
||||||
0x05, /* bFunctionLength */
|
|
||||||
0x24, /* bDescriptorType: CS_INTERFACE */
|
|
||||||
0x01, /* bDescriptorSubtype: Call Management Func Desc */
|
|
||||||
0x00, /* bmCapabilities: D0+D1 */
|
|
||||||
0x01, /* bDataInterface: 1 */
|
|
||||||
|
|
||||||
/* ACM Functional Descriptor */
|
|
||||||
0x04, /* bFunctionLength */
|
|
||||||
0x24, /* bDescriptorType: CS_INTERFACE */
|
|
||||||
0x02, /* bDescriptorSubtype: Abstract Control Management desc */
|
|
||||||
0x02, /* bmCapabilities */
|
|
||||||
|
|
||||||
/* Union Functional Descriptor */
|
|
||||||
0x05, /* bFunctionLength */
|
|
||||||
0x24, /* bDescriptorType: CS_INTERFACE */
|
|
||||||
0x06, /* bDescriptorSubtype: Union func desc */
|
|
||||||
0x00, /* bMasterInterface: Communication class interface */
|
|
||||||
0x01, /* bSlaveInterface0: Data Class Interface */
|
|
||||||
|
|
||||||
/* Endpoint 2 Descriptor */
|
|
||||||
0x07, /* bLength: Endpoint Descriptor size */
|
|
||||||
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */
|
|
||||||
CDC_CMD_EP, /* bEndpointAddress */
|
|
||||||
0x03, /* bmAttributes: Interrupt */
|
|
||||||
LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */
|
|
||||||
HIBYTE(CDC_CMD_PACKET_SIZE),
|
|
||||||
CDC_FS_BINTERVAL, /* bInterval: */
|
|
||||||
/*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Data class interface descriptor */
|
|
||||||
0x09, /* bLength: Endpoint Descriptor size */
|
|
||||||
USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */
|
|
||||||
0x01, /* bInterfaceNumber: Number of Interface */
|
|
||||||
0x00, /* bAlternateSetting: Alternate setting */
|
|
||||||
0x02, /* bNumEndpoints: Two endpoints used */
|
|
||||||
0x0A, /* bInterfaceClass: CDC */
|
|
||||||
0x00, /* bInterfaceSubClass: */
|
|
||||||
0x00, /* bInterfaceProtocol: */
|
|
||||||
0x00, /* iInterface: */
|
|
||||||
|
|
||||||
/* Endpoint OUT Descriptor */
|
|
||||||
0x07, /* bLength: Endpoint Descriptor size */
|
|
||||||
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */
|
|
||||||
CDC_OUT_EP, /* bEndpointAddress */
|
|
||||||
0x02, /* bmAttributes: Bulk */
|
|
||||||
LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */
|
|
||||||
HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE),
|
|
||||||
0x00, /* bInterval: ignore for Bulk transfer */
|
|
||||||
|
|
||||||
/* Endpoint IN Descriptor */
|
|
||||||
0x07, /* bLength: Endpoint Descriptor size */
|
|
||||||
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */
|
|
||||||
CDC_IN_EP, /* bEndpointAddress */
|
|
||||||
0x02, /* bmAttributes: Bulk */
|
|
||||||
LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */
|
|
||||||
HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE),
|
|
||||||
0x00 /* bInterval: ignore for Bulk transfer */
|
|
||||||
};
|
|
||||||
|
|
||||||
__ALIGN_BEGIN static uint8_t USBD_CDC_OtherSpeedCfgDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END =
|
|
||||||
{
|
|
||||||
0x09, /* bLength: Configuration Descriptor size */
|
|
||||||
USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION,
|
|
||||||
USB_CDC_CONFIG_DESC_SIZ,
|
|
||||||
0x00,
|
0x00,
|
||||||
0x02, /* bNumInterfaces: 2 interfaces */
|
0x02, /* bNumInterfaces: 2 interfaces */
|
||||||
0x01, /* bConfigurationValue: */
|
0x01, /* bConfigurationValue: Configuration value */
|
||||||
0x04, /* iConfiguration: */
|
0x00, /* iConfiguration: Index of string descriptor
|
||||||
|
describing the configuration */
|
||||||
#if (USBD_SELF_POWERED == 1U)
|
#if (USBD_SELF_POWERED == 1U)
|
||||||
0xC0, /* bmAttributes: Bus Powered according to user configuration */
|
0xC0, /* bmAttributes: Bus Powered according to user configuration */
|
||||||
#else
|
#else
|
||||||
0x80, /* bmAttributes: Bus Powered according to user configuration */
|
0x80, /* bmAttributes: Bus Powered according to user configuration */
|
||||||
#endif
|
#endif /* USBD_SELF_POWERED */
|
||||||
USBD_MAX_POWER, /* MaxPower 100 mA */
|
USBD_MAX_POWER, /* MaxPower (mA) */
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
/* Interface Descriptor */
|
/* Interface Descriptor */
|
||||||
0x09, /* bLength: Interface Descriptor size */
|
0x09, /* bLength: Interface Descriptor size */
|
||||||
@@ -375,11 +191,11 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_OtherSpeedCfgDesc[USB_CDC_CONFIG_DESC_SIZ]
|
|||||||
/* Interface descriptor type */
|
/* Interface descriptor type */
|
||||||
0x00, /* bInterfaceNumber: Number of Interface */
|
0x00, /* bInterfaceNumber: Number of Interface */
|
||||||
0x00, /* bAlternateSetting: Alternate setting */
|
0x00, /* bAlternateSetting: Alternate setting */
|
||||||
0x01, /* bNumEndpoints: One endpoints used */
|
0x01, /* bNumEndpoints: One endpoint used */
|
||||||
0x02, /* bInterfaceClass: Communication Interface Class */
|
0x02, /* bInterfaceClass: Communication Interface Class */
|
||||||
0x02, /* bInterfaceSubClass: Abstract Control Model */
|
0x02, /* bInterfaceSubClass: Abstract Control Model */
|
||||||
0x01, /* bInterfaceProtocol: Common AT commands */
|
0x01, /* bInterfaceProtocol: Common AT commands */
|
||||||
0x00, /* iInterface: */
|
0x00, /* iInterface */
|
||||||
|
|
||||||
/* Header Functional Descriptor */
|
/* Header Functional Descriptor */
|
||||||
0x05, /* bLength: Endpoint Descriptor size */
|
0x05, /* bLength: Endpoint Descriptor size */
|
||||||
@@ -393,7 +209,7 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_OtherSpeedCfgDesc[USB_CDC_CONFIG_DESC_SIZ]
|
|||||||
0x24, /* bDescriptorType: CS_INTERFACE */
|
0x24, /* bDescriptorType: CS_INTERFACE */
|
||||||
0x01, /* bDescriptorSubtype: Call Management Func Desc */
|
0x01, /* bDescriptorSubtype: Call Management Func Desc */
|
||||||
0x00, /* bmCapabilities: D0+D1 */
|
0x00, /* bmCapabilities: D0+D1 */
|
||||||
0x01, /* bDataInterface: 1 */
|
0x01, /* bDataInterface */
|
||||||
|
|
||||||
/* ACM Functional Descriptor */
|
/* ACM Functional Descriptor */
|
||||||
0x04, /* bFunctionLength */
|
0x04, /* bFunctionLength */
|
||||||
@@ -413,10 +229,9 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_OtherSpeedCfgDesc[USB_CDC_CONFIG_DESC_SIZ]
|
|||||||
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */
|
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */
|
||||||
CDC_CMD_EP, /* bEndpointAddress */
|
CDC_CMD_EP, /* bEndpointAddress */
|
||||||
0x03, /* bmAttributes: Interrupt */
|
0x03, /* bmAttributes: Interrupt */
|
||||||
LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */
|
LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize */
|
||||||
HIBYTE(CDC_CMD_PACKET_SIZE),
|
HIBYTE(CDC_CMD_PACKET_SIZE),
|
||||||
CDC_FS_BINTERVAL, /* bInterval: */
|
CDC_FS_BINTERVAL, /* bInterval */
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
/* Data class interface descriptor */
|
/* Data class interface descriptor */
|
||||||
@@ -426,28 +241,33 @@ __ALIGN_BEGIN static uint8_t USBD_CDC_OtherSpeedCfgDesc[USB_CDC_CONFIG_DESC_SIZ]
|
|||||||
0x00, /* bAlternateSetting: Alternate setting */
|
0x00, /* bAlternateSetting: Alternate setting */
|
||||||
0x02, /* bNumEndpoints: Two endpoints used */
|
0x02, /* bNumEndpoints: Two endpoints used */
|
||||||
0x0A, /* bInterfaceClass: CDC */
|
0x0A, /* bInterfaceClass: CDC */
|
||||||
0x00, /* bInterfaceSubClass: */
|
0x00, /* bInterfaceSubClass */
|
||||||
0x00, /* bInterfaceProtocol: */
|
0x00, /* bInterfaceProtocol */
|
||||||
0x00, /* iInterface: */
|
0x00, /* iInterface */
|
||||||
|
|
||||||
/* Endpoint OUT Descriptor */
|
/* Endpoint OUT Descriptor */
|
||||||
0x07, /* bLength: Endpoint Descriptor size */
|
0x07, /* bLength: Endpoint Descriptor size */
|
||||||
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */
|
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */
|
||||||
CDC_OUT_EP, /* bEndpointAddress */
|
CDC_OUT_EP, /* bEndpointAddress */
|
||||||
0x02, /* bmAttributes: Bulk */
|
0x02, /* bmAttributes: Bulk */
|
||||||
0x40, /* wMaxPacketSize: */
|
LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize */
|
||||||
0x00,
|
HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE),
|
||||||
0x00, /* bInterval: ignore for Bulk transfer */
|
0x00, /* bInterval */
|
||||||
|
|
||||||
/* Endpoint IN Descriptor */
|
/* Endpoint IN Descriptor */
|
||||||
0x07, /* bLength: Endpoint Descriptor size */
|
0x07, /* bLength: Endpoint Descriptor size */
|
||||||
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */
|
USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */
|
||||||
CDC_IN_EP, /* bEndpointAddress */
|
CDC_IN_EP, /* bEndpointAddress */
|
||||||
0x02, /* bmAttributes: Bulk */
|
0x02, /* bmAttributes: Bulk */
|
||||||
0x40, /* wMaxPacketSize: */
|
LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize */
|
||||||
0x00,
|
HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE),
|
||||||
0x00 /* bInterval */
|
0x00 /* bInterval */
|
||||||
};
|
};
|
||||||
|
#endif /* USE_USBD_COMPOSITE */
|
||||||
|
|
||||||
|
static uint8_t CDCInEpAdd = CDC_IN_EP;
|
||||||
|
static uint8_t CDCOutEpAdd = CDC_OUT_EP;
|
||||||
|
static uint8_t CDCCmdEpAdd = CDC_CMD_EP;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
@@ -469,72 +289,89 @@ static uint8_t USBD_CDC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx)
|
|||||||
UNUSED(cfgidx);
|
UNUSED(cfgidx);
|
||||||
USBD_CDC_HandleTypeDef *hcdc;
|
USBD_CDC_HandleTypeDef *hcdc;
|
||||||
|
|
||||||
hcdc = USBD_malloc(sizeof(USBD_CDC_HandleTypeDef));
|
hcdc = (USBD_CDC_HandleTypeDef *)USBD_malloc(sizeof(USBD_CDC_HandleTypeDef));
|
||||||
|
|
||||||
if (hcdc == NULL)
|
if (hcdc == NULL)
|
||||||
{
|
{
|
||||||
pdev->pClassData = NULL;
|
pdev->pClassDataCmsit[pdev->classId] = NULL;
|
||||||
return (uint8_t)USBD_EMEM;
|
return (uint8_t)USBD_EMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
pdev->pClassData = (void *)hcdc;
|
(void)USBD_memset(hcdc, 0, sizeof(USBD_CDC_HandleTypeDef));
|
||||||
|
|
||||||
|
pdev->pClassDataCmsit[pdev->classId] = (void *)hcdc;
|
||||||
|
pdev->pClassData = pdev->pClassDataCmsit[pdev->classId];
|
||||||
|
|
||||||
|
#ifdef USE_USBD_COMPOSITE
|
||||||
|
/* Get the Endpoints addresses allocated for this class instance */
|
||||||
|
CDCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId);
|
||||||
|
CDCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId);
|
||||||
|
CDCCmdEpAdd = 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)
|
if (pdev->dev_speed == USBD_SPEED_HIGH)
|
||||||
{
|
{
|
||||||
/* Open EP IN */
|
/* Open EP IN */
|
||||||
(void)USBD_LL_OpenEP(pdev, CDC_IN_EP, USBD_EP_TYPE_BULK,
|
(void)USBD_LL_OpenEP(pdev, CDCInEpAdd, USBD_EP_TYPE_BULK,
|
||||||
CDC_DATA_HS_IN_PACKET_SIZE);
|
CDC_DATA_HS_IN_PACKET_SIZE);
|
||||||
|
|
||||||
pdev->ep_in[CDC_IN_EP & 0xFU].is_used = 1U;
|
pdev->ep_in[CDCInEpAdd & 0xFU].is_used = 1U;
|
||||||
|
|
||||||
/* Open EP OUT */
|
/* Open EP OUT */
|
||||||
(void)USBD_LL_OpenEP(pdev, CDC_OUT_EP, USBD_EP_TYPE_BULK,
|
(void)USBD_LL_OpenEP(pdev, CDCOutEpAdd, USBD_EP_TYPE_BULK,
|
||||||
CDC_DATA_HS_OUT_PACKET_SIZE);
|
CDC_DATA_HS_OUT_PACKET_SIZE);
|
||||||
|
|
||||||
pdev->ep_out[CDC_OUT_EP & 0xFU].is_used = 1U;
|
pdev->ep_out[CDCOutEpAdd & 0xFU].is_used = 1U;
|
||||||
|
|
||||||
/* Set bInterval for CDC CMD Endpoint */
|
/* Set bInterval for CDC CMD Endpoint */
|
||||||
pdev->ep_in[CDC_CMD_EP & 0xFU].bInterval = CDC_HS_BINTERVAL;
|
pdev->ep_in[CDCCmdEpAdd & 0xFU].bInterval = CDC_HS_BINTERVAL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Open EP IN */
|
/* Open EP IN */
|
||||||
(void)USBD_LL_OpenEP(pdev, CDC_IN_EP, USBD_EP_TYPE_BULK,
|
(void)USBD_LL_OpenEP(pdev, CDCInEpAdd, USBD_EP_TYPE_BULK,
|
||||||
CDC_DATA_FS_IN_PACKET_SIZE);
|
CDC_DATA_FS_IN_PACKET_SIZE);
|
||||||
|
|
||||||
pdev->ep_in[CDC_IN_EP & 0xFU].is_used = 1U;
|
pdev->ep_in[CDCInEpAdd & 0xFU].is_used = 1U;
|
||||||
|
|
||||||
/* Open EP OUT */
|
/* Open EP OUT */
|
||||||
(void)USBD_LL_OpenEP(pdev, CDC_OUT_EP, USBD_EP_TYPE_BULK,
|
(void)USBD_LL_OpenEP(pdev, CDCOutEpAdd, USBD_EP_TYPE_BULK,
|
||||||
CDC_DATA_FS_OUT_PACKET_SIZE);
|
CDC_DATA_FS_OUT_PACKET_SIZE);
|
||||||
|
|
||||||
pdev->ep_out[CDC_OUT_EP & 0xFU].is_used = 1U;
|
pdev->ep_out[CDCOutEpAdd & 0xFU].is_used = 1U;
|
||||||
|
|
||||||
/* Set bInterval for CMD Endpoint */
|
/* Set bInterval for CMD Endpoint */
|
||||||
pdev->ep_in[CDC_CMD_EP & 0xFU].bInterval = CDC_FS_BINTERVAL;
|
pdev->ep_in[CDCCmdEpAdd & 0xFU].bInterval = CDC_FS_BINTERVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open Command IN EP */
|
/* Open Command IN EP */
|
||||||
(void)USBD_LL_OpenEP(pdev, CDC_CMD_EP, USBD_EP_TYPE_INTR, CDC_CMD_PACKET_SIZE);
|
(void)USBD_LL_OpenEP(pdev, CDCCmdEpAdd, USBD_EP_TYPE_INTR, CDC_CMD_PACKET_SIZE);
|
||||||
pdev->ep_in[CDC_CMD_EP & 0xFU].is_used = 1U;
|
pdev->ep_in[CDCCmdEpAdd & 0xFU].is_used = 1U;
|
||||||
|
|
||||||
|
hcdc->RxBuffer = NULL;
|
||||||
|
|
||||||
/* Init physical Interface components */
|
/* Init physical Interface components */
|
||||||
((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Init();
|
((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->Init();
|
||||||
|
|
||||||
/* Init Xfer states */
|
/* Init Xfer states */
|
||||||
hcdc->TxState = 0U;
|
hcdc->TxState = 0U;
|
||||||
hcdc->RxState = 0U;
|
hcdc->RxState = 0U;
|
||||||
|
|
||||||
|
if (hcdc->RxBuffer == NULL)
|
||||||
|
{
|
||||||
|
return (uint8_t)USBD_EMEM;
|
||||||
|
}
|
||||||
|
|
||||||
if (pdev->dev_speed == USBD_SPEED_HIGH)
|
if (pdev->dev_speed == USBD_SPEED_HIGH)
|
||||||
{
|
{
|
||||||
/* Prepare Out endpoint to receive next packet */
|
/* Prepare Out endpoint to receive next packet */
|
||||||
(void)USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer,
|
(void)USBD_LL_PrepareReceive(pdev, CDCOutEpAdd, hcdc->RxBuffer,
|
||||||
CDC_DATA_HS_OUT_PACKET_SIZE);
|
CDC_DATA_HS_OUT_PACKET_SIZE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Prepare Out endpoint to receive next packet */
|
/* Prepare Out endpoint to receive next packet */
|
||||||
(void)USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer,
|
(void)USBD_LL_PrepareReceive(pdev, CDCOutEpAdd, hcdc->RxBuffer,
|
||||||
CDC_DATA_FS_OUT_PACKET_SIZE);
|
CDC_DATA_FS_OUT_PACKET_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -552,24 +389,33 @@ static uint8_t USBD_CDC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx)
|
|||||||
{
|
{
|
||||||
UNUSED(cfgidx);
|
UNUSED(cfgidx);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef USE_USBD_COMPOSITE
|
||||||
|
/* Get the Endpoints addresses allocated for this CDC class instance */
|
||||||
|
CDCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId);
|
||||||
|
CDCOutEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_OUT, USBD_EP_TYPE_BULK, (uint8_t)pdev->classId);
|
||||||
|
CDCCmdEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_INTR, (uint8_t)pdev->classId);
|
||||||
|
#endif /* USE_USBD_COMPOSITE */
|
||||||
|
|
||||||
/* Close EP IN */
|
/* Close EP IN */
|
||||||
(void)USBD_LL_CloseEP(pdev, CDC_IN_EP);
|
(void)USBD_LL_CloseEP(pdev, CDCInEpAdd);
|
||||||
pdev->ep_in[CDC_IN_EP & 0xFU].is_used = 0U;
|
pdev->ep_in[CDCInEpAdd & 0xFU].is_used = 0U;
|
||||||
|
|
||||||
/* Close EP OUT */
|
/* Close EP OUT */
|
||||||
(void)USBD_LL_CloseEP(pdev, CDC_OUT_EP);
|
(void)USBD_LL_CloseEP(pdev, CDCOutEpAdd);
|
||||||
pdev->ep_out[CDC_OUT_EP & 0xFU].is_used = 0U;
|
pdev->ep_out[CDCOutEpAdd & 0xFU].is_used = 0U;
|
||||||
|
|
||||||
/* Close Command IN EP */
|
/* Close Command IN EP */
|
||||||
(void)USBD_LL_CloseEP(pdev, CDC_CMD_EP);
|
(void)USBD_LL_CloseEP(pdev, CDCCmdEpAdd);
|
||||||
pdev->ep_in[CDC_CMD_EP & 0xFU].is_used = 0U;
|
pdev->ep_in[CDCCmdEpAdd & 0xFU].is_used = 0U;
|
||||||
pdev->ep_in[CDC_CMD_EP & 0xFU].bInterval = 0U;
|
pdev->ep_in[CDCCmdEpAdd & 0xFU].bInterval = 0U;
|
||||||
|
|
||||||
/* DeInit physical Interface components */
|
/* DeInit physical Interface components */
|
||||||
if (pdev->pClassData != NULL)
|
if (pdev->pClassDataCmsit[pdev->classId] != NULL)
|
||||||
{
|
{
|
||||||
((USBD_CDC_ItfTypeDef *)pdev->pUserData)->DeInit();
|
((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->DeInit();
|
||||||
(void)USBD_free(pdev->pClassData);
|
(void)USBD_free(pdev->pClassDataCmsit[pdev->classId]);
|
||||||
|
pdev->pClassDataCmsit[pdev->classId] = NULL;
|
||||||
pdev->pClassData = NULL;
|
pdev->pClassData = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -586,7 +432,7 @@ static uint8_t USBD_CDC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx)
|
|||||||
static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev,
|
static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev,
|
||||||
USBD_SetupReqTypedef *req)
|
USBD_SetupReqTypedef *req)
|
||||||
{
|
{
|
||||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassData;
|
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId];
|
||||||
uint16_t len;
|
uint16_t len;
|
||||||
uint8_t ifalt = 0U;
|
uint8_t ifalt = 0U;
|
||||||
uint16_t status_info = 0U;
|
uint16_t status_info = 0U;
|
||||||
@@ -604,7 +450,7 @@ static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev,
|
|||||||
{
|
{
|
||||||
if ((req->bmRequest & 0x80U) != 0U)
|
if ((req->bmRequest & 0x80U) != 0U)
|
||||||
{
|
{
|
||||||
((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Control(req->bRequest,
|
((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->Control(req->bRequest,
|
||||||
(uint8_t *)hcdc->data,
|
(uint8_t *)hcdc->data,
|
||||||
req->wLength);
|
req->wLength);
|
||||||
|
|
||||||
@@ -614,14 +460,14 @@ static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
hcdc->CmdOpCode = req->bRequest;
|
hcdc->CmdOpCode = req->bRequest;
|
||||||
hcdc->CmdLength = (uint8_t)req->wLength;
|
hcdc->CmdLength = (uint8_t)MIN(req->wLength, USB_MAX_EP0_SIZE);
|
||||||
|
|
||||||
(void)USBD_CtlPrepareRx(pdev, (uint8_t *)hcdc->data, req->wLength);
|
(void)USBD_CtlPrepareRx(pdev, (uint8_t *)hcdc->data, hcdc->CmdLength);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Control(req->bRequest,
|
((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->Control(req->bRequest,
|
||||||
(uint8_t *)req, 0U);
|
(uint8_t *)req, 0U);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -690,20 +536,20 @@ static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef *pdev,
|
|||||||
static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum)
|
static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum)
|
||||||
{
|
{
|
||||||
USBD_CDC_HandleTypeDef *hcdc;
|
USBD_CDC_HandleTypeDef *hcdc;
|
||||||
PCD_HandleTypeDef *hpcd = pdev->pData;
|
PCD_HandleTypeDef *hpcd = (PCD_HandleTypeDef *)pdev->pData;
|
||||||
|
|
||||||
if (pdev->pClassData == NULL)
|
if (pdev->pClassDataCmsit[pdev->classId] == NULL)
|
||||||
{
|
{
|
||||||
return (uint8_t)USBD_FAIL;
|
return (uint8_t)USBD_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassData;
|
hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId];
|
||||||
|
|
||||||
if ((pdev->ep_in[epnum].total_length > 0U) &&
|
if ((pdev->ep_in[epnum & 0xFU].total_length > 0U) &&
|
||||||
((pdev->ep_in[epnum].total_length % hpcd->IN_ep[epnum].maxpacket) == 0U))
|
((pdev->ep_in[epnum & 0xFU].total_length % hpcd->IN_ep[epnum & 0xFU].maxpacket) == 0U))
|
||||||
{
|
{
|
||||||
/* Update the packet total length */
|
/* Update the packet total length */
|
||||||
pdev->ep_in[epnum].total_length = 0U;
|
pdev->ep_in[epnum & 0xFU].total_length = 0U;
|
||||||
|
|
||||||
/* Send ZLP */
|
/* Send ZLP */
|
||||||
(void)USBD_LL_Transmit(pdev, epnum, NULL, 0U);
|
(void)USBD_LL_Transmit(pdev, epnum, NULL, 0U);
|
||||||
@@ -712,9 +558,9 @@ static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum)
|
|||||||
{
|
{
|
||||||
hcdc->TxState = 0U;
|
hcdc->TxState = 0U;
|
||||||
|
|
||||||
if (((USBD_CDC_ItfTypeDef *)pdev->pUserData)->TransmitCplt != NULL)
|
if (((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->TransmitCplt != NULL)
|
||||||
{
|
{
|
||||||
((USBD_CDC_ItfTypeDef *)pdev->pUserData)->TransmitCplt(hcdc->TxBuffer, &hcdc->TxLength, epnum);
|
((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->TransmitCplt(hcdc->TxBuffer, &hcdc->TxLength, epnum);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -730,9 +576,9 @@ static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum)
|
|||||||
*/
|
*/
|
||||||
static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum)
|
static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum)
|
||||||
{
|
{
|
||||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassData;
|
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId];
|
||||||
|
|
||||||
if (pdev->pClassData == NULL)
|
if (pdev->pClassDataCmsit[pdev->classId] == NULL)
|
||||||
{
|
{
|
||||||
return (uint8_t)USBD_FAIL;
|
return (uint8_t)USBD_FAIL;
|
||||||
}
|
}
|
||||||
@@ -743,7 +589,7 @@ static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum)
|
|||||||
/* USB data will be immediately processed, this allow next USB traffic being
|
/* USB data will be immediately processed, this allow next USB traffic being
|
||||||
NAKed till the end of the application Xfer */
|
NAKed till the end of the application Xfer */
|
||||||
|
|
||||||
((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Receive(hcdc->RxBuffer, &hcdc->RxLength);
|
((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->Receive(hcdc->RxBuffer, &hcdc->RxLength);
|
||||||
|
|
||||||
return (uint8_t)USBD_OK;
|
return (uint8_t)USBD_OK;
|
||||||
}
|
}
|
||||||
@@ -756,16 +602,16 @@ static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum)
|
|||||||
*/
|
*/
|
||||||
static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev)
|
static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev)
|
||||||
{
|
{
|
||||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassData;
|
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId];
|
||||||
|
|
||||||
if (hcdc == NULL)
|
if (hcdc == NULL)
|
||||||
{
|
{
|
||||||
return (uint8_t)USBD_FAIL;
|
return (uint8_t)USBD_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((pdev->pUserData != NULL) && (hcdc->CmdOpCode != 0xFFU))
|
if ((pdev->pUserData[pdev->classId] != NULL) && (hcdc->CmdOpCode != 0xFFU))
|
||||||
{
|
{
|
||||||
((USBD_CDC_ItfTypeDef *)pdev->pUserData)->Control(hcdc->CmdOpCode,
|
((USBD_CDC_ItfTypeDef *)pdev->pUserData[pdev->classId])->Control(hcdc->CmdOpCode,
|
||||||
(uint8_t *)hcdc->data,
|
(uint8_t *)hcdc->data,
|
||||||
(uint16_t)hcdc->CmdLength);
|
(uint16_t)hcdc->CmdLength);
|
||||||
hcdc->CmdOpCode = 0xFFU;
|
hcdc->CmdOpCode = 0xFFU;
|
||||||
@@ -773,47 +619,98 @@ static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef *pdev)
|
|||||||
|
|
||||||
return (uint8_t)USBD_OK;
|
return (uint8_t)USBD_OK;
|
||||||
}
|
}
|
||||||
|
#ifndef USE_USBD_COMPOSITE
|
||||||
/**
|
/**
|
||||||
* @brief USBD_CDC_GetFSCfgDesc
|
* @brief USBD_CDC_GetFSCfgDesc
|
||||||
* Return configuration descriptor
|
* Return configuration descriptor
|
||||||
* @param speed : current device speed
|
|
||||||
* @param length : pointer data length
|
* @param length : pointer data length
|
||||||
* @retval pointer to descriptor buffer
|
* @retval pointer to descriptor buffer
|
||||||
*/
|
*/
|
||||||
static uint8_t *USBD_CDC_GetFSCfgDesc(uint16_t *length)
|
static uint8_t *USBD_CDC_GetFSCfgDesc(uint16_t *length)
|
||||||
{
|
{
|
||||||
*length = (uint16_t)sizeof(USBD_CDC_CfgFSDesc);
|
USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_CMD_EP);
|
||||||
|
USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_OUT_EP);
|
||||||
|
USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_IN_EP);
|
||||||
|
|
||||||
return USBD_CDC_CfgFSDesc;
|
if (pEpCmdDesc != NULL)
|
||||||
|
{
|
||||||
|
pEpCmdDesc->bInterval = CDC_FS_BINTERVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pEpOutDesc != NULL)
|
||||||
|
{
|
||||||
|
pEpOutDesc->wMaxPacketSize = CDC_DATA_FS_MAX_PACKET_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pEpInDesc != NULL)
|
||||||
|
{
|
||||||
|
pEpInDesc->wMaxPacketSize = CDC_DATA_FS_MAX_PACKET_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
*length = (uint16_t)sizeof(USBD_CDC_CfgDesc);
|
||||||
|
return USBD_CDC_CfgDesc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief USBD_CDC_GetHSCfgDesc
|
* @brief USBD_CDC_GetHSCfgDesc
|
||||||
* Return configuration descriptor
|
* Return configuration descriptor
|
||||||
* @param speed : current device speed
|
|
||||||
* @param length : pointer data length
|
* @param length : pointer data length
|
||||||
* @retval pointer to descriptor buffer
|
* @retval pointer to descriptor buffer
|
||||||
*/
|
*/
|
||||||
static uint8_t *USBD_CDC_GetHSCfgDesc(uint16_t *length)
|
static uint8_t *USBD_CDC_GetHSCfgDesc(uint16_t *length)
|
||||||
{
|
{
|
||||||
*length = (uint16_t)sizeof(USBD_CDC_CfgHSDesc);
|
USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_CMD_EP);
|
||||||
|
USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_OUT_EP);
|
||||||
|
USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_IN_EP);
|
||||||
|
|
||||||
return USBD_CDC_CfgHSDesc;
|
if (pEpCmdDesc != NULL)
|
||||||
|
{
|
||||||
|
pEpCmdDesc->bInterval = CDC_HS_BINTERVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pEpOutDesc != NULL)
|
||||||
|
{
|
||||||
|
pEpOutDesc->wMaxPacketSize = CDC_DATA_HS_MAX_PACKET_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pEpInDesc != NULL)
|
||||||
|
{
|
||||||
|
pEpInDesc->wMaxPacketSize = CDC_DATA_HS_MAX_PACKET_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
*length = (uint16_t)sizeof(USBD_CDC_CfgDesc);
|
||||||
|
return USBD_CDC_CfgDesc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief USBD_CDC_GetOtherSpeedCfgDesc
|
* @brief USBD_CDC_GetOtherSpeedCfgDesc
|
||||||
* Return configuration descriptor
|
* Return configuration descriptor
|
||||||
* @param speed : current device speed
|
|
||||||
* @param length : pointer data length
|
* @param length : pointer data length
|
||||||
* @retval pointer to descriptor buffer
|
* @retval pointer to descriptor buffer
|
||||||
*/
|
*/
|
||||||
static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length)
|
static uint8_t *USBD_CDC_GetOtherSpeedCfgDesc(uint16_t *length)
|
||||||
{
|
{
|
||||||
*length = (uint16_t)sizeof(USBD_CDC_OtherSpeedCfgDesc);
|
USBD_EpDescTypeDef *pEpCmdDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_CMD_EP);
|
||||||
|
USBD_EpDescTypeDef *pEpOutDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_OUT_EP);
|
||||||
|
USBD_EpDescTypeDef *pEpInDesc = USBD_GetEpDesc(USBD_CDC_CfgDesc, CDC_IN_EP);
|
||||||
|
|
||||||
return USBD_CDC_OtherSpeedCfgDesc;
|
if (pEpCmdDesc != NULL)
|
||||||
|
{
|
||||||
|
pEpCmdDesc->bInterval = CDC_FS_BINTERVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pEpOutDesc != NULL)
|
||||||
|
{
|
||||||
|
pEpOutDesc->wMaxPacketSize = CDC_DATA_FS_MAX_PACKET_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pEpInDesc != NULL)
|
||||||
|
{
|
||||||
|
pEpInDesc->wMaxPacketSize = CDC_DATA_FS_MAX_PACKET_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
*length = (uint16_t)sizeof(USBD_CDC_CfgDesc);
|
||||||
|
return USBD_CDC_CfgDesc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -828,7 +725,7 @@ uint8_t *USBD_CDC_GetDeviceQualifierDescriptor(uint16_t *length)
|
|||||||
|
|
||||||
return USBD_CDC_DeviceQualifierDesc;
|
return USBD_CDC_DeviceQualifierDesc;
|
||||||
}
|
}
|
||||||
|
#endif /* USE_USBD_COMPOSITE */
|
||||||
/**
|
/**
|
||||||
* @brief USBD_CDC_RegisterInterface
|
* @brief USBD_CDC_RegisterInterface
|
||||||
* @param pdev: device instance
|
* @param pdev: device instance
|
||||||
@@ -843,21 +740,31 @@ uint8_t USBD_CDC_RegisterInterface(USBD_HandleTypeDef *pdev,
|
|||||||
return (uint8_t)USBD_FAIL;
|
return (uint8_t)USBD_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
pdev->pUserData = fops;
|
pdev->pUserData[pdev->classId] = fops;
|
||||||
|
|
||||||
return (uint8_t)USBD_OK;
|
return (uint8_t)USBD_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief USBD_CDC_SetTxBuffer
|
* @brief USBD_CDC_SetTxBuffer
|
||||||
* @param pdev: device instance
|
* @param pdev: device instance
|
||||||
* @param pbuff: Tx Buffer
|
* @param pbuff: Tx Buffer
|
||||||
|
* @param length: length of data to be sent
|
||||||
|
* @param ClassId: The Class ID
|
||||||
* @retval status
|
* @retval status
|
||||||
*/
|
*/
|
||||||
|
#ifdef USE_USBD_COMPOSITE
|
||||||
|
uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev,
|
||||||
|
uint8_t *pbuff, uint32_t length, uint8_t ClassId)
|
||||||
|
{
|
||||||
|
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[ClassId];
|
||||||
|
#else
|
||||||
uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev,
|
uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev,
|
||||||
uint8_t *pbuff, uint32_t length)
|
uint8_t *pbuff, uint32_t length)
|
||||||
{
|
{
|
||||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassData;
|
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId];
|
||||||
|
#endif /* USE_USBD_COMPOSITE */
|
||||||
|
|
||||||
if (hcdc == NULL)
|
if (hcdc == NULL)
|
||||||
{
|
{
|
||||||
@@ -878,7 +785,7 @@ uint8_t USBD_CDC_SetTxBuffer(USBD_HandleTypeDef *pdev,
|
|||||||
*/
|
*/
|
||||||
uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff)
|
uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff)
|
||||||
{
|
{
|
||||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassData;
|
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId];
|
||||||
|
|
||||||
if (hcdc == NULL)
|
if (hcdc == NULL)
|
||||||
{
|
{
|
||||||
@@ -890,18 +797,32 @@ uint8_t USBD_CDC_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff)
|
|||||||
return (uint8_t)USBD_OK;
|
return (uint8_t)USBD_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief USBD_CDC_TransmitPacket
|
* @brief USBD_CDC_TransmitPacket
|
||||||
* Transmit packet on IN endpoint
|
* Transmit packet on IN endpoint
|
||||||
* @param pdev: device instance
|
* @param pdev: device instance
|
||||||
|
* @param ClassId: The Class ID
|
||||||
* @retval status
|
* @retval status
|
||||||
*/
|
*/
|
||||||
|
#ifdef USE_USBD_COMPOSITE
|
||||||
|
uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev, uint8_t ClassId)
|
||||||
|
{
|
||||||
|
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[ClassId];
|
||||||
|
#else
|
||||||
uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev)
|
uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev)
|
||||||
{
|
{
|
||||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassData;
|
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId];
|
||||||
|
#endif /* USE_USBD_COMPOSITE */
|
||||||
|
|
||||||
USBD_StatusTypeDef ret = USBD_BUSY;
|
USBD_StatusTypeDef ret = USBD_BUSY;
|
||||||
|
|
||||||
if (pdev->pClassData == NULL)
|
#ifdef USE_USBD_COMPOSITE
|
||||||
|
/* Get the Endpoints addresses allocated for this class instance */
|
||||||
|
CDCInEpAdd = USBD_CoreGetEPAdd(pdev, USBD_EP_IN, USBD_EP_TYPE_BULK, ClassId);
|
||||||
|
#endif /* USE_USBD_COMPOSITE */
|
||||||
|
|
||||||
|
if (hcdc == NULL)
|
||||||
{
|
{
|
||||||
return (uint8_t)USBD_FAIL;
|
return (uint8_t)USBD_FAIL;
|
||||||
}
|
}
|
||||||
@@ -912,10 +833,10 @@ uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev)
|
|||||||
hcdc->TxState = 1U;
|
hcdc->TxState = 1U;
|
||||||
|
|
||||||
/* Update the packet total length */
|
/* Update the packet total length */
|
||||||
pdev->ep_in[CDC_IN_EP & 0xFU].total_length = hcdc->TxLength;
|
pdev->ep_in[CDCInEpAdd & 0xFU].total_length = hcdc->TxLength;
|
||||||
|
|
||||||
/* Transmit next packet */
|
/* Transmit next packet */
|
||||||
(void)USBD_LL_Transmit(pdev, CDC_IN_EP, hcdc->TxBuffer, hcdc->TxLength);
|
(void)USBD_LL_Transmit(pdev, CDCInEpAdd, hcdc->TxBuffer, hcdc->TxLength);
|
||||||
|
|
||||||
ret = USBD_OK;
|
ret = USBD_OK;
|
||||||
}
|
}
|
||||||
@@ -931,9 +852,14 @@ uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev)
|
|||||||
*/
|
*/
|
||||||
uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev)
|
uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev)
|
||||||
{
|
{
|
||||||
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassData;
|
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef *)pdev->pClassDataCmsit[pdev->classId];
|
||||||
|
|
||||||
if (pdev->pClassData == NULL)
|
#ifdef USE_USBD_COMPOSITE
|
||||||
|
/* Get the Endpoints addresses allocated for this class instance */
|
||||||
|
CDCOutEpAdd = 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;
|
return (uint8_t)USBD_FAIL;
|
||||||
}
|
}
|
||||||
@@ -941,13 +867,13 @@ uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev)
|
|||||||
if (pdev->dev_speed == USBD_SPEED_HIGH)
|
if (pdev->dev_speed == USBD_SPEED_HIGH)
|
||||||
{
|
{
|
||||||
/* Prepare Out endpoint to receive next packet */
|
/* Prepare Out endpoint to receive next packet */
|
||||||
(void)USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer,
|
(void)USBD_LL_PrepareReceive(pdev, CDCOutEpAdd, hcdc->RxBuffer,
|
||||||
CDC_DATA_HS_OUT_PACKET_SIZE);
|
CDC_DATA_HS_OUT_PACKET_SIZE);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Prepare Out endpoint to receive next packet */
|
/* Prepare Out endpoint to receive next packet */
|
||||||
(void)USBD_LL_PrepareReceive(pdev, CDC_OUT_EP, hcdc->RxBuffer,
|
(void)USBD_LL_PrepareReceive(pdev, CDCOutEpAdd, hcdc->RxBuffer,
|
||||||
CDC_DATA_FS_OUT_PACKET_SIZE);
|
CDC_DATA_FS_OUT_PACKET_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -965,4 +891,3 @@ uint8_t USBD_CDC_ReceivePacket(USBD_HandleTypeDef *pdev)
|
|||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|||||||
@@ -6,13 +6,12 @@
|
|||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @attention
|
* @attention
|
||||||
*
|
*
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
* Copyright (c) 2015 STMicroelectronics.
|
||||||
* All rights reserved.</center></h2>
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
* in the root directory of this software component.
|
||||||
* the License. You may obtain a copy of the License at:
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
*
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
@@ -23,7 +22,7 @@
|
|||||||
EndBSPDependencies */
|
EndBSPDependencies */
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
/* Includes ------------------------------------------------------------------*/
|
||||||
#include "usbd_cdc_if_template.h"
|
#include "usbd_cdc_if.h"
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
||||||
* @{
|
* @{
|
||||||
@@ -87,8 +86,21 @@ USBD_CDC_LineCodingTypeDef linecoding =
|
|||||||
0x08 /* nb. of bits 8*/
|
0x08 /* nb. of bits 8*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Create buffer for reception and transmission */
|
||||||
|
/* It's up to user to redefine and/or remove those define */
|
||||||
|
/** Received data over USB are stored in this buffer */
|
||||||
|
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
|
||||||
|
/** Data to send over USB CDC are stored in this buffer */
|
||||||
|
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
|
||||||
|
extern USBD_HandleTypeDef hUsbDeviceFS;
|
||||||
|
|
||||||
/* Private functions ---------------------------------------------------------*/
|
/* Private functions ---------------------------------------------------------*/
|
||||||
|
|
||||||
|
__weak void TEMPLATE_ReceiveUserspace(uint8_t *Buf, uint32_t *Len)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief TEMPLATE_Init
|
* @brief TEMPLATE_Init
|
||||||
* Initializes the CDC media low layer
|
* Initializes the CDC media low layer
|
||||||
@@ -97,9 +109,8 @@ USBD_CDC_LineCodingTypeDef linecoding =
|
|||||||
*/
|
*/
|
||||||
static int8_t TEMPLATE_Init(void)
|
static int8_t TEMPLATE_Init(void)
|
||||||
{
|
{
|
||||||
/*
|
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0);
|
||||||
Add your initialization code here
|
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS);
|
||||||
*/
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,6 +139,8 @@ static int8_t TEMPLATE_DeInit(void)
|
|||||||
*/
|
*/
|
||||||
static int8_t TEMPLATE_Control(uint8_t cmd, uint8_t *pbuf, uint16_t length)
|
static int8_t TEMPLATE_Control(uint8_t cmd, uint8_t *pbuf, uint16_t length)
|
||||||
{
|
{
|
||||||
|
UNUSED(length);
|
||||||
|
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
case CDC_SEND_ENCAPSULATED_COMMAND:
|
case CDC_SEND_ENCAPSULATED_COMMAND:
|
||||||
@@ -208,7 +221,23 @@ static int8_t TEMPLATE_Receive(uint8_t *Buf, uint32_t *Len)
|
|||||||
UNUSED(Buf);
|
UNUSED(Buf);
|
||||||
UNUSED(Len);
|
UNUSED(Len);
|
||||||
|
|
||||||
return (0);
|
TEMPLATE_ReceiveUserspace(Buf, Len);
|
||||||
|
|
||||||
|
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
|
||||||
|
return (USBD_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t TEMPLATE_Transmit(uint8_t* Buf, uint16_t Len)
|
||||||
|
{
|
||||||
|
uint8_t result = USBD_OK;
|
||||||
|
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
|
||||||
|
if (hcdc->TxState != 0){
|
||||||
|
return
|
||||||
|
USBD_BUSY;
|
||||||
|
}
|
||||||
|
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
|
||||||
|
result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -244,5 +273,3 @@ static int8_t TEMPLATE_TransmitCplt(uint8_t *Buf, uint32_t *Len, uint8_t epnum)
|
|||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
||||||
@@ -1,257 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_cdc_ecm.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief header file for the usbd_cdc_ecm.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2019 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __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 */
|
|
||||||
|
|
||||||
|
|
||||||
#define CDC_ECM_IN_EP 0x81U /* EP1 for data IN */
|
|
||||||
#define CDC_ECM_OUT_EP 0x01U /* EP1 for data OUT */
|
|
||||||
#define CDC_ECM_CMD_EP 0x82U /* EP2 for CDC ECM commands */
|
|
||||||
|
|
||||||
#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 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_CMD_PACKET_SIZE 16U /* Control Endpoint 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;
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
uint32_t data[CDC_ECM_DATA_BUFFER_SIZE / 4]; /* Force 32bits 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;
|
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
NETWORK_CONNECTION = 0x00,
|
|
||||||
RESPONSE_AVAILABLE = 0x01,
|
|
||||||
CONNECTION_SPEED_CHANGE = 0x2A
|
|
||||||
} USBD_CDC_ECM_NotifCodeTypeDef;
|
|
||||||
|
|
||||||
/** @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_SetTxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff,
|
|
||||||
uint32_t length);
|
|
||||||
|
|
||||||
uint8_t USBD_CDC_ECM_SetRxBuffer(USBD_HandleTypeDef *pdev, uint8_t *pbuff);
|
|
||||||
|
|
||||||
uint8_t USBD_CDC_ECM_ReceivePacket(USBD_HandleTypeDef *pdev);
|
|
||||||
|
|
||||||
uint8_t USBD_CDC_ECM_TransmitPacket(USBD_HandleTypeDef *pdev);
|
|
||||||
|
|
||||||
uint8_t USBD_CDC_ECM_SendNotification(USBD_HandleTypeDef *pdev,
|
|
||||||
USBD_CDC_ECM_NotifCodeTypeDef Notif,
|
|
||||||
uint16_t bVal, uint8_t *pData);
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __USB_CDC_ECM_H */
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,82 +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
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2019 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USBD_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 */
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,247 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file Src/usbd_cdc_ecm_if_template.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief Source file for USBD CDC_ECM interface
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2019 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "main.h"
|
|
||||||
/*
|
|
||||||
|
|
||||||
Include here LwIP files if used
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
|
||||||
/* Private define ------------------------------------------------------------*/
|
|
||||||
/* Private macro -------------------------------------------------------------*/
|
|
||||||
/* Private variables ---------------------------------------------------------*/
|
|
||||||
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
__ALIGN_BEGIN static uint8_t UserRxBuffer[CDC_ECM_ETH_MAX_SEGSZE + 100]__ALIGN_END; /* Received Data over USB are stored in this buffer */
|
|
||||||
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
__ALIGN_BEGIN static uint8_t UserTxBuffer[CDC_ECM_ETH_MAX_SEGSZE + 100]__ALIGN_END; /* Received Data over CDC_ECM (CDC_ECM interface) are stored in this buffer */
|
|
||||||
|
|
||||||
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 */
|
|
||||||
(void)USBD_CDC_ECM_SetTxBuffer(&USBD_Device, UserTxBuffer, 0U);
|
|
||||||
(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)
|
|
||||||
{
|
|
||||||
USBD_CDC_ECM_HandleTypeDef *hcdc_cdc_ecm = (USBD_CDC_ECM_HandleTypeDef *)(USBD_Device.pClassData);
|
|
||||||
|
|
||||||
/* 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)
|
|
||||||
{
|
|
||||||
USBD_CDC_ECM_HandleTypeDef *hcdc_cdc_ecm = (USBD_CDC_ECM_HandleTypeDef *)(USBD_Device.pClassData);
|
|
||||||
|
|
||||||
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 */
|
|
||||||
USBD_CDC_ECM_HandleTypeDef *hcdc_cdc_ecm = (USBD_CDC_ECM_HandleTypeDef *)(USBD_Device.pClassData);
|
|
||||||
|
|
||||||
/* 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 */
|
|
||||||
USBD_CDC_ECM_HandleTypeDef *hcdc_cdc_ecm = (USBD_CDC_ECM_HandleTypeDef *)(pdev->pClassData);
|
|
||||||
|
|
||||||
if ((hcdc_cdc_ecm != NULL) && (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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,529 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_cdc_rndis.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief header file for the usbd_cdc_rndis.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __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
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define CDC_RNDIS_IN_EP 0x81U /* EP1 for data IN */
|
|
||||||
#define CDC_RNDIS_OUT_EP 0x01U /* EP1 for data OUT */
|
|
||||||
#define CDC_RNDIS_CMD_EP 0x82U /* EP2 for CDC_RNDIS commands */
|
|
||||||
|
|
||||||
#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 */
|
|
||||||
|
|
||||||
|
|
||||||
/* 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_CMD_PACKET_SIZE 16U /* Control Endpoint 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[2000 / 4]; /* Force 32bits 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;
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
NETWORK_CONNECTION = 0x00,
|
|
||||||
RESPONSE_AVAILABLE = 0x01,
|
|
||||||
CONNECTION_SPEED_CHANGE = 0x2A
|
|
||||||
} USBD_CDC_RNDIS_NotifCodeTypeDef;
|
|
||||||
|
|
||||||
|
|
||||||
/* 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_TransmitPacket(USBD_HandleTypeDef *pdev);
|
|
||||||
|
|
||||||
uint8_t USBD_CDC_RNDIS_RegisterInterface(USBD_HandleTypeDef *pdev,
|
|
||||||
USBD_CDC_RNDIS_ItfTypeDef *fops);
|
|
||||||
|
|
||||||
uint8_t USBD_CDC_RNDIS_SetTxBuffer(USBD_HandleTypeDef *pdev,
|
|
||||||
uint8_t *pbuff, uint32_t length);
|
|
||||||
|
|
||||||
uint8_t USBD_CDC_RNDIS_SendNotification(USBD_HandleTypeDef *pdev,
|
|
||||||
USBD_CDC_RNDIS_NotifCodeTypeDef Notif,
|
|
||||||
uint16_t bVal, uint8_t *pData);
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __USB_CDC_RNDIS_H */
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_cdc_rndis_if_template.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief Header for usbd_cdc_rndis_if.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2019 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USBD_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 */
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,233 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_cdc_rndis_if_template.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief Source file for USBD CDC_RNDIS interface template
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2019 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* Include 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 "main.h"
|
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
|
||||||
/* Private define ------------------------------------------------------------*/
|
|
||||||
/* Private macro -------------------------------------------------------------*/
|
|
||||||
/* Private variables ---------------------------------------------------------*/
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
__ALIGN_BEGIN uint8_t UserRxBuffer[CDC_RNDIS_ETH_MAX_SEGSZE + 100] __ALIGN_END; /* Received Data over USB are stored in this buffer */
|
|
||||||
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
|
||||||
#pragma data_alignment=4
|
|
||||||
#endif
|
|
||||||
__ALIGN_BEGIN static uint8_t UserTxBuffer[CDC_RNDIS_ETH_MAX_SEGSZE + 100] __ALIGN_END; /* Received Data over CDC_RNDIS (CDC_RNDIS interface) are stored in this buffer */
|
|
||||||
|
|
||||||
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 */
|
|
||||||
(void)USBD_CDC_RNDIS_SetTxBuffer(&USBD_Device, UserTxBuffer, 0U);
|
|
||||||
(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)
|
|
||||||
{
|
|
||||||
USBD_CDC_RNDIS_HandleTypeDef *hcdc_cdc_rndis = (USBD_CDC_RNDIS_HandleTypeDef *)(USBD_Device.pClassData);
|
|
||||||
|
|
||||||
/*
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
USBD_CDC_RNDIS_HandleTypeDef *hcdc_cdc_rndis = (USBD_CDC_RNDIS_HandleTypeDef *)(USBD_Device.pClassData);
|
|
||||||
|
|
||||||
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 */
|
|
||||||
USBD_CDC_RNDIS_HandleTypeDef *hcdc_cdc_rndis = (USBD_CDC_RNDIS_HandleTypeDef *)(USBD_Device.pClassData);
|
|
||||||
|
|
||||||
/* 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 */
|
|
||||||
USBD_CDC_RNDIS_HandleTypeDef *hcdc_cdc_rndis = (USBD_CDC_RNDIS_HandleTypeDef *)(pdev->pClassData);
|
|
||||||
|
|
||||||
if ((hcdc_cdc_rndis != NULL) && (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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,170 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_customhid.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief header file for the usbd_customhid.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __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
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define CUSTOM_HID_EPIN_ADDR 0x81U
|
|
||||||
|
|
||||||
#ifndef CUSTOM_HID_EPIN_SIZE
|
|
||||||
#define CUSTOM_HID_EPIN_SIZE 0x02U
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define CUSTOM_HID_EPOUT_ADDR 0x01U
|
|
||||||
|
|
||||||
#ifndef CUSTOM_HID_EPOUT_SIZE
|
|
||||||
#define CUSTOM_HID_EPOUT_SIZE 0x02U
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#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;
|
|
||||||
int8_t (* Init)(void);
|
|
||||||
int8_t (* DeInit)(void);
|
|
||||||
int8_t (* OutEvent)(uint8_t event_idx, uint8_t state);
|
|
||||||
|
|
||||||
} 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;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @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
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
uint8_t USBD_CUSTOM_HID_SendReport(USBD_HandleTypeDef *pdev,
|
|
||||||
uint8_t *report, uint16_t len);
|
|
||||||
|
|
||||||
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 */
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_customhid_if_template.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief Header for usbd_customhid_if_template.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USBD_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 */
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,781 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_customhid.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief This file provides the CUSTOM_HID core functions.
|
|
||||||
*
|
|
||||||
* @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
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* BSPDependencies
|
|
||||||
- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c"
|
|
||||||
- "stm32xxxxx_{eval}{discovery}_io.c"
|
|
||||||
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);
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @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,
|
|
||||||
USBD_CUSTOM_HID_GetHSCfgDesc,
|
|
||||||
USBD_CUSTOM_HID_GetFSCfgDesc,
|
|
||||||
USBD_CUSTOM_HID_GetOtherSpeedCfgDesc,
|
|
||||||
USBD_CUSTOM_HID_GetDeviceQualifierDesc,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* USB CUSTOM_HID device FS Configuration Descriptor */
|
|
||||||
__ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgFSDesc[USB_CUSTOM_HID_CONFIG_DESC_SIZ] __ALIGN_END =
|
|
||||||
{
|
|
||||||
0x09, /* bLength: Configuration Descriptor size */
|
|
||||||
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
|
|
||||||
USB_CUSTOM_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)
|
|
||||||
0xC0, /* bmAttributes: Bus Powered according to user configuration */
|
|
||||||
#else
|
|
||||||
0x80, /* bmAttributes: Bus Powered according to user configuration */
|
|
||||||
#endif
|
|
||||||
USBD_MAX_POWER, /* MaxPower 100 mA: this current is used for detecting Vbus */
|
|
||||||
|
|
||||||
/************** 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 */
|
|
||||||
USBD_CUSTOM_HID_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */
|
|
||||||
0x00,
|
|
||||||
/******************** 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 */
|
|
||||||
CUSTOM_HID_EPIN_SIZE, /* wMaxPacketSize: 2 Byte max */
|
|
||||||
0x00,
|
|
||||||
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 */
|
|
||||||
CUSTOM_HID_EPOUT_SIZE, /* wMaxPacketSize: 2 Bytes max */
|
|
||||||
0x00,
|
|
||||||
CUSTOM_HID_FS_BINTERVAL, /* bInterval: Polling Interval */
|
|
||||||
/* 41 */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* USB CUSTOM_HID device HS Configuration Descriptor */
|
|
||||||
__ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_CfgHSDesc[USB_CUSTOM_HID_CONFIG_DESC_SIZ] __ALIGN_END =
|
|
||||||
{
|
|
||||||
0x09, /* bLength: Configuration Descriptor size */
|
|
||||||
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
|
|
||||||
USB_CUSTOM_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)
|
|
||||||
0xC0, /* bmAttributes: Bus Powered according to user configuration */
|
|
||||||
#else
|
|
||||||
0x80, /* bmAttributes: Bus Powered according to user configuration */
|
|
||||||
#endif
|
|
||||||
USBD_MAX_POWER, /* MaxPower 100 mA: this current is used for detecting Vbus */
|
|
||||||
|
|
||||||
/************** 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 */
|
|
||||||
0, /* 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 */
|
|
||||||
USBD_CUSTOM_HID_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */
|
|
||||||
0x00,
|
|
||||||
/******************** 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 */
|
|
||||||
CUSTOM_HID_EPIN_SIZE, /* wMaxPacketSize: 2 Byte max */
|
|
||||||
0x00,
|
|
||||||
CUSTOM_HID_HS_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 */
|
|
||||||
CUSTOM_HID_EPOUT_SIZE, /* wMaxPacketSize: 2 Bytes max */
|
|
||||||
0x00,
|
|
||||||
CUSTOM_HID_HS_BINTERVAL, /* bInterval: Polling Interval */
|
|
||||||
/* 41 */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* USB CUSTOM_HID device Other Speed Configuration Descriptor */
|
|
||||||
__ALIGN_BEGIN static uint8_t USBD_CUSTOM_HID_OtherSpeedCfgDesc[USB_CUSTOM_HID_CONFIG_DESC_SIZ] __ALIGN_END =
|
|
||||||
{
|
|
||||||
0x09, /* bLength: Configuration Descriptor size */
|
|
||||||
USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */
|
|
||||||
USB_CUSTOM_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)
|
|
||||||
0xC0, /* bmAttributes: Bus Powered according to user configuration */
|
|
||||||
#else
|
|
||||||
0x80, /* bmAttributes: Bus Powered according to user configuration */
|
|
||||||
#endif
|
|
||||||
USBD_MAX_POWER, /* MaxPower 100 mA: this current is used for detecting Vbus */
|
|
||||||
|
|
||||||
/************** 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 */
|
|
||||||
0, /* 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 */
|
|
||||||
USBD_CUSTOM_HID_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */
|
|
||||||
0x00,
|
|
||||||
/******************** 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 */
|
|
||||||
CUSTOM_HID_EPIN_SIZE, /* wMaxPacketSize: 2 Bytes max */
|
|
||||||
0x00,
|
|
||||||
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 */
|
|
||||||
CUSTOM_HID_EPOUT_SIZE, /* wMaxPacketSize: 2 Bytes max */
|
|
||||||
0x00,
|
|
||||||
CUSTOM_HID_FS_BINTERVAL, /* bInterval: Polling Interval */
|
|
||||||
/* 41 */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* 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 */
|
|
||||||
USBD_CUSTOM_HID_REPORT_DESC_SIZE, /* wItemLength: Total length of Report descriptor */
|
|
||||||
0x00,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* 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,
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @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_malloc(sizeof(USBD_CUSTOM_HID_HandleTypeDef));
|
|
||||||
|
|
||||||
if (hhid == NULL)
|
|
||||||
{
|
|
||||||
pdev->pClassData = NULL;
|
|
||||||
return (uint8_t)USBD_EMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdev->pClassData = (void *)hhid;
|
|
||||||
|
|
||||||
if (pdev->dev_speed == USBD_SPEED_HIGH)
|
|
||||||
{
|
|
||||||
pdev->ep_in[CUSTOM_HID_EPIN_ADDR & 0xFU].bInterval = CUSTOM_HID_HS_BINTERVAL;
|
|
||||||
pdev->ep_out[CUSTOM_HID_EPOUT_ADDR & 0xFU].bInterval = CUSTOM_HID_HS_BINTERVAL;
|
|
||||||
}
|
|
||||||
else /* LOW and FULL-speed endpoints */
|
|
||||||
{
|
|
||||||
pdev->ep_in[CUSTOM_HID_EPIN_ADDR & 0xFU].bInterval = CUSTOM_HID_FS_BINTERVAL;
|
|
||||||
pdev->ep_out[CUSTOM_HID_EPOUT_ADDR & 0xFU].bInterval = CUSTOM_HID_FS_BINTERVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Open EP IN */
|
|
||||||
(void)USBD_LL_OpenEP(pdev, CUSTOM_HID_EPIN_ADDR, USBD_EP_TYPE_INTR,
|
|
||||||
CUSTOM_HID_EPIN_SIZE);
|
|
||||||
|
|
||||||
pdev->ep_in[CUSTOM_HID_EPIN_ADDR & 0xFU].is_used = 1U;
|
|
||||||
|
|
||||||
/* Open EP OUT */
|
|
||||||
(void)USBD_LL_OpenEP(pdev, CUSTOM_HID_EPOUT_ADDR, USBD_EP_TYPE_INTR,
|
|
||||||
CUSTOM_HID_EPOUT_SIZE);
|
|
||||||
|
|
||||||
pdev->ep_out[CUSTOM_HID_EPOUT_ADDR & 0xFU].is_used = 1U;
|
|
||||||
|
|
||||||
hhid->state = CUSTOM_HID_IDLE;
|
|
||||||
|
|
||||||
((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData)->Init();
|
|
||||||
|
|
||||||
/* Prepare Out endpoint to receive 1st packet */
|
|
||||||
(void)USBD_LL_PrepareReceive(pdev, CUSTOM_HID_EPOUT_ADDR, hhid->Report_buf,
|
|
||||||
USBD_CUSTOMHID_OUTREPORT_BUF_SIZE);
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
/* Close CUSTOM_HID EP IN */
|
|
||||||
(void)USBD_LL_CloseEP(pdev, CUSTOM_HID_EPIN_ADDR);
|
|
||||||
pdev->ep_in[CUSTOM_HID_EPIN_ADDR & 0xFU].is_used = 0U;
|
|
||||||
pdev->ep_in[CUSTOM_HID_EPIN_ADDR & 0xFU].bInterval = 0U;
|
|
||||||
|
|
||||||
/* Close CUSTOM_HID EP OUT */
|
|
||||||
(void)USBD_LL_CloseEP(pdev, CUSTOM_HID_EPOUT_ADDR);
|
|
||||||
pdev->ep_out[CUSTOM_HID_EPOUT_ADDR & 0xFU].is_used = 0U;
|
|
||||||
pdev->ep_out[CUSTOM_HID_EPOUT_ADDR & 0xFU].bInterval = 0U;
|
|
||||||
|
|
||||||
/* Free allocated memory */
|
|
||||||
if (pdev->pClassData != NULL)
|
|
||||||
{
|
|
||||||
((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData)->DeInit();
|
|
||||||
USBD_free(pdev->pClassData);
|
|
||||||
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->pClassData;
|
|
||||||
uint16_t len = 0U;
|
|
||||||
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:
|
|
||||||
hhid->IsReportAvailable = 1U;
|
|
||||||
(void)USBD_CtlPrepareRx(pdev, hhid->Report_buf, req->wLength);
|
|
||||||
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) == CUSTOM_HID_REPORT_DESC)
|
|
||||||
{
|
|
||||||
len = MIN(USBD_CUSTOM_HID_REPORT_DESC_SIZE, req->wLength);
|
|
||||||
pbuf = ((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData)->pReport;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((req->wValue >> 8) == CUSTOM_HID_DESCRIPTOR_TYPE)
|
|
||||||
{
|
|
||||||
pbuf = USBD_CUSTOM_HID_Desc;
|
|
||||||
len = MIN(USB_CUSTOM_HID_DESC_SIZ, req->wLength);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
(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_CUSTOM_HID_SendReport
|
|
||||||
* Send CUSTOM_HID Report
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param buff: pointer to report
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
uint8_t USBD_CUSTOM_HID_SendReport(USBD_HandleTypeDef *pdev,
|
|
||||||
uint8_t *report, uint16_t len)
|
|
||||||
{
|
|
||||||
USBD_CUSTOM_HID_HandleTypeDef *hhid;
|
|
||||||
|
|
||||||
if (pdev->pClassData == NULL)
|
|
||||||
{
|
|
||||||
return (uint8_t)USBD_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
hhid = (USBD_CUSTOM_HID_HandleTypeDef *)pdev->pClassData;
|
|
||||||
|
|
||||||
if (pdev->dev_state == USBD_STATE_CONFIGURED)
|
|
||||||
{
|
|
||||||
if (hhid->state == CUSTOM_HID_IDLE)
|
|
||||||
{
|
|
||||||
hhid->state = CUSTOM_HID_BUSY;
|
|
||||||
(void)USBD_LL_Transmit(pdev, CUSTOM_HID_EPIN_ADDR, report, len);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return (uint8_t)USBD_BUSY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return (uint8_t)USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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)
|
|
||||||
{
|
|
||||||
*length = (uint16_t)sizeof(USBD_CUSTOM_HID_CfgFSDesc);
|
|
||||||
|
|
||||||
return USBD_CUSTOM_HID_CfgFSDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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)
|
|
||||||
{
|
|
||||||
*length = (uint16_t)sizeof(USBD_CUSTOM_HID_CfgHSDesc);
|
|
||||||
|
|
||||||
return USBD_CUSTOM_HID_CfgHSDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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)
|
|
||||||
{
|
|
||||||
*length = (uint16_t)sizeof(USBD_CUSTOM_HID_OtherSpeedCfgDesc);
|
|
||||||
|
|
||||||
return USBD_CUSTOM_HID_OtherSpeedCfgDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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->pClassData)->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->pClassData == NULL)
|
|
||||||
{
|
|
||||||
return (uint8_t)USBD_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
hhid = (USBD_CUSTOM_HID_HandleTypeDef *)pdev->pClassData;
|
|
||||||
|
|
||||||
/* USB data will be immediately processed, this allow next USB traffic being
|
|
||||||
NAKed till the end of the application processing */
|
|
||||||
((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData)->OutEvent(hhid->Report_buf[0],
|
|
||||||
hhid->Report_buf[1]);
|
|
||||||
|
|
||||||
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->pClassData == NULL)
|
|
||||||
{
|
|
||||||
return (uint8_t)USBD_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
hhid = (USBD_CUSTOM_HID_HandleTypeDef *)pdev->pClassData;
|
|
||||||
|
|
||||||
/* Resume USB Out process */
|
|
||||||
(void)USBD_LL_PrepareReceive(pdev, CUSTOM_HID_EPOUT_ADDR, 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->pClassData;
|
|
||||||
|
|
||||||
if (hhid == NULL)
|
|
||||||
{
|
|
||||||
return (uint8_t)USBD_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hhid->IsReportAvailable == 1U)
|
|
||||||
{
|
|
||||||
((USBD_CUSTOM_HID_ItfTypeDef *)pdev->pUserData)->OutEvent(hhid->Report_buf[0],
|
|
||||||
hhid->Report_buf[1]);
|
|
||||||
hhid->IsReportAvailable = 0U;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (uint8_t)USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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 = fops;
|
|
||||||
|
|
||||||
return (uint8_t)USBD_OK;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,91 +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
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* BSPDependencies
|
|
||||||
- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c"
|
|
||||||
- "stm32xxxxx_{eval}{discovery}_io.c"
|
|
||||||
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);
|
|
||||||
static int8_t TEMPLATE_CUSTOM_HID_OutEvent(uint8_t event_idx, uint8_t state);
|
|
||||||
/* Private variables ---------------------------------------------------------*/
|
|
||||||
USBD_CUSTOM_HID_ItfTypeDef USBD_CustomHID_template_fops =
|
|
||||||
{
|
|
||||||
TEMPLATE_CUSTOM_HID_ReportDesc,
|
|
||||||
TEMPLATE_CUSTOM_HID_Init,
|
|
||||||
TEMPLATE_CUSTOM_HID_DeInit,
|
|
||||||
TEMPLATE_CUSTOM_HID_OutEvent,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* 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
|
|
||||||
*/
|
|
||||||
static int8_t TEMPLATE_CUSTOM_HID_OutEvent(uint8_t event_idx, uint8_t state)
|
|
||||||
{
|
|
||||||
UNUSED(event_idx);
|
|
||||||
UNUSED(state);
|
|
||||||
|
|
||||||
/* Start next USB packet transfer once data processing is completed */
|
|
||||||
USBD_CUSTOM_HID_ReceivePacket(&USBD_Device);
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,235 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_dfu.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief Header file for the usbd_dfu.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __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 */
|
|
||||||
|
|
||||||
#define USB_DFU_CONFIG_DESC_SIZ (18U + (9U * USBD_DFU_MAX_ITF_NUM))
|
|
||||||
#define USB_DFU_DESC_SIZ 9U
|
|
||||||
|
|
||||||
#define DFU_DESCRIPTOR_TYPE 0x21U
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************************/
|
|
||||||
/* 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 << 4)
|
|
||||||
#define DFU_STATUS_DEPTH 6U
|
|
||||||
|
|
||||||
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)), /* XFERSIZEB0 */\
|
|
||||||
((uint8_t)((size) >> 8)) /* XFERSIZEB1 */
|
|
||||||
|
|
||||||
#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 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);
|
|
||||||
} USBD_DFU_MediaTypeDef;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @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 */
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_dfu_media_template.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief header file for the usbd_dfu_media_template.c file
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USBD_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 */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,135 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_dfu_media_template.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief Memory management layer
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* BSPDependencies
|
|
||||||
- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c"
|
|
||||||
- "stm32xxxxx_{eval}{discovery}_io.c"
|
|
||||||
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);
|
|
||||||
|
|
||||||
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,
|
|
||||||
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* @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)
|
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
/* Return a valid address to avoid HardFault */
|
|
||||||
return (uint8_t *)(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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)
|
|
||||||
{
|
|
||||||
switch (Cmd)
|
|
||||||
{
|
|
||||||
case DFU_MEDIA_PROGRAM:
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DFU_MEDIA_ERASE:
|
|
||||||
default:
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
||||||
@@ -1,139 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_hid.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief Header file for the usbd_hid_core.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __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
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define HID_EPIN_ADDR 0x81U
|
|
||||||
#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 HID_REQ_SET_PROTOCOL 0x0BU
|
|
||||||
#define HID_REQ_GET_PROTOCOL 0x03U
|
|
||||||
|
|
||||||
#define HID_REQ_SET_IDLE 0x0AU
|
|
||||||
#define HID_REQ_GET_IDLE 0x02U
|
|
||||||
|
|
||||||
#define HID_REQ_SET_REPORT 0x09U
|
|
||||||
#define HID_REQ_GET_REPORT 0x01U
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
HID_IDLE = 0,
|
|
||||||
HID_BUSY,
|
|
||||||
} HID_StateTypeDef;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
uint32_t Protocol;
|
|
||||||
uint32_t IdleState;
|
|
||||||
uint32_t AltSetting;
|
|
||||||
HID_StateTypeDef state;
|
|
||||||
} USBD_HID_HandleTypeDef;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @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
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
uint8_t USBD_HID_SendReport(USBD_HandleTypeDef *pdev, uint8_t *report, uint16_t len);
|
|
||||||
uint32_t USBD_HID_GetPollingInterval(USBD_HandleTypeDef *pdev);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __USB_HID_H */
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,706 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_hid.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief This file provides the HID core functions.
|
|
||||||
*
|
|
||||||
* @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
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* BSPDependencies
|
|
||||||
- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c"
|
|
||||||
- "stm32xxxxx_{eval}{discovery}_io.c"
|
|
||||||
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);
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @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,
|
|
||||||
USBD_HID_GetHSCfgDesc,
|
|
||||||
USBD_HID_GetFSCfgDesc,
|
|
||||||
USBD_HID_GetOtherSpeedCfgDesc,
|
|
||||||
USBD_HID_GetDeviceQualifierDesc,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* USB HID device FS Configuration Descriptor */
|
|
||||||
__ALIGN_BEGIN static uint8_t USBD_HID_CfgFSDesc[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_MAX_POWER, /* MaxPower 100 mA: this current is used for detecting Vbus */
|
|
||||||
|
|
||||||
/************** 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 Byte max */
|
|
||||||
0x00,
|
|
||||||
HID_FS_BINTERVAL, /* bInterval: Polling Interval */
|
|
||||||
/* 34 */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* USB HID device HS Configuration Descriptor */
|
|
||||||
__ALIGN_BEGIN static uint8_t USBD_HID_CfgHSDesc[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_MAX_POWER, /* MaxPower 100 mA: this current is used for detecting Vbus */
|
|
||||||
|
|
||||||
/************** 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 Byte max */
|
|
||||||
0x00,
|
|
||||||
HID_HS_BINTERVAL, /* bInterval: Polling Interval */
|
|
||||||
/* 34 */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* USB HID device Other Speed Configuration Descriptor */
|
|
||||||
__ALIGN_BEGIN static uint8_t USBD_HID_OtherSpeedCfgDesc[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_MAX_POWER, /* MaxPower 100 mA: this current is used for detecting Vbus */
|
|
||||||
|
|
||||||
/************** 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 Byte max */
|
|
||||||
0x00,
|
|
||||||
HID_FS_BINTERVAL, /* bInterval: Polling Interval */
|
|
||||||
/* 34 */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* 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,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* 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,
|
|
||||||
};
|
|
||||||
|
|
||||||
__ALIGN_BEGIN static uint8_t HID_MOUSE_ReportDesc[HID_MOUSE_REPORT_DESC_SIZE] __ALIGN_END =
|
|
||||||
{
|
|
||||||
0x05, 0x01,
|
|
||||||
0x09, 0x02,
|
|
||||||
0xA1, 0x01,
|
|
||||||
0x09, 0x01,
|
|
||||||
|
|
||||||
0xA1, 0x00,
|
|
||||||
0x05, 0x09,
|
|
||||||
0x19, 0x01,
|
|
||||||
0x29, 0x03,
|
|
||||||
|
|
||||||
0x15, 0x00,
|
|
||||||
0x25, 0x01,
|
|
||||||
0x95, 0x03,
|
|
||||||
0x75, 0x01,
|
|
||||||
|
|
||||||
0x81, 0x02,
|
|
||||||
0x95, 0x01,
|
|
||||||
0x75, 0x05,
|
|
||||||
0x81, 0x01,
|
|
||||||
|
|
||||||
0x05, 0x01,
|
|
||||||
0x09, 0x30,
|
|
||||||
0x09, 0x31,
|
|
||||||
0x09, 0x38,
|
|
||||||
|
|
||||||
0x15, 0x81,
|
|
||||||
0x25, 0x7F,
|
|
||||||
0x75, 0x08,
|
|
||||||
0x95, 0x03,
|
|
||||||
|
|
||||||
0x81, 0x06,
|
|
||||||
0xC0, 0x09,
|
|
||||||
0x3c, 0x05,
|
|
||||||
0xff, 0x09,
|
|
||||||
|
|
||||||
0x01, 0x15,
|
|
||||||
0x00, 0x25,
|
|
||||||
0x01, 0x75,
|
|
||||||
0x01, 0x95,
|
|
||||||
|
|
||||||
0x02, 0xb1,
|
|
||||||
0x22, 0x75,
|
|
||||||
0x06, 0x95,
|
|
||||||
0x01, 0xb1,
|
|
||||||
|
|
||||||
0x01, 0xc0
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @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_malloc(sizeof(USBD_HID_HandleTypeDef));
|
|
||||||
|
|
||||||
if (hhid == NULL)
|
|
||||||
{
|
|
||||||
pdev->pClassData = NULL;
|
|
||||||
return (uint8_t)USBD_EMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdev->pClassData = (void *)hhid;
|
|
||||||
|
|
||||||
if (pdev->dev_speed == USBD_SPEED_HIGH)
|
|
||||||
{
|
|
||||||
pdev->ep_in[HID_EPIN_ADDR & 0xFU].bInterval = HID_HS_BINTERVAL;
|
|
||||||
}
|
|
||||||
else /* LOW and FULL-speed endpoints */
|
|
||||||
{
|
|
||||||
pdev->ep_in[HID_EPIN_ADDR & 0xFU].bInterval = HID_FS_BINTERVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Open EP IN */
|
|
||||||
(void)USBD_LL_OpenEP(pdev, HID_EPIN_ADDR, USBD_EP_TYPE_INTR, HID_EPIN_SIZE);
|
|
||||||
pdev->ep_in[HID_EPIN_ADDR & 0xFU].is_used = 1U;
|
|
||||||
|
|
||||||
hhid->state = 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);
|
|
||||||
|
|
||||||
/* Close HID EPs */
|
|
||||||
(void)USBD_LL_CloseEP(pdev, HID_EPIN_ADDR);
|
|
||||||
pdev->ep_in[HID_EPIN_ADDR & 0xFU].is_used = 0U;
|
|
||||||
pdev->ep_in[HID_EPIN_ADDR & 0xFU].bInterval = 0U;
|
|
||||||
|
|
||||||
/* Free allocated memory */
|
|
||||||
if (pdev->pClassData != NULL)
|
|
||||||
{
|
|
||||||
(void)USBD_free(pdev->pClassData);
|
|
||||||
pdev->pClassData = 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->pClassData;
|
|
||||||
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 HID_REQ_SET_PROTOCOL:
|
|
||||||
hhid->Protocol = (uint8_t)(req->wValue);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HID_REQ_GET_PROTOCOL:
|
|
||||||
(void)USBD_CtlSendData(pdev, (uint8_t *)&hhid->Protocol, 1U);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HID_REQ_SET_IDLE:
|
|
||||||
hhid->IdleState = (uint8_t)(req->wValue >> 8);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 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
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
uint8_t USBD_HID_SendReport(USBD_HandleTypeDef *pdev, uint8_t *report, uint16_t len)
|
|
||||||
{
|
|
||||||
USBD_HID_HandleTypeDef *hhid = (USBD_HID_HandleTypeDef *)pdev->pClassData;
|
|
||||||
|
|
||||||
if (hhid == NULL)
|
|
||||||
{
|
|
||||||
return (uint8_t)USBD_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pdev->dev_state == USBD_STATE_CONFIGURED)
|
|
||||||
{
|
|
||||||
if (hhid->state == HID_IDLE)
|
|
||||||
{
|
|
||||||
hhid->state = HID_BUSY;
|
|
||||||
(void)USBD_LL_Transmit(pdev, HID_EPIN_ADDR, 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));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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)
|
|
||||||
{
|
|
||||||
*length = (uint16_t)sizeof(USBD_HID_CfgFSDesc);
|
|
||||||
|
|
||||||
return USBD_HID_CfgFSDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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)
|
|
||||||
{
|
|
||||||
*length = (uint16_t)sizeof(USBD_HID_CfgHSDesc);
|
|
||||||
|
|
||||||
return USBD_HID_CfgHSDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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)
|
|
||||||
{
|
|
||||||
*length = (uint16_t)sizeof(USBD_HID_OtherSpeedCfgDesc);
|
|
||||||
|
|
||||||
return USBD_HID_OtherSpeedCfgDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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->pClassData)->state = HID_IDLE;
|
|
||||||
|
|
||||||
return (uint8_t)USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,130 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_msc.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief Header for the usbd_msc.c file
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USBD_MSC_H
|
|
||||||
#define __USBD_MSC_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_msc_bot.h"
|
|
||||||
#include "usbd_msc_scsi.h"
|
|
||||||
#include "usbd_ioreq.h"
|
|
||||||
|
|
||||||
/** @addtogroup USBD_MSC_BOT
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_MSC
|
|
||||||
* @brief This file is the Header file for usbd_msc.c
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_BOT_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/* MSC Class Config */
|
|
||||||
#ifndef MSC_MEDIA_PACKET
|
|
||||||
#define MSC_MEDIA_PACKET 512U
|
|
||||||
#endif /* MSC_MEDIA_PACKET */
|
|
||||||
|
|
||||||
#define MSC_MAX_FS_PACKET 0x40U
|
|
||||||
#define MSC_MAX_HS_PACKET 0x200U
|
|
||||||
|
|
||||||
#define BOT_GET_MAX_LUN 0xFE
|
|
||||||
#define BOT_RESET 0xFF
|
|
||||||
#define USB_MSC_CONFIG_DESC_SIZ 32
|
|
||||||
|
|
||||||
|
|
||||||
#define MSC_EPIN_ADDR 0x81U
|
|
||||||
#define MSC_EPOUT_ADDR 0x01U
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_CORE_Exported_Types
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
typedef struct _USBD_STORAGE
|
|
||||||
{
|
|
||||||
int8_t (* Init)(uint8_t lun);
|
|
||||||
int8_t (* GetCapacity)(uint8_t lun, uint32_t *block_num, uint16_t *block_size);
|
|
||||||
int8_t (* IsReady)(uint8_t lun);
|
|
||||||
int8_t (* IsWriteProtected)(uint8_t lun);
|
|
||||||
int8_t (* Read)(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
|
|
||||||
int8_t (* Write)(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len);
|
|
||||||
int8_t (* GetMaxLun)(void);
|
|
||||||
int8_t *pInquiry;
|
|
||||||
|
|
||||||
} USBD_StorageTypeDef;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
uint32_t max_lun;
|
|
||||||
uint32_t interface;
|
|
||||||
uint8_t bot_state;
|
|
||||||
uint8_t bot_status;
|
|
||||||
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;
|
|
||||||
|
|
||||||
uint16_t scsi_blk_size;
|
|
||||||
uint32_t scsi_blk_nbr;
|
|
||||||
|
|
||||||
uint32_t scsi_blk_addr;
|
|
||||||
uint32_t scsi_blk_len;
|
|
||||||
}
|
|
||||||
USBD_MSC_BOT_HandleTypeDef;
|
|
||||||
|
|
||||||
/* Structure for MSC process */
|
|
||||||
extern USBD_ClassTypeDef USBD_MSC;
|
|
||||||
#define USBD_MSC_CLASS &USBD_MSC
|
|
||||||
|
|
||||||
uint8_t USBD_MSC_RegisterStorage(USBD_HandleTypeDef *pdev,
|
|
||||||
USBD_StorageTypeDef *fops);
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __USBD_MSC_H */
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,150 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_msc_bot.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief Header for the usbd_msc_bot.c file
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USBD_MSC_BOT_H
|
|
||||||
#define __USBD_MSC_BOT_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_core.h"
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup MSC_BOT
|
|
||||||
* @brief This file is the Header file for usbd_msc_bot.c
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define USBD_BOT_IDLE 0U /* Idle state */
|
|
||||||
#define USBD_BOT_DATA_OUT 1U /* Data Out state */
|
|
||||||
#define USBD_BOT_DATA_IN 2U /* Data In state */
|
|
||||||
#define USBD_BOT_LAST_DATA_IN 3U /* Last Data In Last */
|
|
||||||
#define USBD_BOT_SEND_DATA 4U /* Send Immediate data */
|
|
||||||
#define USBD_BOT_NO_DATA 5U /* No data Stage */
|
|
||||||
|
|
||||||
#define USBD_BOT_CBW_SIGNATURE 0x43425355U
|
|
||||||
#define USBD_BOT_CSW_SIGNATURE 0x53425355U
|
|
||||||
#define USBD_BOT_CBW_LENGTH 31U
|
|
||||||
#define USBD_BOT_CSW_LENGTH 13U
|
|
||||||
#define USBD_BOT_MAX_DATA 256U
|
|
||||||
|
|
||||||
/* CSW Status Definitions */
|
|
||||||
#define USBD_CSW_CMD_PASSED 0x00U
|
|
||||||
#define USBD_CSW_CMD_FAILED 0x01U
|
|
||||||
#define USBD_CSW_PHASE_ERROR 0x02U
|
|
||||||
|
|
||||||
/* BOT Status */
|
|
||||||
#define USBD_BOT_STATUS_NORMAL 0U
|
|
||||||
#define USBD_BOT_STATUS_RECOVERY 1U
|
|
||||||
#define USBD_BOT_STATUS_ERROR 2U
|
|
||||||
|
|
||||||
|
|
||||||
#define USBD_DIR_IN 0U
|
|
||||||
#define USBD_DIR_OUT 1U
|
|
||||||
#define USBD_BOTH_DIR 2U
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup MSC_CORE_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
uint32_t dSignature;
|
|
||||||
uint32_t dTag;
|
|
||||||
uint32_t dDataLength;
|
|
||||||
uint8_t bmFlags;
|
|
||||||
uint8_t bLUN;
|
|
||||||
uint8_t bCBLength;
|
|
||||||
uint8_t CB[16];
|
|
||||||
uint8_t ReservedForAlign;
|
|
||||||
}
|
|
||||||
USBD_MSC_BOT_CBWTypeDef;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
uint32_t dSignature;
|
|
||||||
uint32_t dTag;
|
|
||||||
uint32_t dDataResidue;
|
|
||||||
uint8_t bStatus;
|
|
||||||
uint8_t ReservedForAlign[3];
|
|
||||||
}
|
|
||||||
USBD_MSC_BOT_CSWTypeDef;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_CORE_Exported_Types
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
/** @defgroup USBD_CORE_Exported_FunctionsPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
void MSC_BOT_Init(USBD_HandleTypeDef *pdev);
|
|
||||||
void MSC_BOT_Reset(USBD_HandleTypeDef *pdev);
|
|
||||||
void MSC_BOT_DeInit(USBD_HandleTypeDef *pdev);
|
|
||||||
void MSC_BOT_DataIn(USBD_HandleTypeDef *pdev,
|
|
||||||
uint8_t epnum);
|
|
||||||
|
|
||||||
void MSC_BOT_DataOut(USBD_HandleTypeDef *pdev,
|
|
||||||
uint8_t epnum);
|
|
||||||
|
|
||||||
void MSC_BOT_SendCSW(USBD_HandleTypeDef *pdev,
|
|
||||||
uint8_t CSW_Status);
|
|
||||||
|
|
||||||
void MSC_BOT_CplClrFeature(USBD_HandleTypeDef *pdev,
|
|
||||||
uint8_t epnum);
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __USBD_MSC_BOT_H */
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
||||||
@@ -1,105 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_msc_data.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief Header for the usbd_msc_data.c file
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USBD_MSC_DATA_H
|
|
||||||
#define __USBD_MSC_DATA_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_conf.h"
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_INFO
|
|
||||||
* @brief general defines for the usb device library file
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USB_INFO_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
#define MODE_SENSE6_LEN 0x17U
|
|
||||||
#define MODE_SENSE10_LEN 0x1BU
|
|
||||||
#define LENGTH_INQUIRY_PAGE00 0x06U
|
|
||||||
#define LENGTH_INQUIRY_PAGE80 0x08U
|
|
||||||
#define LENGTH_FORMAT_CAPACITIES 0x14U
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @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];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_INFO_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __USBD_MSC_DATA_H */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,185 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_msc_scsi.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief Header for the usbd_msc_scsi.c file
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USBD_MSC_SCSI_H
|
|
||||||
#define __USBD_MSC_SCSI_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_def.h"
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_SCSI
|
|
||||||
* @brief header file for the storage disk file
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_SCSI_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SENSE_LIST_DEEPTH 4U
|
|
||||||
|
|
||||||
/* SCSI Commands */
|
|
||||||
#define SCSI_FORMAT_UNIT 0x04U
|
|
||||||
#define SCSI_INQUIRY 0x12U
|
|
||||||
#define SCSI_MODE_SELECT6 0x15U
|
|
||||||
#define SCSI_MODE_SELECT10 0x55U
|
|
||||||
#define SCSI_MODE_SENSE6 0x1AU
|
|
||||||
#define SCSI_MODE_SENSE10 0x5AU
|
|
||||||
#define SCSI_ALLOW_MEDIUM_REMOVAL 0x1EU
|
|
||||||
#define SCSI_READ6 0x08U
|
|
||||||
#define SCSI_READ10 0x28U
|
|
||||||
#define SCSI_READ12 0xA8U
|
|
||||||
#define SCSI_READ16 0x88U
|
|
||||||
|
|
||||||
#define SCSI_READ_CAPACITY10 0x25U
|
|
||||||
#define SCSI_READ_CAPACITY16 0x9EU
|
|
||||||
|
|
||||||
#define SCSI_REQUEST_SENSE 0x03U
|
|
||||||
#define SCSI_START_STOP_UNIT 0x1BU
|
|
||||||
#define SCSI_TEST_UNIT_READY 0x00U
|
|
||||||
#define SCSI_WRITE6 0x0AU
|
|
||||||
#define SCSI_WRITE10 0x2AU
|
|
||||||
#define SCSI_WRITE12 0xAAU
|
|
||||||
#define SCSI_WRITE16 0x8AU
|
|
||||||
|
|
||||||
#define SCSI_VERIFY10 0x2FU
|
|
||||||
#define SCSI_VERIFY12 0xAFU
|
|
||||||
#define SCSI_VERIFY16 0x8FU
|
|
||||||
|
|
||||||
#define SCSI_SEND_DIAGNOSTIC 0x1DU
|
|
||||||
#define SCSI_READ_FORMAT_CAPACITIES 0x23U
|
|
||||||
|
|
||||||
#define NO_SENSE 0U
|
|
||||||
#define RECOVERED_ERROR 1U
|
|
||||||
#define NOT_READY 2U
|
|
||||||
#define MEDIUM_ERROR 3U
|
|
||||||
#define HARDWARE_ERROR 4U
|
|
||||||
#define ILLEGAL_REQUEST 5U
|
|
||||||
#define UNIT_ATTENTION 6U
|
|
||||||
#define DATA_PROTECT 7U
|
|
||||||
#define BLANK_CHECK 8U
|
|
||||||
#define VENDOR_SPECIFIC 9U
|
|
||||||
#define COPY_ABORTED 10U
|
|
||||||
#define ABORTED_COMMAND 11U
|
|
||||||
#define VOLUME_OVERFLOW 13U
|
|
||||||
#define MISCOMPARE 14U
|
|
||||||
|
|
||||||
|
|
||||||
#define INVALID_CDB 0x20U
|
|
||||||
#define INVALID_FIELED_IN_COMMAND 0x24U
|
|
||||||
#define PARAMETER_LIST_LENGTH_ERROR 0x1AU
|
|
||||||
#define INVALID_FIELD_IN_PARAMETER_LIST 0x26U
|
|
||||||
#define ADDRESS_OUT_OF_RANGE 0x21U
|
|
||||||
#define MEDIUM_NOT_PRESENT 0x3AU
|
|
||||||
#define MEDIUM_HAVE_CHANGED 0x28U
|
|
||||||
#define WRITE_PROTECTED 0x27U
|
|
||||||
#define UNRECOVERED_READ_ERROR 0x11U
|
|
||||||
#define WRITE_FAULT 0x03U
|
|
||||||
|
|
||||||
#define READ_FORMAT_CAPACITY_DATA_LEN 0x0CU
|
|
||||||
#define READ_CAPACITY10_DATA_LEN 0x08U
|
|
||||||
#define 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 */
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
||||||
@@ -1,97 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_msc_storage.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief Header file for the usbd_msc_storage.c file
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USBD_MSC_STORAGE_H
|
|
||||||
#define __USBD_MSC_STORAGE_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_msc.h"
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_STORAGE
|
|
||||||
* @brief header file for the usbd_msc_storage.c file
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_STORAGE_Exported_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_STORAGE_Exported_Types
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup USBD_STORAGE_Exported_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_STORAGE_Exported_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
extern USBD_StorageTypeDef USBD_MSC_Template_fops;
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup USBD_STORAGE_Exported_FunctionsPrototype
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __USBD_MSC_STORAGE_H */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,601 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_msc.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief This file provides all the MSC core functions.
|
|
||||||
*
|
|
||||||
* @verbatim
|
|
||||||
*
|
|
||||||
* ===================================================================
|
|
||||||
* MSC Class Description
|
|
||||||
* ===================================================================
|
|
||||||
* This module manages the MSC class V1.0 following the "Universal
|
|
||||||
* Serial Bus Mass Storage Class (MSC) Bulk-Only Transport (BOT) Version 1.0
|
|
||||||
* Sep. 31, 1999".
|
|
||||||
* This driver implements the following aspects of the specification:
|
|
||||||
* - Bulk-Only Transport protocol
|
|
||||||
* - Subclass : SCSI transparent command set (ref. SCSI Primary Commands - 3 (SPC-3))
|
|
||||||
*
|
|
||||||
* @endverbatim
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* BSPDependencies
|
|
||||||
- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c"
|
|
||||||
- "stm32xxxxx_{eval}{discovery}_io.c"
|
|
||||||
- "stm32xxxxx_{eval}{discovery}{adafruit}_sd.c"
|
|
||||||
EndBSPDependencies */
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_msc.h"
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_CORE
|
|
||||||
* @brief Mass storage core module
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup MSC_CORE_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_CORE_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_CORE_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_CORE_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
uint8_t USBD_MSC_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx);
|
|
||||||
uint8_t USBD_MSC_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx);
|
|
||||||
uint8_t USBD_MSC_Setup(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req);
|
|
||||||
uint8_t USBD_MSC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum);
|
|
||||||
uint8_t USBD_MSC_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum);
|
|
||||||
|
|
||||||
uint8_t *USBD_MSC_GetHSCfgDesc(uint16_t *length);
|
|
||||||
uint8_t *USBD_MSC_GetFSCfgDesc(uint16_t *length);
|
|
||||||
uint8_t *USBD_MSC_GetOtherSpeedCfgDesc(uint16_t *length);
|
|
||||||
uint8_t *USBD_MSC_GetDeviceQualifierDescriptor(uint16_t *length);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_CORE_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
USBD_ClassTypeDef USBD_MSC =
|
|
||||||
{
|
|
||||||
USBD_MSC_Init,
|
|
||||||
USBD_MSC_DeInit,
|
|
||||||
USBD_MSC_Setup,
|
|
||||||
NULL, /*EP0_TxSent*/
|
|
||||||
NULL, /*EP0_RxReady*/
|
|
||||||
USBD_MSC_DataIn,
|
|
||||||
USBD_MSC_DataOut,
|
|
||||||
NULL, /*SOF */
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
USBD_MSC_GetHSCfgDesc,
|
|
||||||
USBD_MSC_GetFSCfgDesc,
|
|
||||||
USBD_MSC_GetOtherSpeedCfgDesc,
|
|
||||||
USBD_MSC_GetDeviceQualifierDescriptor,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* USB Mass storage device Configuration Descriptor */
|
|
||||||
/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
|
|
||||||
__ALIGN_BEGIN static uint8_t USBD_MSC_CfgHSDesc[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_MAX_POWER, /* MaxPower 100 mA */
|
|
||||||
|
|
||||||
/******************** Mass Storage interface ********************/
|
|
||||||
0x09, /* bLength: Interface Descriptor size */
|
|
||||||
0x04, /* bDescriptorType: */
|
|
||||||
0x00, /* bInterfaceNumber: Number of Interface */
|
|
||||||
0x00, /* bAlternateSetting: Alternate setting */
|
|
||||||
0x02, /* bNumEndpoints */
|
|
||||||
0x08, /* bInterfaceClass: MSC Class */
|
|
||||||
0x06, /* bInterfaceSubClass : SCSI transparent */
|
|
||||||
0x50, /* nInterfaceProtocol */
|
|
||||||
0x05, /* iInterface: */
|
|
||||||
/******************** Mass Storage Endpoints ********************/
|
|
||||||
0x07, /* Endpoint descriptor length = 7 */
|
|
||||||
0x05, /* Endpoint descriptor type */
|
|
||||||
MSC_EPIN_ADDR, /* Endpoint address (IN, address 1) */
|
|
||||||
0x02, /* Bulk endpoint type */
|
|
||||||
LOBYTE(MSC_MAX_HS_PACKET),
|
|
||||||
HIBYTE(MSC_MAX_HS_PACKET),
|
|
||||||
0x00, /* Polling interval in milliseconds */
|
|
||||||
|
|
||||||
0x07, /* Endpoint descriptor length = 7 */
|
|
||||||
0x05, /* Endpoint descriptor type */
|
|
||||||
MSC_EPOUT_ADDR, /* Endpoint address (OUT, address 1) */
|
|
||||||
0x02, /* Bulk endpoint type */
|
|
||||||
LOBYTE(MSC_MAX_HS_PACKET),
|
|
||||||
HIBYTE(MSC_MAX_HS_PACKET),
|
|
||||||
0x00 /* Polling interval in milliseconds */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* USB Mass storage device Configuration Descriptor */
|
|
||||||
/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
|
|
||||||
__ALIGN_BEGIN static uint8_t USBD_MSC_CfgFSDesc[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_MAX_POWER, /* MaxPower 100 mA */
|
|
||||||
|
|
||||||
/******************** Mass Storage interface ********************/
|
|
||||||
0x09, /* bLength: Interface Descriptor size */
|
|
||||||
0x04, /* bDescriptorType: */
|
|
||||||
0x00, /* bInterfaceNumber: Number of Interface */
|
|
||||||
0x00, /* bAlternateSetting: Alternate setting */
|
|
||||||
0x02, /* bNumEndpoints*/
|
|
||||||
0x08, /* bInterfaceClass: MSC Class */
|
|
||||||
0x06, /* bInterfaceSubClass : SCSI transparent*/
|
|
||||||
0x50, /* nInterfaceProtocol */
|
|
||||||
0x05, /* iInterface: */
|
|
||||||
/******************** Mass Storage Endpoints ********************/
|
|
||||||
0x07, /* Endpoint descriptor length = 7 */
|
|
||||||
0x05, /* Endpoint descriptor type */
|
|
||||||
MSC_EPIN_ADDR, /* Endpoint address (IN, address 1) */
|
|
||||||
0x02, /* Bulk endpoint type */
|
|
||||||
LOBYTE(MSC_MAX_FS_PACKET),
|
|
||||||
HIBYTE(MSC_MAX_FS_PACKET),
|
|
||||||
0x00, /* Polling interval in milliseconds */
|
|
||||||
|
|
||||||
0x07, /* Endpoint descriptor length = 7 */
|
|
||||||
0x05, /* Endpoint descriptor type */
|
|
||||||
MSC_EPOUT_ADDR, /* Endpoint address (OUT, address 1) */
|
|
||||||
0x02, /* Bulk endpoint type */
|
|
||||||
LOBYTE(MSC_MAX_FS_PACKET),
|
|
||||||
HIBYTE(MSC_MAX_FS_PACKET),
|
|
||||||
0x00 /* Polling interval in milliseconds */
|
|
||||||
};
|
|
||||||
|
|
||||||
__ALIGN_BEGIN static uint8_t USBD_MSC_OtherSpeedCfgDesc[USB_MSC_CONFIG_DESC_SIZ] __ALIGN_END =
|
|
||||||
{
|
|
||||||
0x09, /* bLength: Configuration Descriptor size */
|
|
||||||
USB_DESC_TYPE_OTHER_SPEED_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_MAX_POWER, /* MaxPower 100 mA */
|
|
||||||
|
|
||||||
/******************** Mass Storage interface ********************/
|
|
||||||
0x09, /* bLength: Interface Descriptor size */
|
|
||||||
0x04, /* bDescriptorType: */
|
|
||||||
0x00, /* bInterfaceNumber: Number of Interface */
|
|
||||||
0x00, /* bAlternateSetting: Alternate setting */
|
|
||||||
0x02, /* bNumEndpoints */
|
|
||||||
0x08, /* bInterfaceClass: MSC Class */
|
|
||||||
0x06, /* bInterfaceSubClass : SCSI transparent command set */
|
|
||||||
0x50, /* nInterfaceProtocol */
|
|
||||||
0x05, /* iInterface: */
|
|
||||||
/******************** Mass Storage Endpoints ********************/
|
|
||||||
0x07, /* Endpoint descriptor length = 7 */
|
|
||||||
0x05, /* Endpoint descriptor type */
|
|
||||||
MSC_EPIN_ADDR, /* Endpoint address (IN, address 1) */
|
|
||||||
0x02, /* Bulk endpoint type */
|
|
||||||
0x40,
|
|
||||||
0x00,
|
|
||||||
0x00, /* Polling interval in milliseconds */
|
|
||||||
|
|
||||||
0x07, /* Endpoint descriptor length = 7 */
|
|
||||||
0x05, /* Endpoint descriptor type */
|
|
||||||
MSC_EPOUT_ADDR, /* Endpoint address (OUT, address 1) */
|
|
||||||
0x02, /* Bulk endpoint type */
|
|
||||||
0x40,
|
|
||||||
0x00,
|
|
||||||
0x00 /* Polling interval in milliseconds */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* USB Standard Device Descriptor */
|
|
||||||
__ALIGN_BEGIN 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,
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @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_malloc(sizeof(USBD_MSC_BOT_HandleTypeDef));
|
|
||||||
|
|
||||||
if (hmsc == NULL)
|
|
||||||
{
|
|
||||||
pdev->pClassData = NULL;
|
|
||||||
return (uint8_t)USBD_EMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdev->pClassData = (void *)hmsc;
|
|
||||||
|
|
||||||
if (pdev->dev_speed == USBD_SPEED_HIGH)
|
|
||||||
{
|
|
||||||
/* Open EP OUT */
|
|
||||||
(void)USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET);
|
|
||||||
pdev->ep_out[MSC_EPOUT_ADDR & 0xFU].is_used = 1U;
|
|
||||||
|
|
||||||
/* Open EP IN */
|
|
||||||
(void)USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_HS_PACKET);
|
|
||||||
pdev->ep_in[MSC_EPIN_ADDR & 0xFU].is_used = 1U;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Open EP OUT */
|
|
||||||
(void)USBD_LL_OpenEP(pdev, MSC_EPOUT_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET);
|
|
||||||
pdev->ep_out[MSC_EPOUT_ADDR & 0xFU].is_used = 1U;
|
|
||||||
|
|
||||||
/* Open EP IN */
|
|
||||||
(void)USBD_LL_OpenEP(pdev, MSC_EPIN_ADDR, USBD_EP_TYPE_BULK, MSC_MAX_FS_PACKET);
|
|
||||||
pdev->ep_in[MSC_EPIN_ADDR & 0xFU].is_used = 1U;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Init the BOT layer */
|
|
||||||
MSC_BOT_Init(pdev);
|
|
||||||
|
|
||||||
return (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);
|
|
||||||
|
|
||||||
/* Close MSC EPs */
|
|
||||||
(void)USBD_LL_CloseEP(pdev, MSC_EPOUT_ADDR);
|
|
||||||
pdev->ep_out[MSC_EPOUT_ADDR & 0xFU].is_used = 0U;
|
|
||||||
|
|
||||||
/* Close EP IN */
|
|
||||||
(void)USBD_LL_CloseEP(pdev, MSC_EPIN_ADDR);
|
|
||||||
pdev->ep_in[MSC_EPIN_ADDR & 0xFU].is_used = 0U;
|
|
||||||
|
|
||||||
/* Free MSC Class Resources */
|
|
||||||
if (pdev->pClassData != NULL)
|
|
||||||
{
|
|
||||||
/* De-Init the BOT layer */
|
|
||||||
MSC_BOT_DeInit(pdev);
|
|
||||||
|
|
||||||
(void)USBD_free(pdev->pClassData);
|
|
||||||
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->pClassData;
|
|
||||||
USBD_StatusTypeDef ret = USBD_OK;
|
|
||||||
uint16_t status_info = 0U;
|
|
||||||
|
|
||||||
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))
|
|
||||||
{
|
|
||||||
hmsc->max_lun = (uint32_t)((USBD_StorageTypeDef *)pdev->pUserData)->GetMaxLun();
|
|
||||||
(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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_MSC_GetHSCfgDesc
|
|
||||||
* return configuration descriptor
|
|
||||||
* @param length : pointer data length
|
|
||||||
* @retval pointer to descriptor buffer
|
|
||||||
*/
|
|
||||||
uint8_t *USBD_MSC_GetHSCfgDesc(uint16_t *length)
|
|
||||||
{
|
|
||||||
*length = (uint16_t)sizeof(USBD_MSC_CfgHSDesc);
|
|
||||||
|
|
||||||
return USBD_MSC_CfgHSDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_MSC_GetFSCfgDesc
|
|
||||||
* return configuration descriptor
|
|
||||||
* @param length : pointer data length
|
|
||||||
* @retval pointer to descriptor buffer
|
|
||||||
*/
|
|
||||||
uint8_t *USBD_MSC_GetFSCfgDesc(uint16_t *length)
|
|
||||||
{
|
|
||||||
*length = (uint16_t)sizeof(USBD_MSC_CfgFSDesc);
|
|
||||||
|
|
||||||
return USBD_MSC_CfgFSDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_MSC_GetOtherSpeedCfgDesc
|
|
||||||
* return other speed configuration descriptor
|
|
||||||
* @param length : pointer data length
|
|
||||||
* @retval pointer to descriptor buffer
|
|
||||||
*/
|
|
||||||
uint8_t *USBD_MSC_GetOtherSpeedCfgDesc(uint16_t *length)
|
|
||||||
{
|
|
||||||
*length = (uint16_t)sizeof(USBD_MSC_OtherSpeedCfgDesc);
|
|
||||||
|
|
||||||
return USBD_MSC_OtherSpeedCfgDesc;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @brief DeviceQualifierDescriptor
|
|
||||||
* return Device Qualifier descriptor
|
|
||||||
* @param length : pointer data length
|
|
||||||
* @retval pointer to descriptor buffer
|
|
||||||
*/
|
|
||||||
uint8_t *USBD_MSC_GetDeviceQualifierDescriptor(uint16_t *length)
|
|
||||||
{
|
|
||||||
*length = (uint16_t)sizeof(USBD_MSC_DeviceQualifierDesc);
|
|
||||||
|
|
||||||
return USBD_MSC_DeviceQualifierDesc;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief USBD_MSC_RegisterStorage
|
|
||||||
* @param fops: storage callback
|
|
||||||
* @retval status
|
|
||||||
*/
|
|
||||||
uint8_t USBD_MSC_RegisterStorage(USBD_HandleTypeDef *pdev, USBD_StorageTypeDef *fops)
|
|
||||||
{
|
|
||||||
if (fops == NULL)
|
|
||||||
{
|
|
||||||
return (uint8_t)USBD_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdev->pUserData = fops;
|
|
||||||
|
|
||||||
return (uint8_t)USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,435 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_msc_bot.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief This file provides all the BOT protocol core functions.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* BSPDependencies
|
|
||||||
- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c"
|
|
||||||
- "stm32xxxxx_{eval}{discovery}_io.c"
|
|
||||||
- "stm32xxxxx_{eval}{discovery}{adafruit}_sd.c"
|
|
||||||
EndBSPDependencies */
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_msc_bot.h"
|
|
||||||
#include "usbd_msc.h"
|
|
||||||
#include "usbd_msc_scsi.h"
|
|
||||||
#include "usbd_ioreq.h"
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_BOT
|
|
||||||
* @brief BOT protocol module
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup MSC_BOT_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_BOT_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_BOT_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_BOT_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_BOT_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
static void MSC_BOT_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->pClassData;
|
|
||||||
|
|
||||||
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)->Init(0U);
|
|
||||||
|
|
||||||
(void)USBD_LL_FlushEP(pdev, MSC_EPOUT_ADDR);
|
|
||||||
(void)USBD_LL_FlushEP(pdev, MSC_EPIN_ADDR);
|
|
||||||
|
|
||||||
/* Prepare EP to Receive First BOT Cmd */
|
|
||||||
(void)USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, (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->pClassData;
|
|
||||||
|
|
||||||
if (hmsc == NULL)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
hmsc->bot_state = USBD_BOT_IDLE;
|
|
||||||
hmsc->bot_status = USBD_BOT_STATUS_RECOVERY;
|
|
||||||
|
|
||||||
(void)USBD_LL_ClearStallEP(pdev, MSC_EPIN_ADDR);
|
|
||||||
(void)USBD_LL_ClearStallEP(pdev, MSC_EPOUT_ADDR);
|
|
||||||
|
|
||||||
/* Prepare EP to Receive First BOT Cmd */
|
|
||||||
(void)USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, (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->pClassData;
|
|
||||||
|
|
||||||
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->pClassData;
|
|
||||||
|
|
||||||
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->pClassData;
|
|
||||||
|
|
||||||
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->pClassData;
|
|
||||||
|
|
||||||
if (hmsc == NULL)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
hmsc->csw.dTag = hmsc->cbw.dTag;
|
|
||||||
hmsc->csw.dDataResidue = hmsc->cbw.dDataLength;
|
|
||||||
|
|
||||||
if ((USBD_LL_GetRxDataSize(pdev, MSC_EPOUT_ADDR) != USBD_BOT_CBW_LENGTH) ||
|
|
||||||
(hmsc->cbw.dSignature != USBD_BOT_CBW_SIGNATURE) ||
|
|
||||||
(hmsc->cbw.bLUN > 1U) || (hmsc->cbw.bCBLength < 1U) ||
|
|
||||||
(hmsc->cbw.bCBLength > 16U))
|
|
||||||
{
|
|
||||||
SCSI_SenseCode(pdev, hmsc->cbw.bLUN, ILLEGAL_REQUEST, INVALID_CDB);
|
|
||||||
|
|
||||||
hmsc->bot_status = USBD_BOT_STATUS_ERROR;
|
|
||||||
MSC_BOT_Abort(pdev);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (SCSI_ProcessCmd(pdev, hmsc->cbw.bLUN, &hmsc->cbw.CB[0]) < 0)
|
|
||||||
{
|
|
||||||
if (hmsc->bot_state == USBD_BOT_NO_DATA)
|
|
||||||
{
|
|
||||||
MSC_BOT_SendCSW(pdev, USBD_CSW_CMD_FAILED);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MSC_BOT_Abort(pdev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Burst xfer handled internally */
|
|
||||||
else if ((hmsc->bot_state != USBD_BOT_DATA_IN) &&
|
|
||||||
(hmsc->bot_state != USBD_BOT_DATA_OUT) &&
|
|
||||||
(hmsc->bot_state != USBD_BOT_LAST_DATA_IN))
|
|
||||||
{
|
|
||||||
if (hmsc->bot_data_length > 0U)
|
|
||||||
{
|
|
||||||
MSC_BOT_SendData(pdev, hmsc->bot_data, hmsc->bot_data_length);
|
|
||||||
}
|
|
||||||
else if (hmsc->bot_data_length == 0U)
|
|
||||||
{
|
|
||||||
MSC_BOT_SendCSW(pdev, USBD_CSW_CMD_PASSED);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MSC_BOT_Abort(pdev);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MSC_BOT_SendData
|
|
||||||
* Send the requested data
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param buf: pointer to data buffer
|
|
||||||
* @param len: Data Length
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
static void MSC_BOT_SendData(USBD_HandleTypeDef *pdev, uint8_t *pbuf, uint32_t len)
|
|
||||||
{
|
|
||||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData;
|
|
||||||
|
|
||||||
uint32_t length = MIN(hmsc->cbw.dDataLength, len);
|
|
||||||
|
|
||||||
if (hmsc == NULL)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
hmsc->csw.dDataResidue -= len;
|
|
||||||
hmsc->csw.bStatus = USBD_CSW_CMD_PASSED;
|
|
||||||
hmsc->bot_state = USBD_BOT_SEND_DATA;
|
|
||||||
|
|
||||||
(void)USBD_LL_Transmit(pdev, MSC_EPIN_ADDR, pbuf, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief MSC_BOT_SendCSW
|
|
||||||
* Send the Command Status Wrapper
|
|
||||||
* @param pdev: device instance
|
|
||||||
* @param status : CSW status
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void MSC_BOT_SendCSW(USBD_HandleTypeDef *pdev, uint8_t CSW_Status)
|
|
||||||
{
|
|
||||||
USBD_MSC_BOT_HandleTypeDef *hmsc = (USBD_MSC_BOT_HandleTypeDef *)pdev->pClassData;
|
|
||||||
|
|
||||||
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, MSC_EPIN_ADDR, (uint8_t *)&hmsc->csw,
|
|
||||||
USBD_BOT_CSW_LENGTH);
|
|
||||||
|
|
||||||
/* Prepare EP to Receive next Cmd */
|
|
||||||
(void)USBD_LL_PrepareReceive(pdev, MSC_EPOUT_ADDR, (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->pClassData;
|
|
||||||
|
|
||||||
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, MSC_EPOUT_ADDR);
|
|
||||||
}
|
|
||||||
|
|
||||||
(void)USBD_LL_StallEP(pdev, MSC_EPIN_ADDR);
|
|
||||||
|
|
||||||
if (hmsc->bot_status == USBD_BOT_STATUS_ERROR)
|
|
||||||
{
|
|
||||||
(void)USBD_LL_StallEP(pdev, MSC_EPIN_ADDR);
|
|
||||||
(void)USBD_LL_StallEP(pdev, MSC_EPOUT_ADDR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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->pClassData;
|
|
||||||
|
|
||||||
if (hmsc == NULL)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hmsc->bot_status == USBD_BOT_STATUS_ERROR) /* Bad CBW Signature */
|
|
||||||
{
|
|
||||||
(void)USBD_LL_StallEP(pdev, MSC_EPIN_ADDR);
|
|
||||||
(void)USBD_LL_StallEP(pdev, MSC_EPOUT_ADDR);
|
|
||||||
}
|
|
||||||
else if (((epnum & 0x80U) == 0x80U) && (hmsc->bot_status != USBD_BOT_STATUS_RECOVERY))
|
|
||||||
{
|
|
||||||
MSC_BOT_SendCSW(pdev, USBD_CSW_CMD_FAILED);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,183 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_msc_data.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief This file provides all the vital inquiry pages and sense data.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* BSPDependencies
|
|
||||||
- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c"
|
|
||||||
- "stm32xxxxx_{eval}{discovery}_io.c"
|
|
||||||
- "stm32xxxxx_{eval}{discovery}{adafruit}_sd.c"
|
|
||||||
EndBSPDependencies */
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_msc_data.h"
|
|
||||||
|
|
||||||
|
|
||||||
/** @addtogroup STM32_USB_DEVICE_LIBRARY
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA
|
|
||||||
* @brief Mass storage info/data module
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA_Private_TypesDefinitions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA_Private_Defines
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA_Private_Macros
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA_Private_Variables
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* USB Mass storage Page 0 Inquiry Data */
|
|
||||||
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] =
|
|
||||||
{
|
|
||||||
0x22,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x08,
|
|
||||||
0x12,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/* USB Mass storage sense 10 Data */
|
|
||||||
uint8_t MSC_Mode_Sense10_data[MODE_SENSE10_LEN] =
|
|
||||||
{
|
|
||||||
0x00,
|
|
||||||
0x26,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x08,
|
|
||||||
0x12,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA_Private_FunctionPrototypes
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** @defgroup MSC_DATA_Private_Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,177 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_msc_storage_template.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief Memory management layer
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* BSPDependencies
|
|
||||||
- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c"
|
|
||||||
- "stm32xxxxx_{eval}{discovery}_io.c"
|
|
||||||
- "stm32xxxxx_{eval}{discovery}{adafruit}_sd.c"
|
|
||||||
EndBSPDependencies */
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_msc_storage_template.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
|
||||||
/* Private define ------------------------------------------------------------*/
|
|
||||||
/* Private macro -------------------------------------------------------------*/
|
|
||||||
/* Private variables ---------------------------------------------------------*/
|
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
|
||||||
/* Extern function prototypes ------------------------------------------------*/
|
|
||||||
/* Private functions ---------------------------------------------------------*/
|
|
||||||
|
|
||||||
#define STORAGE_LUN_NBR 1U
|
|
||||||
#define STORAGE_BLK_NBR 0x10000U
|
|
||||||
#define STORAGE_BLK_SIZ 0x200U
|
|
||||||
|
|
||||||
int8_t STORAGE_Init(uint8_t lun);
|
|
||||||
|
|
||||||
int8_t STORAGE_GetCapacity(uint8_t lun, uint32_t *block_num,
|
|
||||||
uint16_t *block_size);
|
|
||||||
|
|
||||||
int8_t STORAGE_IsReady(uint8_t lun);
|
|
||||||
|
|
||||||
int8_t STORAGE_IsWriteProtected(uint8_t lun);
|
|
||||||
|
|
||||||
int8_t STORAGE_Read(uint8_t lun, uint8_t *buf, uint32_t blk_addr,
|
|
||||||
uint16_t blk_len);
|
|
||||||
|
|
||||||
int8_t STORAGE_Write(uint8_t lun, uint8_t *buf, uint32_t blk_addr,
|
|
||||||
uint16_t blk_len);
|
|
||||||
|
|
||||||
int8_t STORAGE_GetMaxLun(void);
|
|
||||||
|
|
||||||
/* USB Mass storage Standard Inquiry Data */
|
|
||||||
int8_t STORAGE_Inquirydata[] = /* 36 */
|
|
||||||
{
|
|
||||||
|
|
||||||
/* LUN 0 */
|
|
||||||
0x00,
|
|
||||||
0x80,
|
|
||||||
0x02,
|
|
||||||
0x02,
|
|
||||||
(STANDARD_INQUIRY_DATA_LEN - 5),
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
0x00,
|
|
||||||
'S', 'T', 'M', ' ', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */
|
|
||||||
'P', 'r', 'o', 'd', 'u', 'c', 't', ' ', /* Product : 16 Bytes */
|
|
||||||
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
|
|
||||||
'0', '.', '0', '1', /* Version : 4 Bytes */
|
|
||||||
};
|
|
||||||
|
|
||||||
USBD_StorageTypeDef USBD_MSC_Template_fops =
|
|
||||||
{
|
|
||||||
STORAGE_Init,
|
|
||||||
STORAGE_GetCapacity,
|
|
||||||
STORAGE_IsReady,
|
|
||||||
STORAGE_IsWriteProtected,
|
|
||||||
STORAGE_Read,
|
|
||||||
STORAGE_Write,
|
|
||||||
STORAGE_GetMaxLun,
|
|
||||||
STORAGE_Inquirydata,
|
|
||||||
|
|
||||||
};
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : Read_Memory
|
|
||||||
* Description : Handle the Read operation from the microSD card.
|
|
||||||
* Input : None.
|
|
||||||
* Output : None.
|
|
||||||
* Return : None.
|
|
||||||
*******************************************************************************/
|
|
||||||
int8_t STORAGE_Init(uint8_t lun)
|
|
||||||
{
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : Read_Memory
|
|
||||||
* Description : Handle the Read operation from the STORAGE card.
|
|
||||||
* Input : None.
|
|
||||||
* Output : None.
|
|
||||||
* Return : None.
|
|
||||||
*******************************************************************************/
|
|
||||||
int8_t STORAGE_GetCapacity(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
|
|
||||||
{
|
|
||||||
*block_num = STORAGE_BLK_NBR;
|
|
||||||
*block_size = STORAGE_BLK_SIZ;
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : Read_Memory
|
|
||||||
* Description : Handle the Read operation from the STORAGE card.
|
|
||||||
* Input : None.
|
|
||||||
* Output : None.
|
|
||||||
* Return : None.
|
|
||||||
*******************************************************************************/
|
|
||||||
int8_t STORAGE_IsReady(uint8_t lun)
|
|
||||||
{
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : Read_Memory
|
|
||||||
* Description : Handle the Read operation from the STORAGE card.
|
|
||||||
* Input : None.
|
|
||||||
* Output : None.
|
|
||||||
* Return : None.
|
|
||||||
*******************************************************************************/
|
|
||||||
int8_t STORAGE_IsWriteProtected(uint8_t lun)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : Read_Memory
|
|
||||||
* Description : Handle the Read operation from the STORAGE card.
|
|
||||||
* Input : None.
|
|
||||||
* Output : None.
|
|
||||||
* Return : None.
|
|
||||||
*******************************************************************************/
|
|
||||||
int8_t STORAGE_Read(uint8_t lun, uint8_t *buf,
|
|
||||||
uint32_t blk_addr, uint16_t blk_len)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : Write_Memory
|
|
||||||
* Description : Handle the Write operation to the STORAGE card.
|
|
||||||
* Input : None.
|
|
||||||
* Output : None.
|
|
||||||
* Return : None.
|
|
||||||
*******************************************************************************/
|
|
||||||
int8_t STORAGE_Write(uint8_t lun, uint8_t *buf,
|
|
||||||
uint32_t blk_addr, uint16_t blk_len)
|
|
||||||
{
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
/*******************************************************************************
|
|
||||||
* Function Name : Write_Memory
|
|
||||||
* Description : Handle the Write operation to the STORAGE card.
|
|
||||||
* Input : None.
|
|
||||||
* Output : None.
|
|
||||||
* Return : None.
|
|
||||||
*******************************************************************************/
|
|
||||||
int8_t STORAGE_GetMaxLun(void)
|
|
||||||
{
|
|
||||||
return (STORAGE_LUN_NBR - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_template_core.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief Header file for the usbd_template_core.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __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 */
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,380 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_template.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief This file provides the HID core functions.
|
|
||||||
*
|
|
||||||
* @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
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_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
|
|
||||||
/* 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
|
|
||||||
/* 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 DeviceQualifierDescriptor
|
|
||||||
* return Device Qualifier descriptor
|
|
||||||
* @param length : pointer data length
|
|
||||||
* @retval pointer to descriptor buffer
|
|
||||||
*/
|
|
||||||
uint8_t *USBD_TEMPLATE_DeviceQualifierDescriptor(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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief DeviceQualifierDescriptor
|
|
||||||
* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -1,457 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_video.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief header file for the usbd_video.c file.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2020 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USBD_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
|
|
||||||
|
|
||||||
/* bEndpointAddress in Endpoint Descriptor */
|
|
||||||
#ifndef UVC_IN_EP
|
|
||||||
#define UVC_IN_EP 0x81U
|
|
||||||
#endif /* VIDEO_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
|
|
||||||
|
|
||||||
#ifndef UVC_ISO_HS_MPS
|
|
||||||
#define UVC_ISO_HS_MPS 512U
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef UVC_HEADER_PACKET_CNT
|
|
||||||
#define UVC_HEADER_PACKET_CNT 0x01U
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#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
|
|
||||||
|
|
||||||
#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
|
|
||||||
#ifndef DBVAL
|
|
||||||
#define DBVAL(x) ((x)& 0xFFU),(((x) >> 8) & 0xFFU),(((x)>> 16) & 0xFFU),(((x) >> 24) & 0xFFU)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* 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
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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 _VIDEO_DescHeader
|
|
||||||
{
|
|
||||||
uint8_t bLength;
|
|
||||||
uint8_t bDescriptorType;
|
|
||||||
uint8_t bDescriptorSubType;
|
|
||||||
} USBD_VIDEO_DescHeader_t;
|
|
||||||
|
|
||||||
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;
|
|
||||||
uint32_t dwMaxFrameInterval;
|
|
||||||
uint32_t dwFrameIntervalStep;
|
|
||||||
} __PACKED USBD_VIDEO_VSFrameDescTypeDef;
|
|
||||||
|
|
||||||
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;
|
|
||||||
uint8_t buffer[UVC_TOTAL_BUF_SIZE];
|
|
||||||
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 *);
|
|
||||||
uint8_t *pStrDesc;
|
|
||||||
} 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;
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* _USBD_VIDEO_H_ */
|
|
||||||
@@ -1,142 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_video_if_template.h
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief Template Header file for the video Interface application layer functions
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2020 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
|
||||||
#ifndef __USBD_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);
|
|
||||||
|
|
||||||
/* USER CODE BEGIN EXPORTED_FUNCTIONS */
|
|
||||||
|
|
||||||
/* USER CODE END EXPORTED_FUNCTIONS */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* USBD_VIDEO_IF_H_ */
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,296 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_video_if_template.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief Template file for Video Interface application layer functions
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2020 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_video_if.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 ---------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* 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)
|
|
||||||
{
|
|
||||||
|
|
||||||
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]) / ((uint16_t)(UVC_PACKET_SIZE - (UVC_HEADER_PACKET_CNT * 2U)));
|
|
||||||
uint32_t packet_remainder = (tImagesSizes[img_count]) % ((uint16_t)(UVC_PACKET_SIZE - (UVC_HEADER_PACKET_CNT * 2U)));
|
|
||||||
static uint8_t packet_index = 0;
|
|
||||||
|
|
||||||
/* 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 = 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 + 1))
|
|
||||||
{
|
|
||||||
/* Reset the packet count to zero */
|
|
||||||
packet_index = 0U;
|
|
||||||
|
|
||||||
/* Move to the next image in the images table */
|
|
||||||
|
|
||||||
img_count++;
|
|
||||||
HAL_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 */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @}
|
|
||||||
*/
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -6,13 +6,12 @@
|
|||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @attention
|
* @attention
|
||||||
*
|
*
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
* Copyright (c) 2015 STMicroelectronics.
|
||||||
* All rights reserved.</center></h2>
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
* in the root directory of this software component.
|
||||||
* the License. You may obtain a copy of the License at:
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
*
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
@@ -26,7 +25,7 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
/* Includes ------------------------------------------------------------------*/
|
||||||
#include "stm32fxxx.h" /* replace 'stm32xxx' with your HAL driver header filename, ex: stm32f4xx.h */
|
#include "stm32f0xx_hal.h" /* replace 'stm32xxx' with your HAL driver header filename, ex: stm32f4xx.h */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -48,14 +47,15 @@ extern "C" {
|
|||||||
#define USBD_MAX_NUM_CONFIGURATION 1U
|
#define USBD_MAX_NUM_CONFIGURATION 1U
|
||||||
#define USBD_MAX_STR_DESC_SIZ 0x100U
|
#define USBD_MAX_STR_DESC_SIZ 0x100U
|
||||||
#define USBD_SELF_POWERED 1U
|
#define USBD_SELF_POWERED 1U
|
||||||
#define USBD_DEBUG_LEVEL 2U
|
#define USBD_DEBUG_LEVEL 0U
|
||||||
|
/* #define USBD_USER_REGISTER_CALLBACK 1U */
|
||||||
|
|
||||||
/* ECM, RNDIS, DFU Class Config */
|
/* ECM, RNDIS, DFU Class Config */
|
||||||
#define USBD_SUPPORT_USER_STRING_DESC 1U
|
#define USBD_SUPPORT_USER_STRING_DESC 0U
|
||||||
|
|
||||||
/* BillBoard Class Config */
|
/* BillBoard Class Config */
|
||||||
#define USBD_CLASS_USER_STRING_DESC 1U
|
#define USBD_CLASS_USER_STRING_DESC 0U
|
||||||
#define USBD_CLASS_BOS_ENABLED 1U
|
#define USBD_CLASS_BOS_ENABLED 0U
|
||||||
#define USB_BB_MAX_NUM_ALT_MODE 0x2U
|
#define USB_BB_MAX_NUM_ALT_MODE 0x2U
|
||||||
|
|
||||||
/* MSC Class Config */
|
/* MSC Class Config */
|
||||||
@@ -65,6 +65,8 @@ extern "C" {
|
|||||||
#define USBD_CDC_INTERVAL 2000U
|
#define USBD_CDC_INTERVAL 2000U
|
||||||
|
|
||||||
/* DFU Class Config */
|
/* DFU Class Config */
|
||||||
|
/* #define USBD_DFU_VENDOR_CMD_ENABLED 1U */
|
||||||
|
/* #define USBD_DFU_VENDOR_EXIT_ENABLED 1U */
|
||||||
#define USBD_DFU_MAX_ITF_NUM 1U
|
#define USBD_DFU_MAX_ITF_NUM 1U
|
||||||
#define USBD_DFU_XFERS_IZE 1024U
|
#define USBD_DFU_XFERS_IZE 1024U
|
||||||
|
|
||||||
@@ -77,6 +79,13 @@ extern "C" {
|
|||||||
#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE 0x02U
|
#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE 0x02U
|
||||||
#define USBD_CUSTOM_HID_REPORT_DESC_SIZE 163U
|
#define USBD_CUSTOM_HID_REPORT_DESC_SIZE 163U
|
||||||
|
|
||||||
|
/* #define USBD_CUSTOMHID_REPORT_DESC_SIZE_ENABLED */
|
||||||
|
/* #define USBD_CUSTOMHID_CTRL_REQ_GET_REPORT_ENABLED */
|
||||||
|
/* #define USBD_CUSTOMHID_OUT_PREPARE_RECEIVE_DISABLED */
|
||||||
|
/* #define USBD_CUSTOMHID_EP0_OUT_PREPARE_RECEIVE_DISABLED */
|
||||||
|
/* #define USBD_CUSTOMHID_CTRL_REQ_COMPLETE_CALLBACK_ENABLED */
|
||||||
|
/* #define USBD_CUSTOMHID_REPORT_BUFFER_EVENT_ENABLED */
|
||||||
|
|
||||||
/* VIDEO Class Config */
|
/* VIDEO Class Config */
|
||||||
#define UVC_1_1 /* #define UVC_1_0 */
|
#define UVC_1_1 /* #define UVC_1_0 */
|
||||||
|
|
||||||
@@ -91,7 +100,7 @@ extern "C" {
|
|||||||
#define UVC_COLOR_PRIMARIE 0x01U
|
#define UVC_COLOR_PRIMARIE 0x01U
|
||||||
#define UVC_TFR_CHARACTERISTICS 0x01U
|
#define UVC_TFR_CHARACTERISTICS 0x01U
|
||||||
#define UVC_MATRIX_COEFFICIENTS 0x04U
|
#define UVC_MATRIX_COEFFICIENTS 0x04U
|
||||||
#endif
|
#endif /* USBD_UVC_FORMAT_UNCOMPRESSED */
|
||||||
|
|
||||||
/* Video Stream frame width and height */
|
/* Video Stream frame width and height */
|
||||||
#define UVC_WIDTH 176U
|
#define UVC_WIDTH 176U
|
||||||
@@ -141,7 +150,7 @@ extern "C" {
|
|||||||
} while (0)
|
} while (0)
|
||||||
#else
|
#else
|
||||||
#define USBD_UsrLog(...) do {} while (0)
|
#define USBD_UsrLog(...) do {} while (0)
|
||||||
#endif
|
#endif /* (USBD_DEBUG_LEVEL > 0U) */
|
||||||
|
|
||||||
#if (USBD_DEBUG_LEVEL > 1U)
|
#if (USBD_DEBUG_LEVEL > 1U)
|
||||||
|
|
||||||
@@ -152,7 +161,7 @@ extern "C" {
|
|||||||
} while (0)
|
} while (0)
|
||||||
#else
|
#else
|
||||||
#define USBD_ErrLog(...) do {} while (0)
|
#define USBD_ErrLog(...) do {} while (0)
|
||||||
#endif
|
#endif /* (USBD_DEBUG_LEVEL > 1U) */
|
||||||
|
|
||||||
#if (USBD_DEBUG_LEVEL > 2U)
|
#if (USBD_DEBUG_LEVEL > 2U)
|
||||||
#define USBD_DbgLog(...) do { \
|
#define USBD_DbgLog(...) do { \
|
||||||
@@ -162,7 +171,7 @@ extern "C" {
|
|||||||
} while (0)
|
} while (0)
|
||||||
#else
|
#else
|
||||||
#define USBD_DbgLog(...) do {} while (0)
|
#define USBD_DbgLog(...) do {} while (0)
|
||||||
#endif
|
#endif /* (USBD_DEBUG_LEVEL > 2U) */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
@@ -221,4 +230,3 @@ void USBD_static_free(void *p);
|
|||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -6,13 +6,12 @@
|
|||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @attention
|
* @attention
|
||||||
*
|
*
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
* Copyright (c) 2015 STMicroelectronics.
|
||||||
* All rights reserved.</center></h2>
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
* in the root directory of this software component.
|
||||||
* the License. You may obtain a copy of the License at:
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
*
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
@@ -87,6 +86,20 @@ USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev);
|
|||||||
USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef *pdev);
|
USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef *pdev);
|
||||||
USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef *pdev);
|
USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef *pdev);
|
||||||
USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass);
|
USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass);
|
||||||
|
#if (USBD_USER_REGISTER_CALLBACK == 1U)
|
||||||
|
USBD_StatusTypeDef USBD_RegisterDevStateCallback(USBD_HandleTypeDef *pdev, USBD_DevStateCallbackTypeDef pUserCallback);
|
||||||
|
#endif /* USBD_USER_REGISTER_CALLBACK */
|
||||||
|
|
||||||
|
#ifdef USE_USBD_COMPOSITE
|
||||||
|
USBD_StatusTypeDef USBD_RegisterClassComposite(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass,
|
||||||
|
USBD_CompositeClassTypeDef classtype, uint8_t *EpAddr);
|
||||||
|
|
||||||
|
USBD_StatusTypeDef USBD_UnRegisterClassComposite(USBD_HandleTypeDef *pdev);
|
||||||
|
uint8_t USBD_CoreGetEPAdd(USBD_HandleTypeDef *pdev, uint8_t ep_dir, uint8_t ep_type, uint8_t ClassId);
|
||||||
|
#endif /* USE_USBD_COMPOSITE */
|
||||||
|
|
||||||
|
uint8_t USBD_CoreFindIF(USBD_HandleTypeDef *pdev, uint8_t index);
|
||||||
|
uint8_t USBD_CoreFindEP(USBD_HandleTypeDef *pdev, uint8_t index);
|
||||||
|
|
||||||
USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef *pdev);
|
USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef *pdev);
|
||||||
USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx);
|
USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx);
|
||||||
@@ -129,11 +142,18 @@ USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr,
|
|||||||
USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr,
|
USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr,
|
||||||
uint8_t *pbuf, uint32_t size);
|
uint8_t *pbuf, uint32_t size);
|
||||||
|
|
||||||
|
#ifdef USBD_HS_TESTMODE_ENABLE
|
||||||
|
USBD_StatusTypeDef USBD_LL_SetTestMode(USBD_HandleTypeDef *pdev, uint8_t testmode);
|
||||||
|
#endif /* USBD_HS_TESTMODE_ENABLE */
|
||||||
|
|
||||||
uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr);
|
uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr);
|
||||||
uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr);
|
uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr);
|
||||||
|
|
||||||
void USBD_LL_Delay(uint32_t Delay);
|
void USBD_LL_Delay(uint32_t Delay);
|
||||||
|
|
||||||
|
void *USBD_GetEpDesc(uint8_t *pConfDesc, uint8_t EpAddr);
|
||||||
|
USBD_DescHeaderTypeDef *USBD_GetNextDesc(uint8_t *pbuf, uint16_t *ptr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
@@ -152,7 +172,4 @@ void USBD_LL_Delay(uint32_t Delay);
|
|||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,13 +6,12 @@
|
|||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @attention
|
* @attention
|
||||||
*
|
*
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
* Copyright (c) 2015 STMicroelectronics.
|
||||||
* All rights reserved.</center></h2>
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
* in the root directory of this software component.
|
||||||
* the License. You may obtain a copy of the License at:
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
*
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
@@ -100,4 +99,3 @@ void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len);
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|||||||
@@ -6,13 +6,12 @@
|
|||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @attention
|
* @attention
|
||||||
*
|
*
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
* Copyright (c) 2015 STMicroelectronics.
|
||||||
* All rights reserved.</center></h2>
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
* in the root directory of this software component.
|
||||||
* the License. You may obtain a copy of the License at:
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
*
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
@@ -53,6 +52,24 @@ extern "C" {
|
|||||||
#define USBD_MAX_NUM_CONFIGURATION 1U
|
#define USBD_MAX_NUM_CONFIGURATION 1U
|
||||||
#endif /* USBD_MAX_NUM_CONFIGURATION */
|
#endif /* USBD_MAX_NUM_CONFIGURATION */
|
||||||
|
|
||||||
|
#ifdef USE_USBD_COMPOSITE
|
||||||
|
#ifndef USBD_MAX_SUPPORTED_CLASS
|
||||||
|
#define USBD_MAX_SUPPORTED_CLASS 4U
|
||||||
|
#endif /* USBD_MAX_SUPPORTED_CLASS */
|
||||||
|
#else
|
||||||
|
#ifndef USBD_MAX_SUPPORTED_CLASS
|
||||||
|
#define USBD_MAX_SUPPORTED_CLASS 1U
|
||||||
|
#endif /* USBD_MAX_SUPPORTED_CLASS */
|
||||||
|
#endif /* USE_USBD_COMPOSITE */
|
||||||
|
|
||||||
|
#ifndef USBD_MAX_CLASS_ENDPOINTS
|
||||||
|
#define USBD_MAX_CLASS_ENDPOINTS 5U
|
||||||
|
#endif /* USBD_MAX_CLASS_ENDPOINTS */
|
||||||
|
|
||||||
|
#ifndef USBD_MAX_CLASS_INTERFACES
|
||||||
|
#define USBD_MAX_CLASS_INTERFACES 5U
|
||||||
|
#endif /* USBD_MAX_CLASS_INTERFACES */
|
||||||
|
|
||||||
#ifndef USBD_LPM_ENABLED
|
#ifndef USBD_LPM_ENABLED
|
||||||
#define USBD_LPM_ENABLED 0U
|
#define USBD_LPM_ENABLED 0U
|
||||||
#endif /* USBD_LPM_ENABLED */
|
#endif /* USBD_LPM_ENABLED */
|
||||||
@@ -160,6 +177,14 @@ extern "C" {
|
|||||||
#define USBD_EP_TYPE_BULK 0x02U
|
#define USBD_EP_TYPE_BULK 0x02U
|
||||||
#define USBD_EP_TYPE_INTR 0x03U
|
#define USBD_EP_TYPE_INTR 0x03U
|
||||||
|
|
||||||
|
#ifdef USE_USBD_COMPOSITE
|
||||||
|
#define USBD_EP_IN 0x80U
|
||||||
|
#define USBD_EP_OUT 0x00U
|
||||||
|
#define USBD_FUNC_DESCRIPTOR_TYPE 0x24U
|
||||||
|
#define USBD_DESC_SUBTYPE_ACM 0x0FU
|
||||||
|
#define USBD_DESC_ECM_BCD_LOW 0x00U
|
||||||
|
#define USBD_DESC_ECM_BCD_HIGH 0x10U
|
||||||
|
#endif /* USE_USBD_COMPOSITE */
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
@@ -188,7 +213,7 @@ typedef struct
|
|||||||
uint8_t iConfiguration;
|
uint8_t iConfiguration;
|
||||||
uint8_t bmAttributes;
|
uint8_t bmAttributes;
|
||||||
uint8_t bMaxPower;
|
uint8_t bMaxPower;
|
||||||
} USBD_ConfigDescTypedef;
|
} __PACKED USBD_ConfigDescTypeDef;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@@ -196,7 +221,7 @@ typedef struct
|
|||||||
uint8_t bDescriptorType;
|
uint8_t bDescriptorType;
|
||||||
uint16_t wTotalLength;
|
uint16_t wTotalLength;
|
||||||
uint8_t bNumDeviceCaps;
|
uint8_t bNumDeviceCaps;
|
||||||
} USBD_BosDescTypedef;
|
} USBD_BosDescTypeDef;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@@ -206,7 +231,14 @@ typedef struct
|
|||||||
uint8_t bmAttributes;
|
uint8_t bmAttributes;
|
||||||
uint16_t wMaxPacketSize;
|
uint16_t wMaxPacketSize;
|
||||||
uint8_t bInterval;
|
uint8_t bInterval;
|
||||||
} USBD_EpDescTypedef;
|
} __PACKED USBD_EpDescTypeDef;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t bLength;
|
||||||
|
uint8_t bDescriptorType;
|
||||||
|
uint8_t bDescriptorSubType;
|
||||||
|
} USBD_DescHeaderTypeDef;
|
||||||
|
|
||||||
struct _USBD_HandleTypeDef;
|
struct _USBD_HandleTypeDef;
|
||||||
|
|
||||||
@@ -231,7 +263,7 @@ typedef struct _Device_cb
|
|||||||
uint8_t *(*GetDeviceQualifierDescriptor)(uint16_t *length);
|
uint8_t *(*GetDeviceQualifierDescriptor)(uint16_t *length);
|
||||||
#if (USBD_SUPPORT_USER_STRING_DESC == 1U)
|
#if (USBD_SUPPORT_USER_STRING_DESC == 1U)
|
||||||
uint8_t *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length);
|
uint8_t *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length);
|
||||||
#endif
|
#endif /* USBD_SUPPORT_USER_STRING_DESC */
|
||||||
|
|
||||||
} USBD_ClassTypeDef;
|
} USBD_ClassTypeDef;
|
||||||
|
|
||||||
@@ -264,23 +296,67 @@ typedef struct
|
|||||||
uint8_t *(*GetInterfaceStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length);
|
uint8_t *(*GetInterfaceStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length);
|
||||||
#if (USBD_CLASS_USER_STRING_DESC == 1)
|
#if (USBD_CLASS_USER_STRING_DESC == 1)
|
||||||
uint8_t *(*GetUserStrDescriptor)(USBD_SpeedTypeDef speed, uint8_t idx, uint16_t *length);
|
uint8_t *(*GetUserStrDescriptor)(USBD_SpeedTypeDef speed, uint8_t idx, uint16_t *length);
|
||||||
#endif
|
#endif /* USBD_CLASS_USER_STRING_DESC */
|
||||||
#if ((USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1))
|
#if ((USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1))
|
||||||
uint8_t *(*GetBOSDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length);
|
uint8_t *(*GetBOSDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length);
|
||||||
#endif
|
#endif /* (USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1) */
|
||||||
} USBD_DescriptorsTypeDef;
|
} USBD_DescriptorsTypeDef;
|
||||||
|
|
||||||
/* USB Device handle structure */
|
/* USB Device handle structure */
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint32_t status;
|
|
||||||
uint32_t total_length;
|
uint32_t total_length;
|
||||||
uint32_t rem_length;
|
uint32_t rem_length;
|
||||||
uint32_t maxpacket;
|
uint32_t bInterval;
|
||||||
uint16_t is_used;
|
uint16_t maxpacket;
|
||||||
uint16_t bInterval;
|
uint8_t status;
|
||||||
|
uint8_t is_used;
|
||||||
|
uint8_t *pbuffer;
|
||||||
} USBD_EndpointTypeDef;
|
} USBD_EndpointTypeDef;
|
||||||
|
|
||||||
|
#ifdef USE_USBD_COMPOSITE
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
CLASS_TYPE_NONE = 0,
|
||||||
|
CLASS_TYPE_HID = 1,
|
||||||
|
CLASS_TYPE_CDC = 2,
|
||||||
|
CLASS_TYPE_MSC = 3,
|
||||||
|
CLASS_TYPE_DFU = 4,
|
||||||
|
CLASS_TYPE_CHID = 5,
|
||||||
|
CLASS_TYPE_AUDIO = 6,
|
||||||
|
CLASS_TYPE_ECM = 7,
|
||||||
|
CLASS_TYPE_RNDIS = 8,
|
||||||
|
CLASS_TYPE_MTP = 9,
|
||||||
|
CLASS_TYPE_VIDEO = 10,
|
||||||
|
CLASS_TYPE_PRINTER = 11,
|
||||||
|
CLASS_TYPE_CCID = 12,
|
||||||
|
} USBD_CompositeClassTypeDef;
|
||||||
|
|
||||||
|
|
||||||
|
/* USB Device handle structure */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint8_t add;
|
||||||
|
uint8_t type;
|
||||||
|
uint8_t size;
|
||||||
|
uint8_t is_used;
|
||||||
|
} USBD_EPTypeDef;
|
||||||
|
|
||||||
|
/* USB Device handle structure */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
USBD_CompositeClassTypeDef ClassType;
|
||||||
|
uint32_t ClassId;
|
||||||
|
uint32_t Active;
|
||||||
|
uint32_t NumEps;
|
||||||
|
USBD_EPTypeDef Eps[USBD_MAX_CLASS_ENDPOINTS];
|
||||||
|
uint8_t *EpAdd;
|
||||||
|
uint32_t NumIf;
|
||||||
|
uint8_t Ifs[USBD_MAX_CLASS_INTERFACES];
|
||||||
|
uint32_t CurrPcktSze;
|
||||||
|
} USBD_CompositeElementTypeDef;
|
||||||
|
#endif /* USE_USBD_COMPOSITE */
|
||||||
|
|
||||||
/* USB Device handle structure */
|
/* USB Device handle structure */
|
||||||
typedef struct _USBD_HandleTypeDef
|
typedef struct _USBD_HandleTypeDef
|
||||||
{
|
{
|
||||||
@@ -303,14 +379,40 @@ typedef struct _USBD_HandleTypeDef
|
|||||||
|
|
||||||
USBD_SetupReqTypedef request;
|
USBD_SetupReqTypedef request;
|
||||||
USBD_DescriptorsTypeDef *pDesc;
|
USBD_DescriptorsTypeDef *pDesc;
|
||||||
USBD_ClassTypeDef *pClass;
|
USBD_ClassTypeDef *pClass[USBD_MAX_SUPPORTED_CLASS];
|
||||||
void *pClassData;
|
void *pClassData;
|
||||||
void *pUserData;
|
void *pClassDataCmsit[USBD_MAX_SUPPORTED_CLASS];
|
||||||
|
void *pUserData[USBD_MAX_SUPPORTED_CLASS];
|
||||||
void *pData;
|
void *pData;
|
||||||
void *pBosDesc;
|
void *pBosDesc;
|
||||||
void *pConfDesc;
|
void *pConfDesc;
|
||||||
|
uint32_t classId;
|
||||||
|
uint32_t NumClasses;
|
||||||
|
#ifdef USE_USBD_COMPOSITE
|
||||||
|
USBD_CompositeElementTypeDef tclasslist[USBD_MAX_SUPPORTED_CLASS];
|
||||||
|
#endif /* USE_USBD_COMPOSITE */
|
||||||
|
#if (USBD_USER_REGISTER_CALLBACK == 1U)
|
||||||
|
void (* DevStateCallback)(uint8_t dev_state, uint8_t cfgidx); /*!< User Notification callback */
|
||||||
|
#endif /* USBD_USER_REGISTER_CALLBACK */
|
||||||
} USBD_HandleTypeDef;
|
} USBD_HandleTypeDef;
|
||||||
|
|
||||||
|
#if (USBD_USER_REGISTER_CALLBACK == 1U)
|
||||||
|
typedef void (*USBD_DevStateCallbackTypeDef)(uint8_t dev_state, uint8_t cfgidx); /*!< pointer to User callback function */
|
||||||
|
#endif /* USBD_USER_REGISTER_CALLBACK */
|
||||||
|
|
||||||
|
/* USB Device endpoint direction */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
OUT = 0x00,
|
||||||
|
IN = 0x80,
|
||||||
|
} USBD_EPDirectionTypeDef;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
NETWORK_CONNECTION = 0x00,
|
||||||
|
RESPONSE_AVAILABLE = 0x01,
|
||||||
|
CONNECTION_SPEED_CHANGE = 0x2A
|
||||||
|
} USBD_CDC_NotifCodeTypeDef;
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
@@ -322,7 +424,9 @@ typedef struct _USBD_HandleTypeDef
|
|||||||
*/
|
*/
|
||||||
__STATIC_INLINE uint16_t SWAPBYTE(uint8_t *addr)
|
__STATIC_INLINE uint16_t SWAPBYTE(uint8_t *addr)
|
||||||
{
|
{
|
||||||
uint16_t _SwapVal, _Byte1, _Byte2;
|
uint16_t _SwapVal;
|
||||||
|
uint16_t _Byte1;
|
||||||
|
uint16_t _Byte2;
|
||||||
uint8_t *_pbuff = addr;
|
uint8_t *_pbuff = addr;
|
||||||
|
|
||||||
_Byte1 = *(uint8_t *)_pbuff;
|
_Byte1 = *(uint8_t *)_pbuff;
|
||||||
@@ -336,19 +440,19 @@ __STATIC_INLINE uint16_t SWAPBYTE(uint8_t *addr)
|
|||||||
|
|
||||||
#ifndef LOBYTE
|
#ifndef LOBYTE
|
||||||
#define LOBYTE(x) ((uint8_t)((x) & 0x00FFU))
|
#define LOBYTE(x) ((uint8_t)((x) & 0x00FFU))
|
||||||
#endif
|
#endif /* LOBYTE */
|
||||||
|
|
||||||
#ifndef HIBYTE
|
#ifndef HIBYTE
|
||||||
#define HIBYTE(x) ((uint8_t)(((x) & 0xFF00U) >> 8U))
|
#define HIBYTE(x) ((uint8_t)(((x) & 0xFF00U) >> 8U))
|
||||||
#endif
|
#endif /* HIBYTE */
|
||||||
|
|
||||||
#ifndef MIN
|
#ifndef MIN
|
||||||
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
||||||
#endif
|
#endif /* MIN */
|
||||||
|
|
||||||
#ifndef MAX
|
#ifndef MAX
|
||||||
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
|
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
|
||||||
#endif
|
#endif /* MAX */
|
||||||
|
|
||||||
#if defined ( __GNUC__ )
|
#if defined ( __GNUC__ )
|
||||||
#ifndef __weak
|
#ifndef __weak
|
||||||
@@ -417,4 +521,4 @@ __STATIC_INLINE uint16_t SWAPBYTE(uint8_t *addr)
|
|||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|||||||
@@ -6,13 +6,12 @@
|
|||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @attention
|
* @attention
|
||||||
*
|
*
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
* Copyright (c) 2015 STMicroelectronics.
|
||||||
* All rights reserved.</center></h2>
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
* in the root directory of this software component.
|
||||||
* the License. You may obtain a copy of the License at:
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
*
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
@@ -26,6 +25,10 @@
|
|||||||
|
|
||||||
/* Exported types ------------------------------------------------------------*/
|
/* Exported types ------------------------------------------------------------*/
|
||||||
/* Exported constants --------------------------------------------------------*/
|
/* Exported constants --------------------------------------------------------*/
|
||||||
|
/*
|
||||||
|
* User to provide a unique ID to define the USB device serial number
|
||||||
|
* The use of UID_BASE register can be considered as an example
|
||||||
|
*/
|
||||||
#define DEVICE_ID1 (UID_BASE)
|
#define DEVICE_ID1 (UID_BASE)
|
||||||
#define DEVICE_ID2 (UID_BASE + 0x4U)
|
#define DEVICE_ID2 (UID_BASE + 0x4U)
|
||||||
#define DEVICE_ID3 (UID_BASE + 0x8U)
|
#define DEVICE_ID3 (UID_BASE + 0x8U)
|
||||||
@@ -44,7 +47,7 @@
|
|||||||
#define USBD_BB_URL_STR_DESC (uint8_t *)"www.st.com"
|
#define USBD_BB_URL_STR_DESC (uint8_t *)"www.st.com"
|
||||||
#define USBD_BB_ALTMODE0_STR_DESC (uint8_t *)"STM32 Alternate0 Mode"
|
#define USBD_BB_ALTMODE0_STR_DESC (uint8_t *)"STM32 Alternate0 Mode"
|
||||||
#define USBD_BB_ALTMODE1_STR_DESC (uint8_t *)"STM32 Alternate1 Mode"
|
#define USBD_BB_ALTMODE1_STR_DESC (uint8_t *)"STM32 Alternate1 Mode"
|
||||||
#endif
|
#endif /* USBD_CLASS_USER_STRING_DESC */
|
||||||
|
|
||||||
#define USB_SIZ_STRING_SERIAL 0x1AU
|
#define USB_SIZ_STRING_SERIAL 0x1AU
|
||||||
|
|
||||||
@@ -52,12 +55,11 @@
|
|||||||
#define USB_SIZ_BOS_DESC 0x0CU
|
#define USB_SIZ_BOS_DESC 0x0CU
|
||||||
#elif (USBD_CLASS_BOS_ENABLED == 1)
|
#elif (USBD_CLASS_BOS_ENABLED == 1)
|
||||||
#define USB_SIZ_BOS_DESC 0x5DU
|
#define USB_SIZ_BOS_DESC 0x5DU
|
||||||
#endif
|
#endif /* USBD_LPM_ENABLED */
|
||||||
|
|
||||||
/* Exported macro ------------------------------------------------------------*/
|
/* Exported macro ------------------------------------------------------------*/
|
||||||
/* Exported functions ------------------------------------------------------- */
|
/* Exported functions ------------------------------------------------------- */
|
||||||
extern USBD_DescriptorsTypeDef XXX_Desc; /* Replace 'XXX_Desc' with your active USB device class, ex: HID_Desc */
|
extern USBD_DescriptorsTypeDef Class_Desc; /* Replace 'XXX_Desc' with your active USB device class, ex: HID_Desc */
|
||||||
|
|
||||||
#endif /* __USBD_DESC_TEMPLATE_H*/
|
#endif /* __USBD_DESC_TEMPLATE_H*/
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -6,13 +6,12 @@
|
|||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @attention
|
* @attention
|
||||||
*
|
*
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
* Copyright (c) 2015 STMicroelectronics.
|
||||||
* All rights reserved.</center></h2>
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
* in the root directory of this software component.
|
||||||
* the License. You may obtain a copy of the License at:
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
*
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
@@ -111,4 +110,4 @@ uint32_t USBD_GetRxCount(USBD_HandleTypeDef *pdev, uint8_t ep_addr);
|
|||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|||||||
230
Core/Src/usbd_conf.c
Normal file
230
Core/Src/usbd_conf.c
Normal file
@@ -0,0 +1,230 @@
|
|||||||
|
/**
|
||||||
|
******************************************************************************
|
||||||
|
* @file usbd_conf_template.c
|
||||||
|
* @author MCD Application Team
|
||||||
|
* @brief USB Device configuration and 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.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Includes ------------------------------------------------------------------*/
|
||||||
|
#include "main.h"
|
||||||
|
#include "usbd_core.h"
|
||||||
|
#include "usbd_cdc.h" /* Include class header file */
|
||||||
|
//#include "usbd_hid.h" /* Include class header file */
|
||||||
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
|
/* Private define ------------------------------------------------------------*/
|
||||||
|
/* Private macro -------------------------------------------------------------*/
|
||||||
|
/* Private variables ---------------------------------------------------------*/
|
||||||
|
extern PCD_HandleTypeDef hpcd_USB_FS;
|
||||||
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
|
static USBD_StatusTypeDef USBD_Get_USB_Status(HAL_StatusTypeDef hal_status);
|
||||||
|
/* Private functions ---------------------------------------------------------*/
|
||||||
|
void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd)
|
||||||
|
{
|
||||||
|
USBD_LL_SetupStage((USBD_HandleTypeDef*)hpcd->pData, (uint8_t *)hpcd->Setup);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
|
||||||
|
{
|
||||||
|
USBD_LL_DataOutStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum)
|
||||||
|
{
|
||||||
|
USBD_LL_DataInStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
|
||||||
|
{
|
||||||
|
USBD_LL_SOF((USBD_HandleTypeDef*)hpcd->pData);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd)
|
||||||
|
{
|
||||||
|
USBD_SpeedTypeDef speed = USBD_SPEED_FULL;
|
||||||
|
if ( hpcd->Init.speed != PCD_SPEED_FULL)
|
||||||
|
{
|
||||||
|
Error_Handler();
|
||||||
|
}
|
||||||
|
/* Set Speed. */
|
||||||
|
USBD_LL_SetSpeed((USBD_HandleTypeDef*)hpcd->pData, speed);
|
||||||
|
/* Reset Device. */
|
||||||
|
USBD_LL_Reset((USBD_HandleTypeDef*)hpcd->pData);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd)
|
||||||
|
{
|
||||||
|
USBD_LL_DevConnected((USBD_HandleTypeDef*)hpcd->pData);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
|
||||||
|
{
|
||||||
|
USBD_LL_DevDisconnected((USBD_HandleTypeDef*)hpcd->pData);
|
||||||
|
}
|
||||||
|
/* Private functions ---------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
||||||
|
USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev)
|
||||||
|
{
|
||||||
|
pdev->pData = &hpcd_USB_FS;
|
||||||
|
HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 0x40);
|
||||||
|
HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x80);
|
||||||
|
HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , CDC_IN_EP , PCD_SNG_BUF, 0xC0);
|
||||||
|
HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , CDC_OUT_EP , PCD_SNG_BUF, 0x100);
|
||||||
|
HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , CDC_CMD_EP , PCD_SNG_BUF, 0x140);
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev)
|
||||||
|
{
|
||||||
|
HAL_StatusTypeDef hal_status;
|
||||||
|
hal_status = HAL_PCD_DeInit(pdev->pData);
|
||||||
|
return USBD_Get_USB_Status(hal_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev)
|
||||||
|
{
|
||||||
|
HAL_StatusTypeDef hal_status;
|
||||||
|
hal_status = HAL_PCD_Start(pdev->pData);
|
||||||
|
return USBD_Get_USB_Status(hal_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev)
|
||||||
|
{
|
||||||
|
HAL_StatusTypeDef hal_status;
|
||||||
|
hal_status = HAL_PCD_Stop(pdev->pData);
|
||||||
|
return USBD_Get_USB_Status(hal_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr,
|
||||||
|
uint8_t ep_type, uint16_t ep_mps)
|
||||||
|
{
|
||||||
|
HAL_StatusTypeDef hal_status;
|
||||||
|
hal_status = HAL_PCD_EP_Open(pdev->pData, ep_addr, ep_mps, ep_type);
|
||||||
|
return USBD_Get_USB_Status(hal_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
|
||||||
|
{
|
||||||
|
HAL_StatusTypeDef hal_status;
|
||||||
|
hal_status = HAL_PCD_EP_Close(pdev->pData, ep_addr);
|
||||||
|
return USBD_Get_USB_Status(hal_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
|
||||||
|
{
|
||||||
|
HAL_StatusTypeDef hal_status;
|
||||||
|
hal_status = HAL_PCD_EP_Flush(pdev->pData, ep_addr);
|
||||||
|
return USBD_Get_USB_Status(hal_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
|
||||||
|
{
|
||||||
|
HAL_StatusTypeDef hal_status;
|
||||||
|
hal_status = HAL_PCD_EP_SetStall(pdev->pData, ep_addr);
|
||||||
|
return USBD_Get_USB_Status(hal_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev,
|
||||||
|
uint8_t ep_addr)
|
||||||
|
{
|
||||||
|
HAL_StatusTypeDef hal_status;
|
||||||
|
hal_status = HAL_PCD_EP_ClrStall(pdev->pData, ep_addr);
|
||||||
|
return USBD_Get_USB_Status(hal_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
|
||||||
|
{
|
||||||
|
PCD_HandleTypeDef *hpcd = (PCD_HandleTypeDef*) pdev->pData;
|
||||||
|
if((ep_addr & 0x80) == 0x80)
|
||||||
|
{
|
||||||
|
return hpcd->IN_ep[ep_addr & 0x7F].is_stall;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return hpcd->OUT_ep[ep_addr & 0x7F].is_stall;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev,
|
||||||
|
uint8_t dev_addr)
|
||||||
|
{
|
||||||
|
HAL_StatusTypeDef hal_status;
|
||||||
|
hal_status = HAL_PCD_SetAddress(pdev->pData, dev_addr);
|
||||||
|
return USBD_Get_USB_Status(hal_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr,
|
||||||
|
uint8_t *pbuf, uint32_t size)
|
||||||
|
{
|
||||||
|
HAL_StatusTypeDef hal_status;
|
||||||
|
hal_status = HAL_PCD_EP_Transmit(pdev->pData, ep_addr, pbuf, size);
|
||||||
|
return USBD_Get_USB_Status(hal_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev,
|
||||||
|
uint8_t ep_addr, uint8_t *pbuf,
|
||||||
|
uint32_t size)
|
||||||
|
{
|
||||||
|
HAL_StatusTypeDef hal_status;
|
||||||
|
hal_status = HAL_PCD_EP_Receive(pdev->pData, ep_addr, pbuf, size);
|
||||||
|
return USBD_Get_USB_Status(hal_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
|
||||||
|
{
|
||||||
|
return HAL_PCD_EP_GetRxCount((PCD_HandleTypeDef*) pdev->pData, ep_addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *USBD_static_malloc(uint32_t size)
|
||||||
|
{
|
||||||
|
UNUSED(size);
|
||||||
|
static uint32_t mem[(sizeof(USBD_CDC_HandleTypeDef) / 4) + 1]; /* On 32-bit boundary */
|
||||||
|
return mem;
|
||||||
|
}
|
||||||
|
|
||||||
|
void USBD_static_free(void *p)
|
||||||
|
{
|
||||||
|
UNUSED(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
void USBD_LL_Delay(uint32_t Delay)
|
||||||
|
{
|
||||||
|
HAL_Delay(Delay);
|
||||||
|
}
|
||||||
|
|
||||||
|
USBD_StatusTypeDef USBD_Get_USB_Status(HAL_StatusTypeDef hal_status)
|
||||||
|
{
|
||||||
|
USBD_StatusTypeDef usb_status = USBD_OK;
|
||||||
|
switch (hal_status)
|
||||||
|
{
|
||||||
|
case HAL_OK :
|
||||||
|
usb_status = USBD_OK;
|
||||||
|
break;
|
||||||
|
case HAL_ERROR :
|
||||||
|
usb_status = USBD_FAIL;
|
||||||
|
break;
|
||||||
|
case HAL_BUSY :
|
||||||
|
usb_status = USBD_BUSY;
|
||||||
|
break;
|
||||||
|
case HAL_TIMEOUT :
|
||||||
|
usb_status = USBD_FAIL;
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
usb_status = USBD_FAIL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return usb_status;
|
||||||
|
}
|
||||||
@@ -1,268 +0,0 @@
|
|||||||
/**
|
|
||||||
******************************************************************************
|
|
||||||
* @file usbd_conf_template.c
|
|
||||||
* @author MCD Application Team
|
|
||||||
* @brief USB Device configuration and interface file
|
|
||||||
* This template should be copied to the user folder,
|
|
||||||
* renamed and customized following user needs.
|
|
||||||
******************************************************************************
|
|
||||||
* @attention
|
|
||||||
*
|
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
|
||||||
* All rights reserved.</center></h2>
|
|
||||||
*
|
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
|
||||||
* the License. You may obtain a copy of the License at:
|
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
|
||||||
******************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Includes ------------------------------------------------------------------*/
|
|
||||||
#include "usbd_core.h"
|
|
||||||
#include "usbd_hid.h" /* Include class header file */
|
|
||||||
/* Private typedef -----------------------------------------------------------*/
|
|
||||||
/* Private define ------------------------------------------------------------*/
|
|
||||||
/* Private macro -------------------------------------------------------------*/
|
|
||||||
/* Private variables ---------------------------------------------------------*/
|
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
|
||||||
/* Private functions ---------------------------------------------------------*/
|
|
||||||
/**
|
|
||||||
* @brief Initializes the Low Level portion of the Device driver.
|
|
||||||
* @param pdev: Device handle
|
|
||||||
* @retval USBD Status
|
|
||||||
*/
|
|
||||||
USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev)
|
|
||||||
{
|
|
||||||
UNUSED(pdev);
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief De-Initializes the Low Level portion of the Device driver.
|
|
||||||
* @param pdev: Device handle
|
|
||||||
* @retval USBD Status
|
|
||||||
*/
|
|
||||||
USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev)
|
|
||||||
{
|
|
||||||
UNUSED(pdev);
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Starts the Low Level portion of the Device driver.
|
|
||||||
* @param pdev: Device handle
|
|
||||||
* @retval USBD Status
|
|
||||||
*/
|
|
||||||
USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev)
|
|
||||||
{
|
|
||||||
UNUSED(pdev);
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Stops the Low Level portion of the Device driver.
|
|
||||||
* @param pdev: Device handle
|
|
||||||
* @retval USBD Status
|
|
||||||
*/
|
|
||||||
USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev)
|
|
||||||
{
|
|
||||||
UNUSED(pdev);
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Opens an endpoint of the Low Level Driver.
|
|
||||||
* @param pdev: Device handle
|
|
||||||
* @param ep_addr: Endpoint Number
|
|
||||||
* @param ep_type: Endpoint Type
|
|
||||||
* @param ep_mps: Endpoint Max Packet Size
|
|
||||||
* @retval USBD Status
|
|
||||||
*/
|
|
||||||
USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr,
|
|
||||||
uint8_t ep_type, uint16_t ep_mps)
|
|
||||||
{
|
|
||||||
UNUSED(pdev);
|
|
||||||
UNUSED(ep_addr);
|
|
||||||
UNUSED(ep_type);
|
|
||||||
UNUSED(ep_mps);
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Closes an endpoint of the Low Level Driver.
|
|
||||||
* @param pdev: Device handle
|
|
||||||
* @param ep_addr: Endpoint Number
|
|
||||||
* @retval USBD Status
|
|
||||||
*/
|
|
||||||
USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
|
|
||||||
{
|
|
||||||
UNUSED(pdev);
|
|
||||||
UNUSED(ep_addr);
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Flushes an endpoint of the Low Level Driver.
|
|
||||||
* @param pdev: Device handle
|
|
||||||
* @param ep_addr: Endpoint Number
|
|
||||||
* @retval USBD Status
|
|
||||||
*/
|
|
||||||
USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
|
|
||||||
{
|
|
||||||
UNUSED(pdev);
|
|
||||||
UNUSED(ep_addr);
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Sets a Stall condition on an endpoint of the Low Level Driver.
|
|
||||||
* @param pdev: Device handle
|
|
||||||
* @param ep_addr: Endpoint Number
|
|
||||||
* @retval USBD Status
|
|
||||||
*/
|
|
||||||
USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
|
|
||||||
{
|
|
||||||
UNUSED(pdev);
|
|
||||||
UNUSED(ep_addr);
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Clears a Stall condition on an endpoint of the Low Level Driver.
|
|
||||||
* @param pdev: Device handle
|
|
||||||
* @param ep_addr: Endpoint Number
|
|
||||||
* @retval USBD Status
|
|
||||||
*/
|
|
||||||
USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev,
|
|
||||||
uint8_t ep_addr)
|
|
||||||
{
|
|
||||||
UNUSED(pdev);
|
|
||||||
UNUSED(ep_addr);
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Returns Stall condition.
|
|
||||||
* @param pdev: Device handle
|
|
||||||
* @param ep_addr: Endpoint Number
|
|
||||||
* @retval Stall (1: Yes, 0: No)
|
|
||||||
*/
|
|
||||||
uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
|
|
||||||
{
|
|
||||||
UNUSED(pdev);
|
|
||||||
UNUSED(ep_addr);
|
|
||||||
|
|
||||||
return 0U;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Assigns a USB address to the device.
|
|
||||||
* @param pdev: Device handle
|
|
||||||
* @param ep_addr: Endpoint Number
|
|
||||||
* @retval USBD Status
|
|
||||||
*/
|
|
||||||
USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev,
|
|
||||||
uint8_t dev_addr)
|
|
||||||
{
|
|
||||||
UNUSED(pdev);
|
|
||||||
UNUSED(ep_addr);
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Transmits data over an endpoint.
|
|
||||||
* @param pdev: Device handle
|
|
||||||
* @param ep_addr: Endpoint Number
|
|
||||||
* @param pbuf: Pointer to data to be sent
|
|
||||||
* @param size: Data size
|
|
||||||
* @retval USBD Status
|
|
||||||
*/
|
|
||||||
USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr,
|
|
||||||
uint8_t *pbuf, uint32_t size)
|
|
||||||
{
|
|
||||||
UNUSED(pdev);
|
|
||||||
UNUSED(ep_addr);
|
|
||||||
UNUSED(pbuf);
|
|
||||||
UNUSED(size);
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Prepares an endpoint for reception.
|
|
||||||
* @param pdev: Device handle
|
|
||||||
* @param ep_addr: Endpoint Number
|
|
||||||
* @param pbuf: Pointer to data to be received
|
|
||||||
* @param size: Data size
|
|
||||||
* @retval USBD Status
|
|
||||||
*/
|
|
||||||
USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev,
|
|
||||||
uint8_t ep_addr, uint8_t *pbuf,
|
|
||||||
uint32_t size)
|
|
||||||
{
|
|
||||||
UNUSED(pdev);
|
|
||||||
UNUSED(ep_addr);
|
|
||||||
UNUSED(pbuf);
|
|
||||||
UNUSED(size);
|
|
||||||
|
|
||||||
return USBD_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Returns the last transferred packet size.
|
|
||||||
* @param pdev: Device handle
|
|
||||||
* @param ep_addr: Endpoint Number
|
|
||||||
* @retval Received Data Size
|
|
||||||
*/
|
|
||||||
uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
|
|
||||||
{
|
|
||||||
UNUSED(pdev);
|
|
||||||
UNUSED(ep_addr);
|
|
||||||
|
|
||||||
return 0U;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Static single allocation.
|
|
||||||
* @param size: Size of allocated memory
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void *USBD_static_malloc(uint32_t size)
|
|
||||||
{
|
|
||||||
static uint32_t mem[(sizeof(USBD_HID_HandleTypeDef) / 4) + 1]; /* On 32-bit boundary */
|
|
||||||
return mem;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Dummy memory free
|
|
||||||
* @param p: Pointer to allocated memory address
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void USBD_static_free(void *p)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Delays routine for the USB Device Library.
|
|
||||||
* @param Delay: Delay in ms
|
|
||||||
* @retval None
|
|
||||||
*/
|
|
||||||
void USBD_LL_Delay(uint32_t Delay)
|
|
||||||
{
|
|
||||||
UNUSED(Delay);
|
|
||||||
}
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -6,13 +6,12 @@
|
|||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @attention
|
* @attention
|
||||||
*
|
*
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
* Copyright (c) 2015 STMicroelectronics.
|
||||||
* All rights reserved.</center></h2>
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
* in the root directory of this software component.
|
||||||
* the License. You may obtain a copy of the License at:
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
*
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
@@ -21,6 +20,9 @@
|
|||||||
#include "usbd_ctlreq.h"
|
#include "usbd_ctlreq.h"
|
||||||
#include "usbd_ioreq.h"
|
#include "usbd_ioreq.h"
|
||||||
|
|
||||||
|
#ifdef USE_USBD_COMPOSITE
|
||||||
|
#include "usbd_composite_builder.h"
|
||||||
|
#endif /* USE_USBD_COMPOSITE */
|
||||||
|
|
||||||
/** @addtogroup STM32_USBD_STATE_DEVICE_LIBRARY
|
/** @addtogroup STM32_USBD_STATE_DEVICE_LIBRARY
|
||||||
* @{
|
* @{
|
||||||
@@ -44,7 +46,9 @@
|
|||||||
/** @defgroup USBD_REQ_Private_Defines
|
/** @defgroup USBD_REQ_Private_Defines
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
#ifndef USBD_MAX_STR_DESC_SIZ
|
||||||
|
#define USBD_MAX_STR_DESC_SIZ 64U
|
||||||
|
#endif /* USBD_MAX_STR_DESC_SIZ */
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
@@ -105,7 +109,7 @@ USBD_StatusTypeDef USBD_StdDevReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef
|
|||||||
{
|
{
|
||||||
case USB_REQ_TYPE_CLASS:
|
case USB_REQ_TYPE_CLASS:
|
||||||
case USB_REQ_TYPE_VENDOR:
|
case USB_REQ_TYPE_VENDOR:
|
||||||
ret = (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req);
|
ret = (USBD_StatusTypeDef)pdev->pClass[pdev->classId]->Setup(pdev, req);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case USB_REQ_TYPE_STANDARD:
|
case USB_REQ_TYPE_STANDARD:
|
||||||
@@ -163,6 +167,7 @@ USBD_StatusTypeDef USBD_StdDevReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef
|
|||||||
USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
|
USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
|
||||||
{
|
{
|
||||||
USBD_StatusTypeDef ret = USBD_OK;
|
USBD_StatusTypeDef ret = USBD_OK;
|
||||||
|
uint8_t idx;
|
||||||
|
|
||||||
switch (req->bmRequest & USB_REQ_TYPE_MASK)
|
switch (req->bmRequest & USB_REQ_TYPE_MASK)
|
||||||
{
|
{
|
||||||
@@ -177,7 +182,27 @@ USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef
|
|||||||
|
|
||||||
if (LOBYTE(req->wIndex) <= USBD_MAX_NUM_INTERFACES)
|
if (LOBYTE(req->wIndex) <= USBD_MAX_NUM_INTERFACES)
|
||||||
{
|
{
|
||||||
ret = (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req);
|
/* Get the class index relative to this interface */
|
||||||
|
idx = USBD_CoreFindIF(pdev, LOBYTE(req->wIndex));
|
||||||
|
if (((uint8_t)idx != 0xFFU) && (idx < USBD_MAX_SUPPORTED_CLASS))
|
||||||
|
{
|
||||||
|
/* Call the class data out function to manage the request */
|
||||||
|
if (pdev->pClass[idx]->Setup != NULL)
|
||||||
|
{
|
||||||
|
pdev->classId = idx;
|
||||||
|
ret = (USBD_StatusTypeDef)(pdev->pClass[idx]->Setup(pdev, req));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* should never reach this condition */
|
||||||
|
ret = USBD_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* No relative interface found */
|
||||||
|
ret = USBD_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
if ((req->wLength == 0U) && (ret == USBD_OK))
|
if ((req->wLength == 0U) && (ret == USBD_OK))
|
||||||
{
|
{
|
||||||
@@ -215,14 +240,26 @@ USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef
|
|||||||
{
|
{
|
||||||
USBD_EndpointTypeDef *pep;
|
USBD_EndpointTypeDef *pep;
|
||||||
uint8_t ep_addr;
|
uint8_t ep_addr;
|
||||||
|
uint8_t idx;
|
||||||
USBD_StatusTypeDef ret = USBD_OK;
|
USBD_StatusTypeDef ret = USBD_OK;
|
||||||
|
|
||||||
ep_addr = LOBYTE(req->wIndex);
|
ep_addr = LOBYTE(req->wIndex);
|
||||||
|
|
||||||
switch (req->bmRequest & USB_REQ_TYPE_MASK)
|
switch (req->bmRequest & USB_REQ_TYPE_MASK)
|
||||||
{
|
{
|
||||||
case USB_REQ_TYPE_CLASS:
|
case USB_REQ_TYPE_CLASS:
|
||||||
case USB_REQ_TYPE_VENDOR:
|
case USB_REQ_TYPE_VENDOR:
|
||||||
ret = (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req);
|
/* Get the class index relative to this endpoint */
|
||||||
|
idx = USBD_CoreFindEP(pdev, ep_addr);
|
||||||
|
if (((uint8_t)idx != 0xFFU) && (idx < USBD_MAX_SUPPORTED_CLASS))
|
||||||
|
{
|
||||||
|
pdev->classId = idx;
|
||||||
|
/* Call the class data out function to manage the request */
|
||||||
|
if (pdev->pClass[idx]->Setup != NULL)
|
||||||
|
{
|
||||||
|
ret = (USBD_StatusTypeDef)pdev->pClass[idx]->Setup(pdev, req);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case USB_REQ_TYPE_STANDARD:
|
case USB_REQ_TYPE_STANDARD:
|
||||||
@@ -285,7 +322,18 @@ USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef
|
|||||||
(void)USBD_LL_ClearStallEP(pdev, ep_addr);
|
(void)USBD_LL_ClearStallEP(pdev, ep_addr);
|
||||||
}
|
}
|
||||||
(void)USBD_CtlSendStatus(pdev);
|
(void)USBD_CtlSendStatus(pdev);
|
||||||
ret = (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req);
|
|
||||||
|
/* Get the class index relative to this interface */
|
||||||
|
idx = USBD_CoreFindEP(pdev, ep_addr);
|
||||||
|
if (((uint8_t)idx != 0xFFU) && (idx < USBD_MAX_SUPPORTED_CLASS))
|
||||||
|
{
|
||||||
|
pdev->classId = idx;
|
||||||
|
/* Call the class data out function to manage the request */
|
||||||
|
if (pdev->pClass[idx]->Setup != NULL)
|
||||||
|
{
|
||||||
|
ret = (USBD_StatusTypeDef)(pdev->pClass[idx]->Setup(pdev, req));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -375,7 +423,7 @@ USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef
|
|||||||
* Handle Get Descriptor requests
|
* Handle Get Descriptor requests
|
||||||
* @param pdev: device instance
|
* @param pdev: device instance
|
||||||
* @param req: usb request
|
* @param req: usb request
|
||||||
* @retval status
|
* @retval None
|
||||||
*/
|
*/
|
||||||
static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
|
static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
|
||||||
{
|
{
|
||||||
@@ -397,7 +445,7 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *r
|
|||||||
err++;
|
err++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif /* (USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1U) */
|
||||||
case USB_DESC_TYPE_DEVICE:
|
case USB_DESC_TYPE_DEVICE:
|
||||||
pbuf = pdev->pDesc->GetDeviceDescriptor(pdev->dev_speed, &len);
|
pbuf = pdev->pDesc->GetDeviceDescriptor(pdev->dev_speed, &len);
|
||||||
break;
|
break;
|
||||||
@@ -405,12 +453,30 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *r
|
|||||||
case USB_DESC_TYPE_CONFIGURATION:
|
case USB_DESC_TYPE_CONFIGURATION:
|
||||||
if (pdev->dev_speed == USBD_SPEED_HIGH)
|
if (pdev->dev_speed == USBD_SPEED_HIGH)
|
||||||
{
|
{
|
||||||
pbuf = pdev->pClass->GetHSConfigDescriptor(&len);
|
#ifdef USE_USBD_COMPOSITE
|
||||||
|
if ((uint8_t)(pdev->NumClasses) > 0U)
|
||||||
|
{
|
||||||
|
pbuf = (uint8_t *)USBD_CMPSIT.GetHSConfigDescriptor(&len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif /* USE_USBD_COMPOSITE */
|
||||||
|
{
|
||||||
|
pbuf = (uint8_t *)pdev->pClass[0]->GetHSConfigDescriptor(&len);
|
||||||
|
}
|
||||||
pbuf[1] = USB_DESC_TYPE_CONFIGURATION;
|
pbuf[1] = USB_DESC_TYPE_CONFIGURATION;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pbuf = pdev->pClass->GetFSConfigDescriptor(&len);
|
#ifdef USE_USBD_COMPOSITE
|
||||||
|
if ((uint8_t)(pdev->NumClasses) > 0U)
|
||||||
|
{
|
||||||
|
pbuf = (uint8_t *)USBD_CMPSIT.GetFSConfigDescriptor(&len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif /* USE_USBD_COMPOSITE */
|
||||||
|
{
|
||||||
|
pbuf = (uint8_t *)pdev->pClass[0]->GetFSConfigDescriptor(&len);
|
||||||
|
}
|
||||||
pbuf[1] = USB_DESC_TYPE_CONFIGURATION;
|
pbuf[1] = USB_DESC_TYPE_CONFIGURATION;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -492,33 +558,43 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *r
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
#if (USBD_SUPPORT_USER_STRING_DESC == 1U)
|
#if (USBD_SUPPORT_USER_STRING_DESC == 1U)
|
||||||
if (pdev->pClass->GetUsrStrDescriptor != NULL)
|
pbuf = NULL;
|
||||||
|
|
||||||
|
for (uint32_t idx = 0U; (idx < pdev->NumClasses); idx++)
|
||||||
{
|
{
|
||||||
pbuf = pdev->pClass->GetUsrStrDescriptor(pdev, (req->wValue), &len);
|
if (pdev->pClass[idx]->GetUsrStrDescriptor != NULL)
|
||||||
|
{
|
||||||
|
pdev->classId = idx;
|
||||||
|
pbuf = pdev->pClass[idx]->GetUsrStrDescriptor(pdev, LOBYTE(req->wValue), &len);
|
||||||
|
|
||||||
|
if (pbuf == NULL) /* This means that no class recognized the string index */
|
||||||
|
{
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
USBD_CtlError(pdev, req);
|
break;
|
||||||
err++;
|
|
||||||
}
|
}
|
||||||
#endif
|
}
|
||||||
|
}
|
||||||
|
#endif /* USBD_SUPPORT_USER_STRING_DESC */
|
||||||
|
|
||||||
#if (USBD_CLASS_USER_STRING_DESC == 1U)
|
#if (USBD_CLASS_USER_STRING_DESC == 1U)
|
||||||
if (pdev->pDesc->GetUserStrDescriptor != NULL)
|
if (pdev->pDesc->GetUserStrDescriptor != NULL)
|
||||||
{
|
{
|
||||||
pbuf = pdev->pDesc->GetUserStrDescriptor(pdev->dev_speed, (req->wValue), &len);
|
pbuf = pdev->pDesc->GetUserStrDescriptor(pdev->dev_speed, LOBYTE(req->wValue), &len);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
USBD_CtlError(pdev, req);
|
USBD_CtlError(pdev, req);
|
||||||
err++;
|
err++;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* USBD_SUPPORT_USER_STRING_DESC */
|
||||||
|
|
||||||
#if ((USBD_CLASS_USER_STRING_DESC == 0U) && (USBD_SUPPORT_USER_STRING_DESC == 0U))
|
#if ((USBD_CLASS_USER_STRING_DESC == 0U) && (USBD_SUPPORT_USER_STRING_DESC == 0U))
|
||||||
USBD_CtlError(pdev, req);
|
USBD_CtlError(pdev, req);
|
||||||
err++;
|
err++;
|
||||||
#endif
|
#endif /* (USBD_CLASS_USER_STRING_DESC == 0U) && (USBD_SUPPORT_USER_STRING_DESC == 0U) */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -526,7 +602,16 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *r
|
|||||||
case USB_DESC_TYPE_DEVICE_QUALIFIER:
|
case USB_DESC_TYPE_DEVICE_QUALIFIER:
|
||||||
if (pdev->dev_speed == USBD_SPEED_HIGH)
|
if (pdev->dev_speed == USBD_SPEED_HIGH)
|
||||||
{
|
{
|
||||||
pbuf = pdev->pClass->GetDeviceQualifierDescriptor(&len);
|
#ifdef USE_USBD_COMPOSITE
|
||||||
|
if ((uint8_t)(pdev->NumClasses) > 0U)
|
||||||
|
{
|
||||||
|
pbuf = (uint8_t *)USBD_CMPSIT.GetDeviceQualifierDescriptor(&len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif /* USE_USBD_COMPOSITE */
|
||||||
|
{
|
||||||
|
pbuf = (uint8_t *)pdev->pClass[0]->GetDeviceQualifierDescriptor(&len);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -538,7 +623,16 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *r
|
|||||||
case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION:
|
case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION:
|
||||||
if (pdev->dev_speed == USBD_SPEED_HIGH)
|
if (pdev->dev_speed == USBD_SPEED_HIGH)
|
||||||
{
|
{
|
||||||
pbuf = pdev->pClass->GetOtherSpeedConfigDescriptor(&len);
|
#ifdef USE_USBD_COMPOSITE
|
||||||
|
if ((uint8_t)(pdev->NumClasses) > 0U)
|
||||||
|
{
|
||||||
|
pbuf = (uint8_t *)USBD_CMPSIT.GetOtherSpeedConfigDescriptor(&len);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif /* USE_USBD_COMPOSITE */
|
||||||
|
{
|
||||||
|
pbuf = (uint8_t *)pdev->pClass[0]->GetOtherSpeedConfigDescriptor(&len);
|
||||||
|
}
|
||||||
pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION;
|
pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -583,7 +677,7 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *r
|
|||||||
* Set device address
|
* Set device address
|
||||||
* @param pdev: device instance
|
* @param pdev: device instance
|
||||||
* @param req: usb request
|
* @param req: usb request
|
||||||
* @retval status
|
* @retval None
|
||||||
*/
|
*/
|
||||||
static void USBD_SetAddress(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
|
static void USBD_SetAddress(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
|
||||||
{
|
{
|
||||||
@@ -651,11 +745,19 @@ static USBD_StatusTypeDef USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReq
|
|||||||
if (ret != USBD_OK)
|
if (ret != USBD_OK)
|
||||||
{
|
{
|
||||||
USBD_CtlError(pdev, req);
|
USBD_CtlError(pdev, req);
|
||||||
|
pdev->dev_state = USBD_STATE_ADDRESSED;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
(void)USBD_CtlSendStatus(pdev);
|
(void)USBD_CtlSendStatus(pdev);
|
||||||
pdev->dev_state = USBD_STATE_CONFIGURED;
|
pdev->dev_state = USBD_STATE_CONFIGURED;
|
||||||
|
|
||||||
|
#if (USBD_USER_REGISTER_CALLBACK == 1U)
|
||||||
|
if (pdev->DevStateCallback != NULL)
|
||||||
|
{
|
||||||
|
pdev->DevStateCallback(USBD_STATE_CONFIGURED, cfgidx);
|
||||||
|
}
|
||||||
|
#endif /* USBD_USER_REGISTER_CALLBACK */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -714,7 +816,7 @@ static USBD_StatusTypeDef USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReq
|
|||||||
* Handle Get device configuration request
|
* Handle Get device configuration request
|
||||||
* @param pdev: device instance
|
* @param pdev: device instance
|
||||||
* @param req: usb request
|
* @param req: usb request
|
||||||
* @retval status
|
* @retval None
|
||||||
*/
|
*/
|
||||||
static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
|
static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
|
||||||
{
|
{
|
||||||
@@ -748,7 +850,7 @@ static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
|
|||||||
* Handle Get Status request
|
* Handle Get Status request
|
||||||
* @param pdev: device instance
|
* @param pdev: device instance
|
||||||
* @param req: usb request
|
* @param req: usb request
|
||||||
* @retval status
|
* @retval None
|
||||||
*/
|
*/
|
||||||
static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
|
static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
|
||||||
{
|
{
|
||||||
@@ -767,7 +869,7 @@ static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
|
|||||||
pdev->dev_config_status = USB_CONFIG_SELF_POWERED;
|
pdev->dev_config_status = USB_CONFIG_SELF_POWERED;
|
||||||
#else
|
#else
|
||||||
pdev->dev_config_status = 0U;
|
pdev->dev_config_status = 0U;
|
||||||
#endif
|
#endif /* USBD_SELF_POWERED */
|
||||||
|
|
||||||
if (pdev->dev_remote_wakeup != 0U)
|
if (pdev->dev_remote_wakeup != 0U)
|
||||||
{
|
{
|
||||||
@@ -789,7 +891,7 @@ static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
|
|||||||
* Handle Set device feature request
|
* Handle Set device feature request
|
||||||
* @param pdev: device instance
|
* @param pdev: device instance
|
||||||
* @param req: usb request
|
* @param req: usb request
|
||||||
* @retval status
|
* @retval None
|
||||||
*/
|
*/
|
||||||
static void USBD_SetFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
|
static void USBD_SetFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
|
||||||
{
|
{
|
||||||
@@ -798,6 +900,15 @@ static void USBD_SetFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
|
|||||||
pdev->dev_remote_wakeup = 1U;
|
pdev->dev_remote_wakeup = 1U;
|
||||||
(void)USBD_CtlSendStatus(pdev);
|
(void)USBD_CtlSendStatus(pdev);
|
||||||
}
|
}
|
||||||
|
else if (req->wValue == USB_FEATURE_TEST_MODE)
|
||||||
|
{
|
||||||
|
pdev->dev_test_mode = (uint8_t)(req->wIndex >> 8);
|
||||||
|
(void)USBD_CtlSendStatus(pdev);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
USBD_CtlError(pdev, req);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -806,7 +917,7 @@ static void USBD_SetFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
|
|||||||
* Handle clear device feature request
|
* Handle clear device feature request
|
||||||
* @param pdev: device instance
|
* @param pdev: device instance
|
||||||
* @param req: usb request
|
* @param req: usb request
|
||||||
* @retval status
|
* @retval None
|
||||||
*/
|
*/
|
||||||
static void USBD_ClrFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
|
static void USBD_ClrFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
|
||||||
{
|
{
|
||||||
@@ -832,8 +943,8 @@ static void USBD_ClrFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req)
|
|||||||
/**
|
/**
|
||||||
* @brief USBD_ParseSetupRequest
|
* @brief USBD_ParseSetupRequest
|
||||||
* Copy buffer into setup structure
|
* Copy buffer into setup structure
|
||||||
* @param pdev: device instance
|
|
||||||
* @param req: usb request
|
* @param req: usb request
|
||||||
|
* @param pdata: setup data pointer
|
||||||
* @retval None
|
* @retval None
|
||||||
*/
|
*/
|
||||||
void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata)
|
void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata)
|
||||||
@@ -893,7 +1004,7 @@ void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pdesc = desc;
|
pdesc = desc;
|
||||||
*len = ((uint16_t)USBD_GetLen(pdesc) * 2U) + 2U;
|
*len = MIN(USBD_MAX_STR_DESC_SIZ, ((uint16_t)USBD_GetLen(pdesc) * 2U) + 2U);
|
||||||
|
|
||||||
unicode[idx] = *(uint8_t *)len;
|
unicode[idx] = *(uint8_t *)len;
|
||||||
idx++;
|
idx++;
|
||||||
@@ -945,4 +1056,3 @@ static uint8_t USBD_GetLen(uint8_t *buf)
|
|||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|||||||
@@ -8,13 +8,12 @@
|
|||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @attention
|
* @attention
|
||||||
*
|
*
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
* Copyright (c) 2015 STMicroelectronics.
|
||||||
* All rights reserved.</center></h2>
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
* in the root directory of this software component.
|
||||||
* the License. You may obtain a copy of the License at:
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
*
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
@@ -27,15 +26,15 @@
|
|||||||
/* Private typedef -----------------------------------------------------------*/
|
/* Private typedef -----------------------------------------------------------*/
|
||||||
/* Private define ------------------------------------------------------------*/
|
/* Private define ------------------------------------------------------------*/
|
||||||
#define USBD_VID 0x0483
|
#define USBD_VID 0x0483
|
||||||
#define USBD_PID 0xaaaa /* Replace '0xaaaa' with your device product ID */
|
#define USBD_PID 22336 /* Replace '0xaaaa' with your device product ID */
|
||||||
#define USBD_LANGID_STRING 0xbbb /* Replace '0xbbb' with your device language ID */
|
#define USBD_LANGID_STRING 1033 /* Replace '0xbbb' with your device language ID */
|
||||||
#define USBD_MANUFACTURER_STRING "xxxxx" /* Add your manufacturer string */
|
#define USBD_MANUFACTURER_STRING "STMicroelectronics" /* Add your manufacturer string */
|
||||||
#define USBD_PRODUCT_HS_STRING "xxxxx" /* Add your product High Speed string */
|
#define USBD_PRODUCT_HS_STRING "STM32 Virtual ComPort" /* Add your product High Speed string */
|
||||||
#define USBD_PRODUCT_FS_STRING "xxxxx" /* Add your product Full Speed string */
|
#define USBD_PRODUCT_FS_STRING "STM32 Virtual ComPort" /* Add your product Full Speed string */
|
||||||
#define USBD_CONFIGURATION_HS_STRING "xxxxx" /* Add your configuration High Speed string */
|
#define USBD_CONFIGURATION_HS_STRING "CDC Config" /* Add your configuration High Speed string */
|
||||||
#define USBD_INTERFACE_HS_STRING "xxxxx" /* Add your Interface High Speed string */
|
#define USBD_INTERFACE_HS_STRING "CDC Interface" /* Add your Interface High Speed string */
|
||||||
#define USBD_CONFIGURATION_FS_STRING "xxxxx" /* Add your configuration Full Speed string */
|
#define USBD_CONFIGURATION_FS_STRING "CDC Config" /* Add your configuration Full Speed string */
|
||||||
#define USBD_INTERFACE_FS_STRING "xxxxx" /* Add your Interface Full Speed string */
|
#define USBD_INTERFACE_FS_STRING "CDC Interface" /* Add your Interface Full Speed string */
|
||||||
|
|
||||||
/* Private macro -------------------------------------------------------------*/
|
/* Private macro -------------------------------------------------------------*/
|
||||||
/* Private function prototypes -----------------------------------------------*/
|
/* Private function prototypes -----------------------------------------------*/
|
||||||
@@ -53,7 +52,7 @@ uint8_t *USBD_Class_UserStrDescriptor(USBD_SpeedTypeDef speed, uint8_t idx, uint
|
|||||||
|
|
||||||
#if ((USBD_LPM_ENABLED == 1) || (USBD_CLASS_BOS_ENABLED == 1))
|
#if ((USBD_LPM_ENABLED == 1) || (USBD_CLASS_BOS_ENABLED == 1))
|
||||||
uint8_t *USBD_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
|
uint8_t *USBD_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
|
||||||
#endif
|
#endif /* (USBD_LPM_ENABLED == 1) || (USBD_CLASS_BOS_ENABLED == 1) */
|
||||||
|
|
||||||
/* Private variables ---------------------------------------------------------*/
|
/* Private variables ---------------------------------------------------------*/
|
||||||
USBD_DescriptorsTypeDef Class_Desc =
|
USBD_DescriptorsTypeDef Class_Desc =
|
||||||
@@ -66,18 +65,18 @@ USBD_DescriptorsTypeDef Class_Desc =
|
|||||||
USBD_Class_ConfigStrDescriptor,
|
USBD_Class_ConfigStrDescriptor,
|
||||||
USBD_Class_InterfaceStrDescriptor,
|
USBD_Class_InterfaceStrDescriptor,
|
||||||
#if (USBD_CLASS_USER_STRING_DESC == 1)
|
#if (USBD_CLASS_USER_STRING_DESC == 1)
|
||||||
USBD_CLASS_UserStrDescriptor,
|
USBD_Class_UserStrDescriptor,
|
||||||
#endif
|
#endif /* USB_CLASS_USER_STRING_DESC */
|
||||||
|
|
||||||
#if ((USBD_LPM_ENABLED == 1) || (USBD_CLASS_BOS_ENABLED == 1))
|
#if ((USBD_LPM_ENABLED == 1) || (USBD_CLASS_BOS_ENABLED == 1))
|
||||||
USBD_USR_BOSDescriptor,
|
USBD_USR_BOSDescriptor,
|
||||||
#endif
|
#endif /* (USBD_LPM_ENABLED == 1) || (USBD_CLASS_BOS_ENABLED == 1) */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* USB Standard Device Descriptor */
|
/* USB Standard Device Descriptor */
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
#pragma data_alignment=4
|
#pragma data_alignment=4
|
||||||
#endif
|
#endif /* __ICCARM__ */
|
||||||
__ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
|
__ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
|
||||||
{
|
{
|
||||||
0x12, /* bLength */
|
0x12, /* bLength */
|
||||||
@@ -87,10 +86,10 @@ __ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
|
|||||||
in order to support BOS Desc */
|
in order to support BOS Desc */
|
||||||
#else
|
#else
|
||||||
0x00, /* bcdUSB */
|
0x00, /* bcdUSB */
|
||||||
#endif
|
#endif /* (USBD_LPM_ENABLED == 1) || (USBD_CLASS_BOS_ENABLED == 1) */
|
||||||
0x02,
|
0x02,
|
||||||
0x00, /* bDeviceClass */
|
0x02, /* bDeviceClass */
|
||||||
0x00, /* bDeviceSubClass */
|
0x02, /* bDeviceSubClass */
|
||||||
0x00, /* bDeviceProtocol */
|
0x00, /* bDeviceProtocol */
|
||||||
USB_MAX_EP0_SIZE, /* bMaxPacketSize */
|
USB_MAX_EP0_SIZE, /* bMaxPacketSize */
|
||||||
LOBYTE(USBD_VID), /* idVendor */
|
LOBYTE(USBD_VID), /* idVendor */
|
||||||
@@ -110,7 +109,7 @@ __ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
|
|||||||
#if (USBD_LPM_ENABLED == 1)
|
#if (USBD_LPM_ENABLED == 1)
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
#pragma data_alignment=4
|
#pragma data_alignment=4
|
||||||
#endif
|
#endif /* __ICCARM__ */
|
||||||
__ALIGN_BEGIN uint8_t USBD_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END =
|
__ALIGN_BEGIN uint8_t USBD_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END =
|
||||||
{
|
{
|
||||||
0x5,
|
0x5,
|
||||||
@@ -127,13 +126,13 @@ __ALIGN_BEGIN uint8_t USBD_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END =
|
|||||||
0x0,
|
0x0,
|
||||||
0x0
|
0x0
|
||||||
};
|
};
|
||||||
#endif
|
#endif /* USBD_LPM_ENABLED */
|
||||||
|
|
||||||
/* USB Device Billboard BOS descriptor Template */
|
/* USB Device Billboard BOS descriptor Template */
|
||||||
#if (USBD_CLASS_BOS_ENABLED == 1)
|
#if (USBD_CLASS_BOS_ENABLED == 1)
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
#pragma data_alignment=4
|
#pragma data_alignment=4
|
||||||
#endif
|
#endif /* __ICCARM__ */
|
||||||
__ALIGN_BEGIN uint8_t USBD_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END =
|
__ALIGN_BEGIN uint8_t USBD_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END =
|
||||||
{
|
{
|
||||||
0x05, /* bLength */
|
0x05, /* bLength */
|
||||||
@@ -156,14 +155,16 @@ __ALIGN_BEGIN uint8_t USBD_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END =
|
|||||||
0x34, /* bLength */
|
0x34, /* bLength */
|
||||||
0x10, /* bDescriptorType: DEVICE CAPABILITY Type */
|
0x10, /* bDescriptorType: DEVICE CAPABILITY Type */
|
||||||
0x0D, /* bDevCapabilityType: BILLBOARD_CAPABILITY */
|
0x0D, /* bDevCapabilityType: BILLBOARD_CAPABILITY */
|
||||||
USBD_BB_URL_STRING_INDEX, /* iAddtionalInfoURL: Index of string descriptor providing a URL where the user can go to get more
|
USBD_BB_URL_STRING_INDEX, /* iAddtionalInfoURL: Index of string descriptor providing a URL where the user
|
||||||
detailed information about the product and the various Alternate Modes it supports */
|
can go to get more detailed information about the product and the various
|
||||||
|
Alternate Modes it supports */
|
||||||
|
|
||||||
0x02, /* bNumberOfAlternateModes: Number of Alternate modes supported. The
|
0x02, /* bNumberOfAlternateModes: Number of Alternate modes supported. The
|
||||||
maximum value that this field can be set to is MAX_NUM_ALT_MODE. */
|
maximum value that this field can be set to is MAX_NUM_ALT_MODE. */
|
||||||
|
|
||||||
0x00, /* bPreferredAlternateMode: Index of the preferred Alternate Mode. System
|
0x00, /* bPreferredAlternateMode: Index of the preferred Alternate Mode. System
|
||||||
software may use this information to provide the user with a better user experience. */
|
software may use this information to provide the user with a better
|
||||||
|
user experience. */
|
||||||
|
|
||||||
0x00, 0x00, /* VCONN Power needed by the adapter for full functionality 000b = 1W */
|
0x00, 0x00, /* VCONN Power needed by the adapter for full functionality 000b = 1W */
|
||||||
|
|
||||||
@@ -184,8 +185,8 @@ __ALIGN_BEGIN uint8_t USBD_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END =
|
|||||||
|
|
||||||
0x00, /* bAlternateMode[0] Index of the Alternate Mode within the SVID as
|
0x00, /* bAlternateMode[0] Index of the Alternate Mode within the SVID as
|
||||||
returned in response to a Discover Modes command. Example:
|
returned in response to a Discover Modes command. Example:
|
||||||
0 – first Mode entry
|
0 first Mode entry
|
||||||
1 – second mode entry */
|
1 second mode entry */
|
||||||
|
|
||||||
USBD_BB_ALTMODE0_STRING_INDEX, /* iAlternateModeString[0]: Index of string descriptor describing protocol.
|
USBD_BB_ALTMODE0_STRING_INDEX, /* iAlternateModeString[0]: Index of string descriptor describing protocol.
|
||||||
It is optional to support this string. */
|
It is optional to support this string. */
|
||||||
@@ -195,8 +196,8 @@ __ALIGN_BEGIN uint8_t USBD_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END =
|
|||||||
|
|
||||||
0x01, /* bAlternateMode[1] Index of the Alternate Mode within the SVID as
|
0x01, /* bAlternateMode[1] Index of the Alternate Mode within the SVID as
|
||||||
returned in response to a Discover Modes command. Example:
|
returned in response to a Discover Modes command. Example:
|
||||||
0 – first Mode entry
|
0 first Mode entry
|
||||||
1 – second Mode entry */
|
1 second Mode entry */
|
||||||
|
|
||||||
USBD_BB_ALTMODE1_STRING_INDEX, /* iAlternateModeString[1]: Index of string descriptor describing protocol.
|
USBD_BB_ALTMODE1_STRING_INDEX, /* iAlternateModeString[1]: Index of string descriptor describing protocol.
|
||||||
It is optional to support this string. */
|
It is optional to support this string. */
|
||||||
@@ -206,21 +207,23 @@ __ALIGN_BEGIN uint8_t USBD_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END =
|
|||||||
0x10, /* bDescriptorType: Device Descriptor Type */
|
0x10, /* bDescriptorType: Device Descriptor Type */
|
||||||
0x0F, /* bDevCapabilityType: BILLBOARD ALTERNATE MODE CAPABILITY */
|
0x0F, /* bDevCapabilityType: BILLBOARD ALTERNATE MODE CAPABILITY */
|
||||||
0x00, /* bIndex: Index of Alternate Mode described in the Billboard Capability Desc */
|
0x00, /* bIndex: Index of Alternate Mode described in the Billboard Capability Desc */
|
||||||
0x10, 0x00, 0x00, 0x00, /* dwAlternateModeVdo: contents of the Mode VDO for the alternate mode identified by bIndex */
|
0x10, 0x00, 0x00, 0x00, /* dwAlternateModeVdo: contents of the Mode VDO for the alternate mode
|
||||||
|
identified by bIndex */
|
||||||
|
|
||||||
0x08, /* bLength */
|
0x08, /* bLength */
|
||||||
0x10, /* bDescriptorType: Device Descriptor Type */
|
0x10, /* bDescriptorType: Device Descriptor Type */
|
||||||
0x0F, /* bDevCapabilityType: BILLBOARD ALTERNATE MODE CAPABILITY */
|
0x0F, /* bDevCapabilityType: BILLBOARD ALTERNATE MODE CAPABILITY */
|
||||||
0x01, /* bIndex: Index of Alternate Mode described in the Billboard Capability Desc */
|
0x01, /* bIndex: Index of Alternate Mode described in the Billboard Capability Desc */
|
||||||
0x20, 0x00, 0x00, 0x00, /* dwAlternateModeVdo: contents of the Mode VDO for the alternate mode identified by bIndex */
|
0x20, 0x00, 0x00, 0x00, /* dwAlternateModeVdo: contents of the Mode VDO for the alternate mode
|
||||||
|
identified by bIndex */
|
||||||
};
|
};
|
||||||
#endif
|
#endif /* USBD_CLASS_BOS_ENABLED */
|
||||||
|
|
||||||
|
|
||||||
/* USB Standard Device Descriptor */
|
/* USB Standard Device Descriptor */
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
#pragma data_alignment=4
|
#pragma data_alignment=4
|
||||||
#endif
|
#endif /* __ICCARM__ */
|
||||||
__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END =
|
__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END =
|
||||||
{
|
{
|
||||||
USB_LEN_LANGID_STR_DESC,
|
USB_LEN_LANGID_STR_DESC,
|
||||||
@@ -231,7 +234,7 @@ __ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END =
|
|||||||
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
#pragma data_alignment=4
|
#pragma data_alignment=4
|
||||||
#endif
|
#endif /* __ICCARM__ */
|
||||||
__ALIGN_BEGIN uint8_t USBD_StringSerial[USB_SIZ_STRING_SERIAL] =
|
__ALIGN_BEGIN uint8_t USBD_StringSerial[USB_SIZ_STRING_SERIAL] =
|
||||||
{
|
{
|
||||||
USB_SIZ_STRING_SERIAL,
|
USB_SIZ_STRING_SERIAL,
|
||||||
@@ -240,7 +243,7 @@ __ALIGN_BEGIN uint8_t USBD_StringSerial[USB_SIZ_STRING_SERIAL] =
|
|||||||
|
|
||||||
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
#if defined ( __ICCARM__ ) /*!< IAR Compiler */
|
||||||
#pragma data_alignment=4
|
#pragma data_alignment=4
|
||||||
#endif
|
#endif /* __ICCARM__ */
|
||||||
__ALIGN_BEGIN uint8_t USBD_StrDesc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END;
|
__ALIGN_BEGIN uint8_t USBD_StrDesc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END;
|
||||||
|
|
||||||
/* Private functions ---------------------------------------------------------*/
|
/* Private functions ---------------------------------------------------------*/
|
||||||
@@ -371,7 +374,9 @@ uint8_t *USBD_Class_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *le
|
|||||||
*/
|
*/
|
||||||
static void Get_SerialNum(void)
|
static void Get_SerialNum(void)
|
||||||
{
|
{
|
||||||
uint32_t deviceserial0, deviceserial1, deviceserial2;
|
uint32_t deviceserial0;
|
||||||
|
uint32_t deviceserial1;
|
||||||
|
uint32_t deviceserial2;
|
||||||
|
|
||||||
deviceserial0 = *(uint32_t *)DEVICE_ID1;
|
deviceserial0 = *(uint32_t *)DEVICE_ID1;
|
||||||
deviceserial1 = *(uint32_t *)DEVICE_ID2;
|
deviceserial1 = *(uint32_t *)DEVICE_ID2;
|
||||||
@@ -400,7 +405,7 @@ uint8_t *USBD_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
|
|||||||
*length = sizeof(USBD_BOSDesc);
|
*length = sizeof(USBD_BOSDesc);
|
||||||
return (uint8_t *)USBD_BOSDesc;
|
return (uint8_t *)USBD_BOSDesc;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* (USBD_LPM_ENABLED == 1) || (USBD_CLASS_BOS_ENABLED == 1) */
|
||||||
|
|
||||||
|
|
||||||
#if (USBD_CLASS_USER_STRING_DESC == 1)
|
#if (USBD_CLASS_USER_STRING_DESC == 1)
|
||||||
@@ -417,7 +422,7 @@ uint8_t *USBD_Class_UserStrDescriptor(USBD_SpeedTypeDef speed, uint8_t idx, uint
|
|||||||
|
|
||||||
return USBD_StrDesc;
|
return USBD_StrDesc;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* USBD_CLASS_USER_STRING_DESC */
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -447,5 +452,3 @@ static void IntToUnicode(uint32_t value, uint8_t *pbuf, uint8_t len)
|
|||||||
pbuf[2U * idx + 1] = 0U;
|
pbuf[2U * idx + 1] = 0U;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
@@ -6,13 +6,12 @@
|
|||||||
******************************************************************************
|
******************************************************************************
|
||||||
* @attention
|
* @attention
|
||||||
*
|
*
|
||||||
* <h2><center>© Copyright (c) 2015 STMicroelectronics.
|
* Copyright (c) 2015 STMicroelectronics.
|
||||||
* All rights reserved.</center></h2>
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* This software component is licensed by ST under Ultimate Liberty license
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
* in the root directory of this software component.
|
||||||
* the License. You may obtain a copy of the License at:
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
* www.st.com/SLA0044
|
|
||||||
*
|
*
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
@@ -90,12 +89,13 @@ USBD_StatusTypeDef USBD_CtlSendData(USBD_HandleTypeDef *pdev,
|
|||||||
/* Set EP0 State */
|
/* Set EP0 State */
|
||||||
pdev->ep0_state = USBD_EP0_DATA_IN;
|
pdev->ep0_state = USBD_EP0_DATA_IN;
|
||||||
pdev->ep_in[0].total_length = len;
|
pdev->ep_in[0].total_length = len;
|
||||||
|
pdev->ep_in[0].pbuffer = pbuf;
|
||||||
|
|
||||||
#ifdef USBD_AVOID_PACKET_SPLIT_MPS
|
#ifdef USBD_AVOID_PACKET_SPLIT_MPS
|
||||||
pdev->ep_in[0].rem_length = 0U;
|
pdev->ep_in[0].rem_length = 0U;
|
||||||
#else
|
#else
|
||||||
pdev->ep_in[0].rem_length = len;
|
pdev->ep_in[0].rem_length = len;
|
||||||
#endif
|
#endif /* USBD_AVOID_PACKET_SPLIT_MPS */
|
||||||
|
|
||||||
/* Start the transfer */
|
/* Start the transfer */
|
||||||
(void)USBD_LL_Transmit(pdev, 0x00U, pbuf, len);
|
(void)USBD_LL_Transmit(pdev, 0x00U, pbuf, len);
|
||||||
@@ -134,12 +134,13 @@ USBD_StatusTypeDef USBD_CtlPrepareRx(USBD_HandleTypeDef *pdev,
|
|||||||
/* Set EP0 State */
|
/* Set EP0 State */
|
||||||
pdev->ep0_state = USBD_EP0_DATA_OUT;
|
pdev->ep0_state = USBD_EP0_DATA_OUT;
|
||||||
pdev->ep_out[0].total_length = len;
|
pdev->ep_out[0].total_length = len;
|
||||||
|
pdev->ep_out[0].pbuffer = pbuf;
|
||||||
|
|
||||||
#ifdef USBD_AVOID_PACKET_SPLIT_MPS
|
#ifdef USBD_AVOID_PACKET_SPLIT_MPS
|
||||||
pdev->ep_out[0].rem_length = 0U;
|
pdev->ep_out[0].rem_length = 0U;
|
||||||
#else
|
#else
|
||||||
pdev->ep_out[0].rem_length = len;
|
pdev->ep_out[0].rem_length = len;
|
||||||
#endif
|
#endif /* USBD_AVOID_PACKET_SPLIT_MPS */
|
||||||
|
|
||||||
/* Start the transfer */
|
/* Start the transfer */
|
||||||
(void)USBD_LL_PrepareReceive(pdev, 0U, pbuf, len);
|
(void)USBD_LL_PrepareReceive(pdev, 0U, pbuf, len);
|
||||||
@@ -223,4 +224,3 @@ uint32_t USBD_GetRxCount(USBD_HandleTypeDef *pdev, uint8_t ep_addr)
|
|||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|
|
||||||
|
|||||||
80
LICENSE.md
Normal file
80
LICENSE.md
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
SLA0044 Rev5/February 2018
|
||||||
|
|
||||||
|
## Software license agreement
|
||||||
|
|
||||||
|
### __ULTIMATE LIBERTY SOFTWARE LICENSE AGREEMENT__
|
||||||
|
|
||||||
|
BY INSTALLING, COPYING, DOWNLOADING, ACCESSING OR OTHERWISE USING THIS SOFTWARE
|
||||||
|
OR ANY PART THEREOF (AND THE RELATED DOCUMENTATION) FROM STMICROELECTRONICS
|
||||||
|
INTERNATIONAL N.V, SWISS BRANCH AND/OR ITS AFFILIATED COMPANIES
|
||||||
|
(STMICROELECTRONICS), THE RECIPIENT, ON BEHALF OF HIMSELF OR HERSELF, OR ON
|
||||||
|
BEHALF OF ANY ENTITY BY WHICH SUCH RECIPIENT IS EMPLOYED AND/OR ENGAGED AGREES
|
||||||
|
TO BE BOUND BY THIS SOFTWARE LICENSE AGREEMENT.
|
||||||
|
|
||||||
|
Under STMicroelectronics’ intellectual property rights, the redistribution,
|
||||||
|
reproduction and use in source and binary forms of the software or any part
|
||||||
|
thereof, with or without modification, are permitted provided that the following
|
||||||
|
conditions are met:
|
||||||
|
|
||||||
|
1. Redistribution of source code (modified or not) must retain any copyright
|
||||||
|
notice, this list of conditions and the disclaimer set forth below as items 10
|
||||||
|
and 11.
|
||||||
|
|
||||||
|
2. Redistributions in binary form, except as embedded into microcontroller or
|
||||||
|
microprocessor device manufactured by or for STMicroelectronics or a software
|
||||||
|
update for such device, must reproduce any copyright notice provided with the
|
||||||
|
binary code, this list of conditions, and the disclaimer set forth below as
|
||||||
|
items 10 and 11, in documentation and/or other materials provided with the
|
||||||
|
distribution.
|
||||||
|
|
||||||
|
3. Neither the name of STMicroelectronics nor the names of other contributors to
|
||||||
|
this software may be used to endorse or promote products derived from this
|
||||||
|
software or part thereof without specific written permission.
|
||||||
|
|
||||||
|
4. This software or any part thereof, including modifications and/or derivative
|
||||||
|
works of this software, must be used and execute solely and exclusively on or in
|
||||||
|
combination with a microcontroller or microprocessor device manufactured by or
|
||||||
|
for STMicroelectronics.
|
||||||
|
|
||||||
|
5. No use, reproduction or redistribution of this software partially or totally
|
||||||
|
may be done in any manner that would subject this software to any Open Source
|
||||||
|
Terms. “Open Source Terms” shall mean any open source license which requires as
|
||||||
|
part of distribution of software that the source code of such software is
|
||||||
|
distributed therewith or otherwise made available, or open source license that
|
||||||
|
substantially complies with the Open Source definition specified at
|
||||||
|
www.opensource.org and any other comparable open source license such as for
|
||||||
|
example GNU General Public License (GPL), Eclipse Public License (EPL), Apache
|
||||||
|
Software License, BSD license or MIT license.
|
||||||
|
|
||||||
|
6. STMicroelectronics has no obligation to provide any maintenance, support or
|
||||||
|
updates for the software.
|
||||||
|
|
||||||
|
7. The software is and will remain the exclusive property of STMicroelectronics
|
||||||
|
and its licensors. The recipient will not take any action that jeopardizes
|
||||||
|
STMicroelectronics and its licensors' proprietary rights or acquire any rights
|
||||||
|
in the software, except the limited rights specified hereunder.
|
||||||
|
|
||||||
|
8. The recipient shall comply with all applicable laws and regulations affecting
|
||||||
|
the use of the software or any part thereof including any applicable export
|
||||||
|
control law or regulation.
|
||||||
|
|
||||||
|
9. Redistribution and use of this software or any part thereof other than as
|
||||||
|
permitted under this license is void and will automatically terminate your
|
||||||
|
rights under this license.
|
||||||
|
|
||||||
|
10. THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY RIGHTS, WHICH ARE
|
||||||
|
DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT SHALL
|
||||||
|
STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||||
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||||
|
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
11. EXCEPT AS EXPRESSLY PERMITTED HEREUNDER, NO LICENSE OR OTHER RIGHTS, WHETHER
|
||||||
|
EXPRESS OR IMPLIED, ARE GRANTED UNDER ANY PATENT OR OTHER INTELLECTUAL PROPERTY
|
||||||
|
RIGHTS OF STMICROELECTRONICS OR ANY THIRD PARTY.
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
# Copyright (c) 2015 STMicroelectronics.
|
|
||||||
|
|
||||||
This software component is licensed by ST under Ultimate Liberty license SLA0044, the "License". You may not use this file except in compliance with this license. You may obtain a copy of the license [here](https://www.st.com/SLA0044).
|
|
||||||
32
README.md
32
README.md
@@ -1,29 +1,31 @@
|
|||||||
# Middleware USB Device MCU Component
|
# Middleware USB Device MCU Component
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
**STM32Cube** is an STMicroelectronics original initiative to ease the developers life by reducing efforts, time and cost.
|
**STM32Cube** is an STMicroelectronics original initiative to ease developers' life by reducing efforts, time and cost.
|
||||||
|
|
||||||
**STM32Cube** covers the overall STM32 products portfolio. It includes a comprehensive embedded software platform, delivered for each STM32 series.
|
**STM32Cube** covers the overall STM32 products portfolio. It includes a comprehensive embedded software platform delivered for each STM32 series.
|
||||||
* The CMSIS modules (core and device) corresponding to the ARM(tm) core implemented in this STM32 product.
|
* The CMSIS modules (core and device) corresponding to the ARM(tm) core implemented in this STM32 product.
|
||||||
* The STM32 HAL-LL drivers : an abstraction drivers layer, the API ensuring maximized portability across the STM32 portfolio.
|
* The STM32 HAL-LL drivers, an abstraction layer offering a set of APIs ensuring maximized portability across the STM32 portfolio.
|
||||||
* The BSP Drivers of each evaluation or demonstration board provided by this STM32 series.
|
* The BSP drivers of each evaluation, demonstration or nucleo board provided for this STM32 series.
|
||||||
* A consistent set of middlewares components such as RTOS, USB, FatFS, Graphics, STM32_TouchSensing_Library...
|
* A consistent set of middleware libraries such as RTOS, USB, FatFS, graphics, touch sensing library...
|
||||||
* A full set of software projects (basic examples, applications or demonstrations) for each board provided by this STM32 series.
|
* A full set of software projects (basic examples, applications, and demonstrations) for each board provided for this STM32 series.
|
||||||
|
|
||||||
Two models of publication are proposed for the STM32Cube embedded software:
|
Two models of publication are proposed for the STM32Cube embedded software:
|
||||||
* The monolithic **MCU Package** : all STM32Cube software modules of one STM32 series are present (Drivers, Middlewares, Projects, Utilities) in the repo (usual name **STM32Cubexx**, xx corresponding to the STM32 series).
|
* The monolithic **MCU Package**: all STM32Cube software modules of one STM32 series are present (Drivers, Middleware, Projects, Utilities) in the repository (usual name **STM32Cubexx**, xx corresponding to the STM32 series).
|
||||||
* The **MCU component** : progressively from November 2019, each STM32Cube software module being part of the STM32Cube MCU Package, will be delivered as an individual repo, allowing the user to select and get only the required software functions.
|
* The **MCU component**: each STM32Cube software module being part of the STM32Cube MCU Package, is delivered as an individual repository, allowing the user to select and get only the required software functions.
|
||||||
|
|
||||||
## Description
|
## Description
|
||||||
|
|
||||||
This **stm32_mw_usb_device** MCU component repository is one element **common to all** STM32Cube MCU embedded software packages, providing the **USB Device MCU Middleware** part.
|
This **stm32_mw_usb_device** MCU component repository is one element **common to all** STM32Cube MCU embedded software packages, providing the **USB Device MCU Middleware** part.
|
||||||
|
|
||||||
## License
|
It represents ST offer to ensure the support of USB Devices on STM32 MCUs.
|
||||||
|
It includes two main modules:
|
||||||
Copyright (c) 2015 STMicroelectronics.
|
* **Core** module for the USB device standard peripheral control APIs. It includes the files ensuring USB 2.0 standard code implementation for an USB device.
|
||||||
|
These files’ APIs will be called within every USB device application regardless of the desired functionality.
|
||||||
This software component is licensed by ST under Ultimate Liberty license SLA0044, the "License". You may not use this file except in compliance with this license. You may obtain a copy of the license [here](https://www.st.com/SLA0044).
|
* **Class** module for the commonly supported classes APIs. it includes the files including different USB device classes. All STM32 USB classes are implemented according to the USB 2.0 and every class’s specifications. These files’ APIs will be called within USB device applications according to the desired functionality.
|
||||||
|
|
||||||
## Release note
|
## Release note
|
||||||
|
|
||||||
@@ -31,6 +33,4 @@ Details about the content of this release are available in the release note [her
|
|||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
If you have any issue with the **software content** of this repository, you can file an issue [here](https://github.com/STMicroelectronics/stm32_mw_usb_device/issues/new/choose).
|
Please refer to the [CONTRIBUTING.md](CONTRIBUTING.md) guide.
|
||||||
|
|
||||||
For any other question related to the product, the tools, the environment, you can submit a topic to the [ST Community](https://community.st.com/s/).
|
|
||||||
2678
Release_Notes.html
2678
Release_Notes.html
File diff suppressed because it is too large
Load Diff
BIN
_htmresc/favicon.png
Normal file
BIN
_htmresc/favicon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.0 KiB |
1711
_htmresc/mini-st.css
Normal file
1711
_htmresc/mini-st.css
Normal file
File diff suppressed because it is too large
Load Diff
BIN
_htmresc/st_logo_2020.png
Normal file
BIN
_htmresc/st_logo_2020.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 7.3 KiB |
Reference in New Issue
Block a user