]>
cloudbase.mooo.com Git - z180-stamp.git/blob - avr/serial.c
2 * (C) Copyright 2014 Leo C. <erbl259-lmu@yahoo.de>
4 * SPDX-License-Identifier: GPL-2.0+
8 #include <avr/interrupt.h>
9 #include <util/atomic.h>
17 static int _write(char c
, FILE *stream
);
18 static FILE mystdout
= FDEV_SETUP_STREAM(_write
,
19 NULL
, _FDEV_SETUP_WRITE
);
23 #define BUFFER_SIZE 128
25 #if ((BUFFER_SIZE-1) & BUFFER_SIZE)
26 # error: BUFFER_SIZE not power of 2
29 #if ((BUFFER_SIZE) > 256)
35 uint8_t rx_ring_buffer
[BUFFER_SIZE
];
36 uint8_t tx_ring_buffer
[BUFFER_SIZE
];
42 void usart0_setup(unsigned long baud
) {
44 ATOMIC_BLOCK(ATOMIC_RESTORESTATE
) {
46 PRR0
&= ~_BV(PRUSART0
);
49 /* Initialize ring buffers. */
50 ring_init(&rx_ring
, rx_ring_buffer
, BUFFER_SIZE
);
51 ring_init(&tx_ring
, tx_ring_buffer
, BUFFER_SIZE
);
54 UBRR0
= F_CPU
/ baud
/ 16 - 1;
55 UCSR0B
= _BV(RXCIE0
) | _BV(RXEN0
) | _BV(TXEN0
);
60 /*--------------------------------------------------------------------------*/
62 /* UART RXC interrupt */
69 ring_write_ch(&rx_ring
, d
);
72 /* UART UDRE interrupt */
76 int d
= ring_read_ch(&tx_ring
);
79 /* Disable TX empty interrupt. */
80 UCSR0B
= _BV(RXCIE0
) | _BV(RXEN0
) | _BV(TXEN0
);
86 /*--------------------------------------------------------------------------*/
88 void serial_setup(unsigned long baud
)
94 /*--------------------------------------------------------------------------*/
96 int _write(char c
, FILE *stream
)
107 int serial_getc(void)
109 return ring_read_ch(&rx_ring
);
112 void serial_putc(char data
)
114 while (ring_write_ch(&tx_ring
, data
) < 0)
117 /* Enable the TXE interrupt. */
118 UCSR0B
= _BV(RXCIE0
) | _BV(RXEN0
) | _BV(TXEN0
) | _BV(UDRIE0
);
121 uint_fast8_t serial_tstc(void)
123 return !ring_is_empty(&rx_ring
);