aboutsummaryrefslogtreecommitdiff
path: root/src/components/uart
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/uart')
-rw-r--r--src/components/uart/simple_uart.c42
1 files changed, 34 insertions, 8 deletions
diff --git a/src/components/uart/simple_uart.c b/src/components/uart/simple_uart.c
index 5c97ccd..1528a70 100644
--- a/src/components/uart/simple_uart.c
+++ b/src/components/uart/simple_uart.c
@@ -3,17 +3,42 @@
struct simple_uart {
struct component component;
+
+ struct component *send;
+ struct packet pkt;
+ bool busy;
};
-static stat simple_uart_write(struct simple_uart *uart, struct packet *pkt)
+static stat simple_uart_clock(struct simple_uart *uart)
{
- (void)uart;
- size_t size = packet_size(pkt);
- if (size != 1)
- return EBUS;
+ if (!uart->busy)
+ return OK;
+
+ stat r = SEND(uart, uart->send, uart->pkt);
+ if (r == EBUSY)
+ return OK;
+
+ uart->busy = false;
+ return OK;
+}
+
+static stat simple_uart_receive(struct simple_uart *uart, struct component *from, struct packet pkt)
+{
+ if (uart->busy)
+ return EBUSY;
+
+ uart->busy = true;
+ uart->send = from;
+ uart->pkt = response(pkt);
+
+ size_t size = packet_convsize(&pkt);
+ if (size != 1) {
+ set_flags(&uart->pkt, PACKET_ERROR);
+ return OK;
+ }
- putchar(*(uint8_t *)packet_data(pkt));
- packet_set_state(pkt, PACKET_DONE);
+ putchar(packet_convu8(&pkt));
+ set_flags(&uart->pkt, PACKET_DONE);
return OK;
}
@@ -23,6 +48,7 @@ struct component *create_simple_uart()
if (!uart)
return NULL;
- uart->component.write = (write_callback)simple_uart_write;
+ uart->component.receive = (receive_callback)simple_uart_receive;
+ uart->component.clock = (clock_callback)simple_uart_clock;
return (struct component *)uart;
}