From 657a6dc390871721711c2becc8501d05095891e5 Mon Sep 17 00:00:00 2001 From: Patrick Georgi Date: Tue, 21 Oct 2008 15:08:18 +0000 Subject: 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 Acked-by: Jordan Crouse git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3679 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- payloads/libpayload/drivers/keyboard.c | 7 +++++++ payloads/libpayload/drivers/serial.c | 14 +++++++++++++- payloads/libpayload/drivers/usb/usbhid.c | 11 +++++++++++ payloads/libpayload/drivers/video/video.c | 11 +++++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) (limited to 'payloads/libpayload/drivers') diff --git a/payloads/libpayload/drivers/keyboard.c b/payloads/libpayload/drivers/keyboard.c index 95827463ca..0d8f72b32e 100644 --- a/payloads/libpayload/drivers/keyboard.c +++ b/payloads/libpayload/drivers/keyboard.c @@ -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); } diff --git a/payloads/libpayload/drivers/serial.c b/payloads/libpayload/drivers/serial.c index 95f5b4855e..7a6590cb16 100644 --- a/payloads/libpayload/drivers/serial.c +++ b/payloads/libpayload/drivers/serial.c @@ -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); } diff --git a/payloads/libpayload/drivers/usb/usbhid.c b/payloads/libpayload/drivers/usb/usbhid.c index 8713cf48c8..b96bfe63f5 100644 --- a/payloads/libpayload/drivers/usb/usbhid.c +++ b/payloads/libpayload/drivers/usb/usbhid.c @@ -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); diff --git a/payloads/libpayload/drivers/video/video.c b/payloads/libpayload/drivers/video/video.c index 6ebc0f8ab6..83c393b4db 100644 --- a/payloads/libpayload/drivers/video/video.c +++ b/payloads/libpayload/drivers/video/video.c @@ -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; } -- cgit v1.2.3