* 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****/
 |