Blame view

common/stdio.c 5.66 KB
91d3256c6   wdenk   Initial revision
1
  /*
3f4978c71   Heiko Schocher   i2c: common chang...
2
3
4
5
   * Copyright (C) 2009 Sergey Kubushyn <ksi@koi8.net>
   *
   * Changes for multibus/multiadapter I2C support.
   *
91d3256c6   wdenk   Initial revision
6
7
8
   * (C) Copyright 2000
   * Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio@tin.it
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
9
   * SPDX-License-Identifier:	GPL-2.0+
91d3256c6   wdenk   Initial revision
10
11
12
13
   */
  
  #include <config.h>
  #include <common.h>
d97143a67   Simon Glass   stdio: Provide fu...
14
  #include <errno.h>
91d3256c6   wdenk   Initial revision
15
16
  #include <stdarg.h>
  #include <malloc.h>
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
17
  #include <stdio_dev.h>
281e00a3b   wdenk   * Code cleanup
18
  #include <serial.h>
7f6c2cbc2   wdenk   * Vince Husovsky,...
19
20
21
  #ifdef CONFIG_LOGBUFFER
  #include <logbuff.h>
  #endif
ea818dbbc   Heiko Schocher   i2c, soft-i2c: sw...
22
23
  
  #if defined(CONFIG_HARD_I2C) || defined(CONFIG_SYS_I2C)
91d3256c6   wdenk   Initial revision
24
  #include <i2c.h>
7f6c2cbc2   wdenk   * Vince Husovsky,...
25
  #endif
91d3256c6   wdenk   Initial revision
26

d87080b72   Wolfgang Denk   GCC-4.x fixes: cl...
27
  DECLARE_GLOBAL_DATA_PTR;
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
28
29
  static struct stdio_dev devs;
  struct stdio_dev *stdio_devices[] = { NULL, NULL, NULL };
91d3256c6   wdenk   Initial revision
30
  char *stdio_names[MAX_FILES] = { "stdin", "stdout", "stderr" };
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
31
32
  #if defined(CONFIG_SPLASH_SCREEN) && !defined(CONFIG_SYS_DEVICE_NULLDEV)
  #define	CONFIG_SYS_DEVICE_NULLDEV	1
d791b1dc3   wdenk   * Make sure Block...
33
  #endif
32d019265   Hans de Goede   stdio: Add force ...
34
35
36
  #ifdef	CONFIG_SYS_STDIO_DEREGISTER
  #define	CONFIG_SYS_DEVICE_NULLDEV	1
  #endif
d791b1dc3   wdenk   * Make sure Block...
37

6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
38
  #ifdef CONFIG_SYS_DEVICE_NULLDEV
709ea543b   Simon Glass   stdio: Pass devic...
39
  void nulldev_putc(struct stdio_dev *dev, const char c)
91d3256c6   wdenk   Initial revision
40
  {
c1de7a6da   Jean-Christophe PLAGNIOL-VILLARD   devices: merge to...
41
  	/* nulldev is empty! */
91d3256c6   wdenk   Initial revision
42
  }
709ea543b   Simon Glass   stdio: Pass devic...
43
  void nulldev_puts(struct stdio_dev *dev, const char *s)
91d3256c6   wdenk   Initial revision
44
  {
c1de7a6da   Jean-Christophe PLAGNIOL-VILLARD   devices: merge to...
45
  	/* nulldev is empty! */
91d3256c6   wdenk   Initial revision
46
  }
709ea543b   Simon Glass   stdio: Pass devic...
47
  int nulldev_input(struct stdio_dev *dev)
91d3256c6   wdenk   Initial revision
48
  {
c1de7a6da   Jean-Christophe PLAGNIOL-VILLARD   devices: merge to...
49
50
  	/* nulldev is empty! */
  	return 0;
91d3256c6   wdenk   Initial revision
51
52
  }
  #endif
709ea543b   Simon Glass   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   wdenk   Initial revision
72
73
74
75
76
77
78
  /**************************************************************************
   * SYSTEM DRIVERS
   **************************************************************************
   */
  
  static void drv_system_init (void)
  {
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
79
  	struct stdio_dev dev;
91d3256c6   wdenk   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   Simon Glass   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   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
89
  	stdio_register (&dev);
91d3256c6   wdenk   Initial revision
90

6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
91
  #ifdef CONFIG_SYS_DEVICE_NULLDEV
91d3256c6   wdenk   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   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
100
  	stdio_register (&dev);
91d3256c6   wdenk   Initial revision
101
102
103
104
105
106
107
  #endif
  }
  
  /**************************************************************************
   * DEVICES
   **************************************************************************
   */
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
108
  struct list_head* stdio_get_list(void)
c1de7a6da   Jean-Christophe PLAGNIOL-VILLARD   devices: merge to...
109
110
111
  {
  	return &(devs.list);
  }
d7be3056d   Mike Frysinger   stdio: constify "...
112
  struct stdio_dev* stdio_get_by_name(const char *name)
c1de7a6da   Jean-Christophe PLAGNIOL-VILLARD   devices: merge to...
113
114
  {
  	struct list_head *pos;
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
115
  	struct stdio_dev *dev;
c1de7a6da   Jean-Christophe PLAGNIOL-VILLARD   devices: merge to...
116
117
118
119
120
  
  	if(!name)
  		return NULL;
  
  	list_for_each(pos, &(devs.list)) {
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
121
  		dev = list_entry(pos, struct stdio_dev, list);
c1de7a6da   Jean-Christophe PLAGNIOL-VILLARD   devices: merge to...
122
123
124
125
126
127
  		if(strcmp(dev->name, name) == 0)
  			return dev;
  	}
  
  	return NULL;
  }
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
128
  struct stdio_dev* stdio_clone(struct stdio_dev *dev)
628ffd73b   Jean-Christophe PLAGNIOL-VILLARD   device: make devi...
129
  {
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
130
  	struct stdio_dev *_dev;
628ffd73b   Jean-Christophe PLAGNIOL-VILLARD   device: make devi...
131
132
133
  
  	if(!dev)
  		return NULL;
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
134
  	_dev = calloc(1, sizeof(struct stdio_dev));
628ffd73b   Jean-Christophe PLAGNIOL-VILLARD   device: make devi...
135
136
137
  
  	if(!_dev)
  		return NULL;
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
138
  	memcpy(_dev, dev, sizeof(struct stdio_dev));
628ffd73b   Jean-Christophe PLAGNIOL-VILLARD   device: make devi...
139
140
141
  
  	return _dev;
  }
91d3256c6   wdenk   Initial revision
142

d97143a67   Simon Glass   stdio: Provide fu...
143
  int stdio_register_dev(struct stdio_dev *dev, struct stdio_dev **devp)
91d3256c6   wdenk   Initial revision
144
  {
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
145
  	struct stdio_dev *_dev;
628ffd73b   Jean-Christophe PLAGNIOL-VILLARD   device: make devi...
146

52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
147
  	_dev = stdio_clone(dev);
628ffd73b   Jean-Christophe PLAGNIOL-VILLARD   device: make devi...
148
  	if(!_dev)
d97143a67   Simon Glass   stdio: Provide fu...
149
  		return -ENODEV;
3e3c026ed   Stefan Roese   devices: Use list...
150
  	list_add_tail(&(_dev->list), &(devs.list));
d97143a67   Simon Glass   stdio: Provide fu...
151
152
  	if (devp)
  		*devp = _dev;
91d3256c6   wdenk   Initial revision
153
154
  	return 0;
  }
d97143a67   Simon Glass   stdio: Provide fu...
155
156
157
158
  int stdio_register(struct stdio_dev *dev)
  {
  	return stdio_register_dev(dev, NULL);
  }
91d3256c6   wdenk   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   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
162
  #ifdef	CONFIG_SYS_STDIO_DEREGISTER
32d019265   Hans de Goede   stdio: Add force ...
163
  int stdio_deregister_dev(struct stdio_dev *dev, int force)
91d3256c6   wdenk   Initial revision
164
  {
c1de7a6da   Jean-Christophe PLAGNIOL-VILLARD   devices: merge to...
165
166
  	int l;
  	struct list_head *pos;
03bf22f55   Bradley Bolen   stdio: Fix a poss...
167
  	char temp_names[3][16];
91d3256c6   wdenk   Initial revision
168

91d3256c6   wdenk   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   Hans de Goede   stdio: Add force ...
172
173
174
175
  			if (force) {
  				strcpy(temp_names[l], "nulldev");
  				continue;
  			}
91d3256c6   wdenk   Initial revision
176
177
178
179
180
  			/* Device is assigned -> report error */
  			return -1;
  		}
  		memcpy (&temp_names[l][0],
  			stdio_devices[l]->name,
03bf22f55   Bradley Bolen   stdio: Fix a poss...
181
  			sizeof(temp_names[l]));
91d3256c6   wdenk   Initial revision
182
  	}
c1de7a6da   Jean-Christophe PLAGNIOL-VILLARD   devices: merge to...
183
184
  
  	list_del(&(dev->list));
91d3256c6   wdenk   Initial revision
185
  	/* reassign Device list */
c1de7a6da   Jean-Christophe PLAGNIOL-VILLARD   devices: merge to...
186
  	list_for_each(pos, &(devs.list)) {
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
187
  		dev = list_entry(pos, struct stdio_dev, list);
91d3256c6   wdenk   Initial revision
188
  		for (l=0 ; l< MAX_FILES; l++) {
c1de7a6da   Jean-Christophe PLAGNIOL-VILLARD   devices: merge to...
189
  			if(strcmp(dev->name, temp_names[l]) == 0)
91d3256c6   wdenk   Initial revision
190
  				stdio_devices[l] = dev;
91d3256c6   wdenk   Initial revision
191
192
193
194
  		}
  	}
  	return 0;
  }
d97143a67   Simon Glass   stdio: Provide fu...
195

32d019265   Hans de Goede   stdio: Add force ...
196
  int stdio_deregister(const char *devname, int force)
d97143a67   Simon Glass   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   Hans de Goede   stdio: Add force ...
204
  	return stdio_deregister_dev(dev, force);
d97143a67   Simon Glass   stdio: Provide fu...
205
  }
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
206
  #endif	/* CONFIG_SYS_STDIO_DEREGISTER */
91d3256c6   wdenk   Initial revision
207

9fb02491f   Simon Glass   dm: Make driver m...
208
  int stdio_init_tables(void)
91d3256c6   wdenk   Initial revision
209
  {
2e5167cca   Wolfgang Denk   Replace CONFIG_RE...
210
  #if defined(CONFIG_NEEDS_MANUAL_RELOC)
521af04d8   Peter Tyser   Conditionally per...
211
  	/* already relocated for current ARM implementation */
91d3256c6   wdenk   Initial revision
212
  	ulong relocation_offset = gd->reloc_off;
3595ac497   wdenk   * Patch by Rune T...
213
  	int i;
91d3256c6   wdenk   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   Wolfgang Denk   Replace CONFIG_RE...
220
  #endif /* CONFIG_NEEDS_MANUAL_RELOC */
91d3256c6   wdenk   Initial revision
221
222
  
  	/* Initialize the list */
c1de7a6da   Jean-Christophe PLAGNIOL-VILLARD   devices: merge to...
223
  	INIT_LIST_HEAD(&(devs.list));
91d3256c6   wdenk   Initial revision
224

9fb02491f   Simon Glass   dm: Make driver m...
225
226
227
228
229
  	return 0;
  }
  
  int stdio_add_devices(void)
  {
3f4978c71   Heiko Schocher   i2c: common chang...
230
  #ifdef CONFIG_SYS_I2C
3f4978c71   Heiko Schocher   i2c: common chang...
231
  	i2c_init_all();
3f4978c71   Heiko Schocher   i2c: common chang...
232
  #else
ea818dbbc   Heiko Schocher   i2c, soft-i2c: sw...
233
  #if defined(CONFIG_HARD_I2C)
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
234
  	i2c_init (CONFIG_SYS_I2C_SPEED, CONFIG_SYS_I2C_SLAVE);
91d3256c6   wdenk   Initial revision
235
  #endif
3f4978c71   Heiko Schocher   i2c: common chang...
236
  #endif
91d3256c6   wdenk   Initial revision
237
238
239
  #ifdef CONFIG_LCD
  	drv_lcd_init ();
  #endif
a6c7ad2f6   wdenk   * Fix startup pro...
240
  #if defined(CONFIG_VIDEO) || defined(CONFIG_CFB_CONSOLE)
91d3256c6   wdenk   Initial revision
241
242
  	drv_video_init ();
  #endif
682011ff6   wdenk   * Patches by Udi ...
243
244
  #ifdef CONFIG_KEYBOARD
  	drv_keyboard_init ();
91d3256c6   wdenk   Initial revision
245
  #endif
56f94be3e   wdenk   * Add support for...
246
247
248
  #ifdef CONFIG_LOGBUFFER
  	drv_logbuff_init ();
  #endif
91d3256c6   wdenk   Initial revision
249
  	drv_system_init ();
52cb4d4fb   Jean-Christophe PLAGNIOL-VILLARD   stdio/device: rew...
250
  	serial_stdio_init ();
232c150a2   wdenk   Add support for S...
251
252
253
  #ifdef CONFIG_USB_TTY
  	drv_usbtty_init ();
  #endif
68ceb29e7   wdenk   Add support for c...
254
255
256
  #ifdef CONFIG_NETCONSOLE
  	drv_nc_init ();
  #endif
36ea8e9ad   Mike Frysinger   Blackfin: support...
257
258
259
  #ifdef CONFIG_JTAG_CONSOLE
  	drv_jtag_console_init ();
  #endif
98ab435f7   Vadim Bendebury   x86: Add CBMEM co...
260
261
262
  #ifdef CONFIG_CBMEM_CONSOLE
  	cbmemc_init();
  #endif
9fb02491f   Simon Glass   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   wdenk   Initial revision
273
  }