git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
feat: serial device interfacing
[lunaix-os.git]
/
lunaix-os
/
kernel
/
ds
/
fifo.c
diff --git
a/lunaix-os/kernel/ds/fifo.c
b/lunaix-os/kernel/ds/fifo.c
index 7f34bf63132900953a890e1795c44050b478adf5..5ecddad57b00a6c70bd78dd3629b9cb4e505e957 100644
(file)
--- a/
lunaix-os/kernel/ds/fifo.c
+++ b/
lunaix-os/kernel/ds/fifo.c
@@
-15,6
+15,16
@@
fifo_init(struct fifo_buf* buf, void* data_buffer, size_t buf_size, int flags)
mutex_init(&buf->lock);
}
mutex_init(&buf->lock);
}
+void
+fifo_clear(struct fifo_buf* fbuf)
+{
+ mutex_lock(&fbuf->lock);
+ fbuf->rd_pos = 0;
+ fbuf->wr_pos = 0;
+ fbuf->free_len = fbuf->size;
+ mutex_unlock(&fbuf->lock);
+}
+
int
fifo_backone(struct fifo_buf* fbuf)
{
int
fifo_backone(struct fifo_buf* fbuf)
{
@@
-34,7
+44,7
@@
fifo_backone(struct fifo_buf* fbuf)
}
size_t
}
size_t
-fifo_putone(struct fifo_buf* fbuf, u
int
8_t data)
+fifo_putone(struct fifo_buf* fbuf, u8_t data)
{
mutex_lock(&fbuf->lock);
{
mutex_lock(&fbuf->lock);
@@
-43,7
+53,7
@@
fifo_putone(struct fifo_buf* fbuf, uint8_t data)
return 0;
}
return 0;
}
- u
int
8_t* dest = fbuf->data;
+ u8_t* dest = fbuf->data;
dest[fbuf->wr_pos] = data;
fbuf->wr_pos = (fbuf->wr_pos + 1) % fbuf->size;
fbuf->free_len--;
dest[fbuf->wr_pos] = data;
fbuf->wr_pos = (fbuf->wr_pos + 1) % fbuf->size;
fbuf->free_len--;
@@
-54,13
+64,13
@@
fifo_putone(struct fifo_buf* fbuf, uint8_t data)
}
size_t
}
size_t
-fifo_readone_async(struct fifo_buf* fbuf, u
int
8_t* data)
+fifo_readone_async(struct fifo_buf* fbuf, u8_t* data)
{
if (fbuf->free_len == fbuf->size) {
return 0;
}
{
if (fbuf->free_len == fbuf->size) {
return 0;
}
- u
int
8_t* dest = fbuf->data;
+ u8_t* dest = fbuf->data;
*data = dest[fbuf->rd_pos];
fbuf->rd_pos = (fbuf->rd_pos + 1) % fbuf->size;
fbuf->free_len++;
*data = dest[fbuf->rd_pos];
fbuf->rd_pos = (fbuf->rd_pos + 1) % fbuf->size;
fbuf->free_len++;
@@
-68,6
+78,16
@@
fifo_readone_async(struct fifo_buf* fbuf, uint8_t* data)
return 1;
}
return 1;
}
+size_t
+fifo_readone(struct fifo_buf* fbuf, u8_t* data)
+{
+ mutex_lock(&fbuf->lock);
+ size_t retval = fifo_readone_async(fbuf, data);
+ mutex_unlock(&fbuf->lock);
+
+ return retval;
+}
+
void
fifo_set_rdptr(struct fifo_buf* fbuf, size_t rdptr)
{
void
fifo_set_rdptr(struct fifo_buf* fbuf, size_t rdptr)
{
@@
-95,6
+115,10
@@
fifo_write(struct fifo_buf* fbuf, void* data, size_t count)
{
size_t wr_count = 0, wr_pos = fbuf->wr_pos;
{
size_t wr_count = 0, wr_pos = fbuf->wr_pos;
+ if (!count) {
+ return 0;
+ }
+
mutex_lock(&fbuf->lock);
if (!fbuf->free_len) {
mutex_lock(&fbuf->lock);
if (!fbuf->free_len) {