summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/avr/ao_avr_stdio.c11
-rw-r--r--src/core/ao_stdio.c17
2 files changed, 18 insertions, 10 deletions
diff --git a/src/avr/ao_avr_stdio.c b/src/avr/ao_avr_stdio.c
index 2765853a..f9c0f88c 100644
--- a/src/avr/ao_avr_stdio.c
+++ b/src/avr/ao_avr_stdio.c
@@ -20,16 +20,7 @@
int
stdio_put(char c, FILE *stream)
{
- if (ao_cur_task && ao_num_stdios)
- putchar(c);
- else
- {
- if (c == '\n')
- stdio_put('\r', stream);
- loop_until_bit_is_set(UCSR1A, UDRE1);
- UDR1 = c;
- }
-
+ putchar(c);
return 0;
}
diff --git a/src/core/ao_stdio.c b/src/core/ao_stdio.c
index 977d74b1..cd144d6b 100644
--- a/src/core/ao_stdio.c
+++ b/src/core/ao_stdio.c
@@ -66,8 +66,15 @@
#define AO_NUM_STDIOS (HAS_USB + PACKET_HAS_SLAVE + USE_SERIAL_STDIN)
__xdata struct ao_stdio ao_stdios[AO_NUM_STDIOS];
+
+#if AO_NUM_STDIOS > 1
__pdata int8_t ao_cur_stdio;
__pdata int8_t ao_num_stdios;
+#else
+__pdata int8_t ao_cur_stdio;
+#define ao_cur_stdio 0
+#define ao_num_stdios 0
+#endif
void
putchar(char c)
@@ -107,12 +114,16 @@ getchar(void) __reentrant
c = ao_stdios[stdio]._pollchar();
if (c != AO_READ_AGAIN)
break;
+#if AO_NUM_STDIOS > 1
if (++stdio == ao_num_stdios)
stdio = 0;
if (stdio == ao_cur_stdio)
+#endif
ao_sleep(&ao_stdin_ready);
}
+#if AO_NUM_STDIOS > 1
ao_cur_stdio = stdio;
+#endif
ao_arch_release_interrupts();
return c;
}
@@ -128,11 +139,17 @@ ao_add_stdio(int (*_pollchar)(void),
void (*putchar)(char),
void (*flush)(void)) __reentrant
{
+#if AO_NUM_STDIOS > 1
if (ao_num_stdios == AO_NUM_STDIOS)
ao_panic(AO_PANIC_STDIO);
+#endif
ao_stdios[ao_num_stdios]._pollchar = _pollchar;
ao_stdios[ao_num_stdios].putchar = putchar;
ao_stdios[ao_num_stdios].flush = flush;
ao_stdios[ao_num_stdios].echo = 1;
+#if AO_NUM_STDIOS > 1
return ao_num_stdios++;
+#else
+ return 0;
+#endif
}