diff --git a/common/AL94_USB_Composite/App/usb_device.c b/common/AL94_USB_Composite/App/usb_device.c deleted file mode 100644 index e40d973..0000000 --- a/common/AL94_USB_Composite/App/usb_device.c +++ /dev/null @@ -1,168 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : usb_device.c - * @version : v1.0_Cube - * @brief : This file implements the USB Device - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2021 STMicroelectronics. - * All rights reserved.

- * - * 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 "usb_device.h" -#include "usbd_desc.h" - -/* USER CODE BEGIN Includes */ -#include "usbd_composite.h" -/* USER CODE END Includes */ - -/* USER CODE BEGIN PV */ -/* Private variables ---------------------------------------------------------*/ - -/* USER CODE END PV */ - -/* USER CODE BEGIN PFP */ -/* Private function prototypes -----------------------------------------------*/ - -/* USER CODE END PFP */ - -/* USB Device Core handle declaration. */ -USBD_HandleTypeDef hUsbDevice; - -/* - * -- Insert your variables declaration here -- - */ -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/* - * -- Insert your external function declaration here -- - */ -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ - -/** - * Init USB device Library, add supported class and start the library - * @retval None - */ -void MX_USB_DEVICE_Init (void) -{ - /* USER CODE BEGIN USB_DEVICE_Init_PreTreatment */ - - /* USER CODE END USB_DEVICE_Init_PreTreatment */ - - /* Init Device Library, add supported class and start the library. */ - USBD_COMPOSITE_Mount_Class (); - -#if (USBD_USE_HS == 1) - if (USBD_Init(&hUsbDevice, &USBD_Desc, DEVICE_HS) != USBD_OK) - { - Error_Handler(); - } -#else - if (USBD_Init (&hUsbDevice, &USBD_Desc, DEVICE_FS) != USBD_OK) - { - Error_Handler (); - } -#endif - if (USBD_RegisterClass (&hUsbDevice, &USBD_COMPOSITE) != USBD_OK) - { - Error_Handler (); - } -#if (USBD_USE_CDC_ACM == 1) - if (USBD_CDC_ACM_RegisterInterface (&hUsbDevice, &USBD_CDC_ACM_fops) != USBD_OK) - { - Error_Handler (); - } -#endif -#if (USBD_USE_CDC_RNDIS == 1) - if (USBD_CDC_RNDIS_RegisterInterface(&hUsbDevice, &USBD_CDC_RNDIS_fops) != USBD_OK) - { - Error_Handler(); - } -#endif -#if (USBD_USE_CDC_ECM == 1) - if (USBD_CDC_ECM_RegisterInterface(&hUsbDevice, &USBD_CDC_ECM_fops) != USBD_OK) - { - Error_Handler(); - } -#endif -#if (USBD_USE_HID_MOUSE == 1) -#endif -#if (USBD_USE_HID_KEYBOARD == 1) -#endif -#if (USBD_USE_HID_CUSTOM == 1) - if (USBD_CUSTOM_HID_RegisterInterface(&hUsbDevice, &USBD_CustomHID_fops) != USBD_OK) - { - Error_Handler(); - } -#endif -#if (USBD_USE_UAC_MIC == 1) - if (USBD_AUDIO_MIC_RegisterInterface(&hUsbDevice, &USBD_AUDIO_MIC_fops_FS) != USBD_OK) - { - Error_Handler(); - } -#endif -#if (USBD_USE_UAC_SPKR == 1) - if (USBD_AUDIO_SPKR_RegisterInterface(&hUsbDevice, &USBD_AUDIO_SPKR_fops) != USBD_OK) - { - Error_Handler(); - } -#endif -#if (USBD_USE_UVC == 1) - if (USBD_VIDEO_RegisterInterface(&hUsbDevice, &USBD_VIDEO_fops_FS) != USBD_OK) - { - Error_Handler(); - } -#endif -#if (USBD_USE_MSC == 1) - if (USBD_MSC_RegisterStorage(&hUsbDevice, &USBD_Storage_Interface_fops) != USBD_OK) - { - Error_Handler(); - } -#endif -#if (USBD_USE_DFU == 1) - if (USBD_DFU_RegisterMedia(&hUsbDevice, &USBD_DFU_fops) != USBD_OK) - { - Error_Handler(); - } -#endif -#if (USBD_USE_PRNTR == 1) - if (USBD_PRNT_RegisterInterface(&hUsbDevice, &USBD_PRNT_fops) != USBD_OK) - { - Error_Handler(); - } -#endif - if (USBD_Start (&hUsbDevice) != USBD_OK) - { - Error_Handler (); - } - - /* USER CODE BEGIN USB_DEVICE_Init_PostTreatment */ - - /* USER CODE END USB_DEVICE_Init_PostTreatment */ -} - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/AL94_USB_Composite/App/usb_device.h b/common/AL94_USB_Composite/App/usb_device.h deleted file mode 100644 index 065711d..0000000 --- a/common/AL94_USB_Composite/App/usb_device.h +++ /dev/null @@ -1,105 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : usb_device.h - * @version : v1.0_Cube - * @brief : Header for usb_device.c file. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2021 STMicroelectronics. - * All rights reserved.

- * - * 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 */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_DEVICE__H__ -#define __USB_DEVICE__H__ - -#ifdef __cplusplus -extern "C" -{ -#endif - - /* Includes ------------------------------------------------------------------*/ -#include "main.h" -#include "usbd_def.h" - - /* USER CODE BEGIN INCLUDE */ - - /* USER CODE END INCLUDE */ - - /** @addtogroup USBD_OTG_DRIVER - * @{ - */ - - /** @defgroup USBD_DEVICE USBD_DEVICE - * @brief Device file for Usb otg low level driver. - * @{ - */ - - /** @defgroup USBD_DEVICE_Exported_Variables USBD_DEVICE_Exported_Variables - * @brief Public variables. - * @{ - */ - - /* Private variables ---------------------------------------------------------*/ - /* USER CODE BEGIN PV */ - - /* USER CODE END PV */ - - /* Private function prototypes -----------------------------------------------*/ - /* USER CODE BEGIN PFP */ - - /* USER CODE END PFP */ - - /* - * -- Insert your variables declaration here -- - */ - /* USER CODE BEGIN VARIABLES */ - - /* USER CODE END VARIABLES */ - /** - * @} - */ - - /** @defgroup USBD_DEVICE_Exported_FunctionsPrototype USBD_DEVICE_Exported_FunctionsPrototype - * @brief Declaration of public functions for Usb device. - * @{ - */ - - /** USB Device initialization function. */ - void MX_USB_DEVICE_Init (void); - -/* - * -- Insert functions declaration here -- - */ -/* USER CODE BEGIN FD */ - -/* USER CODE END FD */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_DEVICE__H__ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/AL94_USB_Composite/App/usbd_cdc_acm_if.c b/common/AL94_USB_Composite/App/usbd_cdc_acm_if.c deleted file mode 100644 index 771779e..0000000 --- a/common/AL94_USB_Composite/App/usbd_cdc_acm_if.c +++ /dev/null @@ -1,541 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : usbd_cdc_if.c - * @version : v2.0_Cube - * @brief : Usb device for Virtual Com Port. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2020 STMicroelectronics. - * All rights reserved.

- * - * 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_acm_if.h" - -/* USER CODE BEGIN INCLUDE */ -//#include "usart.h" -//#include "tim.h" -#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 */ - -/* 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 */ - -#define APP_RX_DATA_SIZE 128 -//#define APP_TX_DATA_SIZE 128 - -/** RX buffer for USB */ -uint8_t RX_Buffer[NUMBER_OF_CDC][APP_RX_DATA_SIZE]; - -/** TX buffer for USB, RX buffer for UART */ -//uint8_t TX_Buffer[NUMBER_OF_CDC][APP_TX_DATA_SIZE]; -USBD_CDC_ACM_LineCodingTypeDef Line_Coding[NUMBER_OF_CDC]; - -uint32_t Write_Index[NUMBER_OF_CDC]; /* keep track of received data over UART */ -uint32_t Read_Index[NUMBER_OF_CDC]; /* keep track of sent data to USB */ - -/* USER CODE END PRIVATE_VARIABLES */ - -/** - * @} - */ - -/** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables - * @brief Public variables. - * @{ - */ - -extern USBD_HandleTypeDef hUsbDevice; - -/* 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 (uint8_t cdc_ch); -static int8_t CDC_DeInit (uint8_t cdc_ch); -static int8_t CDC_Control (uint8_t cdc_ch, uint8_t cmd, uint8_t *pbuf, uint16_t length); -static int8_t CDC_Receive (uint8_t cdc_ch, uint8_t *pbuf, uint32_t *Len); -static int8_t CDC_TransmitCplt (uint8_t cdc_ch, uint8_t *Buf, uint32_t *Len, uint8_t epnum); - -/* USER CODE BEGIN PRIVATE_FUNCTIONS_DECLARATION */ -//UART_HandleTypeDef *CDC_CH_To_UART_Handle(uint8_t cdc_ch) -//{ -// UART_HandleTypeDef *handle = NULL; -// -// if (cdc_ch == 0) -// { -// handle = &huart1; -// } -//#if (0) -// else if (cdc_ch == 1) -// { -// handle = &huart2; -// } -// else if (cdc_ch == 2) -// { -// handle = &huart3; -// } -//#endif -// return handle; -//} -// -//uint8_t UART_Handle_TO_CDC_CH(UART_HandleTypeDef *handle) -//{ -// uint8_t cdc_ch = 0; -// -// if (handle == &huart1) -// { -// cdc_ch = 0; -// } -//#if (0) -// else if (handle == &huart2) -// { -// cdc_ch = 1; -// } -// else if (handle == &huart3) -// { -// cdc_ch = 2; -// } -//#endif -// return cdc_ch; -//} -// -//void Change_UART_Setting(uint8_t cdc_ch) -//{ -// UART_HandleTypeDef *handle = CDC_CH_To_UART_Handle(cdc_ch); -// -// if (HAL_UART_DeInit(handle) != HAL_OK) -// { -// /* Initialization Error */ -// Error_Handler(); -// } -// /* set the Stop bit */ -// switch (Line_Coding[cdc_ch].format) -// { -// case 0: -// handle->Init.StopBits = UART_STOPBITS_1; -// break; -// case 2: -// handle->Init.StopBits = UART_STOPBITS_2; -// break; -// default: -// handle->Init.StopBits = UART_STOPBITS_1; -// break; -// } -// -// /* set the parity bit*/ -// switch (Line_Coding[cdc_ch].paritytype) -// { -// case 0: -// handle->Init.Parity = UART_PARITY_NONE; -// break; -// case 1: -// handle->Init.Parity = UART_PARITY_ODD; -// break; -// case 2: -// handle->Init.Parity = UART_PARITY_EVEN; -// break; -// default: -// handle->Init.Parity = UART_PARITY_NONE; -// break; -// } -// -// /*set the data type : only 8bits and 9bits is supported */ -// switch (Line_Coding[cdc_ch].datatype) -// { -// case 0x07: -// /* With this configuration a parity (Even or Odd) must be set */ -// handle->Init.WordLength = UART_WORDLENGTH_8B; -// break; -// case 0x08: -// if (handle->Init.Parity == UART_PARITY_NONE) -// { -// handle->Init.WordLength = UART_WORDLENGTH_8B; -// } -// else -// { -// handle->Init.WordLength = UART_WORDLENGTH_9B; -// } -// -// break; -// default: -// handle->Init.WordLength = UART_WORDLENGTH_8B; -// break; -// } -// -// if (Line_Coding[cdc_ch].bitrate == 0) -// { -// Line_Coding[cdc_ch].bitrate = 115200; -// } -// -// handle->Init.BaudRate = Line_Coding[cdc_ch].bitrate; -// handle->Init.HwFlowCtl = UART_HWCONTROL_NONE; -// handle->Init.Mode = UART_MODE_TX_RX; -// handle->Init.OverSampling = UART_OVERSAMPLING_16; -// -// if (HAL_UART_Init(handle) != HAL_OK) -// { -// /* Initialization Error */ -// Error_Handler(); -// } -// -// /** rx for uart and tx buffer of usb */ -// if (HAL_UART_Receive_IT(handle, TX_Buffer[cdc_ch], 1) != HAL_OK) -// { -// /* Transfer error in reception process */ -// Error_Handler(); -// } -//} -/* USER CODE END PRIVATE_FUNCTIONS_DECLARATION */ - -/** - * @} - */ - -USBD_CDC_ACM_ItfTypeDef USBD_CDC_ACM_fops = -{ CDC_Init, CDC_DeInit, CDC_Control, CDC_Receive, CDC_TransmitCplt }; - -/* 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 (uint8_t cdc_ch) -{ - /* USER CODE BEGIN 3 */ - - /* ##-1- Set Application Buffers */ - USBD_CDC_SetRxBuffer (cdc_ch, &hUsbDevice, RX_Buffer[cdc_ch]); - - // /*##-2- Start the TIM Base generation in interrupt mode ####################*/ - // /* Start Channel1 */ - // if (HAL_TIM_Base_Start_IT(&htim4) != HAL_OK) - // { - // /* Starting Error */ - // Error_Handler(); - // } - - 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 (uint8_t cdc_ch) -{ - /* USER CODE BEGIN 4 */ - /* DeInitialize the UART peripheral */ - // if (HAL_UART_DeInit(CDC_CH_To_UART_Handle(cdc_ch)) != HAL_OK) - // { - // /* Initialization Error */ - // Error_Handler(); - // } - 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 (uint8_t cdc_ch, 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: - Line_Coding[cdc_ch].bitrate = (uint32_t) (pbuf[0] | (pbuf[1] << 8) | (pbuf[2] << 16) | (pbuf[3] << 24)); - Line_Coding[cdc_ch].format = pbuf[4]; - Line_Coding[cdc_ch].paritytype = pbuf[5]; - Line_Coding[cdc_ch].datatype = pbuf[6]; - - //Change_UART_Setting(cdc_ch); - break; - - case CDC_GET_LINE_CODING: - pbuf[0] = (uint8_t) (Line_Coding[cdc_ch].bitrate); - pbuf[1] = (uint8_t) (Line_Coding[cdc_ch].bitrate >> 8); - pbuf[2] = (uint8_t) (Line_Coding[cdc_ch].bitrate >> 16); - pbuf[3] = (uint8_t) (Line_Coding[cdc_ch].bitrate >> 24); - pbuf[4] = Line_Coding[cdc_ch].format; - pbuf[5] = Line_Coding[cdc_ch].paritytype; - pbuf[6] = Line_Coding[cdc_ch].datatype; - 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 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 (uint8_t cdc_ch, uint8_t *Buf, uint32_t *Len) -{ - /* USER CODE BEGIN 6 */ - //HAL_UART_Transmit_DMA(CDC_CH_To_UART_Handle(cdc_ch), Buf, *Len); -// CDC_Transmit(cdc_ch, Buf, *Len); // echo back on same channel - CDC_Receive_Callback (cdc_ch, Buf, *Len); //NOTE! AL94 USB CDC. We implement this. - - USBD_CDC_SetRxBuffer (cdc_ch, &hUsbDevice, &Buf[0]); - USBD_CDC_ReceivePacket (cdc_ch, &hUsbDevice); - return (USBD_OK); - /* USER CODE END 6 */ -} - -/** - * @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 (uint8_t cdc_ch, uint8_t *Buf, uint32_t *Len, uint8_t epnum) -{ - CDC_TransmitCplt_Callback (0, Buf, (uint16_t) (*Len)); //NOTE! AL94 USB CDC. We implement this. - - return (USBD_OK); -} - -/** - * @brief CDC_Transmit - * 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 (uint8_t ch, uint8_t *Buf, uint16_t Len) -{ - uint8_t result = USBD_OK; - /* USER CODE BEGIN 7 */ - extern USBD_CDC_ACM_HandleTypeDef CDC_ACM_Class_Data[]; - USBD_CDC_ACM_HandleTypeDef *hcdc = NULL; - hcdc = &CDC_ACM_Class_Data[ch]; - if (hcdc->TxState != 0) - { - return USBD_BUSY; - } - USBD_CDC_SetTxBuffer (ch, &hUsbDevice, Buf, Len); - result = USBD_CDC_TransmitPacket (ch, &hUsbDevice); - /* USER CODE END 7 */ - return result; -} - -/* USER CODE BEGIN PRIVATE_FUNCTIONS_IMPLEMENTATION */ -//void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) -//{ -// /* Initiate next USB packet transfer once UART completes transfer (transmitting data over Tx line) */ -// //USBD_CDC_ReceivePacket(UART_Handle_TO_CDC_CH(huart), &hUsbDevice); -//} -//void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) -//{ -// for (uint8_t i = 0; i < NUMBER_OF_CDC; i++) -// { -// uint32_t buffptr; -// uint32_t buffsize; -// -// if (Read_Index[i] != Write_Index[i]) -// { -// if (Read_Index[i] > Write_Index[i]) /* Rollback */ -// { -// buffsize = APP_TX_DATA_SIZE - Read_Index[i]; -// } -// else -// { -// buffsize = Write_Index[i] - Read_Index[i]; -// } -// -// buffptr = Read_Index[i]; -// -// USBD_CDC_SetTxBuffer(i, &hUsbDevice, &TX_Buffer[i][buffptr], buffsize); -// -// if (USBD_CDC_TransmitPacket(i, &hUsbDevice) == USBD_OK) -// { -// Read_Index[i] += buffsize; -// if (Read_Index[i] == APP_RX_DATA_SIZE) -// { -// Read_Index[i] = 0; -// } -// } -// } -// } -//} -//void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) -//{ -// uint8_t cdc_ch = UART_Handle_TO_CDC_CH(huart); -// /* Increment Index for buffer writing */ -// Write_Index[cdc_ch]++; -// -// /* To avoid buffer overflow */ -// if (Write_Index[cdc_ch] == APP_RX_DATA_SIZE) -// { -// Write_Index[cdc_ch] = 0; -// } -// -// /* Start another reception: provide the buffer pointer with offset and the buffer size */ -// HAL_UART_Receive_IT(huart, (TX_Buffer[cdc_ch] + Write_Index[cdc_ch]), 1); -//} -/* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/AL94_USB_Composite/App/usbd_cdc_acm_if.h b/common/AL94_USB_Composite/App/usbd_cdc_acm_if.h deleted file mode 100644 index 8a20ad2..0000000 --- a/common/AL94_USB_Composite/App/usbd_cdc_acm_if.h +++ /dev/null @@ -1,131 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : usbd_cdc_acm_if.h - * @version : v2.0_Cube - * @brief : Header for usbd_cdc_if.c file. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2020 STMicroelectronics. - * All rights reserved.

- * - * 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 */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CDC_ACM_IF_H__ -#define __USBD_CDC_ACM_IF_H__ - -#ifdef __cplusplus -extern "C" -{ -#endif - - /* Includes ------------------------------------------------------------------*/ -#include "usbd_cdc_acm.h" - - /* USER CODE BEGIN INCLUDE */ - - /* USER CODE END INCLUDE */ - - /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @brief For Usb device. - * @{ - */ - - /** @defgroup USBD_CDC_IF USBD_CDC_IF - * @brief Usb VCP device module - * @{ - */ - - /** @defgroup USBD_CDC_IF_Exported_Defines USBD_CDC_IF_Exported_Defines - * @brief Defines. - * @{ - */ - /* USER CODE BEGIN EXPORTED_DEFINES */ - - /* USER CODE END EXPORTED_DEFINES */ - - /** - * @} - */ - - /** @defgroup USBD_CDC_IF_Exported_Types USBD_CDC_IF_Exported_Types - * @brief Types. - * @{ - */ - - /* USER CODE BEGIN EXPORTED_TYPES */ - - /* USER CODE END EXPORTED_TYPES */ - - /** - * @} - */ - - /** @defgroup USBD_CDC_IF_Exported_Macros USBD_CDC_IF_Exported_Macros - * @brief Aliases. - * @{ - */ - - /* USER CODE BEGIN EXPORTED_MACRO */ - - /* USER CODE END EXPORTED_MACRO */ - - /** - * @} - */ - - /** @defgroup USBD_CDC_IF_Exported_Variables USBD_CDC_IF_Exported_Variables - * @brief Public variables. - * @{ - */ - - /** CDC Interface callback. */ - extern USBD_CDC_ACM_ItfTypeDef USBD_CDC_ACM_fops; - - /* USER CODE BEGIN EXPORTED_VARIABLES */ - - /* USER CODE END EXPORTED_VARIABLES */ - - /** - * @} - */ - - /** @defgroup USBD_CDC_IF_Exported_FunctionsPrototype USBD_CDC_IF_Exported_FunctionsPrototype - * @brief Public functions declaration. - * @{ - */ - - uint8_t CDC_Transmit (uint8_t ch, uint8_t *Buf, uint16_t Len); - -/* USER CODE BEGIN EXPORTED_FUNCTIONS */ - -/* USER CODE END EXPORTED_FUNCTIONS */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_CDC_ACM_IF_TEMPLATE_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/AL94_USB_Composite/App/usbd_desc.c b/common/AL94_USB_Composite/App/usbd_desc.c deleted file mode 100644 index a66a9e7..0000000 --- a/common/AL94_USB_Composite/App/usbd_desc.c +++ /dev/null @@ -1,415 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : App/usbd_desc.c - * @version : v1.0_Cube - * @brief : This file implements the USB device descriptors. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2021 STMicroelectronics. - * All rights reserved.

- * - * 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 */ -#include "usbd_composite.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 - * @{ - */ - -/** @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" -#if (USBD_USE_DFU == 1) -#define USBD_PID 57105 // for DFU PID must be 57105, ST proprietary modification -#else -#define USBD_PID 21156 -#endif -#define USBD_PRODUCT_STRING "STM32 COMPOSITE DEVICE" -#define USBD_CONFIGURATION_STRING "CONFIGURATION 0" -#define USBD_INTERFACE_STRING "COMPOSITE INTERFACE" - -/* USER CODE BEGIN PRIVATE_DEFINES */ - -//NOTE! USB Vendor and Product Information -#undef USBD_VID -#define USBD_VID 0x0000 // Vendor ID for Open Source Projects is "Generic" 0x1209 - -#undef USBD_MANUFACTURER_STRING -#define USBD_MANUFACTURER_STRING "VarmintWorks" - -#if (USBD_USE_DFU != 1) -#undef USBD_PID -#define USBD_PID 0x0001 // pid.codes Test PID for VID=0x1209 -#endif - -#undef USBD_PRODUCT_STRING -#define USBD_PRODUCT_STRING "rosflight controller" - -/* 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 HS. - * @{ - */ - -uint8_t* USBD_DeviceDescriptor (USBD_SpeedTypeDef speed, uint16_t *length); -uint8_t* USBD_LangIDStrDescriptor (USBD_SpeedTypeDef speed, uint16_t *length); -uint8_t* USBD_ManufacturerStrDescriptor (USBD_SpeedTypeDef speed, uint16_t *length); -uint8_t* USBD_ProductStrDescriptor (USBD_SpeedTypeDef speed, uint16_t *length); -uint8_t* USBD_SerialStrDescriptor (USBD_SpeedTypeDef speed, uint16_t *length); -uint8_t* USBD_ConfigStrDescriptor (USBD_SpeedTypeDef speed, uint16_t *length); -uint8_t* USBD_InterfaceStrDescriptor (USBD_SpeedTypeDef speed, uint16_t *length); - -/** - * @} - */ - -/** @defgroup USBD_DESC_Private_Variables USBD_DESC_Private_Variables - * @brief Private variables. - * @{ - */ - -USBD_DescriptorsTypeDef USBD_Desc = -{ USBD_DeviceDescriptor, USBD_LangIDStrDescriptor, USBD_ManufacturerStrDescriptor, USBD_ProductStrDescriptor, USBD_SerialStrDescriptor, - USBD_ConfigStrDescriptor, USBD_InterfaceStrDescriptor }; - -#if defined ( __ICCARM__ ) /* IAR Compiler */ - #pragma data_alignment=4 -#endif /* defined ( __ICCARM__ ) */ -/** USB standard device descriptor. */ -__ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = -{ 0x12, /*bLength */ -USB_DESC_TYPE_DEVICE, /*bDescriptorType*/ -0x00, /*bcdUSB */ -0x02, 0xEF, /*bDeviceClass*/ -0x02, /*bDeviceSubClass*/ -0x01, /*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*/ -}; - -/** - * @} - */ - -/** @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_DeviceDescriptor (USBD_SpeedTypeDef speed, uint16_t *length) -{ - UNUSED(speed); - *length = sizeof(USBD_DeviceDesc); - return USBD_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_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_ProductStrDescriptor (USBD_SpeedTypeDef speed, uint16_t *length) -{ - if (speed == 0) - { - USBD_GetString ((uint8_t*) USBD_PRODUCT_STRING, USBD_StrDesc, length); - } - else - { - USBD_GetString ((uint8_t*) USBD_PRODUCT_STRING, 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_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_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_SerialStrDescriptor */ - - /* USER CODE END USBD_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_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; -} - -/** - * @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_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; -} - -#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_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) -{ - UNUSED(speed); - *length = sizeof(USBD_BOSDesc); - return (uint8_t*)USBD_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****/ diff --git a/common/AL94_USB_Composite/App/usbd_desc.h b/common/AL94_USB_Composite/App/usbd_desc.h deleted file mode 100644 index 71b5248..0000000 --- a/common/AL94_USB_Composite/App/usbd_desc.h +++ /dev/null @@ -1,146 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : usbd_desc.c - * @version : v1.0_Cube - * @brief : Header for usbd_conf.c file. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2021 STMicroelectronics. - * All rights reserved.

- * - * 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 */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_DESC__C__ -#define __USBD_DESC__C__ - -#ifdef __cplusplus -extern "C" -{ -#endif - - /* Includes ------------------------------------------------------------------*/ -#include "usbd_def.h" - - /* USER CODE BEGIN INCLUDE */ - - /* USER CODE END INCLUDE */ - - /** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY - * @{ - */ - - /** @defgroup USBD_DESC USBD_DESC - * @brief Usb device descriptors module. - * @{ - */ - - /** @defgroup USBD_DESC_Exported_Constants USBD_DESC_Exported_Constants - * @brief Constants. - * @{ - */ -#define DEVICE_ID1 (UID_BASE) -#define DEVICE_ID2 (UID_BASE + 0x4) -#define DEVICE_ID3 (UID_BASE + 0x8) - -#define USB_SIZ_STRING_SERIAL 0x1A - - /* USER CODE BEGIN EXPORTED_CONSTANTS */ - - /* USER CODE END EXPORTED_CONSTANTS */ - - /** - * @} - */ - - /** @defgroup USBD_DESC_Exported_Defines USBD_DESC_Exported_Defines - * @brief Defines. - * @{ - */ - - /* USER CODE BEGIN EXPORTED_DEFINES */ - - /* USER CODE END EXPORTED_DEFINES */ - - /** - * @} - */ - - /** @defgroup USBD_DESC_Exported_TypesDefinitions USBD_DESC_Exported_TypesDefinitions - * @brief Types. - * @{ - */ - - /* USER CODE BEGIN EXPORTED_TYPES */ - - /* USER CODE END EXPORTED_TYPES */ - - /** - * @} - */ - - /** @defgroup USBD_DESC_Exported_Macros USBD_DESC_Exported_Macros - * @brief Aliases. - * @{ - */ - - /* USER CODE BEGIN EXPORTED_MACRO */ - - /* USER CODE END EXPORTED_MACRO */ - - /** - * @} - */ - - /** @defgroup USBD_DESC_Exported_Variables USBD_DESC_Exported_Variables - * @brief Public variables. - * @{ - */ - - /** Descriptor for the Usb device. */ - extern USBD_DescriptorsTypeDef USBD_Desc; - -/* USER CODE BEGIN EXPORTED_VARIABLES */ - -/* USER CODE END EXPORTED_VARIABLES */ - -/** - * @} - */ - -/** @defgroup USBD_DESC_Exported_FunctionsPrototype USBD_DESC_Exported_FunctionsPrototype - * @brief Public functions declaration. - * @{ - */ - -/* USER CODE BEGIN EXPORTED_FUNCTIONS */ - -/* USER CODE END EXPORTED_FUNCTIONS */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_DESC__C__ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/AL94_USB_Composite/Class/CDC_ACM/Inc/usbd_cdc_acm.h b/common/AL94_USB_Composite/Class/CDC_ACM/Inc/usbd_cdc_acm.h deleted file mode 100644 index a0784df..0000000 --- a/common/AL94_USB_Composite/Class/CDC_ACM/Inc/usbd_cdc_acm.h +++ /dev/null @@ -1,180 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc.h - * @author MCD Application Team - * @brief header file for the usbd_cdc.c file. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2015 STMicroelectronics. - * All rights reserved.

- * - * 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 - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_CDC_H -#define __USB_CDC_H - -#ifdef __cplusplus -extern "C" -{ -#endif - - /* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" -#include // NOTE! replaced "AL94.I-CUBE-USBD-COMPOSITE_conf.h" - /** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - /** @defgroup usbd_cdc - * @brief This file is the Header file for usbd_cdc.c - * @{ - */ - - /** @defgroup usbd_cdc_Exported_Defines - * @{ - */ - -#define CDC_ACM_STR_DESC "STM32 CDC ACM%d" - -#define NUMBER_OF_CDC _USBD_CDC_ACM_COUNT -#ifndef CDC_HS_BINTERVAL -#define CDC_HS_BINTERVAL 0x10U -#endif /* CDC_HS_BINTERVAL */ - -#ifndef CDC_FS_BINTERVAL -#define CDC_FS_BINTERVAL 0x10U -#endif /* CDC_FS_BINTERVAL */ - - /* CDC Endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */ -#define CDC_DATA_HS_MAX_PACKET_SIZE 512U /* Endpoint IN & OUT Packet size */ -#define CDC_DATA_FS_MAX_PACKET_SIZE 64U /* Endpoint IN & OUT Packet size */ -#define CDC_CMD_PACKET_SIZE 8U /* Control Endpoint Packet size */ - -#define USB_CDC_CONFIG_DESC_SIZ (9 + 66 * NUMBER_OF_CDC) -#define CDC_DATA_HS_IN_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE -#define CDC_DATA_HS_OUT_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE - -#define CDC_DATA_FS_IN_PACKET_SIZE CDC_DATA_FS_MAX_PACKET_SIZE -#define CDC_DATA_FS_OUT_PACKET_SIZE CDC_DATA_FS_MAX_PACKET_SIZE - -#define CDC_REQ_MAX_DATA_SIZE 0x7U - /*---------------------------------------------------------------------*/ - /* CDC definitions */ - /*---------------------------------------------------------------------*/ -#define CDC_SEND_ENCAPSULATED_COMMAND 0x00U -#define CDC_GET_ENCAPSULATED_RESPONSE 0x01U -#define CDC_SET_COMM_FEATURE 0x02U -#define CDC_GET_COMM_FEATURE 0x03U -#define CDC_CLEAR_COMM_FEATURE 0x04U -#define CDC_SET_LINE_CODING 0x20U -#define CDC_GET_LINE_CODING 0x21U -#define CDC_SET_CONTROL_LINE_STATE 0x22U -#define CDC_SEND_BREAK 0x23U - - /** - * @} - */ - - /** @defgroup USBD_CORE_Exported_TypesDefinitions - * @{ - */ - - /** - * @} - */ - typedef struct - { - uint32_t bitrate; - uint8_t format; - uint8_t paritytype; - uint8_t datatype; - } USBD_CDC_ACM_LineCodingTypeDef; - - typedef struct _USBD_CDC_Itf - { - int8_t (*Init) (uint8_t cdc_ch); - int8_t (*DeInit) (uint8_t cdc_ch); - int8_t (*Control) (uint8_t cdc_ch, uint8_t cmd, uint8_t *pbuf, uint16_t length); - int8_t (*Receive) (uint8_t cdc_ch, uint8_t *Buf, uint32_t *Len); - int8_t (*TransmitCplt) (uint8_t cdc_ch, uint8_t *Buf, uint32_t *Len, uint8_t epnum); - } USBD_CDC_ACM_ItfTypeDef; - - typedef struct - { - uint32_t data[NUMBER_OF_CDC][CDC_DATA_HS_MAX_PACKET_SIZE / 4U]; /* Force 32bits alignment */ - uint8_t CmdOpCode; - uint8_t CmdLength; - uint8_t *RxBuffer; - uint8_t *TxBuffer; - uint32_t RxLength; - uint32_t TxLength; - - __IO uint32_t TxState; - __IO uint32_t RxState; - } USBD_CDC_ACM_HandleTypeDef; - - /** @defgroup USBD_CORE_Exported_Macros - * @{ - */ - - /** - * @} - */ - - /** @defgroup USBD_CORE_Exported_Variables - * @{ - */ - - extern USBD_ClassTypeDef USBD_CDC_ACM; - - extern uint8_t CDC_IN_EP[NUMBER_OF_CDC]; /* EP1 for data IN */ - extern uint8_t CDC_OUT_EP[NUMBER_OF_CDC]; /* EP1 for data OUT */ - extern uint8_t CDC_CMD_EP[NUMBER_OF_CDC]; /* EP2 for CDC commands */ - - extern uint8_t CDC_CMD_ITF_NBR[NUMBER_OF_CDC]; /* Command Interface Number */ - extern uint8_t CDC_COM_ITF_NBR[NUMBER_OF_CDC]; /* Communication Interface Number */ - - extern uint8_t CDC_STR_DESC_IDX[NUMBER_OF_CDC]; - - /** - * @} - */ - - /** @defgroup USB_CORE_Exported_Functions - * @{ - */ - uint8_t USBD_CDC_ACM_RegisterInterface (USBD_HandleTypeDef *pdev, USBD_CDC_ACM_ItfTypeDef *fops); - - uint8_t USBD_CDC_SetTxBuffer (uint8_t ch, USBD_HandleTypeDef *pdev, uint8_t *pbuff, uint32_t length); - - uint8_t USBD_CDC_SetRxBuffer (uint8_t ch, USBD_HandleTypeDef *pdev, uint8_t *pbuff); - uint8_t USBD_CDC_ReceivePacket (uint8_t ch, USBD_HandleTypeDef *pdev); - uint8_t USBD_CDC_TransmitPacket (uint8_t ch, USBD_HandleTypeDef *pdev); - - void USBD_Update_CDC_ACM_DESC (uint8_t *desc, uint8_t cmd_itf, uint8_t com_itf, uint8_t in_ep, uint8_t cmd_ep, uint8_t out_ep, uint8_t str_idx); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_CDC_H */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/AL94_USB_Composite/Class/CDC_ACM/Src/usbd_cdc_acm.c b/common/AL94_USB_Composite/Class/CDC_ACM/Src/usbd_cdc_acm.c deleted file mode 100644 index 2f83924..0000000 --- a/common/AL94_USB_Composite/Class/CDC_ACM/Src/usbd_cdc_acm.c +++ /dev/null @@ -1,2175 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_cdc.c - * @author MCD Application Team - * @brief This file provides the high layer firmware functions to manage the - * following functionalities of the USB CDC Class: - * - Initialization and Configuration of high and low layer - * - Enumeration as CDC Device (and enumeration for each implemented memory interface) - * - OUT/IN data transfer - * - Command IN transfer (class requests management) - * - Error management - * - * @verbatim - * - * =================================================================== - * CDC Class Driver Description - * =================================================================== - * This driver manages the "Universal Serial Bus Class Definitions for Communications Devices - * Revision 1.2 November 16, 2007" and the sub-protocol specification of "Universal Serial Bus - * Communications Class Subclass Specification for PSTN Devices Revision 1.2 February 9, 2007" - * This driver implements the following aspects of the specification: - * - Device descriptor management - * - Configuration descriptor management - * - Enumeration as CDC device with 2 data endpoints (IN and OUT) and 1 command endpoint (IN) - * - Requests management (as described in section 6.2 in specification) - * - Abstract Control Model compliant - * - Union Functional collection (using 1 IN endpoint for control) - * - Data interface class - * - * These aspects may be enriched or modified for a specific user application. - * - * This driver doesn't implement the following aspects of the specification - * (but it is possible to manage these features with some modifications on this driver): - * - Any class-specific aspect relative to communication classes should be managed by user application. - * - All communication classes other than PSTN are not managed - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2015 STMicroelectronics. - * All rights reserved.

- * - * 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 - * - ****************************************************************************** - */ - -/* BSPDependencies - - "stm32xxxxx_{eval}{discovery}{nucleo_144}.c" - - "stm32xxxxx_{eval}{discovery}_io.c" - EndBSPDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_cdc_acm.h" -#include "usbd_ctlreq.h" - -#define _CDC_IN_EP 0x81U /* EP1 for data IN */ -#define _CDC_OUT_EP 0x01U /* EP1 for data OUT */ -#define _CDC_CMD_EP 0x82U /* EP2 for CDC commands */ - -#define _CDC_CMD_ITF_NBR 0x00U /* Command Interface Number */ -#define _CDC_COM_ITF_NBR 0x01U /* Communication Interface Number */ - -#define _CDC_STR_DESC_IDX 0x00 - -uint8_t CDC_IN_EP[NUMBER_OF_CDC]; -uint8_t CDC_OUT_EP[NUMBER_OF_CDC]; -uint8_t CDC_CMD_EP[NUMBER_OF_CDC]; - -uint8_t CDC_CMD_ITF_NBR[NUMBER_OF_CDC]; -uint8_t CDC_COM_ITF_NBR[NUMBER_OF_CDC]; - -uint8_t CDC_STR_DESC_IDX[NUMBER_OF_CDC]; - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_CDC - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_CDC_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_CDC_Private_Defines - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_CDC_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CDC_Private_FunctionPrototypes - * @{ - */ - -static uint8_t USBD_CDC_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_CDC_DeInit (USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_CDC_Setup (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static uint8_t USBD_CDC_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_CDC_DataOut (USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_CDC_EP0_RxReady (USBD_HandleTypeDef *pdev); - -static uint8_t* USBD_CDC_GetFSCfgDesc (uint16_t *length); -static uint8_t* USBD_CDC_GetHSCfgDesc (uint16_t *length); -static uint8_t* USBD_CDC_GetOtherSpeedCfgDesc (uint16_t *length); -static uint8_t* USBD_CDC_GetOtherSpeedCfgDesc (uint16_t *length); -static uint8_t* USBD_CDC_GetDeviceQualifierDescriptor (uint16_t *length); - -USBD_CDC_ACM_HandleTypeDef CDC_ACM_Class_Data[NUMBER_OF_CDC]; - -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_CDC_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = -{ -USB_LEN_DEV_QUALIFIER_DESC, -USB_DESC_TYPE_DEVICE_QUALIFIER, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, }; - -/** - * @} - */ - -/** @defgroup USBD_CDC_Private_Variables - * @{ - */ - -/* CDC interface class callbacks structure */ -USBD_ClassTypeDef USBD_CDC_ACM = -{ USBD_CDC_Init, USBD_CDC_DeInit, USBD_CDC_Setup, -NULL, /* EP0_TxSent, */ -USBD_CDC_EP0_RxReady, USBD_CDC_DataIn, USBD_CDC_DataOut, -NULL, -NULL, -NULL, USBD_CDC_GetHSCfgDesc, USBD_CDC_GetFSCfgDesc, USBD_CDC_GetOtherSpeedCfgDesc, USBD_CDC_GetDeviceQualifierDescriptor, }; - -/* USB CDC device Configuration Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_CDC_CfgHSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = -{ -/* Configuration Descriptor */ -0x09, /* bLength: Configuration Descriptor size */ -USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ -LOBYTE(USB_CDC_CONFIG_DESC_SIZ), /* wTotalLength:no of returned bytes */ -HIBYTE(USB_CDC_CONFIG_DESC_SIZ), (2 * NUMBER_OF_CDC), /* bNumInterfaces: 2 interface */ -0x01, /* bConfigurationValue: Configuration value */ -0x00, /* iConfiguration: Index of string descriptor describing the configuration */ -#if (USBD_SELF_POWERED == 1U) - 0xC0, /* bmAttributes: Bus Powered according to user configuration */ -#else - 0x80, /* bmAttributes: Bus Powered according to user configuration */ -#endif - USBD_MAX_POWER, /* MaxPower 100 mA */ - - /******************** CDC0 block ********************/ - /******** IAD to associate the two CDC interfaces */ - 0x08, /* bLength */ - 0x0B, /* bDescriptorType */ - _CDC_CMD_ITF_NBR, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - 0x02, /* bFunctionClass */ - 0x02, /* bFunctionSubClass */ - 0x01, /* bFunctionProtocol */ - 0x00, /* iFunction (Index of string descriptor describing this function) */ - - /* Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - _CDC_STR_DESC_IDX, /* iInterface: */ - - /* Header Functional Descriptor */ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /* Call Management Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ - - /* ACM Functional Descriptor */ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /* Union Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ - _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ - - /* Endpoint 2 Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_HS_BINTERVAL, /* bInterval: */ - /*---------------------------------------------------------------------------*/ - - /* Data class interface descriptor */ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ - - /* Endpoint OUT Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ - - /* Endpoint IN Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ - -#if (NUMBER_OF_CDC > 1) - /******************** CDC1 block ********************/ - /******** IAD to associate the two CDC interfaces */ - 0x08, /* bLength */ - 0x0B, /* bDescriptorType */ - _CDC_CMD_ITF_NBR, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - 0x02, /* bFunctionClass */ - 0x02, /* bFunctionSubClass */ - 0x01, /* bFunctionProtocol */ - 0x00, /* iFunction (Index of string descriptor describing this function) */ - - /* Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - _CDC_STR_DESC_IDX, /* iInterface: */ - - /* Header Functional Descriptor */ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /* Call Management Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ - - /* ACM Functional Descriptor */ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /* Union Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ - _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ - - /* Endpoint 2 Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_HS_BINTERVAL, /* bInterval: */ - /*---------------------------------------------------------------------------*/ - - /* Data class interface descriptor */ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ - - /* Endpoint OUT Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ - - /* Endpoint IN Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ -#endif - -#if (NUMBER_OF_CDC > 2) - /******************** CDC2 block ********************/ - /******** IAD to associate the two CDC interfaces */ - 0x08, /* bLength */ - 0x0B, /* bDescriptorType */ - _CDC_CMD_ITF_NBR, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - 0x02, /* bFunctionClass */ - 0x02, /* bFunctionSubClass */ - 0x01, /* bFunctionProtocol */ - 0x00, /* iFunction (Index of string descriptor describing this function) */ - - /* Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - _CDC_STR_DESC_IDX, /* iInterface: */ - - /* Header Functional Descriptor */ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /* Call Management Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ - - /* ACM Functional Descriptor */ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /* Union Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ - _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ - - /* Endpoint 2 Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_HS_BINTERVAL, /* bInterval: */ - /*---------------------------------------------------------------------------*/ - - /* Data class interface descriptor */ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ - - /* Endpoint OUT Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ - - /* Endpoint IN Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ -#endif - -#if (NUMBER_OF_CDC > 3) - /******************** CDC3 block ********************/ - /******** IAD to associate the two CDC interfaces */ - 0x08, /* bLength */ - 0x0B, /* bDescriptorType */ - _CDC_CMD_ITF_NBR, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - 0x02, /* bFunctionClass */ - 0x02, /* bFunctionSubClass */ - 0x01, /* bFunctionProtocol */ - 0x00, /* iFunction (Index of string descriptor describing this function) */ - - /* Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - _CDC_STR_DESC_IDX, /* iInterface: */ - - /* Header Functional Descriptor */ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /* Call Management Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ - - /* ACM Functional Descriptor */ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /* Union Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ - _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ - - /* Endpoint 2 Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_HS_BINTERVAL, /* bInterval: */ - /*---------------------------------------------------------------------------*/ - - /* Data class interface descriptor */ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ - - /* Endpoint OUT Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ - - /* Endpoint IN Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ -#endif - -#if (NUMBER_OF_CDC > 4) - /******************** CDC4 block ********************/ - /******** IAD to associate the two CDC interfaces */ - 0x08, /* bLength */ - 0x0B, /* bDescriptorType */ - _CDC_CMD_ITF_NBR, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - 0x02, /* bFunctionClass */ - 0x02, /* bFunctionSubClass */ - 0x01, /* bFunctionProtocol */ - 0x00, /* iFunction (Index of string descriptor describing this function) */ - - /* Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - _CDC_STR_DESC_IDX, /* iInterface: */ - - /* Header Functional Descriptor */ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /* Call Management Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ - - /* ACM Functional Descriptor */ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /* Union Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ - _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ - - /* Endpoint 2 Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_HS_BINTERVAL, /* bInterval: */ - /*---------------------------------------------------------------------------*/ - - /* Data class interface descriptor */ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ - - /* Endpoint OUT Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ - - /* Endpoint IN Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ -#endif - -#if (NUMBER_OF_CDC > 5) - /******************** CDC5 block ********************/ - /******** IAD to associate the two CDC interfaces */ - 0x08, /* bLength */ - 0x0B, /* bDescriptorType */ - _CDC_CMD_ITF_NBR, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - 0x02, /* bFunctionClass */ - 0x02, /* bFunctionSubClass */ - 0x01, /* bFunctionProtocol */ - 0x00, /* iFunction (Index of string descriptor describing this function) */ - - /* Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - _CDC_STR_DESC_IDX, /* iInterface: */ - - /* Header Functional Descriptor */ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /* Call Management Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ - - /* ACM Functional Descriptor */ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /* Union Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ - _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ - - /* Endpoint 2 Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_HS_BINTERVAL, /* bInterval: */ - /*---------------------------------------------------------------------------*/ - - /* Data class interface descriptor */ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ - - /* Endpoint OUT Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ - - /* Endpoint IN Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ -#endif - -#if (NUMBER_OF_CDC > 6) - /******************** CDC6 block ********************/ - /******** IAD to associate the two CDC interfaces */ - 0x08, /* bLength */ - 0x0B, /* bDescriptorType */ - _CDC_CMD_ITF_NBR, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - 0x02, /* bFunctionClass */ - 0x02, /* bFunctionSubClass */ - 0x01, /* bFunctionProtocol */ - 0x00, /* iFunction (Index of string descriptor describing this function) */ - - /* Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - _CDC_STR_DESC_IDX, /* iInterface: */ - - /* Header Functional Descriptor */ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /* Call Management Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ - - /* ACM Functional Descriptor */ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /* Union Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ - _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ - - /* Endpoint 2 Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_HS_BINTERVAL, /* bInterval: */ - /*---------------------------------------------------------------------------*/ - - /* Data class interface descriptor */ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ - - /* Endpoint OUT Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ - - /* Endpoint IN Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ -#endif - -#if (NUMBER_OF_CDC > 7) - /******************** CDC7 block ********************/ - /******** IAD to associate the two CDC interfaces */ - 0x08, /* bLength */ - 0x0B, /* bDescriptorType */ - _CDC_CMD_ITF_NBR, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - 0x02, /* bFunctionClass */ - 0x02, /* bFunctionSubClass */ - 0x01, /* bFunctionProtocol */ - 0x00, /* iFunction (Index of string descriptor describing this function) */ - - /* Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - _CDC_STR_DESC_IDX, /* iInterface: */ - - /* Header Functional Descriptor */ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /* Call Management Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ - - /* ACM Functional Descriptor */ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /* Union Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ - _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ - - /* Endpoint 2 Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_HS_BINTERVAL, /* bInterval: */ - /*---------------------------------------------------------------------------*/ - - /* Data class interface descriptor */ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ - - /* Endpoint OUT Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ - - /* Endpoint IN Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), - 0x00 /* bInterval: ignore for Bulk transfer */ -#endif - }; - -/* USB CDC device Configuration Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_CDC_CfgFSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = -{ -/* Configuration Descriptor */ -0x09, /* bLength: Configuration Descriptor size */ -USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ -LOBYTE(USB_CDC_CONFIG_DESC_SIZ), /* wTotalLength:no of returned bytes */ -HIBYTE(USB_CDC_CONFIG_DESC_SIZ), 0x02, /* bNumInterfaces: 2 interface */ -0x01, /* bConfigurationValue: Configuration value */ -0x00, /* iConfiguration: Index of string descriptor describing the configuration */ -#if (USBD_SELF_POWERED == 1U) - 0xC0, /* bmAttributes: Bus Powered according to user configuration */ -#else - 0x80, /* bmAttributes: Bus Powered according to user configuration */ -#endif - USBD_MAX_POWER, /* MaxPower 100 mA */ - - /*---------------------------------------------------------------------------*/ - /******************** CDC0 block ********************/ - /******** IAD to associate the two CDC interfaces */ - 0x08, /* bLength */ - 0x0B, /* bDescriptorType */ - _CDC_CMD_ITF_NBR, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - 0x02, /* bFunctionClass */ - 0x02, /* bFunctionSubClass */ - 0x01, /* bFunctionProtocol */ - 0x00, /* iFunction (Index of string descriptor describing this function) */ - - /* Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - /* Interface descriptor type */ - _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - _CDC_STR_DESC_IDX,/* iInterface: */ - - /* Header Functional Descriptor */ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /* Call Management Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ - - /* ACM Functional Descriptor */ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /* Union Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ - _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ - - /* Endpoint 2 Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_FS_BINTERVAL, /* bInterval: */ - /*---------------------------------------------------------------------------*/ - - /* Data class interface descriptor */ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ - - /* Endpoint OUT Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ - - /* Endpoint IN Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ - -#if (NUMBER_OF_CDC > 1) - /******************** CDC1 block ********************/ - /******** IAD to associate the two CDC interfaces */ - 0x08, /* bLength */ - 0x0B, /* bDescriptorType */ - _CDC_CMD_ITF_NBR, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - 0x02, /* bFunctionClass */ - 0x02, /* bFunctionSubClass */ - 0x01, /* bFunctionProtocol */ - 0x00, /* iFunction (Index of string descriptor describing this function) */ - - /* Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - /* Interface descriptor type */ - _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - _CDC_STR_DESC_IDX,/* iInterface: */ - - /* Header Functional Descriptor */ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /* Call Management Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ - - /* ACM Functional Descriptor */ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /* Union Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ - _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ - - /* Endpoint 2 Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_FS_BINTERVAL, /* bInterval: */ - /*---------------------------------------------------------------------------*/ - - /* Data class interface descriptor */ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ - - /* Endpoint OUT Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ - - /* Endpoint IN Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ -#endif - -#if (NUMBER_OF_CDC > 2) - /******************** CDC2 block ********************/ - /******** IAD to associate the two CDC interfaces */ - 0x08, /* bLength */ - 0x0B, /* bDescriptorType */ - _CDC_CMD_ITF_NBR, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - 0x02, /* bFunctionClass */ - 0x02, /* bFunctionSubClass */ - 0x01, /* bFunctionProtocol */ - 0x00, /* iFunction (Index of string descriptor describing this function) */ - - /* Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - /* Interface descriptor type */ - _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - _CDC_STR_DESC_IDX,/* iInterface: */ - - /* Header Functional Descriptor */ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /* Call Management Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ - - /* ACM Functional Descriptor */ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /* Union Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ - _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ - - /* Endpoint 2 Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_FS_BINTERVAL, /* bInterval: */ - /*---------------------------------------------------------------------------*/ - - /* Data class interface descriptor */ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ - - /* Endpoint OUT Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ - - /* Endpoint IN Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ -#endif - -#if (NUMBER_OF_CDC > 3) - /******************** CDC3 block ********************/ - /******** IAD to associate the two CDC interfaces */ - 0x08, /* bLength */ - 0x0B, /* bDescriptorType */ - _CDC_CMD_ITF_NBR, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - 0x02, /* bFunctionClass */ - 0x02, /* bFunctionSubClass */ - 0x01, /* bFunctionProtocol */ - 0x00, /* iFunction (Index of string descriptor describing this function) */ - - /* Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - /* Interface descriptor type */ - _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - _CDC_STR_DESC_IDX,/* iInterface: */ - - /* Header Functional Descriptor */ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /* Call Management Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ - - /* ACM Functional Descriptor */ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /* Union Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ - _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ - - /* Endpoint 2 Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_FS_BINTERVAL, /* bInterval: */ - /*---------------------------------------------------------------------------*/ - - /* Data class interface descriptor */ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ - - /* Endpoint OUT Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ - - /* Endpoint IN Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ -#endif - -#if (NUMBER_OF_CDC > 4) - /******************** CDC4 block ********************/ - /******** IAD to associate the two CDC interfaces */ - 0x08, /* bLength */ - 0x0B, /* bDescriptorType */ - _CDC_CMD_ITF_NBR, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - 0x02, /* bFunctionClass */ - 0x02, /* bFunctionSubClass */ - 0x01, /* bFunctionProtocol */ - 0x00, /* iFunction (Index of string descriptor describing this function) */ - - /* Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - /* Interface descriptor type */ - _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - _CDC_STR_DESC_IDX,/* iInterface: */ - - /* Header Functional Descriptor */ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /* Call Management Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ - - /* ACM Functional Descriptor */ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /* Union Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ - _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ - - /* Endpoint 2 Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_FS_BINTERVAL, /* bInterval: */ - /*---------------------------------------------------------------------------*/ - - /* Data class interface descriptor */ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ - - /* Endpoint OUT Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ - - /* Endpoint IN Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ -#endif - -#if (NUMBER_OF_CDC > 5) - /******************** CDC5 block ********************/ - /******** IAD to associate the two CDC interfaces */ - 0x08, /* bLength */ - 0x0B, /* bDescriptorType */ - _CDC_CMD_ITF_NBR, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - 0x02, /* bFunctionClass */ - 0x02, /* bFunctionSubClass */ - 0x01, /* bFunctionProtocol */ - 0x00, /* iFunction (Index of string descriptor describing this function) */ - - /* Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - /* Interface descriptor type */ - _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - _CDC_STR_DESC_IDX,/* iInterface: */ - - /* Header Functional Descriptor */ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /* Call Management Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ - - /* ACM Functional Descriptor */ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /* Union Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ - _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ - - /* Endpoint 2 Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_FS_BINTERVAL, /* bInterval: */ - /*---------------------------------------------------------------------------*/ - - /* Data class interface descriptor */ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ - - /* Endpoint OUT Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ - - /* Endpoint IN Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ -#endif - -#if (NUMBER_OF_CDC > 6) - /******************** CDC6 block ********************/ - /******** IAD to associate the two CDC interfaces */ - 0x08, /* bLength */ - 0x0B, /* bDescriptorType */ - _CDC_CMD_ITF_NBR, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - 0x02, /* bFunctionClass */ - 0x02, /* bFunctionSubClass */ - 0x01, /* bFunctionProtocol */ - 0x00, /* iFunction (Index of string descriptor describing this function) */ - - /* Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - /* Interface descriptor type */ - _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - _CDC_STR_DESC_IDX,/* iInterface: */ - - /* Header Functional Descriptor */ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /* Call Management Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ - - /* ACM Functional Descriptor */ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /* Union Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ - _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ - - /* Endpoint 2 Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_FS_BINTERVAL, /* bInterval: */ - /*---------------------------------------------------------------------------*/ - - /* Data class interface descriptor */ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ - - /* Endpoint OUT Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ - - /* Endpoint IN Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ -#endif - -#if (NUMBER_OF_CDC > 7) - /******************** CDC7 block ********************/ - /******** IAD to associate the two CDC interfaces */ - 0x08, /* bLength */ - 0x0B, /* bDescriptorType */ - _CDC_CMD_ITF_NBR, /* bFirstInterface */ - 0x02, /* bInterfaceCount */ - 0x02, /* bFunctionClass */ - 0x02, /* bFunctionSubClass */ - 0x01, /* bFunctionProtocol */ - 0x00, /* iFunction (Index of string descriptor describing this function) */ - - /* Interface Descriptor */ - 0x09, /* bLength: Interface Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ - /* Interface descriptor type */ - _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x01, /* bNumEndpoints: One endpoints used */ - 0x02, /* bInterfaceClass: Communication Interface Class */ - 0x02, /* bInterfaceSubClass: Abstract Control Model */ - 0x01, /* bInterfaceProtocol: Common AT commands */ - _CDC_STR_DESC_IDX,/* iInterface: */ - - /* Header Functional Descriptor */ - 0x05, /* bLength: Endpoint Descriptor size */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x00, /* bDescriptorSubtype: Header Func Desc */ - 0x10, /* bcdCDC: spec release number */ - 0x01, - - /* Call Management Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x01, /* bDescriptorSubtype: Call Management Func Desc */ - 0x00, /* bmCapabilities: D0+D1 */ - _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ - - /* ACM Functional Descriptor */ - 0x04, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ - 0x02, /* bmCapabilities */ - - /* Union Functional Descriptor */ - 0x05, /* bFunctionLength */ - 0x24, /* bDescriptorType: CS_INTERFACE */ - 0x06, /* bDescriptorSubtype: Union func desc */ - _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ - _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ - - /* Endpoint 2 Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_CMD_EP, /* bEndpointAddress */ - 0x03, /* bmAttributes: Interrupt */ - LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_CMD_PACKET_SIZE), - CDC_FS_BINTERVAL, /* bInterval: */ - /*---------------------------------------------------------------------------*/ - - /* Data class interface descriptor */ - 0x09, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ - _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ - 0x00, /* bAlternateSetting: Alternate setting */ - 0x02, /* bNumEndpoints: Two endpoints used */ - 0x0A, /* bInterfaceClass: CDC */ - 0x00, /* bInterfaceSubClass: */ - 0x00, /* bInterfaceProtocol: */ - 0x00, /* iInterface: */ - - /* Endpoint OUT Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_OUT_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00, /* bInterval: ignore for Bulk transfer */ - - /* Endpoint IN Descriptor */ - 0x07, /* bLength: Endpoint Descriptor size */ - USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ - _CDC_IN_EP, /* bEndpointAddress */ - 0x02, /* bmAttributes: Bulk */ - LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ - HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), - 0x00 /* bInterval: ignore for Bulk transfer */ -#endif - }; - -/** - * @} - */ - -/** @defgroup USBD_CDC_Private_Functions - * @{ - */ - -/** - * @brief USBD_CDC_Init - * Initialize the CDC interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_CDC_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - USBD_CDC_ACM_HandleTypeDef *hcdc = NULL; - - for (uint8_t i = 0; i < NUMBER_OF_CDC; i++) - { - hcdc = &CDC_ACM_Class_Data[i]; - - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - /* Open EP IN */ - (void) USBD_LL_OpenEP (pdev, CDC_IN_EP[i], USBD_EP_TYPE_BULK, - CDC_DATA_HS_IN_PACKET_SIZE); - - pdev->ep_in[CDC_IN_EP[i] & 0xFU].is_used = 1U; - - /* Open EP OUT */ - (void) USBD_LL_OpenEP (pdev, CDC_OUT_EP[i], USBD_EP_TYPE_BULK, - CDC_DATA_HS_OUT_PACKET_SIZE); - - pdev->ep_out[CDC_OUT_EP[i] & 0xFU].is_used = 1U; - - /* Set bInterval for CDC CMD Endpoint */ - pdev->ep_in[CDC_CMD_EP[i] & 0xFU].bInterval = CDC_HS_BINTERVAL; - } - else - { - /* Open EP IN */ - (void) USBD_LL_OpenEP (pdev, CDC_IN_EP[i], USBD_EP_TYPE_BULK, - CDC_DATA_FS_IN_PACKET_SIZE); - - pdev->ep_in[CDC_IN_EP[i] & 0xFU].is_used = 1U; - - /* Open EP OUT */ - (void) USBD_LL_OpenEP (pdev, CDC_OUT_EP[i], USBD_EP_TYPE_BULK, - CDC_DATA_FS_OUT_PACKET_SIZE); - - pdev->ep_out[CDC_OUT_EP[i] & 0xFU].is_used = 1U; - - /* Set bInterval for CMD Endpoint */ - pdev->ep_in[CDC_CMD_EP[i] & 0xFU].bInterval = CDC_FS_BINTERVAL; - } - - /* Open Command IN EP */ - (void) USBD_LL_OpenEP (pdev, CDC_CMD_EP[i], USBD_EP_TYPE_INTR, CDC_CMD_PACKET_SIZE); - pdev->ep_in[CDC_CMD_EP[i] & 0xFU].is_used = 1U; - - /* Init physical Interface components */ - ((USBD_CDC_ACM_ItfTypeDef*) pdev->pUserData_CDC_ACM)->Init (i); - - /* Init Xfer states */ - hcdc->TxState = 0U; - hcdc->RxState = 0U; - - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - /* Prepare Out endpoint to receive next packet */ - (void) USBD_LL_PrepareReceive (pdev, CDC_OUT_EP[i], hcdc->RxBuffer, - CDC_DATA_HS_OUT_PACKET_SIZE); - } - else - { - /* Prepare Out endpoint to receive next packet */ - (void) USBD_LL_PrepareReceive (pdev, CDC_OUT_EP[i], hcdc->RxBuffer, - CDC_DATA_FS_OUT_PACKET_SIZE); - } - } - return (uint8_t) USBD_OK; -} - -/** - * @brief USBD_CDC_Init - * DeInitialize the CDC layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_CDC_DeInit (USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - UNUSED(cfgidx); - for (uint8_t i = 0; i < NUMBER_OF_CDC; i++) - { - /* Close EP IN */ - (void) USBD_LL_CloseEP (pdev, CDC_IN_EP[i]); - pdev->ep_in[CDC_IN_EP[i] & 0xFU].is_used = 0U; - - /* Close EP OUT */ - (void) USBD_LL_CloseEP (pdev, CDC_OUT_EP[i]); - pdev->ep_out[CDC_OUT_EP[i] & 0xFU].is_used = 0U; - - /* Close Command IN EP */ - (void) USBD_LL_CloseEP (pdev, CDC_CMD_EP[i]); - pdev->ep_in[CDC_CMD_EP[i] & 0xFU].is_used = 0U; - pdev->ep_in[CDC_CMD_EP[i] & 0xFU].bInterval = 0U; - - /* DeInit physical Interface components */ - ((USBD_CDC_ACM_ItfTypeDef*) pdev->pUserData_CDC_ACM)->DeInit (i); - } - return (uint8_t) USBD_OK; -} - -/** - * @brief USBD_CDC_Setup - * Handle the CDC specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t USBD_CDC_Setup (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_CDC_ACM_HandleTypeDef *hcdc = NULL; - uint16_t len; - uint8_t ifalt = 0U; - uint16_t status_info = 0U; - USBD_StatusTypeDef ret = USBD_OK; - - uint8_t windex_to_ch = 0; - - for (uint8_t i = 0; i < NUMBER_OF_CDC; i++) - { - if (LOBYTE(req->wIndex) == CDC_CMD_ITF_NBR[i] || LOBYTE(req->wIndex) == CDC_COM_ITF_NBR[i]) - { - windex_to_ch = i; - break; - } - } - - hcdc = &CDC_ACM_Class_Data[windex_to_ch]; - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS: - if (req->wLength != 0U) - { - if ((req->bmRequest & 0x80U) != 0U) - { - ((USBD_CDC_ACM_ItfTypeDef*) pdev->pUserData_CDC_ACM)->Control (windex_to_ch, req->bRequest, (uint8_t*) hcdc->data[windex_to_ch], - req->wLength); - - len = MIN(CDC_REQ_MAX_DATA_SIZE, req->wLength); - (void) USBD_CtlSendData (pdev, (uint8_t*) hcdc->data[windex_to_ch], len); - } - else - { - hcdc->CmdOpCode = req->bRequest; - hcdc->CmdLength = (uint8_t) req->wLength; - - (void) USBD_CtlPrepareRx (pdev, (uint8_t*) hcdc->data[windex_to_ch], req->wLength); - } - } - else - { - ((USBD_CDC_ACM_ItfTypeDef*) pdev->pUserData_CDC_ACM)->Control (windex_to_ch, req->bRequest, (uint8_t*) req, 0U); - } - break; - - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_STATUS: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void) USBD_CtlSendData (pdev, (uint8_t*) &status_info, 2U); - } - else - { - USBD_CtlError (pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_GET_INTERFACE: - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - (void) USBD_CtlSendData (pdev, &ifalt, 1U); - } - else - { - USBD_CtlError (pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_SET_INTERFACE: - if (pdev->dev_state != USBD_STATE_CONFIGURED) - { - USBD_CtlError (pdev, req); - ret = USBD_FAIL; - } - break; - - case USB_REQ_CLEAR_FEATURE: - break; - - default: - USBD_CtlError (pdev, req); - ret = USBD_FAIL; - break; - } - break; - - default: - USBD_CtlError (pdev, req); - ret = USBD_FAIL; - break; - } - - return (uint8_t) ret; -} - -/** - * @brief USBD_CDC_DataIn - * Data sent on non-control IN endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t USBD_CDC_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - USBD_CDC_ACM_HandleTypeDef *hcdc = NULL; - PCD_HandleTypeDef *hpcd = pdev->pData; - uint8_t ep_to_ch = 0; - - for (uint8_t i = 0; i < NUMBER_OF_CDC; i++) - { - if (epnum == (CDC_IN_EP[i] & 0x0F)) - { - ep_to_ch = i; - break; - } - } - - hcdc = &CDC_ACM_Class_Data[ep_to_ch]; - - if ((pdev->ep_in[epnum].total_length > 0U) && ((pdev->ep_in[epnum].total_length % hpcd->IN_ep[epnum].maxpacket) == 0U)) - { - /* Update the packet total length */ - pdev->ep_in[epnum].total_length = 0U; - - /* Send ZLP */ - (void) USBD_LL_Transmit (pdev, epnum, NULL, 0U); - } - else - { - hcdc->TxState = 0U; - - if (((USBD_CDC_ACM_ItfTypeDef*) pdev->pUserData_CDC_ACM)->TransmitCplt != NULL) - { - ((USBD_CDC_ACM_ItfTypeDef*) pdev->pUserData_CDC_ACM)->TransmitCplt (ep_to_ch, hcdc->TxBuffer, &hcdc->TxLength, epnum); - } - } - - return (uint8_t) USBD_OK; -} - -/** - * @brief USBD_CDC_DataOut - * Data received on non-control Out endpoint - * @param pdev: device instance - * @param epnum: endpoint number - * @retval status - */ -static uint8_t USBD_CDC_DataOut (USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - USBD_CDC_ACM_HandleTypeDef *hcdc = NULL; - uint8_t ep_to_ch = 0; - - for (uint8_t i = 0; i < NUMBER_OF_CDC; i++) - { - if (epnum == CDC_OUT_EP[i]) - { - ep_to_ch = i; - break; - } - } - - hcdc = &CDC_ACM_Class_Data[ep_to_ch]; - - /* Get the received data length */ - hcdc->RxLength = USBD_LL_GetRxDataSize (pdev, epnum); - - /* USB data will be immediately processed, this allow next USB traffic being - NAKed till the end of the application Xfer */ - - ((USBD_CDC_ACM_ItfTypeDef*) pdev->pUserData_CDC_ACM)->Receive (ep_to_ch, hcdc->RxBuffer, &hcdc->RxLength); - - return (uint8_t) USBD_OK; -} - -/** - * @brief USBD_CDC_EP0_RxReady - * Handle EP0 Rx Ready event - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_CDC_EP0_RxReady (USBD_HandleTypeDef *pdev) -{ - USBD_CDC_ACM_HandleTypeDef *hcdc = NULL; - - for (uint8_t i = 0; i < NUMBER_OF_CDC; i++) - { - hcdc = &CDC_ACM_Class_Data[i]; - - if (hcdc == NULL) - { - return (uint8_t) USBD_FAIL; - } - - if ((pdev->pUserData_CDC_ACM != NULL) && (hcdc->CmdOpCode != 0xFFU)) - { - ((USBD_CDC_ACM_ItfTypeDef*) pdev->pUserData_CDC_ACM)->Control (i, hcdc->CmdOpCode, (uint8_t*) hcdc->data[i], (uint16_t) hcdc->CmdLength); - hcdc->CmdOpCode = 0xFFU; - } - } - - return (uint8_t) USBD_OK; -} - -/** - * @brief USBD_CDC_GetFSCfgDesc - * Return configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t* USBD_CDC_GetFSCfgDesc (uint16_t *length) -{ - *length = (uint16_t) sizeof(USBD_CDC_CfgFSDesc); - - return USBD_CDC_CfgFSDesc; -} - -/** - * @brief USBD_CDC_GetHSCfgDesc - * Return configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t* USBD_CDC_GetHSCfgDesc (uint16_t *length) -{ - *length = (uint16_t) sizeof(USBD_CDC_CfgHSDesc); - - return USBD_CDC_CfgHSDesc; -} - -/** - * @brief USBD_CDC_GetOtherSpeedCfgDesc - * Return configuration descriptor - * @param speed : current device speed - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t* USBD_CDC_GetOtherSpeedCfgDesc (uint16_t *length) -{ - *length = (uint16_t) sizeof(USBD_CDC_CfgFSDesc); - - return USBD_CDC_CfgFSDesc; -} - -/** - * @brief USBD_CDC_GetDeviceQualifierDescriptor - * return Device Qualifier descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -uint8_t* USBD_CDC_GetDeviceQualifierDescriptor (uint16_t *length) -{ - *length = (uint16_t) sizeof(USBD_CDC_DeviceQualifierDesc); - - return USBD_CDC_DeviceQualifierDesc; -} - -/** - * @brief USBD_CDC_RegisterInterface - * @param pdev: device instance - * @param fops: CD Interface callback - * @retval status - */ -uint8_t USBD_CDC_ACM_RegisterInterface (USBD_HandleTypeDef *pdev, USBD_CDC_ACM_ItfTypeDef *fops) -{ - if (fops == NULL) - { - return (uint8_t) USBD_FAIL; - } - - pdev->pUserData_CDC_ACM = fops; - - return (uint8_t) USBD_OK; -} - -/** - * @brief USBD_CDC_SetTxBuffer - * @param pdev: device instance - * @param pbuff: Tx Buffer - * @retval status - */ -uint8_t USBD_CDC_SetTxBuffer (uint8_t ch, USBD_HandleTypeDef *pdev, uint8_t *pbuff, uint32_t length) -{ - USBD_CDC_ACM_HandleTypeDef *hcdc = NULL; - - hcdc = &CDC_ACM_Class_Data[ch]; - - hcdc->TxBuffer = pbuff; - hcdc->TxLength = length; - - return (uint8_t) USBD_OK; -} - -/** - * @brief USBD_CDC_SetRxBuffer - * @param pdev: device instance - * @param pbuff: Rx Buffer - * @retval status - */ -uint8_t USBD_CDC_SetRxBuffer (uint8_t ch, USBD_HandleTypeDef *pdev, uint8_t *pbuff) -{ - USBD_CDC_ACM_HandleTypeDef *hcdc = NULL; - - hcdc = &CDC_ACM_Class_Data[ch]; - - hcdc->RxBuffer = pbuff; - - return (uint8_t) USBD_OK; -} - -/** - * @brief USBD_CDC_TransmitPacket - * Transmit packet on IN endpoint - * @param pdev: device instance - * @retval status - */ -uint8_t USBD_CDC_TransmitPacket (uint8_t ch, USBD_HandleTypeDef *pdev) -{ - USBD_CDC_ACM_HandleTypeDef *hcdc = NULL; - USBD_StatusTypeDef ret = USBD_BUSY; - - hcdc = &CDC_ACM_Class_Data[ch]; - - if (hcdc->TxState == 0U) - { - /* Tx Transfer in progress */ - hcdc->TxState = 1U; - - /* Update the packet total length */ - pdev->ep_in[CDC_IN_EP[ch] & 0xFU].total_length = hcdc->TxLength; - - /* Transmit next packet */ - (void) USBD_LL_Transmit (pdev, CDC_IN_EP[ch], hcdc->TxBuffer, hcdc->TxLength); - - ret = USBD_OK; - } - - return (uint8_t) ret; -} - -/** - * @brief USBD_CDC_ACM_ReceivePacket - * prepare OUT Endpoint for reception - * @param pdev: device instance - * @retval status - */ -uint8_t USBD_CDC_ReceivePacket (uint8_t ch, USBD_HandleTypeDef *pdev) -{ - USBD_CDC_ACM_HandleTypeDef *hcdc = NULL; - - hcdc = &CDC_ACM_Class_Data[ch]; - - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - /* Prepare Out endpoint to receive next packet */ - (void) USBD_LL_PrepareReceive (pdev, CDC_OUT_EP[ch], hcdc->RxBuffer, - CDC_DATA_HS_OUT_PACKET_SIZE); - } - else - { - /* Prepare Out endpoint to receive next packet */ - (void) USBD_LL_PrepareReceive (pdev, CDC_OUT_EP[ch], hcdc->RxBuffer, - CDC_DATA_FS_OUT_PACKET_SIZE); - } - - return (uint8_t) USBD_OK; -} - -void USBD_Update_CDC_ACM_DESC (uint8_t *desc, uint8_t cmd_itf, uint8_t com_itf, uint8_t in_ep, uint8_t cmd_ep, uint8_t out_ep, uint8_t str_idx) -{ - desc += 9; - for (uint8_t i = 0; i < NUMBER_OF_CDC; i++) - { - desc[2] = cmd_itf; - desc[16] = str_idx; - desc[10] = cmd_itf; - desc[26] = com_itf; - desc[34] = cmd_itf; - desc[35] = com_itf; - desc[38] = cmd_ep; - desc[45] = com_itf; - desc[54] = out_ep; - desc[61] = in_ep; - - desc += 66; - CDC_IN_EP[i] = in_ep; - CDC_OUT_EP[i] = out_ep; - CDC_CMD_EP[i] = cmd_ep; - CDC_CMD_ITF_NBR[i] = cmd_itf; - CDC_COM_ITF_NBR[i] = com_itf; - CDC_STR_DESC_IDX[i] = str_idx; - - in_ep += 2; - cmd_ep = in_ep + 1; - out_ep++; - str_idx++; - - cmd_itf += 2; - com_itf = cmd_itf + 1; - } -} -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/AL94_USB_Composite/Class/COMPOSITE/Inc/usbd_composite.h b/common/AL94_USB_Composite/Class/COMPOSITE/Inc/usbd_composite.h deleted file mode 100644 index 8d57dfc..0000000 --- a/common/AL94_USB_Composite/Class/COMPOSITE/Inc/usbd_composite.h +++ /dev/null @@ -1,151 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_composite.h - * @author MCD Application Team - * @brief Header file for the usbd_composite.c file. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2015 STMicroelectronics. - * All rights reserved.

- * - * 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 - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_COMPOSITE_H -#define __USB_COMPOSITE_H - -#ifdef __cplusplus -extern "C" -{ -#endif - - /* Includes ------------------------------------------------------------------*/ -#include "stdbool.h" -#include "usbd_ioreq.h" -#include // NOTE! replaced "AL94.I-CUBE-USBD-COMPOSITE_conf.h" - - /** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - /** @defgroup USBD_COMPOSITE - * @brief This file is the header file for usbd_composite.c - * @{ - */ - - /** @defgroup USBD_COMPOSITE_Exported_Defines - * @{ - */ - -#define USBD_USE_HS _USBD_USE_HS -#define USBD_USE_CDC_ACM _USBD_USE_CDC_ACM -#define USBD_CDC_ACM_COUNT _USBD_CDC_ACM_COUNT -#define USBD_USE_CDC_RNDIS _USBD_USE_CDC_RNDIS -#define USBD_USE_CDC_ECM _USBD_USE_CDC_ECM -#define USBD_USE_HID_MOUSE _USBD_USE_HID_MOUSE -#define USBD_USE_HID_KEYBOARD _USBD_USE_HID_KEYBOARD -#define USBD_USE_HID_CUSTOM _USBD_USE_HID_CUSTOM -#define USBD_USE_UAC_MIC _USBD_USE_UAC_MIC -#define USBD_USE_UAC_SPKR _USBD_USE_UAC_SPKR -#define USBD_USE_UVC _USBD_USE_UVC -#define USBD_USE_MSC _USBD_USE_MSC -#define USBD_USE_DFU _USBD_USE_DFU -#define USBD_USE_PRNTR _USBD_USE_PRNTR - -#define STM32F1_DEVICE _STM32F1_DEVICE - -#if(USBD_USE_CDC_ACM == 1) -#include "usbd_cdc_acm_if.h" -#endif -#if(USBD_USE_CDC_RNDIS == 1) -#include "usbd_cdc_rndis_if.h" -#endif -#if(USBD_USE_CDC_ECM == 1) -#include "usbd_cdc_ecm_if.h" -#endif -#if(USBD_USE_HID_MOUSE == 1) -#include "usbd_hid_mouse.h" -#endif -#if(USBD_USE_HID_KEYBOARD == 1) -#include "usbd_hid_keyboard.h" -#endif -#if(USBD_USE_HID_CUSTOM == 1) -#include "usbd_hid_custom_if.h" -#endif -#if(USBD_USE_UAC_MIC == 1) -#include "usbd_audio_mic_if.h" -#endif -#if(USBD_USE_UAC_SPKR == 1) -#include "usbd_audio_spkr_if.h" -#endif -#if(USBD_USE_UVC == 1) -#include "usbd_video_if.h" -#endif -#if(USBD_USE_MSC == 1) -#include "usbd_msc_if.h" -#endif -#if(USBD_USE_DFU == 1) -#include "usbd_dfu_if.h" -#endif -#if(USBD_USE_PRNTR == 1) -#include "usbd_printer_if.h" -#endif - - /** - * @} - */ - - /** @defgroup USBD_COMPOSITE_Exported_TypesDefinitions - * @{ - */ - - /** - * @} - */ - - /** @defgroup USBD_COMPOSITE_Exported_Macros - * @{ - */ - - /** - * @} - */ - - /** @defgroup USBD_COMPOSITE_Exported_Variables - * @{ - */ - - extern USBD_ClassTypeDef USBD_COMPOSITE; - /** - * @} - */ - - /** @defgroup USB_CORE_Exported_Functions - * @{ - */ - void USBD_COMPOSITE_Mount_Class (void); -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_COMPOSITE_H */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/AL94_USB_Composite/Class/COMPOSITE/Src/usbd_composite.c b/common/AL94_USB_Composite/Class/COMPOSITE/Src/usbd_composite.c deleted file mode 100644 index 8008070..0000000 --- a/common/AL94_USB_Composite/Class/COMPOSITE/Src/usbd_composite.c +++ /dev/null @@ -1,1133 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_composite.c - * @author MCD Application Team - * @brief This file provides the HID core functions. - * - * @verbatim - * - * =================================================================== - * COMPOSITE Class Description - * =================================================================== - * - * - * - * - * - * - * @note In HS mode and when the DMA is used, all variables and data structures - * dealing with the DMA during the transaction process should be 32-bit aligned. - * - * - * @endverbatim - * - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2015 STMicroelectronics. - * All rights reserved.

- * - * 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 - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_composite.h" -#include "usbd_ctlreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_COMPOSITE - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_COMPOSITE_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_COMPOSITE_Private_Defines - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_COMPOSITE_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_COMPOSITE_Private_FunctionPrototypes - * @{ - */ - -static uint8_t USBD_COMPOSITE_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_COMPOSITE_DeInit (USBD_HandleTypeDef *pdev, uint8_t cfgidx); -static uint8_t USBD_COMPOSITE_Setup (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static uint8_t USBD_COMPOSITE_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_COMPOSITE_DataOut (USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_COMPOSITE_EP0_RxReady (USBD_HandleTypeDef *pdev); -static uint8_t USBD_COMPOSITE_EP0_TxReady (USBD_HandleTypeDef *pdev); -static uint8_t USBD_COMPOSITE_SOF (USBD_HandleTypeDef *pdev); -static uint8_t USBD_COMPOSITE_IsoINIncomplete (USBD_HandleTypeDef *pdev, uint8_t epnum); -static uint8_t USBD_COMPOSITE_IsoOutIncomplete (USBD_HandleTypeDef *pdev, uint8_t epnum); - -static uint8_t* USBD_COMPOSITE_GetHSCfgDesc (uint16_t *length); -static uint8_t* USBD_COMPOSITE_GetFSCfgDesc (uint16_t *length); -static uint8_t* USBD_COMPOSITE_GetOtherSpeedCfgDesc (uint16_t *length); -static uint8_t* USBD_COMPOSITE_GetDeviceQualifierDesc (uint16_t *length); -static uint8_t* USBD_COMPOSITE_GetUsrStringDesc (USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length); - -/** - * @} - */ - -/** @defgroup USBD_COMPOSITE_Private_Variables - * @{ - */ - -USBD_ClassTypeDef USBD_COMPOSITE = -{ USBD_COMPOSITE_Init, USBD_COMPOSITE_DeInit, USBD_COMPOSITE_Setup, USBD_COMPOSITE_EP0_TxReady, USBD_COMPOSITE_EP0_RxReady, USBD_COMPOSITE_DataIn, - USBD_COMPOSITE_DataOut, USBD_COMPOSITE_SOF, USBD_COMPOSITE_IsoINIncomplete, USBD_COMPOSITE_IsoOutIncomplete, USBD_COMPOSITE_GetHSCfgDesc, - USBD_COMPOSITE_GetFSCfgDesc, USBD_COMPOSITE_GetOtherSpeedCfgDesc, USBD_COMPOSITE_GetDeviceQualifierDesc, USBD_COMPOSITE_GetUsrStringDesc }; - -typedef struct USBD_COMPOSITE_CFG_DESC_t -{ - uint8_t CONFIG_DESC[USB_CONF_DESC_SIZE]; -#if (USBD_USE_CDC_RNDIS == 1) - uint8_t USBD_CDC_RNDIS_DESC[CDC_RNDIS_CONFIG_DESC_SIZE - 0x09]; -#endif -#if (USBD_USE_CDC_ECM == 1) - uint8_t USBD_CDC_ECM_DESC[CDC_ECM_CONFIG_DESC_SIZE - 0x09]; -#endif -#if (USBD_USE_HID_MOUSE == 1) - uint8_t USBD_HID_MOUSE_DESC[USB_HID_CONFIG_DESC_SIZ - 0x09]; -#endif -#if (USBD_USE_HID_KEYBOARD == 1) - uint8_t USBD_HID_KEYBOARD_DESC[HID_KEYBOARD_CONFIG_DESC_SIZE - 0x09]; -#endif -#if (USBD_USE_HID_CUSTOM == 1) - uint8_t USBD_HID_CUSTOM_DESC[USB_CUSTOM_HID_CONFIG_DESC_SIZ - 0x09]; -#endif -#if (USBD_USE_UAC_MIC == 1) - uint8_t USBD_UAC_MIC_DESC[USBD_AUDIO_MIC_CONFIG_DESC_SIZE - 0x09]; -#endif -#if (USBD_USE_UAC_SPKR == 1) - uint8_t USBD_AUDIO_SPKR_DESC[USBD_AUDIO_SPKR_CONFIG_DESC_SIZE - 0x09]; -#endif -#if (USBD_USE_UVC == 1) - uint8_t USBD_UVC_DESC[UVC_CONFIG_DESC_SIZE - 0x09]; -#endif -#if (USBD_USE_MSC == 1) - uint8_t USBD_MSC_DESC[USB_MSC_CONFIG_DESC_SIZ - 0x09]; -#endif -#if (USBD_USE_DFU == 1) - uint8_t USBD_DFU_DESC[USB_DFU_CONFIG_DESC_SIZ - 0x09]; -#endif -#if (USBD_USE_PRNTR == 1) - uint8_t USBD_PRNTR_DESC[USB_PRNT_CONFIG_DESC_SIZE - 0x09]; -#endif -#if (USBD_USE_CDC_ACM == 1) - uint8_t USBD_CDC_ACM_DESC[USB_CDC_CONFIG_DESC_SIZ - 0x09]; -#endif - -}__PACKED USBD_COMPOSITE_CFG_DESC_t; - -#if defined(__ICCARM__) /*!< IAR Compiler */ -#pragma data_alignment = 4 -#endif -__ALIGN_BEGIN USBD_COMPOSITE_CFG_DESC_t USBD_COMPOSITE_FSCfgDesc, USBD_COMPOSITE_HSCfgDesc __ALIGN_END; -uint8_t USBD_Track_String_Index = (USBD_IDX_INTERFACE_STR + 1); - -#if defined(__ICCARM__) /*!< IAR Compiler */ -#pragma data_alignment = 4 -#endif -/* USB Standard Device Descriptor */ -__ALIGN_BEGIN static uint8_t USBD_COMPOSITE_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = -{ -USB_LEN_DEV_QUALIFIER_DESC, -USB_DESC_TYPE_DEVICE_QUALIFIER, 0x00, 0x02, 0xEF, 0x02, 0x01, 0x40, 0x01, 0x00, }; - -/** - * @} - */ - -/** @defgroup USBD_COMPOSITE_Private_Functions - * @{ - */ - -/** - * @brief USBD_COMPOSITE_Init - * Initialize the COMPOSITE interface - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_COMPOSITE_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ -#if (USBD_USE_CDC_ACM == 1) - USBD_CDC_ACM.Init (pdev, cfgidx); -#endif -#if (USBD_USE_CDC_ECM == 1) - USBD_CDC_ECM.Init(pdev, cfgidx); -#endif -#if (USBD_USE_CDC_RNDIS == 1) - USBD_CDC_RNDIS.Init(pdev, cfgidx); -#endif -#if (USBD_USE_HID_MOUSE == 1) - USBD_HID_MOUSE.Init(pdev, cfgidx); -#endif -#if (USBD_USE_HID_KEYBOARD == 1) - USBD_HID_KEYBOARD.Init(pdev, cfgidx); -#endif -#if (USBD_USE_HID_CUSTOM == 1) - USBD_HID_CUSTOM.Init(pdev, cfgidx); -#endif -#if (USBD_USE_UAC_MIC == 1) - USBD_AUDIO_MIC.Init(pdev, cfgidx); -#endif -#if (USBD_USE_UAC_SPKR == 1) - USBD_AUDIO_SPKR.Init(pdev, cfgidx); -#endif -#if (USBD_USE_UVC == 1) - USBD_VIDEO.Init(pdev, cfgidx); -#endif -#if (USBD_USE_MSC == 1) - USBD_MSC.Init(pdev, cfgidx); -#endif -#if (USBD_USE_DFU == 1) - USBD_DFU.Init(pdev, cfgidx); -#endif -#if (USBD_USE_PRNTR == 1) - USBD_PRNT.Init(pdev, cfgidx); -#endif - - return (uint8_t) USBD_OK; -} - -/** - * @brief USBD_COMPOSITE_Init - * DeInitialize the COMPOSITE layer - * @param pdev: device instance - * @param cfgidx: Configuration index - * @retval status - */ -static uint8_t USBD_COMPOSITE_DeInit (USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ -#if (USBD_USE_CDC_ACM == 1) - USBD_CDC_ACM.DeInit (pdev, cfgidx); -#endif -#if (USBD_USE_CDC_ECM == 1) - USBD_CDC_ECM.DeInit(pdev, cfgidx); -#endif -#if (USBD_USE_CDC_RNDIS == 1) - USBD_CDC_RNDIS.DeInit(pdev, cfgidx); -#endif -#if (USBD_USE_HID_MOUSE == 1) - USBD_HID_MOUSE.DeInit(pdev, cfgidx); -#endif -#if (USBD_USE_HID_KEYBOARD == 1) - USBD_HID_KEYBOARD.DeInit(pdev, cfgidx); -#endif -#if (USBD_USE_HID_CUSTOM == 1) - USBD_HID_CUSTOM.DeInit(pdev, cfgidx); -#endif -#if (USBD_USE_UAC_MIC == 1) - USBD_AUDIO_MIC.DeInit(pdev, cfgidx); -#endif -#if (USBD_USE_UAC_SPKR == 1) - USBD_AUDIO_SPKR.DeInit(pdev, cfgidx); -#endif -#if (USBD_USE_UVC == 1) - USBD_VIDEO.DeInit(pdev, cfgidx); -#endif -#if (USBD_USE_MSC == 1) - USBD_MSC.DeInit(pdev, cfgidx); -#endif -#if (USBD_USE_DFU == 1) - USBD_DFU.DeInit(pdev, cfgidx); -#endif -#if (USBD_USE_PRNTR == 1) - USBD_PRNT.DeInit(pdev, cfgidx); -#endif - - return (uint8_t) USBD_OK; -} - -/** - * @brief USBD_COMPOSITE_Setup - * Handle the COMPOSITE specific requests - * @param pdev: instance - * @param req: usb requests - * @retval status - */ -static uint8_t USBD_COMPOSITE_Setup (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ -#if (USBD_USE_CDC_ACM == 1) - for (uint8_t i = 0; i < USBD_CDC_ACM_COUNT; i++) - { - if (LOBYTE(req->wIndex) == CDC_CMD_ITF_NBR[i] || LOBYTE(req->wIndex) == CDC_COM_ITF_NBR[i]) - { - return USBD_CDC_ACM.Setup (pdev, req); - } - } -#endif -#if (USBD_USE_CDC_ECM == 1) - if (LOBYTE(req->wIndex) == CDC_ECM_CMD_ITF_NBR || LOBYTE(req->wIndex) == CDC_ECM_COM_ITF_NBR) - { - return USBD_CDC_ECM.Setup(pdev, req); - } -#endif -#if (USBD_USE_CDC_RNDIS == 1) - if (LOBYTE(req->wIndex) == CDC_RNDIS_CMD_ITF_NBR || LOBYTE(req->wIndex) == CDC_RNDIS_COM_ITF_NBR) - { - return USBD_CDC_RNDIS.Setup(pdev, req); - } -#endif -#if (USBD_USE_HID_MOUSE == 1) - if (LOBYTE(req->wIndex) == HID_MOUSE_ITF_NBR) - { - return USBD_HID_MOUSE.Setup(pdev, req); - } -#endif -#if (USBD_USE_HID_KEYBOARD == 1) - if (LOBYTE(req->wIndex) == HID_KEYBOARD_ITF_NBR) - { - return USBD_HID_KEYBOARD.Setup(pdev, req); - } -#endif -#if (USBD_USE_HID_CUSTOM == 1) - if (LOBYTE(req->wIndex) == CUSTOM_HID_ITF_NBR) - { - return USBD_HID_CUSTOM.Setup(pdev, req); - } -#endif -#if (USBD_USE_UAC_MIC == 1) - if (LOBYTE(req->wIndex) == AUDIO_MIC_AC_ITF_NBR || LOBYTE(req->wIndex) == AUDIO_MIC_AS_ITF_NBR) - { - return USBD_AUDIO_MIC.Setup(pdev, req); - } -#endif -#if (USBD_USE_UAC_SPKR == 1) - if (LOBYTE(req->wIndex) == AUDIO_SPKR_AC_ITF_NBR || LOBYTE(req->wIndex) == AUDIO_SPKR_AS_ITF_NBR) - { - return USBD_AUDIO_SPKR.Setup(pdev, req); - } -#endif -#if (USBD_USE_UVC == 1) - if (LOBYTE(req->wIndex) == UVC_VC_IF_NUM || LOBYTE(req->wIndex) == UVC_VS_IF_NUM) - { - return USBD_VIDEO.Setup(pdev, req); - } -#endif -#if (USBD_USE_MSC == 1) - if (LOBYTE(req->wIndex) == MSC_ITF_NBR) - { - return USBD_MSC.Setup(pdev, req); - } -#endif -#if (USBD_USE_DFU == 1) - if (LOBYTE(req->wIndex) == DFU_ITF_NBR) - { - return USBD_DFU.Setup(pdev, req); - } -#endif -#if (USBD_USE_PRNTR == 1) - if (LOBYTE(req->wIndex) == PRNT_ITF_NBR) - { - USBD_PRNT.Setup(pdev, req); - } -#endif - - return USBD_FAIL; -} - -/** - * @brief USBD_COMPOSITE_DataIn - * handle data IN Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_COMPOSITE_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum) -{ -#if (USBD_USE_CDC_ACM == 1) - for (uint8_t i = 0; i < USBD_CDC_ACM_COUNT; i++) - { - if (epnum == (CDC_IN_EP[i] & 0x7F) || epnum == (CDC_CMD_EP[i] & 0x7F)) - { - return USBD_CDC_ACM.DataIn (pdev, epnum); - } - } -#endif -#if (USBD_USE_CDC_ECM == 1) - if (epnum == (CDC_ECM_IN_EP & 0x7F) || epnum == (CDC_ECM_CMD_EP & 0x7F)) - { - return USBD_CDC_ECM.DataIn(pdev, epnum); - } -#endif -#if (USBD_USE_CDC_RNDIS == 1) - if (epnum == (CDC_RNDIS_IN_EP & 0x7F) || epnum == (CDC_RNDIS_CMD_EP & 0x7F)) - { - return USBD_CDC_RNDIS.DataIn(pdev, epnum); - } -#endif -#if (USBD_USE_HID_MOUSE == 1) - if (epnum == (HID_MOUSE_IN_EP & 0x7F)) - { - return USBD_HID_MOUSE.DataIn(pdev, epnum); - } -#endif -#if (USBD_USE_HID_KEYBOARD == 1) - if (epnum == (HID_KEYBOARD_IN_EP & 0x7F)) - { - return USBD_HID_KEYBOARD.DataIn(pdev, epnum); - } -#endif -#if (USBD_USE_HID_CUSTOM == 1) - if (epnum == (CUSTOM_HID_IN_EP & 0x7F)) - { - return USBD_HID_CUSTOM.DataIn(pdev, epnum); - } -#endif -#if (USBD_USE_UAC_MIC == 1) - if (epnum == (AUDIO_MIC_EP & 0x7F)) - { - return USBD_AUDIO_MIC.DataIn(pdev, epnum); - } -#endif -#if (USBD_USE_UAC_SPKR == 1) -#endif -#if (USBD_USE_UVC == 1) - if (epnum == (UVC_IN_EP & 0x7F)) - { - return USBD_VIDEO.DataIn(pdev, epnum); - } -#endif -#if (USBD_USE_MSC == 1) - if (epnum == (MSC_IN_EP & 0x7F)) - { - return USBD_MSC.DataIn(pdev, epnum); - } -#endif -#if (USBD_USE_DFU == 1) -#endif -#if (USBD_USE_PRNTR == 1) - if (epnum == (PRNT_IN_EP & 0x7F)) - { - USBD_PRNT.DataIn(pdev, epnum); - } -#endif - - return USBD_FAIL; -} - -/** - * @brief USBD_COMPOSITE_EP0_RxReady - * handle EP0 Rx Ready event - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_COMPOSITE_EP0_RxReady (USBD_HandleTypeDef *pdev) -{ -#if (USBD_USE_CDC_ACM == 1) - USBD_CDC_ACM.EP0_RxReady (pdev); -#endif -#if (USBD_USE_CDC_ECM == 1) - USBD_CDC_ECM.EP0_RxReady(pdev); -#endif -#if (USBD_USE_CDC_RNDIS == 1) - USBD_CDC_RNDIS.EP0_RxReady(pdev); -#endif -#if (USBD_USE_HID_MOUSE == 1) -#endif -#if (USBD_USE_HID_KEYBOARD == 1) -#endif -#if (USBD_USE_HID_CUSTOM == 1) - USBD_HID_CUSTOM.EP0_RxReady(pdev); -#endif -#if (USBD_USE_UAC_MIC == 1) - USBD_AUDIO_MIC.EP0_RxReady(pdev); -#endif -#if (USBD_USE_UAC_SPKR == 1) - USBD_AUDIO_SPKR.EP0_RxReady(pdev); -#endif -#if (USBD_USE_UVC == 1) -#endif -#if (USBD_USE_MSC == 1) -#endif -#if (USBD_USE_DFU == 1) - USBD_DFU.EP0_RxReady(pdev); -#endif -#if (USBD_USE_PRNTR == 1) -#endif - - return (uint8_t) USBD_OK; -} - -/** - * @brief USBD_COMPOSITE_EP0_TxReady - * handle EP0 TRx Ready event - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_COMPOSITE_EP0_TxReady (USBD_HandleTypeDef *pdev) -{ -#if (USBD_USE_CDC_ACM == 1) -#endif -#if (USBD_USE_CDC_ECM == 1) -#endif -#if (USBD_USE_CDC_RNDIS == 1) -#endif -#if (USBD_USE_HID_MOUSE == 1) -#endif -#if (USBD_USE_HID_KEYBOARD == 1) -#endif -#if (USBD_USE_HID_CUSTOM == 1) -#endif -#if (USBD_USE_UAC_MIC == 1) - USBD_AUDIO_MIC.EP0_TxSent(pdev); -#endif -#if (USBD_USE_UAC_SPKR == 1) - USBD_AUDIO_SPKR.EP0_TxSent(pdev); -#endif -#if (USBD_USE_UVC == 1) -#endif -#if (USBD_USE_MSC == 1) -#endif -#if (USBD_USE_DFU == 1) - USBD_DFU.EP0_TxSent(pdev); -#endif -#if (USBD_USE_PRNTR == 1) -#endif - - return (uint8_t) USBD_OK; -} - -/** - * @brief USBD_COMPOSITE_SOF - * handle SOF event - * @param pdev: device instance - * @retval status - */ -static uint8_t USBD_COMPOSITE_SOF (USBD_HandleTypeDef *pdev) -{ -#if (USBD_USE_CDC_ACM == 1) -#endif -#if (USBD_USE_CDC_ECM == 1) -#endif -#if (USBD_USE_CDC_RNDIS == 1) -#endif -#if (USBD_USE_HID_MOUSE == 1) -#endif -#if (USBD_USE_HID_KEYBOARD == 1) -#endif -#if (USBD_USE_HID_CUSTOM == 1) -#endif -#if (USBD_USE_UAC_MIC == 1) - USBD_AUDIO_MIC.SOF(pdev); -#endif -#if (USBD_USE_UAC_SPKR == 1) - USBD_AUDIO_SPKR.SOF(pdev); -#endif -#if (USBD_USE_UVC == 1) - USBD_VIDEO.SOF(pdev); -#endif -#if (USBD_USE_MSC == 1) -#endif -#if (USBD_USE_DFU == 1) - USBD_DFU.SOF(pdev); -#endif -#if (USBD_USE_PRNTR == 1) -#endif - - return (uint8_t) USBD_OK; -} - -/** - * @brief USBD_COMPOSITE_IsoINIncomplete - * handle data ISO IN Incomplete event - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_COMPOSITE_IsoINIncomplete (USBD_HandleTypeDef *pdev, uint8_t epnum) -{ -#if (USBD_USE_CDC_ACM == 1) -#endif -#if (USBD_USE_CDC_ECM == 1) -#endif -#if (USBD_USE_CDC_RNDIS == 1) -#endif -#if (USBD_USE_HID_MOUSE == 1) -#endif -#if (USBD_USE_HID_KEYBOARD == 1) -#endif -#if (USBD_USE_HID_CUSTOM == 1) -#endif -#if (USBD_USE_UAC_MIC == 1) - if (epnum == (AUDIO_MIC_EP & 0x7F)) - { - USBD_AUDIO_MIC.IsoINIncomplete(pdev, epnum); - } -#endif -#if (USBD_USE_UAC_SPKR == 1) -#endif -#if (USBD_USE_UVC == 1) - if (epnum == (UVC_IN_EP & 0x7F)) - { - USBD_VIDEO.IsoINIncomplete(pdev, epnum); - } -#endif -#if (USBD_USE_MSC == 1) -#endif -#if (USBD_USE_DFU == 1) -#endif -#if (USBD_USE_PRNTR == 1) -#endif - - return (uint8_t) USBD_OK; -} - -/** - * @brief USBD_COMPOSITE_IsoOutIncomplete - * handle data ISO OUT Incomplete event - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_COMPOSITE_IsoOutIncomplete (USBD_HandleTypeDef *pdev, uint8_t epnum) -{ -#if (USBD_USE_CDC_ACM == 1) -#endif -#if (USBD_USE_CDC_ECM == 1) -#endif -#if (USBD_USE_CDC_RNDIS == 1) -#endif -#if (USBD_USE_HID_MOUSE == 1) -#endif -#if (USBD_USE_HID_KEYBOARD == 1) -#endif -#if (USBD_USE_HID_CUSTOM == 1) -#endif -#if (USBD_USE_UAC_MIC == 1) -#endif -#if (USBD_USE_UAC_SPKR == 1) - if (epnum == AUDIO_SPKR_EP) - { - USBD_AUDIO_SPKR.IsoOUTIncomplete(pdev, epnum); - } -#endif -#if (USBD_USE_UVC == 1) -#endif -#if (USBD_USE_MSC == 1) -#endif -#if (USBD_USE_DFU == 1) -#endif -#if (USBD_USE_PRNTR == 1) -#endif - - return (uint8_t) USBD_OK; -} -/** - * @brief USBD_COMPOSITE_DataOut - * handle data OUT Stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -static uint8_t USBD_COMPOSITE_DataOut (USBD_HandleTypeDef *pdev, uint8_t epnum) -{ -#if (USBD_USE_CDC_ACM == 1) - for (uint8_t i = 0; i < USBD_CDC_ACM_COUNT; i++) - { - if (epnum == CDC_OUT_EP[i]) - { - return USBD_CDC_ACM.DataOut (pdev, epnum); - } - } -#endif -#if (USBD_USE_CDC_ECM == 1) - if (epnum == CDC_ECM_OUT_EP) - { - return USBD_CDC_ECM.DataOut(pdev, epnum); - } -#endif -#if (USBD_USE_CDC_RNDIS == 1) - if (epnum == CDC_RNDIS_OUT_EP) - { - return USBD_CDC_RNDIS.DataOut(pdev, epnum); - } -#endif -#if (USBD_USE_HID_MOUSE == 1) -#endif -#if (USBD_USE_HID_KEYBOARD == 1) -#endif -#if (USBD_USE_HID_CUSTOM == 1) - if (epnum == CUSTOM_HID_OUT_EP) - { - return USBD_HID_CUSTOM.DataOut(pdev, epnum); - } -#endif -#if (USBD_USE_UAC_MIC == 1) -#endif -#if (USBD_USE_UAC_SPKR == 1) - if (epnum == AUDIO_SPKR_EP) - { - return USBD_AUDIO_SPKR.DataOut(pdev, epnum); - } -#endif -#if (USBD_USE_UVC == 1) -#endif -#if (USBD_USE_MSC == 1) - if (epnum == MSC_OUT_EP) - { - return USBD_MSC.DataOut(pdev, epnum); - } -#endif -#if (USBD_USE_DFU == 1) -#endif -#if (USBD_USE_PRNTR == 1) - if (epnum == PRNT_OUT_EP) - { - USBD_PRNT.DataOut(pdev, epnum); - } -#endif - - return USBD_FAIL; -} - -/** - * @brief USBD_COMPOSITE_GetHSCfgDesc - * return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t* USBD_COMPOSITE_GetHSCfgDesc (uint16_t *length) -{ - *length = (uint16_t) sizeof(USBD_COMPOSITE_HSCfgDesc); - return (uint8_t*) &USBD_COMPOSITE_HSCfgDesc; -} - -/** - * @brief USBD_COMPOSITE_GetFSCfgDesc - * return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t* USBD_COMPOSITE_GetFSCfgDesc (uint16_t *length) -{ - *length = (uint16_t) sizeof(USBD_COMPOSITE_FSCfgDesc); - return (uint8_t*) &USBD_COMPOSITE_FSCfgDesc; -} - -/** - * @brief USBD_COMPOSITE_GetOtherSpeedCfgDesc - * return configuration descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -static uint8_t* USBD_COMPOSITE_GetOtherSpeedCfgDesc (uint16_t *length) -{ -#if (USBD_USE_HS == 1) - *length = (uint16_t)sizeof(USBD_COMPOSITE_FSCfgDesc); - return (uint8_t *)&USBD_COMPOSITE_FSCfgDesc; -#else - *length = (uint16_t) sizeof(USBD_COMPOSITE_HSCfgDesc); - return (uint8_t*) &USBD_COMPOSITE_HSCfgDesc; -#endif -} - -/** - * @brief DeviceQualifierDescriptor - * return Device Qualifier descriptor - * @param length : pointer data length - * @retval pointer to descriptor buffer - */ -uint8_t* USBD_COMPOSITE_GetDeviceQualifierDesc (uint16_t *length) -{ - *length = (uint16_t) sizeof(USBD_COMPOSITE_DeviceQualifierDesc); - return USBD_COMPOSITE_DeviceQualifierDesc; -} - -/** - * @brief USBD_COMPOSITE_GetUsrStringDesc - * Manages the transfer of memory interfaces string descriptors. - * @param speed : current device speed - * @param index: descriptor index - * @param length : pointer data length - * @retval pointer to the descriptor table or NULL if the descriptor is not supported. - */ -#if (USBD_SUPPORT_USER_STRING_DESC == 1U) -static uint8_t* USBD_COMPOSITE_GetUsrStringDesc (USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length) -{ - static uint8_t USBD_StrDesc[64]; - - /* Check if the requested string interface is supported */ - if (index <= USBD_Track_String_Index) - { -#if (USBD_USE_CDC_ACM == 1) - char str_buffer[16] = ""; - for (uint8_t i = 0; i < USBD_CDC_ACM_COUNT; i++) - { - if (index == CDC_STR_DESC_IDX[i]) - { - snprintf (str_buffer, sizeof(str_buffer), CDC_ACM_STR_DESC, i); - USBD_GetString ((uint8_t*) str_buffer, USBD_StrDesc, length); - } - } -#endif -#if (USBD_USE_CDC_ECM == 1) - if (index == CDC_ECM_STR_DESC_IDX) - { - USBD_GetString((uint8_t *)CDC_ECM_STR_DESC, USBD_StrDesc, length); - } -#endif -#if (USBD_USE_CDC_RNDIS == 1) - if (index == CDC_RNDIS_STR_DESC_IDX) - { - USBD_GetString((uint8_t *)CDC_RNDIS_STR_DESC, USBD_StrDesc, length); - } -#endif -#if (USBD_USE_HID_MOUSE == 1) - if (index == HID_MOUSE_STR_DESC_IDX) - { - USBD_GetString((uint8_t *)HID_MOUSE_STR_DESC, USBD_StrDesc, length); - } -#endif -#if (USBD_USE_HID_KEYBOARD == 1) - if (index == HID_KEYBOARD_STR_DESC_IDX) - { - USBD_GetString((uint8_t *)HID_KEYBOARD_STR_DESC, USBD_StrDesc, length); - } -#endif -#if (USBD_USE_HID_CUSTOM == 1) - if (index == CUSTOM_HID_STR_DESC_IDX) - { - USBD_GetString((uint8_t *)CUSTOM_HID_STR_DESC, USBD_StrDesc, length); - } -#endif -#if (USBD_USE_UAC_MIC == 1) - if (index == AUDIO_MIC_STR_DESC_IDX) - { - USBD_GetString((uint8_t *)AUDIO_MIC_STR_DESC, USBD_StrDesc, length); - } -#endif -#if (USBD_USE_UAC_SPKR == 1) - if (index == AUDIO_SPKR_STR_DESC_IDX) - { - USBD_GetString((uint8_t *)AUDIO_SPKR_STR_DESC, USBD_StrDesc, length); - } -#endif -#if (USBD_USE_UVC == 1) - if (index == UVC_STR_DESC_IDX) - { - USBD_GetString((uint8_t *)UVC_STR_DESC, USBD_StrDesc, length); - } -#endif -#if (USBD_USE_MSC == 1) - if (index == MSC_BOT_STR_DESC_IDX) - { - USBD_GetString((uint8_t *)MSC_BOT_STR_DESC, USBD_StrDesc, length); - } -#endif -#if (USBD_USE_DFU == 1) - if (index == DFU_STR_DESC_IDX) - { - USBD_GetString((uint8_t *)DFU_STR_DESC, USBD_StrDesc, length); - } -#endif -#if (USBD_USE_PRNTR == 1) - if (index == PRINTER_STR_DESC_IDX) - { - USBD_GetString((uint8_t *)PRNT_STR_DESC, USBD_StrDesc, length); - } -#endif - return USBD_StrDesc; - } - else - { - /* Not supported Interface Descriptor index */ - return NULL; - } -} -#endif - -void USBD_COMPOSITE_Mount_Class (void) -{ - uint16_t len = 0; - uint8_t *ptr = NULL; - - uint8_t in_ep_track = 0x81; - uint8_t out_ep_track = 0x01; - uint8_t interface_no_track = 0x00; - -#if (USBD_USE_CDC_RNDIS == 1) - ptr = USBD_CDC_RNDIS.GetFSConfigDescriptor(&len); - USBD_Update_CDC_RNDIS_DESC(ptr, - interface_no_track, - interface_no_track + 1, - in_ep_track, - in_ep_track + 1, - out_ep_track, - USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_FSCfgDesc.USBD_CDC_RNDIS_DESC, ptr + 0x09, len - 0x09); - - ptr = USBD_CDC_RNDIS.GetHSConfigDescriptor(&len); - USBD_Update_CDC_RNDIS_DESC(ptr, - interface_no_track, - interface_no_track + 1, - in_ep_track, - in_ep_track + 1, - out_ep_track, - USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_HSCfgDesc.USBD_CDC_RNDIS_DESC, ptr + 0x09, len - 0x09); - - in_ep_track += 2; - out_ep_track += 1; - interface_no_track += 2; - USBD_Track_String_Index += 1; -#endif - -#if (USBD_USE_CDC_ECM == 1) - ptr = USBD_CDC_ECM.GetFSConfigDescriptor(&len); - USBD_Update_CDC_ECM_DESC(ptr, - interface_no_track, - interface_no_track + 1, - in_ep_track, - in_ep_track + 1, - out_ep_track, - USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_FSCfgDesc.USBD_CDC_ECM_DESC, ptr + 0x09, len - 0x09); - - ptr = USBD_CDC_ECM.GetHSConfigDescriptor(&len); - USBD_Update_CDC_ECM_DESC(ptr, - interface_no_track, - interface_no_track + 1, - in_ep_track, - in_ep_track + 1, - out_ep_track, - USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_HSCfgDesc.USBD_CDC_ECM_DESC, ptr + 0x09, len - 0x09); - - in_ep_track += 2; - out_ep_track += 1; - interface_no_track += 2; - USBD_Track_String_Index += 1; -#endif - -#if (USBD_USE_HID_MOUSE == 1) - ptr = USBD_HID_MOUSE.GetFSConfigDescriptor(&len); - USBD_Update_HID_Mouse_DESC(ptr, interface_no_track, in_ep_track, USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_FSCfgDesc.USBD_HID_MOUSE_DESC, ptr + 0x09, len - 0x09); - - ptr = USBD_HID_MOUSE.GetHSConfigDescriptor(&len); - USBD_Update_HID_Mouse_DESC(ptr, interface_no_track, in_ep_track, USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_HSCfgDesc.USBD_HID_MOUSE_DESC, ptr + 0x09, len - 0x09); - - in_ep_track += 1; - interface_no_track += 1; - USBD_Track_String_Index += 1; -#endif - -#if (USBD_USE_HID_KEYBOARD == 1) - ptr = USBD_HID_KEYBOARD.GetFSConfigDescriptor(&len); - USBD_Update_HID_KBD_DESC(ptr, interface_no_track, in_ep_track, USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_FSCfgDesc.USBD_HID_KEYBOARD_DESC, ptr + 0x09, len - 0x09); - - ptr = USBD_HID_KEYBOARD.GetHSConfigDescriptor(&len); - USBD_Update_HID_KBD_DESC(ptr, interface_no_track, in_ep_track, USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_HSCfgDesc.USBD_HID_KEYBOARD_DESC, ptr + 0x09, len - 0x09); - - in_ep_track += 1; - interface_no_track += 1; - USBD_Track_String_Index += 1; -#endif - -#if (USBD_USE_HID_CUSTOM == 1) - ptr = USBD_HID_CUSTOM.GetFSConfigDescriptor(&len); - USBD_Update_HID_Custom_DESC(ptr, interface_no_track, in_ep_track, out_ep_track, USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_FSCfgDesc.USBD_HID_CUSTOM_DESC, ptr + 0x09, len - 0x09); - - ptr = USBD_HID_CUSTOM.GetHSConfigDescriptor(&len); - USBD_Update_HID_Custom_DESC(ptr, interface_no_track, in_ep_track, out_ep_track, USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_HSCfgDesc.USBD_HID_CUSTOM_DESC, ptr + 0x09, len - 0x09); - - in_ep_track += 1; - out_ep_track += 1; - interface_no_track += 1; - USBD_Track_String_Index += 1; -#endif - -#if (USBD_USE_UAC_MIC == 1) - ptr = USBD_AUDIO_MIC.GetFSConfigDescriptor(&len); - USBD_Update_Audio_MIC_DESC(ptr, - interface_no_track, - interface_no_track + 1, - in_ep_track, - USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_FSCfgDesc.USBD_UAC_MIC_DESC, ptr + 0x09, len - 0x09); - - ptr = USBD_AUDIO_MIC.GetHSConfigDescriptor(&len); - USBD_Update_Audio_MIC_DESC(ptr, - interface_no_track, - interface_no_track + 1, - in_ep_track, - USBD_Track_String_Index); - - memcpy(USBD_COMPOSITE_HSCfgDesc.USBD_UAC_MIC_DESC, ptr + 0x09, len - 0x09); - in_ep_track += 1; - interface_no_track += 2; - USBD_Track_String_Index += 1; -#endif - -#if (USBD_USE_UAC_SPKR == 1) - ptr = USBD_AUDIO_SPKR.GetFSConfigDescriptor(&len); - USBD_Update_Audio_SPKR_DESC(ptr, interface_no_track, interface_no_track + 1, out_ep_track, USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_FSCfgDesc.USBD_AUDIO_SPKR_DESC, ptr + 0x09, len - 0x09); - - ptr = USBD_AUDIO_SPKR.GetHSConfigDescriptor(&len); - USBD_Update_Audio_SPKR_DESC(ptr, interface_no_track, interface_no_track + 1, out_ep_track, USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_HSCfgDesc.USBD_AUDIO_SPKR_DESC, ptr + 0x09, len - 0x09); - - out_ep_track += 1; - interface_no_track += 2; - USBD_Track_String_Index += 1; -#endif - -#if (USBD_USE_UVC == 1) - ptr = USBD_VIDEO.GetFSConfigDescriptor(&len); - USBD_Update_UVC_DESC(ptr, interface_no_track, interface_no_track + 1, in_ep_track, USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_FSCfgDesc.USBD_UVC_DESC, ptr + 0x09, len - 0x09); - - ptr = USBD_VIDEO.GetHSConfigDescriptor(&len); - USBD_Update_UVC_DESC(ptr, interface_no_track, interface_no_track + 1, in_ep_track, USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_HSCfgDesc.USBD_UVC_DESC, ptr + 0x09, len - 0x09); - - in_ep_track += 1; - interface_no_track += 2; - USBD_Track_String_Index += 1; -#endif - -#if (USBD_USE_MSC == 1) - ptr = USBD_MSC.GetFSConfigDescriptor(&len); - USBD_Update_MSC_DESC(ptr, interface_no_track, in_ep_track, out_ep_track, USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_FSCfgDesc.USBD_MSC_DESC, ptr + 0x09, len - 0x09); - - ptr = USBD_MSC.GetHSConfigDescriptor(&len); - USBD_Update_MSC_DESC(ptr, interface_no_track, in_ep_track, out_ep_track, USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_HSCfgDesc.USBD_MSC_DESC, ptr + 0x09, len - 0x09); - - in_ep_track += 1; - out_ep_track += 1; - interface_no_track += 1; - USBD_Track_String_Index += 1; -#endif - -#if (USBD_USE_DFU == 1) - ptr = USBD_DFU.GetFSConfigDescriptor(&len); - USBD_Update_DFU_DESC(ptr, interface_no_track, USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_FSCfgDesc.USBD_DFU_DESC, ptr + 0x09, len - 0x09); - - ptr = USBD_DFU.GetHSConfigDescriptor(&len); - USBD_Update_DFU_DESC(ptr, interface_no_track, USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_HSCfgDesc.USBD_DFU_DESC, ptr + 0x09, len - 0x09); - - interface_no_track += USBD_DFU_MAX_ITF_NUM; - USBD_Track_String_Index += USBD_DFU_MAX_ITF_NUM; -#endif - -#if (USBD_USE_PRNTR == 1) - ptr = USBD_PRNT.GetFSConfigDescriptor(&len); - USBD_Update_PRNT_DESC(ptr, interface_no_track, in_ep_track, out_ep_track, USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_FSCfgDesc.USBD_PRNTR_DESC, ptr + 0x09, len - 0x09); - - ptr = USBD_PRNT.GetHSConfigDescriptor(&len); - USBD_Update_PRNT_DESC(ptr, interface_no_track, in_ep_track, out_ep_track, USBD_Track_String_Index); - memcpy(USBD_COMPOSITE_HSCfgDesc.USBD_PRNTR_DESC, ptr + 0x09, len - 0x09); - - in_ep_track += 1; - out_ep_track += 1; - interface_no_track += 1; - USBD_Track_String_Index += 1; -#endif - -#if (USBD_USE_CDC_ACM == 1) - ptr = USBD_CDC_ACM.GetFSConfigDescriptor (&len); - USBD_Update_CDC_ACM_DESC (ptr, interface_no_track, interface_no_track + 1, in_ep_track, in_ep_track + 1, out_ep_track, USBD_Track_String_Index); - memcpy (USBD_COMPOSITE_FSCfgDesc.USBD_CDC_ACM_DESC, ptr + 0x09, len - 0x09); - - ptr = USBD_CDC_ACM.GetHSConfigDescriptor (&len); - USBD_Update_CDC_ACM_DESC (ptr, interface_no_track, interface_no_track + 1, in_ep_track, in_ep_track + 1, out_ep_track, USBD_Track_String_Index); - memcpy (USBD_COMPOSITE_HSCfgDesc.USBD_CDC_ACM_DESC, ptr + 0x09, len - 0x09); - - in_ep_track += 2 * USBD_CDC_ACM_COUNT; - out_ep_track += 1 * USBD_CDC_ACM_COUNT; - interface_no_track += 2 * USBD_CDC_ACM_COUNT; - USBD_Track_String_Index += USBD_CDC_ACM_COUNT; -#endif - - uint16_t CFG_SIZE = sizeof(USBD_COMPOSITE_CFG_DESC_t); - ptr = USBD_COMPOSITE_HSCfgDesc.CONFIG_DESC; - /* Configuration Descriptor */ - ptr[0] = 0x09; /* bLength: Configuration Descriptor size */ - ptr[1] = USB_DESC_TYPE_CONFIGURATION; /* bDescriptorType: Configuration */ - ptr[2] = LOBYTE(CFG_SIZE); /* wTotalLength:no of returned bytes */ - ptr[3] = HIBYTE(CFG_SIZE); - ptr[4] = interface_no_track; /* bNumInterfaces: 2 interface */ - ptr[5] = 0x01; /* bConfigurationValue: Configuration value */ - ptr[6] = 0x00; /* iConfiguration: Index of string descriptor describing the configuration */ -#if (USBD_SELF_POWERED == 1U) - ptr[7] = 0xC0; /* bmAttributes: Bus Powered according to user configuration */ -#else - ptr[7] = 0x80; /* bmAttributes: Bus Powered according to user configuration */ -#endif - ptr[8] = USBD_MAX_POWER; /* MaxPower 100 mA */ - - ptr = USBD_COMPOSITE_FSCfgDesc.CONFIG_DESC; - /* Configuration Descriptor */ - ptr[0] = 0x09; /* bLength: Configuration Descriptor size */ - ptr[1] = USB_DESC_TYPE_CONFIGURATION; /* bDescriptorType: Configuration */ - ptr[2] = LOBYTE(CFG_SIZE); /* wTotalLength:no of returned bytes */ - ptr[3] = HIBYTE(CFG_SIZE); - ptr[4] = interface_no_track; /* bNumInterfaces: 2 interface */ - ptr[5] = 0x01; /* bConfigurationValue: Configuration value */ - ptr[6] = 0x00; /* iConfiguration: Index of string descriptor describing the configuration */ -#if (USBD_SELF_POWERED == 1U) - ptr[7] = 0xC0; /* bmAttributes: Bus Powered according to user configuration */ -#else - ptr[7] = 0x80; /* bmAttributes: Bus Powered according to user configuration */ -#endif - ptr[8] = USBD_MAX_POWER; /* MaxPower 100 mA */ - - (void) out_ep_track; - (void) in_ep_track; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/AL94_USB_Composite/Core/Inc/usbd_core.h b/common/AL94_USB_Composite/Core/Inc/usbd_core.h deleted file mode 100644 index c7426ad..0000000 --- a/common/AL94_USB_Composite/Core/Inc/usbd_core.h +++ /dev/null @@ -1,149 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_core.h - * @author MCD Application Team - * @brief Header file for usbd_core.c file - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2015 STMicroelectronics. - * All rights reserved.

- * - * 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 - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CORE_H -#define __USBD_CORE_H - -#ifdef __cplusplus -extern "C" -{ -#endif - - /* Includes ------------------------------------------------------------------*/ -#include "usbd_conf.h" -#include "usbd_def.h" -#include "usbd_ioreq.h" -#include "usbd_ctlreq.h" - - /** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - /** @defgroup USBD_CORE - * @brief This file is the Header file for usbd_core.c file - * @{ - */ - - /** @defgroup USBD_CORE_Exported_Defines - * @{ - */ -#ifndef USBD_DEBUG_LEVEL -#define USBD_DEBUG_LEVEL 0U -#endif /* USBD_DEBUG_LEVEL */ - /** - * @} - */ - - /** @defgroup USBD_CORE_Exported_TypesDefinitions - * @{ - */ - - /** - * @} - */ - - /** @defgroup USBD_CORE_Exported_Macros - * @{ - */ - - /** - * @} - */ - - /** @defgroup USBD_CORE_Exported_Variables - * @{ - */ -#define USBD_SOF USBD_LL_SOF - /** - * @} - */ - - /** @defgroup USBD_CORE_Exported_FunctionsPrototype - * @{ - */ - USBD_StatusTypeDef USBD_Init (USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id); - USBD_StatusTypeDef USBD_DeInit (USBD_HandleTypeDef *pdev); - USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev); - USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev); - USBD_StatusTypeDef USBD_RegisterClass (USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass); - - USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev); - USBD_StatusTypeDef USBD_SetClassConfig (USBD_HandleTypeDef *pdev, uint8_t cfgidx); - USBD_StatusTypeDef USBD_ClrClassConfig (USBD_HandleTypeDef *pdev, uint8_t cfgidx); - - USBD_StatusTypeDef USBD_LL_SetupStage (USBD_HandleTypeDef *pdev, uint8_t *psetup); - USBD_StatusTypeDef USBD_LL_DataOutStage (USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata); - USBD_StatusTypeDef USBD_LL_DataInStage (USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata); - - USBD_StatusTypeDef USBD_LL_Reset (USBD_HandleTypeDef *pdev); - USBD_StatusTypeDef USBD_LL_SetSpeed (USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed); - USBD_StatusTypeDef USBD_LL_Suspend (USBD_HandleTypeDef *pdev); - USBD_StatusTypeDef USBD_LL_Resume (USBD_HandleTypeDef *pdev); - - USBD_StatusTypeDef USBD_LL_SOF (USBD_HandleTypeDef *pdev); - USBD_StatusTypeDef USBD_LL_IsoINIncomplete (USBD_HandleTypeDef *pdev, uint8_t epnum); - USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete (USBD_HandleTypeDef *pdev, uint8_t epnum); - - USBD_StatusTypeDef USBD_LL_DevConnected (USBD_HandleTypeDef *pdev); - USBD_StatusTypeDef USBD_LL_DevDisconnected (USBD_HandleTypeDef *pdev); - - /* USBD Low Level Driver */ - USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev); - USBD_StatusTypeDef USBD_LL_DeInit (USBD_HandleTypeDef *pdev); - USBD_StatusTypeDef USBD_LL_Start (USBD_HandleTypeDef *pdev); - USBD_StatusTypeDef USBD_LL_Stop (USBD_HandleTypeDef *pdev); - - USBD_StatusTypeDef USBD_LL_OpenEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_mps); - - USBD_StatusTypeDef USBD_LL_CloseEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); - USBD_StatusTypeDef USBD_LL_FlushEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); - USBD_StatusTypeDef USBD_LL_StallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); - USBD_StatusTypeDef USBD_LL_ClearStallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); - USBD_StatusTypeDef USBD_LL_SetUSBAddress (USBD_HandleTypeDef *pdev, uint8_t dev_addr); - - USBD_StatusTypeDef USBD_LL_Transmit (USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size); - - USBD_StatusTypeDef USBD_LL_PrepareReceive (USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size); - - uint8_t USBD_LL_IsStallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); - uint32_t USBD_LL_GetRxDataSize (USBD_HandleTypeDef *pdev, uint8_t ep_addr); - - void USBD_LL_Delay (uint32_t Delay); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_CORE_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/common/AL94_USB_Composite/Core/Inc/usbd_ctlreq.h b/common/AL94_USB_Composite/Core/Inc/usbd_ctlreq.h deleted file mode 100644 index 0eeb2ff..0000000 --- a/common/AL94_USB_Composite/Core/Inc/usbd_ctlreq.h +++ /dev/null @@ -1,99 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_req.h - * @author MCD Application Team - * @brief Header file for the usbd_req.c file - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2015 STMicroelectronics. - * All rights reserved.

- * - * 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 - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USB_REQUEST_H -#define __USB_REQUEST_H - -#ifdef __cplusplus -extern "C" -{ -#endif - - /* Includes ------------------------------------------------------------------*/ -#include "usbd_def.h" - - /** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - /** @defgroup USBD_REQ - * @brief header file for the usbd_req.c file - * @{ - */ - - /** @defgroup USBD_REQ_Exported_Defines - * @{ - */ - /** - * @} - */ - - /** @defgroup USBD_REQ_Exported_Types - * @{ - */ - /** - * @} - */ - - /** @defgroup USBD_REQ_Exported_Macros - * @{ - */ - /** - * @} - */ - - /** @defgroup USBD_REQ_Exported_Variables - * @{ - */ - /** - * @} - */ - - /** @defgroup USBD_REQ_Exported_FunctionsPrototype - * @{ - */ - - USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); - USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); - USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); - - void USBD_CtlError (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); - void USBD_ParseSetupRequest (USBD_SetupReqTypedef *req, uint8_t *pdata); - void USBD_GetString (uint8_t *desc, uint8_t *unicode, uint16_t *len); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USB_REQUEST_H */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/AL94_USB_Composite/Core/Inc/usbd_def.h b/common/AL94_USB_Composite/Core/Inc/usbd_def.h deleted file mode 100644 index 3002c36..0000000 --- a/common/AL94_USB_Composite/Core/Inc/usbd_def.h +++ /dev/null @@ -1,429 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_def.h - * @author MCD Application Team - * @brief General defines for the usb device library - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2015 STMicroelectronics. - * All rights reserved.

- * - * 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 - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_DEF_H -#define __USBD_DEF_H - -#ifdef __cplusplus -extern "C" -{ -#endif - - /* Includes ------------------------------------------------------------------*/ -#include "usbd_conf.h" - - /** @addtogroup STM32_USBD_DEVICE_LIBRARY - * @{ - */ - - /** @defgroup USB_DEF - * @brief general defines for the usb device library file - * @{ - */ - - /** @defgroup USB_DEF_Exported_Defines - * @{ - */ - -#ifndef NULL -#define NULL 0U -#endif /* NULL */ - -#ifndef USBD_MAX_NUM_INTERFACES -#define USBD_MAX_NUM_INTERFACES 1U -#endif /* USBD_MAX_NUM_CONFIGURATION */ - -#ifndef USBD_MAX_NUM_CONFIGURATION -#define USBD_MAX_NUM_CONFIGURATION 1U -#endif /* USBD_MAX_NUM_CONFIGURATION */ - -#ifndef USBD_LPM_ENABLED -#define USBD_LPM_ENABLED 0U -#endif /* USBD_LPM_ENABLED */ - -#ifndef USBD_SELF_POWERED -#define USBD_SELF_POWERED 1U -#endif /*USBD_SELF_POWERED */ - -#ifndef USBD_MAX_POWER -#define USBD_MAX_POWER 0x32U /* 100 mA */ -#endif /* USBD_MAX_POWER */ - -#ifndef USBD_SUPPORT_USER_STRING_DESC -#define USBD_SUPPORT_USER_STRING_DESC 0U -#endif /* USBD_SUPPORT_USER_STRING_DESC */ - -#ifndef USBD_CLASS_USER_STRING_DESC -#define USBD_CLASS_USER_STRING_DESC 0U -#endif /* USBD_CLASS_USER_STRING_DESC */ - -#define USB_LEN_DEV_QUALIFIER_DESC 0x0AU -#define USB_LEN_DEV_DESC 0x12U -#define USB_LEN_CFG_DESC 0x09U -#define USB_LEN_IF_DESC 0x09U -#define USB_LEN_EP_DESC 0x07U -#define USB_LEN_OTG_DESC 0x03U -#define USB_LEN_LANGID_STR_DESC 0x04U -#define USB_LEN_OTHER_SPEED_DESC_SIZ 0x09U - -#define USBD_IDX_LANGID_STR 0x00U -#define USBD_IDX_MFC_STR 0x01U -#define USBD_IDX_PRODUCT_STR 0x02U -#define USBD_IDX_SERIAL_STR 0x03U -#define USBD_IDX_CONFIG_STR 0x04U -#define USBD_IDX_INTERFACE_STR 0x05U - -#define USB_REQ_TYPE_STANDARD 0x00U -#define USB_REQ_TYPE_CLASS 0x20U -#define USB_REQ_TYPE_VENDOR 0x40U -#define USB_REQ_TYPE_MASK 0x60U - -#define USB_REQ_RECIPIENT_DEVICE 0x00U -#define USB_REQ_RECIPIENT_INTERFACE 0x01U -#define USB_REQ_RECIPIENT_ENDPOINT 0x02U -#define USB_REQ_RECIPIENT_MASK 0x03U - -#define USB_REQ_GET_STATUS 0x00U -#define USB_REQ_CLEAR_FEATURE 0x01U -#define USB_REQ_SET_FEATURE 0x03U -#define USB_REQ_SET_ADDRESS 0x05U -#define USB_REQ_GET_DESCRIPTOR 0x06U -#define USB_REQ_SET_DESCRIPTOR 0x07U -#define USB_REQ_GET_CONFIGURATION 0x08U -#define USB_REQ_SET_CONFIGURATION 0x09U -#define USB_REQ_GET_INTERFACE 0x0AU -#define USB_REQ_SET_INTERFACE 0x0BU -#define USB_REQ_SYNCH_FRAME 0x0CU - -#define USB_DESC_TYPE_DEVICE 0x01U -#define USB_DESC_TYPE_CONFIGURATION 0x02U -#define USB_DESC_TYPE_STRING 0x03U -#define USB_DESC_TYPE_INTERFACE 0x04U -#define USB_DESC_TYPE_ENDPOINT 0x05U -#define USB_DESC_TYPE_DEVICE_QUALIFIER 0x06U -#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 0x07U -#define USB_DESC_TYPE_IAD 0x0BU -#define USB_DESC_TYPE_BOS 0x0FU - -#define USB_CONFIG_REMOTE_WAKEUP 0x02U -#define USB_CONFIG_SELF_POWERED 0x01U - -#define USB_FEATURE_EP_HALT 0x00U -#define USB_FEATURE_REMOTE_WAKEUP 0x01U -#define USB_FEATURE_TEST_MODE 0x02U - -#define USB_DEVICE_CAPABITY_TYPE 0x10U - -#define USB_CONF_DESC_SIZE 0x09U -#define USB_IF_DESC_SIZE 0x09U -#define USB_EP_DESC_SIZE 0x07U -#define USB_IAD_DESC_SIZE 0x08U - -#define USB_HS_MAX_PACKET_SIZE 512U -#define USB_FS_MAX_PACKET_SIZE 64U -#define USB_MAX_EP0_SIZE 64U - - /* Device Status */ -#define USBD_STATE_DEFAULT 0x01U -#define USBD_STATE_ADDRESSED 0x02U -#define USBD_STATE_CONFIGURED 0x03U -#define USBD_STATE_SUSPENDED 0x04U - - /* EP0 State */ -#define USBD_EP0_IDLE 0x00U -#define USBD_EP0_SETUP 0x01U -#define USBD_EP0_DATA_IN 0x02U -#define USBD_EP0_DATA_OUT 0x03U -#define USBD_EP0_STATUS_IN 0x04U -#define USBD_EP0_STATUS_OUT 0x05U -#define USBD_EP0_STALL 0x06U - -#define USBD_EP_TYPE_CTRL 0x00U -#define USBD_EP_TYPE_ISOC 0x01U -#define USBD_EP_TYPE_BULK 0x02U -#define USBD_EP_TYPE_INTR 0x03U - - /** - * @} - */ - - /** @defgroup USBD_DEF_Exported_TypesDefinitions - * @{ - */ - - typedef struct usb_setup_req - { - uint8_t bmRequest; - uint8_t bRequest; - uint16_t wValue; - uint16_t wIndex; - uint16_t wLength; - } USBD_SetupReqTypedef; - - typedef struct - { - uint8_t bLength; - uint8_t bDescriptorType; - uint16_t wTotalLength; - uint8_t bNumInterfaces; - uint8_t bConfigurationValue; - uint8_t iConfiguration; - uint8_t bmAttributes; - uint8_t bMaxPower; - } USBD_ConfigDescTypedef; - - typedef struct - { - uint8_t bLength; - uint8_t bDescriptorType; - uint16_t wTotalLength; - uint8_t bNumDeviceCaps; - } USBD_BosDescTypedef; - - typedef struct - { - uint8_t bLength; - uint8_t bDescriptorType; - uint8_t bEndpointAddress; - uint8_t bmAttributes; - uint16_t wMaxPacketSize; - uint8_t bInterval; - } USBD_EpDescTypedef; - - struct _USBD_HandleTypeDef; - - typedef struct _Device_cb - { - uint8_t (*Init) (struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx); - uint8_t (*DeInit) (struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx); - /* Control Endpoints*/ - uint8_t (*Setup) (struct _USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); - uint8_t (*EP0_TxSent) (struct _USBD_HandleTypeDef *pdev); - uint8_t (*EP0_RxReady) (struct _USBD_HandleTypeDef *pdev); - /* Class Specific Endpoints*/ - uint8_t (*DataIn) (struct _USBD_HandleTypeDef *pdev, uint8_t epnum); - uint8_t (*DataOut) (struct _USBD_HandleTypeDef *pdev, uint8_t epnum); - uint8_t (*SOF) (struct _USBD_HandleTypeDef *pdev); - uint8_t (*IsoINIncomplete) (struct _USBD_HandleTypeDef *pdev, uint8_t epnum); - uint8_t (*IsoOUTIncomplete) (struct _USBD_HandleTypeDef *pdev, uint8_t epnum); - - uint8_t* (*GetHSConfigDescriptor) (uint16_t *length); - uint8_t* (*GetFSConfigDescriptor) (uint16_t *length); - uint8_t* (*GetOtherSpeedConfigDescriptor) (uint16_t *length); - uint8_t* (*GetDeviceQualifierDescriptor) (uint16_t *length); -#if (USBD_SUPPORT_USER_STRING_DESC == 1U) - uint8_t* (*GetUsrStrDescriptor) (struct _USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length); -#endif - - } USBD_ClassTypeDef; - - /* Following USB Device Speed */ - typedef enum - { - USBD_SPEED_HIGH = 0U, USBD_SPEED_FULL = 1U, USBD_SPEED_LOW = 2U, - } USBD_SpeedTypeDef; - - /* Following USB Device status */ - typedef enum - { - USBD_OK = 0U, USBD_BUSY, USBD_EMEM, USBD_FAIL, - } USBD_StatusTypeDef; - - /* USB Device descriptors structure */ - typedef struct - { - uint8_t* (*GetDeviceDescriptor) (USBD_SpeedTypeDef speed, uint16_t *length); - uint8_t* (*GetLangIDStrDescriptor) (USBD_SpeedTypeDef speed, uint16_t *length); - uint8_t* (*GetManufacturerStrDescriptor) (USBD_SpeedTypeDef speed, uint16_t *length); - uint8_t* (*GetProductStrDescriptor) (USBD_SpeedTypeDef speed, uint16_t *length); - uint8_t* (*GetSerialStrDescriptor) (USBD_SpeedTypeDef speed, uint16_t *length); - uint8_t* (*GetConfigurationStrDescriptor) (USBD_SpeedTypeDef speed, uint16_t *length); - uint8_t* (*GetInterfaceStrDescriptor) (USBD_SpeedTypeDef speed, uint16_t *length); -#if (USBD_CLASS_USER_STRING_DESC == 1) - uint8_t *(*GetUserStrDescriptor)(USBD_SpeedTypeDef speed, uint8_t idx, uint16_t *length); -#endif -#if ((USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1)) - uint8_t *(*GetBOSDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); -#endif - } USBD_DescriptorsTypeDef; - - /* USB Device handle structure */ - typedef struct - { - uint32_t status; - uint32_t total_length; - uint32_t rem_length; - uint32_t maxpacket; - uint16_t is_used; - uint16_t bInterval; - } USBD_EndpointTypeDef; - - /* USB Device handle structure */ - typedef struct _USBD_HandleTypeDef - { - uint8_t id; - uint32_t dev_config; - uint32_t dev_default_config; - uint32_t dev_config_status; - USBD_SpeedTypeDef dev_speed; - USBD_EndpointTypeDef ep_in[16]; - USBD_EndpointTypeDef ep_out[16]; - __IO uint32_t ep0_state; - uint32_t ep0_data_len; - __IO uint8_t dev_state; - __IO uint8_t dev_old_state; - uint8_t dev_address; - uint8_t dev_connection_status; - uint8_t dev_test_mode; - uint32_t dev_remote_wakeup; - uint8_t ConfIdx; - - USBD_SetupReqTypedef request; - USBD_DescriptorsTypeDef *pDesc; - USBD_ClassTypeDef *pClass; - void *pUserData_CDC_ACM; - void *pClassData_CDC_RNDIS; - void *pUserData_CDC_RNDIS; - void *pClassData_CDC_ECM; - void *pUserData_CDC_ECM; - void *pClassData_HID_Mouse; - void *pClassData_HID_Keyboard; - void *pClassData_HID_Custom; - void *pUserData_HID_Custom; - void *pClassData_UAC_MIC; - void *pUserData_UAC_MIC; - void *pClassData_UAC_SPKR; - void *pUserData_UAC_SPKR; - void *pClassData_UVC; - void *pUserData_UVC; - void *pClassData_MSC; - void *pUserData_MSC; - void *pClassData_DFU; - void *pUserData_DFU; - void *pClassData_PRNTR; - void *pUserData_PRNTR; - void *pData; - void *pBosDesc; - void *pConfDesc; - } USBD_HandleTypeDef; - - /** - * @} - */ - - /** @defgroup USBD_DEF_Exported_Macros - * @{ - */ - __STATIC_INLINE uint16_t SWAPBYTE (uint8_t *addr) - { - uint16_t _SwapVal, _Byte1, _Byte2; - uint8_t *_pbuff = addr; - - _Byte1 = *(uint8_t*) _pbuff; - _pbuff++; - _Byte2 = *(uint8_t*) _pbuff; - - _SwapVal = (_Byte2 << 8) | _Byte1; - - return _SwapVal; - } - -#ifndef LOBYTE -#define LOBYTE(x) ((uint8_t)((x) & 0x00FFU)) -#endif - -#ifndef HIBYTE -#define HIBYTE(x) ((uint8_t)(((x) & 0xFF00U) >> 8U)) -#endif - -#ifndef MIN -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) -#endif - -#ifndef MAX -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) -#endif - -#if defined ( __GNUC__ ) -#ifndef __weak -#define __weak __attribute__((weak)) -#endif /* __weak */ -#ifndef __packed -#define __packed __attribute__((__packed__)) -#endif /* __packed */ -#endif /* __GNUC__ */ - -/* In HS mode and when the DMA is used, all variables and data structures dealing - with the DMA during the transaction process should be 4-bytes aligned */ - -#if defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ -#ifndef __ALIGN_END -#define __ALIGN_END __attribute__ ((aligned (4U))) -#endif /* __ALIGN_END */ -#ifndef __ALIGN_BEGIN -#define __ALIGN_BEGIN -#endif /* __ALIGN_BEGIN */ -#else -#ifndef __ALIGN_END -#define __ALIGN_END -#endif /* __ALIGN_END */ -#ifndef __ALIGN_BEGIN -#if defined (__CC_ARM) /* ARM Compiler */ -#define __ALIGN_BEGIN __align(4U) -#elif defined (__ICCARM__) /* IAR Compiler */ -#define __ALIGN_BEGIN -#endif /* __CC_ARM */ -#endif /* __ALIGN_BEGIN */ -#endif /* __GNUC__ */ - -/** - * @} - */ - -/** @defgroup USBD_DEF_Exported_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_DEF_Exported_FunctionsPrototype - * @{ - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_DEF_H */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/AL94_USB_Composite/Core/Inc/usbd_ioreq.h b/common/AL94_USB_Composite/Core/Inc/usbd_ioreq.h deleted file mode 100644 index 8d56fc2..0000000 --- a/common/AL94_USB_Composite/Core/Inc/usbd_ioreq.h +++ /dev/null @@ -1,107 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_ioreq.h - * @author MCD Application Team - * @brief Header file for the usbd_ioreq.c file - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2015 STMicroelectronics. - * All rights reserved.

- * - * 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 - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_IOREQ_H -#define __USBD_IOREQ_H - -#ifdef __cplusplus -extern "C" -{ -#endif - - /* Includes ------------------------------------------------------------------*/ -#include "usbd_def.h" -#include "usbd_core.h" - - /** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - - /** @defgroup USBD_IOREQ - * @brief header file for the usbd_ioreq.c file - * @{ - */ - - /** @defgroup USBD_IOREQ_Exported_Defines - * @{ - */ - /** - * @} - */ - - /** @defgroup USBD_IOREQ_Exported_Types - * @{ - */ - - /** - * @} - */ - - /** @defgroup USBD_IOREQ_Exported_Macros - * @{ - */ - - /** - * @} - */ - - /** @defgroup USBD_IOREQ_Exported_Variables - * @{ - */ - - /** - * @} - */ - - /** @defgroup USBD_IOREQ_Exported_FunctionsPrototype - * @{ - */ - - USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev, uint8_t *pbuf, uint32_t len); - - USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev, uint8_t *pbuf, uint32_t len); - - USBD_StatusTypeDef USBD_CtlPrepareRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, uint32_t len); - - USBD_StatusTypeDef USBD_CtlContinueRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, uint32_t len); - - USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev); - USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev); - - uint32_t USBD_GetRxCount (USBD_HandleTypeDef *pdev, uint8_t ep_addr); - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_IOREQ_H */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/AL94_USB_Composite/Core/Src/usbd_core.c b/common/AL94_USB_Composite/Core/Src/usbd_core.c deleted file mode 100644 index ad7bf28..0000000 --- a/common/AL94_USB_Composite/Core/Src/usbd_core.c +++ /dev/null @@ -1,673 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_core.c - * @author MCD Application Team - * @brief This file provides all the USBD core functions. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2015 STMicroelectronics. - * All rights reserved.

- * - * 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 - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_core.h" - -/** @addtogroup STM32_USBD_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_CORE - * @brief usbd core module - * @{ - */ - -/** @defgroup USBD_CORE_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Private_Defines - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CORE_Private_Functions - * @{ - */ - -/** - * @brief USBD_Init - * Initializes the device stack and load the class driver - * @param pdev: device instance - * @param pdesc: Descriptor structure address - * @param id: Low level core index - * @retval None - */ -USBD_StatusTypeDef USBD_Init (USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id) -{ - USBD_StatusTypeDef ret; - - /* Check whether the USB Host handle is valid */ - if (pdev == NULL) - { -#if (USBD_DEBUG_LEVEL > 1U) - USBD_ErrLog("Invalid Device handle"); -#endif - return USBD_FAIL; - } - - /* Unlink previous class resources */ - pdev->pClass = NULL; - pdev->pConfDesc = NULL; - - /* Assign USBD Descriptors */ - if (pdesc != NULL) - { - pdev->pDesc = pdesc; - } - - /* Set Device initial State */ - pdev->dev_state = USBD_STATE_DEFAULT; - pdev->id = id; - - /* Initialize low level driver */ - ret = USBD_LL_Init (pdev); - - return ret; -} - -/** - * @brief USBD_DeInit - * Re-Initialize the device library - * @param pdev: device instance - * @retval status: status - */ -USBD_StatusTypeDef USBD_DeInit (USBD_HandleTypeDef *pdev) -{ - USBD_StatusTypeDef ret; - - /* Disconnect the USB Device */ - (void) USBD_LL_Stop (pdev); - - /* Set Default State */ - pdev->dev_state = USBD_STATE_DEFAULT; - - /* Free Class Resources */ - if (pdev->pClass != NULL) - { - pdev->pClass->DeInit (pdev, (uint8_t) pdev->dev_config); - pdev->pClass = NULL; - } - - /* Free Device descriptors resources */ - pdev->pDesc = NULL; - pdev->pConfDesc = NULL; - - /* DeInitialize low level driver */ - ret = USBD_LL_DeInit (pdev); - - return ret; -} - -/** - * @brief USBD_RegisterClass - * Link class driver to Device Core. - * @param pDevice : Device Handle - * @param pclass: Class handle - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_RegisterClass (USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass) -{ - uint16_t len = 0U; - - if (pclass == NULL) - { -#if (USBD_DEBUG_LEVEL > 1U) - USBD_ErrLog("Invalid Class handle"); -#endif - return USBD_FAIL; - } - - /* link the class to the USB Device handle */ - pdev->pClass = pclass; - - /* Get Device Configuration Descriptor */ - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - if (pdev->pClass->GetHSConfigDescriptor != NULL) - { - pdev->pConfDesc = (void*) pdev->pClass->GetHSConfigDescriptor (&len); - } - } - else if (pdev->pClass->GetFSConfigDescriptor != NULL) - { - pdev->pConfDesc = (void*) pdev->pClass->GetFSConfigDescriptor (&len); - } - - return USBD_OK; -} - -/** - * @brief USBD_Start - * Start the USB Device Core. - * @param pdev: Device Handle - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev) -{ - /* Start the low level driver */ - return USBD_LL_Start (pdev); -} - -/** - * @brief USBD_Stop - * Stop the USB Device Core. - * @param pdev: Device Handle - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev) -{ - /* Disconnect USB Device */ - (void) USBD_LL_Stop (pdev); - - /* Free Class Resources */ - if (pdev->pClass != NULL) - { - (void) pdev->pClass->DeInit (pdev, (uint8_t) pdev->dev_config); - } - - return USBD_OK; -} - -/** - * @brief USBD_RunTestMode - * Launch test mode process - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev) -{ - /* Prevent unused argument compilation warning */ - UNUSED(pdev); - - return USBD_OK; -} - -/** - * @brief USBD_SetClassConfig - * Configure device and start the interface - * @param pdev: device instance - * @param cfgidx: configuration index - * @retval status - */ - -USBD_StatusTypeDef USBD_SetClassConfig (USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - USBD_StatusTypeDef ret = USBD_FAIL; - - if (pdev->pClass != NULL) - { - /* Set configuration and Start the Class */ - ret = (USBD_StatusTypeDef) pdev->pClass->Init (pdev, cfgidx); - } - - return ret; -} - -/** - * @brief USBD_ClrClassConfig - * Clear current configuration - * @param pdev: device instance - * @param cfgidx: configuration index - * @retval status: USBD_StatusTypeDef - */ -USBD_StatusTypeDef USBD_ClrClassConfig (USBD_HandleTypeDef *pdev, uint8_t cfgidx) -{ - /* Clear configuration and De-initialize the Class process */ - if (pdev->pClass != NULL) - { - pdev->pClass->DeInit (pdev, cfgidx); - } - - return USBD_OK; -} - -/** - * @brief USBD_LL_SetupStage - * Handle the setup stage - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_LL_SetupStage (USBD_HandleTypeDef *pdev, uint8_t *psetup) -{ - USBD_StatusTypeDef ret; - - USBD_ParseSetupRequest (&pdev->request, psetup); - - pdev->ep0_state = USBD_EP0_SETUP; - - pdev->ep0_data_len = pdev->request.wLength; - - switch (pdev->request.bmRequest & 0x1FU) - { - case USB_REQ_RECIPIENT_DEVICE: - ret = USBD_StdDevReq (pdev, &pdev->request); - break; - - case USB_REQ_RECIPIENT_INTERFACE: - ret = USBD_StdItfReq (pdev, &pdev->request); - break; - - case USB_REQ_RECIPIENT_ENDPOINT: - ret = USBD_StdEPReq (pdev, &pdev->request); - break; - - default: - ret = USBD_LL_StallEP (pdev, (pdev->request.bmRequest & 0x80U)); - break; - } - - return ret; -} - -/** - * @brief USBD_LL_DataOutStage - * Handle data OUT stage - * @param pdev: device instance - * @param epnum: endpoint index - * @param pdata: data pointer - * @retval status - */ -USBD_StatusTypeDef USBD_LL_DataOutStage (USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata) -{ - USBD_EndpointTypeDef *pep; - USBD_StatusTypeDef ret; - - if (epnum == 0U) - { - pep = &pdev->ep_out[0]; - - if (pdev->ep0_state == USBD_EP0_DATA_OUT) - { - if (pep->rem_length > pep->maxpacket) - { - pep->rem_length -= pep->maxpacket; - - (void) USBD_CtlContinueRx (pdev, pdata, MIN(pep->rem_length, pep->maxpacket)); - } - else - { - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (pdev->pClass->EP0_RxReady != NULL) - { - pdev->pClass->EP0_RxReady (pdev); - } - } - - (void) USBD_CtlSendStatus (pdev); - } - } - else - { -#if 0 - if (pdev->ep0_state == USBD_EP0_STATUS_OUT) - { - /* - * STATUS PHASE completed, update ep0_state to idle - */ - pdev->ep0_state = USBD_EP0_IDLE; - (void)USBD_LL_StallEP(pdev, 0U); - } -#endif - } - } - else - { - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (pdev->pClass->DataOut != NULL) - { - ret = (USBD_StatusTypeDef) pdev->pClass->DataOut (pdev, epnum); - - if (ret != USBD_OK) - { - return ret; - } - } - } - } - - return USBD_OK; -} - -/** - * @brief USBD_LL_DataInStage - * Handle data in stage - * @param pdev: device instance - * @param epnum: endpoint index - * @retval status - */ -USBD_StatusTypeDef USBD_LL_DataInStage (USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata) -{ - USBD_EndpointTypeDef *pep; - USBD_StatusTypeDef ret; - - if (epnum == 0U) - { - pep = &pdev->ep_in[0]; - - if (pdev->ep0_state == USBD_EP0_DATA_IN) - { - if (pep->rem_length > pep->maxpacket) - { - pep->rem_length -= pep->maxpacket; - - (void) USBD_CtlContinueSendData (pdev, pdata, pep->rem_length); - - /* Prepare endpoint for premature end of transfer */ - (void) USBD_LL_PrepareReceive (pdev, 0U, NULL, 0U); - } - else - { - /* last packet is MPS multiple, so send ZLP packet */ - if ((pep->maxpacket == pep->rem_length) && (pep->total_length >= pep->maxpacket) && (pep->total_length < pdev->ep0_data_len)) - { - (void) USBD_CtlContinueSendData (pdev, NULL, 0U); - pdev->ep0_data_len = 0U; - - /* Prepare endpoint for premature end of transfer */ - (void) USBD_LL_PrepareReceive (pdev, 0U, NULL, 0U); - } - else - { - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (pdev->pClass->EP0_TxSent != NULL) - { - pdev->pClass->EP0_TxSent (pdev); - } - } - (void) USBD_LL_StallEP (pdev, 0x80U); - (void) USBD_CtlReceiveStatus (pdev); - } - } - } - else - { -#if 0 - if ((pdev->ep0_state == USBD_EP0_STATUS_IN) || - (pdev->ep0_state == USBD_EP0_IDLE)) - { - (void)USBD_LL_StallEP(pdev, 0x80U); - } -#endif - } - - if (pdev->dev_test_mode == 1U) - { - (void) USBD_RunTestMode (pdev); - pdev->dev_test_mode = 0U; - } - } - else - { - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (pdev->pClass->DataIn != NULL) - { - ret = (USBD_StatusTypeDef) pdev->pClass->DataIn (pdev, epnum); - - if (ret != USBD_OK) - { - return ret; - } - } - } - } - - return USBD_OK; -} - -/** - * @brief USBD_LL_Reset - * Handle Reset event - * @param pdev: device instance - * @retval status - */ - -USBD_StatusTypeDef USBD_LL_Reset (USBD_HandleTypeDef *pdev) -{ - /* Upon Reset call user call back */ - pdev->dev_state = USBD_STATE_DEFAULT; - pdev->ep0_state = USBD_EP0_IDLE; - pdev->dev_config = 0U; - pdev->dev_remote_wakeup = 0U; - - if (pdev->pClass == NULL) - { - return USBD_FAIL; - } - - if (pdev->pClass->DeInit != NULL) - { - (void) pdev->pClass->DeInit (pdev, (uint8_t) pdev->dev_config); - } - - /* Open EP0 OUT */ - (void) USBD_LL_OpenEP (pdev, 0x00U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); - pdev->ep_out[0x00U & 0xFU].is_used = 1U; - - pdev->ep_out[0].maxpacket = USB_MAX_EP0_SIZE; - - /* Open EP0 IN */ - (void) USBD_LL_OpenEP (pdev, 0x80U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); - pdev->ep_in[0x80U & 0xFU].is_used = 1U; - - pdev->ep_in[0].maxpacket = USB_MAX_EP0_SIZE; - - return USBD_OK; -} - -/** - * @brief USBD_LL_SetSpeed - * Handle Reset event - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_LL_SetSpeed (USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed) -{ - pdev->dev_speed = speed; - - return USBD_OK; -} - -/** - * @brief USBD_LL_Suspend - * Handle Suspend event - * @param pdev: device instance - * @retval status - */ - -USBD_StatusTypeDef USBD_LL_Suspend (USBD_HandleTypeDef *pdev) -{ - pdev->dev_old_state = pdev->dev_state; - pdev->dev_state = USBD_STATE_SUSPENDED; - - return USBD_OK; -} - -/** - * @brief USBD_LL_Resume - * Handle Resume event - * @param pdev: device instance - * @retval status - */ - -USBD_StatusTypeDef USBD_LL_Resume (USBD_HandleTypeDef *pdev) -{ - if (pdev->dev_state == USBD_STATE_SUSPENDED) - { - pdev->dev_state = pdev->dev_old_state; - } - - return USBD_OK; -} - -/** - * @brief USBD_LL_SOF - * Handle SOF event - * @param pdev: device instance - * @retval status - */ - -USBD_StatusTypeDef USBD_LL_SOF (USBD_HandleTypeDef *pdev) -{ - if (pdev->pClass == NULL) - { - return USBD_FAIL; - } - - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (pdev->pClass->SOF != NULL) - { - (void) pdev->pClass->SOF (pdev); - } - } - - return USBD_OK; -} - -/** - * @brief USBD_LL_IsoINIncomplete - * Handle iso in incomplete event - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_LL_IsoINIncomplete (USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - if (pdev->pClass == NULL) - { - return USBD_FAIL; - } - - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (pdev->pClass->IsoINIncomplete != NULL) - { - (void) pdev->pClass->IsoINIncomplete (pdev, epnum); - } - } - - return USBD_OK; -} - -/** - * @brief USBD_LL_IsoOUTIncomplete - * Handle iso out incomplete event - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete (USBD_HandleTypeDef *pdev, uint8_t epnum) -{ - if (pdev->pClass == NULL) - { - return USBD_FAIL; - } - - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - if (pdev->pClass->IsoOUTIncomplete != NULL) - { - (void) pdev->pClass->IsoOUTIncomplete (pdev, epnum); - } - } - - return USBD_OK; -} - -/** - * @brief USBD_LL_DevConnected - * Handle device connection event - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_LL_DevConnected (USBD_HandleTypeDef *pdev) -{ - /* Prevent unused argument compilation warning */ - UNUSED(pdev); - - return USBD_OK; -} - -/** - * @brief USBD_LL_DevDisconnected - * Handle device disconnection event - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_LL_DevDisconnected (USBD_HandleTypeDef *pdev) -{ - /* Free Class Resources */ - pdev->dev_state = USBD_STATE_DEFAULT; - - if (pdev->pClass != NULL) - { - (void) pdev->pClass->DeInit (pdev, (uint8_t) pdev->dev_config); - } - - return USBD_OK; -} -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ - diff --git a/common/AL94_USB_Composite/Core/Src/usbd_ctlreq.c b/common/AL94_USB_Composite/Core/Src/usbd_ctlreq.c deleted file mode 100644 index 36ae460..0000000 --- a/common/AL94_USB_Composite/Core/Src/usbd_ctlreq.c +++ /dev/null @@ -1,928 +0,0 @@ -/** - ****************************************************************************** - * @file usbd_req.c - * @author MCD Application Team - * @brief This file provides the standard USB requests following chapter 9. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2015 STMicroelectronics. - * All rights reserved.

- * - * 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 - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ctlreq.h" -#include "usbd_ioreq.h" - -/** @addtogroup STM32_USBD_STATE_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_REQ - * @brief USB standard requests module - * @{ - */ - -/** @defgroup USBD_REQ_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_REQ_Private_Defines - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_REQ_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_REQ_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_REQ_Private_FunctionPrototypes - * @{ - */ -static void USBD_GetDescriptor (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void USBD_SetAddress (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static USBD_StatusTypeDef USBD_SetConfig (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void USBD_GetConfig (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void USBD_GetStatus (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void USBD_SetFeature (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static void USBD_ClrFeature (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -static uint8_t USBD_GetLen (uint8_t *buf); - -/** - * @} - */ - -/** @defgroup USBD_REQ_Private_Functions - * @{ - */ - -/** - * @brief USBD_StdDevReq - * Handle standard usb device requests - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_StatusTypeDef ret = USBD_OK; - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS: - case USB_REQ_TYPE_VENDOR: - ret = (USBD_StatusTypeDef) pdev->pClass->Setup (pdev, req); - break; - - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_GET_DESCRIPTOR: - USBD_GetDescriptor (pdev, req); - break; - - case USB_REQ_SET_ADDRESS: - USBD_SetAddress (pdev, req); - break; - - case USB_REQ_SET_CONFIGURATION: - ret = USBD_SetConfig (pdev, req); - break; - - case USB_REQ_GET_CONFIGURATION: - USBD_GetConfig (pdev, req); - break; - - case USB_REQ_GET_STATUS: - USBD_GetStatus (pdev, req); - break; - - case USB_REQ_SET_FEATURE: - USBD_SetFeature (pdev, req); - break; - - case USB_REQ_CLEAR_FEATURE: - USBD_ClrFeature (pdev, req); - break; - - default: - USBD_CtlError (pdev, req); - break; - } - break; - - default: - USBD_CtlError (pdev, req); - break; - } - - return ret; -} - -/** - * @brief USBD_StdItfReq - * Handle standard usb interface requests - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_StatusTypeDef ret = USBD_OK; - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS: - case USB_REQ_TYPE_VENDOR: - case USB_REQ_TYPE_STANDARD: - switch (pdev->dev_state) - { - case USBD_STATE_DEFAULT: - case USBD_STATE_ADDRESSED: - case USBD_STATE_CONFIGURED: - - if (LOBYTE(req->wIndex) <= USBD_MAX_NUM_INTERFACES) - { - ret = (USBD_StatusTypeDef) pdev->pClass->Setup (pdev, req); - - if ((req->wLength == 0U) && (ret == USBD_OK)) - { - (void) USBD_CtlSendStatus (pdev); - } - } - else - { - USBD_CtlError (pdev, req); - } - break; - - default: - USBD_CtlError (pdev, req); - break; - } - break; - - default: - USBD_CtlError (pdev, req); - break; - } - - return ret; -} - -/** - * @brief USBD_StdEPReq - * Handle standard usb endpoint requests - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_EndpointTypeDef *pep; - uint8_t ep_addr; - USBD_StatusTypeDef ret = USBD_OK; - ep_addr = LOBYTE(req->wIndex); - - switch (req->bmRequest & USB_REQ_TYPE_MASK) - { - case USB_REQ_TYPE_CLASS: - case USB_REQ_TYPE_VENDOR: - ret = (USBD_StatusTypeDef) pdev->pClass->Setup (pdev, req); - break; - - case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) - { - case USB_REQ_SET_FEATURE: - switch (pdev->dev_state) - { - case USBD_STATE_ADDRESSED: - if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) - { - (void) USBD_LL_StallEP (pdev, ep_addr); - (void) USBD_LL_StallEP (pdev, 0x80U); - } - else - { - USBD_CtlError (pdev, req); - } - break; - - case USBD_STATE_CONFIGURED: - if (req->wValue == USB_FEATURE_EP_HALT) - { - if ((ep_addr != 0x00U) && (ep_addr != 0x80U) && (req->wLength == 0x00U)) - { - (void) USBD_LL_StallEP (pdev, ep_addr); - } - } - (void) USBD_CtlSendStatus (pdev); - - break; - - default: - USBD_CtlError (pdev, req); - break; - } - break; - - case USB_REQ_CLEAR_FEATURE: - - switch (pdev->dev_state) - { - case USBD_STATE_ADDRESSED: - if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) - { - (void) USBD_LL_StallEP (pdev, ep_addr); - (void) USBD_LL_StallEP (pdev, 0x80U); - } - else - { - USBD_CtlError (pdev, req); - } - break; - - case USBD_STATE_CONFIGURED: - if (req->wValue == USB_FEATURE_EP_HALT) - { - if ((ep_addr & 0x7FU) != 0x00U) - { - (void) USBD_LL_ClearStallEP (pdev, ep_addr); - } - (void) USBD_CtlSendStatus (pdev); - ret = (USBD_StatusTypeDef) pdev->pClass->Setup (pdev, req); - } - break; - - default: - USBD_CtlError (pdev, req); - break; - } - break; - - case USB_REQ_GET_STATUS: - switch (pdev->dev_state) - { - case USBD_STATE_ADDRESSED: - if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) - { - USBD_CtlError (pdev, req); - break; - } - pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU] : &pdev->ep_out[ep_addr & 0x7FU]; - - pep->status = 0x0000U; - - (void) USBD_CtlSendData (pdev, (uint8_t*) &pep->status, 2U); - break; - - case USBD_STATE_CONFIGURED: - if ((ep_addr & 0x80U) == 0x80U) - { - if (pdev->ep_in[ep_addr & 0xFU].is_used == 0U) - { - USBD_CtlError (pdev, req); - break; - } - } - else - { - if (pdev->ep_out[ep_addr & 0xFU].is_used == 0U) - { - USBD_CtlError (pdev, req); - break; - } - } - - pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU] : &pdev->ep_out[ep_addr & 0x7FU]; - - if ((ep_addr == 0x00U) || (ep_addr == 0x80U)) - { - pep->status = 0x0000U; - } - else if (USBD_LL_IsStallEP (pdev, ep_addr) != 0U) - { - pep->status = 0x0001U; - } - else - { - pep->status = 0x0000U; - } - - (void) USBD_CtlSendData (pdev, (uint8_t*) &pep->status, 2U); - break; - - default: - USBD_CtlError (pdev, req); - break; - } - break; - - default: - USBD_CtlError (pdev, req); - break; - } - break; - - default: - USBD_CtlError (pdev, req); - break; - } - - return ret; -} - -/** - * @brief USBD_GetDescriptor - * Handle Get Descriptor requests - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -static void USBD_GetDescriptor (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - uint16_t len = 0U; - uint8_t *pbuf = NULL; - uint8_t err = 0U; - - switch (req->wValue >> 8) - { -#if ((USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1U)) - case USB_DESC_TYPE_BOS: - if (pdev->pDesc->GetBOSDescriptor != NULL) - { - pbuf = pdev->pDesc->GetBOSDescriptor(pdev->dev_speed, &len); - } - else - { - USBD_CtlError(pdev, req); - err++; - } - break; -#endif - case USB_DESC_TYPE_DEVICE: - pbuf = pdev->pDesc->GetDeviceDescriptor (pdev->dev_speed, &len); - break; - - case USB_DESC_TYPE_CONFIGURATION: - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - pbuf = pdev->pClass->GetHSConfigDescriptor (&len); - pbuf[1] = USB_DESC_TYPE_CONFIGURATION; - } - else - { - pbuf = pdev->pClass->GetFSConfigDescriptor (&len); - pbuf[1] = USB_DESC_TYPE_CONFIGURATION; - } - break; - - case USB_DESC_TYPE_STRING: - switch ((uint8_t) (req->wValue)) - { - case USBD_IDX_LANGID_STR: - if (pdev->pDesc->GetLangIDStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetLangIDStrDescriptor (pdev->dev_speed, &len); - } - else - { - USBD_CtlError (pdev, req); - err++; - } - break; - - case USBD_IDX_MFC_STR: - if (pdev->pDesc->GetManufacturerStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetManufacturerStrDescriptor (pdev->dev_speed, &len); - } - else - { - USBD_CtlError (pdev, req); - err++; - } - break; - - case USBD_IDX_PRODUCT_STR: - if (pdev->pDesc->GetProductStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetProductStrDescriptor (pdev->dev_speed, &len); - } - else - { - USBD_CtlError (pdev, req); - err++; - } - break; - - case USBD_IDX_SERIAL_STR: - if (pdev->pDesc->GetSerialStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetSerialStrDescriptor (pdev->dev_speed, &len); - } - else - { - USBD_CtlError (pdev, req); - err++; - } - break; - - case USBD_IDX_CONFIG_STR: - if (pdev->pDesc->GetConfigurationStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetConfigurationStrDescriptor (pdev->dev_speed, &len); - } - else - { - USBD_CtlError (pdev, req); - err++; - } - break; - - case USBD_IDX_INTERFACE_STR: - if (pdev->pDesc->GetInterfaceStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetInterfaceStrDescriptor (pdev->dev_speed, &len); - } - else - { - USBD_CtlError (pdev, req); - err++; - } - break; - - default: -#if (USBD_SUPPORT_USER_STRING_DESC == 1U) - if (pdev->pClass->GetUsrStrDescriptor != NULL) - { - pbuf = pdev->pClass->GetUsrStrDescriptor (pdev, (req->wValue), &len); - } - else - { - USBD_CtlError (pdev, req); - err++; - } -#endif - -#if (USBD_CLASS_USER_STRING_DESC == 1U) - if (pdev->pDesc->GetUserStrDescriptor != NULL) - { - pbuf = pdev->pDesc->GetUserStrDescriptor(pdev->dev_speed, (req->wValue), &len); - } - else - { - USBD_CtlError(pdev, req); - err++; - } -#endif - -#if ((USBD_CLASS_USER_STRING_DESC == 0U) && (USBD_SUPPORT_USER_STRING_DESC == 0U)) - USBD_CtlError(pdev, req); - err++; -#endif - break; - } - break; - - case USB_DESC_TYPE_DEVICE_QUALIFIER: - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - pbuf = pdev->pClass->GetDeviceQualifierDescriptor (&len); - } - else - { - USBD_CtlError (pdev, req); - err++; - } - break; - - case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION: - if (pdev->dev_speed == USBD_SPEED_HIGH) - { - pbuf = pdev->pClass->GetOtherSpeedConfigDescriptor (&len); - pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION; - } - else - { - USBD_CtlError (pdev, req); - err++; - } - break; - - default: - USBD_CtlError (pdev, req); - err++; - break; - } - - if (err != 0U) - { - return; - } - - if (req->wLength != 0U) - { - if (len != 0U) - { - len = MIN(len, req->wLength); - (void) USBD_CtlSendData (pdev, pbuf, len); - } - else - { - USBD_CtlError (pdev, req); - } - } - else - { - (void) USBD_CtlSendStatus (pdev); - } -} - -/** - * @brief USBD_SetAddress - * Set device address - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -static void USBD_SetAddress (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - uint8_t dev_addr; - - if ((req->wIndex == 0U) && (req->wLength == 0U) && (req->wValue < 128U)) - { - dev_addr = (uint8_t) (req->wValue) & 0x7FU; - - if (pdev->dev_state == USBD_STATE_CONFIGURED) - { - USBD_CtlError (pdev, req); - } - else - { - pdev->dev_address = dev_addr; - (void) USBD_LL_SetUSBAddress (pdev, dev_addr); - (void) USBD_CtlSendStatus (pdev); - - if (dev_addr != 0U) - { - pdev->dev_state = USBD_STATE_ADDRESSED; - } - else - { - pdev->dev_state = USBD_STATE_DEFAULT; - } - } - } - else - { - USBD_CtlError (pdev, req); - } -} - -/** - * @brief USBD_SetConfig - * Handle Set device configuration request - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -static USBD_StatusTypeDef USBD_SetConfig (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - USBD_StatusTypeDef ret = USBD_OK; - static uint8_t cfgidx; - - cfgidx = (uint8_t) (req->wValue); - - if (cfgidx > USBD_MAX_NUM_CONFIGURATION) - { - USBD_CtlError (pdev, req); - return USBD_FAIL; - } - - switch (pdev->dev_state) - { - case USBD_STATE_ADDRESSED: - if (cfgidx != 0U) - { - pdev->dev_config = cfgidx; - - ret = USBD_SetClassConfig (pdev, cfgidx); - - if (ret != USBD_OK) - { - USBD_CtlError (pdev, req); - } - else - { - (void) USBD_CtlSendStatus (pdev); - pdev->dev_state = USBD_STATE_CONFIGURED; - } - } - else - { - (void) USBD_CtlSendStatus (pdev); - } - break; - - case USBD_STATE_CONFIGURED: - if (cfgidx == 0U) - { - pdev->dev_state = USBD_STATE_ADDRESSED; - pdev->dev_config = cfgidx; - (void) USBD_ClrClassConfig (pdev, cfgidx); - (void) USBD_CtlSendStatus (pdev); - } - else if (cfgidx != pdev->dev_config) - { - /* Clear old configuration */ - (void) USBD_ClrClassConfig (pdev, (uint8_t) pdev->dev_config); - - /* set new configuration */ - pdev->dev_config = cfgidx; - - ret = USBD_SetClassConfig (pdev, cfgidx); - - if (ret != USBD_OK) - { - USBD_CtlError (pdev, req); - (void) USBD_ClrClassConfig (pdev, (uint8_t) pdev->dev_config); - pdev->dev_state = USBD_STATE_ADDRESSED; - } - else - { - (void) USBD_CtlSendStatus (pdev); - } - } - else - { - (void) USBD_CtlSendStatus (pdev); - } - break; - - default: - USBD_CtlError (pdev, req); - (void) USBD_ClrClassConfig (pdev, cfgidx); - ret = USBD_FAIL; - break; - } - - return ret; -} - -/** - * @brief USBD_GetConfig - * Handle Get device configuration request - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -static void USBD_GetConfig (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - if (req->wLength != 1U) - { - USBD_CtlError (pdev, req); - } - else - { - switch (pdev->dev_state) - { - case USBD_STATE_DEFAULT: - case USBD_STATE_ADDRESSED: - pdev->dev_default_config = 0U; - (void) USBD_CtlSendData (pdev, (uint8_t*) &pdev->dev_default_config, 1U); - break; - - case USBD_STATE_CONFIGURED: - (void) USBD_CtlSendData (pdev, (uint8_t*) &pdev->dev_config, 1U); - break; - - default: - USBD_CtlError (pdev, req); - break; - } - } -} - -/** - * @brief USBD_GetStatus - * Handle Get Status request - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -static void USBD_GetStatus (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - switch (pdev->dev_state) - { - case USBD_STATE_DEFAULT: - case USBD_STATE_ADDRESSED: - case USBD_STATE_CONFIGURED: - if (req->wLength != 0x2U) - { - USBD_CtlError (pdev, req); - break; - } - -#if (USBD_SELF_POWERED == 1U) - pdev->dev_config_status = USB_CONFIG_SELF_POWERED; -#else - pdev->dev_config_status = 0U; -#endif - - if (pdev->dev_remote_wakeup != 0U) - { - pdev->dev_config_status |= USB_CONFIG_REMOTE_WAKEUP; - } - - (void) USBD_CtlSendData (pdev, (uint8_t*) &pdev->dev_config_status, 2U); - break; - - default: - USBD_CtlError (pdev, req); - break; - } -} - -/** - * @brief USBD_SetFeature - * Handle Set device feature request - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -static void USBD_SetFeature (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) - { - pdev->dev_remote_wakeup = 1U; - (void) USBD_CtlSendStatus (pdev); - } -} - -/** - * @brief USBD_ClrFeature - * Handle clear device feature request - * @param pdev: device instance - * @param req: usb request - * @retval status - */ -static void USBD_ClrFeature (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - switch (pdev->dev_state) - { - case USBD_STATE_DEFAULT: - case USBD_STATE_ADDRESSED: - case USBD_STATE_CONFIGURED: - if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) - { - pdev->dev_remote_wakeup = 0U; - (void) USBD_CtlSendStatus (pdev); - } - break; - - default: - USBD_CtlError (pdev, req); - break; - } -} - -/** - * @brief USBD_ParseSetupRequest - * Copy buffer into setup structure - * @param pdev: device instance - * @param req: usb request - * @retval None - */ -void USBD_ParseSetupRequest (USBD_SetupReqTypedef *req, uint8_t *pdata) -{ - uint8_t *pbuff = pdata; - - req->bmRequest = *(uint8_t*) (pbuff); - - pbuff++; - req->bRequest = *(uint8_t*) (pbuff); - - pbuff++; - req->wValue = SWAPBYTE (pbuff); - - pbuff++; - pbuff++; - req->wIndex = SWAPBYTE (pbuff); - - pbuff++; - pbuff++; - req->wLength = SWAPBYTE (pbuff); -} - -/** - * @brief USBD_CtlError - * Handle USB low level Error - * @param pdev: device instance - * @param req: usb request - * @retval None - */ -void USBD_CtlError (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) -{ - UNUSED(req); - - (void) USBD_LL_StallEP (pdev, 0x80U); - (void) USBD_LL_StallEP (pdev, 0U); -} - -/** - * @brief USBD_GetString - * Convert Ascii string into unicode one - * @param desc : descriptor buffer - * @param unicode : Formatted string buffer (unicode) - * @param len : descriptor length - * @retval None - */ -void USBD_GetString (uint8_t *desc, uint8_t *unicode, uint16_t *len) -{ - uint8_t idx = 0U; - uint8_t *pdesc; - - if (desc == NULL) - { - return; - } - - pdesc = desc; - *len = ((uint16_t) USBD_GetLen (pdesc) * 2U) + 2U; - - unicode[idx] = *(uint8_t*) len; - idx++; - unicode[idx] = USB_DESC_TYPE_STRING; - idx++; - - while (*pdesc != (uint8_t) '\0') - { - unicode[idx] = *pdesc; - pdesc++; - idx++; - - unicode[idx] = 0U; - idx++; - } -} - -/** - * @brief USBD_GetLen - * return the string length - * @param buf : pointer to the ascii string buffer - * @retval string length - */ -static uint8_t USBD_GetLen (uint8_t *buf) -{ - uint8_t len = 0U; - uint8_t *pbuff = buf; - - while (*pbuff != (uint8_t) '\0') - { - len++; - pbuff++; - } - - return len; -} -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/AL94_USB_Composite/Target/usbd_conf.h b/common/AL94_USB_Composite/Target/usbd_conf.h deleted file mode 100644 index 53df2f0..0000000 --- a/common/AL94_USB_Composite/Target/usbd_conf.h +++ /dev/null @@ -1,176 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : usbd_conf.h - * @version : v1.0_Cube - * @brief : Header for usbd_conf.c file. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2021 STMicroelectronics. - * All rights reserved.

- * - * 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 */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __USBD_CONF__H__ -#define __USBD_CONF__H__ - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* Includes ------------------------------------------------------------------*/ -#include -#include -#include -#include "main.h" - -/* USER CODE BEGIN INCLUDE */ - -/* USER CODE END INCLUDE */ - -/** @addtogroup USBD_OTG_DRIVER - * @brief Driver for Usb device. - * @{ - */ - -/** @defgroup USBD_CONF USBD_CONF - * @brief Configuration file for Usb otg low level driver. - * @{ - */ - -/** @defgroup USBD_CONF_Exported_Variables USBD_CONF_Exported_Variables - * @brief Public variables. - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_Defines USBD_CONF_Exported_Defines - * @brief Defines for configuration of the Usb device. - * @{ - */ - -/*---------- -----------*/ -#define USBD_MAX_NUM_INTERFACES 15U -/*---------- -----------*/ -#define USBD_MAX_NUM_CONFIGURATION 1U -/*---------- -----------*/ -#define USBD_MAX_STR_DESC_SIZ 512U -/*---------- -----------*/ -#define USBD_SUPPORT_USER_STRING_DESC 1U -/*---------- -----------*/ -#define USBD_DEBUG_LEVEL 0U -/*---------- -----------*/ -#define USBD_LPM_ENABLED 0U -/*---------- -----------*/ -#define USBD_SELF_POWERED 1U -/*---------- -----------*/ - -/****************************************/ -/* #define for FS and HS identification */ -#define DEVICE_FS 0 -#define DEVICE_HS 1 - -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_Macros USBD_CONF_Exported_Macros - * @brief Aliases. - * @{ - */ - -/* Memory management macros */ - -/** Alias for memory allocation. */ -#define USBD_malloc malloc - -/** Alias for memory release. */ -#define USBD_free 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 - -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_Types USBD_CONF_Exported_Types - * @brief Types. - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_CONF_Exported_FunctionsPrototype USBD_CONF_Exported_FunctionsPrototype - * @brief Declaration of public functions for Usb device. - * @{ - */ - -/* Exported functions -------------------------------------------------------*/ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __USBD_CONF__H__ */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/AL94_USB_Composite/AL94.I-CUBE-USBD-COMPOSITE_conf.h-ignore b/common/USB_AL94/AL94.I-CUBE-USBD-COMPOSITE_conf.h-ignore similarity index 96% rename from common/AL94_USB_Composite/AL94.I-CUBE-USBD-COMPOSITE_conf.h-ignore rename to common/USB_AL94/AL94.I-CUBE-USBD-COMPOSITE_conf.h-ignore index a29b74a..da5c436 100644 --- a/common/AL94_USB_Composite/AL94.I-CUBE-USBD-COMPOSITE_conf.h-ignore +++ b/common/USB_AL94/AL94.I-CUBE-USBD-COMPOSITE_conf.h-ignore @@ -1,90 +1,90 @@ -/** - ****************************************************************************** - * File Name : AL94.I-CUBE-USBD-COMPOSITE_conf.h - * Description : This file provides code for the configuration - * of the AL94.I-CUBE-USBD-COMPOSITE_conf.h instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __AL94__I_CUBE_USBD_COMPOSITE_CONF__H__ -#define __AL94__I_CUBE_USBD_COMPOSITE_CONF__H__ - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* Includes ------------------------------------------------------------------*/ - -/** - MiddleWare name : AL94.I-CUBE-USBD-COMPOSITE.1.0.3 - MiddleWare fileName : AL94.I-CUBE-USBD-COMPOSITE_conf.h - MiddleWare version : - */ -/*---------- _USBD_USE_HS -----------*/ - -#define _USBD_USE_HS false - - -/*---------- _USBD_USE_CDC_ACM -----------*/ -#define _USBD_USE_CDC_ACM true - -/*---------- _USBD_CDC_ACM_COUNT -----------*/ -#define _USBD_CDC_ACM_COUNT 1 - -/*---------- _USBD_USE_CDC_RNDIS -----------*/ -#define _USBD_USE_CDC_RNDIS false - -/*---------- _USBD_USE_CDC_ECM -----------*/ -#define _USBD_USE_CDC_ECM false - -/*---------- _USBD_USE_HID_MOUSE -----------*/ -#define _USBD_USE_HID_MOUSE false - -/*---------- _USBD_USE_HID_KEYBOARD -----------*/ -#define _USBD_USE_HID_KEYBOARD false - -/*---------- _USBD_USE_HID_CUSTOM -----------*/ -#define _USBD_USE_HID_CUSTOM false - -/*---------- _USBD_USE_UAC_MIC -----------*/ -#define _USBD_USE_UAC_MIC false - -/*---------- _USBD_USE_UAC_SPKR -----------*/ -#define _USBD_USE_UAC_SPKR false - -/*---------- _USBD_USE_UVC -----------*/ -#define _USBD_USE_UVC false - -/*---------- _USBD_USE_MSC -----------*/ -#define _USBD_USE_MSC false - -/*---------- _USBD_USE_DFU -----------*/ -#define _USBD_USE_DFU false - -/*---------- _USBD_USE_PRNTR -----------*/ -#define _USBD_USE_PRNTR false - -/*---------- _STM32F1_DEVICE -----------*/ -#define _STM32F1_DEVICE false - -#ifdef __cplusplus -} -#endif -#endif /*__ AL94__I_CUBE_USBD_COMPOSITE_CONF__H_H */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * File Name : AL94.I-CUBE-USBD-COMPOSITE_conf.h + * Description : This file provides code for the configuration + * of the AL94.I-CUBE-USBD-COMPOSITE_conf.h instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __AL94__I_CUBE_USBD_COMPOSITE_CONF__H__ +#define __AL94__I_CUBE_USBD_COMPOSITE_CONF__H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Includes ------------------------------------------------------------------*/ + +/** + MiddleWare name : AL94.I-CUBE-USBD-COMPOSITE.1.0.3 + MiddleWare fileName : AL94.I-CUBE-USBD-COMPOSITE_conf.h + MiddleWare version : + */ +/*---------- _USBD_USE_HS -----------*/ + +#define _USBD_USE_HS false + + +/*---------- _USBD_USE_CDC_ACM -----------*/ +#define _USBD_USE_CDC_ACM true + +/*---------- _USBD_CDC_ACM_COUNT -----------*/ +#define _USBD_CDC_ACM_COUNT 1 + +/*---------- _USBD_USE_CDC_RNDIS -----------*/ +#define _USBD_USE_CDC_RNDIS false + +/*---------- _USBD_USE_CDC_ECM -----------*/ +#define _USBD_USE_CDC_ECM false + +/*---------- _USBD_USE_HID_MOUSE -----------*/ +#define _USBD_USE_HID_MOUSE false + +/*---------- _USBD_USE_HID_KEYBOARD -----------*/ +#define _USBD_USE_HID_KEYBOARD false + +/*---------- _USBD_USE_HID_CUSTOM -----------*/ +#define _USBD_USE_HID_CUSTOM false + +/*---------- _USBD_USE_UAC_MIC -----------*/ +#define _USBD_USE_UAC_MIC false + +/*---------- _USBD_USE_UAC_SPKR -----------*/ +#define _USBD_USE_UAC_SPKR false + +/*---------- _USBD_USE_UVC -----------*/ +#define _USBD_USE_UVC false + +/*---------- _USBD_USE_MSC -----------*/ +#define _USBD_USE_MSC false + +/*---------- _USBD_USE_DFU -----------*/ +#define _USBD_USE_DFU false + +/*---------- _USBD_USE_PRNTR -----------*/ +#define _USBD_USE_PRNTR false + +/*---------- _STM32F1_DEVICE -----------*/ +#define _STM32F1_DEVICE false + +#ifdef __cplusplus +} +#endif +#endif /*__ AL94__I_CUBE_USBD_COMPOSITE_CONF__H_H */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/AL94_USB_Composite/LICENSE.txt b/common/USB_AL94/LICENSE.txt similarity index 98% rename from common/AL94_USB_Composite/LICENSE.txt rename to common/USB_AL94/LICENSE.txt index 059b65d..4bf2beb 100644 --- a/common/AL94_USB_Composite/LICENSE.txt +++ b/common/USB_AL94/LICENSE.txt @@ -1,21 +1,21 @@ -MIT License - -Copyright (c) 2021 alambe94 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +MIT License + +Copyright (c) 2021 alambe94 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/common/USB_AL94/usb_device.c b/common/USB_AL94/usb_device.c new file mode 100644 index 0000000..19db251 --- /dev/null +++ b/common/USB_AL94/usb_device.c @@ -0,0 +1,58 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : usb_device.c + * @version : v1.0_Cube + * @brief : This file implements the USB Device + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2021 STMicroelectronics. + * All rights reserved.

+ * + * 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 "usb_device.h" +#include "usbd_desc.h" + +#include "usbd_composite.h" + +/* USB Device Core handle declaration. */ +USBD_HandleTypeDef hUsbDevice; + +/** + * Init USB device Library, add supported class and start the library + * @retval None + */ +void MX_USB_DEVICE_Init(void) +{ + /* USER CODE BEGIN USB_DEVICE_Init_PreTreatment */ + + /* USER CODE END USB_DEVICE_Init_PreTreatment */ + + /* Init Device Library, add supported class and start the library. */ + USBD_COMPOSITE_Mount_Class(); + +#if (USBD_USE_HS == 1) + if (USBD_Init(&hUsbDevice, &USBD_Desc, DEVICE_HS) != USBD_OK) { Error_Handler(); } +#else + if (USBD_Init(&hUsbDevice, &USBD_Desc, DEVICE_FS) != USBD_OK) { Error_Handler(); } +#endif + + if (USBD_RegisterClass(&hUsbDevice, &USBD_COMPOSITE) != USBD_OK) { Error_Handler(); } + + if (USBD_CDC_ACM_RegisterInterface(&hUsbDevice, &USBD_CDC_ACM_fops) != USBD_OK) { Error_Handler(); } + + if (USBD_Start(&hUsbDevice) != USBD_OK) { Error_Handler(); } +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/USB_AL94/usb_device.h b/common/USB_AL94/usb_device.h new file mode 100644 index 0000000..47258a4 --- /dev/null +++ b/common/USB_AL94/usb_device.h @@ -0,0 +1,41 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : usb_device.h + * @version : v1.0_Cube + * @brief : Header for usb_device.c file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2021 STMicroelectronics. + * All rights reserved.

+ * + * 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 + * + ****************************************************************************** + */ + +#ifndef __USB_DEVICE__H__ +#define __USB_DEVICE__H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "usbd_def.h" + +/** USB Device initialization function. */ +void MX_USB_DEVICE_Init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __USB_DEVICE__H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/USB_AL94/usbd_cdc.c b/common/USB_AL94/usbd_cdc.c new file mode 100644 index 0000000..b6902f7 --- /dev/null +++ b/common/USB_AL94/usbd_cdc.c @@ -0,0 +1,2052 @@ +/** + ****************************************************************************** + * @file usbd_cdc.c + * @author MCD Application Team + * @brief This file provides the high layer firmware functions to manage the + * following functionalities of the USB CDC Class: + * - Initialization and Configuration of high and low layer + * - Enumeration as CDC Device (and enumeration for each implemented memory interface) + * - OUT/IN data transfer + * - Command IN transfer (class requests management) + * - Error management + * + * @verbatim + * + * =================================================================== + * CDC Class Driver Description + * =================================================================== + * This driver manages the "Universal Serial Bus Class Definitions for Communications Devices + * Revision 1.2 November 16, 2007" and the sub-protocol specification of "Universal Serial Bus + * Communications Class Subclass Specification for PSTN Devices Revision 1.2 February 9, 2007" + * This driver implements the following aspects of the specification: + * - Device descriptor management + * - Configuration descriptor management + * - Enumeration as CDC device with 2 data endpoints (IN and OUT) and 1 command endpoint (IN) + * - Requests management (as described in section 6.2 in specification) + * - Abstract Control Model compliant + * - Union Functional collection (using 1 IN endpoint for control) + * - Data interface class + * + * These aspects may be enriched or modified for a specific user application. + * + * This driver doesn't implement the following aspects of the specification + * (but it is possible to manage these features with some modifications on this driver): + * - Any class-specific aspect relative to communication classes should be managed by user application. + * - All communication classes other than PSTN are not managed + * + * @endverbatim + * + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * 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 + * + ****************************************************************************** + */ + +#include "usbd_cdc.h" +#include "usbd_ctlreq.h" + +#define _CDC_IN_EP 0x81U /* EP1 for data IN */ +#define _CDC_OUT_EP 0x01U /* EP1 for data OUT */ +#define _CDC_CMD_EP 0x82U /* EP2 for CDC commands */ + +#define _CDC_CMD_ITF_NBR 0x00U /* Command Interface Number */ +#define _CDC_COM_ITF_NBR 0x01U /* Communication Interface Number */ + +#define _CDC_STR_DESC_IDX 0x00 + +uint8_t CDC_IN_EP[NUMBER_OF_CDC]; +uint8_t CDC_OUT_EP[NUMBER_OF_CDC]; +uint8_t CDC_CMD_EP[NUMBER_OF_CDC]; + +uint8_t CDC_CMD_ITF_NBR[NUMBER_OF_CDC]; +uint8_t CDC_COM_ITF_NBR[NUMBER_OF_CDC]; + +uint8_t CDC_STR_DESC_IDX[NUMBER_OF_CDC]; + +/** @defgroup USBD_CDC_Private_FunctionPrototypes + * @{ + */ + +static uint8_t USBD_CDC_Init(USBD_HandleTypeDef * pdev, uint8_t cfgidx); +static uint8_t USBD_CDC_DeInit(USBD_HandleTypeDef * pdev, uint8_t cfgidx); +static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req); +static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef * pdev, uint8_t epnum); +static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef * pdev, uint8_t epnum); +static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef * pdev); + +static uint8_t * USBD_CDC_GetFSCfgDesc(uint16_t * length); +static uint8_t * USBD_CDC_GetHSCfgDesc(uint16_t * length); +static uint8_t * USBD_CDC_GetOtherSpeedCfgDesc(uint16_t * length); +static uint8_t * USBD_CDC_GetOtherSpeedCfgDesc(uint16_t * length); +static uint8_t * USBD_CDC_GetDeviceQualifierDescriptor(uint16_t * length); + +USBD_CDC_ACM_HandleTypeDef CDC_ACM_Class_Data[NUMBER_OF_CDC]; + +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_CDC_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = { + USB_LEN_DEV_QUALIFIER_DESC, USB_DESC_TYPE_DEVICE_QUALIFIER, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, +}; + +/** + * @} + */ + +/** @defgroup USBD_CDC_Private_Variables + * @{ + */ + +/* CDC interface class callbacks structure */ +USBD_ClassTypeDef USBD_CDC_ACM = { + USBD_CDC_Init, + USBD_CDC_DeInit, + USBD_CDC_Setup, + NULL, /* EP0_TxSent, */ + USBD_CDC_EP0_RxReady, + USBD_CDC_DataIn, + USBD_CDC_DataOut, + NULL, + NULL, + NULL, + USBD_CDC_GetHSCfgDesc, + USBD_CDC_GetFSCfgDesc, + USBD_CDC_GetOtherSpeedCfgDesc, + USBD_CDC_GetDeviceQualifierDescriptor, +}; + +/* USB CDC device Configuration Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_CDC_CfgHSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = { + /* Configuration Descriptor */ + 0x09, /* bLength: Configuration Descriptor size */ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ + LOBYTE(USB_CDC_CONFIG_DESC_SIZ), /* wTotalLength:no of returned bytes */ + HIBYTE(USB_CDC_CONFIG_DESC_SIZ), (2 * NUMBER_OF_CDC), /* bNumInterfaces: 2 interface */ + 0x01, /* bConfigurationValue: Configuration value */ + 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ +#if (USBD_SELF_POWERED == 1U) + 0xC0, /* bmAttributes: Bus Powered according to user configuration */ +#else + 0x80, /* bmAttributes: Bus Powered according to user configuration */ +#endif + USBD_MAX_POWER, /* MaxPower 100 mA */ + + /******************** CDC0 block ********************/ + /******** IAD to associate the two CDC interfaces */ + 0x08, /* bLength */ + 0x0B, /* bDescriptorType */ + _CDC_CMD_ITF_NBR, /* bFirstInterface */ + 0x02, /* bInterfaceCount */ + 0x02, /* bFunctionClass */ + 0x02, /* bFunctionSubClass */ + 0x01, /* bFunctionProtocol */ + 0x00, /* iFunction (Index of string descriptor describing this function) */ + + /* Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + _CDC_STR_DESC_IDX, /* iInterface: */ + + /* Header Functional Descriptor */ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /* Call Management Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ + + /* ACM Functional Descriptor */ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /* Union Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ + _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ + + /* Endpoint 2 Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), CDC_HS_BINTERVAL, /* bInterval: */ + /*---------------------------------------------------------------------------*/ + + /* Data class interface descriptor */ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /* Endpoint OUT Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ + + /* Endpoint IN Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ + +#if (NUMBER_OF_CDC > 1) + /******************** CDC1 block ********************/ + /******** IAD to associate the two CDC interfaces */ + 0x08, /* bLength */ + 0x0B, /* bDescriptorType */ + _CDC_CMD_ITF_NBR, /* bFirstInterface */ + 0x02, /* bInterfaceCount */ + 0x02, /* bFunctionClass */ + 0x02, /* bFunctionSubClass */ + 0x01, /* bFunctionProtocol */ + 0x00, /* iFunction (Index of string descriptor describing this function) */ + + /* Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + _CDC_STR_DESC_IDX, /* iInterface: */ + + /* Header Functional Descriptor */ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /* Call Management Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ + + /* ACM Functional Descriptor */ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /* Union Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ + _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ + + /* Endpoint 2 Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), CDC_HS_BINTERVAL, /* bInterval: */ + /*---------------------------------------------------------------------------*/ + + /* Data class interface descriptor */ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /* Endpoint OUT Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ + + /* Endpoint IN Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ +#endif + +#if (NUMBER_OF_CDC > 2) + /******************** CDC2 block ********************/ + /******** IAD to associate the two CDC interfaces */ + 0x08, /* bLength */ + 0x0B, /* bDescriptorType */ + _CDC_CMD_ITF_NBR, /* bFirstInterface */ + 0x02, /* bInterfaceCount */ + 0x02, /* bFunctionClass */ + 0x02, /* bFunctionSubClass */ + 0x01, /* bFunctionProtocol */ + 0x00, /* iFunction (Index of string descriptor describing this function) */ + + /* Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + _CDC_STR_DESC_IDX, /* iInterface: */ + + /* Header Functional Descriptor */ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /* Call Management Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ + + /* ACM Functional Descriptor */ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /* Union Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ + _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ + + /* Endpoint 2 Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), CDC_HS_BINTERVAL, /* bInterval: */ + /*---------------------------------------------------------------------------*/ + + /* Data class interface descriptor */ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /* Endpoint OUT Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ + + /* Endpoint IN Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ +#endif + +#if (NUMBER_OF_CDC > 3) + /******************** CDC3 block ********************/ + /******** IAD to associate the two CDC interfaces */ + 0x08, /* bLength */ + 0x0B, /* bDescriptorType */ + _CDC_CMD_ITF_NBR, /* bFirstInterface */ + 0x02, /* bInterfaceCount */ + 0x02, /* bFunctionClass */ + 0x02, /* bFunctionSubClass */ + 0x01, /* bFunctionProtocol */ + 0x00, /* iFunction (Index of string descriptor describing this function) */ + + /* Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + _CDC_STR_DESC_IDX, /* iInterface: */ + + /* Header Functional Descriptor */ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /* Call Management Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ + + /* ACM Functional Descriptor */ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /* Union Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ + _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ + + /* Endpoint 2 Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), CDC_HS_BINTERVAL, /* bInterval: */ + /*---------------------------------------------------------------------------*/ + + /* Data class interface descriptor */ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /* Endpoint OUT Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ + + /* Endpoint IN Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ +#endif + +#if (NUMBER_OF_CDC > 4) + /******************** CDC4 block ********************/ + /******** IAD to associate the two CDC interfaces */ + 0x08, /* bLength */ + 0x0B, /* bDescriptorType */ + _CDC_CMD_ITF_NBR, /* bFirstInterface */ + 0x02, /* bInterfaceCount */ + 0x02, /* bFunctionClass */ + 0x02, /* bFunctionSubClass */ + 0x01, /* bFunctionProtocol */ + 0x00, /* iFunction (Index of string descriptor describing this function) */ + + /* Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + _CDC_STR_DESC_IDX, /* iInterface: */ + + /* Header Functional Descriptor */ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /* Call Management Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ + + /* ACM Functional Descriptor */ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /* Union Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ + _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ + + /* Endpoint 2 Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), CDC_HS_BINTERVAL, /* bInterval: */ + /*---------------------------------------------------------------------------*/ + + /* Data class interface descriptor */ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /* Endpoint OUT Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ + + /* Endpoint IN Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ +#endif + +#if (NUMBER_OF_CDC > 5) + /******************** CDC5 block ********************/ + /******** IAD to associate the two CDC interfaces */ + 0x08, /* bLength */ + 0x0B, /* bDescriptorType */ + _CDC_CMD_ITF_NBR, /* bFirstInterface */ + 0x02, /* bInterfaceCount */ + 0x02, /* bFunctionClass */ + 0x02, /* bFunctionSubClass */ + 0x01, /* bFunctionProtocol */ + 0x00, /* iFunction (Index of string descriptor describing this function) */ + + /* Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + _CDC_STR_DESC_IDX, /* iInterface: */ + + /* Header Functional Descriptor */ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /* Call Management Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ + + /* ACM Functional Descriptor */ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /* Union Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ + _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ + + /* Endpoint 2 Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), CDC_HS_BINTERVAL, /* bInterval: */ + /*---------------------------------------------------------------------------*/ + + /* Data class interface descriptor */ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /* Endpoint OUT Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ + + /* Endpoint IN Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ +#endif + +#if (NUMBER_OF_CDC > 6) + /******************** CDC6 block ********************/ + /******** IAD to associate the two CDC interfaces */ + 0x08, /* bLength */ + 0x0B, /* bDescriptorType */ + _CDC_CMD_ITF_NBR, /* bFirstInterface */ + 0x02, /* bInterfaceCount */ + 0x02, /* bFunctionClass */ + 0x02, /* bFunctionSubClass */ + 0x01, /* bFunctionProtocol */ + 0x00, /* iFunction (Index of string descriptor describing this function) */ + + /* Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + _CDC_STR_DESC_IDX, /* iInterface: */ + + /* Header Functional Descriptor */ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /* Call Management Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ + + /* ACM Functional Descriptor */ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /* Union Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ + _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ + + /* Endpoint 2 Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), CDC_HS_BINTERVAL, /* bInterval: */ + /*---------------------------------------------------------------------------*/ + + /* Data class interface descriptor */ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /* Endpoint OUT Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ + + /* Endpoint IN Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ +#endif + +#if (NUMBER_OF_CDC > 7) + /******************** CDC7 block ********************/ + /******** IAD to associate the two CDC interfaces */ + 0x08, /* bLength */ + 0x0B, /* bDescriptorType */ + _CDC_CMD_ITF_NBR, /* bFirstInterface */ + 0x02, /* bInterfaceCount */ + 0x02, /* bFunctionClass */ + 0x02, /* bFunctionSubClass */ + 0x01, /* bFunctionProtocol */ + 0x00, /* iFunction (Index of string descriptor describing this function) */ + + /* Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + _CDC_STR_DESC_IDX, /* iInterface: */ + + /* Header Functional Descriptor */ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /* Call Management Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ + + /* ACM Functional Descriptor */ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /* Union Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ + _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ + + /* Endpoint 2 Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), CDC_HS_BINTERVAL, /* bInterval: */ + /*---------------------------------------------------------------------------*/ + + /* Data class interface descriptor */ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /* Endpoint OUT Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ + + /* Endpoint IN Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_HS_MAX_PACKET_SIZE), 0x00 /* bInterval: ignore for Bulk transfer */ +#endif +}; + +/* USB CDC device Configuration Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_CDC_CfgFSDesc[USB_CDC_CONFIG_DESC_SIZ] __ALIGN_END = { + /* Configuration Descriptor */ + 0x09, /* bLength: Configuration Descriptor size */ + USB_DESC_TYPE_CONFIGURATION, /* bDescriptorType: Configuration */ + LOBYTE(USB_CDC_CONFIG_DESC_SIZ), /* wTotalLength:no of returned bytes */ + HIBYTE(USB_CDC_CONFIG_DESC_SIZ), 0x02, /* bNumInterfaces: 2 interface */ + 0x01, /* bConfigurationValue: Configuration value */ + 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ +#if (USBD_SELF_POWERED == 1U) + 0xC0, /* bmAttributes: Bus Powered according to user configuration */ +#else + 0x80, /* bmAttributes: Bus Powered according to user configuration */ +#endif + USBD_MAX_POWER, /* MaxPower 100 mA */ + + /*---------------------------------------------------------------------------*/ + /******************** CDC0 block ********************/ + /******** IAD to associate the two CDC interfaces */ + 0x08, /* bLength */ + 0x0B, /* bDescriptorType */ + _CDC_CMD_ITF_NBR, /* bFirstInterface */ + 0x02, /* bInterfaceCount */ + 0x02, /* bFunctionClass */ + 0x02, /* bFunctionSubClass */ + 0x01, /* bFunctionProtocol */ + 0x00, /* iFunction (Index of string descriptor describing this function) */ + + /* Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + _CDC_STR_DESC_IDX, /* iInterface: */ + + /* Header Functional Descriptor */ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /* Call Management Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ + + /* ACM Functional Descriptor */ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /* Union Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ + _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ + + /* Endpoint 2 Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), CDC_FS_BINTERVAL, /* bInterval: */ + /*---------------------------------------------------------------------------*/ + + /* Data class interface descriptor */ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /* Endpoint OUT Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ + + /* Endpoint IN Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ + +#if (NUMBER_OF_CDC > 1) + /******************** CDC1 block ********************/ + /******** IAD to associate the two CDC interfaces */ + 0x08, /* bLength */ + 0x0B, /* bDescriptorType */ + _CDC_CMD_ITF_NBR, /* bFirstInterface */ + 0x02, /* bInterfaceCount */ + 0x02, /* bFunctionClass */ + 0x02, /* bFunctionSubClass */ + 0x01, /* bFunctionProtocol */ + 0x00, /* iFunction (Index of string descriptor describing this function) */ + + /* Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + _CDC_STR_DESC_IDX, /* iInterface: */ + + /* Header Functional Descriptor */ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /* Call Management Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ + + /* ACM Functional Descriptor */ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /* Union Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ + _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ + + /* Endpoint 2 Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), CDC_FS_BINTERVAL, /* bInterval: */ + /*---------------------------------------------------------------------------*/ + + /* Data class interface descriptor */ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /* Endpoint OUT Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ + + /* Endpoint IN Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ +#endif + +#if (NUMBER_OF_CDC > 2) + /******************** CDC2 block ********************/ + /******** IAD to associate the two CDC interfaces */ + 0x08, /* bLength */ + 0x0B, /* bDescriptorType */ + _CDC_CMD_ITF_NBR, /* bFirstInterface */ + 0x02, /* bInterfaceCount */ + 0x02, /* bFunctionClass */ + 0x02, /* bFunctionSubClass */ + 0x01, /* bFunctionProtocol */ + 0x00, /* iFunction (Index of string descriptor describing this function) */ + + /* Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + _CDC_STR_DESC_IDX, /* iInterface: */ + + /* Header Functional Descriptor */ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /* Call Management Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ + + /* ACM Functional Descriptor */ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /* Union Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ + _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ + + /* Endpoint 2 Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), CDC_FS_BINTERVAL, /* bInterval: */ + /*---------------------------------------------------------------------------*/ + + /* Data class interface descriptor */ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /* Endpoint OUT Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ + + /* Endpoint IN Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ +#endif + +#if (NUMBER_OF_CDC > 3) + /******************** CDC3 block ********************/ + /******** IAD to associate the two CDC interfaces */ + 0x08, /* bLength */ + 0x0B, /* bDescriptorType */ + _CDC_CMD_ITF_NBR, /* bFirstInterface */ + 0x02, /* bInterfaceCount */ + 0x02, /* bFunctionClass */ + 0x02, /* bFunctionSubClass */ + 0x01, /* bFunctionProtocol */ + 0x00, /* iFunction (Index of string descriptor describing this function) */ + + /* Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + _CDC_STR_DESC_IDX, /* iInterface: */ + + /* Header Functional Descriptor */ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /* Call Management Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ + + /* ACM Functional Descriptor */ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /* Union Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ + _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ + + /* Endpoint 2 Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), CDC_FS_BINTERVAL, /* bInterval: */ + /*---------------------------------------------------------------------------*/ + + /* Data class interface descriptor */ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /* Endpoint OUT Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ + + /* Endpoint IN Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ +#endif + +#if (NUMBER_OF_CDC > 4) + /******************** CDC4 block ********************/ + /******** IAD to associate the two CDC interfaces */ + 0x08, /* bLength */ + 0x0B, /* bDescriptorType */ + _CDC_CMD_ITF_NBR, /* bFirstInterface */ + 0x02, /* bInterfaceCount */ + 0x02, /* bFunctionClass */ + 0x02, /* bFunctionSubClass */ + 0x01, /* bFunctionProtocol */ + 0x00, /* iFunction (Index of string descriptor describing this function) */ + + /* Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + _CDC_STR_DESC_IDX, /* iInterface: */ + + /* Header Functional Descriptor */ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /* Call Management Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ + + /* ACM Functional Descriptor */ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /* Union Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ + _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ + + /* Endpoint 2 Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), CDC_FS_BINTERVAL, /* bInterval: */ + /*---------------------------------------------------------------------------*/ + + /* Data class interface descriptor */ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /* Endpoint OUT Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ + + /* Endpoint IN Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ +#endif + +#if (NUMBER_OF_CDC > 5) + /******************** CDC5 block ********************/ + /******** IAD to associate the two CDC interfaces */ + 0x08, /* bLength */ + 0x0B, /* bDescriptorType */ + _CDC_CMD_ITF_NBR, /* bFirstInterface */ + 0x02, /* bInterfaceCount */ + 0x02, /* bFunctionClass */ + 0x02, /* bFunctionSubClass */ + 0x01, /* bFunctionProtocol */ + 0x00, /* iFunction (Index of string descriptor describing this function) */ + + /* Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + _CDC_STR_DESC_IDX, /* iInterface: */ + + /* Header Functional Descriptor */ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /* Call Management Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ + + /* ACM Functional Descriptor */ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /* Union Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ + _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ + + /* Endpoint 2 Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), CDC_FS_BINTERVAL, /* bInterval: */ + /*---------------------------------------------------------------------------*/ + + /* Data class interface descriptor */ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /* Endpoint OUT Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ + + /* Endpoint IN Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ +#endif + +#if (NUMBER_OF_CDC > 6) + /******************** CDC6 block ********************/ + /******** IAD to associate the two CDC interfaces */ + 0x08, /* bLength */ + 0x0B, /* bDescriptorType */ + _CDC_CMD_ITF_NBR, /* bFirstInterface */ + 0x02, /* bInterfaceCount */ + 0x02, /* bFunctionClass */ + 0x02, /* bFunctionSubClass */ + 0x01, /* bFunctionProtocol */ + 0x00, /* iFunction (Index of string descriptor describing this function) */ + + /* Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + _CDC_STR_DESC_IDX, /* iInterface: */ + + /* Header Functional Descriptor */ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /* Call Management Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ + + /* ACM Functional Descriptor */ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /* Union Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ + _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ + + /* Endpoint 2 Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), CDC_FS_BINTERVAL, /* bInterval: */ + /*---------------------------------------------------------------------------*/ + + /* Data class interface descriptor */ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /* Endpoint OUT Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ + + /* Endpoint IN Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ +#endif + +#if (NUMBER_OF_CDC > 7) + /******************** CDC7 block ********************/ + /******** IAD to associate the two CDC interfaces */ + 0x08, /* bLength */ + 0x0B, /* bDescriptorType */ + _CDC_CMD_ITF_NBR, /* bFirstInterface */ + 0x02, /* bInterfaceCount */ + 0x02, /* bFunctionClass */ + 0x02, /* bFunctionSubClass */ + 0x01, /* bFunctionProtocol */ + 0x00, /* iFunction (Index of string descriptor describing this function) */ + + /* Interface Descriptor */ + 0x09, /* bLength: Interface Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: Interface */ + /* Interface descriptor type */ + _CDC_CMD_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x01, /* bNumEndpoints: One endpoints used */ + 0x02, /* bInterfaceClass: Communication Interface Class */ + 0x02, /* bInterfaceSubClass: Abstract Control Model */ + 0x01, /* bInterfaceProtocol: Common AT commands */ + _CDC_STR_DESC_IDX, /* iInterface: */ + + /* Header Functional Descriptor */ + 0x05, /* bLength: Endpoint Descriptor size */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x00, /* bDescriptorSubtype: Header Func Desc */ + 0x10, /* bcdCDC: spec release number */ + 0x01, + + /* Call Management Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x01, /* bDescriptorSubtype: Call Management Func Desc */ + 0x00, /* bmCapabilities: D0+D1 */ + _CDC_COM_ITF_NBR, /* bDataInterface: 1 */ + + /* ACM Functional Descriptor */ + 0x04, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x02, /* bDescriptorSubtype: Abstract Control Management desc */ + 0x02, /* bmCapabilities */ + + /* Union Functional Descriptor */ + 0x05, /* bFunctionLength */ + 0x24, /* bDescriptorType: CS_INTERFACE */ + 0x06, /* bDescriptorSubtype: Union func desc */ + _CDC_CMD_ITF_NBR, /* bMasterInterface: Communication class interface */ + _CDC_COM_ITF_NBR, /* bSlaveInterface0: Data Class Interface */ + + /* Endpoint 2 Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_CMD_EP, /* bEndpointAddress */ + 0x03, /* bmAttributes: Interrupt */ + LOBYTE(CDC_CMD_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_CMD_PACKET_SIZE), CDC_FS_BINTERVAL, /* bInterval: */ + /*---------------------------------------------------------------------------*/ + + /* Data class interface descriptor */ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_INTERFACE, /* bDescriptorType: */ + _CDC_COM_ITF_NBR, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0x0A, /* bInterfaceClass: CDC */ + 0x00, /* bInterfaceSubClass: */ + 0x00, /* bInterfaceProtocol: */ + 0x00, /* iInterface: */ + + /* Endpoint OUT Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_OUT_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00, /* bInterval: ignore for Bulk transfer */ + + /* Endpoint IN Descriptor */ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_DESC_TYPE_ENDPOINT, /* bDescriptorType: Endpoint */ + _CDC_IN_EP, /* bEndpointAddress */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(CDC_DATA_FS_MAX_PACKET_SIZE), 0x00 /* bInterval: ignore for Bulk transfer */ +#endif +}; + +/** + * @} + */ + +/** @defgroup USBD_CDC_Private_Functions + * @{ + */ + +/** + * @brief USBD_CDC_Init + * Initialize the CDC interface + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t USBD_CDC_Init(USBD_HandleTypeDef * pdev, uint8_t cfgidx) +{ + UNUSED(cfgidx); + USBD_CDC_ACM_HandleTypeDef * hcdc = NULL; + + for (uint8_t i = 0; i < NUMBER_OF_CDC; i++) { + hcdc = &CDC_ACM_Class_Data[i]; + + if (pdev->dev_speed == USBD_SPEED_HIGH) { + /* Open EP IN */ + (void) USBD_LL_OpenEP(pdev, CDC_IN_EP[i], USBD_EP_TYPE_BULK, CDC_DATA_HS_IN_PACKET_SIZE); + + pdev->ep_in[CDC_IN_EP[i] & 0xFU].is_used = 1U; + + /* Open EP OUT */ + (void) USBD_LL_OpenEP(pdev, CDC_OUT_EP[i], USBD_EP_TYPE_BULK, CDC_DATA_HS_OUT_PACKET_SIZE); + + pdev->ep_out[CDC_OUT_EP[i] & 0xFU].is_used = 1U; + + /* Set bInterval for CDC CMD Endpoint */ + pdev->ep_in[CDC_CMD_EP[i] & 0xFU].bInterval = CDC_HS_BINTERVAL; + } else { + /* Open EP IN */ + (void) USBD_LL_OpenEP(pdev, CDC_IN_EP[i], USBD_EP_TYPE_BULK, CDC_DATA_FS_IN_PACKET_SIZE); + + pdev->ep_in[CDC_IN_EP[i] & 0xFU].is_used = 1U; + + /* Open EP OUT */ + (void) USBD_LL_OpenEP(pdev, CDC_OUT_EP[i], USBD_EP_TYPE_BULK, CDC_DATA_FS_OUT_PACKET_SIZE); + + pdev->ep_out[CDC_OUT_EP[i] & 0xFU].is_used = 1U; + + /* Set bInterval for CMD Endpoint */ + pdev->ep_in[CDC_CMD_EP[i] & 0xFU].bInterval = CDC_FS_BINTERVAL; + } + + /* Open Command IN EP */ + (void) USBD_LL_OpenEP(pdev, CDC_CMD_EP[i], USBD_EP_TYPE_INTR, CDC_CMD_PACKET_SIZE); + pdev->ep_in[CDC_CMD_EP[i] & 0xFU].is_used = 1U; + + /* Init physical Interface components */ + ((USBD_CDC_ACM_ItfTypeDef *) pdev->pUserData_CDC_ACM)->Init(i); + + /* Init Xfer states */ + hcdc->TxState = 0U; + hcdc->RxState = 0U; + + if (pdev->dev_speed == USBD_SPEED_HIGH) { + /* Prepare Out endpoint to receive next packet */ + (void) USBD_LL_PrepareReceive(pdev, CDC_OUT_EP[i], hcdc->RxBuffer, CDC_DATA_HS_OUT_PACKET_SIZE); + } else { + /* Prepare Out endpoint to receive next packet */ + (void) USBD_LL_PrepareReceive(pdev, CDC_OUT_EP[i], hcdc->RxBuffer, CDC_DATA_FS_OUT_PACKET_SIZE); + } + } + return (uint8_t) USBD_OK; +} + +/** + * @brief USBD_CDC_Init + * DeInitialize the CDC layer + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t USBD_CDC_DeInit(USBD_HandleTypeDef * pdev, uint8_t cfgidx) +{ + UNUSED(cfgidx); + for (uint8_t i = 0; i < NUMBER_OF_CDC; i++) { + /* Close EP IN */ + (void) USBD_LL_CloseEP(pdev, CDC_IN_EP[i]); + pdev->ep_in[CDC_IN_EP[i] & 0xFU].is_used = 0U; + + /* Close EP OUT */ + (void) USBD_LL_CloseEP(pdev, CDC_OUT_EP[i]); + pdev->ep_out[CDC_OUT_EP[i] & 0xFU].is_used = 0U; + + /* Close Command IN EP */ + (void) USBD_LL_CloseEP(pdev, CDC_CMD_EP[i]); + pdev->ep_in[CDC_CMD_EP[i] & 0xFU].is_used = 0U; + pdev->ep_in[CDC_CMD_EP[i] & 0xFU].bInterval = 0U; + + /* DeInit physical Interface components */ + ((USBD_CDC_ACM_ItfTypeDef *) pdev->pUserData_CDC_ACM)->DeInit(i); + } + return (uint8_t) USBD_OK; +} + +/** + * @brief USBD_CDC_Setup + * Handle the CDC specific requests + * @param pdev: instance + * @param req: usb requests + * @retval status + */ +static uint8_t USBD_CDC_Setup(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req) +{ + USBD_CDC_ACM_HandleTypeDef * hcdc = NULL; + uint16_t len; + uint8_t ifalt = 0U; + uint16_t status_info = 0U; + USBD_StatusTypeDef ret = USBD_OK; + + uint8_t windex_to_ch = 0; + + for (uint8_t i = 0; i < NUMBER_OF_CDC; i++) { + if (LOBYTE(req->wIndex) == CDC_CMD_ITF_NBR[i] || LOBYTE(req->wIndex) == CDC_COM_ITF_NBR[i]) { + windex_to_ch = i; + break; + } + } + + hcdc = &CDC_ACM_Class_Data[windex_to_ch]; + + switch (req->bmRequest & USB_REQ_TYPE_MASK) { + case USB_REQ_TYPE_CLASS: + if (req->wLength != 0U) { + if ((req->bmRequest & 0x80U) != 0U) { + ((USBD_CDC_ACM_ItfTypeDef *) pdev->pUserData_CDC_ACM) + ->Control(windex_to_ch, req->bRequest, (uint8_t *) hcdc->data[windex_to_ch], req->wLength); + + len = MIN(CDC_REQ_MAX_DATA_SIZE, req->wLength); + (void) USBD_CtlSendData(pdev, (uint8_t *) hcdc->data[windex_to_ch], len); + } else { + hcdc->CmdOpCode = req->bRequest; + hcdc->CmdLength = (uint8_t) req->wLength; + + (void) USBD_CtlPrepareRx(pdev, (uint8_t *) hcdc->data[windex_to_ch], req->wLength); + } + } else { + ((USBD_CDC_ACM_ItfTypeDef *) pdev->pUserData_CDC_ACM) + ->Control(windex_to_ch, req->bRequest, (uint8_t *) req, 0U); + } + break; + + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) { + case USB_REQ_GET_STATUS: + if (pdev->dev_state == USBD_STATE_CONFIGURED) { + (void) USBD_CtlSendData(pdev, (uint8_t *) &status_info, 2U); + } else { + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + } + break; + + case USB_REQ_GET_INTERFACE: + if (pdev->dev_state == USBD_STATE_CONFIGURED) { + (void) USBD_CtlSendData(pdev, &ifalt, 1U); + } else { + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + } + break; + + case USB_REQ_SET_INTERFACE: + if (pdev->dev_state != USBD_STATE_CONFIGURED) { + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + } + break; + + case USB_REQ_CLEAR_FEATURE: + break; + + default: + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + break; + } + break; + + default: + USBD_CtlError(pdev, req); + ret = USBD_FAIL; + break; + } + + return (uint8_t) ret; +} + +/** + * @brief USBD_CDC_DataIn + * Data sent on non-control IN endpoint + * @param pdev: device instance + * @param epnum: endpoint number + * @retval status + */ +static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef * pdev, uint8_t epnum) +{ + USBD_CDC_ACM_HandleTypeDef * hcdc = NULL; + PCD_HandleTypeDef * hpcd = pdev->pData; + uint8_t ep_to_ch = 0; + + for (uint8_t i = 0; i < NUMBER_OF_CDC; i++) { + if (epnum == (CDC_IN_EP[i] & 0x0F)) { + ep_to_ch = i; + break; + } + } + + hcdc = &CDC_ACM_Class_Data[ep_to_ch]; + + if ((pdev->ep_in[epnum].total_length > 0U) + && ((pdev->ep_in[epnum].total_length % hpcd->IN_ep[epnum].maxpacket) == 0U)) { + /* Update the packet total length */ + pdev->ep_in[epnum].total_length = 0U; + + /* Send ZLP */ + (void) USBD_LL_Transmit(pdev, epnum, NULL, 0U); + } else { + hcdc->TxState = 0U; + + if (((USBD_CDC_ACM_ItfTypeDef *) pdev->pUserData_CDC_ACM)->TransmitCplt != NULL) { + ((USBD_CDC_ACM_ItfTypeDef *) pdev->pUserData_CDC_ACM) + ->TransmitCplt(ep_to_ch, hcdc->TxBuffer, &hcdc->TxLength, epnum); + } + } + + return (uint8_t) USBD_OK; +} + +/** + * @brief USBD_CDC_DataOut + * Data received on non-control Out endpoint + * @param pdev: device instance + * @param epnum: endpoint number + * @retval status + */ + +static uint8_t USBD_CDC_DataOut(USBD_HandleTypeDef * pdev, uint8_t epnum) +{ + USBD_CDC_ACM_HandleTypeDef * hcdc = NULL; + uint8_t ep_to_ch = 0; + + for (uint8_t i = 0; i < NUMBER_OF_CDC; i++) { + if (epnum == CDC_OUT_EP[i]) { + ep_to_ch = i; + break; + } + } + + hcdc = &CDC_ACM_Class_Data[ep_to_ch]; + + /* Get the received data length */ + hcdc->RxLength = USBD_LL_GetRxDataSize(pdev, epnum); + + /* USB data will be immediately processed, this allow next USB traffic being + NAKed till the end of the application Xfer */ + + ((USBD_CDC_ACM_ItfTypeDef *) pdev->pUserData_CDC_ACM)->Receive(ep_to_ch, hcdc->RxBuffer, &hcdc->RxLength); + + return (uint8_t) USBD_OK; +} + +/** + * @brief USBD_CDC_EP0_RxReady + * Handle EP0 Rx Ready event + * @param pdev: device instance + * @retval status + */ +static uint8_t USBD_CDC_EP0_RxReady(USBD_HandleTypeDef * pdev) +{ + USBD_CDC_ACM_HandleTypeDef * hcdc = NULL; + + for (uint8_t i = 0; i < NUMBER_OF_CDC; i++) { + hcdc = &CDC_ACM_Class_Data[i]; + + if (hcdc == NULL) { return (uint8_t) USBD_FAIL; } + + if ((pdev->pUserData_CDC_ACM != NULL) && (hcdc->CmdOpCode != 0xFFU)) { + ((USBD_CDC_ACM_ItfTypeDef *) pdev->pUserData_CDC_ACM) + ->Control(i, hcdc->CmdOpCode, (uint8_t *) hcdc->data[i], (uint16_t) hcdc->CmdLength); + hcdc->CmdOpCode = 0xFFU; + } + } + + return (uint8_t) USBD_OK; +} + +/** + * @brief USBD_CDC_GetFSCfgDesc + * Return configuration descriptor + * @param speed : current device speed + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t * USBD_CDC_GetFSCfgDesc(uint16_t * length) +{ + *length = (uint16_t) sizeof(USBD_CDC_CfgFSDesc); + + return USBD_CDC_CfgFSDesc; +} + +/** + * @brief USBD_CDC_GetHSCfgDesc + * Return configuration descriptor + * @param speed : current device speed + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t * USBD_CDC_GetHSCfgDesc(uint16_t * length) +{ + *length = (uint16_t) sizeof(USBD_CDC_CfgHSDesc); + + return USBD_CDC_CfgHSDesc; +} + +/** + * @brief USBD_CDC_GetOtherSpeedCfgDesc + * Return configuration descriptor + * @param speed : current device speed + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t * USBD_CDC_GetOtherSpeedCfgDesc(uint16_t * length) +{ + *length = (uint16_t) sizeof(USBD_CDC_CfgFSDesc); + + return USBD_CDC_CfgFSDesc; +} + +/** + * @brief USBD_CDC_GetDeviceQualifierDescriptor + * return Device Qualifier descriptor + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +uint8_t * USBD_CDC_GetDeviceQualifierDescriptor(uint16_t * length) +{ + *length = (uint16_t) sizeof(USBD_CDC_DeviceQualifierDesc); + + return USBD_CDC_DeviceQualifierDesc; +} + +/** + * @brief USBD_CDC_RegisterInterface + * @param pdev: device instance + * @param fops: CD Interface callback + * @retval status + */ +uint8_t USBD_CDC_ACM_RegisterInterface(USBD_HandleTypeDef * pdev, USBD_CDC_ACM_ItfTypeDef * fops) +{ + if (fops == NULL) { return (uint8_t) USBD_FAIL; } + + pdev->pUserData_CDC_ACM = fops; + + return (uint8_t) USBD_OK; +} + +/** + * @brief USBD_CDC_SetTxBuffer + * @param pdev: device instance + * @param pbuff: Tx Buffer + * @retval status + */ +uint8_t USBD_CDC_SetTxBuffer(uint8_t ch, USBD_HandleTypeDef * pdev, uint8_t * pbuff, uint32_t length) +{ + USBD_CDC_ACM_HandleTypeDef * hcdc = NULL; + + hcdc = &CDC_ACM_Class_Data[ch]; + + hcdc->TxBuffer = pbuff; + hcdc->TxLength = length; + + return (uint8_t) USBD_OK; +} + +/** + * @brief USBD_CDC_SetRxBuffer + * @param pdev: device instance + * @param pbuff: Rx Buffer + * @retval status + */ +uint8_t USBD_CDC_SetRxBuffer(uint8_t ch, USBD_HandleTypeDef * pdev, uint8_t * pbuff) +{ + USBD_CDC_ACM_HandleTypeDef * hcdc = NULL; + + hcdc = &CDC_ACM_Class_Data[ch]; + + hcdc->RxBuffer = pbuff; + + return (uint8_t) USBD_OK; +} + +/** + * @brief USBD_CDC_TransmitPacket + * Transmit packet on IN endpoint + * @param pdev: device instance + * @retval status + */ +uint8_t USBD_CDC_TransmitPacket(uint8_t ch, USBD_HandleTypeDef * pdev) +{ + USBD_CDC_ACM_HandleTypeDef * hcdc = NULL; + USBD_StatusTypeDef ret = USBD_BUSY; + + hcdc = &CDC_ACM_Class_Data[ch]; + + if (hcdc->TxState == 0U) { + /* Tx Transfer in progress */ + hcdc->TxState = 1U; + + /* Update the packet total length */ + pdev->ep_in[CDC_IN_EP[ch] & 0xFU].total_length = hcdc->TxLength; + + /* Transmit next packet */ + (void) USBD_LL_Transmit(pdev, CDC_IN_EP[ch], hcdc->TxBuffer, hcdc->TxLength); + + ret = USBD_OK; + } + + return (uint8_t) ret; +} + +/** + * @brief USBD_CDC_ACM_ReceivePacket + * prepare OUT Endpoint for reception + * @param pdev: device instance + * @retval status + */ +uint8_t USBD_CDC_ReceivePacket(uint8_t ch, USBD_HandleTypeDef * pdev) +{ + USBD_CDC_ACM_HandleTypeDef * hcdc = NULL; + + hcdc = &CDC_ACM_Class_Data[ch]; + + if (pdev->dev_speed == USBD_SPEED_HIGH) { + /* Prepare Out endpoint to receive next packet */ + (void) USBD_LL_PrepareReceive(pdev, CDC_OUT_EP[ch], hcdc->RxBuffer, CDC_DATA_HS_OUT_PACKET_SIZE); + } else { + /* Prepare Out endpoint to receive next packet */ + (void) USBD_LL_PrepareReceive(pdev, CDC_OUT_EP[ch], hcdc->RxBuffer, CDC_DATA_FS_OUT_PACKET_SIZE); + } + + return (uint8_t) USBD_OK; +} + +void USBD_Update_CDC_ACM_DESC(uint8_t * desc, uint8_t cmd_itf, uint8_t com_itf, uint8_t in_ep, uint8_t cmd_ep, + uint8_t out_ep, uint8_t str_idx) +{ + desc += 9; + for (uint8_t i = 0; i < NUMBER_OF_CDC; i++) { + desc[2] = cmd_itf; + desc[16] = str_idx; + desc[10] = cmd_itf; + desc[26] = com_itf; + desc[34] = cmd_itf; + desc[35] = com_itf; + desc[38] = cmd_ep; + desc[45] = com_itf; + desc[54] = out_ep; + desc[61] = in_ep; + + desc += 66; + CDC_IN_EP[i] = in_ep; + CDC_OUT_EP[i] = out_ep; + CDC_CMD_EP[i] = cmd_ep; + CDC_CMD_ITF_NBR[i] = cmd_itf; + CDC_COM_ITF_NBR[i] = com_itf; + CDC_STR_DESC_IDX[i] = str_idx; + + in_ep += 2; + cmd_ep = in_ep + 1; + out_ep++; + str_idx++; + + cmd_itf += 2; + com_itf = cmd_itf + 1; + } +} +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/USB_AL94/usbd_cdc.h b/common/USB_AL94/usbd_cdc.h new file mode 100644 index 0000000..7ecfee1 --- /dev/null +++ b/common/USB_AL94/usbd_cdc.h @@ -0,0 +1,151 @@ +/** + ****************************************************************************** + * @file usbd_cdc.h + * @author MCD Application Team + * @brief header file for the usbd_cdc.c file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * 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 + * + ****************************************************************************** + */ + +#ifndef __USB_CDC_H +#define __USB_CDC_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "usbd_ioreq.h" +#include + +#define CDC_ACM_STR_DESC "STM32 CDC ACM%d" + +#define NUMBER_OF_CDC _USBD_CDC_ACM_COUNT +#ifndef CDC_HS_BINTERVAL +#define CDC_HS_BINTERVAL 0x10U +#endif /* CDC_HS_BINTERVAL */ + +#ifndef CDC_FS_BINTERVAL +#define CDC_FS_BINTERVAL 0x10U +#endif /* CDC_FS_BINTERVAL */ + +/* CDC Endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */ +#define CDC_DATA_HS_MAX_PACKET_SIZE 512U /* Endpoint IN & OUT Packet size */ +#define CDC_DATA_FS_MAX_PACKET_SIZE 64U /* Endpoint IN & OUT Packet size */ +#define CDC_CMD_PACKET_SIZE 8U /* Control Endpoint Packet size */ + +#define USB_CDC_CONFIG_DESC_SIZ (9 + 66 * NUMBER_OF_CDC) +#define CDC_DATA_HS_IN_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE +#define CDC_DATA_HS_OUT_PACKET_SIZE CDC_DATA_HS_MAX_PACKET_SIZE + +#define CDC_DATA_FS_IN_PACKET_SIZE CDC_DATA_FS_MAX_PACKET_SIZE +#define CDC_DATA_FS_OUT_PACKET_SIZE CDC_DATA_FS_MAX_PACKET_SIZE + +#define CDC_REQ_MAX_DATA_SIZE 0x7U +/*---------------------------------------------------------------------*/ +/* CDC definitions */ +/*---------------------------------------------------------------------*/ +#define CDC_SEND_ENCAPSULATED_COMMAND 0x00U +#define CDC_GET_ENCAPSULATED_RESPONSE 0x01U +#define CDC_SET_COMM_FEATURE 0x02U +#define CDC_GET_COMM_FEATURE 0x03U +#define CDC_CLEAR_COMM_FEATURE 0x04U +#define CDC_SET_LINE_CODING 0x20U +#define CDC_GET_LINE_CODING 0x21U +#define CDC_SET_CONTROL_LINE_STATE 0x22U +#define CDC_SEND_BREAK 0x23U + +/** @defgroup USBD_CORE_Exported_TypesDefinitions + * @{ + */ + +typedef struct +{ + uint32_t bitrate; + uint8_t format; + uint8_t paritytype; + uint8_t datatype; +} USBD_CDC_ACM_LineCodingTypeDef; + +typedef struct _USBD_CDC_Itf +{ + int8_t (*Init)(uint8_t cdc_ch); + int8_t (*DeInit)(uint8_t cdc_ch); + int8_t (*Control)(uint8_t cdc_ch, uint8_t cmd, uint8_t * pbuf, uint16_t length); + int8_t (*Receive)(uint8_t cdc_ch, uint8_t * Buf, uint32_t * Len); + int8_t (*TransmitCplt)(uint8_t cdc_ch, uint8_t * Buf, uint32_t * Len, uint8_t epnum); +} USBD_CDC_ACM_ItfTypeDef; + +typedef struct +{ + uint32_t data[NUMBER_OF_CDC][CDC_DATA_HS_MAX_PACKET_SIZE / 4U]; /* Force 32bits alignment */ + uint8_t CmdOpCode; + uint8_t CmdLength; + uint8_t * RxBuffer; + uint8_t * TxBuffer; + uint32_t RxLength; + uint32_t TxLength; + + __IO uint32_t TxState; + __IO uint32_t RxState; +} USBD_CDC_ACM_HandleTypeDef; + +/** @defgroup USBD_CORE_Exported_Variables + * @{ + */ + +extern USBD_ClassTypeDef USBD_CDC_ACM; + +extern uint8_t CDC_IN_EP[NUMBER_OF_CDC]; /* EP1 for data IN */ +extern uint8_t CDC_OUT_EP[NUMBER_OF_CDC]; /* EP1 for data OUT */ +extern uint8_t CDC_CMD_EP[NUMBER_OF_CDC]; /* EP2 for CDC commands */ + +extern uint8_t CDC_CMD_ITF_NBR[NUMBER_OF_CDC]; /* Command Interface Number */ +extern uint8_t CDC_COM_ITF_NBR[NUMBER_OF_CDC]; /* Communication Interface Number */ + +extern uint8_t CDC_STR_DESC_IDX[NUMBER_OF_CDC]; + +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_Functions + * @{ + */ +uint8_t USBD_CDC_ACM_RegisterInterface(USBD_HandleTypeDef * pdev, USBD_CDC_ACM_ItfTypeDef * fops); + +uint8_t USBD_CDC_SetTxBuffer(uint8_t ch, USBD_HandleTypeDef * pdev, uint8_t * pbuff, uint32_t length); + +uint8_t USBD_CDC_SetRxBuffer(uint8_t ch, USBD_HandleTypeDef * pdev, uint8_t * pbuff); +uint8_t USBD_CDC_ReceivePacket(uint8_t ch, USBD_HandleTypeDef * pdev); +uint8_t USBD_CDC_TransmitPacket(uint8_t ch, USBD_HandleTypeDef * pdev); + +void USBD_Update_CDC_ACM_DESC(uint8_t * desc, uint8_t cmd_itf, uint8_t com_itf, uint8_t in_ep, uint8_t cmd_ep, + uint8_t out_ep, uint8_t str_idx); +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USB_CDC_H */ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/USB_AL94/usbd_cdc_if.c b/common/USB_AL94/usbd_cdc_if.c new file mode 100644 index 0000000..f5ee6d4 --- /dev/null +++ b/common/USB_AL94/usbd_cdc_if.c @@ -0,0 +1,238 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : usbd_cdc_if.c + * @version : v2.0_Cube + * @brief : Usb device for Virtual Com Port. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * 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 + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_cdc_if.h" + +#include + +#define APP_RX_DATA_SIZE 128 +//#define APP_TX_DATA_SIZE 128 + +/** RX buffer for USB */ +uint8_t RX_Buffer[NUMBER_OF_CDC][APP_RX_DATA_SIZE]; + +/** TX buffer for USB, RX buffer for UART */ +//uint8_t TX_Buffer[NUMBER_OF_CDC][APP_TX_DATA_SIZE]; +USBD_CDC_ACM_LineCodingTypeDef Line_Coding[NUMBER_OF_CDC]; + +uint32_t Write_Index[NUMBER_OF_CDC]; /* keep track of received data over UART */ +uint32_t Read_Index[NUMBER_OF_CDC]; /* keep track of sent data to USB */ + +extern USBD_HandleTypeDef hUsbDevice; + +static int8_t CDC_Init(uint8_t cdc_ch); +static int8_t CDC_DeInit(uint8_t cdc_ch); +static int8_t CDC_Control(uint8_t cdc_ch, uint8_t cmd, uint8_t * pbuf, uint16_t length); +static int8_t CDC_Receive(uint8_t cdc_ch, uint8_t * pbuf, uint32_t * Len); +static int8_t CDC_TransmitCplt(uint8_t cdc_ch, uint8_t * Buf, uint32_t * Len, uint8_t epnum); + +USBD_CDC_ACM_ItfTypeDef USBD_CDC_ACM_fops = {CDC_Init, CDC_DeInit, CDC_Control, CDC_Receive, CDC_TransmitCplt}; + +static int8_t CDC_Init(uint8_t cdc_ch) +{ + /* USER CODE BEGIN 3 */ + + /* ##-1- Set Application Buffers */ + USBD_CDC_SetRxBuffer(cdc_ch, &hUsbDevice, RX_Buffer[cdc_ch]); + + // /*##-2- Start the TIM Base generation in interrupt mode ####################*/ + // /* Start Channel1 */ + // if (HAL_TIM_Base_Start_IT(&htim4) != HAL_OK) + // { + // /* Starting Error */ + // Error_Handler(); + // } + + 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(uint8_t cdc_ch) +{ + /* USER CODE BEGIN 4 */ + /* DeInitialize the UART peripheral */ + // if (HAL_UART_DeInit(CDC_CH_To_UART_Handle(cdc_ch)) != HAL_OK) + // { + // /* Initialization Error */ + // Error_Handler(); + // } + 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(uint8_t cdc_ch, 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: + Line_Coding[cdc_ch].bitrate = (uint32_t) (pbuf[0] | (pbuf[1] << 8) | (pbuf[2] << 16) | (pbuf[3] << 24)); + Line_Coding[cdc_ch].format = pbuf[4]; + Line_Coding[cdc_ch].paritytype = pbuf[5]; + Line_Coding[cdc_ch].datatype = pbuf[6]; + + //Change_UART_Setting(cdc_ch); + break; + + case CDC_GET_LINE_CODING: + pbuf[0] = (uint8_t) (Line_Coding[cdc_ch].bitrate); + pbuf[1] = (uint8_t) (Line_Coding[cdc_ch].bitrate >> 8); + pbuf[2] = (uint8_t) (Line_Coding[cdc_ch].bitrate >> 16); + pbuf[3] = (uint8_t) (Line_Coding[cdc_ch].bitrate >> 24); + pbuf[4] = Line_Coding[cdc_ch].format; + pbuf[5] = Line_Coding[cdc_ch].paritytype; + pbuf[6] = Line_Coding[cdc_ch].datatype; + 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 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(uint8_t cdc_ch, uint8_t * Buf, uint32_t * Len) +{ + /* USER CODE BEGIN 6 */ + CDC_Receive_Callback(cdc_ch, Buf, *Len); //NOTE! AL94 USB CDC. We implement this. + + USBD_CDC_SetRxBuffer(cdc_ch, &hUsbDevice, &Buf[0]); + USBD_CDC_ReceivePacket(cdc_ch, &hUsbDevice); + return (USBD_OK); + /* USER CODE END 6 */ +} + +/** + * @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(uint8_t cdc_ch, uint8_t * Buf, uint32_t * Len, uint8_t epnum) +{ + CDC_TransmitCplt_Callback(cdc_ch, Buf, (uint16_t) (*Len)); //NOTE! AL94 USB CDC. We implement this. + + return (USBD_OK); +} + +/** + * @brief CDC_Transmit + * 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(uint8_t ch, uint8_t * Buf, uint16_t Len) +{ + uint8_t result = USBD_OK; + /* USER CODE BEGIN 7 */ + extern USBD_CDC_ACM_HandleTypeDef CDC_ACM_Class_Data[]; + USBD_CDC_ACM_HandleTypeDef * hcdc = NULL; + hcdc = &CDC_ACM_Class_Data[ch]; + if (hcdc->TxState != 0) { return USBD_BUSY; } + USBD_CDC_SetTxBuffer(ch, &hUsbDevice, Buf, Len); + result = USBD_CDC_TransmitPacket(ch, &hUsbDevice); + /* USER CODE END 7 */ + return result; +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/USB_AL94/usbd_cdc_if.h b/common/USB_AL94/usbd_cdc_if.h new file mode 100644 index 0000000..92fa2b7 --- /dev/null +++ b/common/USB_AL94/usbd_cdc_if.h @@ -0,0 +1,39 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : usbd_cdc_acm_if.h + * @version : v2.0_Cube + * @brief : Header for usbd_cdc_if.c file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * 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 + * + ****************************************************************************** + */ + +#ifndef __USBD_CDC_ACM_IF_H__ +#define __USBD_CDC_ACM_IF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "usbd_cdc.h" + +extern USBD_CDC_ACM_ItfTypeDef USBD_CDC_ACM_fops; +uint8_t CDC_Transmit(uint8_t ch, uint8_t * Buf, uint16_t Len); + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_CDC_ACM_IF_TEMPLATE_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/USB_AL94/usbd_composite.c b/common/USB_AL94/usbd_composite.c new file mode 100644 index 0000000..28e608b --- /dev/null +++ b/common/USB_AL94/usbd_composite.c @@ -0,0 +1,366 @@ +/** + ****************************************************************************** + * @file usbd_composite.c + * @author MCD Application Team + * @brief This file provides the HID core functions. + * + * @verbatim + * + * =================================================================== + * COMPOSITE Class Description + * =================================================================== + * + * + * + * + * + * + * @note In HS mode and when the DMA is used, all variables and data structures + * dealing with the DMA during the transaction process should be 32-bit aligned. + * + * + * @endverbatim + * + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * 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 + * + ****************************************************************************** + */ + +#include "usbd_composite.h" +#include "usbd_ctlreq.h" + +static uint8_t USBD_COMPOSITE_Init(USBD_HandleTypeDef * pdev, uint8_t cfgidx); +static uint8_t USBD_COMPOSITE_DeInit(USBD_HandleTypeDef * pdev, uint8_t cfgidx); +static uint8_t USBD_COMPOSITE_Setup(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req); +static uint8_t USBD_COMPOSITE_DataIn(USBD_HandleTypeDef * pdev, uint8_t epnum); +static uint8_t USBD_COMPOSITE_DataOut(USBD_HandleTypeDef * pdev, uint8_t epnum); +static uint8_t USBD_COMPOSITE_EP0_RxReady(USBD_HandleTypeDef * pdev); +static uint8_t USBD_COMPOSITE_EP0_TxReady(USBD_HandleTypeDef * pdev); +static uint8_t USBD_COMPOSITE_SOF(USBD_HandleTypeDef * pdev); +static uint8_t USBD_COMPOSITE_IsoINIncomplete(USBD_HandleTypeDef * pdev, uint8_t epnum); +static uint8_t USBD_COMPOSITE_IsoOutIncomplete(USBD_HandleTypeDef * pdev, uint8_t epnum); + +static uint8_t * USBD_COMPOSITE_GetHSCfgDesc(uint16_t * length); +static uint8_t * USBD_COMPOSITE_GetFSCfgDesc(uint16_t * length); +static uint8_t * USBD_COMPOSITE_GetOtherSpeedCfgDesc(uint16_t * length); +static uint8_t * USBD_COMPOSITE_GetDeviceQualifierDesc(uint16_t * length); +static uint8_t * USBD_COMPOSITE_GetUsrStringDesc(USBD_HandleTypeDef * pdev, uint8_t index, uint16_t * length); + +USBD_ClassTypeDef USBD_COMPOSITE = {USBD_COMPOSITE_Init, + USBD_COMPOSITE_DeInit, + USBD_COMPOSITE_Setup, + USBD_COMPOSITE_EP0_TxReady, + USBD_COMPOSITE_EP0_RxReady, + USBD_COMPOSITE_DataIn, + USBD_COMPOSITE_DataOut, + USBD_COMPOSITE_SOF, + USBD_COMPOSITE_IsoINIncomplete, + USBD_COMPOSITE_IsoOutIncomplete, + USBD_COMPOSITE_GetHSCfgDesc, + USBD_COMPOSITE_GetFSCfgDesc, + USBD_COMPOSITE_GetOtherSpeedCfgDesc, + USBD_COMPOSITE_GetDeviceQualifierDesc, + USBD_COMPOSITE_GetUsrStringDesc}; + +typedef struct USBD_COMPOSITE_CFG_DESC_t +{ + uint8_t CONFIG_DESC[USB_CONF_DESC_SIZE]; + + uint8_t USBD_CDC_ACM_DESC[USB_CDC_CONFIG_DESC_SIZ - 0x09]; + +} __PACKED USBD_COMPOSITE_CFG_DESC_t; + +__ALIGN_BEGIN USBD_COMPOSITE_CFG_DESC_t USBD_COMPOSITE_FSCfgDesc, USBD_COMPOSITE_HSCfgDesc __ALIGN_END; +uint8_t USBD_Track_String_Index = (USBD_IDX_INTERFACE_STR + 1); + +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN static uint8_t USBD_COMPOSITE_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = { + USB_LEN_DEV_QUALIFIER_DESC, USB_DESC_TYPE_DEVICE_QUALIFIER, 0x00, 0x02, 0xEF, 0x02, 0x01, 0x40, 0x01, 0x00, +}; + +/** + * @brief USBD_COMPOSITE_Init + * Initialize the COMPOSITE interface + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t USBD_COMPOSITE_Init(USBD_HandleTypeDef * pdev, uint8_t cfgidx) +{ + USBD_CDC_ACM.Init(pdev, cfgidx); + return (uint8_t) USBD_OK; +} + +/** + * @brief USBD_COMPOSITE_Init + * DeInitialize the COMPOSITE layer + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t USBD_COMPOSITE_DeInit(USBD_HandleTypeDef * pdev, uint8_t cfgidx) +{ + USBD_CDC_ACM.DeInit(pdev, cfgidx); + + return (uint8_t) USBD_OK; +} + +/** + * @brief USBD_COMPOSITE_Setup + * Handle the COMPOSITE specific requests + * @param pdev: instance + * @param req: usb requests + * @retval status + */ +static uint8_t USBD_COMPOSITE_Setup(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req) +{ + for (uint8_t i = 0; i < USBD_CDC_ACM_COUNT; i++) { + if (LOBYTE(req->wIndex) == CDC_CMD_ITF_NBR[i] || LOBYTE(req->wIndex) == CDC_COM_ITF_NBR[i]) { + return USBD_CDC_ACM.Setup(pdev, req); + } + } + + return USBD_FAIL; +} + +/** + * @brief USBD_COMPOSITE_DataIn + * handle data IN Stage + * @param pdev: device instance + * @param epnum: endpoint index + * @retval status + */ +static uint8_t USBD_COMPOSITE_DataIn(USBD_HandleTypeDef * pdev, uint8_t epnum) +{ + for (uint8_t i = 0; i < USBD_CDC_ACM_COUNT; i++) { + if (epnum == (CDC_IN_EP[i] & 0x7F) || epnum == (CDC_CMD_EP[i] & 0x7F)) { return USBD_CDC_ACM.DataIn(pdev, epnum); } + } + return USBD_FAIL; +} + +/** + * @brief USBD_COMPOSITE_EP0_RxReady + * handle EP0 Rx Ready event + * @param pdev: device instance + * @retval status + */ +static uint8_t USBD_COMPOSITE_EP0_RxReady(USBD_HandleTypeDef * pdev) +{ + USBD_CDC_ACM.EP0_RxReady(pdev); + return (uint8_t) USBD_OK; +} + +/** + * @brief USBD_COMPOSITE_EP0_TxReady + * handle EP0 TRx Ready event + * @param pdev: device instance + * @retval status + */ +static uint8_t USBD_COMPOSITE_EP0_TxReady(USBD_HandleTypeDef * pdev) { return (uint8_t) USBD_OK; } + +/** + * @brief USBD_COMPOSITE_SOF + * handle SOF event + * @param pdev: device instance + * @retval status + */ +static uint8_t USBD_COMPOSITE_SOF(USBD_HandleTypeDef * pdev) { return (uint8_t) USBD_OK; } + +/** + * @brief USBD_COMPOSITE_IsoINIncomplete + * handle data ISO IN Incomplete event + * @param pdev: device instance + * @param epnum: endpoint index + * @retval status + */ +static uint8_t USBD_COMPOSITE_IsoINIncomplete(USBD_HandleTypeDef * pdev, uint8_t epnum) { return (uint8_t) USBD_OK; } + +/** + * @brief USBD_COMPOSITE_IsoOutIncomplete + * handle data ISO OUT Incomplete event + * @param pdev: device instance + * @param epnum: endpoint index + * @retval status + */ +static uint8_t USBD_COMPOSITE_IsoOutIncomplete(USBD_HandleTypeDef * pdev, uint8_t epnum) { return (uint8_t) USBD_OK; } +/** + * @brief USBD_COMPOSITE_DataOut + * handle data OUT Stage + * @param pdev: device instance + * @param epnum: endpoint index + * @retval status + */ +static uint8_t USBD_COMPOSITE_DataOut(USBD_HandleTypeDef * pdev, uint8_t epnum) +{ + for (uint8_t i = 0; i < USBD_CDC_ACM_COUNT; i++) { + if (epnum == CDC_OUT_EP[i]) { return USBD_CDC_ACM.DataOut(pdev, epnum); } + } + return USBD_FAIL; +} + +/** + * @brief USBD_COMPOSITE_GetHSCfgDesc + * return configuration descriptor + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t * USBD_COMPOSITE_GetHSCfgDesc(uint16_t * length) +{ + *length = (uint16_t) sizeof(USBD_COMPOSITE_HSCfgDesc); + return (uint8_t *) &USBD_COMPOSITE_HSCfgDesc; +} + +/** + * @brief USBD_COMPOSITE_GetFSCfgDesc + * return configuration descriptor + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t * USBD_COMPOSITE_GetFSCfgDesc(uint16_t * length) +{ + *length = (uint16_t) sizeof(USBD_COMPOSITE_FSCfgDesc); + return (uint8_t *) &USBD_COMPOSITE_FSCfgDesc; +} + +/** + * @brief USBD_COMPOSITE_GetOtherSpeedCfgDesc + * return configuration descriptor + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t * USBD_COMPOSITE_GetOtherSpeedCfgDesc(uint16_t * length) +{ +#if (USBD_USE_HS == 1) + *length = (uint16_t) sizeof(USBD_COMPOSITE_FSCfgDesc); + return (uint8_t *) &USBD_COMPOSITE_FSCfgDesc; +#else + *length = (uint16_t) sizeof(USBD_COMPOSITE_HSCfgDesc); + return (uint8_t *) &USBD_COMPOSITE_HSCfgDesc; +#endif +} + +/** + * @brief DeviceQualifierDescriptor + * return Device Qualifier descriptor + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +uint8_t * USBD_COMPOSITE_GetDeviceQualifierDesc(uint16_t * length) +{ + *length = (uint16_t) sizeof(USBD_COMPOSITE_DeviceQualifierDesc); + return USBD_COMPOSITE_DeviceQualifierDesc; +} + +/** + * @brief USBD_COMPOSITE_GetUsrStringDesc + * Manages the transfer of memory interfaces string descriptors. + * @param speed : current device speed + * @param index: descriptor index + * @param length : pointer data length + * @retval pointer to the descriptor table or NULL if the descriptor is not supported. + */ +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) +static uint8_t * USBD_COMPOSITE_GetUsrStringDesc(USBD_HandleTypeDef * pdev, uint8_t index, uint16_t * length) +{ + static uint8_t USBD_StrDesc[64]; + + /* Check if the requested string interface is supported */ + if (index <= USBD_Track_String_Index) { + char str_buffer[16] = ""; + for (uint8_t i = 0; i < USBD_CDC_ACM_COUNT; i++) { + if (index == CDC_STR_DESC_IDX[i]) { + snprintf(str_buffer, sizeof(str_buffer), CDC_ACM_STR_DESC, i); + USBD_GetString((uint8_t *) str_buffer, USBD_StrDesc, length); + } + } + return USBD_StrDesc; + } else { + /* Not supported Interface Descriptor index */ + return NULL; + } +} +#endif + +void USBD_COMPOSITE_Mount_Class(void) +{ + uint16_t len = 0; + uint8_t * ptr = NULL; + + uint8_t in_ep_track = 0x81; + uint8_t out_ep_track = 0x01; + uint8_t interface_no_track = 0x00; + + ptr = USBD_CDC_ACM.GetFSConfigDescriptor(&len); + USBD_Update_CDC_ACM_DESC(ptr, interface_no_track, interface_no_track + 1, in_ep_track, in_ep_track + 1, out_ep_track, + USBD_Track_String_Index); + memcpy(USBD_COMPOSITE_FSCfgDesc.USBD_CDC_ACM_DESC, ptr + 0x09, len - 0x09); + + ptr = USBD_CDC_ACM.GetHSConfigDescriptor(&len); + USBD_Update_CDC_ACM_DESC(ptr, interface_no_track, interface_no_track + 1, in_ep_track, in_ep_track + 1, out_ep_track, + USBD_Track_String_Index); + memcpy(USBD_COMPOSITE_HSCfgDesc.USBD_CDC_ACM_DESC, ptr + 0x09, len - 0x09); + + in_ep_track += 2 * USBD_CDC_ACM_COUNT; + out_ep_track += 1 * USBD_CDC_ACM_COUNT; + interface_no_track += 2 * USBD_CDC_ACM_COUNT; + USBD_Track_String_Index += USBD_CDC_ACM_COUNT; + + uint16_t CFG_SIZE = sizeof(USBD_COMPOSITE_CFG_DESC_t); + ptr = USBD_COMPOSITE_HSCfgDesc.CONFIG_DESC; + /* Configuration Descriptor */ + ptr[0] = 0x09; /* bLength: Configuration Descriptor size */ + ptr[1] = USB_DESC_TYPE_CONFIGURATION; /* bDescriptorType: Configuration */ + ptr[2] = LOBYTE(CFG_SIZE); /* wTotalLength:no of returned bytes */ + ptr[3] = HIBYTE(CFG_SIZE); + ptr[4] = interface_no_track; /* bNumInterfaces: 2 interface */ + ptr[5] = 0x01; /* bConfigurationValue: Configuration value */ + ptr[6] = 0x00; /* iConfiguration: Index of string descriptor describing the configuration */ +#if (USBD_SELF_POWERED == 1U) + ptr[7] = 0xC0; /* bmAttributes: Bus Powered according to user configuration */ +#else + ptr[7] = 0x80; /* bmAttributes: Bus Powered according to user configuration */ +#endif + ptr[8] = USBD_MAX_POWER; /* MaxPower 100 mA */ + + ptr = USBD_COMPOSITE_FSCfgDesc.CONFIG_DESC; + /* Configuration Descriptor */ + ptr[0] = 0x09; /* bLength: Configuration Descriptor size */ + ptr[1] = USB_DESC_TYPE_CONFIGURATION; /* bDescriptorType: Configuration */ + ptr[2] = LOBYTE(CFG_SIZE); /* wTotalLength:no of returned bytes */ + ptr[3] = HIBYTE(CFG_SIZE); + ptr[4] = interface_no_track; /* bNumInterfaces: 2 interface */ + ptr[5] = 0x01; /* bConfigurationValue: Configuration value */ + ptr[6] = 0x00; /* iConfiguration: Index of string descriptor describing the configuration */ +#if (USBD_SELF_POWERED == 1U) + ptr[7] = 0xC0; /* bmAttributes: Bus Powered according to user configuration */ +#else + ptr[7] = 0x80; /* bmAttributes: Bus Powered according to user configuration */ +#endif + ptr[8] = USBD_MAX_POWER; /* MaxPower 100 mA */ + + (void) out_ep_track; + (void) in_ep_track; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/USB_AL94/usbd_composite.h b/common/USB_AL94/usbd_composite.h new file mode 100644 index 0000000..ba26ad4 --- /dev/null +++ b/common/USB_AL94/usbd_composite.h @@ -0,0 +1,58 @@ +/** + ****************************************************************************** + * @file usbd_composite.h + * @author MCD Application Team + * @brief Header file for the usbd_composite.c file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * 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 + * + ****************************************************************************** + */ + +#ifndef __USB_COMPOSITE_H +#define __USB_COMPOSITE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "stdbool.h" +#include "usbd_ioreq.h" +#include // NOTE! replaced "AL94.I-CUBE-USBD-COMPOSITE_conf.h" + +#define USBD_USE_HS _USBD_USE_HS +#define USBD_USE_CDC_ACM _USBD_USE_CDC_ACM +#define USBD_CDC_ACM_COUNT _USBD_CDC_ACM_COUNT +//#define USBD_USE_CDC_RNDIS _USBD_USE_CDC_RNDIS +//#define USBD_USE_CDC_ECM _USBD_USE_CDC_ECM +//#define USBD_USE_HID_MOUSE _USBD_USE_HID_MOUSE +//#define USBD_USE_HID_KEYBOARD _USBD_USE_HID_KEYBOARD +//#define USBD_USE_HID_CUSTOM _USBD_USE_HID_CUSTOM +//#define USBD_USE_UAC_MIC _USBD_USE_UAC_MIC +//#define USBD_USE_UAC_SPKR _USBD_USE_UAC_SPKR +//#define USBD_USE_UVC _USBD_USE_UVC +//#define USBD_USE_MSC _USBD_USE_MSC +//#define USBD_USE_DFU _USBD_USE_DFU +//#define USBD_USE_PRNTR _USBD_USE_PRNTR + +#include "usbd_cdc_if.h" + +extern USBD_ClassTypeDef USBD_COMPOSITE; + +void USBD_COMPOSITE_Mount_Class(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __USB_COMPOSITE_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/AL94_USB_Composite/Target/usbd_conf.c b/common/USB_AL94/usbd_conf.c similarity index 96% rename from common/AL94_USB_Composite/Target/usbd_conf.c rename to common/USB_AL94/usbd_conf.c index c05b09f..03a96ac 100644 --- a/common/AL94_USB_Composite/Target/usbd_conf.c +++ b/common/USB_AL94/usbd_conf.c @@ -1,816 +1,816 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : Target/usbd_conf.c - * @version : v1.0_Cube - * @brief : This file implements the board support package for the USB device library - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2021 STMicroelectronics. - * All rights reserved.

- * - * 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_def.h" -#include "usbd_core.h" - -/* USER CODE BEGIN Includes */ -#include "usbd_composite.h" -#if (STM32F1_DEVICE) /** for STM32F1 or similar */ -#include "usb.h" -#else -// #include "usb_otg.h" -#include -#endif -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ - -/* USER CODE BEGIN PV */ -/* Private variables ---------------------------------------------------------*/ - -/* USER CODE END PV */ -PCD_HandleTypeDef *hpcd_USB_OTG_PTR; -void Error_Handler (void); - -/* External functions --------------------------------------------------------*/ - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/* USER CODE BEGIN PFP */ -/* Private function prototypes -----------------------------------------------*/ -USBD_StatusTypeDef USBD_Get_USB_Status (HAL_StatusTypeDef hal_status); -HAL_StatusTypeDef HAL_PCDEx_SetTxFiFoInBytes (PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size); -HAL_StatusTypeDef HAL_PCDEx_SetRxFiFoInBytes (PCD_HandleTypeDef *hpcd, uint16_t size); -/* USER CODE END PFP */ - -/* Private functions ---------------------------------------------------------*/ - -/* USER CODE BEGIN 1 */ -#if(!STM32F1_DEVICE) -HAL_StatusTypeDef HAL_PCDEx_SetTxFiFoInBytes (PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size) -{ - return HAL_PCDEx_SetTxFiFo (hpcd, fifo, (size / 4)); -} - -HAL_StatusTypeDef HAL_PCDEx_SetRxFiFoInBytes (PCD_HandleTypeDef *hpcd, uint16_t size) -{ - return HAL_PCDEx_SetRxFiFo (hpcd, (size / 4)); -} -#endif -/* USER CODE END 1 */ - -/******************************************************************************* - LL Driver Callbacks (PCD -> USB Device Library) - *******************************************************************************/ -/* MSP Init */ - -__weak void HAL_PCD_MspInit (PCD_HandleTypeDef *pcdHandle) -{ - /* @see usb_otg.c or usb.c for (STM32F1 or similar) generated by cube **/ -} - -__weak void HAL_PCD_MspDeInit (PCD_HandleTypeDef *pcdHandle) -{ - /* @see usb_otg.c or usb.c for (STM32F1 or similar) generated by cube **/ -} - -/** - * @brief Setup stage callback - * @param hpcd: PCD handle - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_SetupStageCallback (PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_SetupStage ((USBD_HandleTypeDef*) hpcd->pData, (uint8_t*) hpcd->Setup); -} - -/** - * @brief Data Out stage callback. - * @param hpcd: PCD handle - * @param epnum: Endpoint number - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -#else -void HAL_PCD_DataOutStageCallback (PCD_HandleTypeDef *hpcd, uint8_t epnum) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_DataOutStage ((USBD_HandleTypeDef*) hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff); -} - -/** - * @brief Data In stage callback. - * @param hpcd: PCD handle - * @param epnum: Endpoint number - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -#else -void HAL_PCD_DataInStageCallback (PCD_HandleTypeDef *hpcd, uint8_t epnum) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_DataInStage ((USBD_HandleTypeDef*) hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff); -} - -/** - * @brief SOF callback. - * @param hpcd: PCD handle - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_SOFCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_SOFCallback (PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_SOF ((USBD_HandleTypeDef*) hpcd->pData); -} - -/** - * @brief Reset callback. - * @param hpcd: PCD handle - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_ResetCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_ResetCallback (PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_SpeedTypeDef speed = USBD_SPEED_FULL; - - if (hpcd->Init.speed == PCD_SPEED_FULL) - { - speed = USBD_SPEED_FULL; - } -#if(!STM32F1_DEVICE) - else if (hpcd->Init.speed == PCD_SPEED_HIGH) - { - speed = USBD_SPEED_HIGH; - } -#endif - else - { - Error_Handler (); - } - /* Set Speed. */ - USBD_LL_SetSpeed ((USBD_HandleTypeDef*) hpcd->pData, speed); - - /* Reset Device. */ - USBD_LL_Reset ((USBD_HandleTypeDef*) hpcd->pData); -} - -/** - * @brief 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 - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_SuspendCallback (PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - /* Inform USB library that core enters in suspend Mode. */ - USBD_LL_Suspend ((USBD_HandleTypeDef*) hpcd->pData); -#if (!STM32F1_DEVICE) - __HAL_PCD_GATE_PHYCLOCK(hpcd); - /* Enter in STOP mode. */ - /* USER CODE BEGIN 2 */ - 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)); - } -#endif - /* USER CODE END 2 */ -} - -/** - * @brief 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 - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_ResumeCallback (PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - /* USER CODE BEGIN 3 */ - - /* USER CODE END 3 */ - USBD_LL_Resume ((USBD_HandleTypeDef*) hpcd->pData); -} - -/** - * @brief ISOOUTIncomplete callback. - * @param hpcd: PCD handle - * @param epnum: Endpoint number - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -#else -void HAL_PCD_ISOOUTIncompleteCallback (PCD_HandleTypeDef *hpcd, uint8_t epnum) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_IsoOUTIncomplete ((USBD_HandleTypeDef*) hpcd->pData, epnum); -} - -/** - * @brief ISOINIncomplete callback. - * @param hpcd: PCD handle - * @param epnum: Endpoint number - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) -#else -void HAL_PCD_ISOINIncompleteCallback (PCD_HandleTypeDef *hpcd, uint8_t epnum) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_IsoINIncomplete ((USBD_HandleTypeDef*) hpcd->pData, epnum); -} - -/** - * @brief Connect callback. - * @param hpcd: PCD handle - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_ConnectCallback (PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_DevConnected ((USBD_HandleTypeDef*) hpcd->pData); -} - -/** - * @brief Disconnect callback. - * @param hpcd: PCD handle - * @retval None - */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) -static void PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) -#else -void HAL_PCD_DisconnectCallback (PCD_HandleTypeDef *hpcd) -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ -{ - USBD_LL_DevDisconnected ((USBD_HandleTypeDef*) hpcd->pData); -} - -/******************************************************************************* - LL Driver Interface (USB Device Library --> PCD) - *******************************************************************************/ - -/** - * @brief Initializes the low level portion of the device driver. - * @param pdev: Device handle - * @retval USBD status - */ -USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev) -{ -#if (USBD_USE_HS == 1) - /** HIGH SPEED USB */ - hpcd_USB_OTG_PTR = &hpcd_USB_OTG_HS; - - if (pdev->id == DEVICE_HS) - { - /* Link the driver to the stack. */ - hpcd_USB_OTG_PTR->pData = pdev; - pdev->pData = hpcd_USB_OTG_PTR; - - /* @see HAL_PCD_Init() usb_otg.c generated by cube **/ - - HAL_PCDEx_SetRxFiFoInBytes(hpcd_USB_OTG_PTR, 1024); - - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, 0, 64); // EP0 IN - -#if (USBD_USE_CDC_RNDIS == 1) - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CDC_RNDIS_IN_EP & 0x7F), 128); - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CDC_RNDIS_CMD_EP & 0x7F), 64); -#endif -#if (USBD_USE_CDC_ECM == 1) - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CDC_ECM_IN_EP & 0x7F), 128); - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CDC_ECM_CMD_EP & 0x7F), 64); -#endif -#if (USBD_USE_HID_MOUSE == 1) - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (HID_MOUSE_IN_EP & 0x7F), 64); -#endif -#if (USBD_USE_HID_KEYBOARD == 1) - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (HID_KEYBOARD_IN_EP & 0x7F), 64); -#endif -#if (USBD_USE_HID_CUSTOM == 1) - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CUSTOM_HID_IN_EP & 0x7F), 64); -#endif -#if (USBD_USE_UAC_MIC == 1) - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (AUDIO_MIC_EP & 0x7F), 128); -#endif -#if (USBD_USE_UAC_SPKR == 1) -#endif -#if (USBD_USE_UVC == 1) - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (UVC_IN_EP & 0x7F), 128); -#endif -#if (USBD_USE_MSC == 1) - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (MSC_IN_EP & 0x7F), 128); -#endif -#if (USBD_USE_DFU == 1) -#endif -#if (USBD_USE_PRNTR == 1) - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (PRNT_IN_EP & 0x7F), 128); -#endif -#if (USBD_USE_CDC_ACM == 1) - for (uint8_t i = 0; i < USBD_CDC_ACM_COUNT; i++) - { - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CDC_IN_EP[i] & 0x7F), 128); - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CDC_CMD_EP[i] & 0x7F), 64); - } -#endif - } -#else - /**FULL SPEED USB */ -#if (STM32F1_DEVICE) /** for STM32F1 or similar */ - hpcd_USB_OTG_PTR = &hpcd_USB_FS; /** hpcd_USB_FS or hpcd_USB_OTG_FS*/ -#else - hpcd_USB_OTG_PTR = &hpcd_USB_OTG_FS; /** hpcd_USB_FS or hpcd_USB_OTG_FS*/ -#endif - - if (pdev->id == DEVICE_FS) - { - /* Link the driver to the stack. */ - hpcd_USB_OTG_PTR->pData = pdev; - pdev->pData = hpcd_USB_OTG_PTR; - - /* @see HAL_PCD_Init() usb_otg.c generated by cube **/ - -#if (STM32F1_DEVICE) - /** Device is F1 or similar or if HAL_PCDEx_PMAConfig() is used by HAL driver */ - uint16_t pma_track = 0x40; /** PMA offset*/ - - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, 0x00, PCD_SNG_BUF, pma_track); - pma_track += 0x40; - - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, 0x80, PCD_SNG_BUF, pma_track); - pma_track += 0x40; - -#if (USBD_USE_CDC_RNDIS == 1) - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CDC_RNDIS_IN_EP, PCD_SNG_BUF, pma_track); - pma_track += 128; - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CDC_RNDIS_OUT_EP, PCD_SNG_BUF, pma_track); - pma_track += 128; - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CDC_RNDIS_CMD_EP, PCD_SNG_BUF, pma_track); - pma_track += 8; -#endif -#if (USBD_USE_CDC_ECM == 1) - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CDC_ECM_IN_EP, PCD_SNG_BUF, pma_track); - pma_track += 48; - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CDC_ECM_OUT_EP, PCD_SNG_BUF, pma_track); - pma_track += 48; - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CDC_ECM_CMD_EP, PCD_SNG_BUF, pma_track); - pma_track += 8; -#endif -#if (USBD_USE_HID_MOUSE == 1) - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, HID_MOUSE_IN_EP, PCD_SNG_BUF, pma_track); - pma_track += 8; -#endif -#if (USBD_USE_HID_KEYBOARD == 1) - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, HID_KEYBOARD_IN_EP, PCD_SNG_BUF, pma_track); - pma_track += 8; -#endif -#if (USBD_USE_HID_CUSTOM == 1) - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CUSTOM_HID_IN_EP, PCD_SNG_BUF, pma_track); - pma_track += 8; - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CUSTOM_HID_OUT_EP, PCD_SNG_BUF, pma_track); - pma_track += 8; -#endif -#if (USBD_USE_UAC_MIC == 1) - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, AUDIO_MIC_EP, PCD_SNG_BUF, pma_track); - pma_track += 128; -#endif -#if (USBD_USE_UAC_SPKR == 1) - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, AUDIO_SPKR_EP, PCD_SNG_BUF, pma_track); - pma_track += 128; -#endif -#if (USBD_USE_UVC == 1) - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, UVC_IN_EP, PCD_SNG_BUF, pma_track); - pma_track += 128; -#endif -#if (USBD_USE_MSC == 1) - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, MSC_IN_EP, PCD_SNG_BUF, pma_track); - pma_track += 128; - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, MSC_OUT_EP, PCD_SNG_BUF, pma_track); - pma_track += 128; -#endif -#if (USBD_USE_DFU == 1) -#endif -#if (USBD_USE_PRNTR == 1) - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, PRNT_IN_EP, PCD_SNG_BUF, pma_track); - pma_track += 128; - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, PRNT_OUT_EP, PCD_SNG_BUF, pma_track); - pma_track += 128; -#endif -#if (USBD_USE_CDC_ACM == 1) - for (uint8_t i = 0; i < USBD_CDC_ACM_COUNT; i++) - { - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CDC_IN_EP[i], PCD_SNG_BUF, pma_track); - pma_track += 48; - - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CDC_OUT_EP[i], PCD_SNG_BUF, pma_track); - pma_track += 48; - - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CDC_CMD_EP[i], PCD_SNG_BUF, pma_track); - pma_track += 8; - } -#endif -#else /** if HAL_PCDEx_SetRxFiFo() is used by HAL driver */ - - HAL_PCDEx_SetRxFiFoInBytes (hpcd_USB_OTG_PTR, 512); // ALL OUT EP Buffer - - HAL_PCDEx_SetTxFiFoInBytes (hpcd_USB_OTG_PTR, 0, 64); // EP0 IN - -#if (USBD_USE_CDC_RNDIS == 1) - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CDC_RNDIS_IN_EP & 0x7F), 128); - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CDC_RNDIS_CMD_EP & 0x7F), 64); -#endif - -#if (USBD_USE_CDC_ECM == 1) - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CDC_ECM_IN_EP & 0x7F), 128); - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CDC_ECM_CMD_EP & 0x7F), 64); -#endif -#if (USBD_USE_HID_MOUSE == 1) - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (HID_MOUSE_IN_EP & 0x7F), 64); -#endif -#if (USBD_USE_HID_KEYBOARD == 1) - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (HID_KEYBOARD_IN_EP & 0x7F), 64); -#endif -#if (USBD_USE_HID_CUSTOM == 1) - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CUSTOM_HID_IN_EP & 0x7F), 64); -#endif -#if (USBD_USE_UAC_MIC == 1) - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (AUDIO_MIC_EP & 0x7F), 128); -#endif -#if (USBD_USE_UAC_SPKR == 1) -#endif -#if (USBD_USE_UVC == 1) - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (UVC_IN_EP & 0x7F), 128); -#endif -#if (USBD_USE_MSC == 1) - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (MSC_IN_EP & 0x7F), 128); -#endif -#if (USBD_USE_DFU == 1) -#endif -#if (USBD_USE_PRNTR == 1) - HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (PRNT_IN_EP & 0x7F), 128); -#endif -#if (USBD_USE_CDC_ACM == 1) - for (uint8_t i = 0; i < USBD_CDC_ACM_COUNT; i++) - { - HAL_PCDEx_SetTxFiFoInBytes (hpcd_USB_OTG_PTR, (CDC_IN_EP[i] & 0x7F), 128); - HAL_PCDEx_SetTxFiFoInBytes (hpcd_USB_OTG_PTR, (CDC_CMD_EP[i] & 0x7F), 64); - } -#endif -#endif - } -#endif - -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - /* Register USB PCD CallBacks */ - HAL_PCD_RegisterCallback(hpcd_USB_OTG_PTR, HAL_PCD_SOF_CB_ID, PCD_SOFCallback); - HAL_PCD_RegisterCallback(hpcd_USB_OTG_PTR, HAL_PCD_SETUPSTAGE_CB_ID, PCD_SetupStageCallback); - HAL_PCD_RegisterCallback(hpcd_USB_OTG_PTR, HAL_PCD_RESET_CB_ID, PCD_ResetCallback); - HAL_PCD_RegisterCallback(hpcd_USB_OTG_PTR, HAL_PCD_SUSPEND_CB_ID, PCD_SuspendCallback); - HAL_PCD_RegisterCallback(hpcd_USB_OTG_PTR, HAL_PCD_RESUME_CB_ID, PCD_ResumeCallback); - HAL_PCD_RegisterCallback(hpcd_USB_OTG_PTR, HAL_PCD_CONNECT_CB_ID, PCD_ConnectCallback); - HAL_PCD_RegisterCallback(hpcd_USB_OTG_PTR, HAL_PCD_DISCONNECT_CB_ID, PCD_DisconnectCallback); - - HAL_PCD_RegisterDataOutStageCallback(hpcd_USB_OTG_PTR, PCD_DataOutStageCallback); - HAL_PCD_RegisterDataInStageCallback(hpcd_USB_OTG_PTR, PCD_DataInStageCallback); - HAL_PCD_RegisterIsoOutIncpltCallback(hpcd_USB_OTG_PTR, PCD_ISOOUTIncompleteCallback); - HAL_PCD_RegisterIsoInIncpltCallback(hpcd_USB_OTG_PTR, PCD_ISOINIncompleteCallback); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - return USBD_OK; -} - -/** - * @brief 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; -} - -/** - * @brief 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; -} - -/** - * @brief 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; -} - -/** - * @brief 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; -} - -/** - * @brief 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; -} - -/** - * @brief 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; -} - -/** - * @brief 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; -} - -/** - * @brief 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; - } -} - -/** - * @brief 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; -} - -// NOTE! is used instead of the Cube generated ST file that does not check maxpacket -HAL_StatusTypeDef Faux_HAL_PCD_EP_Transmit (PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len) -{ - PCD_EPTypeDef *ep; - - ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; - - /*setup and start the Xfer */ - ep->xfer_buff = pBuf; - ep->xfer_len = len; - ep->xfer_count = 0U; - ep->is_in = 1U; - ep->num = ep_addr & EP_ADDR_MSK; - if (ep->maxpacket == 0) - return HAL_ERROR; // NOTE This prevents transmitting if buffers aren't initialized. - - if (hpcd->Init.dma_enable == 1U) - { - ep->dma_addr = (uint32_t) pBuf; - } - - (void) USB_EPStartXfer (hpcd->Instance, ep, (uint8_t) hpcd->Init.dma_enable); - - return HAL_OK; -} - -/** - * @brief 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 = Faux_HAL_PCD_EP_Transmit (pdev->pData, ep_addr, pbuf, size); - - usb_status = USBD_Get_USB_Status (hal_status); - - return usb_status; -} - -/** - * @brief 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; -} - -/** - * @brief 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); -} - -/** - * @brief Delays routine for the USB device library. - * @param Delay: Delay in ms - * @retval None - */ -void USBD_LL_Delay (uint32_t Delay) -{ - HAL_Delay (Delay); -} - -/** - * @brief 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; -} - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : Target/usbd_conf.c + * @version : v1.0_Cube + * @brief : This file implements the board support package for the USB device library + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2021 STMicroelectronics. + * All rights reserved.

+ * + * 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_def.h" +#include "usbd_core.h" + +/* USER CODE BEGIN Includes */ +#include "usbd_composite.h" +#if (STM32F1_DEVICE) /** for STM32F1 or similar */ +#include "usb.h" +#else +// #include "usb_otg.h" +#include +#endif +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ + +/* USER CODE BEGIN PV */ +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE END PV */ +PCD_HandleTypeDef *hpcd_USB_OTG_PTR; +void Error_Handler (void); + +/* External functions --------------------------------------------------------*/ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* USER CODE BEGIN PFP */ +/* Private function prototypes -----------------------------------------------*/ +USBD_StatusTypeDef USBD_Get_USB_Status (HAL_StatusTypeDef hal_status); +HAL_StatusTypeDef HAL_PCDEx_SetTxFiFoInBytes (PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size); +HAL_StatusTypeDef HAL_PCDEx_SetRxFiFoInBytes (PCD_HandleTypeDef *hpcd, uint16_t size); +/* USER CODE END PFP */ + +/* Private functions ---------------------------------------------------------*/ + +/* USER CODE BEGIN 1 */ +#if(!STM32F1_DEVICE) +HAL_StatusTypeDef HAL_PCDEx_SetTxFiFoInBytes (PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size) +{ + return HAL_PCDEx_SetTxFiFo (hpcd, fifo, (size / 4)); +} + +HAL_StatusTypeDef HAL_PCDEx_SetRxFiFoInBytes (PCD_HandleTypeDef *hpcd, uint16_t size) +{ + return HAL_PCDEx_SetRxFiFo (hpcd, (size / 4)); +} +#endif +/* USER CODE END 1 */ + +/******************************************************************************* + LL Driver Callbacks (PCD -> USB Device Library) + *******************************************************************************/ +/* MSP Init */ + +__weak void HAL_PCD_MspInit (PCD_HandleTypeDef *pcdHandle) +{ + /* @see usb_otg.c or usb.c for (STM32F1 or similar) generated by cube **/ +} + +__weak void HAL_PCD_MspDeInit (PCD_HandleTypeDef *pcdHandle) +{ + /* @see usb_otg.c or usb.c for (STM32F1 or similar) generated by cube **/ +} + +/** + * @brief Setup stage callback + * @param hpcd: PCD handle + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_SetupStageCallback (PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_SetupStage ((USBD_HandleTypeDef*) hpcd->pData, (uint8_t*) hpcd->Setup); +} + +/** + * @brief Data Out stage callback. + * @param hpcd: PCD handle + * @param epnum: Endpoint number + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +#else +void HAL_PCD_DataOutStageCallback (PCD_HandleTypeDef *hpcd, uint8_t epnum) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_DataOutStage ((USBD_HandleTypeDef*) hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff); +} + +/** + * @brief Data In stage callback. + * @param hpcd: PCD handle + * @param epnum: Endpoint number + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +#else +void HAL_PCD_DataInStageCallback (PCD_HandleTypeDef *hpcd, uint8_t epnum) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_DataInStage ((USBD_HandleTypeDef*) hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff); +} + +/** + * @brief SOF callback. + * @param hpcd: PCD handle + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_SOFCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_SOFCallback (PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_SOF ((USBD_HandleTypeDef*) hpcd->pData); +} + +/** + * @brief Reset callback. + * @param hpcd: PCD handle + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_ResetCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_ResetCallback (PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_SpeedTypeDef speed = USBD_SPEED_FULL; + + if (hpcd->Init.speed == PCD_SPEED_FULL) + { + speed = USBD_SPEED_FULL; + } +#if(!STM32F1_DEVICE) + else if (hpcd->Init.speed == PCD_SPEED_HIGH) + { + speed = USBD_SPEED_HIGH; + } +#endif + else + { + Error_Handler (); + } + /* Set Speed. */ + USBD_LL_SetSpeed ((USBD_HandleTypeDef*) hpcd->pData, speed); + + /* Reset Device. */ + USBD_LL_Reset ((USBD_HandleTypeDef*) hpcd->pData); +} + +/** + * @brief 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 + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_SuspendCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_SuspendCallback (PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + /* Inform USB library that core enters in suspend Mode. */ + USBD_LL_Suspend ((USBD_HandleTypeDef*) hpcd->pData); +#if (!STM32F1_DEVICE) + __HAL_PCD_GATE_PHYCLOCK(hpcd); + /* Enter in STOP mode. */ + /* USER CODE BEGIN 2 */ + 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)); + } +#endif + /* USER CODE END 2 */ +} + +/** + * @brief 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 + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_ResumeCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_ResumeCallback (PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + /* USER CODE BEGIN 3 */ + + /* USER CODE END 3 */ + USBD_LL_Resume ((USBD_HandleTypeDef*) hpcd->pData); +} + +/** + * @brief ISOOUTIncomplete callback. + * @param hpcd: PCD handle + * @param epnum: Endpoint number + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_ISOOUTIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +#else +void HAL_PCD_ISOOUTIncompleteCallback (PCD_HandleTypeDef *hpcd, uint8_t epnum) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_IsoOUTIncomplete ((USBD_HandleTypeDef*) hpcd->pData, epnum); +} + +/** + * @brief ISOINIncomplete callback. + * @param hpcd: PCD handle + * @param epnum: Endpoint number + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_ISOINIncompleteCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +#else +void HAL_PCD_ISOINIncompleteCallback (PCD_HandleTypeDef *hpcd, uint8_t epnum) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_IsoINIncomplete ((USBD_HandleTypeDef*) hpcd->pData, epnum); +} + +/** + * @brief Connect callback. + * @param hpcd: PCD handle + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_ConnectCallback (PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_DevConnected ((USBD_HandleTypeDef*) hpcd->pData); +} + +/** + * @brief Disconnect callback. + * @param hpcd: PCD handle + * @retval None + */ +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) +static void PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) +#else +void HAL_PCD_DisconnectCallback (PCD_HandleTypeDef *hpcd) +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ +{ + USBD_LL_DevDisconnected ((USBD_HandleTypeDef*) hpcd->pData); +} + +/******************************************************************************* + LL Driver Interface (USB Device Library --> PCD) + *******************************************************************************/ + +/** + * @brief Initializes the low level portion of the device driver. + * @param pdev: Device handle + * @retval USBD status + */ +USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev) +{ +#if (USBD_USE_HS == 1) + /** HIGH SPEED USB */ + hpcd_USB_OTG_PTR = &hpcd_USB_OTG_HS; + + if (pdev->id == DEVICE_HS) + { + /* Link the driver to the stack. */ + hpcd_USB_OTG_PTR->pData = pdev; + pdev->pData = hpcd_USB_OTG_PTR; + + /* @see HAL_PCD_Init() usb_otg.c generated by cube **/ + + HAL_PCDEx_SetRxFiFoInBytes(hpcd_USB_OTG_PTR, 1024); + + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, 0, 64); // EP0 IN + +#if (USBD_USE_CDC_RNDIS == 1) + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CDC_RNDIS_IN_EP & 0x7F), 128); + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CDC_RNDIS_CMD_EP & 0x7F), 64); +#endif +#if (USBD_USE_CDC_ECM == 1) + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CDC_ECM_IN_EP & 0x7F), 128); + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CDC_ECM_CMD_EP & 0x7F), 64); +#endif +#if (USBD_USE_HID_MOUSE == 1) + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (HID_MOUSE_IN_EP & 0x7F), 64); +#endif +#if (USBD_USE_HID_KEYBOARD == 1) + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (HID_KEYBOARD_IN_EP & 0x7F), 64); +#endif +#if (USBD_USE_HID_CUSTOM == 1) + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CUSTOM_HID_IN_EP & 0x7F), 64); +#endif +#if (USBD_USE_UAC_MIC == 1) + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (AUDIO_MIC_EP & 0x7F), 128); +#endif +#if (USBD_USE_UAC_SPKR == 1) +#endif +#if (USBD_USE_UVC == 1) + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (UVC_IN_EP & 0x7F), 128); +#endif +#if (USBD_USE_MSC == 1) + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (MSC_IN_EP & 0x7F), 128); +#endif +#if (USBD_USE_DFU == 1) +#endif +#if (USBD_USE_PRNTR == 1) + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (PRNT_IN_EP & 0x7F), 128); +#endif +#if (USBD_USE_CDC_ACM == 1) + for (uint8_t i = 0; i < USBD_CDC_ACM_COUNT; i++) + { + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CDC_IN_EP[i] & 0x7F), 128); + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CDC_CMD_EP[i] & 0x7F), 64); + } +#endif + } +#else + /**FULL SPEED USB */ +#if (STM32F1_DEVICE) /** for STM32F1 or similar */ + hpcd_USB_OTG_PTR = &hpcd_USB_FS; /** hpcd_USB_FS or hpcd_USB_OTG_FS*/ +#else + hpcd_USB_OTG_PTR = &hpcd_USB_OTG_FS; /** hpcd_USB_FS or hpcd_USB_OTG_FS*/ +#endif + + if (pdev->id == DEVICE_FS) + { + /* Link the driver to the stack. */ + hpcd_USB_OTG_PTR->pData = pdev; + pdev->pData = hpcd_USB_OTG_PTR; + + /* @see HAL_PCD_Init() usb_otg.c generated by cube **/ + +#if (STM32F1_DEVICE) + /** Device is F1 or similar or if HAL_PCDEx_PMAConfig() is used by HAL driver */ + uint16_t pma_track = 0x40; /** PMA offset*/ + + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, 0x00, PCD_SNG_BUF, pma_track); + pma_track += 0x40; + + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, 0x80, PCD_SNG_BUF, pma_track); + pma_track += 0x40; + +#if (USBD_USE_CDC_RNDIS == 1) + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CDC_RNDIS_IN_EP, PCD_SNG_BUF, pma_track); + pma_track += 128; + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CDC_RNDIS_OUT_EP, PCD_SNG_BUF, pma_track); + pma_track += 128; + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CDC_RNDIS_CMD_EP, PCD_SNG_BUF, pma_track); + pma_track += 8; +#endif +#if (USBD_USE_CDC_ECM == 1) + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CDC_ECM_IN_EP, PCD_SNG_BUF, pma_track); + pma_track += 48; + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CDC_ECM_OUT_EP, PCD_SNG_BUF, pma_track); + pma_track += 48; + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CDC_ECM_CMD_EP, PCD_SNG_BUF, pma_track); + pma_track += 8; +#endif +#if (USBD_USE_HID_MOUSE == 1) + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, HID_MOUSE_IN_EP, PCD_SNG_BUF, pma_track); + pma_track += 8; +#endif +#if (USBD_USE_HID_KEYBOARD == 1) + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, HID_KEYBOARD_IN_EP, PCD_SNG_BUF, pma_track); + pma_track += 8; +#endif +#if (USBD_USE_HID_CUSTOM == 1) + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CUSTOM_HID_IN_EP, PCD_SNG_BUF, pma_track); + pma_track += 8; + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CUSTOM_HID_OUT_EP, PCD_SNG_BUF, pma_track); + pma_track += 8; +#endif +#if (USBD_USE_UAC_MIC == 1) + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, AUDIO_MIC_EP, PCD_SNG_BUF, pma_track); + pma_track += 128; +#endif +#if (USBD_USE_UAC_SPKR == 1) + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, AUDIO_SPKR_EP, PCD_SNG_BUF, pma_track); + pma_track += 128; +#endif +#if (USBD_USE_UVC == 1) + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, UVC_IN_EP, PCD_SNG_BUF, pma_track); + pma_track += 128; +#endif +#if (USBD_USE_MSC == 1) + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, MSC_IN_EP, PCD_SNG_BUF, pma_track); + pma_track += 128; + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, MSC_OUT_EP, PCD_SNG_BUF, pma_track); + pma_track += 128; +#endif +#if (USBD_USE_DFU == 1) +#endif +#if (USBD_USE_PRNTR == 1) + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, PRNT_IN_EP, PCD_SNG_BUF, pma_track); + pma_track += 128; + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, PRNT_OUT_EP, PCD_SNG_BUF, pma_track); + pma_track += 128; +#endif +#if (USBD_USE_CDC_ACM == 1) + for (uint8_t i = 0; i < USBD_CDC_ACM_COUNT; i++) + { + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CDC_IN_EP[i], PCD_SNG_BUF, pma_track); + pma_track += 48; + + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CDC_OUT_EP[i], PCD_SNG_BUF, pma_track); + pma_track += 48; + + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef *)pdev->pData, CDC_CMD_EP[i], PCD_SNG_BUF, pma_track); + pma_track += 8; + } +#endif +#else /** if HAL_PCDEx_SetRxFiFo() is used by HAL driver */ + + HAL_PCDEx_SetRxFiFoInBytes (hpcd_USB_OTG_PTR, 512); // ALL OUT EP Buffer + + HAL_PCDEx_SetTxFiFoInBytes (hpcd_USB_OTG_PTR, 0, 64); // EP0 IN + +#if (USBD_USE_CDC_RNDIS == 1) + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CDC_RNDIS_IN_EP & 0x7F), 128); + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CDC_RNDIS_CMD_EP & 0x7F), 64); +#endif + +#if (USBD_USE_CDC_ECM == 1) + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CDC_ECM_IN_EP & 0x7F), 128); + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CDC_ECM_CMD_EP & 0x7F), 64); +#endif +#if (USBD_USE_HID_MOUSE == 1) + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (HID_MOUSE_IN_EP & 0x7F), 64); +#endif +#if (USBD_USE_HID_KEYBOARD == 1) + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (HID_KEYBOARD_IN_EP & 0x7F), 64); +#endif +#if (USBD_USE_HID_CUSTOM == 1) + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (CUSTOM_HID_IN_EP & 0x7F), 64); +#endif +#if (USBD_USE_UAC_MIC == 1) + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (AUDIO_MIC_EP & 0x7F), 128); +#endif +#if (USBD_USE_UAC_SPKR == 1) +#endif +#if (USBD_USE_UVC == 1) + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (UVC_IN_EP & 0x7F), 128); +#endif +#if (USBD_USE_MSC == 1) + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (MSC_IN_EP & 0x7F), 128); +#endif +#if (USBD_USE_DFU == 1) +#endif +#if (USBD_USE_PRNTR == 1) + HAL_PCDEx_SetTxFiFoInBytes(hpcd_USB_OTG_PTR, (PRNT_IN_EP & 0x7F), 128); +#endif +#if (USBD_USE_CDC_ACM == 1) + for (uint8_t i = 0; i < USBD_CDC_ACM_COUNT; i++) + { + HAL_PCDEx_SetTxFiFoInBytes (hpcd_USB_OTG_PTR, (CDC_IN_EP[i] & 0x7F), 128); + HAL_PCDEx_SetTxFiFoInBytes (hpcd_USB_OTG_PTR, (CDC_CMD_EP[i] & 0x7F), 64); + } +#endif +#endif + } +#endif + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + /* Register USB PCD CallBacks */ + HAL_PCD_RegisterCallback(hpcd_USB_OTG_PTR, HAL_PCD_SOF_CB_ID, PCD_SOFCallback); + HAL_PCD_RegisterCallback(hpcd_USB_OTG_PTR, HAL_PCD_SETUPSTAGE_CB_ID, PCD_SetupStageCallback); + HAL_PCD_RegisterCallback(hpcd_USB_OTG_PTR, HAL_PCD_RESET_CB_ID, PCD_ResetCallback); + HAL_PCD_RegisterCallback(hpcd_USB_OTG_PTR, HAL_PCD_SUSPEND_CB_ID, PCD_SuspendCallback); + HAL_PCD_RegisterCallback(hpcd_USB_OTG_PTR, HAL_PCD_RESUME_CB_ID, PCD_ResumeCallback); + HAL_PCD_RegisterCallback(hpcd_USB_OTG_PTR, HAL_PCD_CONNECT_CB_ID, PCD_ConnectCallback); + HAL_PCD_RegisterCallback(hpcd_USB_OTG_PTR, HAL_PCD_DISCONNECT_CB_ID, PCD_DisconnectCallback); + + HAL_PCD_RegisterDataOutStageCallback(hpcd_USB_OTG_PTR, PCD_DataOutStageCallback); + HAL_PCD_RegisterDataInStageCallback(hpcd_USB_OTG_PTR, PCD_DataInStageCallback); + HAL_PCD_RegisterIsoOutIncpltCallback(hpcd_USB_OTG_PTR, PCD_ISOOUTIncompleteCallback); + HAL_PCD_RegisterIsoInIncpltCallback(hpcd_USB_OTG_PTR, PCD_ISOINIncompleteCallback); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ + return USBD_OK; +} + +/** + * @brief 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; +} + +/** + * @brief 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; +} + +/** + * @brief 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; +} + +/** + * @brief 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; +} + +/** + * @brief 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; +} + +/** + * @brief 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; +} + +/** + * @brief 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; +} + +/** + * @brief 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; + } +} + +/** + * @brief 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; +} + +// NOTE! is used instead of the Cube generated ST file that does not check maxpacket +HAL_StatusTypeDef Faux_HAL_PCD_EP_Transmit (PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len) +{ + PCD_EPTypeDef *ep; + + ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK]; + + /*setup and start the Xfer */ + ep->xfer_buff = pBuf; + ep->xfer_len = len; + ep->xfer_count = 0U; + ep->is_in = 1U; + ep->num = ep_addr & EP_ADDR_MSK; + if (ep->maxpacket == 0) + return HAL_ERROR; // NOTE This prevents transmitting if buffers aren't initialized. + + if (hpcd->Init.dma_enable == 1U) + { + ep->dma_addr = (uint32_t) pBuf; + } + + (void) USB_EPStartXfer (hpcd->Instance, ep, (uint8_t) hpcd->Init.dma_enable); + + return HAL_OK; +} + +/** + * @brief 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 = Faux_HAL_PCD_EP_Transmit (pdev->pData, ep_addr, pbuf, size); + + usb_status = USBD_Get_USB_Status (hal_status); + + return usb_status; +} + +/** + * @brief 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; +} + +/** + * @brief 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); +} + +/** + * @brief Delays routine for the USB device library. + * @param Delay: Delay in ms + * @retval None + */ +void USBD_LL_Delay (uint32_t Delay) +{ + HAL_Delay (Delay); +} + +/** + * @brief 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; +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/USB_AL94/usbd_conf.h b/common/USB_AL94/usbd_conf.h new file mode 100644 index 0000000..4cacbf7 --- /dev/null +++ b/common/USB_AL94/usbd_conf.h @@ -0,0 +1,106 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : usbd_conf.h + * @version : v1.0_Cube + * @brief : Header for usbd_conf.c file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2021 STMicroelectronics. + * All rights reserved.

+ * + * 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 + * + ****************************************************************************** + */ + +#ifndef __USBD_CONF__H__ +#define __USBD_CONF__H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "main.h" +#include +#include +#include + +/*---------- -----------*/ +#define USBD_MAX_NUM_INTERFACES 15U +/*---------- -----------*/ +#define USBD_MAX_NUM_CONFIGURATION 1U +/*---------- -----------*/ +#define USBD_MAX_STR_DESC_SIZ 512U +/*---------- -----------*/ +#define USBD_SUPPORT_USER_STRING_DESC 1U +/*---------- -----------*/ +#define USBD_DEBUG_LEVEL 0U +/*---------- -----------*/ +#define USBD_LPM_ENABLED 0U +/*---------- -----------*/ +#define USBD_SELF_POWERED 1U +/*---------- -----------*/ + +/****************************************/ +/* #define for FS and HS identification */ +#define DEVICE_FS 0 +#define DEVICE_HS 1 + +/* Memory management macros */ + +/** Alias for memory allocation. */ +#define USBD_malloc malloc + +/** Alias for memory release. */ +#define USBD_free 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 + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_CONF__H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/USB_AL94/usbd_core.c b/common/USB_AL94/usbd_core.c new file mode 100644 index 0000000..c3defa9 --- /dev/null +++ b/common/USB_AL94/usbd_core.c @@ -0,0 +1,517 @@ +/** + ****************************************************************************** + * @file usbd_core.c + * @author MCD Application Team + * @brief This file provides all the USBD core functions. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * 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 + * + ****************************************************************************** + */ + +#include "usbd_core.h" + +/** + * @brief USBD_Init + * Initializes the device stack and load the class driver + * @param pdev: device instance + * @param pdesc: Descriptor structure address + * @param id: Low level core index + * @retval None + */ +USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef * pdev, USBD_DescriptorsTypeDef * pdesc, uint8_t id) +{ + USBD_StatusTypeDef ret; + + /* Check whether the USB Host handle is valid */ + if (pdev == NULL) { +#if (USBD_DEBUG_LEVEL > 1U) + USBD_ErrLog("Invalid Device handle"); +#endif + return USBD_FAIL; + } + + /* Unlink previous class resources */ + pdev->pClass = NULL; + pdev->pConfDesc = NULL; + + /* Assign USBD Descriptors */ + if (pdesc != NULL) { pdev->pDesc = pdesc; } + + /* Set Device initial State */ + pdev->dev_state = USBD_STATE_DEFAULT; + pdev->id = id; + + /* Initialize low level driver */ + ret = USBD_LL_Init(pdev); + + return ret; +} + +/** + * @brief USBD_DeInit + * Re-Initialize the device library + * @param pdev: device instance + * @retval status: status + */ +USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef * pdev) +{ + USBD_StatusTypeDef ret; + + /* Disconnect the USB Device */ + (void) USBD_LL_Stop(pdev); + + /* Set Default State */ + pdev->dev_state = USBD_STATE_DEFAULT; + + /* Free Class Resources */ + if (pdev->pClass != NULL) { + pdev->pClass->DeInit(pdev, (uint8_t) pdev->dev_config); + pdev->pClass = NULL; + } + + /* Free Device descriptors resources */ + pdev->pDesc = NULL; + pdev->pConfDesc = NULL; + + /* DeInitialize low level driver */ + ret = USBD_LL_DeInit(pdev); + + return ret; +} + +/** + * @brief USBD_RegisterClass + * Link class driver to Device Core. + * @param pDevice : Device Handle + * @param pclass: Class handle + * @retval USBD Status + */ +USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef * pdev, USBD_ClassTypeDef * pclass) +{ + uint16_t len = 0U; + + if (pclass == NULL) { +#if (USBD_DEBUG_LEVEL > 1U) + USBD_ErrLog("Invalid Class handle"); +#endif + return USBD_FAIL; + } + + /* link the class to the USB Device handle */ + pdev->pClass = pclass; + + /* Get Device Configuration Descriptor */ + if (pdev->dev_speed == USBD_SPEED_HIGH) { + if (pdev->pClass->GetHSConfigDescriptor != NULL) { + pdev->pConfDesc = (void *) pdev->pClass->GetHSConfigDescriptor(&len); + } + } else if (pdev->pClass->GetFSConfigDescriptor != NULL) { + pdev->pConfDesc = (void *) pdev->pClass->GetFSConfigDescriptor(&len); + } + + return USBD_OK; +} + +/** + * @brief USBD_Start + * Start the USB Device Core. + * @param pdev: Device Handle + * @retval USBD Status + */ +USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef * pdev) +{ + /* Start the low level driver */ + return USBD_LL_Start(pdev); +} + +/** + * @brief USBD_Stop + * Stop the USB Device Core. + * @param pdev: Device Handle + * @retval USBD Status + */ +USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef * pdev) +{ + /* Disconnect USB Device */ + (void) USBD_LL_Stop(pdev); + + /* Free Class Resources */ + if (pdev->pClass != NULL) { (void) pdev->pClass->DeInit(pdev, (uint8_t) pdev->dev_config); } + + return USBD_OK; +} + +/** + * @brief USBD_RunTestMode + * Launch test mode process + * @param pdev: device instance + * @retval status + */ +USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef * pdev) +{ + /* Prevent unused argument compilation warning */ + UNUSED(pdev); + + return USBD_OK; +} + +/** + * @brief USBD_SetClassConfig + * Configure device and start the interface + * @param pdev: device instance + * @param cfgidx: configuration index + * @retval status + */ + +USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef * pdev, uint8_t cfgidx) +{ + USBD_StatusTypeDef ret = USBD_FAIL; + + if (pdev->pClass != NULL) { + /* Set configuration and Start the Class */ + ret = (USBD_StatusTypeDef) pdev->pClass->Init(pdev, cfgidx); + } + + return ret; +} + +/** + * @brief USBD_ClrClassConfig + * Clear current configuration + * @param pdev: device instance + * @param cfgidx: configuration index + * @retval status: USBD_StatusTypeDef + */ +USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef * pdev, uint8_t cfgidx) +{ + /* Clear configuration and De-initialize the Class process */ + if (pdev->pClass != NULL) { pdev->pClass->DeInit(pdev, cfgidx); } + + return USBD_OK; +} + +/** + * @brief USBD_LL_SetupStage + * Handle the setup stage + * @param pdev: device instance + * @retval status + */ +USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef * pdev, uint8_t * psetup) +{ + USBD_StatusTypeDef ret; + + USBD_ParseSetupRequest(&pdev->request, psetup); + + pdev->ep0_state = USBD_EP0_SETUP; + + pdev->ep0_data_len = pdev->request.wLength; + + switch (pdev->request.bmRequest & 0x1FU) { + case USB_REQ_RECIPIENT_DEVICE: + ret = USBD_StdDevReq(pdev, &pdev->request); + break; + + case USB_REQ_RECIPIENT_INTERFACE: + ret = USBD_StdItfReq(pdev, &pdev->request); + break; + + case USB_REQ_RECIPIENT_ENDPOINT: + ret = USBD_StdEPReq(pdev, &pdev->request); + break; + + default: + ret = USBD_LL_StallEP(pdev, (pdev->request.bmRequest & 0x80U)); + break; + } + + return ret; +} + +/** + * @brief USBD_LL_DataOutStage + * Handle data OUT stage + * @param pdev: device instance + * @param epnum: endpoint index + * @param pdata: data pointer + * @retval status + */ +USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef * pdev, uint8_t epnum, uint8_t * pdata) +{ + USBD_EndpointTypeDef * pep; + USBD_StatusTypeDef ret; + + if (epnum == 0U) { + pep = &pdev->ep_out[0]; + + if (pdev->ep0_state == USBD_EP0_DATA_OUT) { + if (pep->rem_length > pep->maxpacket) { + pep->rem_length -= pep->maxpacket; + + (void) USBD_CtlContinueRx(pdev, pdata, MIN(pep->rem_length, pep->maxpacket)); + } else { + if (pdev->dev_state == USBD_STATE_CONFIGURED) { + if (pdev->pClass->EP0_RxReady != NULL) { pdev->pClass->EP0_RxReady(pdev); } + } + + (void) USBD_CtlSendStatus(pdev); + } + } else { +#if 0 + if (pdev->ep0_state == USBD_EP0_STATUS_OUT) + { + /* + * STATUS PHASE completed, update ep0_state to idle + */ + pdev->ep0_state = USBD_EP0_IDLE; + (void)USBD_LL_StallEP(pdev, 0U); + } +#endif + } + } else { + if (pdev->dev_state == USBD_STATE_CONFIGURED) { + if (pdev->pClass->DataOut != NULL) { + ret = (USBD_StatusTypeDef) pdev->pClass->DataOut(pdev, epnum); + + if (ret != USBD_OK) { return ret; } + } + } + } + + return USBD_OK; +} + +/** + * @brief USBD_LL_DataInStage + * Handle data in stage + * @param pdev: device instance + * @param epnum: endpoint index + * @retval status + */ +USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef * pdev, uint8_t epnum, uint8_t * pdata) +{ + USBD_EndpointTypeDef * pep; + USBD_StatusTypeDef ret; + + if (epnum == 0U) { + pep = &pdev->ep_in[0]; + + if (pdev->ep0_state == USBD_EP0_DATA_IN) { + if (pep->rem_length > pep->maxpacket) { + pep->rem_length -= pep->maxpacket; + + (void) USBD_CtlContinueSendData(pdev, pdata, pep->rem_length); + + /* Prepare endpoint for premature end of transfer */ + (void) USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); + } else { + /* last packet is MPS multiple, so send ZLP packet */ + if ((pep->maxpacket == pep->rem_length) && (pep->total_length >= pep->maxpacket) + && (pep->total_length < pdev->ep0_data_len)) { + (void) USBD_CtlContinueSendData(pdev, NULL, 0U); + pdev->ep0_data_len = 0U; + + /* Prepare endpoint for premature end of transfer */ + (void) USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); + } else { + if (pdev->dev_state == USBD_STATE_CONFIGURED) { + if (pdev->pClass->EP0_TxSent != NULL) { pdev->pClass->EP0_TxSent(pdev); } + } + (void) USBD_LL_StallEP(pdev, 0x80U); + (void) USBD_CtlReceiveStatus(pdev); + } + } + } else { +#if 0 + if ((pdev->ep0_state == USBD_EP0_STATUS_IN) || + (pdev->ep0_state == USBD_EP0_IDLE)) + { + (void)USBD_LL_StallEP(pdev, 0x80U); + } +#endif + } + + if (pdev->dev_test_mode == 1U) { + (void) USBD_RunTestMode(pdev); + pdev->dev_test_mode = 0U; + } + } else { + if (pdev->dev_state == USBD_STATE_CONFIGURED) { + if (pdev->pClass->DataIn != NULL) { + ret = (USBD_StatusTypeDef) pdev->pClass->DataIn(pdev, epnum); + + if (ret != USBD_OK) { return ret; } + } + } + } + + return USBD_OK; +} + +/** + * @brief USBD_LL_Reset + * Handle Reset event + * @param pdev: device instance + * @retval status + */ + +USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef * pdev) +{ + /* Upon Reset call user call back */ + pdev->dev_state = USBD_STATE_DEFAULT; + pdev->ep0_state = USBD_EP0_IDLE; + pdev->dev_config = 0U; + pdev->dev_remote_wakeup = 0U; + + if (pdev->pClass == NULL) { return USBD_FAIL; } + + if (pdev->pClass->DeInit != NULL) { (void) pdev->pClass->DeInit(pdev, (uint8_t) pdev->dev_config); } + + /* Open EP0 OUT */ + (void) USBD_LL_OpenEP(pdev, 0x00U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); + pdev->ep_out[0x00U & 0xFU].is_used = 1U; + + pdev->ep_out[0].maxpacket = USB_MAX_EP0_SIZE; + + /* Open EP0 IN */ + (void) USBD_LL_OpenEP(pdev, 0x80U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); + pdev->ep_in[0x80U & 0xFU].is_used = 1U; + + pdev->ep_in[0].maxpacket = USB_MAX_EP0_SIZE; + + return USBD_OK; +} + +/** + * @brief USBD_LL_SetSpeed + * Handle Reset event + * @param pdev: device instance + * @retval status + */ +USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef * pdev, USBD_SpeedTypeDef speed) +{ + pdev->dev_speed = speed; + + return USBD_OK; +} + +/** + * @brief USBD_LL_Suspend + * Handle Suspend event + * @param pdev: device instance + * @retval status + */ + +USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef * pdev) +{ + pdev->dev_old_state = pdev->dev_state; + pdev->dev_state = USBD_STATE_SUSPENDED; + + return USBD_OK; +} + +/** + * @brief USBD_LL_Resume + * Handle Resume event + * @param pdev: device instance + * @retval status + */ + +USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef * pdev) +{ + if (pdev->dev_state == USBD_STATE_SUSPENDED) { pdev->dev_state = pdev->dev_old_state; } + + return USBD_OK; +} + +/** + * @brief USBD_LL_SOF + * Handle SOF event + * @param pdev: device instance + * @retval status + */ + +USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef * pdev) +{ + if (pdev->pClass == NULL) { return USBD_FAIL; } + + if (pdev->dev_state == USBD_STATE_CONFIGURED) { + if (pdev->pClass->SOF != NULL) { (void) pdev->pClass->SOF(pdev); } + } + + return USBD_OK; +} + +/** + * @brief USBD_LL_IsoINIncomplete + * Handle iso in incomplete event + * @param pdev: device instance + * @retval status + */ +USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef * pdev, uint8_t epnum) +{ + if (pdev->pClass == NULL) { return USBD_FAIL; } + + if (pdev->dev_state == USBD_STATE_CONFIGURED) { + if (pdev->pClass->IsoINIncomplete != NULL) { (void) pdev->pClass->IsoINIncomplete(pdev, epnum); } + } + + return USBD_OK; +} + +/** + * @brief USBD_LL_IsoOUTIncomplete + * Handle iso out incomplete event + * @param pdev: device instance + * @retval status + */ +USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef * pdev, uint8_t epnum) +{ + if (pdev->pClass == NULL) { return USBD_FAIL; } + + if (pdev->dev_state == USBD_STATE_CONFIGURED) { + if (pdev->pClass->IsoOUTIncomplete != NULL) { (void) pdev->pClass->IsoOUTIncomplete(pdev, epnum); } + } + + return USBD_OK; +} + +/** + * @brief USBD_LL_DevConnected + * Handle device connection event + * @param pdev: device instance + * @retval status + */ +USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef * pdev) +{ + /* Prevent unused argument compilation warning */ + UNUSED(pdev); + + return USBD_OK; +} + +/** + * @brief USBD_LL_DevDisconnected + * Handle device disconnection event + * @param pdev: device instance + * @retval status + */ +USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef * pdev) +{ + /* Free Class Resources */ + pdev->dev_state = USBD_STATE_DEFAULT; + + if (pdev->pClass != NULL) { (void) pdev->pClass->DeInit(pdev, (uint8_t) pdev->dev_config); } + + return USBD_OK; +} + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/USB_AL94/usbd_core.h b/common/USB_AL94/usbd_core.h new file mode 100644 index 0000000..e46d6ed --- /dev/null +++ b/common/USB_AL94/usbd_core.h @@ -0,0 +1,93 @@ +/** + ****************************************************************************** + * @file usbd_core.h + * @author MCD Application Team + * @brief Header file for usbd_core.c file + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * 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 + * + ****************************************************************************** + */ + +#ifndef __USBD_CORE_H +#define __USBD_CORE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "usbd_conf.h" +#include "usbd_ctlreq.h" +#include "usbd_def.h" +#include "usbd_ioreq.h" + +#ifndef USBD_DEBUG_LEVEL +#define USBD_DEBUG_LEVEL 0U +#endif /* USBD_DEBUG_LEVEL */ + +#define USBD_SOF USBD_LL_SOF + +USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef * pdev, USBD_DescriptorsTypeDef * pdesc, uint8_t id); +USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef * pdev); +USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef * pdev); +USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef * pdev); +USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef * pdev, USBD_ClassTypeDef * pclass); + +USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef * pdev); +USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef * pdev, uint8_t cfgidx); +USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef * pdev, uint8_t cfgidx); + +USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef * pdev, uint8_t * psetup); +USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef * pdev, uint8_t epnum, uint8_t * pdata); +USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef * pdev, uint8_t epnum, uint8_t * pdata); + +USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef * pdev); +USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef * pdev, USBD_SpeedTypeDef speed); +USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef * pdev); +USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef * pdev); + +USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef * pdev); +USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef * pdev, uint8_t epnum); +USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef * pdev, uint8_t epnum); + +USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef * pdev); +USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef * pdev); + +/* USBD Low Level Driver */ +USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef * pdev); +USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef * pdev); +USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef * pdev); +USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef * pdev); + +USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef * pdev, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_mps); + +USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef * pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef * pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef * pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef * pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef * pdev, uint8_t dev_addr); + +USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef * pdev, uint8_t ep_addr, uint8_t * pbuf, uint32_t size); + +USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef * pdev, uint8_t ep_addr, uint8_t * pbuf, uint32_t size); + +uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef * pdev, uint8_t ep_addr); +uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef * pdev, uint8_t ep_addr); + +void USBD_LL_Delay(uint32_t Delay); + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_CORE_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/USB_AL94/usbd_ctlreq.c b/common/USB_AL94/usbd_ctlreq.c new file mode 100644 index 0000000..ead1742 --- /dev/null +++ b/common/USB_AL94/usbd_ctlreq.c @@ -0,0 +1,801 @@ +/** + ****************************************************************************** + * @file usbd_req.c + * @author MCD Application Team + * @brief This file provides the standard USB requests following chapter 9. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * 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 + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_ctlreq.h" +#include "usbd_ioreq.h" + +/** @addtogroup STM32_USBD_STATE_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_REQ + * @brief USB standard requests module + * @{ + */ + +/** @defgroup USBD_REQ_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_REQ_Private_Defines + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_REQ_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_REQ_Private_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_REQ_Private_FunctionPrototypes + * @{ + */ +static void USBD_GetDescriptor(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req); +static void USBD_SetAddress(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req); +static USBD_StatusTypeDef USBD_SetConfig(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req); +static void USBD_GetConfig(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req); +static void USBD_GetStatus(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req); +static void USBD_SetFeature(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req); +static void USBD_ClrFeature(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req); +static uint8_t USBD_GetLen(uint8_t * buf); + +/** + * @} + */ + +/** @defgroup USBD_REQ_Private_Functions + * @{ + */ + +/** + * @brief USBD_StdDevReq + * Handle standard usb device requests + * @param pdev: device instance + * @param req: usb request + * @retval status + */ +USBD_StatusTypeDef USBD_StdDevReq(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req) +{ + USBD_StatusTypeDef ret = USBD_OK; + + switch (req->bmRequest & USB_REQ_TYPE_MASK) { + case USB_REQ_TYPE_CLASS: + case USB_REQ_TYPE_VENDOR: + ret = (USBD_StatusTypeDef) pdev->pClass->Setup(pdev, req); + break; + + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) { + case USB_REQ_GET_DESCRIPTOR: + USBD_GetDescriptor(pdev, req); + break; + + case USB_REQ_SET_ADDRESS: + USBD_SetAddress(pdev, req); + break; + + case USB_REQ_SET_CONFIGURATION: + ret = USBD_SetConfig(pdev, req); + break; + + case USB_REQ_GET_CONFIGURATION: + USBD_GetConfig(pdev, req); + break; + + case USB_REQ_GET_STATUS: + USBD_GetStatus(pdev, req); + break; + + case USB_REQ_SET_FEATURE: + USBD_SetFeature(pdev, req); + break; + + case USB_REQ_CLEAR_FEATURE: + USBD_ClrFeature(pdev, req); + break; + + default: + USBD_CtlError(pdev, req); + break; + } + break; + + default: + USBD_CtlError(pdev, req); + break; + } + + return ret; +} + +/** + * @brief USBD_StdItfReq + * Handle standard usb interface requests + * @param pdev: device instance + * @param req: usb request + * @retval status + */ +USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req) +{ + USBD_StatusTypeDef ret = USBD_OK; + + switch (req->bmRequest & USB_REQ_TYPE_MASK) { + case USB_REQ_TYPE_CLASS: + case USB_REQ_TYPE_VENDOR: + case USB_REQ_TYPE_STANDARD: + switch (pdev->dev_state) { + case USBD_STATE_DEFAULT: + case USBD_STATE_ADDRESSED: + case USBD_STATE_CONFIGURED: + + if (LOBYTE(req->wIndex) <= USBD_MAX_NUM_INTERFACES) { + ret = (USBD_StatusTypeDef) pdev->pClass->Setup(pdev, req); + + if ((req->wLength == 0U) && (ret == USBD_OK)) { (void) USBD_CtlSendStatus(pdev); } + } else { + USBD_CtlError(pdev, req); + } + break; + + default: + USBD_CtlError(pdev, req); + break; + } + break; + + default: + USBD_CtlError(pdev, req); + break; + } + + return ret; +} + +/** + * @brief USBD_StdEPReq + * Handle standard usb endpoint requests + * @param pdev: device instance + * @param req: usb request + * @retval status + */ +USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req) +{ + USBD_EndpointTypeDef * pep; + uint8_t ep_addr; + USBD_StatusTypeDef ret = USBD_OK; + ep_addr = LOBYTE(req->wIndex); + + switch (req->bmRequest & USB_REQ_TYPE_MASK) { + case USB_REQ_TYPE_CLASS: + case USB_REQ_TYPE_VENDOR: + ret = (USBD_StatusTypeDef) pdev->pClass->Setup(pdev, req); + break; + + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) { + case USB_REQ_SET_FEATURE: + switch (pdev->dev_state) { + case USBD_STATE_ADDRESSED: + if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) { + (void) USBD_LL_StallEP(pdev, ep_addr); + (void) USBD_LL_StallEP(pdev, 0x80U); + } else { + USBD_CtlError(pdev, req); + } + break; + + case USBD_STATE_CONFIGURED: + if (req->wValue == USB_FEATURE_EP_HALT) { + if ((ep_addr != 0x00U) && (ep_addr != 0x80U) && (req->wLength == 0x00U)) { + (void) USBD_LL_StallEP(pdev, ep_addr); + } + } + (void) USBD_CtlSendStatus(pdev); + + break; + + default: + USBD_CtlError(pdev, req); + break; + } + break; + + case USB_REQ_CLEAR_FEATURE: + + switch (pdev->dev_state) { + case USBD_STATE_ADDRESSED: + if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) { + (void) USBD_LL_StallEP(pdev, ep_addr); + (void) USBD_LL_StallEP(pdev, 0x80U); + } else { + USBD_CtlError(pdev, req); + } + break; + + case USBD_STATE_CONFIGURED: + if (req->wValue == USB_FEATURE_EP_HALT) { + if ((ep_addr & 0x7FU) != 0x00U) { (void) USBD_LL_ClearStallEP(pdev, ep_addr); } + (void) USBD_CtlSendStatus(pdev); + ret = (USBD_StatusTypeDef) pdev->pClass->Setup(pdev, req); + } + break; + + default: + USBD_CtlError(pdev, req); + break; + } + break; + + case USB_REQ_GET_STATUS: + switch (pdev->dev_state) { + case USBD_STATE_ADDRESSED: + if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) { + USBD_CtlError(pdev, req); + break; + } + pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU] : &pdev->ep_out[ep_addr & 0x7FU]; + + pep->status = 0x0000U; + + (void) USBD_CtlSendData(pdev, (uint8_t *) &pep->status, 2U); + break; + + case USBD_STATE_CONFIGURED: + if ((ep_addr & 0x80U) == 0x80U) { + if (pdev->ep_in[ep_addr & 0xFU].is_used == 0U) { + USBD_CtlError(pdev, req); + break; + } + } else { + if (pdev->ep_out[ep_addr & 0xFU].is_used == 0U) { + USBD_CtlError(pdev, req); + break; + } + } + + pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU] : &pdev->ep_out[ep_addr & 0x7FU]; + + if ((ep_addr == 0x00U) || (ep_addr == 0x80U)) { + pep->status = 0x0000U; + } else if (USBD_LL_IsStallEP(pdev, ep_addr) != 0U) { + pep->status = 0x0001U; + } else { + pep->status = 0x0000U; + } + + (void) USBD_CtlSendData(pdev, (uint8_t *) &pep->status, 2U); + break; + + default: + USBD_CtlError(pdev, req); + break; + } + break; + + default: + USBD_CtlError(pdev, req); + break; + } + break; + + default: + USBD_CtlError(pdev, req); + break; + } + + return ret; +} + +/** + * @brief USBD_GetDescriptor + * Handle Get Descriptor requests + * @param pdev: device instance + * @param req: usb request + * @retval status + */ +static void USBD_GetDescriptor(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req) +{ + uint16_t len = 0U; + uint8_t * pbuf = NULL; + uint8_t err = 0U; + + switch (req->wValue >> 8) { +#if ((USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1U)) + case USB_DESC_TYPE_BOS: + if (pdev->pDesc->GetBOSDescriptor != NULL) { + pbuf = pdev->pDesc->GetBOSDescriptor(pdev->dev_speed, &len); + } else { + USBD_CtlError(pdev, req); + err++; + } + break; +#endif + case USB_DESC_TYPE_DEVICE: + pbuf = pdev->pDesc->GetDeviceDescriptor(pdev->dev_speed, &len); + break; + + case USB_DESC_TYPE_CONFIGURATION: + if (pdev->dev_speed == USBD_SPEED_HIGH) { + pbuf = pdev->pClass->GetHSConfigDescriptor(&len); + pbuf[1] = USB_DESC_TYPE_CONFIGURATION; + } else { + pbuf = pdev->pClass->GetFSConfigDescriptor(&len); + pbuf[1] = USB_DESC_TYPE_CONFIGURATION; + } + break; + + case USB_DESC_TYPE_STRING: + switch ((uint8_t) (req->wValue)) { + case USBD_IDX_LANGID_STR: + if (pdev->pDesc->GetLangIDStrDescriptor != NULL) { + pbuf = pdev->pDesc->GetLangIDStrDescriptor(pdev->dev_speed, &len); + } else { + USBD_CtlError(pdev, req); + err++; + } + break; + + case USBD_IDX_MFC_STR: + if (pdev->pDesc->GetManufacturerStrDescriptor != NULL) { + pbuf = pdev->pDesc->GetManufacturerStrDescriptor(pdev->dev_speed, &len); + } else { + USBD_CtlError(pdev, req); + err++; + } + break; + + case USBD_IDX_PRODUCT_STR: + if (pdev->pDesc->GetProductStrDescriptor != NULL) { + pbuf = pdev->pDesc->GetProductStrDescriptor(pdev->dev_speed, &len); + } else { + USBD_CtlError(pdev, req); + err++; + } + break; + + case USBD_IDX_SERIAL_STR: + if (pdev->pDesc->GetSerialStrDescriptor != NULL) { + pbuf = pdev->pDesc->GetSerialStrDescriptor(pdev->dev_speed, &len); + } else { + USBD_CtlError(pdev, req); + err++; + } + break; + + case USBD_IDX_CONFIG_STR: + if (pdev->pDesc->GetConfigurationStrDescriptor != NULL) { + pbuf = pdev->pDesc->GetConfigurationStrDescriptor(pdev->dev_speed, &len); + } else { + USBD_CtlError(pdev, req); + err++; + } + break; + + case USBD_IDX_INTERFACE_STR: + if (pdev->pDesc->GetInterfaceStrDescriptor != NULL) { + pbuf = pdev->pDesc->GetInterfaceStrDescriptor(pdev->dev_speed, &len); + } else { + USBD_CtlError(pdev, req); + err++; + } + break; + + default: +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) + if (pdev->pClass->GetUsrStrDescriptor != NULL) { + pbuf = pdev->pClass->GetUsrStrDescriptor(pdev, (req->wValue), &len); + } else { + USBD_CtlError(pdev, req); + err++; + } +#endif + +#if (USBD_CLASS_USER_STRING_DESC == 1U) + if (pdev->pDesc->GetUserStrDescriptor != NULL) { + pbuf = pdev->pDesc->GetUserStrDescriptor(pdev->dev_speed, (req->wValue), &len); + } else { + USBD_CtlError(pdev, req); + err++; + } +#endif + +#if ((USBD_CLASS_USER_STRING_DESC == 0U) && (USBD_SUPPORT_USER_STRING_DESC == 0U)) + USBD_CtlError(pdev, req); + err++; +#endif + break; + } + break; + + case USB_DESC_TYPE_DEVICE_QUALIFIER: + if (pdev->dev_speed == USBD_SPEED_HIGH) { + pbuf = pdev->pClass->GetDeviceQualifierDescriptor(&len); + } else { + USBD_CtlError(pdev, req); + err++; + } + break; + + case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION: + if (pdev->dev_speed == USBD_SPEED_HIGH) { + pbuf = pdev->pClass->GetOtherSpeedConfigDescriptor(&len); + pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION; + } else { + USBD_CtlError(pdev, req); + err++; + } + break; + + default: + USBD_CtlError(pdev, req); + err++; + break; + } + + if (err != 0U) { return; } + + if (req->wLength != 0U) { + if (len != 0U) { + len = MIN(len, req->wLength); + (void) USBD_CtlSendData(pdev, pbuf, len); + } else { + USBD_CtlError(pdev, req); + } + } else { + (void) USBD_CtlSendStatus(pdev); + } +} + +/** + * @brief USBD_SetAddress + * Set device address + * @param pdev: device instance + * @param req: usb request + * @retval status + */ +static void USBD_SetAddress(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req) +{ + uint8_t dev_addr; + + if ((req->wIndex == 0U) && (req->wLength == 0U) && (req->wValue < 128U)) { + dev_addr = (uint8_t) (req->wValue) & 0x7FU; + + if (pdev->dev_state == USBD_STATE_CONFIGURED) { + USBD_CtlError(pdev, req); + } else { + pdev->dev_address = dev_addr; + (void) USBD_LL_SetUSBAddress(pdev, dev_addr); + (void) USBD_CtlSendStatus(pdev); + + if (dev_addr != 0U) { + pdev->dev_state = USBD_STATE_ADDRESSED; + } else { + pdev->dev_state = USBD_STATE_DEFAULT; + } + } + } else { + USBD_CtlError(pdev, req); + } +} + +/** + * @brief USBD_SetConfig + * Handle Set device configuration request + * @param pdev: device instance + * @param req: usb request + * @retval status + */ +static USBD_StatusTypeDef USBD_SetConfig(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req) +{ + USBD_StatusTypeDef ret = USBD_OK; + static uint8_t cfgidx; + + cfgidx = (uint8_t) (req->wValue); + + if (cfgidx > USBD_MAX_NUM_CONFIGURATION) { + USBD_CtlError(pdev, req); + return USBD_FAIL; + } + + switch (pdev->dev_state) { + case USBD_STATE_ADDRESSED: + if (cfgidx != 0U) { + pdev->dev_config = cfgidx; + + ret = USBD_SetClassConfig(pdev, cfgidx); + + if (ret != USBD_OK) { + USBD_CtlError(pdev, req); + } else { + (void) USBD_CtlSendStatus(pdev); + pdev->dev_state = USBD_STATE_CONFIGURED; + } + } else { + (void) USBD_CtlSendStatus(pdev); + } + break; + + case USBD_STATE_CONFIGURED: + if (cfgidx == 0U) { + pdev->dev_state = USBD_STATE_ADDRESSED; + pdev->dev_config = cfgidx; + (void) USBD_ClrClassConfig(pdev, cfgidx); + (void) USBD_CtlSendStatus(pdev); + } else if (cfgidx != pdev->dev_config) { + /* Clear old configuration */ + (void) USBD_ClrClassConfig(pdev, (uint8_t) pdev->dev_config); + + /* set new configuration */ + pdev->dev_config = cfgidx; + + ret = USBD_SetClassConfig(pdev, cfgidx); + + if (ret != USBD_OK) { + USBD_CtlError(pdev, req); + (void) USBD_ClrClassConfig(pdev, (uint8_t) pdev->dev_config); + pdev->dev_state = USBD_STATE_ADDRESSED; + } else { + (void) USBD_CtlSendStatus(pdev); + } + } else { + (void) USBD_CtlSendStatus(pdev); + } + break; + + default: + USBD_CtlError(pdev, req); + (void) USBD_ClrClassConfig(pdev, cfgidx); + ret = USBD_FAIL; + break; + } + + return ret; +} + +/** + * @brief USBD_GetConfig + * Handle Get device configuration request + * @param pdev: device instance + * @param req: usb request + * @retval status + */ +static void USBD_GetConfig(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req) +{ + if (req->wLength != 1U) { + USBD_CtlError(pdev, req); + } else { + switch (pdev->dev_state) { + case USBD_STATE_DEFAULT: + case USBD_STATE_ADDRESSED: + pdev->dev_default_config = 0U; + (void) USBD_CtlSendData(pdev, (uint8_t *) &pdev->dev_default_config, 1U); + break; + + case USBD_STATE_CONFIGURED: + (void) USBD_CtlSendData(pdev, (uint8_t *) &pdev->dev_config, 1U); + break; + + default: + USBD_CtlError(pdev, req); + break; + } + } +} + +/** + * @brief USBD_GetStatus + * Handle Get Status request + * @param pdev: device instance + * @param req: usb request + * @retval status + */ +static void USBD_GetStatus(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req) +{ + switch (pdev->dev_state) { + case USBD_STATE_DEFAULT: + case USBD_STATE_ADDRESSED: + case USBD_STATE_CONFIGURED: + if (req->wLength != 0x2U) { + USBD_CtlError(pdev, req); + break; + } + +#if (USBD_SELF_POWERED == 1U) + pdev->dev_config_status = USB_CONFIG_SELF_POWERED; +#else + pdev->dev_config_status = 0U; +#endif + + if (pdev->dev_remote_wakeup != 0U) { pdev->dev_config_status |= USB_CONFIG_REMOTE_WAKEUP; } + + (void) USBD_CtlSendData(pdev, (uint8_t *) &pdev->dev_config_status, 2U); + break; + + default: + USBD_CtlError(pdev, req); + break; + } +} + +/** + * @brief USBD_SetFeature + * Handle Set device feature request + * @param pdev: device instance + * @param req: usb request + * @retval status + */ +static void USBD_SetFeature(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req) +{ + if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) { + pdev->dev_remote_wakeup = 1U; + (void) USBD_CtlSendStatus(pdev); + } +} + +/** + * @brief USBD_ClrFeature + * Handle clear device feature request + * @param pdev: device instance + * @param req: usb request + * @retval status + */ +static void USBD_ClrFeature(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req) +{ + switch (pdev->dev_state) { + case USBD_STATE_DEFAULT: + case USBD_STATE_ADDRESSED: + case USBD_STATE_CONFIGURED: + if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) { + pdev->dev_remote_wakeup = 0U; + (void) USBD_CtlSendStatus(pdev); + } + break; + + default: + USBD_CtlError(pdev, req); + break; + } +} + +/** + * @brief USBD_ParseSetupRequest + * Copy buffer into setup structure + * @param pdev: device instance + * @param req: usb request + * @retval None + */ +void USBD_ParseSetupRequest(USBD_SetupReqTypedef * req, uint8_t * pdata) +{ + uint8_t * pbuff = pdata; + + req->bmRequest = *(uint8_t *) (pbuff); + + pbuff++; + req->bRequest = *(uint8_t *) (pbuff); + + pbuff++; + req->wValue = SWAPBYTE(pbuff); + + pbuff++; + pbuff++; + req->wIndex = SWAPBYTE(pbuff); + + pbuff++; + pbuff++; + req->wLength = SWAPBYTE(pbuff); +} + +/** + * @brief USBD_CtlError + * Handle USB low level Error + * @param pdev: device instance + * @param req: usb request + * @retval None + */ +void USBD_CtlError(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req) +{ + UNUSED(req); + + (void) USBD_LL_StallEP(pdev, 0x80U); + (void) USBD_LL_StallEP(pdev, 0U); +} + +/** + * @brief USBD_GetString + * Convert Ascii string into unicode one + * @param desc : descriptor buffer + * @param unicode : Formatted string buffer (unicode) + * @param len : descriptor length + * @retval None + */ +void USBD_GetString(uint8_t * desc, uint8_t * unicode, uint16_t * len) +{ + uint8_t idx = 0U; + uint8_t * pdesc; + + if (desc == NULL) { return; } + + pdesc = desc; + *len = ((uint16_t) USBD_GetLen(pdesc) * 2U) + 2U; + + unicode[idx] = *(uint8_t *) len; + idx++; + unicode[idx] = USB_DESC_TYPE_STRING; + idx++; + + while (*pdesc != (uint8_t) '\0') { + unicode[idx] = *pdesc; + pdesc++; + idx++; + + unicode[idx] = 0U; + idx++; + } +} + +/** + * @brief USBD_GetLen + * return the string length + * @param buf : pointer to the ascii string buffer + * @retval string length + */ +static uint8_t USBD_GetLen(uint8_t * buf) +{ + uint8_t len = 0U; + uint8_t * pbuff = buf; + + while (*pbuff != (uint8_t) '\0') { + len++; + pbuff++; + } + + return len; +} +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/USB_AL94/usbd_ctlreq.h b/common/USB_AL94/usbd_ctlreq.h new file mode 100644 index 0000000..0f37743 --- /dev/null +++ b/common/USB_AL94/usbd_ctlreq.h @@ -0,0 +1,43 @@ +/** + ****************************************************************************** + * @file usbd_req.h + * @author MCD Application Team + * @brief Header file for the usbd_req.c file + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * 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 + * + ****************************************************************************** + */ + +#ifndef __USB_REQUEST_H +#define __USB_REQUEST_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "usbd_def.h" + +USBD_StatusTypeDef USBD_StdDevReq(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req); +USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req); +USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req); + +void USBD_CtlError(USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req); +void USBD_ParseSetupRequest(USBD_SetupReqTypedef * req, uint8_t * pdata); +void USBD_GetString(uint8_t * desc, uint8_t * unicode, uint16_t * len); + +#ifdef __cplusplus +} +#endif + +#endif /* __USB_REQUEST_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/USB_AL94/usbd_def.h b/common/USB_AL94/usbd_def.h new file mode 100644 index 0000000..d95f827 --- /dev/null +++ b/common/USB_AL94/usbd_def.h @@ -0,0 +1,385 @@ +/** + ****************************************************************************** + * @file usbd_def.h + * @author MCD Application Team + * @brief General defines for the usb device library + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * 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 + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_DEF_H +#define __USBD_DEF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_conf.h" + +#ifndef NULL +#define NULL 0U +#endif /* NULL */ + +#ifndef USBD_MAX_NUM_INTERFACES +#define USBD_MAX_NUM_INTERFACES 1U +#endif /* USBD_MAX_NUM_CONFIGURATION */ + +#ifndef USBD_MAX_NUM_CONFIGURATION +#define USBD_MAX_NUM_CONFIGURATION 1U +#endif /* USBD_MAX_NUM_CONFIGURATION */ + +#ifndef USBD_LPM_ENABLED +#define USBD_LPM_ENABLED 0U +#endif /* USBD_LPM_ENABLED */ + +#ifndef USBD_SELF_POWERED +#define USBD_SELF_POWERED 1U +#endif /*USBD_SELF_POWERED */ + +#ifndef USBD_MAX_POWER +#define USBD_MAX_POWER 0x32U /* 100 mA */ +#endif /* USBD_MAX_POWER */ + +#ifndef USBD_SUPPORT_USER_STRING_DESC +#define USBD_SUPPORT_USER_STRING_DESC 0U +#endif /* USBD_SUPPORT_USER_STRING_DESC */ + +#ifndef USBD_CLASS_USER_STRING_DESC +#define USBD_CLASS_USER_STRING_DESC 0U +#endif /* USBD_CLASS_USER_STRING_DESC */ + +#define USB_LEN_DEV_QUALIFIER_DESC 0x0AU +#define USB_LEN_DEV_DESC 0x12U +#define USB_LEN_CFG_DESC 0x09U +#define USB_LEN_IF_DESC 0x09U +#define USB_LEN_EP_DESC 0x07U +#define USB_LEN_OTG_DESC 0x03U +#define USB_LEN_LANGID_STR_DESC 0x04U +#define USB_LEN_OTHER_SPEED_DESC_SIZ 0x09U + +#define USBD_IDX_LANGID_STR 0x00U +#define USBD_IDX_MFC_STR 0x01U +#define USBD_IDX_PRODUCT_STR 0x02U +#define USBD_IDX_SERIAL_STR 0x03U +#define USBD_IDX_CONFIG_STR 0x04U +#define USBD_IDX_INTERFACE_STR 0x05U + +#define USB_REQ_TYPE_STANDARD 0x00U +#define USB_REQ_TYPE_CLASS 0x20U +#define USB_REQ_TYPE_VENDOR 0x40U +#define USB_REQ_TYPE_MASK 0x60U + +#define USB_REQ_RECIPIENT_DEVICE 0x00U +#define USB_REQ_RECIPIENT_INTERFACE 0x01U +#define USB_REQ_RECIPIENT_ENDPOINT 0x02U +#define USB_REQ_RECIPIENT_MASK 0x03U + +#define USB_REQ_GET_STATUS 0x00U +#define USB_REQ_CLEAR_FEATURE 0x01U +#define USB_REQ_SET_FEATURE 0x03U +#define USB_REQ_SET_ADDRESS 0x05U +#define USB_REQ_GET_DESCRIPTOR 0x06U +#define USB_REQ_SET_DESCRIPTOR 0x07U +#define USB_REQ_GET_CONFIGURATION 0x08U +#define USB_REQ_SET_CONFIGURATION 0x09U +#define USB_REQ_GET_INTERFACE 0x0AU +#define USB_REQ_SET_INTERFACE 0x0BU +#define USB_REQ_SYNCH_FRAME 0x0CU + +#define USB_DESC_TYPE_DEVICE 0x01U +#define USB_DESC_TYPE_CONFIGURATION 0x02U +#define USB_DESC_TYPE_STRING 0x03U +#define USB_DESC_TYPE_INTERFACE 0x04U +#define USB_DESC_TYPE_ENDPOINT 0x05U +#define USB_DESC_TYPE_DEVICE_QUALIFIER 0x06U +#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 0x07U +#define USB_DESC_TYPE_IAD 0x0BU +#define USB_DESC_TYPE_BOS 0x0FU + +#define USB_CONFIG_REMOTE_WAKEUP 0x02U +#define USB_CONFIG_SELF_POWERED 0x01U + +#define USB_FEATURE_EP_HALT 0x00U +#define USB_FEATURE_REMOTE_WAKEUP 0x01U +#define USB_FEATURE_TEST_MODE 0x02U + +#define USB_DEVICE_CAPABITY_TYPE 0x10U + +#define USB_CONF_DESC_SIZE 0x09U +#define USB_IF_DESC_SIZE 0x09U +#define USB_EP_DESC_SIZE 0x07U +#define USB_IAD_DESC_SIZE 0x08U + +#define USB_HS_MAX_PACKET_SIZE 512U +#define USB_FS_MAX_PACKET_SIZE 64U +#define USB_MAX_EP0_SIZE 64U + +/* Device Status */ +#define USBD_STATE_DEFAULT 0x01U +#define USBD_STATE_ADDRESSED 0x02U +#define USBD_STATE_CONFIGURED 0x03U +#define USBD_STATE_SUSPENDED 0x04U + +/* EP0 State */ +#define USBD_EP0_IDLE 0x00U +#define USBD_EP0_SETUP 0x01U +#define USBD_EP0_DATA_IN 0x02U +#define USBD_EP0_DATA_OUT 0x03U +#define USBD_EP0_STATUS_IN 0x04U +#define USBD_EP0_STATUS_OUT 0x05U +#define USBD_EP0_STALL 0x06U + +#define USBD_EP_TYPE_CTRL 0x00U +#define USBD_EP_TYPE_ISOC 0x01U +#define USBD_EP_TYPE_BULK 0x02U +#define USBD_EP_TYPE_INTR 0x03U + +typedef struct usb_setup_req +{ + uint8_t bmRequest; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; +} USBD_SetupReqTypedef; + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t wTotalLength; + uint8_t bNumInterfaces; + uint8_t bConfigurationValue; + uint8_t iConfiguration; + uint8_t bmAttributes; + uint8_t bMaxPower; +} USBD_ConfigDescTypedef; + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t wTotalLength; + uint8_t bNumDeviceCaps; +} USBD_BosDescTypedef; + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint16_t wMaxPacketSize; + uint8_t bInterval; +} USBD_EpDescTypedef; + +struct _USBD_HandleTypeDef; + +typedef struct _Device_cb +{ + uint8_t (*Init)(struct _USBD_HandleTypeDef * pdev, uint8_t cfgidx); + uint8_t (*DeInit)(struct _USBD_HandleTypeDef * pdev, uint8_t cfgidx); + /* Control Endpoints*/ + uint8_t (*Setup)(struct _USBD_HandleTypeDef * pdev, USBD_SetupReqTypedef * req); + uint8_t (*EP0_TxSent)(struct _USBD_HandleTypeDef * pdev); + uint8_t (*EP0_RxReady)(struct _USBD_HandleTypeDef * pdev); + /* Class Specific Endpoints*/ + uint8_t (*DataIn)(struct _USBD_HandleTypeDef * pdev, uint8_t epnum); + uint8_t (*DataOut)(struct _USBD_HandleTypeDef * pdev, uint8_t epnum); + uint8_t (*SOF)(struct _USBD_HandleTypeDef * pdev); + uint8_t (*IsoINIncomplete)(struct _USBD_HandleTypeDef * pdev, uint8_t epnum); + uint8_t (*IsoOUTIncomplete)(struct _USBD_HandleTypeDef * pdev, uint8_t epnum); + + uint8_t * (*GetHSConfigDescriptor)(uint16_t * length); + uint8_t * (*GetFSConfigDescriptor)(uint16_t * length); + uint8_t * (*GetOtherSpeedConfigDescriptor)(uint16_t * length); + uint8_t * (*GetDeviceQualifierDescriptor)(uint16_t * length); +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) + uint8_t * (*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef * pdev, uint8_t index, uint16_t * length); +#endif + +} USBD_ClassTypeDef; + +/* Following USB Device Speed */ +typedef enum +{ + USBD_SPEED_HIGH = 0U, + USBD_SPEED_FULL = 1U, + USBD_SPEED_LOW = 2U, +} USBD_SpeedTypeDef; + +/* Following USB Device status */ +typedef enum +{ + USBD_OK = 0U, + USBD_BUSY, + USBD_EMEM, + USBD_FAIL, +} USBD_StatusTypeDef; + +/* USB Device descriptors structure */ +typedef struct +{ + uint8_t * (*GetDeviceDescriptor)(USBD_SpeedTypeDef speed, uint16_t * length); + uint8_t * (*GetLangIDStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t * length); + uint8_t * (*GetManufacturerStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t * length); + uint8_t * (*GetProductStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t * length); + uint8_t * (*GetSerialStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t * length); + uint8_t * (*GetConfigurationStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t * length); + uint8_t * (*GetInterfaceStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t * length); +#if (USBD_CLASS_USER_STRING_DESC == 1) + uint8_t * (*GetUserStrDescriptor)(USBD_SpeedTypeDef speed, uint8_t idx, uint16_t * length); +#endif +#if ((USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1)) + uint8_t * (*GetBOSDescriptor)(USBD_SpeedTypeDef speed, uint16_t * length); +#endif +} USBD_DescriptorsTypeDef; + +/* USB Device handle structure */ +typedef struct +{ + uint32_t status; + uint32_t total_length; + uint32_t rem_length; + uint32_t maxpacket; + uint16_t is_used; + uint16_t bInterval; +} USBD_EndpointTypeDef; + +/* USB Device handle structure */ +typedef struct _USBD_HandleTypeDef +{ + uint8_t id; + uint32_t dev_config; + uint32_t dev_default_config; + uint32_t dev_config_status; + USBD_SpeedTypeDef dev_speed; + USBD_EndpointTypeDef ep_in[16]; + USBD_EndpointTypeDef ep_out[16]; + __IO uint32_t ep0_state; + uint32_t ep0_data_len; + __IO uint8_t dev_state; + __IO uint8_t dev_old_state; + uint8_t dev_address; + uint8_t dev_connection_status; + uint8_t dev_test_mode; + uint32_t dev_remote_wakeup; + uint8_t ConfIdx; + + USBD_SetupReqTypedef request; + USBD_DescriptorsTypeDef * pDesc; + USBD_ClassTypeDef * pClass; + void * pUserData_CDC_ACM; + void * pClassData_CDC_RNDIS; + void * pUserData_CDC_RNDIS; + void * pClassData_CDC_ECM; + void * pUserData_CDC_ECM; + void * pClassData_HID_Mouse; + void * pClassData_HID_Keyboard; + void * pClassData_HID_Custom; + void * pUserData_HID_Custom; + void * pClassData_UAC_MIC; + void * pUserData_UAC_MIC; + void * pClassData_UAC_SPKR; + void * pUserData_UAC_SPKR; + void * pClassData_UVC; + void * pUserData_UVC; + void * pClassData_MSC; + void * pUserData_MSC; + void * pClassData_DFU; + void * pUserData_DFU; + void * pClassData_PRNTR; + void * pUserData_PRNTR; + void * pData; + void * pBosDesc; + void * pConfDesc; +} USBD_HandleTypeDef; + +/** + * @} + */ + +/** @defgroup USBD_DEF_Exported_Macros + * @{ + */ +__STATIC_INLINE uint16_t SWAPBYTE(uint8_t * addr) +{ + uint16_t _SwapVal, _Byte1, _Byte2; + uint8_t * _pbuff = addr; + + _Byte1 = *(uint8_t *) _pbuff; + _pbuff++; + _Byte2 = *(uint8_t *) _pbuff; + + _SwapVal = (_Byte2 << 8) | _Byte1; + + return _SwapVal; +} + +#ifndef LOBYTE +#define LOBYTE(x) ((uint8_t) ((x) &0x00FFU)) +#endif + +#ifndef HIBYTE +#define HIBYTE(x) ((uint8_t) (((x) &0xFF00U) >> 8U)) +#endif + +#ifndef MIN +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +#ifndef MAX +#define MAX(a, b) (((a) > (b)) ? (a) : (b)) +#endif + +#if defined(__GNUC__) +#ifndef __weak +#define __weak __attribute__((weak)) +#endif /* __weak */ +#ifndef __packed +#define __packed __attribute__((__packed__)) +#endif /* __packed */ +#endif /* __GNUC__ */ + +/* In HS mode and when the DMA is used, all variables and data structures dealing + with the DMA during the transaction process should be 4-bytes aligned */ + +#if defined(__GNUC__) && !defined(__CC_ARM) /* GNU Compiler */ +#ifndef __ALIGN_END +#define __ALIGN_END __attribute__((aligned(4U))) +#endif /* __ALIGN_END */ +#ifndef __ALIGN_BEGIN +#define __ALIGN_BEGIN +#endif /* __ALIGN_BEGIN */ +#else +#ifndef __ALIGN_END +#define __ALIGN_END +#endif /* __ALIGN_END */ +#ifndef __ALIGN_BEGIN +#if defined(__CC_ARM) /* ARM Compiler */ +#define __ALIGN_BEGIN __align(4U) +#elif defined(__ICCARM__) /* IAR Compiler */ +#define __ALIGN_BEGIN +#endif /* __CC_ARM */ +#endif /* __ALIGN_BEGIN */ +#endif /* __GNUC__ */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_DEF_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/USB_AL94/usbd_desc.c b/common/USB_AL94/usbd_desc.c new file mode 100644 index 0000000..221bac0 --- /dev/null +++ b/common/USB_AL94/usbd_desc.c @@ -0,0 +1,270 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : App/usbd_desc.c + * @version : v1.0_Cube + * @brief : This file implements the USB device descriptors. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2021 STMicroelectronics. + * All rights reserved.

+ * + * 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 + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_desc.h" +#include "usbd_conf.h" +#include "usbd_core.h" + +#include "usbd_composite.h" + +#define USBD_LANGID_STRING 1033 +#define USBD_CONFIGURATION_STRING "CONFIGURATION 0" +#define USBD_INTERFACE_STRING "COMPOSITE INTERFACE" + +//#define USBD_VID 1155 +//#define USBD_MANUFACTURER_STRING "STMicroelectronics" +//#define USBD_PID 21156 +//#define USBD_PRODUCT_STRING "STM32 COMPOSITE DEVICE" + +#define USBD_VID 0x0000 // Vendor ID for Open Source Projects is "Generic" 0x1209 +#define USBD_MANUFACTURER_STRING "VarmintWorks" +#define USBD_PID 0x0001 // pid.codes Test PID for VID=0x1209 +#define USBD_PRODUCT_STRING "rosflight controller" + +static void Get_SerialNum(void); +static void IntToUnicode(uint32_t value, uint8_t * pbuf, uint8_t len); + +uint8_t * USBD_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t * length); +uint8_t * USBD_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t * length); +uint8_t * USBD_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t * length); +uint8_t * USBD_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t * length); +uint8_t * USBD_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t * length); +uint8_t * USBD_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t * length); +uint8_t * USBD_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t * length); + +USBD_DescriptorsTypeDef USBD_Desc = { + USBD_DeviceDescriptor, USBD_LangIDStrDescriptor, USBD_ManufacturerStrDescriptor, USBD_ProductStrDescriptor, + USBD_SerialStrDescriptor, USBD_ConfigStrDescriptor, USBD_InterfaceStrDescriptor}; + +/** USB standard device descriptor. */ +__ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = { + 0x12, /*bLength */ + USB_DESC_TYPE_DEVICE, /*bDescriptorType*/ + 0x00, /*bcdUSB */ + 0x02, + 0xEF, /*bDeviceClass*/ + 0x02, /*bDeviceSubClass*/ + 0x01, /*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 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, +}; + +/** + * @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_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t * length) +{ + UNUSED(speed); + *length = sizeof(USBD_DeviceDesc); + return USBD_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_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_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t * length) +{ + if (speed == 0) { + USBD_GetString((uint8_t *) USBD_PRODUCT_STRING, USBD_StrDesc, length); + } else { + USBD_GetString((uint8_t *) USBD_PRODUCT_STRING, 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_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_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_SerialStrDescriptor */ + + /* USER CODE END USBD_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_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; +} + +/** + * @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_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; +} + +#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_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t * length) +{ + UNUSED(speed); + *length = sizeof(USBD_BOSDesc); + return (uint8_t *) USBD_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****/ diff --git a/common/USB_AL94/usbd_desc.h b/common/USB_AL94/usbd_desc.h new file mode 100644 index 0000000..4806e5b --- /dev/null +++ b/common/USB_AL94/usbd_desc.h @@ -0,0 +1,47 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : usbd_desc.c + * @version : v1.0_Cube + * @brief : Header for usbd_conf.c file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2021 STMicroelectronics. + * All rights reserved.

+ * + * 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 + * + ****************************************************************************** + */ + +#ifndef __USBD_DESC__C__ +#define __USBD_DESC__C__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "usbd_def.h" +/** @defgroup USBD_DESC_Exported_Constants USBD_DESC_Exported_Constants + * @brief Constants. + * @{ + */ +#define DEVICE_ID1 (UID_BASE) +#define DEVICE_ID2 (UID_BASE + 0x4) +#define DEVICE_ID3 (UID_BASE + 0x8) + +#define USB_SIZ_STRING_SERIAL 0x1A + +extern USBD_DescriptorsTypeDef USBD_Desc; + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_DESC__C__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/AL94_USB_Composite/Core/Src/usbd_ioreq.c b/common/USB_AL94/usbd_ioreq.c similarity index 50% rename from common/AL94_USB_Composite/Core/Src/usbd_ioreq.c rename to common/USB_AL94/usbd_ioreq.c index 2cb3995..a850996 100644 --- a/common/AL94_USB_Composite/Core/Src/usbd_ioreq.c +++ b/common/USB_AL94/usbd_ioreq.c @@ -1,214 +1,149 @@ -/** - ****************************************************************************** - * @file usbd_ioreq.c - * @author MCD Application Team - * @brief This file provides the IO requests APIs for control endpoints. - ****************************************************************************** - * @attention - * - *

© Copyright (c) 2015 STMicroelectronics. - * All rights reserved.

- * - * 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 - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "usbd_ioreq.h" - -/** @addtogroup STM32_USB_DEVICE_LIBRARY - * @{ - */ - -/** @defgroup USBD_IOREQ - * @brief control I/O requests module - * @{ - */ - -/** @defgroup USBD_IOREQ_Private_TypesDefinitions - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_IOREQ_Private_Defines - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_IOREQ_Private_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_IOREQ_Private_Variables - * @{ - */ - -/** - * @} - */ - -/** @defgroup USBD_IOREQ_Private_FunctionPrototypes - * @{ - */ -/** - * @} - */ - -/** @defgroup USBD_IOREQ_Private_Functions - * @{ - */ - -/** - * @brief USBD_CtlSendData - * send data on the ctl pipe - * @param pdev: device instance - * @param buff: pointer to data buffer - * @param len: length of data to be sent - * @retval status - */ -USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev, uint8_t *pbuf, uint32_t len) -{ - /* Set EP0 State */ - pdev->ep0_state = USBD_EP0_DATA_IN; - pdev->ep_in[0].total_length = len; - -#ifdef USBD_AVOID_PACKET_SPLIT_MPS - pdev->ep_in[0].rem_length = 0U; -#else - pdev->ep_in[0].rem_length = len; -#endif - - /* Start the transfer */ - (void) USBD_LL_Transmit (pdev, 0x00U, pbuf, len); - - return USBD_OK; -} - -/** - * @brief USBD_CtlContinueSendData - * continue sending data on the ctl pipe - * @param pdev: device instance - * @param buff: pointer to data buffer - * @param len: length of data to be sent - * @retval status - */ -USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev, uint8_t *pbuf, uint32_t len) -{ - /* Start the next transfer */ - (void) USBD_LL_Transmit (pdev, 0x00U, pbuf, len); - - return USBD_OK; -} - -/** - * @brief USBD_CtlPrepareRx - * receive data on the ctl pipe - * @param pdev: device instance - * @param buff: pointer to data buffer - * @param len: length of data to be received - * @retval status - */ -USBD_StatusTypeDef USBD_CtlPrepareRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, uint32_t len) -{ - /* Set EP0 State */ - pdev->ep0_state = USBD_EP0_DATA_OUT; - pdev->ep_out[0].total_length = len; - -#ifdef USBD_AVOID_PACKET_SPLIT_MPS - pdev->ep_out[0].rem_length = 0U; -#else - pdev->ep_out[0].rem_length = len; -#endif - - /* Start the transfer */ - (void) USBD_LL_PrepareReceive (pdev, 0U, pbuf, len); - - return USBD_OK; -} - -/** - * @brief USBD_CtlContinueRx - * continue receive data on the ctl pipe - * @param pdev: device instance - * @param buff: pointer to data buffer - * @param len: length of data to be received - * @retval status - */ -USBD_StatusTypeDef USBD_CtlContinueRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, uint32_t len) -{ - (void) USBD_LL_PrepareReceive (pdev, 0U, pbuf, len); - - return USBD_OK; -} - -/** - * @brief USBD_CtlSendStatus - * send zero lzngth packet on the ctl pipe - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev) -{ - /* Set EP0 State */ - pdev->ep0_state = USBD_EP0_STATUS_IN; - - /* Start the transfer */ - (void) USBD_LL_Transmit (pdev, 0x00U, NULL, 0U); - - return USBD_OK; -} - -/** - * @brief USBD_CtlReceiveStatus - * receive zero lzngth packet on the ctl pipe - * @param pdev: device instance - * @retval status - */ -USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev) -{ - /* Set EP0 State */ - pdev->ep0_state = USBD_EP0_STATUS_OUT; - - /* Start the transfer */ - (void) USBD_LL_PrepareReceive (pdev, 0U, NULL, 0U); - - return USBD_OK; -} - -/** - * @brief USBD_GetRxCount - * returns the received data length - * @param pdev: device instance - * @param ep_addr: endpoint address - * @retval Rx Data blength - */ -uint32_t USBD_GetRxCount (USBD_HandleTypeDef *pdev, uint8_t ep_addr) -{ - return USBD_LL_GetRxDataSize (pdev, ep_addr); -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file usbd_ioreq.c + * @author MCD Application Team + * @brief This file provides the IO requests APIs for control endpoints. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * 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 + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_ioreq.h" + +/** + * @brief USBD_CtlSendData + * send data on the ctl pipe + * @param pdev: device instance + * @param buff: pointer to data buffer + * @param len: length of data to be sent + * @retval status + */ +USBD_StatusTypeDef USBD_CtlSendData(USBD_HandleTypeDef * pdev, uint8_t * pbuf, uint32_t len) +{ + /* Set EP0 State */ + pdev->ep0_state = USBD_EP0_DATA_IN; + pdev->ep_in[0].total_length = len; + +#ifdef USBD_AVOID_PACKET_SPLIT_MPS + pdev->ep_in[0].rem_length = 0U; +#else + pdev->ep_in[0].rem_length = len; +#endif + + /* Start the transfer */ + (void) USBD_LL_Transmit(pdev, 0x00U, pbuf, len); + + return USBD_OK; +} + +/** + * @brief USBD_CtlContinueSendData + * continue sending data on the ctl pipe + * @param pdev: device instance + * @param buff: pointer to data buffer + * @param len: length of data to be sent + * @retval status + */ +USBD_StatusTypeDef USBD_CtlContinueSendData(USBD_HandleTypeDef * pdev, uint8_t * pbuf, uint32_t len) +{ + /* Start the next transfer */ + (void) USBD_LL_Transmit(pdev, 0x00U, pbuf, len); + + return USBD_OK; +} + +/** + * @brief USBD_CtlPrepareRx + * receive data on the ctl pipe + * @param pdev: device instance + * @param buff: pointer to data buffer + * @param len: length of data to be received + * @retval status + */ +USBD_StatusTypeDef USBD_CtlPrepareRx(USBD_HandleTypeDef * pdev, uint8_t * pbuf, uint32_t len) +{ + /* Set EP0 State */ + pdev->ep0_state = USBD_EP0_DATA_OUT; + pdev->ep_out[0].total_length = len; + +#ifdef USBD_AVOID_PACKET_SPLIT_MPS + pdev->ep_out[0].rem_length = 0U; +#else + pdev->ep_out[0].rem_length = len; +#endif + + /* Start the transfer */ + (void) USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); + + return USBD_OK; +} + +/** + * @brief USBD_CtlContinueRx + * continue receive data on the ctl pipe + * @param pdev: device instance + * @param buff: pointer to data buffer + * @param len: length of data to be received + * @retval status + */ +USBD_StatusTypeDef USBD_CtlContinueRx(USBD_HandleTypeDef * pdev, uint8_t * pbuf, uint32_t len) +{ + (void) USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); + + return USBD_OK; +} + +/** + * @brief USBD_CtlSendStatus + * send zero lzngth packet on the ctl pipe + * @param pdev: device instance + * @retval status + */ +USBD_StatusTypeDef USBD_CtlSendStatus(USBD_HandleTypeDef * pdev) +{ + /* Set EP0 State */ + pdev->ep0_state = USBD_EP0_STATUS_IN; + + /* Start the transfer */ + (void) USBD_LL_Transmit(pdev, 0x00U, NULL, 0U); + + return USBD_OK; +} + +/** + * @brief USBD_CtlReceiveStatus + * receive zero lzngth packet on the ctl pipe + * @param pdev: device instance + * @retval status + */ +USBD_StatusTypeDef USBD_CtlReceiveStatus(USBD_HandleTypeDef * pdev) +{ + /* Set EP0 State */ + pdev->ep0_state = USBD_EP0_STATUS_OUT; + + /* Start the transfer */ + (void) USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); + + return USBD_OK; +} + +/** + * @brief USBD_GetRxCount + * returns the received data length + * @param pdev: device instance + * @param ep_addr: endpoint address + * @retval Rx Data blength + */ +uint32_t USBD_GetRxCount(USBD_HandleTypeDef * pdev, uint8_t ep_addr) { return USBD_LL_GetRxDataSize(pdev, ep_addr); } + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/common/USB_AL94/usbd_ioreq.h b/common/USB_AL94/usbd_ioreq.h new file mode 100644 index 0000000..cb25d22 --- /dev/null +++ b/common/USB_AL94/usbd_ioreq.h @@ -0,0 +1,49 @@ +/** + ****************************************************************************** + * @file usbd_ioreq.h + * @author MCD Application Team + * @brief Header file for the usbd_ioreq.c file + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2015 STMicroelectronics. + * All rights reserved.

+ * + * 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 + * + ****************************************************************************** + */ + +#ifndef __USBD_IOREQ_H +#define __USBD_IOREQ_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "usbd_core.h" +#include "usbd_def.h" + +USBD_StatusTypeDef USBD_CtlSendData(USBD_HandleTypeDef * pdev, uint8_t * pbuf, uint32_t len); + +USBD_StatusTypeDef USBD_CtlContinueSendData(USBD_HandleTypeDef * pdev, uint8_t * pbuf, uint32_t len); + +USBD_StatusTypeDef USBD_CtlPrepareRx(USBD_HandleTypeDef * pdev, uint8_t * pbuf, uint32_t len); + +USBD_StatusTypeDef USBD_CtlContinueRx(USBD_HandleTypeDef * pdev, uint8_t * pbuf, uint32_t len); + +USBD_StatusTypeDef USBD_CtlSendStatus(USBD_HandleTypeDef * pdev); +USBD_StatusTypeDef USBD_CtlReceiveStatus(USBD_HandleTypeDef * pdev); + +uint32_t USBD_GetRxCount(USBD_HandleTypeDef * pdev, uint8_t ep_addr); + +#ifdef __cplusplus +} +#endif + +#endif /* __USBD_IOREQ_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/