#include "ao.h"
-#define SERIAL_FIFO 32
-
-struct ao_fifo {
- uint8_t insert;
- uint8_t remove;
- uint8_t fifo[SERIAL_FIFO];
-};
-
volatile __xdata struct ao_fifo ao_usart1_rx_fifo;
volatile __xdata struct ao_fifo ao_usart1_tx_fifo;
-#define ao_fifo_insert(f,c) do { \
- (f).fifo[(f).insert] = (c); \
- (f).insert = ((f).insert + 1) & (SERIAL_FIFO-1); \
-} while(0)
-
-#define ao_fifo_remove(f,c) do {\
- c = (f).fifo[(f).remove]; \
- (f).remove = ((f).remove + 1) & (SERIAL_FIFO-1); \
-} while(0)
-
-#define ao_fifo_full(f) ((((f).insert + 1) & (SERIAL_FIFO-1)) == (f).remove)
-#define ao_fifo_empty(f) ((f).insert == (f).remove)
-
void
ao_serial_rx1_isr(void) interrupt 3
{
ao_wakeup(&ao_usart1_tx_fifo);
}
-uint8_t
+char
ao_serial_getchar(void) __critical
{
- uint8_t c;
+ char c;
while (ao_fifo_empty(ao_usart1_rx_fifo))
ao_sleep(&ao_usart1_rx_fifo);
ao_fifo_remove(ao_usart1_rx_fifo, c);
}
void
-ao_serial_putchar(uint8_t c) __critical
+ao_serial_putchar(char c) __critical
{
while (ao_fifo_full(ao_usart1_tx_fifo))
ao_sleep(&ao_usart1_tx_fifo);
ao_serial_tx1_start();
}
+static void
+send_serial(void)
+{
+ ao_cmd_white();
+ while (ao_cmd_lex_c != '\n') {
+ ao_serial_putchar(ao_cmd_lex_c);
+ ao_cmd_lex();
+ }
+}
+
+__code struct ao_cmds ao_serial_cmds[] = {
+ { 'S', send_serial, "S <data> Send data to serial line" },
+ { 0, send_serial, NULL },
+};
+
void
ao_serial_init(void)
{
IEN0 |= IEN0_URX1IE;
IEN2 |= IEN2_UTX1IE;
+
+ ao_cmd_register(&ao_serial_cmds[0]);
}