 5c81bb8abc
			
		
	
	
		5c81bb8abc
		
			
		
	
	
	
	
		
			
			* add u8g2 and ui libs * add display driver and usage example * not init display in test mode * change todo text * fix removed code * Target f2 (#107) * add ioc for flipperzero f2 * add generated f1 files to f2 * regenerate cubemx * invert initial state of led * blink backligh * shutdown backlight on idle
		
			
				
	
	
		
			447 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			447 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* USER CODE BEGIN Header */
 | |
| /**
 | |
|   ******************************************************************************
 | |
|   * @file           : usbd_desc.c
 | |
|   * @version        : v2.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 */
 | |
| 
 | |
| /* 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_PID_FS     22336
 | |
| #define USBD_PRODUCT_STRING_FS     "Flipper Zero Virtual ComPort"
 | |
| #define USBD_CONFIGURATION_STRING_FS     "CDC Config"
 | |
| #define USBD_INTERFACE_STRING_FS     "CDC Interface"
 | |
| 
 | |
| #define USB_SIZ_BOS_DESC            0x0C
 | |
| 
 | |
| /* 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 FS.
 | |
|   * @{
 | |
|   */
 | |
| 
 | |
| uint8_t * USBD_FS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | |
| uint8_t * USBD_FS_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | |
| uint8_t * USBD_FS_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | |
| uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | |
| uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | |
| uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | |
| uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | |
| #if (USBD_LPM_ENABLED == 1)
 | |
| uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length);
 | |
| #endif /* (USBD_LPM_ENABLED == 1) */
 | |
| 
 | |
| /**
 | |
|   * @}
 | |
|   */
 | |
| 
 | |
| /** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables
 | |
|   * @brief Private variables.
 | |
|   * @{
 | |
|   */
 | |
| 
 | |
| USBD_DescriptorsTypeDef FS_Desc =
 | |
| {
 | |
|   USBD_FS_DeviceDescriptor
 | |
| , USBD_FS_LangIDStrDescriptor
 | |
| , USBD_FS_ManufacturerStrDescriptor
 | |
| , USBD_FS_ProductStrDescriptor
 | |
| , USBD_FS_SerialStrDescriptor
 | |
| , USBD_FS_ConfigStrDescriptor
 | |
| , USBD_FS_InterfaceStrDescriptor
 | |
| #if (USBD_LPM_ENABLED == 1)
 | |
| , USBD_FS_USR_BOSDescriptor
 | |
| #endif /* (USBD_LPM_ENABLED == 1) */
 | |
| };
 | |
| 
 | |
| #if defined ( __ICCARM__ ) /* IAR Compiler */
 | |
|   #pragma data_alignment=4
 | |
| #endif /* defined ( __ICCARM__ ) */
 | |
| /** USB standard device descriptor. */
 | |
| __ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
 | |
| {
 | |
|   0x12,                       /*bLength */
 | |
|   USB_DESC_TYPE_DEVICE,       /*bDescriptorType*/
 | |
| #if (USBD_LPM_ENABLED == 1)
 | |
|   0x01,                       /*bcdUSB */ /* changed to USB version 2.01
 | |
|                                              in order to support LPM L1 suspend
 | |
|                                              resume test of USBCV3.0*/
 | |
| #else
 | |
|   0x00,                       /*bcdUSB */
 | |
| #endif /* (USBD_LPM_ENABLED == 1) */
 | |
|   0x02,
 | |
|   0x02,                       /*bDeviceClass*/
 | |
|   0x02,                       /*bDeviceSubClass*/
 | |
|   0x00,                       /*bDeviceProtocol*/
 | |
|   USB_MAX_EP0_SIZE,           /*bMaxPacketSize*/
 | |
|   LOBYTE(USBD_VID),           /*idVendor*/
 | |
|   HIBYTE(USBD_VID),           /*idVendor*/
 | |
|   LOBYTE(USBD_PID_FS),        /*idProduct*/
 | |
|   HIBYTE(USBD_PID_FS),        /*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 */
 | |
| /** BOS descriptor. */
 | |
| #if (USBD_LPM_ENABLED == 1)
 | |
| #if defined ( __ICCARM__ ) /* IAR Compiler */
 | |
|   #pragma data_alignment=4
 | |
| #endif /* defined ( __ICCARM__ ) */
 | |
| __ALIGN_BEGIN uint8_t USBD_FS_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END =
 | |
| {
 | |
|   0x5,
 | |
|   USB_DESC_TYPE_BOS,
 | |
|   0xC,
 | |
|   0x0,
 | |
|   0x1,  /* 1 device capability*/
 | |
|         /* device capability*/
 | |
|   0x7,
 | |
|   USB_DEVICE_CAPABITY_TYPE,
 | |
|   0x2,
 | |
|   0x2,  /* LPM capability bit set*/
 | |
|   0x0,
 | |
|   0x0,
 | |
|   0x0
 | |
| };
 | |
| #endif /* (USBD_LPM_ENABLED == 1) */
 | |
| 
 | |
| /**
 | |
|   * @}
 | |
|   */
 | |
| 
 | |
| /** @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_FS_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
 | |
| {
 | |
|   UNUSED(speed);
 | |
|   *length = sizeof(USBD_FS_DeviceDesc);
 | |
|   return USBD_FS_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_FS_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_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
 | |
| {
 | |
|   if(speed == 0)
 | |
|   {
 | |
|     USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_FS, USBD_StrDesc, length);
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     USBD_GetString((uint8_t *)USBD_PRODUCT_STRING_FS, 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_FS_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_FS_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_FS_SerialStrDescriptor */
 | |
|   
 | |
|   /* USER CODE END USBD_FS_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_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
 | |
| {
 | |
|   if(speed == USBD_SPEED_HIGH)
 | |
|   {
 | |
|     USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_FS, USBD_StrDesc, length);
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     USBD_GetString((uint8_t *)USBD_CONFIGURATION_STRING_FS, 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_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
 | |
| {
 | |
|   if(speed == 0)
 | |
|   {
 | |
|     USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_FS, USBD_StrDesc, length);
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     USBD_GetString((uint8_t *)USBD_INTERFACE_STRING_FS, 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_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)
 | |
| {
 | |
|   UNUSED(speed);
 | |
|   *length = sizeof(USBD_FS_BOSDesc);
 | |
|   return (uint8_t*)USBD_FS_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****/
 |