]> git.tdb.fi Git - model-railway-devices.git/blob - firmware/serial.c
Add some utility functions for interfacing with hardware
[model-railway-devices.git] / firmware / serial.c
1 #include <avr/io.h>
2 #include <avr/interrupt.h>
3 #include "serial.h"
4
5 #define BIT(n) (1<<(n))
6
7 static SerialCallback *serial_callback = 0;
8
9 void serial_init(uint16_t baud)
10 {
11         DDRD = (DDRD&~0x03) | 0x02;
12         PORTD &= ~0x03;
13
14         baud = (F_CPU/16+baud/2)/baud-1;
15         UBRR0H = baud>>8;
16         UBRR0L = baud;
17         UCSR0C = BIT(UCSZ00) | BIT(UCSZ01);  // 8N1
18         UCSR0B = BIT(RXEN0) | BIT(TXEN0);
19 }
20
21 void serial_set_callback(SerialCallback *cb)
22 {
23         serial_callback = cb;
24         UCSR0B |= BIT(RXCIE0);
25 }
26
27 void serial_write(uint8_t c)
28 {
29         while(!(UCSR0A&(1<<UDRE0))) ;
30         UDR0 = c;
31 }
32
33 ISR(USART_RX_vect)
34 {
35         serial_callback(UDR0);
36 }