]>
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 UBRR0
= (F_CPU
+ (baud
/2) + 8) / baud
/ 16 - 1;
50 UCSR0B
= _BV(RXCIE0
) | _BV(RXEN0
) | _BV(TXEN0
);
53 /* Initialize ring buffers. */
54 ring_init(&rx_ring
, rx_ring_buffer
, BUFFER_SIZE
);
55 ring_init(&tx_ring
, tx_ring_buffer
, BUFFER_SIZE
);
59 /*--------------------------------------------------------------------------*/
61 /* UART RXC interrupt */
68 ring_write_ch(&rx_ring
, d
);
71 /* UART UDRE interrupt */
75 int d
= ring_read_ch(&tx_ring
);
78 /* Disable TX empty interrupt. */
79 UCSR0B
= _BV(RXCIE0
) | _BV(RXEN0
) | _BV(TXEN0
);
85 /*--------------------------------------------------------------------------*/
87 void serial_setup(unsigned long baud
)
93 /*--------------------------------------------------------------------------*/
95 int _write(char c
, FILE *stream
)
106 int serial_getc(void)
108 return ring_read_ch(&rx_ring
);
111 void serial_putc(char data
)
113 while (ring_write_ch(&tx_ring
, data
) < 0)
116 /* Enable the TXE interrupt. */
117 UCSR0B
= _BV(RXCIE0
) | _BV(RXEN0
) | _BV(TXEN0
) | _BV(UDRIE0
);
120 uint_fast8_t serial_tstc(void)
122 return !ring_is_empty(&rx_ring
);