[coreboot] libpayload: rework console interfaces
Jordan Crouse
jordan.crouse at amd.com
Tue Oct 21 16:46:31 CEST 2008
On 21/10/08 15:08 +0200, Patrick Georgi wrote:
> Updated patch attached. Same changes as before, but with some more style
> (Thanks Jordan!)
>
> Signed-off-by: Patrick Georgi <patrick.georgi at coresystems.de>
Excellent - I like this.
Signed-off-by: Jordan Crouse <jordan.crouse at amd.com>
> === drivers/keyboard.c
> ==================================================================
> --- drivers/keyboard.c (revision 2252)
> +++ drivers/keyboard.c (local)
> @@ -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);
> }
>
> === drivers/serial.c
> ==================================================================
> --- drivers/serial.c (revision 2252)
> +++ drivers/serial.c (local)
> @@ -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);
> }
> === drivers/usb/usbhid.c
> ==================================================================
> --- drivers/usb/usbhid.c (revision 2252)
> +++ drivers/usb/usbhid.c (local)
> @@ -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);
>
> === drivers/video/video.c
> ==================================================================
> --- drivers/video/video.c (revision 2252)
> +++ drivers/video/video.c (local)
> @@ -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;
> }
>
> === include/libpayload.h
> ==================================================================
> --- include/libpayload.h (revision 2252)
> +++ include/libpayload.h (local)
> @@ -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
> /** @} */
>
> === libc/console.c
> ==================================================================
> --- libc/console.c (revision 2252)
> +++ libc/console.c (local)
> @@ -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();
> }
> }
>
--
Jordan Crouse
Systems Software Development Engineer
Advanced Micro Devices, Inc.
More information about the coreboot
mailing list