| /* 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) 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 | |
| * | |
| ****************************************************************************** | |
| */ | |
| /* USER CODE END Header */ | |
| /* Includes ------------------------------------------------------------------*/ | |
| #include "usbd_core.h" | |
| #include "usbd_desc.h" | |
| #include "usbd_conf.h" | |
| /* USER CODE BEGIN INCLUDE */ | |
| #include "USBManager.h" | |
| extern USBManager g_usbManager; | |
| /* 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_MSC_PID_HS 22314 | |
| #define USBD_MSC_PRODUCT_STRING_HS "32Blit Mass Storage" | |
| #define USBD_MSC_CONFIGURATION_STRING_HS "MSC Config" | |
| #define USBD_MSC_INTERFACE_STRING_HS "MSC Interface" | |
| #define USBD_CDC_PID_HS 22336 | |
| #define USBD_CDC_PRODUCT_STRING_HS "32Blit CDC" | |
| #define USBD_CDC_CONFIGURATION_STRING_HS "CDC Config" | |
| #define USBD_CDC_INTERFACE_STRING_HS "CDC 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 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_MSC_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_MSC_PID_HS), /*idProduct*/ | |
| HIBYTE(USBD_MSC_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*/ | |
| }; | |
| __ALIGN_BEGIN uint8_t USBD_CDC_HS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = | |
| { | |
| 0x12, /*bLength */ | |
| USB_DESC_TYPE_DEVICE, /*bDescriptorType*/ | |
| 0x00, /*bcdUSB */ | |
| 0x02, | |
| 0x02, /*bDeviceClass*/ | |
| 0x02, /*bDeviceSubClass*/ | |
| 0x00, /*bDeviceProtocol*/ | |
| USB_MAX_EP0_SIZE, /*bMaxPacketSize*/ | |
| LOBYTE(USBD_VID), /*idVendor*/ | |
| HIBYTE(USBD_VID), /*idVendor*/ | |
| LOBYTE(USBD_CDC_PID_HS), /*idProduct*/ | |
| HIBYTE(USBD_CDC_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); | |
| if(g_usbManager.GetType() == USBManager::usbtMSC) | |
| { | |
| *length = sizeof(USBD_MSC_HS_DeviceDesc); | |
| return USBD_MSC_HS_DeviceDesc; | |
| } | |
| else | |
| { | |
| *length = sizeof(USBD_CDC_HS_DeviceDesc); | |
| return USBD_CDC_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(g_usbManager.GetType() == USBManager::usbtMSC) | |
| { | |
| USBD_GetString((uint8_t *)USBD_MSC_PRODUCT_STRING_HS, USBD_StrDesc, length); | |
| } | |
| else | |
| { | |
| USBD_GetString((uint8_t *)USBD_CDC_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(g_usbManager.GetType() == USBManager::usbtMSC) | |
| { | |
| USBD_GetString((uint8_t *)USBD_MSC_CONFIGURATION_STRING_HS, USBD_StrDesc, length); | |
| } | |
| else | |
| { | |
| USBD_GetString((uint8_t *)USBD_CDC_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(g_usbManager.GetType() == USBManager::usbtMSC) | |
| { | |
| USBD_GetString((uint8_t *)USBD_MSC_INTERFACE_STRING_HS, USBD_StrDesc, length); | |
| } | |
| else | |
| { | |
| USBD_GetString((uint8_t *)USBD_CDC_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 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****/ |