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 9ba407af6f6a3e0f1027f4e5c5e5fa2378bfee6b..2ef546c98dc2d4d1f462bb2c042c9c9885a8df85 100644 (file)
@@ -480,10 +480,10 @@ ao_usb_putchar(char c) __critical __reentrant
        ao_usb_in_flushed = 0;
 }
 
        ao_usb_in_flushed = 0;
 }
 
-static char
+static int
 _ao_usb_pollchar(void)
 {
 _ao_usb_pollchar(void)
 {
-       char c;
+       uint8_t c;
        uint8_t intx;
 
        if (!ao_usb_running)
        uint8_t intx;
 
        if (!ao_usb_running)
@@ -517,10 +517,10 @@ _ao_usb_pollchar(void)
        return c;
 }
 
        return c;
 }
 
-char
+int
 ao_usb_pollchar(void)
 {
 ao_usb_pollchar(void)
 {
-       char    c;
+       int     c;
        cli();
        c = _ao_usb_pollchar();
        sei();
        cli();
        c = _ao_usb_pollchar();
        sei();
@@ -530,7 +530,7 @@ ao_usb_pollchar(void)
 char
 ao_usb_getchar(void) __critical
 {
 char
 ao_usb_getchar(void) __critical
 {
-       char    c;
+       int     c;
 
        cli();
        while ((c = _ao_usb_pollchar()) == AO_READ_AGAIN)
 
        cli();
        while ((c = _ao_usb_pollchar()) == AO_READ_AGAIN)
index 4838380228214dcf7fe0e475bf493a89237bcc21..2a93bf523852dc98a255b0baea7a3a8f9b7111ba 100644 (file)
@@ -85,10 +85,10 @@ ao_serial0_getchar(void) __critical
 }
 
 #if USE_SERIAL_0_STDIN
 }
 
 #if USE_SERIAL_0_STDIN
-char
+int
 ao_serial0_pollchar(void) __critical
 {
 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);
        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
 }
 
 #if USE_SERIAL_1_STDIN
-char
+int
 ao_serial1_pollchar(void) __critical
 {
 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);
        if (ao_fifo_empty(ao_serial1_rx_fifo))
                return AO_READ_AGAIN;
        ao_fifo_remove(ao_serial1_rx_fifo,c);
index ce26e8088a4cfee539b78bb82ea54538dab1af9d..81e9074ea44c6905274cb0ac72fff96cffccacb0 100644 (file)
@@ -382,19 +382,19 @@ ao_usb_putchar(char c) __critical __reentrant
                ao_usb_in_send();
 }
 
                ao_usb_in_send();
 }
 
-char
+int
 ao_usb_pollchar(void) __critical
 {
 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)
        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;
                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;
                }
        }
        --ao_usb_out_bytes;
@@ -409,9 +409,9 @@ ao_usb_pollchar(void) __critical
 char
 ao_usb_getchar(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;
 }
                ao_sleep(&ao_stdin_ready);
        return c;
 }
index 1aff3d49e708d3d113a30be13f98d3a2c222462d..54018b371a058d60ba888b8020c45bbbda41d70f 100644 (file)
@@ -599,10 +599,10 @@ ao_monitor_init(void) __reentrant;
  * ao_stdio.c
  */
 
  * ao_stdio.c
  */
 
-#define AO_READ_AGAIN  ((char) -1)
+#define AO_READ_AGAIN  (-1)
 
 struct ao_stdio {
 
 struct ao_stdio {
-       char    (*pollchar)(void);
+       int     (*pollchar)(void);
        void    (*putchar)(char c) __reentrant;
        void    (*flush)(void);
        uint8_t echo;
        void    (*putchar)(char c) __reentrant;
        void    (*flush)(void);
        uint8_t echo;
@@ -621,7 +621,7 @@ uint8_t
 ao_echo(void);
 
 int8_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;
 
             void (*putchar)(char) __reentrant,
             void (*flush)(void)) __reentrant;
 
index 0eafd3b2d5294122847eb7891b85226e2f8b17ef..08b184d60fc340596208c2660b842fc07cff7a69 100644 (file)
@@ -62,7 +62,7 @@ ao_packet_flush(void);
 void
 ao_packet_putchar(char c) __reentrant;
 
 void
 ao_packet_putchar(char c) __reentrant;
 
-char
+int
 ao_packet_pollchar(void);
 
 #if PACKET_HAS_MASTER
 ao_packet_pollchar(void);
 
 #if PACKET_HAS_MASTER
index 53aa8a89e2c7d7903270257f2118c1700b6a28a3..a799bf2c9bc4afd6322d507d7b27626d866a29e9 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_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;
 
 #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);
 
 char
 ao_serial0_getchar(void);
 
+int
+ao_serial0_pollchar(void);
+
 void
 ao_serial0_putchar(char c);
 
 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
 ao_serial1_getchar(void);
 
-char
+int
 ao_serial1_pollchar(void);
 
 void
 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
 ao_serial2_getchar(void);
 
-char
+int
 ao_serial2_pollchar(void);
 
 void
 ao_serial2_pollchar(void);
 
 void
@@ -80,6 +84,26 @@ void
 ao_serial2_set_speed(uint8_t speed);
 #endif
 
 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);
 
 void
 ao_serial_init(void);
 
index 8cf66a239ac1db03d8d1d72c5c2bd7d44ab26a0c..4a832487e6102612c7aeed176247d75c981fd3d9 100644 (file)
@@ -123,7 +123,7 @@ ao_echo(void)
 }
 
 int8_t
 }
 
 int8_t
-ao_add_stdio(char (*pollchar)(void),
+ao_add_stdio(int (*pollchar)(void),
             void (*putchar)(char),
             void (*flush)(void)) __reentrant
 {
             void (*putchar)(char),
             void (*flush)(void)) __reentrant
 {
index e051db9323d5639e91e1931ba5607c6b238ab806..4476ee6be99f4ffd76db8f6d651ff2171616d989 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
  */
 /* 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 */
 ao_usb_pollchar(void);
 
 /* Flush the USB output queue */
index 3c1e7a18eb643168be3520e558f0ee6781ce963f..913199232a75b46d2db390ac9e665686626529e0 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;
 
 __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;
 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;
 }
 
                tx_data[ao_packet_tx_used++] = c;
 }
 
-char
+int
 ao_packet_pollchar(void)
 {
        /* No need to block interrupts, all variables here
 ao_packet_pollchar(void)
 {
        /* No need to block interrupts, all variables here
index e270199ec701aebcc7860b7a5601aa4e8f29ff8e..007f7e2ed3ac85e675244dc547f20dac82cc78e9 100644 (file)
@@ -123,42 +123,6 @@ void ao_lcd_font_init(void);
 
 void ao_lcd_font_string(char *s);
 
 
 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
 extern const uint32_t  ao_radio_cal;
 
 void
index d6ab1465c73cd1b9a5f0c46080ba1ef780afd1aa..87bbe73e3b926a6b964d181f6dc5a60926cb4305 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);
 
 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
 #define ARM_PUSH32(stack, val) (*(--(stack)) = (val))
 
 static inline uint32_t
index 00409f4a85957e16e53825f4e8420e85a168c535..94138edc3f4bda884a07555584e8d0d962ca99fa 100644 (file)
 
 #include <ao.h>
 
 
 #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)
 {
 void
 ao_debug_out(char c)
 {
@@ -78,16 +71,19 @@ ao_usart_getchar(struct ao_stm_usart *usart)
        return c;
 }
 
        return c;
 }
 
-char
+int
 ao_usart_pollchar(struct ao_stm_usart *usart)
 {
 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;
        
        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;
 }
        ao_arch_release_interrupts();
        return c;
 }
@@ -201,7 +197,7 @@ ao_serial1_putchar(char c)
        ao_usart_putchar(&ao_stm_usart1, c);
 }
 
        ao_usart_putchar(&ao_stm_usart1, c);
 }
 
-char
+int
 ao_serial1_pollchar(void)
 {
        return ao_usart_pollchar(&ao_stm_usart1);
 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);
 }
 
        ao_usart_putchar(&ao_stm_usart2, c);
 }
 
-char
+int
 ao_serial2_pollchar(void)
 {
        return ao_usart_pollchar(&ao_stm_usart2);
 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);
 }
 
        ao_usart_putchar(&ao_stm_usart3, c);
 }
 
-char
+int
 ao_serial3_pollchar(void)
 {
        return ao_usart_pollchar(&ao_stm_usart3);
 ao_serial3_pollchar(void)
 {
        return ao_usart_pollchar(&ao_stm_usart3);
index d93a0c174c16a7a851669241fa98fbd68083d2d9..9379e5cd62efd19a8cdf994669fa171be0a9f11b 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);
 }
 
        ao_usb_set_stat_rx(AO_USB_OUT_EPR, STM_USB_EPR_STAT_RX_VALID);
 }
 
-static char
+static int
 _ao_usb_pollchar(void)
 {
 _ao_usb_pollchar(void)
 {
-       char c;
+       uint8_t c;
 
        if (!ao_usb_running)
                return AO_READ_AGAIN;
 
        if (!ao_usb_running)
                return AO_READ_AGAIN;
@@ -896,10 +896,10 @@ _ao_usb_pollchar(void)
        return c;
 }
 
        return c;
 }
 
-char
+int
 ao_usb_pollchar(void)
 {
 ao_usb_pollchar(void)
 {
-       char    c;
+       int     c;
        ao_arch_block_interrupts();
        c = _ao_usb_pollchar();
        ao_arch_release_interrupts();
        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
 ao_usb_getchar(void)
 {
-       char    c;
+       int     c;
 
        ao_arch_block_interrupts();
        while ((c = _ao_usb_pollchar()) == AO_READ_AGAIN)
 
        ao_arch_block_interrupts();
        while ((c = _ao_usb_pollchar()) == AO_READ_AGAIN)