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