* Core: ring buffer. * Api: usb vcp. F3: vcp glue code. * Applications: cli draft version. * Cli: basic working version, includes help and version commands * HAL: vcp on f2 * Makefile: update openocd conf * F3: vcp rx with freertos stream * Cli: help * Cli: standard commands, api-hal-uid * Power: cli poweroff.
		
			
				
	
	
		
			312 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			312 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* USER CODE BEGIN Header */
 | 
						|
/**
 | 
						|
  ******************************************************************************
 | 
						|
  * @file           : usbd_cdc_if.c
 | 
						|
  * @version        : v2.0_Cube
 | 
						|
  * @brief          : Usb device for Virtual Com Port.
 | 
						|
  ******************************************************************************
 | 
						|
  * @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_cdc_if.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
 | 
						|
  * @brief Usb device library.
 | 
						|
  * @{
 | 
						|
  */
 | 
						|
 | 
						|
/** @addtogroup USBD_CDC_IF
 | 
						|
  * @{
 | 
						|
  */
 | 
						|
 | 
						|
/** @defgroup USBD_CDC_IF_Private_TypesDefinitions USBD_CDC_IF_Private_TypesDefinitions
 | 
						|
  * @brief Private types.
 | 
						|
  * @{
 | 
						|
  */
 | 
						|
 | 
						|
/* USER CODE BEGIN PRIVATE_TYPES */
 | 
						|
 | 
						|
extern void _api_hal_vcp_init();
 | 
						|
extern void _api_hal_vcp_deinit();
 | 
						|
extern void _api_hal_vcp_control_line(uint8_t state);
 | 
						|
extern void _api_hal_vcp_rx_callback(char* buffer, size_t size);
 | 
						|
extern void _api_hal_vcp_tx_complete(size_t size);
 | 
						|
 | 
						|
/* USER CODE END PRIVATE_TYPES */
 | 
						|
 | 
						|
/**
 | 
						|
  * @}
 | 
						|
  */
 | 
						|
 | 
						|
/** @defgroup USBD_CDC_IF_Private_Defines USBD_CDC_IF_Private_Defines
 | 
						|
  * @brief Private defines.
 | 
						|
  * @{
 | 
						|
  */
 | 
						|
 | 
						|
/* USER CODE BEGIN PRIVATE_DEFINES */
 | 
						|
/* USER CODE END PRIVATE_DEFINES */
 | 
						|
 | 
						|
/**
 | 
						|
  * @}
 | 
						|
  */
 | 
						|
 | 
						|
/** @defgroup USBD_CDC_IF_Private_Macros USBD_CDC_IF_Private_Macros
 | 
						|
  * @brief Private macros.
 | 
						|
  * @{
 | 
						|
  */
 | 
						|
 | 
						|
/* USER CODE BEGIN PRIVATE_MACRO */
 | 
						|
 | 
						|
/* USER CODE END PRIVATE_MACRO */
 | 
						|
 | 
						|
/**
 | 
						|
  * @}
 | 
						|
  */
 | 
						|
 | 
						|
/** @defgroup USBD_CDC_IF_Private_Variables USBD_CDC_IF_Private_Variables
 | 
						|
  * @brief Private variables.
 | 
						|
  * @{
 | 
						|
  */
 | 
						|
/* Create buffer for reception and transmission           */
 | 
						|
/* It's up to user to redefine and/or remove those define */
 | 
						|
/** Received data over USB are stored in this buffer      */
 | 
						|
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
 | 
						|
 | 
						|
/** Data to send over USB CDC are stored in this buffer   */
 | 
						|
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
 | 
						|
 | 
						|
/* USER CODE BEGIN PRIVATE_VARIABLES */
 | 
						|
 | 
						|
/* USER CODE END PRIVATE_VARIABLES */
 | 
						|
 | 
						|
/**
 | 
						|
  * @}
 | 
						|
  */
 | 
						|
 | 
						|
/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables
 | 
						|
  * @brief Public variables.
 | 
						|
  * @{
 | 
						|
  */
 | 
						|
 | 
						|
extern USBD_HandleTypeDef hUsbDeviceFS;
 | 
						|
 | 
						|
/* USER CODE BEGIN EXPORTED_VARIABLES */
 | 
						|
 | 
						|
/* USER CODE END EXPORTED_VARIABLES */
 | 
						|
 | 
						|
/**
 | 
						|
  * @}
 | 
						|
  */
 | 
						|
 | 
						|
/** @defgroup USBD_CDC_IF_Private_FunctionPrototypes USBD_CDC_IF_Private_FunctionPrototypes
 | 
						|
  * @brief Private functions declaration.
 | 
						|
  * @{
 | 
						|
  */
 | 
						|
 | 
						|
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);
 | 
						|
 | 
						|
/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */
 | 
						|
 | 
						|
/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */
 | 
						|
 | 
						|
/**
 | 
						|
  * @}
 | 
						|
  */
 | 
						|
 | 
						|
USBD_CDC_ItfTypeDef USBD_Interface_fops_FS =
 | 
						|
{
 | 
						|
  CDC_Init_FS,
 | 
						|
  CDC_DeInit_FS,
 | 
						|
  CDC_Control_FS,
 | 
						|
  CDC_Receive_FS,
 | 
						|
  CDC_TransmitCplt_FS
 | 
						|
};
 | 
						|
 | 
						|
/* Private functions ---------------------------------------------------------*/
 | 
						|
/**
 | 
						|
  * @brief  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)
 | 
						|
{
 | 
						|
  /* USER CODE BEGIN 3 */
 | 
						|
  /* Set Application Buffers */
 | 
						|
  USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0);
 | 
						|
  USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS);
 | 
						|
  _api_hal_vcp_init();
 | 
						|
  return (USBD_OK);
 | 
						|
  /* USER CODE END 3 */
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  * @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)
 | 
						|
{
 | 
						|
  /* USER CODE BEGIN 4 */
 | 
						|
  _api_hal_vcp_deinit();
 | 
						|
  return (USBD_OK);
 | 
						|
  /* USER CODE END 4 */
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  * @brief  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)
 | 
						|
{
 | 
						|
  /* USER CODE BEGIN 5 */
 | 
						|
  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) {
 | 
						|
    _api_hal_vcp_control_line(((USBD_SetupReqTypedef*)pbuf)->wValue);
 | 
						|
  } else if (cmd == CDC_SEND_BREAK) {
 | 
						|
  } else {
 | 
						|
  }
 | 
						|
 | 
						|
  return (USBD_OK);
 | 
						|
  /* USER CODE END 5 */
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  * @brief  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)
 | 
						|
{
 | 
						|
  /* USER CODE BEGIN 6 */
 | 
						|
  _api_hal_vcp_rx_callback((char*)Buf, *Len);
 | 
						|
  USBD_CDC_ReceivePacket(&hUsbDeviceFS);
 | 
						|
  return (USBD_OK);
 | 
						|
  /* USER CODE END 6 */
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  * @brief  CDC_Transmit_FS
 | 
						|
  *         Data to send over USB IN endpoint are sent over CDC interface
 | 
						|
  *         through this function.
 | 
						|
  *         @note
 | 
						|
  *
 | 
						|
  *
 | 
						|
  * @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;
 | 
						|
  /* USER CODE BEGIN 7 */
 | 
						|
  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);
 | 
						|
  /* USER CODE END 7 */
 | 
						|
  return result;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  * @brief  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;
 | 
						|
  /* USER CODE BEGIN 13 */
 | 
						|
  UNUSED(Buf);
 | 
						|
  UNUSED(epnum);
 | 
						|
  _api_hal_vcp_tx_complete(*Len);
 | 
						|
  /* USER CODE END 13 */
 | 
						|
  return result;
 | 
						|
}
 | 
						|
 | 
						|
/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */
 | 
						|
 | 
						|
/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */
 | 
						|
 | 
						|
/**
 | 
						|
  * @}
 | 
						|
  */
 | 
						|
 | 
						|
/**
 | 
						|
  * @}
 | 
						|
  */
 | 
						|
 | 
						|
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
 |