Author: oxygene Date: 2008-10-21 17:08:18 +0200 (Tue, 21 Oct 2008) New Revision: 3679
Modified: trunk/payloads/libpayload/drivers/keyboard.c trunk/payloads/libpayload/drivers/serial.c trunk/payloads/libpayload/drivers/usb/usbhid.c trunk/payloads/libpayload/drivers/video/video.c trunk/payloads/libpayload/include/libpayload.h trunk/payloads/libpayload/libc/console.c Log: This patch removes most of the #ifdefs in libc/console.c, and 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
Modified: trunk/payloads/libpayload/drivers/keyboard.c =================================================================== --- trunk/payloads/libpayload/drivers/keyboard.c 2008-10-21 15:07:53 UTC (rev 3678) +++ trunk/payloads/libpayload/drivers/keyboard.c 2008-10-21 15:08:18 UTC (rev 3679) @@ -326,6 +326,11 @@ return 0; }
+static struct console_input_driver cons = { + .havekey = keyboard_havechar, + .getchar = keyboard_getchar +}; + void keyboard_init(void) { u8 mode; @@ -350,5 +355,7 @@
/* Write the new mode */ keyboard_set_mode(mode); + + console_add_input_driver(&cons); }
Modified: trunk/payloads/libpayload/drivers/serial.c =================================================================== --- trunk/payloads/libpayload/drivers/serial.c 2008-10-21 15:07:53 UTC (rev 3678) +++ trunk/payloads/libpayload/drivers/serial.c 2008-10-21 15:08:18 UTC (rev 3679) @@ -58,15 +58,27 @@ 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); }
Modified: trunk/payloads/libpayload/drivers/usb/usbhid.c =================================================================== --- trunk/payloads/libpayload/drivers/usb/usbhid.c 2008-10-21 15:07:53 UTC (rev 3678) +++ trunk/payloads/libpayload/drivers/usb/usbhid.c 2008-10-21 15:08:18 UTC (rev 3679) @@ -145,10 +145,21 @@ 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);
Modified: trunk/payloads/libpayload/drivers/video/video.c =================================================================== --- trunk/payloads/libpayload/drivers/video/video.c 2008-10-21 15:07:53 UTC (rev 3678) +++ trunk/payloads/libpayload/drivers/video/video.c 2008-10-21 15:08:18 UTC (rev 3679) @@ -111,6 +111,11 @@
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 @@ 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 @@ return 0; }
+ console_add_output_driver(&cons); + return 0; }
Modified: trunk/payloads/libpayload/include/libpayload.h =================================================================== --- trunk/payloads/libpayload/include/libpayload.h 2008-10-21 15:07:53 UTC (rev 3678) +++ trunk/payloads/libpayload/include/libpayload.h 2008-10-21 15:08:18 UTC (rev 3679) @@ -145,7 +145,7 @@ */ 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 @@ * @{ */ 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 @@
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 /** @} */
Modified: trunk/payloads/libpayload/libc/console.c =================================================================== --- trunk/payloads/libpayload/libc/console.c 2008-10-21 15:07:53 UTC (rev 3678) +++ trunk/payloads/libpayload/libc/console.c 2008-10-21 15:08:18 UTC (rev 3679) @@ -31,6 +31,21 @@ #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 @@
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 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 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(); } }