200 lines
4.3 KiB
C
200 lines
4.3 KiB
C
#ifdef SUPPORT_MS_EXTENSIONS_APP
|
|
#pragma bss_seg(".cbuf.data.bss")
|
|
#pragma data_seg(".cbuf.data")
|
|
#pragma const_seg(".cbuf.text.const")
|
|
#pragma code_seg(".cbuf.text")
|
|
#endif
|
|
#include "lib_include.h"
|
|
#include "circular_buf.h"
|
|
#if 1
|
|
#define CPU_SR_ALLOC()
|
|
|
|
//#pragma code_seg(".cbuf_code")
|
|
|
|
u32 cbuf_read(cbuffer_t *cbuffer, void *buf, u32 len)
|
|
{
|
|
CPU_SR_ALLOC();
|
|
u32 r_len = len;
|
|
u32 copy_len;
|
|
|
|
if (!cbuffer) {
|
|
return 0;
|
|
}
|
|
|
|
if ((u32)cbuffer->read_ptr >= (u32)cbuffer->end) {
|
|
cbuffer->read_ptr = (u8 *)cbuffer->begin;
|
|
}
|
|
|
|
if (cbuffer->data_len < len) {
|
|
/* memset(buf, 0, len); */
|
|
return 0;
|
|
}
|
|
|
|
|
|
copy_len = (u32)cbuffer->end - (u32)cbuffer->read_ptr;
|
|
if (copy_len > len) {
|
|
copy_len = len;
|
|
}
|
|
len -= copy_len;
|
|
|
|
memcpy(buf, cbuffer->read_ptr, copy_len);
|
|
//printf_data(cbuffer->read_ptr,copy_len) ;
|
|
|
|
if (len == 0) {
|
|
cbuffer->read_ptr += copy_len;
|
|
} else {
|
|
memcpy((u8 *)buf + copy_len, cbuffer->begin, len);
|
|
//printf_data(cbuffer->begin,len);
|
|
cbuffer->read_ptr = cbuffer->begin + len;
|
|
}
|
|
|
|
local_irq_disable();
|
|
cbuffer->tmp_len = cbuffer->data_len -= r_len;
|
|
|
|
cbuffer->tmp_len = cbuffer->data_len;
|
|
|
|
local_irq_enable();
|
|
|
|
return r_len;
|
|
}
|
|
|
|
u32 cbuf_is_write_able(cbuffer_t *cbuffer, u32 len)
|
|
{
|
|
u32 w_len;
|
|
|
|
if (!cbuffer) {
|
|
return 0;
|
|
}
|
|
w_len = cbuffer->total_len - cbuffer->data_len;
|
|
if (w_len < len) {
|
|
return 0;
|
|
}
|
|
|
|
return w_len;
|
|
}
|
|
|
|
|
|
u32 cbuf_write(cbuffer_t *cbuffer, void *buf, u32 len)
|
|
{
|
|
CPU_SR_ALLOC();
|
|
u32 length;
|
|
u32 remain_len;
|
|
|
|
if (!cbuffer) {
|
|
return 0;
|
|
}
|
|
|
|
if ((cbuffer->total_len - cbuffer->data_len) < len) {
|
|
len = cbuffer->total_len - cbuffer->data_len ;
|
|
if (len == 0) {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
length = (u32)cbuffer->end - (u32)cbuffer->write_ptr;
|
|
if (length >= len) {
|
|
memcpy(cbuffer->write_ptr, buf, len);
|
|
cbuffer->write_ptr += len;
|
|
} else {
|
|
remain_len = len - length;
|
|
memcpy(cbuffer->write_ptr, buf, length);
|
|
memcpy(cbuffer->begin, ((u8 *)buf) + length, remain_len);
|
|
cbuffer->write_ptr = (u8 *)cbuffer->begin + remain_len;
|
|
}
|
|
|
|
local_irq_disable();
|
|
cbuffer->data_len += len;
|
|
cbuffer->tmp_len = cbuffer->data_len ;
|
|
cbuffer->tmp_ptr = cbuffer->write_ptr ;
|
|
local_irq_enable();
|
|
|
|
return len;
|
|
}
|
|
|
|
void cbuf_init(cbuffer_t *cbuffer, void *buf, u32 size)
|
|
{
|
|
cbuffer->data_len = 0;
|
|
cbuffer->tmp_len = 0 ;
|
|
cbuffer->begin = buf;
|
|
cbuffer->read_ptr = buf;
|
|
cbuffer->write_ptr = buf;
|
|
cbuffer->tmp_ptr = buf;
|
|
cbuffer->end = (u8 *)buf + size;
|
|
cbuffer->total_len = size;
|
|
}
|
|
|
|
void cbuf_clear(cbuffer_t *cbuffer)
|
|
{
|
|
CPU_SR_ALLOC();
|
|
local_irq_disable();
|
|
cbuffer->read_ptr = cbuffer->begin;
|
|
cbuffer->tmp_ptr = cbuffer->write_ptr = cbuffer->begin;
|
|
cbuffer->data_len = 0;
|
|
cbuffer->tmp_len = 0 ;
|
|
local_irq_enable();
|
|
}
|
|
|
|
u32 cbuf_get_data_size(cbuffer_t *cbuffer)
|
|
{
|
|
//printf(">>cbuf_dat_len:%x\n",cbuffer->data_len);
|
|
return cbuffer->data_len;
|
|
}
|
|
|
|
#define CBUF_ENTER_CRITICAL local_irq_disable
|
|
#define CBUF_EXIT_CRITICAL local_irq_enable
|
|
|
|
void cbuf_read_alloc_len_updata(cbuffer_t *cbuffer, u32 len)
|
|
{
|
|
CBUF_ENTER_CRITICAL();
|
|
|
|
cbuffer->read_ptr += len;
|
|
if ((u32)cbuffer->read_ptr >= (u32)cbuffer->end) {
|
|
cbuffer->read_ptr = (u8 *)cbuffer->begin + ((u32)cbuffer->read_ptr - (u32)cbuffer->end);
|
|
}
|
|
|
|
cbuffer->tmp_len = cbuffer->data_len -= len;
|
|
|
|
CBUF_EXIT_CRITICAL();
|
|
}
|
|
u32 cbuf_read_alloc_len(cbuffer_t *cbuffer, void *buf, u32 len)
|
|
{
|
|
u32 r_len = len;
|
|
u32 copy_len;
|
|
|
|
if (!cbuffer) {
|
|
return 0;
|
|
}
|
|
|
|
if ((u32)cbuffer->read_ptr >= (u32)cbuffer->end) {
|
|
cbuffer->read_ptr = (u8 *)cbuffer->begin;
|
|
}
|
|
|
|
if (cbuffer->data_len < len) {
|
|
/* memset(buf, 0, len); */
|
|
return 0;
|
|
}
|
|
|
|
|
|
copy_len = (u32)cbuffer->end - (u32)cbuffer->read_ptr;
|
|
if (copy_len > len) {
|
|
copy_len = len;
|
|
}
|
|
len -= copy_len;
|
|
|
|
memcpy(buf, cbuffer->read_ptr, copy_len);
|
|
//printf_data(cbuffer->read_ptr,copy_len) ;
|
|
|
|
if (len == 0) {
|
|
/* cbuffer->read_ptr += copy_len; */
|
|
} else {
|
|
memcpy((u8 *)buf + copy_len, cbuffer->begin, len);
|
|
//printf_data(cbuffer->begin,len);
|
|
/* cbuffer->read_ptr = cbuffer->begin + len; */
|
|
}
|
|
|
|
return r_len;
|
|
}
|
|
|
|
#endif
|