This patch removes most of the #ifdefs in libc/console.c, and
authorPatrick Georgi <patrick.georgi@coresystems.de>
Tue, 21 Oct 2008 15:08:18 +0000 (15:08 +0000)
committerPatrick Georgi <patrick.georgi@coresystems.de>
Tue, 21 Oct 2008 15:08:18 +0000 (15:08 +0000)
replaces it with two queues (input, output) where drivers (serial,
keyboard, video, usb) can attach.

The only things left with #ifdefs are initialization (at some point
the drivers must get a chance to register)

Signed-off-by: Patrick Georgi <patrick.georgi@coresystems.de>
Acked-by: Jordan Crouse <jordan.crouse@amd.com>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3679 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

payloads/libpayload/drivers/keyboard.c
payloads/libpayload/drivers/serial.c
payloads/libpayload/drivers/usb/usbhid.c
payloads/libpayload/drivers/video/video.c
payloads/libpayload/include/libpayload.h
payloads/libpayload/libc/console.c

index 95827463ca2b3827fd0ac47c265413857a4175b7..0d8f72b32e17d8d1c2192fd63eaf73f39d975708 100644 (file)
@@ -326,6 +326,11 @@ int keyboard_add_reset_handler(void (*new_handler)(void))
        return 0;
 }
 
+static struct console_input_driver cons = {
+       .havekey = keyboard_havechar,
+       .getchar = keyboard_getchar
+};
+
 void keyboard_init(void)
 {
        u8 mode;
@@ -350,5 +355,7 @@ void keyboard_init(void)
 
        /* Write the new mode */
        keyboard_set_mode(mode);
+
+       console_add_input_driver(&cons);
 }
 
index 95f5b4855e04edcc6d53f3f998eb3e7ebf2d92ce..7a6590cb164fc38d203287394fd0e48240f35fe8 100644 (file)
@@ -58,15 +58,27 @@ void serial_hardware_init(int port, int speed, int word_bits, int parity, int st
        outb(reg &= ~0x80, port + 0x03);
 }
 
+static struct console_input_driver consin = {
+       .havekey = serial_havechar,
+       .getchar = serial_getchar
+};
+
+static struct console_output_driver consout = {
+       .putchar = serial_putchar
+};
+
 void serial_init(void)
 {
 #ifdef CONFIG_SERIAL_SET_SPEED
        serial_hardware_init(IOBASE, CONFIG_SERIAL_BAUD_RATE, 8, 0, 1);
 #endif
+       console_add_input_driver(&consin);
+       console_add_output_driver(&consout);
 }
 
-void serial_putchar(unsigned char c)
+void serial_putchar(unsigned int c)
 {
+       c &= 0xff;
        while ((inb(IOBASE + 0x05) & 0x20) == 0) ;
        outb(c, IOBASE);
 }
index 8713cf48c8429e1dc3916d4ff83ac7e99815edf1..b96bfe63f566040522babc7c413aa081f421d9df 100644 (file)
@@ -145,10 +145,21 @@ usb_hid_set_protocol (usbdev_t *dev, interface_descriptor_t *interface, hid_prot
        dev->controller->control (dev, OUT, sizeof (dev_req_t), &dr, 0, 0);
 }
 
+static struct console_input_driver cons = {
+       .havekey = usbhid_havechar,
+       .getchar = usbhid_getchar
+};
+
 void
 usb_hid_init (usbdev_t *dev)
 {
 
+       static int installed = 0;
+       if (!installed) {
+               installed = 1;
+               console_add_input_driver (&cons);
+       }
+
        configuration_descriptor_t *cd = (configuration_descriptor_t*)dev->configuration;
        interface_descriptor_t *interface = (interface_descriptor_t*)(((char *) cd) + cd->bLength);
 
index 6ebc0f8ab6c64bb89dd8f53c7e507db9f543a4cb..83c393b4db10b00ccf0cec13073b1dfd21732c85 100644 (file)
@@ -111,6 +111,11 @@ void video_console_putc(u8 row, u8 col, unsigned int ch)
 
 void video_console_putchar(unsigned int ch)
 {
+       /* replace black-on-black with light-gray-on-black.
+          do it here, instead of in libc/console.c */
+       if ((ch & 0xFF00) == 0) {
+               ch |= 0x0700;
+       }
        switch(ch & 0xFF) {
        case '\r':
                cursorx = 0;
@@ -165,6 +170,10 @@ void video_console_set_cursor(unsigned int x, unsigned int y)
        video_console_fixup_cursor();
 }
 
+static struct console_output_driver cons = {
+       .putchar = video_console_putchar
+};
+
 int video_console_init(void)
 {
                int i;
@@ -187,6 +196,8 @@ int video_console_init(void)
                        return 0;
                }
 
+               console_add_output_driver(&cons);
+
                return 0;
 }
 
index a098f0cc21b4a42f0f875fa8ccf1f79a9312fed9..66d114e8f19a8450a8a2bfcd0184b15c05792676 100644 (file)
@@ -145,7 +145,7 @@ int keyboard_add_reset_handler(void (*new_handler)(void));
  */
 void serial_init(void);
 void serial_hardware_init(int port, int speed, int word_bits, int parity, int stop_bits);
-void serial_putchar(unsigned char c);
+void serial_putchar(unsigned int c);
 int serial_havechar(void);
 int serial_getchar(void);
 void serial_clear(void);
@@ -192,7 +192,7 @@ int get_option(void *dest, char *name);
  * @{
  */
 void console_init(void);
-int putchar(int c);
+int putchar(unsigned int c);
 int puts(const char *s);
 int havekey(void);
 int getchar(void);
@@ -200,6 +200,22 @@ int getchar_timeout(int *ms);
 
 extern int last_putchar;
 
+struct console_input_driver;
+struct console_input_driver {
+       struct console_input_driver *next;
+       int (*havekey) (void);
+       int (*getchar) (void);
+};
+
+struct console_output_driver;
+struct console_output_driver {
+       struct console_output_driver *next;
+       void (*putchar) (unsigned int);
+};
+
+void console_add_output_driver(struct console_output_driver *out);
+void console_add_input_driver(struct console_input_driver *in);
+
 #define havechar havekey
 /** @} */
 
index ff6fc13e8e0da9b13b5394a00095becd0af830fb..8b09c44d51631823114dafaad88042d4c1790683 100644 (file)
 #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)
 {
 #ifdef CONFIG_VIDEO_CONSOLE
@@ -46,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')
@@ -78,19 +90,13 @@ int puts(const char *s)
 
 int havekey(void)
 {
-#ifdef CONFIG_USB_HID
+#ifdef CONFIG_USB
        usb_poll();
-       if (usbhid_havechar())
-               return 1;
-#endif
-#ifdef CONFIG_SERIAL_CONSOLE
-       if (serial_havechar())
-               return 1;
-#endif
-#ifdef CONFIG_PC_KEYBOARD
-       if (keyboard_havechar())
-               return 1;
 #endif
+       struct console_input_driver *in;
+       for (in = console_in; in != 0; in = in->next)
+               if (in->havekey())
+                       return 1;
        return 0;
 }
 
@@ -101,19 +107,13 @@ int havekey(void)
 int getchar(void)
 {
        while (1) {
-#ifdef CONFIG_USB_HID
+#ifdef CONFIG_USB
                usb_poll();
-               if (usbhid_havechar())
-                       return usbhid_getchar();
-#endif
-#ifdef CONFIG_SERIAL_CONSOLE
-               if (serial_havechar())
-                       return serial_getchar();
-#endif
-#ifdef CONFIG_PC_KEYBOARD
-               if (keyboard_havechar())
-                       return keyboard_getchar();
 #endif
+               struct console_input_driver *in = console_in;
+               for (in = console_in; in != 0; in = in->next)
+                       if (in->havechar())
+                               return in->getchar();
        }
 }