Subversion Repositories dashGPS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /* USER CODE BEGIN Header */
  2. /**
  3.   ******************************************************************************
  4.   * @file           : App/usbd_desc.c
  5.   * @version        : v2.0_Cube
  6.   * @brief          : This file implements the USB device descriptors.
  7.   ******************************************************************************
  8.   * @attention
  9.   *
  10.   * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  11.   * All rights reserved.</center></h2>
  12.   *
  13.   * This software component is licensed by ST under Ultimate Liberty license
  14.   * SLA0044, the "License"; You may not use this file except in compliance with
  15.   * the License. You may obtain a copy of the License at:
  16.   *                             www.st.com/SLA0044
  17.   *
  18.   ******************************************************************************
  19.   */
  20. /* USER CODE END Header */
  21.  
  22. /* Includes ------------------------------------------------------------------*/
  23. #include "usbd_core.h"
  24. #include "usbd_desc.h"
  25. #include "usbd_conf.h"
  26.  
  27. /* USER CODE BEGIN INCLUDE */
  28.  
  29. /* USER CODE END INCLUDE */
  30.  
  31. /* Private typedef -----------------------------------------------------------*/
  32. /* Private define ------------------------------------------------------------*/
  33. /* Private macro -------------------------------------------------------------*/
  34.  
  35. /* USER CODE BEGIN PV */
  36. /* Private variables ---------------------------------------------------------*/
  37.  
  38. /* USER CODE END PV */
  39.  
  40. /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY
  41.   * @{
  42.   */
  43.  
  44. /** @addtogroup USBD_DESC
  45.   * @{
  46.   */
  47.  
  48. /** @defgroup USBD_DESC_Private_TypesDefinitions USBD_DESC_Private_TypesDefinitions
  49.   * @brief Private types.
  50.   * @{
  51.   */
  52.  
  53. /* USER CODE BEGIN PRIVATE_TYPES */
  54.  
  55. /* USER CODE END PRIVATE_TYPES */
  56.  
  57. /**
  58.   * @}
  59.   */
  60.  
  61. /** @defgroup USBD_DESC_Private_Defines USBD_DESC_Private_Defines
  62.   * @brief Private defines.
  63.   * @{
  64.   */
  65.  
  66. #define USBD_VID     1155
  67. #define USBD_LANGID_STRING     1033
  68. #define USBD_MANUFACTURER_STRING     "STMicroelectronics"
  69. #define USBD_PID_FS     22336
  70. #define USBD_PRODUCT_STRING_FS     "STM32 Virtual ComPort"
  71. #define USBD_CONFIGURATION_STRING_FS     "CDC Config"
  72. #define USBD_INTERFACE_STRING_FS     "CDC Interface"
  73.  
  74. /* USER CODE BEGIN PRIVATE_DEFINES */
  75.  
  76. /* USER CODE END PRIVATE_DEFINES */
  77.  
  78. /**
  79.   * @}
  80.   */
  81.  
  82. /* USER CODE BEGIN 0 */
  83.  
  84. /* USER CODE END 0 */
  85.  
  86. /** @defgroup USBD_DESC_Private_Macros USBD_DESC_Private_Macros
  87.   * @brief Private macros.
  88.   * @{
  89.   */
  90.  
  91. /* USER CODE BEGIN PRIVATE_MACRO */
  92.  
  93. /* USER CODE END PRIVATE_MACRO */
  94.  
  95. /**
  96.   * @}
  97.   */
  98.  
  99. /** @defgroup USBD_DESC_Private_FunctionPrototypes USBD_DESC_Private_FunctionPrototypes
  100.   * @brief Private functions declaration.
  101.   * @{
  102.   */
  103.  
  104. static void Get_SerialNum(void);
  105. static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len);
  106.  
  107. /**
  108.   * @}
  109.   */
  110.  
  111. /** @defgroup USBD_DESC_Private_FunctionPrototypes USBD_DESC_Private_FunctionPrototypes
  112.   * @brief Private functions declaration for FS.
  113.   * @{
  114.   */
  115.  
  116. uint8_t * USBD_FS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  117. uint8_t * USBD_FS_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  118. uint8_t * USBD_FS_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  119. uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  120. uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  121. uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  122. uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  123.  
  124. /**
  125.   * @}
  126.   */
  127.  
  128. /** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables
  129.   * @brief Private variables.
  130.   * @{
  131.   */
  132.  
  133. USBD_DescriptorsTypeDef FS_Desc =
  134. {
  135.   USBD_FS_DeviceDescriptor
  136. , USBD_FS_LangIDStrDescriptor
  137. , USBD_FS_ManufacturerStrDescriptor
  138. , USBD_FS_ProductStrDescriptor
  139. , USBD_FS_SerialStrDescriptor
  140. , USBD_FS_ConfigStrDescriptor
  141. , USBD_FS_InterfaceStrDescriptor
  142. };
  143.  
  144. #if defined ( __ICCARM__ ) /* IAR Compiler */
  145.   #pragma data_alignment=4
  146. #endif /* defined ( __ICCARM__ ) */
  147. /** USB standard device descriptor. */
  148. __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
  149. {
  150.   0x12,                       /*bLength */
  151.   USB_DESC_TYPE_DEVICE,       /*bDescriptorType*/
  152.   0x00,                       /*bcdUSB */
  153.   0x02,
  154.   0x02,                       /*bDeviceClass*/
  155.   0x02,                       /*bDeviceSubClass*/
  156.   0x00,                       /*bDeviceProtocol*/
  157.   USB_MAX_EP0_SIZE,           /*bMaxPacketSize*/
  158.   LOBYTE(USBD_VID),           /*idVendor*/
  159.   HIBYTE(USBD_VID),           /*idVendor*/
  160.   LOBYTE(USBD_PID_FS),        /*idProduct*/
  161.   HIBYTE(USBD_PID_FS),        /*idProduct*/
  162.   0x00,                       /*bcdDevice rel. 2.00*/
  163.   0x02,
  164.   USBD_IDX_MFC_STR,           /*Index of manufacturer  string*/
  165.   USBD_IDX_PRODUCT_STR,       /*Index of product string*/
  166.   USBD_IDX_SERIAL_STR,        /*Index of serial number string*/
  167.   USBD_MAX_NUM_CONFIGURATION  /*bNumConfigurations*/
  168. };
  169.  
  170. /* USB_DeviceDescriptor */
  171.  
  172. /**
  173.   * @}
  174.   */
  175.  
  176. /** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables
  177.   * @brief Private variables.
  178.   * @{
  179.   */
  180.  
  181. #if defined ( __ICCARM__ ) /* IAR Compiler */
  182.   #pragma data_alignment=4
  183. #endif /* defined ( __ICCARM__ ) */
  184.  
  185. /** USB lang indentifier descriptor. */
  186. __ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END =
  187. {
  188.      USB_LEN_LANGID_STR_DESC,
  189.      USB_DESC_TYPE_STRING,
  190.      LOBYTE(USBD_LANGID_STRING),
  191.      HIBYTE(USBD_LANGID_STRING)
  192. };
  193.  
  194. #if defined ( __ICCARM__ ) /* IAR Compiler */
  195.   #pragma data_alignment=4
  196. #endif /* defined ( __ICCARM__ ) */
  197. /* Internal string descriptor. */
  198. __ALIGN_BEGIN uint8_t USBD_StrDesc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END;
  199.  
  200. #if defined ( __ICCARM__ ) /*!< IAR Compiler */
  201.   #pragma data_alignment=4
  202. #endif
  203. __ALIGN_BEGIN uint8_t USBD_StringSerial[USB_SIZ_STRING_SERIAL] __ALIGN_END = {
  204.   USB_SIZ_STRING_SERIAL,
  205.   USB_DESC_TYPE_STRING,
  206. };
  207.  
  208. /**
  209.   * @}
  210.   */
  211.  
  212. /** @defgroup USBD_DESC_Private_Functions USBD_DESC_Private_Functions
  213.   * @brief Private functions.
  214.   * @{
  215.   */
  216.  
  217. /**
  218.   * @brief  Return the device descriptor
  219.   * @param  speed : Current device speed
  220.   * @param  length : Pointer to data length variable
  221.   * @retval Pointer to descriptor buffer
  222.   */
  223. uint8_t * USBD_FS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
  224. {
  225.   UNUSED(speed);
  226.   *length = sizeof(USBD_FS_DeviceDesc);
  227.   return USBD_FS_DeviceDesc;
  228. }
  229.  
  230. /**
  231.   * @brief  Return the LangID string descriptor
  232.   * @param  speed : Current device speed
  233.   * @param  length : Pointer to data length variable
  234.   * @retval Pointer to descriptor buffer
  235.   */
  236. uint8_t * USBD_FS_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
  237. {
  238.   UNUSED(speed);
  239.   *length = sizeof(USBD_LangIDDesc);
  240.   return USBD_LangIDDesc;
  241. }
  242.  
  243. /**
  244.   * @brief  Return the product string descriptor
  245.   * @param  speed : Current device speed
  246.   * @param  length : Pointer to data length variable
  247.   * @retval Pointer to descriptor buffer
  248.   */
  249. uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
  250. {
  251.   if(speed == 0)
  252.   {
  253.     USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_FS, USBD_StrDesc, length);
  254.   }
  255.   else
  256.   {
  257.     USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_FS, USBD_StrDesc, length);
  258.   }
  259.   return USBD_StrDesc;
  260. }
  261.  
  262. /**
  263.   * @brief  Return the manufacturer string descriptor
  264.   * @param  speed : Current device speed
  265.   * @param  length : Pointer to data length variable
  266.   * @retval Pointer to descriptor buffer
  267.   */
  268. uint8_t * USBD_FS_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
  269. {
  270.   UNUSED(speed);
  271.   USBD_GetString((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length);
  272.   return USBD_StrDesc;
  273. }
  274.  
  275. /**
  276.   * @brief  Return the serial number string descriptor
  277.   * @param  speed : Current device speed
  278.   * @param  length : Pointer to data length variable
  279.   * @retval Pointer to descriptor buffer
  280.   */
  281. uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
  282. {
  283.   UNUSED(speed);
  284.   *length = USB_SIZ_STRING_SERIAL;
  285.  
  286.   /* Update the serial number string descriptor with the data from the unique
  287.    * ID */
  288.   Get_SerialNum();
  289.   /* USER CODE BEGIN USBD_FS_SerialStrDescriptor */
  290.  
  291.   /* USER CODE END USBD_FS_SerialStrDescriptor */
  292.   return (uint8_t *) USBD_StringSerial;
  293. }
  294.  
  295. /**
  296.   * @brief  Return the configuration string descriptor
  297.   * @param  speed : Current device speed
  298.   * @param  length : Pointer to data length variable
  299.   * @retval Pointer to descriptor buffer
  300.   */
  301. uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
  302. {
  303.   if(speed == USBD_SPEED_HIGH)
  304.   {
  305.     USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length);
  306.   }
  307.   else
  308.   {
  309.     USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length);
  310.   }
  311.   return USBD_StrDesc;
  312. }
  313.  
  314. /**
  315.   * @brief  Return the interface string descriptor
  316.   * @param  speed : Current device speed
  317.   * @param  length : Pointer to data length variable
  318.   * @retval Pointer to descriptor buffer
  319.   */
  320. uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
  321. {
  322.   if(speed == 0)
  323.   {
  324.     USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_FS, USBD_StrDesc, length);
  325.   }
  326.   else
  327.   {
  328.     USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_FS, USBD_StrDesc, length);
  329.   }
  330.   return USBD_StrDesc;
  331. }
  332.  
  333. /**
  334.   * @brief  Create the serial number string descriptor
  335.   * @param  None
  336.   * @retval None
  337.   */
  338. static void Get_SerialNum(void)
  339. {
  340.   uint32_t deviceserial0, deviceserial1, deviceserial2;
  341.  
  342.   deviceserial0 = *(uint32_t *) DEVICE_ID1;
  343.   deviceserial1 = *(uint32_t *) DEVICE_ID2;
  344.   deviceserial2 = *(uint32_t *) DEVICE_ID3;
  345.  
  346.   deviceserial0 += deviceserial2;
  347.  
  348.   if (deviceserial0 != 0)
  349.   {
  350.     IntToUnicode(deviceserial0, &USBD_StringSerial[2], 8);
  351.     IntToUnicode(deviceserial1, &USBD_StringSerial[18], 4);
  352.   }
  353. }
  354.  
  355. /**
  356.   * @brief  Convert Hex 32Bits value into char
  357.   * @param  value: value to convert
  358.   * @param  pbuf: pointer to the buffer
  359.   * @param  len: buffer length
  360.   * @retval None
  361.   */
  362. static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len)
  363. {
  364.   uint8_t idx = 0;
  365.  
  366.   for (idx = 0; idx < len; idx++)
  367.   {
  368.     if (((value >> 28)) < 0xA)
  369.     {
  370.       pbuf[2 * idx] = (value >> 28) + '0';
  371.     }
  372.     else
  373.     {
  374.       pbuf[2 * idx] = (value >> 28) + 'A' - 10;
  375.     }
  376.  
  377.     value = value << 4;
  378.  
  379.     pbuf[2 * idx + 1] = 0;
  380.   }
  381. }
  382. /**
  383.   * @}
  384.   */
  385.  
  386. /**
  387.   * @}
  388.   */
  389.  
  390. /**
  391.   * @}
  392.   */
  393.  
  394. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
  395.