#define RING_BUFFER_LEN (1024*1024)
#define RING_BUFFER_LEN (1024*1024)
typedef struct {
uint64_t _total_write_size;
uint64_t _total_read_size;
uint32_t _readp;
uint32_t _writep;
uint8_t _full_flag;
uint8_t _buff[RING_BUFFER_LEN];
} ring_buffer;
ring_buffer g_rb;
static int g_full_flag=0;
void ring_buffer_init(ring_buffer* rb) {
rb->_full_flag=0;
rb->_total_write_size=0;
rb->_total_read_size=0;
g_full_flag=0;
rb->_readp=0;
rb->_writep=0;
memset((void*)rb->_buff,0,sizeof(rb->_buff));
}
unsigned int ring_buffer_write(ring_buffer* rb, const uint8_t* data, unsigned int count) {
uint32_t i;
rb->_total_write_size+=count;
for(i=0;i<count;i++)
{
if (((rb->_writep + 1) % RING_BUFFER_LEN) == rb->_readp)
{
rb->_full_flag = 1;
g_full_flag = 1;
rb->_readp = ((rb->_readp + 1) % RING_BUFFER_LEN);
}
memcpy(&rb->_buff[rb->_writep], &data[i], sizeof(uint8_t));
//printk(KERN_ERR"rb->_buff[rb->_writep]=%d\n",rb->_buff[rb->_writep]);
rb->_writep = ((rb->_writep + 1) % RING_BUFFER_LEN);
}
return i;
}
unsigned int GetBuffAvailableSize(ring_buffer* rb)
{
if (rb->_readp > rb->_writep)
{
return (rb->_writep + RING_BUFFER_LEN - rb->_readp);
}
else
{
return (rb->_writep - rb->_readp);
}
}
unsigned int ring_buffer_read(ring_buffer* rb, uint8_t* data, unsigned int count) {
uint32_t i,g_buf_num = 0;
g_buf_num = GetBuffAvailableSize(rb);
if((count > g_buf_num)){
count = g_buf_num ;
}
for(i=0;i<count;i++)
{
if (((rb->_readp) % RING_BUFFER_LEN) == rb->_writep)
return i;
memcpy((void*)&data[i], (void*)&rb->_buff[rb->_readp], sizeof(uint8_t));
//printk(KERN_ERR"data[i]=%x,%d\n",data[i],rb->_readp);
if(true)
rb->_readp = ((rb->_readp + 1) % RING_BUFFER_LEN);
rb->_total_read_size++;
}
//printk(KERN_ERR"i=%d\n",i);
return i;
}