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)
return c;
}
-char
+int
ao_usb_pollchar(void)
{
- char c;
+ int c;
cli();
c = _ao_usb_pollchar();
sei();
char
ao_usb_getchar(void) __critical
{
- char c;
+ int c;
cli();
while ((c = _ao_usb_pollchar()) == AO_READ_AGAIN)
}
#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);
}
#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);
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;
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_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;
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
ao_packet_putchar(char c) __reentrant;
-char
+int
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_115200 4
#if HAS_SERIAL_0
extern volatile __xdata struct ao_fifo ao_serial0_rx_fifo;
char
ao_serial0_getchar(void);
+int
+ao_serial0_pollchar(void);
+
void
ao_serial0_putchar(char c);
char
ao_serial1_getchar(void);
-char
+int
ao_serial1_pollchar(void);
void
char
ao_serial2_getchar(void);
-char
+int
ao_serial2_pollchar(void);
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);
}
int8_t
-ao_add_stdio(char (*pollchar)(void),
+ao_add_stdio(int (*pollchar)(void),
void (*putchar)(char),
void (*flush)(void)) __reentrant
{
/* 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 */
__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;
tx_data[ao_packet_tx_used++] = c;
}
-char
+int
ao_packet_pollchar(void)
{
/* No need to block interrupts, all variables here
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
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
#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)
{
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;
}
ao_usart_putchar(&ao_stm_usart1, c);
}
-char
+int
ao_serial1_pollchar(void)
{
return ao_usart_pollchar(&ao_stm_usart1);
ao_usart_putchar(&ao_stm_usart2, c);
}
-char
+int
ao_serial2_pollchar(void)
{
return ao_usart_pollchar(&ao_stm_usart2);
ao_usart_putchar(&ao_stm_usart3, c);
}
-char
+int
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);
}
-static char
+static int
_ao_usb_pollchar(void)
{
- char c;
+ uint8_t c;
if (!ao_usb_running)
return AO_READ_AGAIN;
return c;
}
-char
+int
ao_usb_pollchar(void)
{
- char c;
+ int c;
ao_arch_block_interrupts();
c = _ao_usb_pollchar();
ao_arch_release_interrupts();
char
ao_usb_getchar(void)
{
- char c;
+ int c;
ao_arch_block_interrupts();
while ((c = _ao_usb_pollchar()) == AO_READ_AGAIN)