- driver: only poll FIFO free space if transmission size > 0

- CDC: buffer size increased
This commit is contained in:
Wiesner András 2024-04-19 14:01:17 +02:00
parent 4cf5fb77fe
commit 8ef6249e01
2 changed files with 12 additions and 7 deletions

View File

@ -12,11 +12,13 @@
static USB_CdcState cdcs = { 0 }; static USB_CdcState cdcs = { 0 };
static uint8_t tx_buffer[USB_CDC_PCKT_BUFSIZE]; static uint8_t tx_buffer[USB_CDC_PCKT_BUFSIZE];
#define USB_CDC_FIFO_MEM_SIZE (2048) #define USB_CDC_FIFO_MEM_SIZE (3072) // FIXME: ez vagy a blocking FIFO bugos
static uint8_t fifo_mem[USB_CDC_FIFO_MEM_SIZE]; static uint8_t fifo_mem[USB_CDC_FIFO_MEM_SIZE];
static BFifo fifo; static BFifo fifo;
void usb_cdc_read_callback(const uint8_t * data, uint32_t size);
void usb_cdc_init(const USB_CdcAssignments *as) { void usb_cdc_init(const USB_CdcAssignments *as) {
// clear the structure // clear the structure
memset(&cdcs, 0, sizeof(USB_CdcState)); memset(&cdcs, 0, sizeof(USB_CdcState));

View File

@ -476,7 +476,10 @@ uint32_t usbdrv_arm_IN_endpoint(uint8_t ep, const uint8_t *data, uint16_t len) {
} }
// determine final write size // determine final write size
uint32_t freeSize = USBINEP[ep].DTXFSTS * sizeof(uint32_t); // get free transmit buffer size uint32_t freeSize = 0;
if (len > 0) { // only poll DTXFSTS if (len > 0) (see datasheet)
freeSize = USBINEP[ep].DTXFSTS * sizeof(uint32_t); // get free transmit buffer size
}
uint16_t writeSize = MIN(freeSize, len); // limit transmit size to free size uint16_t writeSize = MIN(freeSize, len); // limit transmit size to free size
// calculate packet count based on max packet size // calculate packet count based on max packet size
@ -486,10 +489,10 @@ uint32_t usbdrv_arm_IN_endpoint(uint8_t ep, const uint8_t *data, uint16_t len) {
packet_count = writeSize / mps + (((writeSize % mps) > 0) ? 1 : 0); packet_count = writeSize / mps + (((writeSize % mps) > 0) ? 1 : 0);
} }
// set zlp_next if transmission size is integer multiple of max packet size // set zlp_next if transmission size is integer multiple of max packet size6
gs.ep_IN[ep].zlp_next = (writeSize > 0) && ((writeSize % mps) == 0); gs.ep_IN[ep].zlp_next = (writeSize > 0) && ((writeSize % mps) == 0);
// program DIEPTSIZ with transfer length (TODO: currently only a single transfer!) // program DIEPTSIZ with transfer length
USBINEP[ep].DIEPTSIZ = (packet_count << USB_OTG_DIEPTSIZ_PKTCNT_Pos) | writeSize; USBINEP[ep].DIEPTSIZ = (packet_count << USB_OTG_DIEPTSIZ_PKTCNT_Pos) | writeSize;
// enable endpoint and cancel responding NAK // enable endpoint and cancel responding NAK