 5fc533385b
			
		
	
	
		5fc533385b
		
			
		
	
	
	
	
		
			
			* USB CDC descriptor: join product name from two strings * add f5 support * USB CDC descriptor: use constant device name across all device * BLE: use device name in advertising and model * BLE: truncate device name Co-authored-by: あく <alleteam@gmail.com>
		
			
				
	
	
		
			392 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			392 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* USER CODE BEGIN Header */
 | |
| /**
 | |
|   ******************************************************************************
 | |
|   * @file           : usbd_desc.c
 | |
|   * @version        : v3.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"
 | |
| #include "api-hal-version.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     "Flipper Devices Inc."
 | |
| #define USBD_PID     22336
 | |
| #define USBD_CONFIGURATION_STRING     "CDC Config"
 | |
| #define USBD_INTERFACE_STRING     "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.
 | |
|   * @{
 | |
|   */
 | |
| 
 | |
| uint8_t * USBD_CDC_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | |
| uint8_t * USBD_CDC_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | |
| uint8_t * USBD_CDC_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | |
| uint8_t * USBD_CDC_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | |
| uint8_t * USBD_CDC_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | |
| uint8_t * USBD_CDC_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | |
| uint8_t * USBD_CDC_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | |
| 
 | |
| /**
 | |
|   * @}
 | |
|   */
 | |
| 
 | |
| /** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables
 | |
|   * @brief Private variables.
 | |
|   * @{
 | |
|   */
 | |
| 
 | |
| USBD_DescriptorsTypeDef CDC_Desc =
 | |
| {
 | |
|   USBD_CDC_DeviceDescriptor,
 | |
|   USBD_CDC_LangIDStrDescriptor,
 | |
|   USBD_CDC_ManufacturerStrDescriptor,
 | |
|   USBD_CDC_ProductStrDescriptor,
 | |
|   USBD_CDC_SerialStrDescriptor,
 | |
|   USBD_CDC_ConfigStrDescriptor,
 | |
|   USBD_CDC_InterfaceStrDescriptor
 | |
| };
 | |
| 
 | |
| #if defined ( __ICCARM__ ) /* IAR Compiler */
 | |
|   #pragma data_alignment=4
 | |
| #endif /* defined ( __ICCARM__ ) */
 | |
| /** USB standard device descriptor. */
 | |
| __ALIGN_BEGIN uint8_t USBD_CDC_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_PID),           /*idProduct*/
 | |
|   HIBYTE(USBD_PID),           /*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_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_CDC_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
 | |
| {
 | |
|   UNUSED(speed);
 | |
|   *length = sizeof(USBD_CDC_DeviceDesc);
 | |
|   return USBD_CDC_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_CDC_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_CDC_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
 | |
| {
 | |
|   USBD_GetString((uint8_t*)api_hal_version_get_device_name_ptr(), 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_CDC_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_CDC_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 */
 | |
|   if(api_hal_version_get_name_ptr()){
 | |
|     char buffer[14] = "flip_";
 | |
|     strncat(buffer, api_hal_version_get_name_ptr(), 8);
 | |
|     USBD_GetString((uint8_t*) buffer, USBD_StringSerial, length);
 | |
|   } else {
 | |
|     Get_SerialNum();
 | |
|   }
 | |
|   /* USER CODE BEGIN USBD_CDC_SerialStrDescriptor */
 | |
| 
 | |
|   /* USER CODE END USBD_CDC_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_CDC_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
 | |
| {
 | |
|   if(speed == USBD_SPEED_HIGH)
 | |
|   {
 | |
|     USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING, USBD_StrDesc, length);
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING, 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_CDC_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
 | |
| {
 | |
|   if(speed == 0)
 | |
|   {
 | |
|     USBD_GetString((uint8_t *)USBD_INTERFACE_STRING, USBD_StrDesc, length);
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     USBD_GetString((uint8_t *)USBD_INTERFACE_STRING, 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****/
 |