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:
uint8_t intx;
if (!ao_usb_running)
uint8_t intx;
if (!ao_usb_running)
cli();
c = _ao_usb_pollchar();
sei();
cli();
c = _ao_usb_pollchar();
sei();
char
ao_usb_getchar(void) __critical
{
char
ao_usb_getchar(void) __critical
{
cli();
while ((c = _ao_usb_pollchar()) == AO_READ_AGAIN)
cli();
while ((c = _ao_usb_pollchar()) == AO_READ_AGAIN)
ao_serial0_pollchar(void) __critical
{
ao_serial0_pollchar(void) __critical
{
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);
ao_serial1_pollchar(void) __critical
{
ao_serial1_pollchar(void) __critical
{
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);
ao_usb_pollchar(void) __critical
{
ao_usb_pollchar(void) __critical
{
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)
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;
char
ao_usb_getchar(void) __critical
{
char
ao_usb_getchar(void) __critical
{
- 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;
}
-#define AO_READ_AGAIN ((char) -1)
+#define AO_READ_AGAIN (-1)
- char (*pollchar)(void);
void (*putchar)(char c) __reentrant;
void (*flush)(void);
uint8_t echo;
void (*putchar)(char c) __reentrant;
void (*flush)(void);
uint8_t echo;
-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;
void
ao_packet_putchar(char c) __reentrant;
void
ao_packet_putchar(char c) __reentrant;
ao_packet_pollchar(void);
#if PACKET_HAS_MASTER
ao_packet_pollchar(void);
#if PACKET_HAS_MASTER
#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;
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);
char
ao_serial1_getchar(void);
char
ao_serial1_getchar(void);
ao_serial1_pollchar(void);
void
ao_serial1_pollchar(void);
void
char
ao_serial2_getchar(void);
char
ao_serial2_getchar(void);
ao_serial2_pollchar(void);
void
ao_serial2_pollchar(void);
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);
-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
{
/* 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
*/
ao_usb_pollchar(void);
/* Flush the USB output queue */
ao_usb_pollchar(void);
/* Flush the USB output queue */
__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;
tx_data[ao_packet_tx_used++] = c;
}
tx_data[ao_packet_tx_used++] = c;
}
ao_packet_pollchar(void)
{
/* No need to block interrupts, all variables here
ao_packet_pollchar(void)
{
/* No need to block interrupts, all variables here
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
+/* 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
-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)
{
ao_usart_pollchar(struct ao_stm_usart *usart)
{
ao_usart_pollchar(struct ao_stm_usart *usart)
{
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;
}
ao_usart_putchar(&ao_stm_usart1, c);
}
ao_usart_putchar(&ao_stm_usart1, c);
}
ao_serial1_pollchar(void)
{
return ao_usart_pollchar(&ao_stm_usart1);
ao_serial1_pollchar(void)
{
return ao_usart_pollchar(&ao_stm_usart1);
ao_usart_putchar(&ao_stm_usart2, c);
}
ao_usart_putchar(&ao_stm_usart2, c);
}
ao_serial2_pollchar(void)
{
return ao_usart_pollchar(&ao_stm_usart2);
ao_serial2_pollchar(void)
{
return ao_usart_pollchar(&ao_stm_usart2);
ao_usart_putchar(&ao_stm_usart3, c);
}
ao_usart_putchar(&ao_stm_usart3, c);
}
ao_serial3_pollchar(void)
{
return ao_usart_pollchar(&ao_stm_usart3);
ao_serial3_pollchar(void)
{
return ao_usart_pollchar(&ao_stm_usart3);
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);
}
if (!ao_usb_running)
return AO_READ_AGAIN;
if (!ao_usb_running)
return AO_READ_AGAIN;
ao_arch_block_interrupts();
c = _ao_usb_pollchar();
ao_arch_release_interrupts();
ao_arch_block_interrupts();
c = _ao_usb_pollchar();
ao_arch_release_interrupts();
char
ao_usb_getchar(void)
{
char
ao_usb_getchar(void)
{
ao_arch_block_interrupts();
while ((c = _ao_usb_pollchar()) == AO_READ_AGAIN)
ao_arch_block_interrupts();
while ((c = _ao_usb_pollchar()) == AO_READ_AGAIN)