Subversion Repositories LedShow

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /* USER CODE BEGIN Header */
  2. /**
  3.   ******************************************************************************
  4.   * @file           : 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) 2019 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.  
  112. /** @defgroup USBD_DESC_Private_FunctionPrototypes USBD_DESC_Private_FunctionPrototypes
  113.   * @brief Private functions declaration for FS.
  114.   * @{
  115.   */
  116.  
  117. uint8_t * USBD_FS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  118. uint8_t * USBD_FS_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  119. uint8_t * USBD_FS_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  120. uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  121. uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  122. uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  123. uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
  124.  
  125. #ifdef USBD_SUPPORT_USER_STRING_DESC
  126. uint8_t * USBD_FS_USRStringDesc(USBD_SpeedTypeDef speed, uint8_t idx, uint16_t *length);
  127. #endif /* USBD_SUPPORT_USER_STRING_DESC */
  128.  
  129. /**
  130.   * @}
  131.   */
  132.  
  133. /** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables
  134.   * @brief Private variables.
  135.   * @{
  136.   */
  137.  
  138. USBD_DescriptorsTypeDef FS_Desc =
  139. {
  140.   USBD_FS_DeviceDescriptor
  141. , USBD_FS_LangIDStrDescriptor
  142. , USBD_FS_ManufacturerStrDescriptor
  143. , USBD_FS_ProductStrDescriptor
  144. , USBD_FS_SerialStrDescriptor
  145. , USBD_FS_ConfigStrDescriptor
  146. , USBD_FS_InterfaceStrDescriptor
  147. };
  148.  
  149. #if defined ( __ICCARM__ ) /* IAR Compiler */
  150.   #pragma data_alignment=4
  151. #endif /* defined ( __ICCARM__ ) */
  152. /** USB standard device descriptor. */
  153. __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
  154. {
  155.   0x12,                       /*bLength */
  156.   USB_DESC_TYPE_DEVICE,       /*bDescriptorType*/
  157.   0x00,                       /*bcdUSB */
  158.   0x02,
  159.   0x02,                       /*bDeviceClass*/
  160.   0x02,                       /*bDeviceSubClass*/
  161.   0x00,                       /*bDeviceProtocol*/
  162.   USB_MAX_EP0_SIZE,           /*bMaxPacketSize*/
  163.   LOBYTE(USBD_VID),           /*idVendor*/
  164.   HIBYTE(USBD_VID),           /*idVendor*/
  165.   LOBYTE(USBD_PID_FS),        /*idProduct*/
  166.   HIBYTE(USBD_PID_FS),        /*idProduct*/
  167.   0x00,                       /*bcdDevice rel. 2.00*/
  168.   0x02,
  169.   USBD_IDX_MFC_STR,           /*Index of manufacturer  string*/
  170.   USBD_IDX_PRODUCT_STR,       /*Index of product string*/
  171.   USBD_IDX_SERIAL_STR,        /*Index of serial number string*/
  172.   USBD_MAX_NUM_CONFIGURATION  /*bNumConfigurations*/
  173. };
  174.  
  175. /* USB_DeviceDescriptor */
  176.  
  177. /**
  178.   * @}
  179.   */
  180.  
  181. /** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables
  182.   * @brief Private variables.
  183.   * @{
  184.   */
  185.  
  186. #if defined ( __ICCARM__ ) /* IAR Compiler */
  187.   #pragma data_alignment=4
  188. #endif /* defined ( __ICCARM__ ) */
  189.  
  190. /** USB lang indentifier descriptor. */
  191. __ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC] __ALIGN_END =
  192. {
  193.      USB_LEN_LANGID_STR_DESC,
  194.      USB_DESC_TYPE_STRING,
  195.      LOBYTE(USBD_LANGID_STRING),
  196.      HIBYTE(USBD_LANGID_STRING)
  197. };
  198.  
  199. #if defined ( __ICCARM__ ) /* IAR Compiler */
  200.   #pragma data_alignment=4
  201. #endif /* defined ( __ICCARM__ ) */
  202. /* Internal string descriptor. */
  203. __ALIGN_BEGIN uint8_t USBD_StrDesc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END;
  204.  
  205. #if defined ( __ICCARM__ ) /*!< IAR Compiler */
  206.   #pragma data_alignment=4  
  207. #endif
  208. __ALIGN_BEGIN uint8_t USBD_StringSerial[USB_SIZ_STRING_SERIAL] __ALIGN_END = {
  209.   USB_SIZ_STRING_SERIAL,
  210.   USB_DESC_TYPE_STRING,
  211. };
  212.  
  213. /**
  214.   * @}
  215.   */
  216.  
  217. /** @defgroup USBD_DESC_Private_Functions USBD_DESC_Private_Functions
  218.   * @brief Private functions.
  219.   * @{
  220.   */
  221.  
  222. /**
  223.   * @brief  Return the device descriptor
  224.   * @param  speed : Current device speed
  225.   * @param  length : Pointer to data length variable
  226.   * @retval Pointer to descriptor buffer
  227.   */
  228. uint8_t * USBD_FS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
  229. {
  230.   UNUSED(speed);
  231.   *length = sizeof(USBD_FS_DeviceDesc);
  232.   return USBD_FS_DeviceDesc;
  233. }
  234.  
  235. /**
  236.   * @brief  Return the LangID string descriptor
  237.   * @param  speed : Current device speed
  238.   * @param  length : Pointer to data length variable
  239.   * @retval Pointer to descriptor buffer
  240.   */
  241. uint8_t * USBD_FS_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
  242. {
  243.   UNUSED(speed);
  244.   *length = sizeof(USBD_LangIDDesc);
  245.   return USBD_LangIDDesc;
  246. }
  247.  
  248. /**
  249.   * @brief  Return the product string descriptor
  250.   * @param  speed : Current device speed
  251.   * @param  length : Pointer to data length variable
  252.   * @retval Pointer to descriptor buffer
  253.   */
  254. uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
  255. {
  256.   if(speed == 0)
  257.   {
  258.     USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_FS, USBD_StrDesc, length);
  259.   }
  260.   else
  261.   {
  262.     USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_FS, USBD_StrDesc, length);
  263.   }
  264.   return USBD_StrDesc;
  265. }
  266.  
  267. /**
  268.   * @brief  Return the manufacturer string descriptor
  269.   * @param  speed : Current device speed
  270.   * @param  length : Pointer to data length variable
  271.   * @retval Pointer to descriptor buffer
  272.   */
  273. uint8_t * USBD_FS_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
  274. {
  275.   UNUSED(speed);
  276.   USBD_GetString((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length);
  277.   return USBD_StrDesc;
  278. }
  279.  
  280. /**
  281.   * @brief  Return the serial number string descriptor
  282.   * @param  speed : Current device speed
  283.   * @param  length : Pointer to data length variable
  284.   * @retval Pointer to descriptor buffer
  285.   */
  286. uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
  287. {
  288.   UNUSED(speed);
  289.   *length = USB_SIZ_STRING_SERIAL;
  290.  
  291.   /* Update the serial number string descriptor with the data from the unique
  292.    * ID */
  293.   Get_SerialNum();
  294.  
  295.   return (uint8_t *) USBD_StringSerial;
  296. }
  297.  
  298. /**
  299.   * @brief  Return the configuration string descriptor
  300.   * @param  speed : Current device speed
  301.   * @param  length : Pointer to data length variable
  302.   * @retval Pointer to descriptor buffer
  303.   */
  304. uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
  305. {
  306.   if(speed == USBD_SPEED_HIGH)
  307.   {
  308.     USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length);
  309.   }
  310.   else
  311.   {
  312.     USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length);
  313.   }
  314.   return USBD_StrDesc;
  315. }
  316.  
  317. /**
  318.   * @brief  Return the interface string descriptor
  319.   * @param  speed : Current device speed
  320.   * @param  length : Pointer to data length variable
  321.   * @retval Pointer to descriptor buffer
  322.   */
  323. uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
  324. {
  325.   if(speed == 0)
  326.   {
  327.     USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_FS, USBD_StrDesc, length);
  328.   }
  329.   else
  330.   {
  331.     USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_FS, USBD_StrDesc, length);
  332.   }
  333.   return USBD_StrDesc;
  334. }
  335.  
  336. /**
  337.   * @brief  Create the serial number string descriptor
  338.   * @param  None
  339.   * @retval None
  340.   */
  341. static void Get_SerialNum(void)
  342. {
  343.   uint32_t deviceserial0, deviceserial1, deviceserial2;
  344.  
  345.   deviceserial0 = *(uint32_t *) DEVICE_ID1;
  346.   deviceserial1 = *(uint32_t *) DEVICE_ID2;
  347.   deviceserial2 = *(uint32_t *) DEVICE_ID3;
  348.  
  349.   deviceserial0 += deviceserial2;
  350.  
  351.   if (deviceserial0 != 0)
  352.   {
  353.     IntToUnicode(deviceserial0, &USBD_StringSerial[2], 8);
  354.     IntToUnicode(deviceserial1, &USBD_StringSerial[18], 4);
  355.   }
  356. }
  357.  
  358. /**
  359.   * @brief  Convert Hex 32Bits value into char
  360.   * @param  value: value to convert
  361.   * @param  pbuf: pointer to the buffer
  362.   * @param  len: buffer length
  363.   * @retval None
  364.   */
  365. static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len)
  366. {
  367.   uint8_t idx = 0;
  368.  
  369.   for (idx = 0; idx < len; idx++)
  370.   {
  371.     if (((value >> 28)) < 0xA)
  372.     {
  373.       pbuf[2 * idx] = (value >> 28) + '0';
  374.     }
  375.     else
  376.     {
  377.       pbuf[2 * idx] = (value >> 28) + 'A' - 10;
  378.     }
  379.  
  380.     value = value << 4;
  381.  
  382.     pbuf[2 * idx + 1] = 0;
  383.   }
  384. }
  385. /**
  386.   * @}
  387.   */
  388.  
  389. /**
  390.   * @}
  391.   */
  392.  
  393. /**
  394.   * @}
  395.   */
  396.  
  397. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
  398.