summaryrefslogtreecommitdiff
path: root/src/class/vendor
diff options
context:
space:
mode:
authorHiFiPhile <[email protected]>2024-08-02 11:52:35 +0200
committerGitHub <[email protected]>2024-08-02 11:52:35 +0200
commit95cb319bded7db536edaae24936a825a8524a4a2 (patch)
tree7de7d7f8d1916061cdaefcfb4f220397e1d0fbb8 /src/class/vendor
parentadc7a78fd6fbdccbe5f586391997052f2becd149 (diff)
parent4232642899362fa5e9cf0dc59bad6f1f6d32c563 (diff)
Merge branch 'master' into vendor_fifo
Diffstat (limited to 'src/class/vendor')
-rw-r--r--src/class/vendor/vendor_device.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/class/vendor/vendor_device.c b/src/class/vendor/vendor_device.c
index dcd629965..06c663f1b 100644
--- a/src/class/vendor/vendor_device.c
+++ b/src/class/vendor/vendor_device.c
@@ -36,6 +36,8 @@
//--------------------------------------------------------------------+
// MACRO CONSTANT TYPEDEF
//--------------------------------------------------------------------+
+#define BULK_PACKET_SIZE (TUD_OPT_HIGH_SPEED ? 512 : 64)
+
typedef struct
{
uint8_t itf_num;
@@ -331,7 +333,6 @@ uint16_t vendord_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, ui
bool vendord_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes)
{
- (void) rhport;
(void) result;
uint8_t itf = 0;
@@ -364,7 +365,18 @@ bool vendord_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint
if (tud_vendor_tx_cb) tud_vendor_tx_cb(itf, (uint16_t) xferred_bytes);
#if CFG_TUD_VENDOR_TX_BUFSIZE > 0
// Send complete, try to send more if possible
- tud_vendor_n_write_flush(itf);
+ if ( 0 == tud_vendor_n_write_flush(itf) )
+ {
+ // If there is no data left, a ZLP should be sent if
+ // xferred_bytes is multiple of EP Packet size and not zero
+ if ( !tu_fifo_count(&p_itf->tx_ff) && xferred_bytes && (0 == (xferred_bytes & (BULK_PACKET_SIZE-1))) )
+ {
+ if ( usbd_edpt_claim(rhport, p_itf->ep_in) )
+ {
+ usbd_edpt_xfer(rhport, p_itf->ep_in, NULL, 0);
+ }
+ }
+ }
#endif
}