*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
#ifndef PACKET_HAS_SLAVE
#define PACKET_HAS_SLAVE 0
#endif
+#ifndef CONSOLE_STDIN
+#define CONSOLE_STDIN 0
+#endif
#define USE_SERIAL_STDIN (USE_SERIAL_0_STDIN + \
USE_SERIAL_1_STDIN + \
USE_SERIAL_8_STDIN + \
USE_SERIAL_9_STDIN)
-#define AO_NUM_STDIOS (HAS_USB + PACKET_HAS_SLAVE + USE_SERIAL_STDIN)
+#define AO_NUM_STDIOS (HAS_USB + PACKET_HAS_SLAVE + USE_SERIAL_STDIN + CONSOLE_STDIN)
-__xdata struct ao_stdio ao_stdios[AO_NUM_STDIOS];
+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;
+int8_t ao_cur_stdio;
+int8_t ao_num_stdios;
#else
-__pdata int8_t ao_cur_stdio;
+int8_t ao_cur_stdio;
#define ao_cur_stdio 0
#define ao_num_stdios 0
#endif
-void
-putchar(char c)
+int
+ao_putchar(char c)
{
#if LOW_LEVEL_DEBUG
if (!ao_cur_task) {
if (c == '\n')
ao_debug_out('\r');
ao_debug_out(c);
- return;
+ return 0;
}
#endif
if (c == '\n')
(*ao_stdios[ao_cur_stdio].putchar)('\r');
(*ao_stdios[ao_cur_stdio].putchar)(c);
+ return 0;
}
void
ao_stdios[ao_cur_stdio].flush();
}
-__xdata uint8_t ao_stdin_ready;
+uint8_t ao_stdin_ready;
char
-getchar(void) __reentrant
+ao_getchar(void)
{
int c;
int8_t stdio;
int8_t
ao_add_stdio(int (*_pollchar)(void),
void (*putchar)(char),
- void (*flush)(void)) __reentrant
+ void (*_flush)(void))
{
-#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].flush = _flush;
ao_stdios[ao_num_stdios].echo = 1;
#if AO_NUM_STDIOS > 1
return ao_num_stdios++;
return 0;
#endif
}
+
+/*
+ * Basic I/O functions to support newlib tinystdio package
+ */
+
+static int
+ao_putc(char c, FILE *ignore)
+{
+ (void) ignore;
+ return ao_putchar(c);
+}
+
+static int
+ao_getc(FILE *ignore)
+{
+ (void) ignore;
+ return ao_getchar();
+}
+
+static int
+ao_flushc(FILE *ignore)
+{
+ (void) ignore;
+ flush();
+ return 0;
+}
+
+static FILE __stdio = FDEV_SETUP_STREAM(ao_putc, ao_getc, ao_flushc, _FDEV_SETUP_RW);
+
+#ifdef PICOLIBC_STDIO_GLOBALS
+
+#ifdef __strong_reference
+#define STDIO_ALIAS(x) __strong_reference(stdin, x);
+#else
+#define STDIO_ALIAS(x) FILE *const x = &__stdio;
+#endif
+
+FILE *const stdin = &__stdio;
+STDIO_ALIAS(stdout);
+STDIO_ALIAS(stderr);
+
+#else
+
+FILE *const __iob[3] = { &__stdio, &__stdio, &__stdio };
+
+#endif