Skip to content

Commit 9e553cb

Browse files
makarenyafpistm
authored andcommitted
[USB CDC] Fixed possible transmitting error
1 parent e9b7dd6 commit 9e553cb

File tree

3 files changed

+10
-9
lines changed

3 files changed

+10
-9
lines changed

cores/arduino/stm32/usb/cdc/cdc_queue.c

+6-8
Original file line numberDiff line numberDiff line change
@@ -73,19 +73,17 @@ void CDC_TransmitQueue_Enqueue(CDC_TransmitQueue_TypeDef *queue, const uint8_t *
7373

7474
// Read flat block from queue (biggest as possible, but max CDC_QUEUE_MAX_PACKET_SIZE).
7575
uint8_t *CDC_TransmitQueue_ReadBlock(CDC_TransmitQueue_TypeDef *queue, uint16_t *size) {
76-
uint16_t readPos = queue->read;
7776
if (queue->write >= queue->read) {
7877
*size = queue->write - queue->read;
79-
queue->read = queue->write;
80-
} else if ((uint16_t)(CDC_TRANSMIT_QUEUE_BUFFER_SIZE - queue->read) > CDC_QUEUE_MAX_PACKET_SIZE) {
81-
// limit to max packet size
82-
*size = CDC_QUEUE_MAX_PACKET_SIZE;
83-
queue->read += CDC_QUEUE_MAX_PACKET_SIZE;
8478
} else {
8579
*size = CDC_TRANSMIT_QUEUE_BUFFER_SIZE - queue->read;
86-
queue->read = 0;
8780
}
88-
return &queue->buffer[readPos];
81+
queue->reserved = *size;
82+
return &queue->buffer[queue->read];
83+
}
84+
85+
void CDC_TransmitQueue_CommitRead(CDC_TransmitQueue_TypeDef *queue) {
86+
queue->read = (queue->read + queue->reserved) % CDC_TRANSMIT_QUEUE_BUFFER_SIZE;
8987
}
9088

9189
// Initialize read and write position of queue.

cores/arduino/stm32/usb/cdc/cdc_queue.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,14 @@
5252
#else
5353
#define CDC_QUEUE_MAX_PACKET_SIZE USB_FS_MAX_PACKET_SIZE
5454
#endif
55-
#define CDC_TRANSMIT_QUEUE_BUFFER_SIZE ((uint16_t)(CDC_QUEUE_MAX_PACKET_SIZE))
55+
#define CDC_TRANSMIT_QUEUE_BUFFER_SIZE ((uint16_t)(CDC_QUEUE_MAX_PACKET_SIZE * 2))
5656
#define CDC_RECEIVE_QUEUE_BUFFER_SIZE ((uint16_t)(CDC_QUEUE_MAX_PACKET_SIZE * 2))
5757

5858
typedef struct {
5959
uint8_t buffer[CDC_TRANSMIT_QUEUE_BUFFER_SIZE];
6060
volatile uint16_t write;
6161
volatile uint16_t read;
62+
volatile uint16_t reserved;
6263
} CDC_TransmitQueue_TypeDef;
6364

6465
typedef struct {
@@ -73,6 +74,7 @@ int CDC_TransmitQueue_WriteSize(CDC_TransmitQueue_TypeDef* queue);
7374
int CDC_TransmitQueue_ReadSize(CDC_TransmitQueue_TypeDef* queue);
7475
void CDC_TransmitQueue_Enqueue(CDC_TransmitQueue_TypeDef* queue, const uint8_t* buffer, uint32_t size);
7576
uint8_t* CDC_TransmitQueue_ReadBlock(CDC_TransmitQueue_TypeDef* queue, uint16_t* size);
77+
void CDC_TransmitQueue_CommitRead(CDC_TransmitQueue_TypeDef *queue);
7678

7779
void CDC_ReceiveQueue_Init(CDC_ReceiveQueue_TypeDef* queue);
7880
int CDC_ReceiveQueue_ReadSize(CDC_ReceiveQueue_TypeDef* queue);

cores/arduino/stm32/usb/cdc/usbd_cdc_if.c

+1
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ static int8_t USBD_CDC_Receive (uint8_t* Buf, uint32_t *Len) {
211211

212212

213213
static int8_t USBD_CDC_Transferred (void) {
214+
CDC_TransmitQueue_CommitRead(&TransmitQueue);
214215
CDC_continue_transmit();
215216
return (USBD_OK);
216217
}

0 commit comments

Comments
 (0)