Skip to content
6 changes: 3 additions & 3 deletions cores/arduino/stm32/usb/cdc/usbd_cdc.c
Original file line number Diff line number Diff line change
Expand Up @@ -651,9 +651,9 @@ static uint8_t USBD_CDC_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum)
USBD_CDC_ItfTypeDef *ctrl = (USBD_CDC_ItfTypeDef *)pdev->pUserData;

if (pdev->pClassData != NULL) {
if ((pdev->ep_in[epnum].total_length > 0U) && ((pdev->ep_in[epnum].total_length % hpcd->IN_ep[epnum].maxpacket) == 0U)) {
if ((hcdc->TxLastLength > 0U) && ((hcdc->TxLastLength % hpcd->IN_ep[epnum].maxpacket) == 0U)) {
/* Update the packet total length */
pdev->ep_in[epnum].total_length = 0U;
hcdc->TxLastLength = 0U;

/* Send ZLP */
USBD_LL_Transmit(pdev, epnum, NULL, 0U);
Expand Down Expand Up @@ -835,7 +835,7 @@ uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev)
hcdc->TxState = 1U;

/* Update the packet total length */
pdev->ep_in[CDC_IN_EP & 0xFU].total_length = hcdc->TxLength;
hcdc->TxLastLength = hcdc->TxLength;

/* Transmit next packet */
USBD_LL_Transmit(pdev, CDC_IN_EP, hcdc->TxBuffer,
Expand Down
5 changes: 3 additions & 2 deletions cores/arduino/stm32/usb/cdc/usbd_cdc.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,9 @@ extern "C" {
/** @defgroup usbd_cdc_Exported_Defines
* @{
*/
#define CDC_IN_EP 0x81U /* EP1 for data IN */
#define CDC_IN_EP 0x82U /* 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_EP 0x83U /* EP2 for CDC commands */

#ifndef CDC_HS_BINTERVAL
#define CDC_HS_BINTERVAL 0x10U
Expand Down Expand Up @@ -115,6 +115,7 @@ typedef struct {
uint8_t *TxBuffer;
uint32_t RxLength;
uint32_t TxLength;
uint32_t TxLastLength;

__IO uint32_t TxState;
__IO uint32_t RxState;
Expand Down
14 changes: 8 additions & 6 deletions cores/arduino/stm32/usb/usbd_conf.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,12 @@
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Size in words, byte size divided by 2 */
#define PMA_EP0_OUT_ADDR (8 * 3)
#define PMA_EP0_OUT_ADDR (8 * 4)
#define PMA_EP0_IN_ADDR (PMA_EP0_OUT_ADDR + USB_MAX_EP0_SIZE)
#define PMA_CDC_OUT_ADDR (PMA_EP0_IN_ADDR + USB_MAX_EP0_SIZE)
#define PMA_CDC_IN_ADDR (PMA_CDC_OUT_ADDR + USB_FS_MAX_PACKET_SIZE)
#define PMA_CDC_OUT_BASE (PMA_EP0_IN_ADDR + USB_MAX_EP0_SIZE)
#define PMA_CDC_OUT_ADDR ((PMA_CDC_OUT_BASE + USB_FS_MAX_PACKET_SIZE) | \
(PMA_CDC_OUT_BASE << 16U))
#define PMA_CDC_IN_ADDR (PMA_CDC_OUT_BASE + USB_FS_MAX_PACKET_SIZE * 2)
#define PMA_CDC_CMD_ADDR (PMA_CDC_IN_ADDR + USB_FS_MAX_PACKET_SIZE)
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
Expand Down Expand Up @@ -520,9 +522,9 @@ USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev)
#else
HAL_PCDEx_PMAConfig(&g_hpcd, 0x00, PCD_SNG_BUF, PMA_EP0_OUT_ADDR);
HAL_PCDEx_PMAConfig(&g_hpcd, 0x80, PCD_SNG_BUF, PMA_EP0_IN_ADDR);
HAL_PCDEx_PMAConfig(&g_hpcd, 0x01, PCD_SNG_BUF, PMA_CDC_OUT_ADDR);
HAL_PCDEx_PMAConfig(&g_hpcd, 0x81, PCD_SNG_BUF, PMA_CDC_IN_ADDR);
HAL_PCDEx_PMAConfig(&g_hpcd, 0x82, PCD_SNG_BUF, PMA_CDC_CMD_ADDR);
HAL_PCDEx_PMAConfig(&g_hpcd, 0x01, PCD_DBL_BUF, PMA_CDC_OUT_ADDR);
HAL_PCDEx_PMAConfig(&g_hpcd, 0x82, PCD_SNG_BUF, PMA_CDC_IN_ADDR);
HAL_PCDEx_PMAConfig(&g_hpcd, 0x83, PCD_SNG_BUF, PMA_CDC_CMD_ADDR);
#endif
#endif /* USE_USB_HS */
return USBD_OK;
Expand Down
13 changes: 10 additions & 3 deletions system/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_usb.h
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,9 @@ typedef struct
uint32_t xfer_len; /*!< Current transfer length */

uint32_t xfer_count; /*!< Partial transfer length in case of multi packet transfer */

uint16_t pending0; /*!, Fact, that double buffering transfer have pended data */
uint16_t pending1; /*!, Fact, that double buffering transfer have pended data */
}USB_OTG_EPTypeDef;

typedef struct
Expand Down Expand Up @@ -269,20 +272,24 @@ typedef struct

uint8_t doublebuffer; /*!< Double buffer enable
This parameter can be 0 or 1 */
uint16_t tx_fifo_num; /*!< This parameter is not required by USB Device FS peripheral, it is used

uint16_t tx_fifo_num; /*!< This parameter is not required by USB Device FS peripheral, it is used
only by USB OTG FS peripheral
This parameter is added to ensure compatibility across USB peripherals */

uint32_t maxpacket; /*!< Endpoint Max packet size
This parameter must be a number between Min_Data = 0 and Max_Data = 64KB */

uint8_t *xfer_buff; /*!< Pointer to transfer buffer */



uint32_t xfer_len; /*!< Current transfer length */

uint32_t xfer_count; /*!< Partial transfer length in case of multi packet transfer */

uint16_t pending0; /*!, Fact, that double buffering transfer have pended data */
uint16_t pending1; /*!, Fact, that double buffering transfer have pended data */

} USB_EPTypeDef;
#endif /* USB */
/**
Expand Down
Loading