altos: Make stdio 8-bit clean by making pollchar return int
authorKeith Packard <keithp@keithp.com>
Sat, 1 Dec 2012 00:01:07 +0000 (16:01 -0800)
committerKeith Packard <keithp@keithp.com>
Sat, 1 Dec 2012 00:01:07 +0000 (16:01 -0800)
We were stealing one value (0xff) in the return value from pollchar to
indicate 'not ready yet'. Instead of doing that, use the integer value
-1 and have pollchar return an int instead of a char. That
necessitated cleaning a few other bits to make sure that 0xff wouldn't
get promoted to -1 on accident.

Signed-off-by: Keith Packard <keithp@keithp.com>
13 files changed:
src/avr/ao_usb_avr.c
src/cc1111/ao_serial.c
src/cc1111/ao_usb.c
src/core/ao.h
src/core/ao_packet.h
src/core/ao_serial.h
src/core/ao_stdio.c
src/core/ao_usb.h
src/drivers/ao_packet.c
src/stm/ao_arch.h
src/stm/ao_arch_funcs.h
src/stm/ao_serial_stm.c
src/stm/ao_usb_stm.c

index 9ba407a..2ef546c 100644 (file)
@@ -480,10 +480,10 @@ ao_usb_putchar(char c) __critical __reentrant
        ao_usb_in_flushed = 0;
 }
 
-static char
+static int
 _ao_usb_pollchar(void)
 {
-       char c;
+       uint8_t c;
        uint8_t intx;
 
        if (!ao_usb_running)
@@ -517,10 +517,10 @@ _ao_usb_pollchar(void)
        return c;
 }
 
-char
+int
 ao_usb_pollchar(void)
 {
-       char    c;
+       int     c;
        cli();
        c = _ao_usb_pollchar();
        sei();
@@ -530,7 +530,7 @@ ao_usb_pollchar(void)
 char
 ao_usb_getchar(void) __critical
 {
-       char    c;
+       int     c;
 
        cli();
        while ((c = _ao_usb_pollchar()) == AO_READ_AGAIN)
index 4838380..2a93bf5 100644 (file)
@@ -85,10 +85,10 @@ ao_serial0_getchar(void) __critical
 }
 
 #if USE_SERIAL_0_STDIN
-char
+int
 ao_serial0_pollchar(void) __critical
 {
-       char    c;
+       uint8_t c;
        if (ao_fifo_empty(ao_serial0_rx_fifo))
                return AO_READ_AGAIN;
        ao_fifo_remove(ao_serial0_rx_fifo,c);
@@ -173,10 +173,10 @@ ao_serial1_getchar(void) __critical
 }
 
 #if USE_SERIAL_1_STDIN
-char
+int
 ao_serial1_pollchar(void) __critical
 {
-       char    c;
+       uint8_t c;
        if (ao_fifo_empty(ao_serial1_rx_fifo))
                return AO_READ_AGAIN;
        ao_fifo_remove(ao_serial1_rx_fifo,c);
index ce26e80..81e9074 100644 (file)
@@ -382,19 +382,19 @@ ao_usb_putchar(char c) __critical __reentrant
                ao_usb_in_send();
 }
 
-char
+int
 ao_usb_pollchar(void) __critical
 {
-       char c;
+       uint8_t c;
        if (ao_usb_out_bytes == 0) {
                USBINDEX = AO_USB_OUT_EP;
                if ((USBCSOL & USBCSOL_OUTPKT_RDY) == 0)
-                       return AO_READ_AGAIN;
+                       return -1;
                ao_usb_out_bytes = (USBCNTH << 8) | USBCNTL;
                if (ao_usb_out_bytes == 0) {
                        USBINDEX = AO_USB_OUT_EP;
                        USBCSOL &= ~USBCSOL_OUTPKT_RDY;
-                       return AO_READ_AGAIN;
+                       return -1;
                }
        }
        --ao_usb_out_bytes;
@@ -409,9 +409,9 @@ ao_usb_pollchar(void) __critical
 char
 ao_usb_getchar(void) __critical
 {
-       char    c;
+       int     c;
 
-       while ((c = ao_usb_pollchar()) == AO_READ_AGAIN)
+       while ((c = ao_usb_pollchar()) == -1)
                ao_sleep(&ao_stdin_ready);
        return c;
 }
index 1aff3d4..54018b3 100644 (file)
@@ -599,10 +599,10 @@ ao_monitor_init(void) __reentrant;
  * ao_stdio.c
  */
 
-#define AO_READ_AGAIN  ((char) -1)
+#define AO_READ_AGAIN  (-1)
 
 struct ao_stdio {
-       char    (*pollchar)(void);
+       int     (*pollchar)(void);
        void    (*putchar)(char c) __reentrant;
        void    (*flush)(void);
        uint8_t echo;
@@ -621,7 +621,7 @@ uint8_t
 ao_echo(void);
 
 int8_t
-ao_add_stdio(char (*pollchar)(void),
+ao_add_stdio(int (*pollchar)(void),
             void (*putchar)(char) __reentrant,
             void (*flush)(void)) __reentrant;
 
index 0eafd3b..08b184d 100644 (file)
@@ -62,7 +62,7 @@ ao_packet_flush(void);
 void
 ao_packet_putchar(char c) __reentrant;
 
-char
+int
 ao_packet_pollchar(void);
 
 #if PACKET_HAS_MASTER
index 53aa8a8..a799bf2 100644 (file)
@@ -22,6 +22,7 @@
 #define AO_SERIAL_SPEED_9600   1
 #define AO_SERIAL_SPEED_19200  2
 #define AO_SERIAL_SPEED_57600  3
+#define AO_SERIAL_SPEED_115200 4
 
 #if HAS_SERIAL_0
 extern volatile __xdata struct ao_fifo ao_serial0_rx_fifo;
@@ -30,6 +31,9 @@ extern volatile __xdata struct ao_fifo        ao_serial0_tx_fifo;
 char
 ao_serial0_getchar(void);
 
+int
+ao_serial0_pollchar(void);
+
 void
 ao_serial0_putchar(char c);
 
@@ -47,7 +51,7 @@ extern volatile __xdata struct ao_fifo        ao_serial1_tx_fifo;
 char
 ao_serial1_getchar(void);
 
-char
+int
 ao_serial1_pollchar(void);
 
 void
@@ -67,7 +71,7 @@ extern volatile __xdata struct ao_fifo        ao_serial2_tx_fifo;
 char
 ao_serial2_getchar(void);
 
-char
+int
 ao_serial2_pollchar(void);
 
 void
@@ -80,6 +84,26 @@ void
 ao_serial2_set_speed(uint8_t speed);
 #endif
 
+#if HAS_SERIAL_3
+extern volatile __xdata struct ao_fifo ao_serial3_rx_fifo;
+extern volatile __xdata struct ao_fifo ao_serial3_tx_fifo;
+
+char
+ao_serial3_getchar(void);
+
+int
+ao_serial3_pollchar(void);
+
+void
+ao_serial3_putchar(char c);
+
+void
+ao_serial3_drain(void);
+
+void
+ao_serial3_set_speed(uint8_t speed);
+#endif
+
 void
 ao_serial_init(void);
 
index 8cf66a2..4a83248 100644 (file)
@@ -123,7 +123,7 @@ ao_echo(void)
 }
 
 int8_t
-ao_add_stdio(char (*pollchar)(void),
+ao_add_stdio(int (*pollchar)(void),
             void (*putchar)(char),
             void (*flush)(void)) __reentrant
 {
index e051db9..4476ee6 100644 (file)
@@ -33,7 +33,7 @@ ao_usb_getchar(void);
 /* Poll for a charcter on the USB input queue.
  * returns AO_READ_AGAIN if none are available
  */
-char
+int
 ao_usb_pollchar(void);
 
 /* Flush the USB output queue */
index 3c1e7a1..9131992 100644 (file)
@@ -21,8 +21,8 @@ __xdata struct ao_packet_recv ao_rx_packet;
 __xdata struct ao_packet ao_tx_packet;
 __pdata uint8_t ao_packet_rx_len, ao_packet_rx_used, ao_packet_tx_used;
 
-static __xdata char tx_data[AO_PACKET_MAX];
-static __xdata char rx_data[AO_PACKET_MAX];
+static __xdata uint8_t tx_data[AO_PACKET_MAX];
+static __xdata uint8_t rx_data[AO_PACKET_MAX];
 static __pdata uint8_t rx_seq;
 
 __xdata struct ao_task ao_packet_task;
@@ -169,7 +169,7 @@ ao_packet_putchar(char c) __reentrant
                tx_data[ao_packet_tx_used++] = c;
 }
 
-char
+int
 ao_packet_pollchar(void)
 {
        /* No need to block interrupts, all variables here
index e270199..007f7e2 100644 (file)
@@ -123,42 +123,6 @@ void ao_lcd_font_init(void);
 
 void ao_lcd_font_string(char *s);
 
-char
-ao_serial1_getchar(void);
-
-void
-ao_serial1_putchar(char c);
-
-char
-ao_serial1_pollchar(void);
-
-void
-ao_serial1_set_speed(uint8_t speed);
-
-char
-ao_serial2_getchar(void);
-
-void
-ao_serial2_putchar(char c);
-
-char
-ao_serial2_pollchar(void);
-
-void
-ao_serial2_set_speed(uint8_t speed);
-
-char
-ao_serial3_getchar(void);
-
-void
-ao_serial3_putchar(char c);
-
-char
-ao_serial3_pollchar(void);
-
-void
-ao_serial3_set_speed(uint8_t speed);
-
 extern const uint32_t  ao_radio_cal;
 
 void
index d6ab146..87bbe73 100644 (file)
@@ -210,6 +210,26 @@ ao_i2c_recv(void *block, uint16_t len, uint8_t i2c_index, uint8_t stop);
 void
 ao_i2c_init(void);
 
+/* ao_serial_stm.c */
+struct ao_stm_usart {
+       struct ao_fifo          rx_fifo;
+       struct ao_fifo          tx_fifo;
+       struct stm_usart        *reg;
+       uint8_t                 tx_started;
+};
+
+#if HAS_SERIAL_1
+extern struct ao_stm_usart     ao_stm_usart1;
+#endif
+
+#if HAS_SERIAL_2
+extern struct ao_stm_usart     ao_stm_usart2;
+#endif
+
+#if HAS_SERIAL_3
+extern struct ao_stm_usart     ao_stm_usart3;
+#endif
+
 #define ARM_PUSH32(stack, val) (*(--(stack)) = (val))
 
 static inline uint32_t
index 00409f4..94138ed 100644 (file)
 
 #include <ao.h>
 
-struct ao_stm_usart {
-       struct ao_fifo          rx_fifo;
-       struct ao_fifo          tx_fifo;
-       struct stm_usart        *reg;
-       uint8_t                 tx_started;
-};
-
 void
 ao_debug_out(char c)
 {
@@ -78,16 +71,19 @@ ao_usart_getchar(struct ao_stm_usart *usart)
        return c;
 }
 
-char
+int
 ao_usart_pollchar(struct ao_stm_usart *usart)
 {
-       char    c;
+       int     c;
        
        ao_arch_block_interrupts();
        if (ao_fifo_empty(usart->rx_fifo))
                c = AO_READ_AGAIN;
-       else
-               ao_fifo_remove(usart->rx_fifo,c);
+       else {
+               uint8_t u;
+               ao_fifo_remove(usart->rx_fifo,u);
+               c = u;
+       }
        ao_arch_release_interrupts();
        return c;
 }
@@ -201,7 +197,7 @@ ao_serial1_putchar(char c)
        ao_usart_putchar(&ao_stm_usart1, c);
 }
 
-char
+int
 ao_serial1_pollchar(void)
 {
        return ao_usart_pollchar(&ao_stm_usart1);
@@ -232,7 +228,7 @@ ao_serial2_putchar(char c)
        ao_usart_putchar(&ao_stm_usart2, c);
 }
 
-char
+int
 ao_serial2_pollchar(void)
 {
        return ao_usart_pollchar(&ao_stm_usart2);
@@ -263,7 +259,7 @@ ao_serial3_putchar(char c)
        ao_usart_putchar(&ao_stm_usart3, c);
 }
 
-char
+int
 ao_serial3_pollchar(void)
 {
        return ao_usart_pollchar(&ao_stm_usart3);
index d93a0c1..9379e5c 100644 (file)
@@ -873,10 +873,10 @@ _ao_usb_out_recv(void)
        ao_usb_set_stat_rx(AO_USB_OUT_EPR, STM_USB_EPR_STAT_RX_VALID);
 }
 
-static char
+static int
 _ao_usb_pollchar(void)
 {
-       char c;
+       uint8_t c;
 
        if (!ao_usb_running)
                return AO_READ_AGAIN;
@@ -896,10 +896,10 @@ _ao_usb_pollchar(void)
        return c;
 }
 
-char
+int
 ao_usb_pollchar(void)
 {
-       char    c;
+       int     c;
        ao_arch_block_interrupts();
        c = _ao_usb_pollchar();
        ao_arch_release_interrupts();
@@ -909,7 +909,7 @@ ao_usb_pollchar(void)
 char
 ao_usb_getchar(void)
 {
-       char    c;
+       int     c;
 
        ao_arch_block_interrupts();
        while ((c = _ao_usb_pollchar()) == AO_READ_AGAIN)