Switch from GPLv2 to GPLv2+
[fw/altos] / src / avr / ao_serial_avr.c
index dcee246ce3eb66191e393708aeee88858dc7ef34..ab82b7b1d67bdcb8708dc188bd08d24078fecd71 100644 (file)
@@ -3,7 +3,8 @@
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -59,52 +60,51 @@ ISR(USART1_UDRE_vect)
        ao_wakeup(&ao_serial1_tx_fifo);
 }
 
-char
-ao_serial1_getchar(void) __critical
-{
-       char    c;
-       cli();
-       while (ao_fifo_empty(ao_serial1_rx_fifo))
-               ao_sleep(&ao_serial1_rx_fifo);
-       ao_fifo_remove(ao_serial1_rx_fifo, c);
-       sei();
-       return c;
-}
-
 #if USE_SERIAL_1_STDIN
-char
-ao_serial1_pollchar(void) __critical
+int
+_ao_serial1_pollchar(void)
 {
        char    c;
-       cli();
        if (ao_fifo_empty(ao_serial1_rx_fifo)) {
                sei();
                return AO_READ_AGAIN;
        }
        ao_fifo_remove(ao_serial1_rx_fifo,c);
-       sei();
        return c;
 }
 #endif
 
+char
+ao_serial1_getchar(void) __critical
+{
+       char    c;
+
+       ao_arch_block_interrupts();
+       while (ao_fifo_empty(ao_serial1_rx_fifo))
+               ao_sleep(&ao_serial1_rx_fifo);
+       ao_fifo_remove(ao_serial1_rx_fifo, c);
+       ao_arch_release_interrupts();
+       return c;
+}
+
 void
-ao_serial1_putchar(char c) __critical
+ao_serial1_putchar(char c)
 {
-       cli();
+       ao_arch_block_interrupts();
        while (ao_fifo_full(ao_serial1_tx_fifo))
                ao_sleep(&ao_serial1_tx_fifo);
        ao_fifo_insert(ao_serial1_tx_fifo, c);
        ao_serial_tx1_start();
-       sei();
+       ao_arch_release_interrupts();
 }
 
 void
 ao_serial1_drain(void) __critical
 {
-       cli();
+       ao_arch_block_interrupts();
        while (!ao_fifo_empty(ao_serial1_tx_fifo))
                ao_sleep(&ao_serial1_tx_fifo);
-       sei();
+       ao_arch_release_interrupts();
 }
 
 static const struct {
@@ -155,7 +155,7 @@ ao_serial_init(void)
                  (1 << RXCIE1) |       /* Enable receive interrupts */
                  (1 << UDRIE1));       /* Enable transmit empty interrupts */
 #if USE_SERIAL_1_STDIN
-       ao_add_stdio(ao_serial1_pollchar,
+       ao_add_stdio(_ao_serial1_pollchar,
                     ao_serial1_putchar,
                     NULL);
 #endif