To judge send ZLP or not in USBCDC::AsyncWrite

pull/15473/head
Chris Liang 2023-12-06 19:19:27 +08:00 committed by cyliang tw
parent ca616c865a
commit c30af6a7df
1 changed files with 19 additions and 7 deletions

View File

@ -39,7 +39,7 @@ public:
AsyncWrite(USBCDC *serial, uint8_t *buf, uint32_t size): AsyncWrite(USBCDC *serial, uint8_t *buf, uint32_t size):
serial(serial), tx_buf(buf), tx_size(size), result(false) serial(serial), tx_buf(buf), tx_size(size), result(false)
{ {
need_zlp = (size % CDC_MAX_PACKET_SIZE == 0) ? true : false;
} }
virtual ~AsyncWrite() virtual ~AsyncWrite()
@ -59,6 +59,12 @@ public:
tx_size -= actual_size; tx_size -= actual_size;
tx_buf += actual_size; tx_buf += actual_size;
if (tx_size == 0) { if (tx_size == 0) {
// For ZLP case, not ending yet and need one more time to invoke process to send zero packet.
if (need_zlp) {
need_zlp = false;
serial->_send_isr_start();
return false;
}
result = true; result = true;
return true; return true;
} }
@ -72,6 +78,7 @@ public:
uint8_t *tx_buf; uint8_t *tx_buf;
uint32_t tx_size; uint32_t tx_size;
bool result; bool result;
bool need_zlp;
}; };
class USBCDC::AsyncRead: public AsyncOp { class USBCDC::AsyncRead: public AsyncOp {
@ -388,7 +395,9 @@ void USBCDC::send_nb(uint8_t *buffer, uint32_t size, uint32_t *actual, bool now)
} }
_tx_size += write_size; _tx_size += write_size;
*actual = write_size; *actual = write_size;
if ((CDC_MAX_PACKET_SIZE == size) && (CDC_MAX_PACKET_SIZE == write_size)) {
/* Enable ZLP flag as while send_nb() zero size */
if (size == 0) {
_trans_zlp = true; _trans_zlp = true;
} }
@ -409,6 +418,14 @@ void USBCDC::_send_isr_start()
_tx_in_progress = true; _tx_in_progress = true;
} }
} }
/* Send ZLP write start */
if (!_tx_in_progress && _trans_zlp) {
if (USBDevice::write_start(_bulk_in, _tx_buffer, 0)) {
_tx_in_progress = true;
_trans_zlp = false;
}
}
} }
/* /*
@ -419,11 +436,6 @@ void USBCDC::_send_isr()
{ {
assert_locked(); assert_locked();
/* Send ZLP write start after last alignment packet sent */
if (_trans_zlp && USBDevice::write_start(_bulk_in, _tx_buffer, 0)) {
_trans_zlp = false;
}
write_finish(_bulk_in); write_finish(_bulk_in);
_tx_buf = _tx_buffer; _tx_buf = _tx_buffer;
_tx_size = 0; _tx_size = 0;