mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-17 05:38:33 +03:00
Change directory structure to align with Atmel softpack
This way we can easily check with 'diff' for differences in our code and Atmel softpack. Also, this layout is more suitable for building various different firmware images (e.g. factory-test, dfu-loader, main application) for a variety of different boards (simtrace, owhw, qmod).
This commit is contained in:
70
firmware/libcommon/source/ringbuffer.c
Normal file
70
firmware/libcommon/source/ringbuffer.c
Normal file
@@ -0,0 +1,70 @@
|
||||
#include "ringbuffer.h"
|
||||
#include "trace.h"
|
||||
#include "utils.h"
|
||||
|
||||
void rbuf_reset(volatile ringbuf * rb)
|
||||
{
|
||||
unsigned long state;
|
||||
|
||||
local_irq_save(state);
|
||||
rb->ird = 0;
|
||||
rb->iwr = 0;
|
||||
local_irq_restore(state);
|
||||
}
|
||||
|
||||
uint8_t rbuf_read(volatile ringbuf * rb)
|
||||
{
|
||||
unsigned long state;
|
||||
uint8_t val;
|
||||
|
||||
local_irq_save(state);
|
||||
val = rb->buf[rb->ird];
|
||||
rb->ird = (rb->ird + 1) % RING_BUFLEN;
|
||||
local_irq_restore(state);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
uint8_t rbuf_peek(volatile ringbuf * rb)
|
||||
{
|
||||
return rb->buf[rb->ird];
|
||||
}
|
||||
|
||||
bool rbuf_is_empty(volatile ringbuf * rb)
|
||||
{
|
||||
return rb->ird == rb->iwr;
|
||||
}
|
||||
|
||||
static bool __rbuf_is_full(volatile ringbuf * rb)
|
||||
{
|
||||
return rb->ird == (rb->iwr + 1) % RING_BUFLEN;
|
||||
}
|
||||
|
||||
bool rbuf_is_full(volatile ringbuf * rb)
|
||||
{
|
||||
unsigned long state;
|
||||
bool rc;
|
||||
|
||||
local_irq_save(state);
|
||||
rc = rb->ird == (rb->iwr + 1) % RING_BUFLEN;
|
||||
local_irq_restore(state);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
void rbuf_write(volatile volatile ringbuf * rb, uint8_t item)
|
||||
{
|
||||
unsigned long state;
|
||||
|
||||
local_irq_save(state);
|
||||
if (!__rbuf_is_full(rb)) {
|
||||
rb->buf[rb->iwr] = item;
|
||||
rb->iwr = (rb->iwr + 1) % RING_BUFLEN;
|
||||
local_irq_restore(state);
|
||||
} else {
|
||||
local_irq_restore(state);
|
||||
TRACE_ERROR("Ringbuffer full, losing bytes!");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user