Blame view
common/stdio.c
5.66 KB
91d3256c6 Initial revision |
1 |
/* |
3f4978c71 i2c: common chang... |
2 3 4 5 |
* Copyright (C) 2009 Sergey Kubushyn <ksi@koi8.net> * * Changes for multibus/multiadapter I2C support. * |
91d3256c6 Initial revision |
6 7 8 |
* (C) Copyright 2000 * Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio@tin.it * |
1a4596601 Add GPL-2.0+ SPDX... |
9 |
* SPDX-License-Identifier: GPL-2.0+ |
91d3256c6 Initial revision |
10 11 12 13 |
*/ #include <config.h> #include <common.h> |
d97143a67 stdio: Provide fu... |
14 |
#include <errno.h> |
91d3256c6 Initial revision |
15 16 |
#include <stdarg.h> #include <malloc.h> |
52cb4d4fb stdio/device: rew... |
17 |
#include <stdio_dev.h> |
281e00a3b * Code cleanup |
18 |
#include <serial.h> |
7f6c2cbc2 * Vince Husovsky,... |
19 20 21 |
#ifdef CONFIG_LOGBUFFER #include <logbuff.h> #endif |
ea818dbbc i2c, soft-i2c: sw... |
22 23 |
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C) |
91d3256c6 Initial revision |
24 |
#include <i2c.h> |
7f6c2cbc2 * Vince Husovsky,... |
25 |
#endif |
91d3256c6 Initial revision |
26 |
|
d87080b72 GCC-4.x fixes: cl... |
27 |
DECLARE_GLOBAL_DATA_PTR; |
52cb4d4fb stdio/device: rew... |
28 29 |
static struct stdio_dev devs; struct stdio_dev *stdio_devices[] = { NULL, NULL, NULL }; |
91d3256c6 Initial revision |
30 |
char *stdio_names[MAX_FILES] = { "stdin", "stdout", "stderr" }; |
6d0f6bcf3 rename CFG_ macro... |
31 32 |
#if defined(CONFIG_SPLASH_SCREEN) && !defined(CONFIG_SYS_DEVICE_NULLDEV) #define CONFIG_SYS_DEVICE_NULLDEV 1 |
d791b1dc3 * Make sure Block... |
33 |
#endif |
32d019265 stdio: Add force ... |
34 35 36 |
#ifdef CONFIG_SYS_STDIO_DEREGISTER #define CONFIG_SYS_DEVICE_NULLDEV 1 #endif |
d791b1dc3 * Make sure Block... |
37 |
|
6d0f6bcf3 rename CFG_ macro... |
38 |
#ifdef CONFIG_SYS_DEVICE_NULLDEV |
709ea543b stdio: Pass devic... |
39 |
void nulldev_putc(struct stdio_dev *dev, const char c) |
91d3256c6 Initial revision |
40 |
{ |
c1de7a6da devices: merge to... |
41 |
/* nulldev is empty! */ |
91d3256c6 Initial revision |
42 |
} |
709ea543b stdio: Pass devic... |
43 |
void nulldev_puts(struct stdio_dev *dev, const char *s) |
91d3256c6 Initial revision |
44 |
{ |
c1de7a6da devices: merge to... |
45 |
/* nulldev is empty! */ |
91d3256c6 Initial revision |
46 |
} |
709ea543b stdio: Pass devic... |
47 |
int nulldev_input(struct stdio_dev *dev) |
91d3256c6 Initial revision |
48 |
{ |
c1de7a6da devices: merge to... |
49 50 |
/* nulldev is empty! */ return 0; |
91d3256c6 Initial revision |
51 52 |
} #endif |
709ea543b stdio: Pass devic... |
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
void stdio_serial_putc(struct stdio_dev *dev, const char c) { serial_putc(c); } void stdio_serial_puts(struct stdio_dev *dev, const char *s) { serial_puts(s); } int stdio_serial_getc(struct stdio_dev *dev) { return serial_getc(); } int stdio_serial_tstc(struct stdio_dev *dev) { return serial_tstc(); } |
91d3256c6 Initial revision |
72 73 74 75 76 77 78 |
/************************************************************************** * SYSTEM DRIVERS ************************************************************************** */ static void drv_system_init (void) { |
52cb4d4fb stdio/device: rew... |
79 |
struct stdio_dev dev; |
91d3256c6 Initial revision |
80 81 82 83 84 |
memset (&dev, 0, sizeof (dev)); strcpy (dev.name, "serial"); dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM; |
709ea543b stdio: Pass devic... |
85 86 87 88 |
dev.putc = stdio_serial_putc; dev.puts = stdio_serial_puts; dev.getc = stdio_serial_getc; dev.tstc = stdio_serial_tstc; |
52cb4d4fb stdio/device: rew... |
89 |
stdio_register (&dev); |
91d3256c6 Initial revision |
90 |
|
6d0f6bcf3 rename CFG_ macro... |
91 |
#ifdef CONFIG_SYS_DEVICE_NULLDEV |
91d3256c6 Initial revision |
92 93 94 95 96 97 98 99 |
memset (&dev, 0, sizeof (dev)); strcpy (dev.name, "nulldev"); dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM; dev.putc = nulldev_putc; dev.puts = nulldev_puts; dev.getc = nulldev_input; dev.tstc = nulldev_input; |
52cb4d4fb stdio/device: rew... |
100 |
stdio_register (&dev); |
91d3256c6 Initial revision |
101 102 103 104 105 106 107 |
#endif } /************************************************************************** * DEVICES ************************************************************************** */ |
52cb4d4fb stdio/device: rew... |
108 |
struct list_head* stdio_get_list(void) |
c1de7a6da devices: merge to... |
109 110 111 |
{ return &(devs.list); } |
d7be3056d stdio: constify "... |
112 |
struct stdio_dev* stdio_get_by_name(const char *name) |
c1de7a6da devices: merge to... |
113 114 |
{ struct list_head *pos; |
52cb4d4fb stdio/device: rew... |
115 |
struct stdio_dev *dev; |
c1de7a6da devices: merge to... |
116 117 118 119 120 |
if(!name) return NULL; list_for_each(pos, &(devs.list)) { |
52cb4d4fb stdio/device: rew... |
121 |
dev = list_entry(pos, struct stdio_dev, list); |
c1de7a6da devices: merge to... |
122 123 124 125 126 127 |
if(strcmp(dev->name, name) == 0) return dev; } return NULL; } |
52cb4d4fb stdio/device: rew... |
128 |
struct stdio_dev* stdio_clone(struct stdio_dev *dev) |
628ffd73b device: make devi... |
129 |
{ |
52cb4d4fb stdio/device: rew... |
130 |
struct stdio_dev *_dev; |
628ffd73b device: make devi... |
131 132 133 |
if(!dev) return NULL; |
52cb4d4fb stdio/device: rew... |
134 |
_dev = calloc(1, sizeof(struct stdio_dev)); |
628ffd73b device: make devi... |
135 136 137 |
if(!_dev) return NULL; |
52cb4d4fb stdio/device: rew... |
138 |
memcpy(_dev, dev, sizeof(struct stdio_dev)); |
628ffd73b device: make devi... |
139 140 141 |
return _dev; } |
91d3256c6 Initial revision |
142 |
|
d97143a67 stdio: Provide fu... |
143 |
int stdio_register_dev(struct stdio_dev *dev, struct stdio_dev **devp) |
91d3256c6 Initial revision |
144 |
{ |
52cb4d4fb stdio/device: rew... |
145 |
struct stdio_dev *_dev; |
628ffd73b device: make devi... |
146 |
|
52cb4d4fb stdio/device: rew... |
147 |
_dev = stdio_clone(dev); |
628ffd73b device: make devi... |
148 |
if(!_dev) |
d97143a67 stdio: Provide fu... |
149 |
return -ENODEV; |
3e3c026ed devices: Use list... |
150 |
list_add_tail(&(_dev->list), &(devs.list)); |
d97143a67 stdio: Provide fu... |
151 152 |
if (devp) *devp = _dev; |
91d3256c6 Initial revision |
153 154 |
return 0; } |
d97143a67 stdio: Provide fu... |
155 156 157 158 |
int stdio_register(struct stdio_dev *dev) { return stdio_register_dev(dev, NULL); } |
91d3256c6 Initial revision |
159 160 161 |
/* deregister the device "devname". * returns 0 if success, -1 if device is assigned and 1 if devname not found */ |
52cb4d4fb stdio/device: rew... |
162 |
#ifdef CONFIG_SYS_STDIO_DEREGISTER |
32d019265 stdio: Add force ... |
163 |
int stdio_deregister_dev(struct stdio_dev *dev, int force) |
91d3256c6 Initial revision |
164 |
{ |
c1de7a6da devices: merge to... |
165 166 |
int l; struct list_head *pos; |
03bf22f55 stdio: Fix a poss... |
167 |
char temp_names[3][16]; |
91d3256c6 Initial revision |
168 |
|
91d3256c6 Initial revision |
169 170 171 |
/* get stdio devices (ListRemoveItem changes the dev list) */ for (l=0 ; l< MAX_FILES; l++) { if (stdio_devices[l] == dev) { |
32d019265 stdio: Add force ... |
172 173 174 175 |
if (force) { strcpy(temp_names[l], "nulldev"); continue; } |
91d3256c6 Initial revision |
176 177 178 179 180 |
/* Device is assigned -> report error */ return -1; } memcpy (&temp_names[l][0], stdio_devices[l]->name, |
03bf22f55 stdio: Fix a poss... |
181 |
sizeof(temp_names[l])); |
91d3256c6 Initial revision |
182 |
} |
c1de7a6da devices: merge to... |
183 184 |
list_del(&(dev->list)); |
91d3256c6 Initial revision |
185 |
/* reassign Device list */ |
c1de7a6da devices: merge to... |
186 |
list_for_each(pos, &(devs.list)) { |
52cb4d4fb stdio/device: rew... |
187 |
dev = list_entry(pos, struct stdio_dev, list); |
91d3256c6 Initial revision |
188 |
for (l=0 ; l< MAX_FILES; l++) { |
c1de7a6da devices: merge to... |
189 |
if(strcmp(dev->name, temp_names[l]) == 0) |
91d3256c6 Initial revision |
190 |
stdio_devices[l] = dev; |
91d3256c6 Initial revision |
191 192 193 194 |
} } return 0; } |
d97143a67 stdio: Provide fu... |
195 |
|
32d019265 stdio: Add force ... |
196 |
int stdio_deregister(const char *devname, int force) |
d97143a67 stdio: Provide fu... |
197 198 199 200 201 202 203 |
{ struct stdio_dev *dev; dev = stdio_get_by_name(devname); if (!dev) /* device not found */ return -ENODEV; |
32d019265 stdio: Add force ... |
204 |
return stdio_deregister_dev(dev, force); |
d97143a67 stdio: Provide fu... |
205 |
} |
52cb4d4fb stdio/device: rew... |
206 |
#endif /* CONFIG_SYS_STDIO_DEREGISTER */ |
91d3256c6 Initial revision |
207 |
|
9fb02491f dm: Make driver m... |
208 |
int stdio_init_tables(void) |
91d3256c6 Initial revision |
209 |
{ |
2e5167cca Replace CONFIG_RE... |
210 |
#if defined(CONFIG_NEEDS_MANUAL_RELOC) |
521af04d8 Conditionally per... |
211 |
/* already relocated for current ARM implementation */ |
91d3256c6 Initial revision |
212 |
ulong relocation_offset = gd->reloc_off; |
3595ac497 * Patch by Rune T... |
213 |
int i; |
91d3256c6 Initial revision |
214 215 216 217 218 219 |
/* relocate device name pointers */ for (i = 0; i < (sizeof (stdio_names) / sizeof (char *)); ++i) { stdio_names[i] = (char *) (((ulong) stdio_names[i]) + relocation_offset); } |
2e5167cca Replace CONFIG_RE... |
220 |
#endif /* CONFIG_NEEDS_MANUAL_RELOC */ |
91d3256c6 Initial revision |
221 222 |
/* Initialize the list */ |
c1de7a6da devices: merge to... |
223 |
INIT_LIST_HEAD(&(devs.list)); |
91d3256c6 Initial revision |
224 |
|
9fb02491f dm: Make driver m... |
225 226 227 228 229 |
return 0; } int stdio_add_devices(void) { |
3f4978c71 i2c: common chang... |
230 |
#ifdef CONFIG_SYS_I2C |
3f4978c71 i2c: common chang... |
231 |
i2c_init_all(); |
3f4978c71 i2c: common chang... |
232 |
#else |
ea818dbbc i2c, soft-i2c: sw... |
233 |
#if defined(CONFIG_HARD_I2C) |
6d0f6bcf3 rename CFG_ macro... |
234 |
i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE); |
91d3256c6 Initial revision |
235 |
#endif |
3f4978c71 i2c: common chang... |
236 |
#endif |
91d3256c6 Initial revision |
237 238 239 |
#ifdef CONFIG_LCD drv_lcd_init (); #endif |
a6c7ad2f6 * Fix startup pro... |
240 |
#if defined(CONFIG_VIDEO) || defined(CONFIG_CFB_CONSOLE) |
91d3256c6 Initial revision |
241 242 |
drv_video_init (); #endif |
682011ff6 * Patches by Udi ... |
243 244 |
#ifdef CONFIG_KEYBOARD drv_keyboard_init (); |
91d3256c6 Initial revision |
245 |
#endif |
56f94be3e * Add support for... |
246 247 248 |
#ifdef CONFIG_LOGBUFFER drv_logbuff_init (); #endif |
91d3256c6 Initial revision |
249 |
drv_system_init (); |
52cb4d4fb stdio/device: rew... |
250 |
serial_stdio_init (); |
232c150a2 Add support for S... |
251 252 253 |
#ifdef CONFIG_USB_TTY drv_usbtty_init (); #endif |
68ceb29e7 Add support for c... |
254 255 256 |
#ifdef CONFIG_NETCONSOLE drv_nc_init (); #endif |
36ea8e9ad Blackfin: support... |
257 258 259 |
#ifdef CONFIG_JTAG_CONSOLE drv_jtag_console_init (); #endif |
98ab435f7 x86: Add CBMEM co... |
260 261 262 |
#ifdef CONFIG_CBMEM_CONSOLE cbmemc_init(); #endif |
9fb02491f dm: Make driver m... |
263 264 265 266 267 268 269 270 271 272 |
return 0; } int stdio_init(void) { stdio_init_tables(); stdio_add_devices(); return 0; |
91d3256c6 Initial revision |
273 |
} |