1#ifndef __SERIAL_H__
2#define __SERIAL_H__
3
4#include <post.h>
5
6struct serial_device {
7
8 char name[16];
9
10 int (*start)(void);
11 int (*stop)(void);
12 void (*setbrg)(void);
13 int (*getc)(void);
14 int (*tstc)(void);
15 void (*putc)(const char c);
16 void (*puts)(const char *s);
17#if CONFIG_POST & CONFIG_SYS_POST_UART
18 void (*loop)(int);
19#endif
20 struct serial_device *next;
21};
22
23void default_serial_puts(const char *s);
24
25extern struct serial_device serial_smc_device;
26extern struct serial_device serial_scc_device;
27extern struct serial_device *default_serial_console(void);
28
29#if defined(CONFIG_MPC83xx) || defined(CONFIG_MPC85xx) || \
30 defined(CONFIG_MPC86xx) || \
31 defined(CONFIG_TEGRA) || defined(CONFIG_SYS_COREBOOT) || \
32 defined(CONFIG_MICROBLAZE)
33extern struct serial_device serial0_device;
34extern struct serial_device serial1_device;
35#endif
36
37extern struct serial_device eserial1_device;
38extern struct serial_device eserial2_device;
39extern struct serial_device eserial3_device;
40extern struct serial_device eserial4_device;
41extern struct serial_device eserial5_device;
42extern struct serial_device eserial6_device;
43
44extern void serial_register(struct serial_device *);
45extern void serial_initialize(void);
46extern void serial_stdio_init(void);
47extern int serial_assign(const char *name);
48extern void serial_reinit_all(void);
49
50
51#ifdef CONFIG_USB_TTY
52
53struct stdio_dev;
54
55int usbtty_getc(struct stdio_dev *dev);
56void usbtty_putc(struct stdio_dev *dev, const char c);
57void usbtty_puts(struct stdio_dev *dev, const char *str);
58int usbtty_tstc(struct stdio_dev *dev);
59
60#else
61
62
63#define usbtty_getc(dev) 0
64#define usbtty_putc(dev, a)
65#define usbtty_puts(dev, a)
66#define usbtty_tstc(dev) 0
67
68#endif
69
70struct udevice;
71
72enum serial_par {
73 SERIAL_PAR_NONE,
74 SERIAL_PAR_ODD,
75 SERIAL_PAR_EVEN
76};
77
78#define SERIAL_PAR_SHIFT 0
79#define SERIAL_PAR_MASK (0x03 << SERIAL_PAR_SHIFT)
80#define SERIAL_SET_PARITY(parity) \
81 ((parity << SERIAL_PAR_SHIFT) & SERIAL_PAR_MASK)
82#define SERIAL_GET_PARITY(config) \
83 ((config & SERIAL_PAR_MASK) >> SERIAL_PAR_SHIFT)
84
85enum serial_bits {
86 SERIAL_5_BITS,
87 SERIAL_6_BITS,
88 SERIAL_7_BITS,
89 SERIAL_8_BITS
90};
91
92#define SERIAL_BITS_SHIFT 2
93#define SERIAL_BITS_MASK (0x3 << SERIAL_BITS_SHIFT)
94#define SERIAL_SET_BITS(bits) \
95 ((bits << SERIAL_BITS_SHIFT) & SERIAL_BITS_MASK)
96#define SERIAL_GET_BITS(config) \
97 ((config & SERIAL_BITS_MASK) >> SERIAL_BITS_SHIFT)
98
99enum serial_stop {
100 SERIAL_HALF_STOP,
101 SERIAL_ONE_STOP,
102 SERIAL_ONE_HALF_STOP,
103 SERIAL_TWO_STOP
104};
105
106#define SERIAL_STOP_SHIFT 4
107#define SERIAL_STOP_MASK (0x3 << SERIAL_STOP_SHIFT)
108#define SERIAL_SET_STOP(stop) \
109 ((stop << SERIAL_STOP_SHIFT) & SERIAL_STOP_MASK)
110#define SERIAL_GET_STOP(config) \
111 ((config & SERIAL_STOP_MASK) >> SERIAL_STOP_SHIFT)
112
113#define SERIAL_CONFIG(par, bits, stop) \
114 (par << SERIAL_PAR_SHIFT | \
115 bits << SERIAL_BITS_SHIFT | \
116 stop << SERIAL_STOP_SHIFT)
117
118#define SERIAL_DEFAULT_CONFIG \
119 (SERIAL_PAR_NONE << SERIAL_PAR_SHIFT | \
120 SERIAL_8_BITS << SERIAL_BITS_SHIFT | \
121 SERIAL_ONE_STOP << SERIAL_STOP_SHIFT)
122
123enum serial_chip_type {
124 SERIAL_CHIP_UNKNOWN = -1,
125 SERIAL_CHIP_16550_COMPATIBLE,
126};
127
128enum adr_space_type {
129 SERIAL_ADDRESS_SPACE_MEMORY = 0,
130 SERIAL_ADDRESS_SPACE_IO,
131};
132
133
134
135
136
137
138
139
140
141
142
143
144struct serial_device_info {
145 enum serial_chip_type type;
146 enum adr_space_type addr_space;
147 ulong addr;
148 u8 reg_width;
149 u8 reg_offset;
150 u8 reg_shift;
151 unsigned int baudrate;
152};
153
154#define SERIAL_DEFAULT_ADDRESS 0xBADACCE5
155
156
157
158
159
160
161
162struct dm_serial_ops {
163
164
165
166
167
168
169
170
171
172
173
174
175 int (*setbrg)(struct udevice *dev, int baudrate);
176
177
178
179
180
181
182
183
184
185 int (*getc)(struct udevice *dev);
186
187
188
189
190
191
192
193 int (*putc)(struct udevice *dev, const char ch);
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208 int (*pending)(struct udevice *dev, bool input);
209
210
211
212
213
214
215
216
217
218
219
220
221
222 int (*clear)(struct udevice *dev);
223#if CONFIG_POST & CONFIG_SYS_POST_UART
224
225
226
227
228
229
230 int (*loop)(struct udevice *dev, int on);
231#endif
232
233
234
235
236
237
238
239
240
241
242
243 int (*getconfig)(struct udevice *dev, uint *serial_config);
244
245
246
247
248
249
250
251
252
253
254 int (*setconfig)(struct udevice *dev, uint serial_config);
255
256
257
258
259
260
261
262 int (*getinfo)(struct udevice *dev, struct serial_device_info *info);
263};
264
265
266
267
268
269
270
271
272
273
274struct serial_dev_priv {
275 struct stdio_dev *sdev;
276
277 char *buf;
278 int rd_ptr;
279 int wr_ptr;
280};
281
282
283#define serial_get_ops(dev) ((struct dm_serial_ops *)(dev)->driver->ops)
284
285
286
287
288
289
290
291
292
293
294
295int serial_getconfig(struct udevice *dev, uint *config);
296
297
298
299
300
301
302
303
304
305
306
307int serial_setconfig(struct udevice *dev, uint config);
308
309
310
311
312
313
314
315
316int serial_getinfo(struct udevice *dev, struct serial_device_info *info);
317
318void atmel_serial_initialize(void);
319void mcf_serial_initialize(void);
320void mpc85xx_serial_initialize(void);
321void mxc_serial_initialize(void);
322void ns16550_serial_initialize(void);
323void pl01x_serial_initialize(void);
324void pxa_serial_initialize(void);
325void sh_serial_initialize(void);
326
327
328
329
330
331
332
333
334
335int serial_printf(const char *fmt, ...)
336 __attribute__ ((format (__printf__, 1, 2)));
337
338int serial_init(void);
339void serial_setbrg(void);
340void serial_putc(const char ch);
341void serial_putc_raw(const char ch);
342void serial_puts(const char *str);
343int serial_getc(void);
344int serial_tstc(void);
345
346#endif
347