summaryrefslogtreecommitdiff
path: root/tinyusb/common/fifo.h
diff options
context:
space:
mode:
authorhathach <[email protected]>2013-11-08 14:46:48 +0700
committerhathach <[email protected]>2013-11-08 14:46:48 +0700
commit7ff0dbb64cfcab7256a4b113931c63a4c7efa0d3 (patch)
tree41d92cf1d303d5578a50f7f79c72134534a3d19e /tinyusb/common/fifo.h
parent15d3a418bd0d109d926ea95c3be1bbc83757734b (diff)
add tusbd_cdc_is_busy
enhance cdc serial device demo refractor fifo.c
Diffstat (limited to 'tinyusb/common/fifo.h')
-rw-r--r--tinyusb/common/fifo.h47
1 files changed, 26 insertions, 21 deletions
diff --git a/tinyusb/common/fifo.h b/tinyusb/common/fifo.h
index ef33bb956..daef4a84a 100644
--- a/tinyusb/common/fifo.h
+++ b/tinyusb/common/fifo.h
@@ -36,12 +36,6 @@
*/
/**************************************************************************/
-/** \file
- * \brief Error Header
- *
- * \note TBD
- */
-
/** \ingroup Group_Common
*
* @{
@@ -59,36 +53,47 @@
/** \struct fifo_t
* \brief Simple Circular FIFO
*/
-typedef struct _fifo_t
+typedef struct
{
- uint8_t* buf ; ///< buffer pointer
- uint16_t size ; ///< buffer size
- volatile uint16_t len ; ///< bytes in fifo
- volatile uint16_t wr_ptr ; ///< write pointer
- volatile uint16_t rd_ptr ; ///< read pointer
- bool overwritable ; ///< allow overwrite data when full
-// IRQn_Type irq ; ///< TODO (abstract later) interrupt used to lock fifo
+ uint16_t const depth ; ///< max items
+ uint16_t const item_size ; ///< size of each item
+ volatile uint16_t count ; ///< number of items in queue
+ volatile uint16_t wr_idx ; ///< write pointer
+ volatile uint16_t rd_idx ; ///< read pointer
+ bool overwritable ;
+ uint8_t buffer[] ; ///< buffer pointer
+ // IRQn_Type irq;
} fifo_t;
-bool fifo_init(fifo_t* f, uint8_t* buffer, uint16_t size, bool overwritable); //, IRQn_Type irq);
-bool fifo_write(fifo_t* f, uint8_t data);
-bool fifo_read(fifo_t* f, uint8_t *data);
-uint16_t fifo_read_n(fifo_t* f, uint8_t * rx, uint16_t maxlen);
+#define FIFO_DEF(name, ff_depth, type, is_overwritable) /*, irq_mutex)*/ \
+ fifo_t name = {\
+ .depth = ff_depth,\
+ .item_size = sizeof(type),\
+ .overwritable = is_overwritable,\
+ /*.irq = irq_mutex*/\
+ .buffer = { [ff_depth*sizeof(type) - 1] = 0 },\
+ }
+
+bool fifo_write(fifo_t* f, void const * p_data);
+bool fifo_read(fifo_t* f, void * p_buffer);
void fifo_clear(fifo_t *f);
+static inline bool fifo_is_empty(fifo_t* f) ATTR_PURE ATTR_ALWAYS_INLINE;
static inline bool fifo_is_empty(fifo_t* f)
{
- return (f->len == 0);
+ return (f->count == 0);
}
+static inline bool fifo_is_full(fifo_t* f) ATTR_PURE ATTR_ALWAYS_INLINE;
static inline bool fifo_is_full(fifo_t* f)
{
- return (f->len == f->size);
+ return (f->count == f->depth);
}
+static inline uint16_t fifo_get_length(fifo_t* f) ATTR_PURE ATTR_ALWAYS_INLINE;
static inline uint16_t fifo_get_length(fifo_t* f)
{
- return f->len;
+ return f->count;
}
#ifdef __cplusplus