]>
cloudbase.mooo.com Git - z180-stamp.git/blob - avr/serial.c
5 #include <avr/interrupt.h>
6 #include <util/atomic.h>
14 static int _write(char c
, FILE *stream
);
15 static FILE mystdout
= FDEV_SETUP_STREAM(_write
,
16 NULL
, _FDEV_SETUP_WRITE
);
20 #define BUFFER_SIZE 128
22 #if ((BUFFER_SIZE-1) & BUFFER_SIZE)
23 # error: BUFFER_SIZE not power of 2
26 #if ((BUFFER_SIZE) > 256)
32 uint8_t rx_ring_buffer
[BUFFER_SIZE
];
33 uint8_t tx_ring_buffer
[BUFFER_SIZE
];
39 void usart0_setup(unsigned long baud
) {
41 ATOMIC_BLOCK(ATOMIC_RESTORESTATE
) {
43 PRR0
&= ~_BV(PRUSART0
);
46 /* Initialize ring buffers. */
47 ring_init(&rx_ring
, rx_ring_buffer
, BUFFER_SIZE
);
48 ring_init(&tx_ring
, tx_ring_buffer
, BUFFER_SIZE
);
51 UBRR0
= F_CPU
/ baud
/ 16 - 1;
52 UCSR0B
= _BV(RXCIE0
) | _BV(RXEN0
) | _BV(TXEN0
);
57 /*--------------------------------------------------------------------------*/
59 /* UART RXC interrupt */
66 ring_write_ch(&rx_ring
, d
);
69 /* UART UDRE interrupt */
73 int d
= ring_read_ch(&tx_ring
);
76 /* Disable TX empty interrupt. */
77 UCSR0B
= _BV(RXCIE0
) | _BV(RXEN0
) | _BV(TXEN0
);
83 /*--------------------------------------------------------------------------*/
85 void serial_setup(unsigned long baud
)
91 /*--------------------------------------------------------------------------*/
93 int _write(char c
, FILE *stream
)
104 int serial_getc(void)
106 return ring_read_ch(&rx_ring
);
109 void serial_putc(char data
)
111 while (ring_write_ch(&tx_ring
, data
) < 0)
114 /* Enable the TXE interrupt. */
115 UCSR0B
= _BV(RXCIE0
) | _BV(RXEN0
) | _BV(TXEN0
) | _BV(UDRIE0
);
118 uint_fast8_t serial_tstc(void)
120 return !ring_is_empty(&rx_ring
);