]> cloudbase.mooo.com Git - z180-stamp.git/blobdiff - avr/serial.c
Detect ZRESET polarity
[z180-stamp.git] / avr / serial.c
index 2d2c5515ddba3c4f441d48b712fbbfe62cd1bd16..adbc3c430e91f0aaa01ce7bf18b433ff298976a1 100644 (file)
@@ -1,4 +1,7 @@
 /*
+ * (C) Copyright 2014 Leo C. <erbl259-lmu@yahoo.de>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <avr/io.h>
 
 
 static int _write(char c, FILE *stream);
-static FILE mystdout = FDEV_SETUP_STREAM(_write, 
+static FILE mystdout = FDEV_SETUP_STREAM(_write,
                NULL, _FDEV_SETUP_WRITE);
 
 
 
-#define BUFFER_SIZE 64
+#define BUFFER_SIZE 128
 
 #if ((BUFFER_SIZE-1) & BUFFER_SIZE)
 # error: BUFFER_SIZE not power of 2
 #endif
 
 #if ((BUFFER_SIZE) > 256)
-# error: BUFFER_SIZE 
+# error: BUFFER_SIZE
 #endif
 
 struct ring rx_ring;
@@ -36,7 +39,7 @@ uint8_t tx_ring_buffer[BUFFER_SIZE];
 
 /* Initialize UART */
 
-void usart0_setup(void) {
+void usart0_setup(unsigned long baud) {
 
        ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
 
@@ -48,7 +51,7 @@ void usart0_setup(void) {
                ring_init(&tx_ring, tx_ring_buffer, BUFFER_SIZE);
 
                UCSR0A = 0;
-               UBRR0  = F_CPU / BAUD / 16 - 1;
+               UBRR0  = F_CPU / baud / 16 - 1;
                UCSR0B = _BV(RXCIE0) | _BV(RXEN0) | _BV(TXEN0);
                UCSR0C = 3 << UCSZ00;
        };
@@ -82,10 +85,10 @@ ISR(USART0_UDRE_vect)
 
 /*--------------------------------------------------------------------------*/
 
-void serial_setup(void)
+void serial_setup(unsigned long baud)
 {
        stdout = &mystdout;
-       usart0_setup();
+       usart0_setup(baud);
 }
 
 /*--------------------------------------------------------------------------*/
@@ -106,7 +109,7 @@ int serial_getc(void)
        return ring_read_ch(&rx_ring);
 }
 
-void serial_putc(uint8_t data)
+void serial_putc(char data)
 {
        while (ring_write_ch(&tx_ring, data) < 0)
                ;
@@ -115,3 +118,7 @@ void serial_putc(uint8_t data)
        UCSR0B = _BV(RXCIE0) | _BV(RXEN0) | _BV(TXEN0) | _BV(UDRIE0);
 }
 
+uint_fast8_t serial_tstc(void)
+{
+       return !ring_is_empty(&rx_ring);
+}