From 20ee676f018914e376a27121c3b8b32e82743f4a Mon Sep 17 00:00:00 2001 From: Mikhail Date: Wed, 21 May 2025 22:44:23 +0300 Subject: [PATCH] day2 --- Class/CDC/Inc/usbd_cdc_if.h | 3 + Class/CDC/Src/usbd_cdc_if.c | 37 +- Core/Inc/usbd_conf.h | 10 +- .../Inc/{usbd_desc_template.h => usbd_desc.h} | 2 +- Core/Src/usbd_conf.c | 321 ++++++++---------- .../Src/{usbd_desc_template.c => usbd_desc.c} | 22 +- 6 files changed, 186 insertions(+), 209 deletions(-) rename Core/Inc/{usbd_desc_template.h => usbd_desc.h} (95%) rename Core/Src/{usbd_desc_template.c => usbd_desc.c} (94%) diff --git a/Class/CDC/Inc/usbd_cdc_if.h b/Class/CDC/Inc/usbd_cdc_if.h index 6a1c0ab..080e913 100644 --- a/Class/CDC/Inc/usbd_cdc_if.h +++ b/Class/CDC/Inc/usbd_cdc_if.h @@ -29,11 +29,14 @@ extern "C" { /* Exported types ------------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/ +#define APP_RX_DATA_SIZE 512 +#define APP_TX_DATA_SIZE 512 extern USBD_CDC_ItfTypeDef USBD_CDC_Template_fops; /* Exported macro ------------------------------------------------------------*/ /* Exported functions ------------------------------------------------------- */ +uint8_t TEMPLATE_Transmit(uint8_t* Buf, uint16_t Len); #ifdef __cplusplus } diff --git a/Class/CDC/Src/usbd_cdc_if.c b/Class/CDC/Src/usbd_cdc_if.c index df16834..8c0567d 100644 --- a/Class/CDC/Src/usbd_cdc_if.c +++ b/Class/CDC/Src/usbd_cdc_if.c @@ -22,7 +22,7 @@ EndBSPDependencies */ /* Includes ------------------------------------------------------------------*/ -#include "usbd_cdc_if_template.h" +#include "usbd_cdc_if.h" /** @addtogroup STM32_USB_DEVICE_LIBRARY * @{ @@ -86,6 +86,14 @@ USBD_CDC_LineCodingTypeDef linecoding = 0x08 /* nb. of bits 8*/ }; +/* Create buffer for reception and transmission */ +/* It's up to user to redefine and/or remove those define */ +/** Received data over USB are stored in this buffer */ +uint8_t UserRxBufferFS[APP_RX_DATA_SIZE]; +/** Data to send over USB CDC are stored in this buffer */ +uint8_t UserTxBufferFS[APP_TX_DATA_SIZE]; +extern USBD_HandleTypeDef hUsbDeviceFS; + /* Private functions ---------------------------------------------------------*/ /** @@ -96,9 +104,8 @@ USBD_CDC_LineCodingTypeDef linecoding = */ static int8_t TEMPLATE_Init(void) { - /* - Add your initialization code here - */ + USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0); + USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS); return (0); } @@ -208,8 +215,28 @@ static int8_t TEMPLATE_Receive(uint8_t *Buf, uint32_t *Len) { UNUSED(Buf); UNUSED(Len); + + if(Buf[0] == '1') + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); + else if(Buf[0] == '0') + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); + + + USBD_CDC_ReceivePacket(&hUsbDeviceFS); + return (USBD_OK); +} - return (0); +uint8_t TEMPLATE_Transmit(uint8_t* Buf, uint16_t Len) +{ + uint8_t result = USBD_OK; + USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData; + if (hcdc->TxState != 0){ + return + USBD_BUSY; + } + USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len); + result = USBD_CDC_TransmitPacket(&hUsbDeviceFS); + return result; } /** diff --git a/Core/Inc/usbd_conf.h b/Core/Inc/usbd_conf.h index 1ff66bc..6f81c9d 100644 --- a/Core/Inc/usbd_conf.h +++ b/Core/Inc/usbd_conf.h @@ -25,7 +25,7 @@ extern "C" { #endif /* Includes ------------------------------------------------------------------*/ -#include "stm32fxxx.h" /* replace 'stm32xxx' with your HAL driver header filename, ex: stm32f4xx.h */ +#include "stm32f0xx_hal.h" /* replace 'stm32xxx' with your HAL driver header filename, ex: stm32f4xx.h */ #include #include #include @@ -47,15 +47,15 @@ extern "C" { #define USBD_MAX_NUM_CONFIGURATION 1U #define USBD_MAX_STR_DESC_SIZ 0x100U #define USBD_SELF_POWERED 1U -#define USBD_DEBUG_LEVEL 2U +#define USBD_DEBUG_LEVEL 0U /* #define USBD_USER_REGISTER_CALLBACK 1U */ /* ECM, RNDIS, DFU Class Config */ -#define USBD_SUPPORT_USER_STRING_DESC 1U +#define USBD_SUPPORT_USER_STRING_DESC 0U /* BillBoard Class Config */ -#define USBD_CLASS_USER_STRING_DESC 1U -#define USBD_CLASS_BOS_ENABLED 1U +#define USBD_CLASS_USER_STRING_DESC 0U +#define USBD_CLASS_BOS_ENABLED 0U #define USB_BB_MAX_NUM_ALT_MODE 0x2U /* MSC Class Config */ diff --git a/Core/Inc/usbd_desc_template.h b/Core/Inc/usbd_desc.h similarity index 95% rename from Core/Inc/usbd_desc_template.h rename to Core/Inc/usbd_desc.h index 7be13ce..3c36197 100644 --- a/Core/Inc/usbd_desc_template.h +++ b/Core/Inc/usbd_desc.h @@ -59,7 +59,7 @@ /* Exported macro ------------------------------------------------------------*/ /* Exported functions ------------------------------------------------------- */ -extern USBD_DescriptorsTypeDef XXX_Desc; /* Replace 'XXX_Desc' with your active USB device class, ex: HID_Desc */ +extern USBD_DescriptorsTypeDef Class_Desc; /* Replace 'XXX_Desc' with your active USB device class, ex: HID_Desc */ #endif /* __USBD_DESC_TEMPLATE_H*/ diff --git a/Core/Src/usbd_conf.c b/Core/Src/usbd_conf.c index 74ff430..9fc2de2 100644 --- a/Core/Src/usbd_conf.c +++ b/Core/Src/usbd_conf.c @@ -19,265 +19,212 @@ */ /* Includes ------------------------------------------------------------------*/ +#include "main.h" #include "usbd_core.h" -#include "usbd_hid.h" /* Include class header file */ +#include "usbd_cdc.h" /* Include class header file */ +//#include "usbd_hid.h" /* Include class header file */ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ +extern PCD_HandleTypeDef hpcd_USB_FS; /* Private function prototypes -----------------------------------------------*/ +static USBD_StatusTypeDef USBD_Get_USB_Status(HAL_StatusTypeDef hal_status); /* Private functions ---------------------------------------------------------*/ -/** - * @brief Initializes the Low Level portion of the Device driver. - * @param pdev: Device handle - * @retval USBD Status - */ +void HAL_PCD_SetupStageCallback(PCD_HandleTypeDef *hpcd) +{ + USBD_LL_SetupStage((USBD_HandleTypeDef*)hpcd->pData, (uint8_t *)hpcd->Setup); +} + +void HAL_PCD_DataOutStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +{ + USBD_LL_DataOutStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->OUT_ep[epnum].xfer_buff); +} + +void HAL_PCD_DataInStageCallback(PCD_HandleTypeDef *hpcd, uint8_t epnum) +{ + USBD_LL_DataInStage((USBD_HandleTypeDef*)hpcd->pData, epnum, hpcd->IN_ep[epnum].xfer_buff); +} + +void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd) +{ + USBD_LL_SOF((USBD_HandleTypeDef*)hpcd->pData); +} + +void HAL_PCD_ResetCallback(PCD_HandleTypeDef *hpcd) +{ + USBD_SpeedTypeDef speed = USBD_SPEED_FULL; + if ( hpcd->Init.speed != PCD_SPEED_FULL) + { + Error_Handler(); + } + /* Set Speed. */ + USBD_LL_SetSpeed((USBD_HandleTypeDef*)hpcd->pData, speed); + /* Reset Device. */ + USBD_LL_Reset((USBD_HandleTypeDef*)hpcd->pData); +} + +void HAL_PCD_ConnectCallback(PCD_HandleTypeDef *hpcd) +{ + USBD_LL_DevConnected((USBD_HandleTypeDef*)hpcd->pData); +} + +void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) +{ + USBD_LL_DevDisconnected((USBD_HandleTypeDef*)hpcd->pData); +} +/* Private functions ---------------------------------------------------------*/ + + USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev) { - UNUSED(pdev); - - return USBD_OK; + pdev->pData = &hpcd_USB_FS; + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 0x40); + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x80); + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , CDC_IN_EP , PCD_SNG_BUF, 0xC0); + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , CDC_OUT_EP , PCD_SNG_BUF, 0x100); + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , CDC_CMD_EP , PCD_SNG_BUF, 0x140); + 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) { - UNUSED(pdev); - - return USBD_OK; + HAL_StatusTypeDef hal_status; + hal_status = HAL_PCD_DeInit(pdev->pData); + return USBD_Get_USB_Status(hal_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) { - UNUSED(pdev); - - return USBD_OK; + HAL_StatusTypeDef hal_status; + hal_status = HAL_PCD_Start(pdev->pData); + return USBD_Get_USB_Status(hal_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) { - UNUSED(pdev); - - return USBD_OK; + HAL_StatusTypeDef hal_status; + hal_status = HAL_PCD_Stop(pdev->pData); + return USBD_Get_USB_Status(hal_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) + uint8_t ep_type, uint16_t ep_mps) { - UNUSED(pdev); - UNUSED(ep_addr); - UNUSED(ep_type); - UNUSED(ep_mps); - - return USBD_OK; + HAL_StatusTypeDef hal_status; + hal_status = HAL_PCD_EP_Open(pdev->pData, ep_addr, ep_mps, ep_type); + return USBD_Get_USB_Status(hal_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) { - UNUSED(pdev); - UNUSED(ep_addr); - - return USBD_OK; + HAL_StatusTypeDef hal_status; + hal_status = HAL_PCD_EP_Close(pdev->pData, ep_addr); + return USBD_Get_USB_Status(hal_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) { - UNUSED(pdev); - UNUSED(ep_addr); - - return USBD_OK; + HAL_StatusTypeDef hal_status; + hal_status = HAL_PCD_EP_Flush(pdev->pData, ep_addr); + return USBD_Get_USB_Status(hal_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) { - UNUSED(pdev); - UNUSED(ep_addr); - - return USBD_OK; + HAL_StatusTypeDef hal_status; + hal_status = HAL_PCD_EP_SetStall(pdev->pData, ep_addr); + return USBD_Get_USB_Status(hal_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) + uint8_t ep_addr) { - UNUSED(pdev); - UNUSED(ep_addr); - - return USBD_OK; + HAL_StatusTypeDef hal_status; + hal_status = HAL_PCD_EP_ClrStall(pdev->pData, ep_addr); + return USBD_Get_USB_Status(hal_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) { - UNUSED(pdev); - UNUSED(ep_addr); - - return 0U; + 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: Endpoint Number - * @retval USBD Status - */ USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, - uint8_t dev_addr) + uint8_t dev_addr) { - UNUSED(pdev); - UNUSED(dev_addr); - - return USBD_OK; + HAL_StatusTypeDef hal_status; + hal_status = HAL_PCD_SetAddress(pdev->pData, dev_addr); + return USBD_Get_USB_Status(hal_status); } -/** - * @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) + uint8_t *pbuf, uint32_t size) { - UNUSED(pdev); - UNUSED(ep_addr); - UNUSED(pbuf); - UNUSED(size); - - return USBD_OK; + HAL_StatusTypeDef hal_status; + hal_status = HAL_PCD_EP_Transmit(pdev->pData, ep_addr, pbuf, size); + return USBD_Get_USB_Status(hal_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) + uint8_t ep_addr, uint8_t *pbuf, + uint32_t size) { - UNUSED(pdev); - UNUSED(ep_addr); - UNUSED(pbuf); - UNUSED(size); - - return USBD_OK; + HAL_StatusTypeDef hal_status; + hal_status = HAL_PCD_EP_Receive(pdev->pData, ep_addr, pbuf, size); + return USBD_Get_USB_Status(hal_status); } -/** - * @brief Returns the last transferred packet size. - * @param pdev: Device handle - * @param ep_addr: Endpoint Number - * @retval Received Data Size - */ uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr) { - UNUSED(pdev); - UNUSED(ep_addr); - - return 0U; + return HAL_PCD_EP_GetRxCount((PCD_HandleTypeDef*) pdev->pData, ep_addr); } -#ifdef USBD_HS_TESTMODE_ENABLE -/** - * @brief Set High speed Test mode. - * @param pdev: Device handle - * @param testmode: test mode - * @retval USBD Status - */ -USBD_StatusTypeDef USBD_LL_SetTestMode(USBD_HandleTypeDef *pdev, uint8_t testmode) -{ - UNUSED(pdev); - UNUSED(testmode); - - return USBD_OK; -} -#endif /* USBD_HS_TESTMODE_ENABLE */ - -/** - * @brief Static single allocation. - * @param size: Size of allocated memory - * @retval None - */ void *USBD_static_malloc(uint32_t size) { - UNUSED(size); - static uint32_t mem[(sizeof(USBD_HID_HandleTypeDef) / 4) + 1]; /* On 32-bit boundary */ - return mem; + UNUSED(size); + static uint32_t mem[(sizeof(USBD_CDC_HandleTypeDef) / 4) + 1]; /* On 32-bit boundary */ + return mem; } -/** - * @brief Dummy memory free - * @param p: Pointer to allocated memory address - * @retval None - */ void USBD_static_free(void *p) { - UNUSED(p); + UNUSED(p); } -/** - * @brief Delays routine for the USB Device Library. - * @param Delay: Delay in ms - * @retval None - */ void USBD_LL_Delay(uint32_t Delay) { - UNUSED(Delay); + HAL_Delay(Delay); } +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; +} \ No newline at end of file diff --git a/Core/Src/usbd_desc_template.c b/Core/Src/usbd_desc.c similarity index 94% rename from Core/Src/usbd_desc_template.c rename to Core/Src/usbd_desc.c index 503eb13..2dba9e7 100644 --- a/Core/Src/usbd_desc_template.c +++ b/Core/Src/usbd_desc.c @@ -26,15 +26,15 @@ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ #define USBD_VID 0x0483 -#define USBD_PID 0xaaaa /* Replace '0xaaaa' with your device product ID */ -#define USBD_LANGID_STRING 0xbbb /* Replace '0xbbb' with your device language ID */ -#define USBD_MANUFACTURER_STRING "xxxxx" /* Add your manufacturer string */ -#define USBD_PRODUCT_HS_STRING "xxxxx" /* Add your product High Speed string */ -#define USBD_PRODUCT_FS_STRING "xxxxx" /* Add your product Full Speed string */ -#define USBD_CONFIGURATION_HS_STRING "xxxxx" /* Add your configuration High Speed string */ -#define USBD_INTERFACE_HS_STRING "xxxxx" /* Add your Interface High Speed string */ -#define USBD_CONFIGURATION_FS_STRING "xxxxx" /* Add your configuration Full Speed string */ -#define USBD_INTERFACE_FS_STRING "xxxxx" /* Add your Interface Full Speed string */ +#define USBD_PID 22336 /* Replace '0xaaaa' with your device product ID */ +#define USBD_LANGID_STRING 1033 /* Replace '0xbbb' with your device language ID */ +#define USBD_MANUFACTURER_STRING "STMicroelectronics" /* Add your manufacturer string */ +#define USBD_PRODUCT_HS_STRING "STM32 Virtual ComPort" /* Add your product High Speed string */ +#define USBD_PRODUCT_FS_STRING "STM32 Virtual ComPort" /* Add your product Full Speed string */ +#define USBD_CONFIGURATION_HS_STRING "CDC Config" /* Add your configuration High Speed string */ +#define USBD_INTERFACE_HS_STRING "CDC Interface" /* Add your Interface High Speed string */ +#define USBD_CONFIGURATION_FS_STRING "CDC Config" /* Add your configuration Full Speed string */ +#define USBD_INTERFACE_FS_STRING "CDC Interface" /* Add your Interface Full Speed string */ /* Private macro -------------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ @@ -88,8 +88,8 @@ __ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END = 0x00, /* bcdUSB */ #endif /* (USBD_LPM_ENABLED == 1) || (USBD_CLASS_BOS_ENABLED == 1) */ 0x02, - 0x00, /* bDeviceClass */ - 0x00, /* bDeviceSubClass */ + 0x02, /* bDeviceClass */ + 0x02, /* bDeviceSubClass */ 0x00, /* bDeviceProtocol */ USB_MAX_EP0_SIZE, /* bMaxPacketSize */ LOBYTE(USBD_VID), /* idVendor */