344 lines
10 KiB
C
344 lines
10 KiB
C
/**
|
|||
|
|
******************************************************************************
|
||
|
|
* @file : usbd_cdc_if.c
|
||
|
|
* @version : v1.0_Cube
|
||
|
|
* @brief : Usb device for Virtual Com Port.
|
||
|
|
******************************************************************************
|
||
|
|
* This notice applies to any and all portions of this file
|
||
|
|
* that are not between comment pairs USER CODE BEGIN and
|
||
|
|
* USER CODE END. Other portions of this file, whether
|
||
|
|
* inserted by the user or by software development tools
|
||
|
|
* are owned by their respective copyright owners.
|
||
|
|
*
|
||
|
|
* Copyright (c) 2018 STMicroelectronics International N.V.
|
||
|
|
* All rights reserved.
|
||
|
|
*
|
||
|
|
* Redistribution and use in source and binary forms, with or without
|
||
|
|
* modification, are permitted, provided that the following conditions are met:
|
||
|
|
*
|
||
|
|
* 1. Redistribution of source code must retain the above copyright notice,
|
||
|
|
* this list of conditions and the following disclaimer.
|
||
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||
|
|
* this list of conditions and the following disclaimer in the documentation
|
||
|
|
* and/or other materials provided with the distribution.
|
||
|
|
* 3. Neither the name of STMicroelectronics nor the names of other
|
||
|
|
* contributors to this software may be used to endorse or promote products
|
||
|
|
* derived from this software without specific written permission.
|
||
|
|
* 4. This software, including modifications and/or derivative works of this
|
||
|
|
* software, must execute solely and exclusively on microcontroller or
|
||
|
|
* microprocessor devices manufactured by or for STMicroelectronics.
|
||
|
|
* 5. Redistribution and use of this software other than as permitted under
|
||
|
|
* this license is void and will automatically terminate your rights under
|
||
|
|
* this license.
|
||
|
|
*
|
||
|
|
* THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
|
||
|
|
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
|
||
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||
|
|
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
|
||
|
|
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
|
||
|
|
* SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||
|
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||
|
|
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||
|
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||
|
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||
|
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
|
*
|
||
|
|
******************************************************************************
|
||
|
|
*/
|
||
|
|
|
||
|
|
/* Includes ------------------------------------------------------------------*/
|
||
|
|
#include "usbd_cdc_if.h"
|
||
|
|
|
||
|
|
/* USER CODE BEGIN INCLUDE */
|
||
|
|
#include "cmsis_os.h"
|
||
|
|
#include <communication/interface_usb.h>
|
||
|
|
#include <freertos_vars.h>
|
||
|
|
/* 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 */
|
||
|
|
/* 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.
|
||
|
|
* @{
|
||
|
|
*/
|
||
|
|
|
||
|
|
/* 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, uint8_t endpoint_pair);
|
||
|
|
|
||
|
|
/* 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
|
||
|
|
};
|
||
|
|
|
||
|
|
/* 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 */
|
||
|
|
osMessagePut(usb_event_queue, 1, 0);
|
||
|
|
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 */
|
||
|
|
osMessagePut(usb_event_queue, 2, 0);
|
||
|
|
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 */
|
||
|
|
switch (cmd)
|
||
|
|
{
|
||
|
|
case CDC_SEND_ENCAPSULATED_COMMAND:
|
||
|
|
|
||
|
|
break;
|
||
|
|
|
||
|
|
case CDC_GET_ENCAPSULATED_RESPONSE:
|
||
|
|
|
||
|
|
break;
|
||
|
|
|
||
|
|
case CDC_SET_COMM_FEATURE:
|
||
|
|
|
||
|
|
break;
|
||
|
|
|
||
|
|
case CDC_GET_COMM_FEATURE:
|
||
|
|
|
||
|
|
break;
|
||
|
|
|
||
|
|
case CDC_CLEAR_COMM_FEATURE:
|
||
|
|
|
||
|
|
break;
|
||
|
|
|
||
|
|
/*******************************************************************************/
|
||
|
|
/* 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). */
|
||
|
|
/*******************************************************************************/
|
||
|
|
case CDC_SET_LINE_CODING:
|
||
|
|
|
||
|
|
break;
|
||
|
|
|
||
|
|
case CDC_GET_LINE_CODING:
|
||
|
|
pbuf[0] = (uint8_t)(115200);
|
||
|
|
pbuf[1] = (uint8_t)(115200 >> 8);
|
||
|
|
pbuf[2] = (uint8_t)(115200 >> 16);
|
||
|
|
pbuf[3] = (uint8_t)(115200 >> 24);
|
||
|
|
pbuf[4] = 0; // stop bits (1)
|
||
|
|
pbuf[5] = 0; // parity (none)
|
||
|
|
pbuf[6] = 8; // number of bits (8)
|
||
|
|
break;
|
||
|
|
|
||
|
|
case CDC_SET_CONTROL_LINE_STATE:
|
||
|
|
|
||
|
|
break;
|
||
|
|
|
||
|
|
case CDC_SEND_BREAK:
|
||
|
|
|
||
|
|
break;
|
||
|
|
|
||
|
|
default:
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
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 block any OUT packet reception on USB endpoint
|
||
|
|
* untill 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, uint8_t endpoint_pair)
|
||
|
|
{
|
||
|
|
/* USER CODE BEGIN 6 */
|
||
|
|
usb_rx_process_packet(Buf, *Len, endpoint_pair);
|
||
|
|
|
||
|
|
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 endpoint_pair)
|
||
|
|
{
|
||
|
|
uint8_t result = USBD_OK;
|
||
|
|
/* USER CODE BEGIN 7 */
|
||
|
|
//Check length
|
||
|
|
if (Len > USB_TX_DATA_SIZE)
|
||
|
|
return USBD_FAIL;
|
||
|
|
|
||
|
|
USBD_CDC_HandleTypeDef* hcdc = (USBD_CDC_HandleTypeDef*) hUsbDeviceFS.pClassData;
|
||
|
|
|
||
|
|
// Select EP
|
||
|
|
USBD_CDC_EP_HandleTypeDef* hEP_Tx;
|
||
|
|
if (endpoint_pair == CDC_IN_EP) {
|
||
|
|
hEP_Tx = &hcdc->CDC_Tx;
|
||
|
|
} else if (endpoint_pair == ODRIVE_IN_EP) {
|
||
|
|
hEP_Tx = &hcdc->ODRIVE_Tx;
|
||
|
|
} else {
|
||
|
|
return USBD_FAIL;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Check for ongoing transmission
|
||
|
|
if (hEP_Tx->State != 0)
|
||
|
|
return USBD_BUSY;
|
||
|
|
|
||
|
|
result = USBD_CDC_TransmitPacket(&hUsbDeviceFS, Buf, Len, endpoint_pair);
|
||
|
|
/* USER CODE END 7 */
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */
|
||
|
|
/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @}
|
||
|
|
*/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @}
|
||
|
|
*/
|
||
|
|
|
||
|
|
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
|