d5ad0e46057fdfe907cd807e6bdb4334bf6aa995
[coreboot.git] / payloads / libpayload / libc / console.c
1 /*
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
30 #include <config.h>
31 #include <libpayload.h>
32
33 void console_init(void)
34 {
35 #ifdef CONFIG_VIDEO_CONSOLE
36         video_console_init();
37 #endif
38 #ifdef CONFIG_SERIAL_CONSOLE
39         serial_init();
40 #endif
41 #ifdef CONFIG_PC_KEYBOARD
42         keyboard_init();
43 #endif
44 }
45
46 static void device_putchar(unsigned char c)
47 {
48 #ifdef CONFIG_VIDEO_CONSOLE
49         video_console_putchar(0x700| c);
50 #endif
51 #ifdef CONFIG_SERIAL_CONSOLE
52         serial_putchar(c);
53 #endif
54 }
55
56 int putchar(int c)
57 {
58         c &= 0xff;
59         if (c == '\n')
60                 device_putchar('\r');
61         device_putchar(c);
62         return c;
63 }
64
65 int puts(const char *s)
66 {
67         int n = 0;
68
69         while (*s) {
70                 putchar(*s++);
71                 n++;
72         }
73
74         putchar('\n');
75         return n + 1;
76 }
77
78 int havekey(void)
79 {
80 #ifdef CONFIG_SERIAL_CONSOLE
81         if (serial_havechar())
82                 return 1;
83 #endif
84 #ifdef CONFIG_PC_KEYBOARD
85         if (keyboard_havechar())
86                 return 1;
87 #endif
88         return 0;
89 }
90
91 /**
92  * This returns an ASCII value - the two getchar functions
93  * cook the respective input from the device.
94  */
95 int getchar(void)
96 {
97         while (1) {
98 #ifdef CONFIG_SERIAL_CONSOLE
99                 if (serial_havechar())
100                         return serial_getchar();
101 #endif
102 #ifdef CONFIG_PC_KEYBOARD
103                 if (keyboard_havechar())
104                         return keyboard_getchar();
105 #endif
106         }
107 }
108
109 int getchar_timeout(int *ms)
110 {
111         while (*ms > 0) {
112                 if (havekey())
113                         return getchar();
114
115                 mdelay(100);
116                 *ms -= 100;
117         }
118
119         if (*ms < 0)
120                 *ms = 0;
121
122         return 0;
123 }