USB CDC ACM: fix sending loop (and spacing)

This commit is contained in:
King Kévin 2020-11-27 17:06:21 +01:00
parent 2249f460e3
commit 0fe7e1fd39
1 changed files with 5 additions and 6 deletions

View File

@ -358,13 +358,12 @@ static void usb_cdcacm_data_tx_cb(usbd_device *usbd_dev, uint8_t ep)
uint16_t usb_length = (tx_used > USB_DATA_TRANSFER_SIZE ? USB_DATA_TRANSFER_SIZE : tx_used); // length of data to be transmitted (respect max packet size)
usb_length = (usb_length > (LENGTH(tx_buffer) - tx_i) ? LENGTH(tx_buffer) - tx_i : usb_length); // since here we use the source array not as ring buffer, only go up to the end
usb_length = usbd_ep_write_packet(usb_device, 0x82, (void*)(&tx_buffer[tx_i]), usb_length); // transmit data (put into USB FIFO)
tx_i = (tx_i + usb_length)%LENGTH(tx_buffer); // update location on buffer
tx_i = (tx_i + usb_length) % LENGTH(tx_buffer); // update location on buffer
tx_used -= usb_length; // update used size
tx_lock = false; // release lock
} else {
usbd_ep_write_packet(usb_device, usb_cdcacm_data_endpoints[1].bEndpointAddress, NULL, 0); // trigger empty tx for a later callback
}
usbd_poll(usb_device); // ensure the data gets sent
}
/** USB CDC ACM communication callback
@ -427,12 +426,12 @@ void usb_cdcacm_putchar(char c)
}
while (tx_lock); // wait for lock to be released
tx_lock = true; // put lock on transmit buffer
if (tx_used<LENGTH(tx_buffer)) { // buffer not full
tx_buffer[(tx_i+tx_used)%LENGTH(tx_buffer)] = c; // put character in buffer
if (tx_used < LENGTH(tx_buffer)) { // buffer not full
tx_buffer[(tx_i + tx_used) % LENGTH(tx_buffer)] = c; // put character in buffer
tx_used++; // update used buffer
} else { // buffer full (might be that no terminal is connected to this serial)
tx_i = (tx_i+1)%LENGTH(tx_buffer); // shift start
tx_buffer[(tx_i+tx_used)%LENGTH(tx_buffer)] = c; // overwrite old data
tx_i = (tx_i + 1) % LENGTH(tx_buffer); // shift start
tx_buffer[(tx_i + tx_used) % LENGTH(tx_buffer)] = c; // overwrite old data
}
tx_lock = false; // release lock on transmit buffer
usb_cdcacm_data_tx_cb(NULL, 0); // send data over USB when possible