libpayload: avoid excessive casts in printf.c
[coreboot.git] / payloads / libpayload / libc / console.c
index 292cac9ca3963d6ea9068ba7e58e50ac72c018ed..5368dd698bd928e454b12abab9fc9394c32f7bb3 100644 (file)
  * SUCH DAMAGE.
  */
 
+#include <libpayload-config.h>
 #include <libpayload.h>
+#include <usb/usb.h>
+
+struct console_output_driver *console_out;
+struct console_input_driver *console_in;
+
+void console_add_output_driver(struct console_output_driver *out)
+{
+       out->next = console_out;
+       console_out = out;
+}
+
+void console_add_input_driver(struct console_input_driver *in)
+{
+       in->next = console_in;
+       console_in = in;
+}
 
 void console_init(void)
 {
@@ -44,15 +61,12 @@ void console_init(void)
 
 static void device_putchar(unsigned char c)
 {
-#ifdef CONFIG_VIDEO_CONSOLE
-       video_console_putchar(0x700| c);
-#endif
-#ifdef CONFIG_SERIAL_CONSOLE
-       serial_putchar(c);
-#endif
+       struct console_output_driver *out;
+       for (out = console_out; out != 0; out = out->next)
+               out->putchar(c);
 }
 
-int putchar(int c)
+int putchar(unsigned int c)
 {
        c &= 0xff;
        if (c == '\n')
@@ -76,14 +90,13 @@ int puts(const char *s)
 
 int havekey(void)
 {
-#ifdef CONFIG_SERIAL_CONSOLE
-       if (serial_havechar())
-               return 1;
-#endif
-#ifdef CONFIG_PC_KEYBOARD
-       if (keyboard_havechar())
-               return 1;
+#ifdef CONFIG_USB
+       usb_poll();
 #endif
+       struct console_input_driver *in;
+       for (in = console_in; in != 0; in = in->next)
+               if (in->havekey())
+                       return 1;
        return 0;
 }
 
@@ -94,14 +107,13 @@ int havekey(void)
 int getchar(void)
 {
        while (1) {
-#ifdef CONFIG_SERIAL_CONSOLE
-               if (serial_havechar())
-                       return serial_getchar();
-#endif
-#ifdef CONFIG_PC_KEYBOARD
-               if (keyboard_havechar())
-                       return keyboard_getchar();
+#ifdef CONFIG_USB
+               usb_poll();
 #endif
+               struct console_input_driver *in;
+               for (in = console_in; in != 0; in = in->next)
+                       if (in->havechar())
+                               return in->getchar();
        }
 }