forked from haraldwolff/avr-fw-modules
50 lines
983 B
C
50 lines
983 B
C
|
#pragma once
|
||
|
|
||
|
#include <stdint.h>
|
||
|
#include <hwo/systick.h>
|
||
|
|
||
|
struct fifo
|
||
|
{
|
||
|
uint8_t size;
|
||
|
uint8_t pWrite;
|
||
|
uint8_t pRead;
|
||
|
uint8_t *pBuffer;
|
||
|
|
||
|
union
|
||
|
{
|
||
|
struct {
|
||
|
uint8_t blocking:1; // Blocking Mode
|
||
|
uint8_t irq_rd:1, // fifo_read / fifo_poll called from IRQ (force non blocking)
|
||
|
irq_wr:1; // fifo_write called from IRQ (force non blocking)
|
||
|
};
|
||
|
uint8_t flags;
|
||
|
};
|
||
|
|
||
|
uint16_t timeout;
|
||
|
avrWAIT wtimeout;
|
||
|
};
|
||
|
|
||
|
typedef struct fifo FIFO;
|
||
|
|
||
|
// FIFO Options
|
||
|
#define FO_BLOCKING (1<<0)
|
||
|
#define FO_IRQ_RD (1<<1)
|
||
|
#define FO_IRQ_WR (1<<2)
|
||
|
|
||
|
|
||
|
FIFO* fifo_alloc (uint8_t size);
|
||
|
|
||
|
void fifo_write (FIFO* fifo,uint8_t byte);
|
||
|
uint16_t fifo_read (FIFO* fifo);
|
||
|
uint16_t fifo_poll (FIFO* fifo);
|
||
|
|
||
|
uint8_t fifo_avail (FIFO* fifo);
|
||
|
uint8_t fifo_free (FIFO* fifo);
|
||
|
|
||
|
void fifo_set_blocking(FIFO* fifo,uint8_t blocking);
|
||
|
void fifo_set_timeout(FIFO*fifo,uint16_t timeout);
|
||
|
|
||
|
void fifo_options(FIFO* fifo,uint8_t options);
|
||
|
|
||
|
uint16_t fifo_read_block (FIFO* fifo,uint8_t* buffer,int maxlen);
|