mirror of
https://github.com/hathach/tinyusb.git
synced 2026-02-05 07:05:35 +00:00
Added tud_vendor_write_clear() which forcefully clears TX buffer
This commit is contained in:
@ -196,6 +196,7 @@ bool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_requ
|
||||
tud_vendor_write_str("\r\nWebUSB interface connected\r\n");
|
||||
tud_vendor_write_flush();
|
||||
} else {
|
||||
tud_vendor_write_clear(); // anything left in the buffer is now thrown out
|
||||
blink_interval_ms = BLINK_MOUNTED;
|
||||
}
|
||||
|
||||
|
||||
6
src/class/vendor/vendor_device.c
vendored
6
src/class/vendor/vendor_device.c
vendored
@ -160,6 +160,12 @@ uint32_t tud_vendor_n_write_available(uint8_t idx) {
|
||||
vendord_interface_t *p_itf = &_vendord_itf[idx];
|
||||
return tu_edpt_stream_write_available(&p_itf->stream.tx);
|
||||
}
|
||||
|
||||
uint32_t tud_vendor_n_write_clear(uint8_t idx) {
|
||||
TU_VERIFY(idx < CFG_TUD_VENDOR, 0);
|
||||
vendord_interface_t *p_itf = &_vendord_itf[idx];
|
||||
return tu_edpt_stream_count_and_clear(&p_itf->stream.tx);
|
||||
}
|
||||
#endif
|
||||
|
||||
//--------------------------------------------------------------------+
|
||||
|
||||
7
src/class/vendor/vendor_device.h
vendored
7
src/class/vendor/vendor_device.h
vendored
@ -91,6 +91,9 @@ uint32_t tud_vendor_n_write_flush(uint8_t idx);
|
||||
|
||||
// Return number of bytes available for writing in TX FIFO
|
||||
uint32_t tud_vendor_n_write_available(uint8_t idx);
|
||||
|
||||
// Clear the write buffer and return the number of elements cleared
|
||||
uint32_t tud_vendor_n_write_clear(uint8_t idx);
|
||||
#endif
|
||||
|
||||
// Write a null-terminated string to TX FIFO
|
||||
@ -148,6 +151,10 @@ TU_ATTR_ALWAYS_INLINE static inline uint32_t tud_vendor_write_flush(void) {
|
||||
TU_ATTR_ALWAYS_INLINE static inline uint32_t tud_vendor_write_available(void) {
|
||||
return tud_vendor_n_write_available(0);
|
||||
}
|
||||
|
||||
TU_ATTR_ALWAYS_INLINE static inline uint32_t tud_vendor_write_clear(void) {
|
||||
return tud_vendor_n_write_clear(0);
|
||||
}
|
||||
#endif
|
||||
|
||||
// backward compatible
|
||||
|
||||
@ -95,6 +95,22 @@ void tu_fifo_clear(tu_fifo_t *f) {
|
||||
ff_unlock(f->mutex_rd);
|
||||
}
|
||||
|
||||
// synchronously count then clear fifo, returning the count
|
||||
uint16_t tu_fifo_count_and_clear(tu_fifo_t *f) {
|
||||
ff_lock(f->mutex_wr);
|
||||
ff_lock(f->mutex_rd);
|
||||
|
||||
uint16_t cnt = tu_fifo_count(f);
|
||||
|
||||
f->rd_idx = 0;
|
||||
f->wr_idx = 0;
|
||||
|
||||
ff_unlock(f->mutex_wr);
|
||||
ff_unlock(f->mutex_rd);
|
||||
|
||||
return cnt;
|
||||
}
|
||||
|
||||
// Change the fifo overwritable mode
|
||||
void tu_fifo_set_overwritable(tu_fifo_t *f, bool overwritable) {
|
||||
if (f->overwritable == overwritable) {
|
||||
|
||||
@ -159,6 +159,7 @@ typedef enum {
|
||||
bool tu_fifo_config(tu_fifo_t *f, void *buffer, uint16_t depth, uint16_t item_size, bool overwritable);
|
||||
void tu_fifo_set_overwritable(tu_fifo_t *f, bool overwritable);
|
||||
void tu_fifo_clear(tu_fifo_t *f);
|
||||
uint16_t tu_fifo_count_and_clear(tu_fifo_t *f);
|
||||
|
||||
#if OSAL_MUTEX_REQUIRED
|
||||
TU_ATTR_ALWAYS_INLINE static inline
|
||||
|
||||
@ -144,6 +144,10 @@ TU_ATTR_ALWAYS_INLINE static inline void tu_edpt_stream_clear(tu_edpt_stream_t *
|
||||
tu_fifo_clear(&s->ff);
|
||||
}
|
||||
|
||||
TU_ATTR_ALWAYS_INLINE static inline uint16_t tu_edpt_stream_count_and_clear(tu_edpt_stream_t *s) {
|
||||
return tu_fifo_count_and_clear(&s->ff);
|
||||
}
|
||||
|
||||
TU_ATTR_ALWAYS_INLINE static inline bool tu_edpt_stream_empty(tu_edpt_stream_t *s) {
|
||||
return tu_fifo_empty(&s->ff);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user