Initial commit: CCU621_M firmware project with BLE debug link support.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,147 @@
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "ringfifo.h"
|
||||
|
||||
void fifo_register(_fifo_t *pfifo, uint8_t *pfifo_buf, uint32_t size,
|
||||
lock_fun lock, lock_fun unlock)
|
||||
{
|
||||
pfifo->buf_size = size;
|
||||
pfifo->buf = pfifo_buf;
|
||||
pfifo->pwrite = pfifo->buf;
|
||||
pfifo->pread = pfifo->buf;
|
||||
pfifo->occupy_size = 0;
|
||||
pfifo->lock = lock;
|
||||
pfifo->unlock = unlock;
|
||||
}
|
||||
|
||||
void fifo_release(_fifo_t *pfifo)
|
||||
{
|
||||
pfifo->buf_size = 0;
|
||||
pfifo->occupy_size = 0;
|
||||
pfifo->buf = NULL;
|
||||
pfifo->pwrite = 0;
|
||||
pfifo->pread = 0;
|
||||
pfifo->lock = NULL;
|
||||
pfifo->unlock = NULL;
|
||||
}
|
||||
|
||||
uint32_t fifo_write(_fifo_t *pfifo, const uint8_t *pbuf, uint32_t size)
|
||||
{
|
||||
uint32_t w_size = 0;
|
||||
uint32_t free_size = 0;
|
||||
|
||||
if ((size == 0U) || (pfifo == NULL) || (pbuf == NULL))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
free_size = fifo_get_free_size(pfifo);
|
||||
if (free_size == 0U)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (free_size < size)
|
||||
{
|
||||
size = free_size;
|
||||
}
|
||||
w_size = size;
|
||||
|
||||
if (pfifo->lock != NULL)
|
||||
{
|
||||
pfifo->lock();
|
||||
}
|
||||
|
||||
while (w_size-- > 0U)
|
||||
{
|
||||
*pfifo->pwrite++ = *pbuf++;
|
||||
if (pfifo->pwrite >= (pfifo->buf + pfifo->buf_size))
|
||||
{
|
||||
pfifo->pwrite = pfifo->buf;
|
||||
}
|
||||
pfifo->occupy_size++;
|
||||
}
|
||||
|
||||
if (pfifo->unlock != NULL)
|
||||
{
|
||||
pfifo->unlock();
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
uint32_t fifo_read(_fifo_t *pfifo, uint8_t *pbuf, uint32_t size)
|
||||
{
|
||||
uint32_t r_size = 0;
|
||||
uint32_t occupy_size = 0;
|
||||
|
||||
if ((size == 0U) || (pfifo == NULL) || (pbuf == NULL))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
occupy_size = fifo_get_occupy_size(pfifo);
|
||||
if (occupy_size == 0U)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (occupy_size < size)
|
||||
{
|
||||
size = occupy_size;
|
||||
}
|
||||
|
||||
if (pfifo->lock != NULL)
|
||||
{
|
||||
pfifo->lock();
|
||||
}
|
||||
|
||||
r_size = size;
|
||||
while (r_size-- > 0U)
|
||||
{
|
||||
*pbuf++ = *pfifo->pread++;
|
||||
if (pfifo->pread >= (pfifo->buf + pfifo->buf_size))
|
||||
{
|
||||
pfifo->pread = pfifo->buf;
|
||||
}
|
||||
pfifo->occupy_size--;
|
||||
}
|
||||
|
||||
if (pfifo->unlock != NULL)
|
||||
{
|
||||
pfifo->unlock();
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
uint32_t fifo_get_total_size(_fifo_t *pfifo)
|
||||
{
|
||||
if (pfifo == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return pfifo->buf_size;
|
||||
}
|
||||
|
||||
uint32_t fifo_get_free_size(_fifo_t *pfifo)
|
||||
{
|
||||
uint32_t size;
|
||||
if (pfifo == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
size = pfifo->buf_size - fifo_get_occupy_size(pfifo);
|
||||
return size;
|
||||
}
|
||||
|
||||
uint32_t fifo_get_occupy_size(_fifo_t *pfifo)
|
||||
{
|
||||
if (pfifo == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return pfifo->occupy_size;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
#ifndef RING_FIFO_H
|
||||
#define RING_FIFO_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
typedef void (*lock_fun)(void);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint8_t *buf;
|
||||
uint32_t buf_size;
|
||||
uint32_t occupy_size;
|
||||
uint8_t *pwrite;
|
||||
uint8_t *pread;
|
||||
void (*lock)(void);
|
||||
void (*unlock)(void);
|
||||
}_fifo_t;
|
||||
|
||||
void fifo_register(_fifo_t *pfifo, uint8_t *pfifo_buf, uint32_t size,
|
||||
lock_fun lock, lock_fun unlock);
|
||||
void fifo_release(_fifo_t *pfifo);
|
||||
uint32_t fifo_write(_fifo_t *pfifo, const uint8_t *pbuf, uint32_t size);
|
||||
uint32_t fifo_read(_fifo_t *pfifo, uint8_t *pbuf, uint32_t size);
|
||||
uint32_t fifo_get_total_size(_fifo_t *pfifo);
|
||||
uint32_t fifo_get_free_size(_fifo_t *pfifo);
|
||||
uint32_t fifo_get_occupy_size(_fifo_t *pfifo);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user