[FL-1587] RFID: Clock for emulation timer from antenna (#622)
* RFID: pull antenna down when emulating * Rfid: fixed HID emulation by adding zero pulse every 4 bits * Rfid: HID emulation fixed with DSP based FSK oscillator. * Rfid: receive 125KHz clock for emulation timer from antenna and comparator * Rfid: commented unused variable * Firmware: rollback changes in f6. * Add F7 target based on F6. * F7/F6: update cube projects, apply changes to the targets, update linker scripts with correct RAM start values. * FuriHal: RFID init routine. * Scripts: update OTP tool for v11 board Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
This commit is contained in:
		
							
								
								
									
										34
									
								
								firmware/targets/f7/usb-glue/usb_device.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								firmware/targets/f7/usb-glue/usb_device.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,34 @@ | ||||
| #include "usb_device.h" | ||||
|  | ||||
| #include "stm32wbxx.h" | ||||
| #include "stm32wbxx_hal.h" | ||||
|  | ||||
| #include "usbd_def.h" | ||||
| #include "usbd_core.h" | ||||
| #include "usbd_desc.h" | ||||
| #include "usbd_cdc.h" | ||||
| #include "usbd_cdc_if.h" | ||||
|  | ||||
| extern void Error_Handler(void); | ||||
|  | ||||
| /* USB Device Core handle declaration. */ | ||||
| USBD_HandleTypeDef hUsbDeviceFS; | ||||
|  | ||||
| extern USBD_DescriptorsTypeDef CDC_Desc; | ||||
|  | ||||
| /** Init USB device Library, add supported class and start the library */ | ||||
| void MX_USB_Device_Init(void) { | ||||
|     /* Init Device Library, add supported class and start the library. */ | ||||
|     if (USBD_Init(&hUsbDeviceFS, &CDC_Desc, DEVICE_FS) != USBD_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|     if (USBD_RegisterClass(&hUsbDeviceFS, &USBD_CDC) != USBD_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|     if (USBD_CDC_RegisterInterface(&hUsbDeviceFS, &USBD_Interface_fops_FS) != USBD_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|     if (USBD_Start(&hUsbDeviceFS) != USBD_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										11
									
								
								firmware/targets/f7/usb-glue/usb_device.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								firmware/targets/f7/usb-glue/usb_device.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| #pragma once | ||||
|  | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif | ||||
|  | ||||
| void MX_USB_Device_Init(); | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
							
								
								
									
										142
									
								
								firmware/targets/f7/usb-glue/usbd_cdc_if.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								firmware/targets/f7/usb-glue/usbd_cdc_if.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,142 @@ | ||||
| #include "usbd_cdc_if.h" | ||||
| #include <furi-hal-vcp_i.h> | ||||
|  | ||||
| extern USBD_HandleTypeDef hUsbDeviceFS; | ||||
|  | ||||
| static int8_t CDC_Init_FS(void); | ||||
| static int8_t CDC_DeInit_FS(void); | ||||
| static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length); | ||||
| static int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len); | ||||
| static int8_t CDC_TransmitCplt_FS(uint8_t *pbuf, uint32_t *Len, uint8_t epnum); | ||||
|  | ||||
| USBD_CDC_ItfTypeDef USBD_Interface_fops_FS = | ||||
| { | ||||
|     CDC_Init_FS, | ||||
|     CDC_DeInit_FS, | ||||
|     CDC_Control_FS, | ||||
|     CDC_Receive_FS, | ||||
|     CDC_TransmitCplt_FS | ||||
| }; | ||||
|  | ||||
| uint8_t UserRxBufferFS[APP_RX_DATA_SIZE]; | ||||
| uint8_t UserTxBufferFS[APP_TX_DATA_SIZE]; | ||||
|  | ||||
| /** Initializes the CDC media low layer over the FS USB IP | ||||
|  * @retval USBD_OK if all operations are OK else USBD_FAIL | ||||
|  */ | ||||
| static int8_t CDC_Init_FS(void) { | ||||
|     /* Set Application Buffers */ | ||||
|     USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0); | ||||
|     USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS); | ||||
|     return (USBD_OK); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * @brief  DeInitializes the CDC media low layer | ||||
|  * @retval USBD_OK if all operations are OK else USBD_FAIL | ||||
|  */ | ||||
| static int8_t CDC_DeInit_FS(void) { | ||||
|     return (USBD_OK); | ||||
| } | ||||
|  | ||||
| /** Manage the CDC class requests | ||||
|  * @param  cmd: Command code | ||||
|  * @param  pbuf: Buffer containing command data (request parameters) | ||||
|  * @param  length: Number of data to be sent (in bytes) | ||||
|  * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL | ||||
|  */ | ||||
| static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length) { | ||||
|     if (cmd == CDC_SEND_ENCAPSULATED_COMMAND) { | ||||
|     } else if (cmd == CDC_GET_ENCAPSULATED_RESPONSE) { | ||||
|     } else if (cmd == CDC_SET_COMM_FEATURE) { | ||||
|     } else if (cmd == CDC_GET_COMM_FEATURE) { | ||||
|     } else if (cmd == CDC_CLEAR_COMM_FEATURE) { | ||||
|     } else if (cmd == CDC_SET_LINE_CODING) { | ||||
|         /*******************************************************************************/ | ||||
|         /* Line Coding Structure                                                       */ | ||||
|         /*-----------------------------------------------------------------------------*/ | ||||
|         /* Offset | Field       | Size | Value  | Description                          */ | ||||
|         /* 0      | dwDTERate   |   4  | Number |Data terminal rate, in bits per second*/ | ||||
|         /* 4      | bCharFormat |   1  | Number | Stop bits                            */ | ||||
|         /*                                        0 - 1 Stop bit                       */ | ||||
|         /*                                        1 - 1.5 Stop bits                    */ | ||||
|         /*                                        2 - 2 Stop bits                      */ | ||||
|         /* 5      | bParityType |  1   | Number | Parity                               */ | ||||
|         /*                                        0 - None                             */ | ||||
|         /*                                        1 - Odd                              */ | ||||
|         /*                                        2 - Even                             */ | ||||
|         /*                                        3 - Mark                             */ | ||||
|         /*                                        4 - Space                            */ | ||||
|         /* 6      | bDataBits  |   1   | Number Data bits (5, 6, 7, 8 or 16).          */ | ||||
|         /*******************************************************************************/ | ||||
|     } else if (cmd == CDC_GET_LINE_CODING) { | ||||
|     } else if (cmd == CDC_SET_CONTROL_LINE_STATE) { | ||||
|         furi_hal_vcp_on_cdc_control_line(((USBD_SetupReqTypedef*)pbuf)->wValue); | ||||
|     } else if (cmd == CDC_SEND_BREAK) { | ||||
|     } else { | ||||
|     } | ||||
|  | ||||
|     return (USBD_OK); | ||||
| } | ||||
|  | ||||
| /** Data received over USB OUT endpoint are sent over CDC interface through this function. | ||||
|  * | ||||
|  * @note | ||||
|  * This function will issue a NAK packet on any OUT packet received on | ||||
|  * USB endpoint until exiting this function. If you exit this function | ||||
|  * before transfer is complete on CDC interface (ie. using DMA controller) | ||||
|  * it will result in receiving more data while previous ones are still | ||||
|  * not sent. | ||||
|  * | ||||
|  * @param  Buf: Buffer of data to be received | ||||
|  * @param  Len: Number of data received (in bytes) | ||||
|  * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL | ||||
|  */ | ||||
| static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) { | ||||
|     if (*Len) { | ||||
|         furi_hal_vcp_on_cdc_rx(Buf, *Len); | ||||
|     } else { | ||||
|         USBD_CDC_ReceivePacket(&hUsbDeviceFS); | ||||
|     } | ||||
|      | ||||
|     return (USBD_OK); | ||||
| } | ||||
|  | ||||
| /** CDC_Transmit_FS Data to send over USB IN endpoint are sent over CDC interface | ||||
|  * through this function. | ||||
|  * @param  Buf: Buffer of data to be sent | ||||
|  * @param  Len: Number of data to be sent (in bytes) | ||||
|  * @retval USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY | ||||
|  */ | ||||
| uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) | ||||
| { | ||||
|     uint8_t result = USBD_OK; | ||||
|  | ||||
|     USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData; | ||||
|     if (hcdc->TxState != 0){ | ||||
|         return USBD_BUSY; | ||||
|     } | ||||
|     memcpy(UserTxBufferFS, Buf, Len); | ||||
|     USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, Len); | ||||
|     result = USBD_CDC_TransmitPacket(&hUsbDeviceFS); | ||||
|  | ||||
|     return result; | ||||
| } | ||||
|  | ||||
| /** CDC_TransmitCplt_FS Data transmited callback | ||||
|  * | ||||
|  * @note | ||||
|  * This function is IN transfer complete callback used to inform user that | ||||
|  * the submitted Data is successfully sent over USB. | ||||
|  * | ||||
|  * @param  Buf: Buffer of data to be received | ||||
|  * @param  Len: Number of data received (in bytes) | ||||
|  * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL | ||||
|  */ | ||||
| static int8_t CDC_TransmitCplt_FS(uint8_t *Buf, uint32_t *Len, uint8_t epnum) { | ||||
|     uint8_t result = USBD_OK; | ||||
|  | ||||
|     furi_hal_vcp_on_cdc_tx_complete(*Len); | ||||
|  | ||||
|     return result; | ||||
| } | ||||
							
								
								
									
										22
									
								
								firmware/targets/f7/usb-glue/usbd_cdc_if.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								firmware/targets/f7/usb-glue/usbd_cdc_if.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | ||||
| #pragma once | ||||
|  | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif | ||||
|  | ||||
| /* Includes ------------------------------------------------------------------*/ | ||||
| #include "usbd_cdc.h" | ||||
|  | ||||
| /* Define size for the receive and transmit buffer over CDC */ | ||||
| /* It's up to user to redefine and/or remove those define */ | ||||
| #define APP_RX_DATA_SIZE  CDC_DATA_FS_MAX_PACKET_SIZE | ||||
| #define APP_TX_DATA_SIZE  CDC_DATA_FS_MAX_PACKET_SIZE | ||||
|  | ||||
| /** CDC Interface callback. */ | ||||
| extern USBD_CDC_ItfTypeDef USBD_Interface_fops_FS; | ||||
|  | ||||
| uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len); | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
							
								
								
									
										506
									
								
								firmware/targets/f7/usb-glue/usbd_conf.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										506
									
								
								firmware/targets/f7/usb-glue/usbd_conf.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,506 @@ | ||||
| #include "stm32wbxx.h" | ||||
| #include "stm32wbxx_hal.h" | ||||
|  | ||||
| #include <furi-hal-vcp_i.h> | ||||
|  | ||||
| #include "usbd_def.h" | ||||
| #include "usbd_core.h" | ||||
| #include "usbd_cdc.h" | ||||
|  | ||||
| PCD_HandleTypeDef hpcd_USB_FS; | ||||
| void Error_Handler(void); | ||||
|  | ||||
| static USBD_StatusTypeDef USBD_Get_USB_Status(HAL_StatusTypeDef hal_status); | ||||
|  | ||||
| static void SystemClockConfig_Resume(void); | ||||
|  | ||||
| void HAL_PCD_MspInit(PCD_HandleTypeDef* pcdHandle) { | ||||
|     GPIO_InitTypeDef GPIO_InitStruct = {0}; | ||||
|     if(pcdHandle->Instance==USB) { | ||||
|         __HAL_RCC_GPIOA_CLK_ENABLE(); | ||||
|         /**USB GPIO Configuration | ||||
|         PA11     ------> USB_DM | ||||
|         PA12     ------> USB_DP  | ||||
|         */ | ||||
|         GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12; | ||||
|         GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; | ||||
|         GPIO_InitStruct.Pull = GPIO_NOPULL; | ||||
|         GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; | ||||
|         GPIO_InitStruct.Alternate = GPIO_AF10_USB; | ||||
|         HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); | ||||
|  | ||||
|         /* Peripheral clock enable */ | ||||
|         __HAL_RCC_USB_CLK_ENABLE(); | ||||
|  | ||||
|         /* Peripheral interrupt init */ | ||||
|         HAL_NVIC_SetPriority(USB_LP_IRQn, 5, 0); | ||||
|         HAL_NVIC_EnableIRQ(USB_LP_IRQn); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void HAL_PCD_MspDeInit(PCD_HandleTypeDef* pcdHandle) { | ||||
|     if(pcdHandle->Instance==USB) { | ||||
|         /* Peripheral clock disable */ | ||||
|         __HAL_RCC_USB_CLK_DISABLE(); | ||||
|  | ||||
|         /**USB GPIO Configuration | ||||
|         PA11     ------> USB_DM | ||||
|         PA12     ------> USB_DP | ||||
|         */ | ||||
|         HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12); | ||||
|  | ||||
|         /* Peripheral interrupt Deinit*/ | ||||
|         HAL_NVIC_DisableIRQ(USB_LP_IRQn); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** Setup stage callback | ||||
|  * @param  hpcd: PCD handle | ||||
|  * @retval None | ||||
|  */ | ||||
| void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) { | ||||
|     USBD_LL_SetupStage((USBD_HandleTypeDef*)hpcd->pData, (uint8_t *)hpcd->Setup); | ||||
| } | ||||
|  | ||||
| /** Data Out stage callback. | ||||
|  * @param  hpcd: PCD handle | ||||
|  * @param  epnum: Endpoint number | ||||
|  * @retval None | ||||
|  */ | ||||
| void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) { | ||||
|     USBD_LL_DataOutStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff); | ||||
| } | ||||
|  | ||||
| /** Data In stage callback. | ||||
|  * @param  hpcd: PCD handle | ||||
|  * @param  epnum: Endpoint number | ||||
|  * @retval None | ||||
|  */ | ||||
| void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) { | ||||
|     USBD_LL_DataInStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff); | ||||
| } | ||||
|  | ||||
| /** SOF callback. | ||||
|  * @param  hpcd: PCD handle | ||||
|  * @retval None | ||||
|  */ | ||||
| void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) { | ||||
|     USBD_LL_SOF((USBD_HandleTypeDef*)hpcd->pData); | ||||
| } | ||||
|  | ||||
| /** Reset callback. | ||||
|  * @param  hpcd: PCD handle | ||||
|  * @retval None | ||||
|  */ | ||||
| void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) { | ||||
|     USBD_SpeedTypeDef speed = USBD_SPEED_FULL; | ||||
|  | ||||
|     if ( hpcd->Init.speed != PCD_SPEED_FULL) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|  | ||||
|     /* Set Speed. */ | ||||
|     USBD_LL_SetSpeed((USBD_HandleTypeDef*)hpcd->pData, speed); | ||||
|  | ||||
|     /* Reset Device. */ | ||||
|     USBD_LL_Reset((USBD_HandleTypeDef*)hpcd->pData); | ||||
| } | ||||
|  | ||||
| /** Suspend callback. | ||||
|  * When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it) | ||||
|  * @param  hpcd: PCD handle | ||||
|  * @retval None | ||||
|  */ | ||||
| void HAL_PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) { | ||||
|     USBD_LL_Suspend((USBD_HandleTypeDef*)hpcd->pData); | ||||
|  | ||||
|     furi_hal_vcp_on_usb_suspend(); | ||||
|      | ||||
|     if (hpcd->Init.low_power_enable) { | ||||
|         /* Set SLEEPDEEP bit and SleepOnExit of Cortex System Control Register. */ | ||||
|         SCB->SCR |= (uint32_t)((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** Resume callback. | ||||
|  * When Low power mode is enabled the debug cannot be used (IAR, Keil doesn't support it) | ||||
|  * @param  hpcd: PCD handle | ||||
|  * @retval None | ||||
|  */ | ||||
| void HAL_PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) { | ||||
|     if (hpcd->Init.low_power_enable) { | ||||
|         /* Reset SLEEPDEEP bit of Cortex System Control Register. */ | ||||
|         SCB->SCR &= (uint32_t)~((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); | ||||
|         SystemClockConfig_Resume(); | ||||
|     } | ||||
|  | ||||
|     furi_hal_vcp_on_usb_resume(); | ||||
|  | ||||
|     USBD_LL_Resume((USBD_HandleTypeDef*)hpcd->pData); | ||||
| } | ||||
|  | ||||
| /** ISOOUTIncomplete callback. | ||||
|  * @param  hpcd: PCD handle | ||||
|  * @param  epnum: Endpoint number | ||||
|  * @retval None | ||||
|  */ | ||||
| void HAL_PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) { | ||||
|     USBD_LL_IsoOUTIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum); | ||||
| } | ||||
|  | ||||
| /** ISOINIncomplete callback. | ||||
|  * @param  hpcd: PCD handle | ||||
|  * @param  epnum: Endpoint number | ||||
|  * @retval None | ||||
|  */ | ||||
| void HAL_PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) { | ||||
|     USBD_LL_IsoINIncomplete((USBD_HandleTypeDef*)hpcd->pData, epnum); | ||||
| } | ||||
|  | ||||
| /** Connect callback. | ||||
|  * @param  hpcd: PCD handle | ||||
|  * @retval None | ||||
|  */ | ||||
| void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) { | ||||
|     USBD_LL_DevConnected((USBD_HandleTypeDef*)hpcd->pData); | ||||
| } | ||||
|  | ||||
| /** Disconnect callback. | ||||
|  * @param  hpcd: PCD handle | ||||
|  * @retval None | ||||
|  */ | ||||
| void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) { | ||||
|     USBD_LL_DevDisconnected((USBD_HandleTypeDef*)hpcd->pData); | ||||
| } | ||||
|  | ||||
| /** Initializes the low level portion of the device driver. | ||||
|  * @param  pdev: Device handle | ||||
|  * @retval USBD status | ||||
|  */ | ||||
| USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev) { | ||||
|     /* Init USB Ip. */ | ||||
|     hpcd_USB_FS.pData = pdev; | ||||
|  | ||||
|     /* Link the driver to the stack. */ | ||||
|     pdev->pData = &hpcd_USB_FS; | ||||
|  | ||||
|     /* Enable USB power on Pwrctrl CR2 register. */ | ||||
|     HAL_PWREx_EnableVddUSB(); | ||||
|  | ||||
|     hpcd_USB_FS.Instance = USB; | ||||
|     hpcd_USB_FS.Init.dev_endpoints = 8; | ||||
|     hpcd_USB_FS.Init.speed = PCD_SPEED_FULL; | ||||
|     hpcd_USB_FS.Init.phy_itface = PCD_PHY_EMBEDDED; | ||||
|     hpcd_USB_FS.Init.Sof_enable = DISABLE; | ||||
|     hpcd_USB_FS.Init.low_power_enable = DISABLE; | ||||
|     hpcd_USB_FS.Init.lpm_enable = DISABLE; | ||||
|     hpcd_USB_FS.Init.battery_charging_enable = DISABLE; | ||||
|  | ||||
|     if (HAL_PCD_Init(&hpcd_USB_FS) != HAL_OK) { | ||||
|         Error_Handler(); | ||||
|     } | ||||
|  | ||||
|     HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 0x18); | ||||
|     HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x58); | ||||
|  | ||||
|     HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x81 , PCD_SNG_BUF, 0xC0); | ||||
|     HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x01 , PCD_SNG_BUF, 0x110); | ||||
|     HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x82 , PCD_SNG_BUF, 0x100); | ||||
|  | ||||
|     return USBD_OK; | ||||
| } | ||||
|  | ||||
| /** De-Initializes the low level portion of the device driver. | ||||
|  * @param  pdev: Device handle | ||||
|  * @retval USBD status | ||||
|  */ | ||||
| USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev) | ||||
| { | ||||
|     HAL_StatusTypeDef hal_status = HAL_OK; | ||||
|     USBD_StatusTypeDef usb_status = USBD_OK; | ||||
|  | ||||
|     hal_status = HAL_PCD_DeInit(pdev->pData); | ||||
|  | ||||
|     usb_status =  USBD_Get_USB_Status(hal_status); | ||||
|  | ||||
|     return usb_status; | ||||
| } | ||||
|  | ||||
| /** Starts the low level portion of the device driver. | ||||
|  * @param  pdev: Device handle | ||||
|  * @retval USBD status | ||||
|  */ | ||||
| USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev) { | ||||
|     HAL_StatusTypeDef hal_status = HAL_OK; | ||||
|     USBD_StatusTypeDef usb_status = USBD_OK; | ||||
|  | ||||
|     hal_status = HAL_PCD_Start(pdev->pData); | ||||
|  | ||||
|     usb_status =  USBD_Get_USB_Status(hal_status); | ||||
|  | ||||
|     return usb_status; | ||||
| } | ||||
|  | ||||
| /** Stops the low level portion of the device driver. | ||||
|  * @param  pdev: Device handle | ||||
|  * @retval USBD status | ||||
|  */ | ||||
| USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev) { | ||||
|     HAL_StatusTypeDef hal_status = HAL_OK; | ||||
|     USBD_StatusTypeDef usb_status = USBD_OK; | ||||
|  | ||||
|     hal_status = HAL_PCD_Stop(pdev->pData); | ||||
|  | ||||
|     usb_status =  USBD_Get_USB_Status(hal_status); | ||||
|  | ||||
|     return usb_status; | ||||
| } | ||||
|  | ||||
| /** Opens an endpoint of the low level driver. | ||||
|  * @param  pdev: Device handle | ||||
|  * @param  ep_addr: Endpoint number | ||||
|  * @param  ep_type: Endpoint type | ||||
|  * @param  ep_mps: Endpoint max packet size | ||||
|  * @retval USBD status | ||||
|  */ | ||||
| USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_mps) { | ||||
|     HAL_StatusTypeDef hal_status = HAL_OK; | ||||
|     USBD_StatusTypeDef usb_status = USBD_OK; | ||||
|  | ||||
|     hal_status = HAL_PCD_EP_Open(pdev->pData, ep_addr, ep_mps, ep_type); | ||||
|  | ||||
|     usb_status =  USBD_Get_USB_Status(hal_status); | ||||
|  | ||||
|     return usb_status; | ||||
| } | ||||
|  | ||||
| /** Closes an endpoint of the low level driver. | ||||
|  * @param  pdev: Device handle | ||||
|  * @param  ep_addr: Endpoint number | ||||
|  * @retval USBD status | ||||
|  */ | ||||
| USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) { | ||||
|     HAL_StatusTypeDef hal_status = HAL_OK; | ||||
|     USBD_StatusTypeDef usb_status = USBD_OK; | ||||
|  | ||||
|     hal_status = HAL_PCD_EP_Close(pdev->pData, ep_addr); | ||||
|  | ||||
|     usb_status =  USBD_Get_USB_Status(hal_status); | ||||
|  | ||||
|     return usb_status; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * @brief  Flushes an endpoint of the Low Level Driver. | ||||
|  * @param  pdev: Device handle | ||||
|  * @param  ep_addr: Endpoint number | ||||
|  * @retval USBD status | ||||
|  */ | ||||
| USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) { | ||||
|     HAL_StatusTypeDef hal_status = HAL_OK; | ||||
|     USBD_StatusTypeDef usb_status = USBD_OK; | ||||
|  | ||||
|     hal_status = HAL_PCD_EP_Flush(pdev->pData, ep_addr); | ||||
|  | ||||
|     usb_status =  USBD_Get_USB_Status(hal_status); | ||||
|  | ||||
|     return usb_status; | ||||
| } | ||||
|  | ||||
| /** Sets a Stall condition on an endpoint of the Low Level Driver. | ||||
|  * @param  pdev: Device handle | ||||
|  * @param  ep_addr: Endpoint number | ||||
|  * @retval USBD status | ||||
|  */ | ||||
| USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) { | ||||
|     HAL_StatusTypeDef hal_status = HAL_OK; | ||||
|     USBD_StatusTypeDef usb_status = USBD_OK; | ||||
|  | ||||
|     hal_status = HAL_PCD_EP_SetStall(pdev->pData, ep_addr); | ||||
|  | ||||
|     usb_status =  USBD_Get_USB_Status(hal_status); | ||||
|  | ||||
|     return usb_status; | ||||
| } | ||||
|  | ||||
| /** Clears a Stall condition on an endpoint of the Low Level Driver. | ||||
|  * @param  pdev: Device handle | ||||
|  * @param  ep_addr: Endpoint number | ||||
|  * @retval USBD status | ||||
|  */ | ||||
| USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) { | ||||
|     HAL_StatusTypeDef hal_status = HAL_OK; | ||||
|     USBD_StatusTypeDef usb_status = USBD_OK; | ||||
|  | ||||
|     hal_status = HAL_PCD_EP_ClrStall(pdev->pData, ep_addr); | ||||
|  | ||||
|     usb_status =  USBD_Get_USB_Status(hal_status); | ||||
|  | ||||
|     return usb_status; | ||||
| } | ||||
|  | ||||
| /** Returns Stall condition. | ||||
|  * @param  pdev: Device handle | ||||
|  * @param  ep_addr: Endpoint number | ||||
|  * @retval Stall (1: Yes, 0: No) | ||||
|  */ | ||||
| uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr) { | ||||
|     PCD_HandleTypeDef *hpcd = (PCD_HandleTypeDef*) pdev->pData; | ||||
|  | ||||
|     if((ep_addr & 0x80) == 0x80) | ||||
|     { | ||||
|         return hpcd->IN_ep[ep_addr & 0x7F].is_stall; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         return hpcd->OUT_ep[ep_addr & 0x7F].is_stall; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** Assigns a USB address to the device. | ||||
|  * @param  pdev: Device handle | ||||
|  * @param  dev_addr: Device address | ||||
|  * @retval USBD status | ||||
|  */ | ||||
| USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr) { | ||||
|     HAL_StatusTypeDef hal_status = HAL_OK; | ||||
|     USBD_StatusTypeDef usb_status = USBD_OK; | ||||
|  | ||||
|     hal_status = HAL_PCD_SetAddress(pdev->pData, dev_addr); | ||||
|  | ||||
|     usb_status =  USBD_Get_USB_Status(hal_status); | ||||
|  | ||||
|     return usb_status; | ||||
| } | ||||
|  | ||||
| /** Transmits data over an endpoint. | ||||
|  * @param  pdev: Device handle | ||||
|  * @param  ep_addr: Endpoint number | ||||
|  * @param  pbuf: Pointer to data to be sent | ||||
|  * @param  size: Data size | ||||
|  * @retval USBD status | ||||
|  */ | ||||
| USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size) { | ||||
|     HAL_StatusTypeDef hal_status = HAL_OK; | ||||
|     USBD_StatusTypeDef usb_status = USBD_OK; | ||||
|  | ||||
|     hal_status = HAL_PCD_EP_Transmit(pdev->pData, ep_addr, pbuf, size); | ||||
|  | ||||
|     usb_status =  USBD_Get_USB_Status(hal_status); | ||||
|  | ||||
|     return usb_status; | ||||
| } | ||||
|  | ||||
| /** Prepares an endpoint for reception. | ||||
|  * @param  pdev: Device handle | ||||
|  * @param  ep_addr: Endpoint number | ||||
|  * @param  pbuf: Pointer to data to be received | ||||
|  * @param  size: Data size | ||||
|  * @retval USBD status | ||||
|  */ | ||||
| USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size) { | ||||
|     HAL_StatusTypeDef hal_status = HAL_OK; | ||||
|     USBD_StatusTypeDef usb_status = USBD_OK; | ||||
|  | ||||
|     hal_status = HAL_PCD_EP_Receive(pdev->pData, ep_addr, pbuf, size); | ||||
|  | ||||
|     usb_status =  USBD_Get_USB_Status(hal_status); | ||||
|  | ||||
|     return usb_status; | ||||
| } | ||||
|  | ||||
| /** Returns the last transfered packet size. | ||||
|  * @param  pdev: Device handle | ||||
|  * @param  ep_addr: Endpoint number | ||||
|  * @retval Recived Data Size | ||||
|  */ | ||||
| uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr) { | ||||
|     return HAL_PCD_EP_GetRxCount((PCD_HandleTypeDef*) pdev->pData, ep_addr); | ||||
| } | ||||
|  | ||||
| /** Send LPM message to user layer | ||||
|  * @param  hpcd: PCD handle | ||||
|  * @param  msg: LPM message | ||||
|  * @retval None | ||||
|  */ | ||||
| void HAL_PCDEx_LPM_Callback(PCD_HandleTypeDef *hpcd, PCD_LPM_MsgTypeDef msg) { | ||||
|     switch (msg) { | ||||
|     case PCD_LPM_L0_ACTIVE: | ||||
|         if (hpcd->Init.low_power_enable) { | ||||
|             SystemClockConfig_Resume(); | ||||
|             /* Reset SLEEPDEEP bit of Cortex System Control Register. */ | ||||
|             SCB->SCR &= (uint32_t)~((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); | ||||
|         } | ||||
|         USBD_LL_Resume(hpcd->pData); | ||||
|         break; | ||||
|  | ||||
|     case PCD_LPM_L1_ACTIVE: | ||||
|         USBD_LL_Suspend(hpcd->pData); | ||||
|  | ||||
|         /* Enter in STOP mode. */ | ||||
|         if (hpcd->Init.low_power_enable) { | ||||
|             /* Set SLEEPDEEP bit and SleepOnExit of Cortex System Control Register. */ | ||||
|             SCB->SCR |= (uint32_t)((uint32_t)(SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk)); | ||||
|         } | ||||
|         break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** Delays routine for the USB Device Library. | ||||
|  * @param  Delay: Delay in ms | ||||
|  * @retval None | ||||
|  */ | ||||
| void USBD_LL_Delay(uint32_t Delay) { | ||||
|     HAL_Delay(Delay); | ||||
| } | ||||
|  | ||||
| /** Static single allocation. | ||||
|  * @param  size: Size of allocated memory | ||||
|  * @retval None | ||||
|  */ | ||||
| void *USBD_static_malloc(uint32_t size) { | ||||
|     static uint32_t mem[(sizeof(USBD_CDC_HandleTypeDef)/4)+1];/* On 32-bit boundary */ | ||||
|     return mem; | ||||
| } | ||||
|  | ||||
| /** Dummy memory free | ||||
|  * @param  p: Pointer to allocated  memory address | ||||
|  * @retval None | ||||
|  */ | ||||
| void USBD_static_free(void *p) { | ||||
| } | ||||
|  | ||||
| /** Configures system clock after wake-up from USB resume callBack: | ||||
|  * enable HSI, PLL and select PLL as system clock source. | ||||
|  * @retval None | ||||
|  */ | ||||
| static void SystemClockConfig_Resume(void) { | ||||
| } | ||||
|  | ||||
| /** Retuns the USB status depending on the HAL status: | ||||
|  * @param  hal_status: HAL status | ||||
|  * @retval USB status | ||||
|  */ | ||||
| USBD_StatusTypeDef USBD_Get_USB_Status(HAL_StatusTypeDef hal_status) { | ||||
|     USBD_StatusTypeDef usb_status = USBD_OK; | ||||
|  | ||||
|     switch (hal_status) | ||||
|     { | ||||
|         case HAL_OK : | ||||
|             usb_status = USBD_OK; | ||||
|         break; | ||||
|         case HAL_ERROR : | ||||
|             usb_status = USBD_FAIL; | ||||
|         break; | ||||
|         case HAL_BUSY : | ||||
|             usb_status = USBD_BUSY; | ||||
|         break; | ||||
|         case HAL_TIMEOUT : | ||||
|             usb_status = USBD_FAIL; | ||||
|         break; | ||||
|         default : | ||||
|             usb_status = USBD_FAIL; | ||||
|         break; | ||||
|     } | ||||
|     return usb_status; | ||||
| } | ||||
							
								
								
									
										73
									
								
								firmware/targets/f7/usb-glue/usbd_conf.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								firmware/targets/f7/usb-glue/usbd_conf.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include "stm32wbxx.h" | ||||
| #include "stm32wbxx_hal.h" | ||||
|  | ||||
| #ifdef __cplusplus | ||||
|  extern "C" { | ||||
| #endif | ||||
|  | ||||
| #define USBD_MAX_NUM_INTERFACES     1U | ||||
| #define USBD_MAX_NUM_CONFIGURATION  1U | ||||
| #define USBD_MAX_STR_DESC_SIZ       512U | ||||
| #define USBD_DEBUG_LEVEL            0U | ||||
| #define USBD_LPM_ENABLED            0U | ||||
| #define USBD_SELF_POWERED           0U | ||||
|  | ||||
| /****************************************/ | ||||
| /* #define for FS and HS identification */ | ||||
| #define DEVICE_FS 0 | ||||
|  | ||||
| /* Memory management macros */ | ||||
|  | ||||
| /** Alias for memory allocation. */ | ||||
| #define USBD_malloc         (void *)USBD_static_malloc | ||||
|  | ||||
| /** Alias for memory release. */ | ||||
| #define USBD_free           USBD_static_free | ||||
|  | ||||
| /** Alias for memory set. */ | ||||
| #define USBD_memset         memset | ||||
|  | ||||
| /** Alias for memory copy. */ | ||||
| #define USBD_memcpy         memcpy | ||||
|  | ||||
| /** Alias for delay. */ | ||||
| #define USBD_Delay          HAL_Delay | ||||
|  | ||||
| /* DEBUG macros */ | ||||
|  | ||||
| #if (USBD_DEBUG_LEVEL > 0) | ||||
| #define USBD_UsrLog(...)    printf(__VA_ARGS__);\ | ||||
|                             printf("\n"); | ||||
| #else | ||||
| #define USBD_UsrLog(...) | ||||
| #endif | ||||
|  | ||||
| #if (USBD_DEBUG_LEVEL > 1) | ||||
|  | ||||
| #define USBD_ErrLog(...)    printf("ERROR: ") ;\ | ||||
|                             printf(__VA_ARGS__);\ | ||||
|                             printf("\n"); | ||||
| #else | ||||
| #define USBD_ErrLog(...) | ||||
| #endif | ||||
|  | ||||
| #if (USBD_DEBUG_LEVEL > 2) | ||||
| #define USBD_DbgLog(...)    printf("DEBUG : ") ;\ | ||||
|                             printf(__VA_ARGS__);\ | ||||
|                             printf("\n"); | ||||
| #else | ||||
| #define USBD_DbgLog(...) | ||||
| #endif | ||||
|  | ||||
| void *USBD_static_malloc(uint32_t size); | ||||
| void USBD_static_free(void *p); | ||||
|  | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
							
								
								
									
										206
									
								
								firmware/targets/f7/usb-glue/usbd_desc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										206
									
								
								firmware/targets/f7/usb-glue/usbd_desc.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,206 @@ | ||||
| #include "usbd_core.h" | ||||
| #include "usbd_desc.h" | ||||
| #include "usbd_conf.h" | ||||
| #include "furi-hal-version.h" | ||||
|  | ||||
| #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" | ||||
|  | ||||
| static void Get_SerialNum(void); | ||||
| static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len); | ||||
|  | ||||
| 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); | ||||
|  | ||||
| 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 | ||||
| }; | ||||
|  | ||||
| /** 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 */ | ||||
|  | ||||
| /** 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) | ||||
| }; | ||||
|  | ||||
| /* Internal string descriptor. */ | ||||
| __ALIGN_BEGIN uint8_t USBD_StrDesc[USBD_MAX_STR_DESC_SIZ] __ALIGN_END; | ||||
|  | ||||
| __ALIGN_BEGIN uint8_t USBD_StringSerial[USB_SIZ_STRING_SERIAL] __ALIGN_END = { | ||||
|     USB_SIZ_STRING_SERIAL, | ||||
|     USB_DESC_TYPE_STRING, | ||||
| }; | ||||
|  | ||||
| /** 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; | ||||
| } | ||||
|  | ||||
| /** 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; | ||||
| } | ||||
|  | ||||
| /** 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*)furi_hal_version_get_device_name_ptr(), USBD_StrDesc, length); | ||||
|     return USBD_StrDesc; | ||||
| } | ||||
|  | ||||
| /** 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; | ||||
| } | ||||
|  | ||||
| /** 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(furi_hal_version_get_name_ptr()){ | ||||
|         char buffer[14] = "flip_"; | ||||
|         strncat(buffer, furi_hal_version_get_name_ptr(), 8); | ||||
|         USBD_GetString((uint8_t*) buffer, USBD_StringSerial, length); | ||||
|     } else { | ||||
|         Get_SerialNum(); | ||||
|     } | ||||
|  | ||||
|     return (uint8_t *) USBD_StringSerial; | ||||
| } | ||||
|  | ||||
| /** 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; | ||||
| } | ||||
|  | ||||
| /** 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; | ||||
| } | ||||
|  | ||||
| /** 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); | ||||
|     } | ||||
| } | ||||
|  | ||||
| /** 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; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										19
									
								
								firmware/targets/f7/usb-glue/usbd_desc.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								firmware/targets/f7/usb-glue/usbd_desc.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| #pragma once | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #include "usbd_def.h" | ||||
|  | ||||
| #define DEVICE_ID1 (UID_BASE) | ||||
| #define DEVICE_ID2 (UID_BASE + 0x4) | ||||
| #define DEVICE_ID3 (UID_BASE + 0x8) | ||||
|  | ||||
| #define USB_SIZ_STRING_SERIAL 0x1E | ||||
|  | ||||
| extern USBD_DescriptorsTypeDef CDC_Desc; | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
		Reference in New Issue
	
	Block a user