Blame view

include/debug_uart.h 3.78 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
2f964aa7b   Simon Glass   serial: Support a...
110
111
112
113
  /*
   * Now define some functions - this should be inserted into the serial driver
   */
  #define DEBUG_UART_FUNCS \
d0d736146   Simon Glass   debug_uart: Remov...
114
  	void printch(int ch) \
2f964aa7b   Simon Glass   serial: Support a...
115
  	{ \
b391d7433   Masahiro Yamada   debug_uart: outpu...
116
117
118
  		if (ch == '
  ') \
  			_debug_uart_putc('\r'); \
2f964aa7b   Simon Glass   serial: Support a...
119
120
121
  		_debug_uart_putc(ch); \
  	} \
  \
d0d736146   Simon Glass   debug_uart: Remov...
122
  	void printascii(const char *str) \
2f964aa7b   Simon Glass   serial: Support a...
123
124
  	{ \
  		while (*str) \
b391d7433   Masahiro Yamada   debug_uart: outpu...
125
  			printch(*str++); \
2f964aa7b   Simon Glass   serial: Support a...
126
127
128
129
130
131
132
133
134
135
136
137
138
139
  	} \
  \
  	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...
140
  	void printhex2(uint value) \
2f964aa7b   Simon Glass   serial: Support a...
141
142
143
144
  	{ \
  		printhex(value, 2); \
  	} \
  \
d0d736146   Simon Glass   debug_uart: Remov...
145
  	void printhex4(uint value) \
2f964aa7b   Simon Glass   serial: Support a...
146
147
148
149
  	{ \
  		printhex(value, 4); \
  	} \
  \
d0d736146   Simon Glass   debug_uart: Remov...
150
  	void printhex8(uint value) \
2f964aa7b   Simon Glass   serial: Support a...
151
152
  	{ \
  		printhex(value, 8); \
97b059730   Simon Glass   debug_uart: Adjus...
153
154
155
156
  	} \
  \
  	void debug_uart_init(void) \
  	{ \
0e977bc14   Simon Glass   debug_uart: Suppo...
157
  		board_debug_uart_init(); \
97b059730   Simon Glass   debug_uart: Adjus...
158
  		_debug_uart_init(); \
c7fefcb91   Simon Glass   debug_uart: Add a...
159
  		_DEBUG_UART_ANNOUNCE \
97b059730   Simon Glass   debug_uart: Adjus...
160
  	} \
2f964aa7b   Simon Glass   serial: Support a...
161
162
  
  #endif