Blame view

include/debug_uart.h 4.2 KB
2f964aa7b   Simon Glass   serial: Support a...
1
2
3
4
5
6
7
8
9
10
11
  /*
   * Early debug UART support
   *
   * (C) Copyright 2014 Google, Inc
   * Writte by Simon Glass <sjg@chromium.org>
   *
   * SPDX-License-Identifier:	GPL-2.0+
   */
  
  #ifndef _DEBUG_UART_H
  #define _DEBUG_UART_H
2f964aa7b   Simon Glass   serial: Support a...
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
  /*
   * The debug UART is intended for use very early in U-Boot to debug problems
   * when an ICE or other debug mechanism is not available.
   *
   * To use it you should:
   * - Make sure your UART supports this interface
   * - Enable CONFIG_DEBUG_UART
   * - Enable the CONFIG for your UART to tell it to provide this interface
   *       (e.g. CONFIG_DEBUG_UART_NS16550)
   * - Define the required settings as needed (see below)
   * - Call debug_uart_init() before use
   * - Call printch() to output a character
   *
   * Depending on your platform it may be possible to use this UART before a
   * stack is available.
   *
   * If your UART does not support this interface you can probably add support
   * quite easily. Remember that you cannot use driver model and it is preferred
   * to use no stack.
   *
   * You must not use this UART once driver model is working and the serial
   * drivers are up and running (done in serial_init()). Otherwise the drivers
   * may conflict and you will get strange output.
   *
   *
   * To enable the debug UART in your serial driver:
   *
   * - #include <debug_uart.h>
97b059730   Simon Glass   debug_uart: Adjus...
40
   * - Define _debug_uart_init(), trying to avoid using the stack
2f964aa7b   Simon Glass   serial: Support a...
41
42
43
   * - Define _debug_uart_putc() as static inline (avoiding stack usage)
   * - Immediately afterwards, add DEBUG_UART_FUNCS to define the rest of the
   *     functionality (printch(), etc.)
0e977bc14   Simon Glass   debug_uart: Suppo...
44
45
46
47
48
   *
   * If your board needs additional init for the UART to work, enable
   * CONFIG_DEBUG_UART_BOARD_INIT and write a function called
   * board_debug_uart_init() to perform that init. When debug_uart_init() is
   * called, the init will happen automatically.
2f964aa7b   Simon Glass   serial: Support a...
49
50
51
52
53
54
55
56
57
58
59
60
61
62
   */
  
  /**
   * debug_uart_init() - Set up the debug UART ready for use
   *
   * This sets up the UART with the correct baud rate, etc.
   *
   * Available CONFIG is:
   *
   *    - CONFIG_DEBUG_UART_BASE: Base address of UART
   *    - CONFIG_BAUDRATE: Requested baud rate
   *    - CONFIG_DEBUG_UART_CLOCK: Input clock for UART
   */
  void debug_uart_init(void);
0e977bc14   Simon Glass   debug_uart: Suppo...
63
64
65
66
67
68
69
  #ifdef CONFIG_DEBUG_UART_BOARD_INIT
  void board_debug_uart_init(void);
  #else
  static inline void board_debug_uart_init(void)
  {
  }
  #endif
2f964aa7b   Simon Glass   serial: Support a...
70
71
72
73
74
  /**
   * printch() - Output a character to the debug UART
   *
   * @ch:		Character to output
   */
d0d736146   Simon Glass   debug_uart: Remov...
75
  void printch(int ch);
2f964aa7b   Simon Glass   serial: Support a...
76
77
78
79
80
81
  
  /**
   * printascii() - Output an ASCII string to the debug UART
   *
   * @str:	String to output
   */
d0d736146   Simon Glass   debug_uart: Remov...
82
  void printascii(const char *str);
2f964aa7b   Simon Glass   serial: Support a...
83
84
85
86
87
88
  
  /**
   * printhex2() - Output a 2-digit hex value
   *
   * @value:	Value to output
   */
d0d736146   Simon Glass   debug_uart: Remov...
89
  void printhex2(uint value);
2f964aa7b   Simon Glass   serial: Support a...
90
91
92
93
94
95
  
  /**
   * printhex4() - Output a 4-digit hex value
   *
   * @value:	Value to output
   */
d0d736146   Simon Glass   debug_uart: Remov...
96
  void printhex4(uint value);
2f964aa7b   Simon Glass   serial: Support a...
97
98
99
100
101
102
  
  /**
   * printhex8() - Output a 8-digit hex value
   *
   * @value:	Value to output
   */
d0d736146   Simon Glass   debug_uart: Remov...
103
  void printhex8(uint value);
2f964aa7b   Simon Glass   serial: Support a...
104

c7fefcb91   Simon Glass   debug_uart: Add a...
105
106
107
108
109
  #ifdef CONFIG_DEBUG_UART_ANNOUNCE
  #define _DEBUG_UART_ANNOUNCE	printascii("<debug_uart> ");
  #else
  #define _DEBUG_UART_ANNOUNCE
  #endif
a52cf086a   Lokesh Vutla   serial: omap: Sup...
110
111
112
113
114
115
116
117
118
119
  #define serial_dout(reg, value)	\
  	serial_out_shift((char *)com_port + \
  		((char *)reg - (char *)com_port) * \
  			(1 << CONFIG_DEBUG_UART_SHIFT), \
  		CONFIG_DEBUG_UART_SHIFT, value)
  #define serial_din(reg) \
  	serial_in_shift((char *)com_port + \
  		((char *)reg - (char *)com_port) * \
  			(1 << CONFIG_DEBUG_UART_SHIFT), \
  		CONFIG_DEBUG_UART_SHIFT)
2f964aa7b   Simon Glass   serial: Support a...
120
121
122
123
  /*
   * Now define some functions - this should be inserted into the serial driver
   */
  #define DEBUG_UART_FUNCS \
6bacc7362   tim.chick   debug_uart: Try n...
124
125
  \
  	static inline void _printch(int ch) \
2f964aa7b   Simon Glass   serial: Support a...
126
  	{ \
b391d7433   Masahiro Yamada   debug_uart: outpu...
127
128
129
  		if (ch == '
  ') \
  			_debug_uart_putc('\r'); \
2f964aa7b   Simon Glass   serial: Support a...
130
131
132
  		_debug_uart_putc(ch); \
  	} \
  \
6bacc7362   tim.chick   debug_uart: Try n...
133
134
135
136
137
  	void printch(int ch) \
  	{ \
  		_printch(ch); \
  	} \
  \
d0d736146   Simon Glass   debug_uart: Remov...
138
  	void printascii(const char *str) \
2f964aa7b   Simon Glass   serial: Support a...
139
140
  	{ \
  		while (*str) \
6bacc7362   tim.chick   debug_uart: Try n...
141
  			_printch(*str++); \
2f964aa7b   Simon Glass   serial: Support a...
142
143
144
145
146
147
148
149
150
151
152
153
154
155
  	} \
  \
  	static inline void printhex1(uint digit) \
  	{ \
  		digit &= 0xf; \
  		_debug_uart_putc(digit > 9 ? digit - 10 + 'a' : digit + '0'); \
  	} \
  \
  	static inline void printhex(uint value, int digits) \
  	{ \
  		while (digits-- > 0) \
  			printhex1(value >> (4 * digits)); \
  	} \
  \
d0d736146   Simon Glass   debug_uart: Remov...
156
  	void printhex2(uint value) \
2f964aa7b   Simon Glass   serial: Support a...
157
158
159
160
  	{ \
  		printhex(value, 2); \
  	} \
  \
d0d736146   Simon Glass   debug_uart: Remov...
161
  	void printhex4(uint value) \
2f964aa7b   Simon Glass   serial: Support a...
162
163
164
165
  	{ \
  		printhex(value, 4); \
  	} \
  \
d0d736146   Simon Glass   debug_uart: Remov...
166
  	void printhex8(uint value) \
2f964aa7b   Simon Glass   serial: Support a...
167
168
  	{ \
  		printhex(value, 8); \
97b059730   Simon Glass   debug_uart: Adjus...
169
170
171
172
  	} \
  \
  	void debug_uart_init(void) \
  	{ \
0e977bc14   Simon Glass   debug_uart: Suppo...
173
  		board_debug_uart_init(); \
97b059730   Simon Glass   debug_uart: Adjus...
174
  		_debug_uart_init(); \
c7fefcb91   Simon Glass   debug_uart: Add a...
175
  		_DEBUG_UART_ANNOUNCE \
97b059730   Simon Glass   debug_uart: Adjus...
176
  	} \
2f964aa7b   Simon Glass   serial: Support a...
177
178
  
  #endif