first cut at turnon scripts for EasyTimer v2
[fw/altos] / src / kernel / ao_stdio.c
index 1d65fcf5c16589270625bbf45a553c9e35f526b1..7f74f81194bcca5b1782c111c1d63b711b130e29 100644 (file)
@@ -3,7 +3,8 @@
  *
  * 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
@@ -54,6 +55,9 @@
 #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;
+uint8_t ao_cur_stdio;
+uint8_t ao_num_stdios;
 #else
-__pdata int8_t ao_cur_stdio;
+uint8_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) {
@@ -88,12 +92,13 @@ putchar(char c)
                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
@@ -103,13 +108,13 @@ flush(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;
+       uint8_t stdio;
 
        ao_arch_block_interrupts();
        stdio = ao_cur_stdio;
@@ -128,7 +133,7 @@ getchar(void) __reentrant
        ao_cur_stdio = stdio;
 #endif
        ao_arch_release_interrupts();
-       return c;
+       return (char) c;
 }
 
 uint8_t
@@ -137,16 +142,16 @@ ao_echo(void)
        return ao_stdios[ao_cur_stdio].echo;
 }
 
-int8_t
+uint8_t
 ao_add_stdio(int (*_pollchar)(void),
             void (*putchar)(char),
-            void (*flush)(void)) __reentrant
+            void (*_flush)(void)) 
 {
        if (ao_num_stdios == AO_NUM_STDIOS)
                ao_panic(AO_PANIC_STDIO);
        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++;
@@ -154,3 +159,49 @@ ao_add_stdio(int (*_pollchar)(void),
        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