summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorJames Smith <{ID}+{username}@users.noreply.github.com>2025-12-20 13:27:29 -0700
committerJames Smith <{ID}+{username}@users.noreply.github.com>2025-12-20 13:36:54 -0700
commit185757ed413fc7bdc65cf494a6079cfed049f98e (patch)
tree294b6d253af8904322f1dedbb3fb3da7cd114155 /src/common
parent83fa3bbffe2237303ff1ae92fe0b6c8384073993 (diff)
Added tud_vendor_write_clear() which forcefully clears TX buffer
Diffstat (limited to 'src/common')
-rw-r--r--src/common/tusb_fifo.c16
-rw-r--r--src/common/tusb_fifo.h1
-rw-r--r--src/common/tusb_private.h4
3 files changed, 21 insertions, 0 deletions
diff --git a/src/common/tusb_fifo.c b/src/common/tusb_fifo.c
index e97b6ccce..28086be0b 100644
--- a/src/common/tusb_fifo.c
+++ b/src/common/tusb_fifo.c
@@ -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) {
diff --git a/src/common/tusb_fifo.h b/src/common/tusb_fifo.h
index 2e2a0db6f..75eeded01 100644
--- a/src/common/tusb_fifo.h
+++ b/src/common/tusb_fifo.h
@@ -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
diff --git a/src/common/tusb_private.h b/src/common/tusb_private.h
index 10e12c2af..0c1709d49 100644
--- a/src/common/tusb_private.h
+++ b/src/common/tusb_private.h
@@ -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);
}