| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595 | /* USER CODE BEGIN Header *//**  ******************************************************************************  * @file           : usbd_desc.c  * @version        : v1.0_Cube  * @brief          : This file implements the USB device descriptors.  ******************************************************************************  * @attention  *  * <h2><center>© Copyright (c) 2021 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  *  ******************************************************************************  *//* USER CODE END Header *//* Includes ------------------------------------------------------------------*/#include "usbd_core.h"#include "usbd_desc.h"#include "usbd_conf.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  * @{  *//** @addtogroup USBD_DESC  * @{  *//** @defgroup USBD_DESC_Private_TypesDefinitions USBD_DESC_Private_TypesDefinitions  * @brief Private types.  * @{  *//* USER CODE BEGIN PRIVATE_TYPES *//* USER CODE END PRIVATE_TYPES *//**  * @}  *//** @defgroup USBD_DESC_Private_Defines USBD_DESC_Private_Defines  * @brief Private defines.  * @{  */#define USBD_VID     1155#define USBD_LANGID_STRING     1033#define USBD_MANUFACTURER_STRING     "STMicroelectronics"#define USBD_PID_HS     22314#define USBD_PRODUCT_STRING_HS     "STM32 Mass Storage"#define USBD_CONFIGURATION_STRING_HS     "MSC Config"#define USBD_INTERFACE_STRING_HS     "MSC Interface"#define USBD_PID_FS     22314#define USBD_PRODUCT_STRING_FS     "STM32 Mass Storage"#define USBD_CONFIGURATION_STRING_FS     "MSC Config"#define USBD_INTERFACE_STRING_FS     "MSC Interface"/* USER CODE BEGIN PRIVATE_DEFINES *//* USER CODE END PRIVATE_DEFINES *//**  * @}  *//* USER CODE BEGIN 0 *//* USER CODE END 0 *//** @defgroup USBD_DESC_Private_Macros USBD_DESC_Private_Macros  * @brief Private macros.  * @{  *//* USER CODE BEGIN PRIVATE_MACRO *//* USER CODE END PRIVATE_MACRO *//**  * @}  */  /** @defgroup USBD_DESC_Private_FunctionPrototypes USBD_DESC_Private_FunctionPrototypes  * @brief Private functions declaration.  * @{  */  static void Get_SerialNum(void);static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len);  /**  * @}  */    /** @defgroup USBD_DESC_Private_FunctionPrototypes USBD_DESC_Private_FunctionPrototypes  * @brief Private functions declaration for FS.  * @{  */uint8_t * USBD_FS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);uint8_t * USBD_FS_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);uint8_t * USBD_FS_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);/**  * @}  *//** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables  * @brief Private variables.  * @{  */USBD_DescriptorsTypeDef FS_Desc ={  USBD_FS_DeviceDescriptor, USBD_FS_LangIDStrDescriptor, USBD_FS_ManufacturerStrDescriptor, USBD_FS_ProductStrDescriptor, USBD_FS_SerialStrDescriptor, USBD_FS_ConfigStrDescriptor, USBD_FS_InterfaceStrDescriptor};#if defined ( __ICCARM__ ) /* IAR Compiler */  #pragma data_alignment=4#endif /* defined ( __ICCARM__ ) *//** USB standard device descriptor. */__ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END ={  0x12,                       /*bLength */  USB_DESC_TYPE_DEVICE,       /*bDescriptorType*/  0x00,                       /*bcdUSB */  0x02,  0x00,                       /*bDeviceClass*/  0x00,                       /*bDeviceSubClass*/  0x00,                       /*bDeviceProtocol*/  USB_MAX_EP0_SIZE,           /*bMaxPacketSize*/  LOBYTE(USBD_VID),           /*idVendor*/  HIBYTE(USBD_VID),           /*idVendor*/  LOBYTE(USBD_PID_FS),        /*idProduct*/  HIBYTE(USBD_PID_FS),        /*idProduct*/  0x00,                       /*bcdDevice rel. 2.00*/  0x02,  USBD_IDX_MFC_STR,           /*Index of manufacturer  string*/  USBD_IDX_PRODUCT_STR,       /*Index of product string*/  USBD_IDX_SERIAL_STR,        /*Index of serial number string*/  USBD_MAX_NUM_CONFIGURATION  /*bNumConfigurations*/};/* USB_DeviceDescriptor *//**  * @}  *//** @defgroup USBD_DESC_Private_FunctionPrototypes USBD_DESC_Private_FunctionPrototypes  * @brief Private functions declaration for HS.  * @{  */uint8_t * USBD_HS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);uint8_t * USBD_HS_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);uint8_t * USBD_HS_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);uint8_t * USBD_HS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);uint8_t * USBD_HS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);uint8_t * USBD_HS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);uint8_t * USBD_HS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);/**  * @}  *//** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables  * @brief Private variables.  * @{  */USBD_DescriptorsTypeDef HS_Desc ={  USBD_HS_DeviceDescriptor, USBD_HS_LangIDStrDescriptor, USBD_HS_ManufacturerStrDescriptor, USBD_HS_ProductStrDescriptor, USBD_HS_SerialStrDescriptor, USBD_HS_ConfigStrDescriptor, USBD_HS_InterfaceStrDescriptor};#if defined ( __ICCARM__ ) /* IAR Compiler */  #pragma data_alignment=4#endif /* defined ( __ICCARM__ ) *//** USB standard device descriptor. */__ALIGN_BEGIN uint8_t USBD_HS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END ={  0x12,                       /*bLength */  USB_DESC_TYPE_DEVICE,       /*bDescriptorType*/  0x00,                       /*bcdUSB */  0x02,  0x00,                       /*bDeviceClass*/  0x00,                       /*bDeviceSubClass*/  0x00,                       /*bDeviceProtocol*/  USB_MAX_EP0_SIZE,           /*bMaxPacketSize*/  LOBYTE(USBD_VID),           /*idVendor*/  HIBYTE(USBD_VID),           /*idVendor*/  LOBYTE(USBD_PID_HS),        /*idProduct*/  HIBYTE(USBD_PID_HS),        /*idProduct*/  0x00,                       /*bcdDevice rel. 2.00*/  0x02,  USBD_IDX_MFC_STR,           /*Index of manufacturer  string*/  USBD_IDX_PRODUCT_STR,       /*Index of product string*/  USBD_IDX_SERIAL_STR,        /*Index of serial number string*/  USBD_MAX_NUM_CONFIGURATION  /*bNumConfigurations*/};/**  * @}  *//** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables  * @brief Private variables.  * @{  */#if defined ( __ICCARM__ ) /* IAR Compiler */  #pragma data_alignment=4#endif /* defined ( __ICCARM__ ) *//** USB lang indentifier descriptor. */__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END ={     USB_LEN_LANGID_STR_DESC,     USB_DESC_TYPE_STRING,     LOBYTE(USBD_LANGID_STRING),     HIBYTE(USBD_LANGID_STRING)};#if defined ( __ICCARM__ ) /* IAR Compiler */  #pragma data_alignment=4#endif /* defined ( __ICCARM__ ) *//* Internal string descriptor. */__ALIGN_BEGIN uint8_t USBD_StrDesc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END;#if defined ( __ICCARM__ ) /*!< IAR Compiler */  #pragma data_alignment=4   #endif__ALIGN_BEGIN uint8_t USBD_StringSerial[USB_SIZ_STRING_SERIAL] __ALIGN_END = {  USB_SIZ_STRING_SERIAL,  USB_DESC_TYPE_STRING,};/**  * @}  *//** @defgroup USBD_DESC_Private_Functions USBD_DESC_Private_Functions  * @brief Private functions.  * @{  *//**  * @brief  Return the device descriptor  * @param  speed : Current device speed  * @param  length : Pointer to data length variable  * @retval Pointer to descriptor buffer  */uint8_t * USBD_HS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length){  UNUSED(speed);  *length = sizeof(USBD_HS_DeviceDesc);  return USBD_HS_DeviceDesc;}/**  * @brief  Return the LangID string descriptor  * @param  speed : Current device speed  * @param  length : Pointer to data length variable  * @retval Pointer to descriptor buffer  */uint8_t * USBD_HS_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length){  UNUSED(speed);  *length = sizeof(USBD_LangIDDesc);  return USBD_LangIDDesc;}/**  * @brief  Return the product string descriptor  * @param  speed : current device speed  * @param  length : pointer to data length variable  * @retval pointer to descriptor buffer  */uint8_t * USBD_HS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length){  if(speed == 0)  {    USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_HS, USBD_StrDesc, length);  }  else  {    USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_HS, USBD_StrDesc, length);  }  return USBD_StrDesc;}/**  * @brief  Return the manufacturer string descriptor  * @param  speed : Current device speed  * @param  length : Pointer to data length variable  * @retval Pointer to descriptor buffer  */uint8_t * USBD_HS_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length){  UNUSED(speed);  USBD_GetString((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length);  return USBD_StrDesc;}/**  * @brief  Return the serial number string descriptor  * @param  speed : Current device speed  * @param  length : Pointer to data length variable  * @retval Pointer to descriptor buffer  */uint8_t * USBD_HS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length){  UNUSED(speed);  *length = USB_SIZ_STRING_SERIAL;  /* Update the serial number string descriptor with the data from the unique   * ID */  Get_SerialNum();  /* USER CODE BEGIN USBD_HS_SerialStrDescriptor */    /* USER CODE END USBD_HS_SerialStrDescriptor */  return (uint8_t *) USBD_StringSerial;}/**  * @brief  Return the configuration string descriptor  * @param  speed : Current device speed  * @param  length : Pointer to data length variable  * @retval Pointer to descriptor buffer  */uint8_t * USBD_HS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length){  if(speed == USBD_SPEED_HIGH)  {    USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_HS, USBD_StrDesc, length);  }  else  {    USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_HS, USBD_StrDesc, length);  }  return USBD_StrDesc;}/**  * @brief  Return the interface string descriptor  * @param  speed : Current device speed  * @param  length : Pointer to data length variable  * @retval Pointer to descriptor buffer  */uint8_t * USBD_HS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length){  if(speed == 0)  {    USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_HS, USBD_StrDesc, length);  }  else  {    USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_HS, USBD_StrDesc, length);  }  return USBD_StrDesc;}#if (USBD_LPM_ENABLED == 1)/**  * @brief  Return the BOS descriptor  * @param  speed : Current device speed  * @param  length : Pointer to data length variable  * @retval Pointer to descriptor buffer  */uint8_t * USBD_HS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length){  UNUSED(speed);  *length = sizeof(USBD_HS_BOSDesc);  return (uint8_t*)USBD_HS_BOSDesc;}#endif /* (USBD_LPM_ENABLED == 1) *//**  * @brief  Return the device descriptor  * @param  speed : Current device speed  * @param  length : Pointer to data length variable  * @retval Pointer to descriptor buffer  */uint8_t * USBD_FS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length){  UNUSED(speed);  *length = sizeof(USBD_FS_DeviceDesc);  return USBD_FS_DeviceDesc;}/**  * @brief  Return the LangID string descriptor  * @param  speed : Current device speed  * @param  length : Pointer to data length variable  * @retval Pointer to descriptor buffer  */uint8_t * USBD_FS_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length){  UNUSED(speed);  *length = sizeof(USBD_LangIDDesc);  return USBD_LangIDDesc;}/**  * @brief  Return the product string descriptor  * @param  speed : Current device speed  * @param  length : Pointer to data length variable  * @retval Pointer to descriptor buffer  */uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length){  if(speed == 0)  {    USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_FS, USBD_StrDesc, length);  }  else  {    USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_FS, USBD_StrDesc, length);  }  return USBD_StrDesc;}/**  * @brief  Return the manufacturer string descriptor  * @param  speed : Current device speed  * @param  length : Pointer to data length variable  * @retval Pointer to descriptor buffer  */uint8_t * USBD_FS_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length){  UNUSED(speed);  USBD_GetString((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length);  return USBD_StrDesc;}/**  * @brief  Return the serial number string descriptor  * @param  speed : Current device speed  * @param  length : Pointer to data length variable  * @retval Pointer to descriptor buffer  */uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length){  UNUSED(speed);  *length = USB_SIZ_STRING_SERIAL;  /* Update the serial number string descriptor with the data from the unique   * ID */  Get_SerialNum();  /* USER CODE BEGIN USBD_FS_SerialStrDescriptor */    /* USER CODE END USBD_FS_SerialStrDescriptor */  return (uint8_t *) USBD_StringSerial;}/**  * @brief  Return the configuration string descriptor  * @param  speed : Current device speed  * @param  length : Pointer to data length variable  * @retval Pointer to descriptor buffer  */uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length){  if(speed == USBD_SPEED_HIGH)  {    USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length);  }  else  {    USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length);  }  return USBD_StrDesc;}/**  * @brief  Return the interface string descriptor  * @param  speed : Current device speed  * @param  length : Pointer to data length variable  * @retval Pointer to descriptor buffer  */uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length){  if(speed == 0)  {    USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_FS, USBD_StrDesc, length);  }  else  {    USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_FS, USBD_StrDesc, length);  }  return USBD_StrDesc;}/**  * @brief  Create the serial number string descriptor   * @param  None   * @retval None  */static void Get_SerialNum(void){  uint32_t deviceserial0, deviceserial1, deviceserial2;  deviceserial0 = *(uint32_t *) DEVICE_ID1;  deviceserial1 = *(uint32_t *) DEVICE_ID2;  deviceserial2 = *(uint32_t *) DEVICE_ID3;  deviceserial0 += deviceserial2;  if (deviceserial0 != 0)  {    IntToUnicode(deviceserial0, &USBD_StringSerial[2], 8);    IntToUnicode(deviceserial1, &USBD_StringSerial[18], 4);  }}/**  * @brief  Convert Hex 32Bits value into char   * @param  value: value to convert  * @param  pbuf: pointer to the buffer   * @param  len: buffer length  * @retval None  */static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len){  uint8_t idx = 0;  for (idx = 0; idx < len; idx++)  {    if (((value >> 28)) < 0xA)    {      pbuf[2 * idx] = (value >> 28) + '0';    }    else    {      pbuf[2 * idx] = (value >> 28) + 'A' - 10;    }    value = value << 4;    pbuf[2 * idx + 1] = 0;  }}/**  * @}  *//**  * @}  *//**  * @}  *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 |