1 #include <klibc/string.h>
2 #include <lunaix/ds/fifo.h>
3 #include <lunaix/ds/mutex.h>
4 #include <lunaix/spike.h>
7 fifo_init(struct fifo_buf* buf, void* data_buffer, size_t buf_size, int flags)
9 *buf = (struct fifo_buf){ .data = data_buffer,
14 .free_len = buf_size };
15 mutex_init(&buf->lock);
19 fifo_clear(struct fifo_buf* fbuf)
21 mutex_lock(&fbuf->lock);
24 fbuf->free_len = fbuf->size;
25 mutex_unlock(&fbuf->lock);
29 fifo_backone(struct fifo_buf* fbuf)
31 mutex_lock(&fbuf->lock);
33 if (fbuf->free_len == fbuf->size) {
34 mutex_unlock(&fbuf->lock);
38 fbuf->wr_pos = (fbuf->wr_pos ? fbuf->wr_pos : fbuf->size) - 1;
41 mutex_unlock(&fbuf->lock);
47 fifo_putone(struct fifo_buf* fbuf, u8_t data)
49 mutex_lock(&fbuf->lock);
51 if (!fbuf->free_len) {
52 mutex_unlock(&fbuf->lock);
56 u8_t* dest = fbuf->data;
57 dest[fbuf->wr_pos] = data;
58 fbuf->wr_pos = (fbuf->wr_pos + 1) % fbuf->size;
61 mutex_unlock(&fbuf->lock);
67 fifo_readone_async(struct fifo_buf* fbuf, u8_t* data)
69 if (fbuf->free_len == fbuf->size) {
73 u8_t* dest = fbuf->data;
74 *data = dest[fbuf->rd_pos];
75 fbuf->rd_pos = (fbuf->rd_pos + 1) % fbuf->size;
82 fifo_readone(struct fifo_buf* fbuf, u8_t* data)
84 mutex_lock(&fbuf->lock);
85 size_t retval = fifo_readone_async(fbuf, data);
86 mutex_unlock(&fbuf->lock);
92 fifo_set_rdptr(struct fifo_buf* fbuf, size_t rdptr)
95 if (rdptr <= fbuf->wr_pos) {
96 fbuf->free_len = fbuf->size - fbuf->wr_pos + rdptr;
98 fbuf->free_len = rdptr - fbuf->wr_pos;
103 fifo_set_wrptr(struct fifo_buf* fbuf, size_t wrptr)
105 fbuf->wr_pos = wrptr;
106 if (wrptr <= fbuf->rd_pos) {
107 fbuf->free_len = fbuf->size - fbuf->rd_pos + wrptr;
109 fbuf->free_len = wrptr - fbuf->rd_pos;
114 fifo_write(struct fifo_buf* fbuf, void* data, size_t count)
116 size_t wr_count = 0, wr_pos = fbuf->wr_pos;
122 mutex_lock(&fbuf->lock);
124 if (!fbuf->free_len) {
125 mutex_unlock(&fbuf->lock);
129 if (wr_pos >= fbuf->rd_pos) {
131 size_t cplen_tail = MIN(fbuf->size - wr_pos, count);
132 size_t cplen_head = MIN(fbuf->rd_pos, count - cplen_tail);
133 memcpy(fbuf->data + wr_pos, data, cplen_tail);
134 memcpy(fbuf->data, data + cplen_tail, cplen_head);
136 wr_count = cplen_head + cplen_tail;
139 wr_count = MIN(fbuf->rd_pos - wr_pos, count);
140 memcpy(fbuf->data + wr_pos, data, wr_count);
143 fbuf->wr_pos = (wr_pos + wr_count) % fbuf->size;
144 fbuf->free_len -= wr_count;
146 mutex_unlock(&fbuf->lock);
152 fifo_read(struct fifo_buf* fbuf, void* buf, size_t count)
154 size_t rd_count = 0, rd_pos = fbuf->rd_pos;
155 mutex_lock(&fbuf->lock);
157 if (fbuf->free_len == fbuf->size) {
158 mutex_unlock(&fbuf->lock);
162 if (rd_pos >= fbuf->wr_pos) {
163 size_t cplen_tail = MIN(fbuf->size - rd_pos, count);
164 size_t cplen_head = MIN(fbuf->wr_pos, count - cplen_tail);
165 memcpy(buf, fbuf->data + rd_pos, cplen_tail);
166 memcpy(buf + cplen_tail, fbuf->data, cplen_head);
168 rd_count = cplen_head + cplen_tail;
170 rd_count = MIN(fbuf->wr_pos - rd_pos, count);
171 memcpy(buf, fbuf->data + rd_pos, rd_count);
174 fbuf->rd_pos = (rd_pos + rd_count) % fbuf->size;
175 fbuf->free_len += rd_count;
177 mutex_unlock(&fbuf->lock);