aboutsummaryrefslogtreecommitdiff
path: root/kernel/serial/include
diff options
context:
space:
mode:
authorJakob Odersky <jodersky@gmail.com>2014-01-25 14:47:07 +0100
committerJakob Odersky <jodersky@gmail.com>2014-01-25 14:47:07 +0100
commit7dd00b2267d991a102f18eacf3e2afacb570a299 (patch)
tree9138bc7ce4feba262a20063f94aceaba3ec30788 /kernel/serial/include
parent9453a44cfc475b57319d1051c74f72753ca4f64c (diff)
downloadmux-7dd00b2267d991a102f18eacf3e2afacb570a299.tar.gz
mux-7dd00b2267d991a102f18eacf3e2afacb570a299.tar.bz2
mux-7dd00b2267d991a102f18eacf3e2afacb570a299.zip
implement serial
Diffstat (limited to 'kernel/serial/include')
-rw-r--r--kernel/serial/include/serial/serial.h42
1 files changed, 42 insertions, 0 deletions
diff --git a/kernel/serial/include/serial/serial.h b/kernel/serial/include/serial/serial.h
new file mode 100644
index 0000000..f6fcfc5
--- /dev/null
+++ b/kernel/serial/include/serial/serial.h
@@ -0,0 +1,42 @@
+#ifndef SERIAL_H
+#define SERIAL_H
+
+#include <stddef.h>
+#include "collection/rbuffer.h"
+#include "collection/list.h"
+
+#define USARTS 1
+#define SERIAL_BUFFER_SIZE 64
+
+struct serial_device_t {
+ volatile char __rx_buffer[SERIAL_BUFFER_SIZE];
+ volatile char __tx_buffer[SERIAL_BUFFER_SIZE];
+
+ struct rbuffer_t rx_buffer;
+ struct rbuffer_t tx_buffer;
+
+ struct list_head rx_q;
+ struct list_head tx_q;
+};
+
+#define SERIAL_DEVICE_INIT(name) \
+ { \
+ .rx_buffer = RBUFFER_ARRAY_INIT(name.__rx_buffer, SERIAL_BUFFER_SIZE), \
+ .tx_buffer = RBUFFER_ARRAY_INIT(name.__tx_buffer, SERIAL_BUFFER_SIZE), \
+ .rx_q = LIST_HEAD_INIT(name.rx_q), \
+ .tx_q = LIST_HEAD_INIT(name.tx_q) \
+ }
+
+void serial_init(unsigned long baud);
+
+size_t serial_read(char* const data, size_t size);
+
+size_t serial_write(const char* const data, size_t size);
+
+inline void serial_write_str(const char* const str) {
+ size_t length = 0;
+ for (length = 0; str[length] != 0; ++length){}
+ serial_write(str, length);
+}
+
+#endif \ No newline at end of file