]> git.tdb.fi Git - model-railway-devices.git/blobdiff - firmware/serial.c
Add some utility functions for interfacing with hardware
[model-railway-devices.git] / firmware / serial.c
diff --git a/firmware/serial.c b/firmware/serial.c
new file mode 100644 (file)
index 0000000..b7219ae
--- /dev/null
@@ -0,0 +1,36 @@
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include "serial.h"
+
+#define BIT(n) (1<<(n))
+
+static SerialCallback *serial_callback = 0;
+
+void serial_init(uint16_t baud)
+{
+       DDRD = (DDRD&~0x03) | 0x02;
+       PORTD &= ~0x03;
+
+       baud = (F_CPU/16+baud/2)/baud-1;
+       UBRR0H = baud>>8;
+       UBRR0L = baud;
+       UCSR0C = BIT(UCSZ00) | BIT(UCSZ01);  // 8N1
+       UCSR0B = BIT(RXEN0) | BIT(TXEN0);
+}
+
+void serial_set_callback(SerialCallback *cb)
+{
+       serial_callback = cb;
+       UCSR0B |= BIT(RXCIE0);
+}
+
+void serial_write(uint8_t c)
+{
+       while(!(UCSR0A&(1<<UDRE0))) ;
+       UDR0 = c;
+}
+
+ISR(USART_RX_vect)
+{
+       serial_callback(UDR0);
+}