blob: ea0eba0164ff34efd55090ea644c091804ec7ac8 [file] [log] [blame]
Jordan Crousef6145c32008-03-19 23:56:58 +00001/*
2 * This file is part of the libpayload project.
3 *
4 * Copyright (C) 2008 Advanced Micro Devices, Inc.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
Jordan Crousedb8c0ab2008-11-24 17:54:46 +000030#include <libpayload-config.h>
Jordan Crousef6145c32008-03-19 23:56:58 +000031#include <libpayload.h>
Patrick Georgi4727c072008-10-16 19:20:51 +000032#include <usb/usb.h>
Jordan Crousef6145c32008-03-19 23:56:58 +000033
Patrick Georgi657a6dc2008-10-21 15:08:18 +000034struct console_output_driver *console_out;
35struct console_input_driver *console_in;
36
37void console_add_output_driver(struct console_output_driver *out)
38{
39 out->next = console_out;
40 console_out = out;
41}
42
43void console_add_input_driver(struct console_input_driver *in)
44{
45 in->next = console_in;
46 console_in = in;
47}
48
Jordan Crousef6145c32008-03-19 23:56:58 +000049void console_init(void)
50{
Jordan Crouse30939bd2008-04-10 22:49:02 +000051#ifdef CONFIG_VIDEO_CONSOLE
52 video_console_init();
Jordan Crousef6145c32008-03-19 23:56:58 +000053#endif
54#ifdef CONFIG_SERIAL_CONSOLE
55 serial_init();
56#endif
Jordan Crouse63f181f2008-04-25 23:09:39 +000057#ifdef CONFIG_PC_KEYBOARD
58 keyboard_init();
59#endif
Jordan Crousef6145c32008-03-19 23:56:58 +000060}
61
62static void device_putchar(unsigned char c)
63{
Patrick Georgi657a6dc2008-10-21 15:08:18 +000064 struct console_output_driver *out;
65 for (out = console_out; out != 0; out = out->next)
66 out->putchar(c);
Jordan Crousef6145c32008-03-19 23:56:58 +000067}
68
Patrick Georgi657a6dc2008-10-21 15:08:18 +000069int putchar(unsigned int c)
Jordan Crousef6145c32008-03-19 23:56:58 +000070{
71 c &= 0xff;
72 if (c == '\n')
73 device_putchar('\r');
74 device_putchar(c);
75 return c;
76}
77
78int puts(const char *s)
79{
80 int n = 0;
81
82 while (*s) {
83 putchar(*s++);
84 n++;
Uwe Hermann6a441bf2008-03-20 19:54:59 +000085 }
86
Jordan Crousef6145c32008-03-19 23:56:58 +000087 putchar('\n');
Uwe Hermann6a441bf2008-03-20 19:54:59 +000088 return n + 1;
Jordan Crousef6145c32008-03-19 23:56:58 +000089}
90
91int havekey(void)
92{
Patrick Georgi657a6dc2008-10-21 15:08:18 +000093#ifdef CONFIG_USB
Patrick Georgi4727c072008-10-16 19:20:51 +000094 usb_poll();
Patrick Georgi4727c072008-10-16 19:20:51 +000095#endif
Patrick Georgi657a6dc2008-10-21 15:08:18 +000096 struct console_input_driver *in;
97 for (in = console_in; in != 0; in = in->next)
98 if (in->havekey())
99 return 1;
Uwe Hermann6a441bf2008-03-20 19:54:59 +0000100 return 0;
Jordan Crousef6145c32008-03-19 23:56:58 +0000101}
102
Uwe Hermann6a441bf2008-03-20 19:54:59 +0000103/**
104 * This returns an ASCII value - the two getchar functions
105 * cook the respective input from the device.
106 */
Jordan Crousef6145c32008-03-19 23:56:58 +0000107int getchar(void)
108{
109 while (1) {
Patrick Georgi657a6dc2008-10-21 15:08:18 +0000110#ifdef CONFIG_USB
Patrick Georgi4727c072008-10-16 19:20:51 +0000111 usb_poll();
Patrick Georgi4727c072008-10-16 19:20:51 +0000112#endif
Patrick Georgi657a6dc2008-10-21 15:08:18 +0000113 struct console_input_driver *in = console_in;
114 for (in = console_in; in != 0; in = in->next)
115 if (in->havechar())
116 return in->getchar();
Jordan Crousef6145c32008-03-19 23:56:58 +0000117 }
118}
Jordan Crouse672d0ae2008-04-08 23:21:33 +0000119
120int getchar_timeout(int *ms)
121{
122 while (*ms > 0) {
123 if (havekey())
124 return getchar();
125
126 mdelay(100);
127 *ms -= 100;
128 }
129
130 if (*ms < 0)
131 *ms = 0;
132
133 return 0;
134}