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>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3679 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
diff --git a/payloads/libpayload/drivers/keyboard.c b/payloads/libpayload/drivers/keyboard.c
index 9582746..0d8f72b 100644
--- a/payloads/libpayload/drivers/keyboard.c
+++ b/payloads/libpayload/drivers/keyboard.c
@@ -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);
}
diff --git a/payloads/libpayload/drivers/serial.c b/payloads/libpayload/drivers/serial.c
index 95f5b48..7a6590c 100644
--- a/payloads/libpayload/drivers/serial.c
+++ b/payloads/libpayload/drivers/serial.c
@@ -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);
}
diff --git a/payloads/libpayload/drivers/usb/usbhid.c b/payloads/libpayload/drivers/usb/usbhid.c
index 8713cf4..b96bfe6 100644
--- a/payloads/libpayload/drivers/usb/usbhid.c
+++ b/payloads/libpayload/drivers/usb/usbhid.c
@@ -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);
diff --git a/payloads/libpayload/drivers/video/video.c b/payloads/libpayload/drivers/video/video.c
index 6ebc0f8..83c393b 100644
--- a/payloads/libpayload/drivers/video/video.c
+++ b/payloads/libpayload/drivers/video/video.c
@@ -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;
}