summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2012-11-30 16:01:07 -0800
committerKeith Packard <keithp@keithp.com>2012-11-30 16:01:07 -0800
commit0b65402361f36a0c722977bcb63edb26fda0db28 (patch)
tree435d23c147829f11aac67fd6c30c74dd96f76e8e
parent0fa9ce23dd63846337872d6d666a469512614d07 (diff)
altos: Make stdio 8-bit clean by making pollchar return int
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>
-rw-r--r--src/avr/ao_usb_avr.c10
-rw-r--r--src/cc1111/ao_serial.c8
-rw-r--r--src/cc1111/ao_usb.c12
-rw-r--r--src/core/ao.h6
-rw-r--r--src/core/ao_packet.h2
-rw-r--r--src/core/ao_serial.h28
-rw-r--r--src/core/ao_stdio.c2
-rw-r--r--src/core/ao_usb.h2
-rw-r--r--src/drivers/ao_packet.c6
-rw-r--r--src/stm/ao_arch.h36
-rw-r--r--src/stm/ao_arch_funcs.h20
-rw-r--r--src/stm/ao_serial_stm.c24
-rw-r--r--src/stm/ao_usb_stm.c10
13 files changed, 85 insertions, 81 deletions
diff --git a/src/avr/ao_usb_avr.c b/src/avr/ao_usb_avr.c
index 9ba407af..2ef546c9 100644
--- a/src/avr/ao_usb_avr.c
+++ b/src/avr/ao_usb_avr.c
@@ -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)
diff --git a/src/cc1111/ao_serial.c b/src/cc1111/ao_serial.c
index 48383802..2a93bf52 100644
--- a/src/cc1111/ao_serial.c
+++ b/src/cc1111/ao_serial.c
@@ -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);
diff --git a/src/cc1111/ao_usb.c b/src/cc1111/ao_usb.c
index ce26e808..81e9074e 100644
--- a/src/cc1111/ao_usb.c
+++ b/src/cc1111/ao_usb.c
@@ -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;
}
diff --git a/src/core/ao.h b/src/core/ao.h
index 1aff3d49..54018b37 100644
--- a/src/core/ao.h
+++ b/src/core/ao.h
@@ -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;
diff --git a/src/core/ao_packet.h b/src/core/ao_packet.h
index 0eafd3b2..08b184d6 100644
--- a/src/core/ao_packet.h
+++ b/src/core/ao_packet.h
@@ -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
diff --git a/src/core/ao_serial.h b/src/core/ao_serial.h
index 53aa8a89..a799bf2c 100644
--- a/src/core/ao_serial.h
+++ b/src/core/ao_serial.h
@@ -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);
diff --git a/src/core/ao_stdio.c b/src/core/ao_stdio.c
index 8cf66a23..4a832487 100644
--- a/src/core/ao_stdio.c
+++ b/src/core/ao_stdio.c
@@ -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
{
diff --git a/src/core/ao_usb.h b/src/core/ao_usb.h
index e051db93..4476ee6b 100644
--- a/src/core/ao_usb.h
+++ b/src/core/ao_usb.h
@@ -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 */
diff --git a/src/drivers/ao_packet.c b/src/drivers/ao_packet.c
index 3c1e7a18..91319923 100644
--- a/src/drivers/ao_packet.c
+++ b/src/drivers/ao_packet.c
@@ -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
diff --git a/src/stm/ao_arch.h b/src/stm/ao_arch.h
index e270199e..007f7e2e 100644
--- a/src/stm/ao_arch.h
+++ b/src/stm/ao_arch.h
@@ -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
diff --git a/src/stm/ao_arch_funcs.h b/src/stm/ao_arch_funcs.h
index d6ab1465..87bbe73e 100644
--- a/src/stm/ao_arch_funcs.h
+++ b/src/stm/ao_arch_funcs.h
@@ -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
diff --git a/src/stm/ao_serial_stm.c b/src/stm/ao_serial_stm.c
index 00409f4a..94138edc 100644
--- a/src/stm/ao_serial_stm.c
+++ b/src/stm/ao_serial_stm.c
@@ -17,13 +17,6 @@
#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);
diff --git a/src/stm/ao_usb_stm.c b/src/stm/ao_usb_stm.c
index d93a0c17..9379e5cd 100644
--- a/src/stm/ao_usb_stm.c
+++ b/src/stm/ao_usb_stm.c
@@ -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)