summaryrefslogtreecommitdiff
path: root/src/class
diff options
context:
space:
mode:
authorMasterPhi <[email protected]>2021-08-22 13:26:50 +0200
committerMasterPhi <[email protected]>2021-08-22 13:26:50 +0200
commit4941cde175af2ef21bbe24d7d3271b46363c0759 (patch)
treeb99c277206c897748d73babddf0b19ee4c28f8b9 /src/class
parent89e4586653663b374272d9fd64a447b84352ae53 (diff)
Fix vendor fifo deadlock, add tud_vendor_n_read_flush
Diffstat (limited to 'src/class')
-rw-r--r--src/class/vendor/vendor_device.c9
-rw-r--r--src/class/vendor/vendor_device.h7
2 files changed, 16 insertions, 0 deletions
diff --git a/src/class/vendor/vendor_device.c b/src/class/vendor/vendor_device.c
index 6718a97bf..8c59b4ea7 100644
--- a/src/class/vendor/vendor_device.c
+++ b/src/class/vendor/vendor_device.c
@@ -103,6 +103,13 @@ uint32_t tud_vendor_n_read (uint8_t itf, void* buffer, uint32_t bufsize)
return num_read;
}
+void tud_vendor_n_read_flush (uint8_t itf)
+{
+ vendord_interface_t* p_itf = &_vendord_itf[itf];
+ tu_fifo_clear(&p_itf->rx_ff);
+ _prep_out_transaction(p_itf);
+}
+
//--------------------------------------------------------------------+
// Write API
//--------------------------------------------------------------------+
@@ -199,6 +206,8 @@ uint16_t vendord_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, ui
TU_BREAKPOINT();
}
+ maybe_transmit(p_vendor);
+
return drv_len;
}
diff --git a/src/class/vendor/vendor_device.h b/src/class/vendor/vendor_device.h
index 6d9c784c0..844693c68 100644
--- a/src/class/vendor/vendor_device.h
+++ b/src/class/vendor/vendor_device.h
@@ -45,6 +45,7 @@ bool tud_vendor_n_mounted (uint8_t itf);
uint32_t tud_vendor_n_available (uint8_t itf);
uint32_t tud_vendor_n_read (uint8_t itf, void* buffer, uint32_t bufsize);
bool tud_vendor_n_peek (uint8_t itf, uint8_t* u8);
+void tud_vendor_n_read_flush (uint8_t itf);
uint32_t tud_vendor_n_write (uint8_t itf, void const* buffer, uint32_t bufsize);
uint32_t tud_vendor_n_write_available (uint8_t itf);
@@ -59,6 +60,7 @@ static inline bool tud_vendor_mounted (void);
static inline uint32_t tud_vendor_available (void);
static inline uint32_t tud_vendor_read (void* buffer, uint32_t bufsize);
static inline bool tud_vendor_peek (uint8_t* u8);
+static inline void tud_vendor_read_flush (void);
static inline uint32_t tud_vendor_write (void const* buffer, uint32_t bufsize);
static inline uint32_t tud_vendor_write_str (char const* str);
static inline uint32_t tud_vendor_write_available (void);
@@ -99,6 +101,11 @@ static inline bool tud_vendor_peek (uint8_t* u8)
return tud_vendor_n_peek(0, u8);
}
+static inline void tud_vendor_read_flush(void)
+{
+ tud_vendor_n_read_flush(0);
+}
+
static inline uint32_t tud_vendor_write (void const* buffer, uint32_t bufsize)
{
return tud_vendor_n_write(0, buffer, bufsize);