12f964aa7SSimon Glass /* 22f964aa7SSimon Glass * Early debug UART support 32f964aa7SSimon Glass * 42f964aa7SSimon Glass * (C) Copyright 2014 Google, Inc 52f964aa7SSimon Glass * Writte by Simon Glass <sjg@chromium.org> 62f964aa7SSimon Glass * 72f964aa7SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 82f964aa7SSimon Glass */ 92f964aa7SSimon Glass 102f964aa7SSimon Glass #ifndef _DEBUG_UART_H 112f964aa7SSimon Glass #define _DEBUG_UART_H 122f964aa7SSimon Glass 132f964aa7SSimon Glass /* 142f964aa7SSimon Glass * The debug UART is intended for use very early in U-Boot to debug problems 152f964aa7SSimon Glass * when an ICE or other debug mechanism is not available. 162f964aa7SSimon Glass * 172f964aa7SSimon Glass * To use it you should: 182f964aa7SSimon Glass * - Make sure your UART supports this interface 192f964aa7SSimon Glass * - Enable CONFIG_DEBUG_UART 202f964aa7SSimon Glass * - Enable the CONFIG for your UART to tell it to provide this interface 212f964aa7SSimon Glass * (e.g. CONFIG_DEBUG_UART_NS16550) 222f964aa7SSimon Glass * - Define the required settings as needed (see below) 232f964aa7SSimon Glass * - Call debug_uart_init() before use 242f964aa7SSimon Glass * - Call printch() to output a character 252f964aa7SSimon Glass * 262f964aa7SSimon Glass * Depending on your platform it may be possible to use this UART before a 272f964aa7SSimon Glass * stack is available. 282f964aa7SSimon Glass * 292f964aa7SSimon Glass * If your UART does not support this interface you can probably add support 302f964aa7SSimon Glass * quite easily. Remember that you cannot use driver model and it is preferred 312f964aa7SSimon Glass * to use no stack. 322f964aa7SSimon Glass * 332f964aa7SSimon Glass * You must not use this UART once driver model is working and the serial 342f964aa7SSimon Glass * drivers are up and running (done in serial_init()). Otherwise the drivers 352f964aa7SSimon Glass * may conflict and you will get strange output. 362f964aa7SSimon Glass * 372f964aa7SSimon Glass * 382f964aa7SSimon Glass * To enable the debug UART in your serial driver: 392f964aa7SSimon Glass * 402f964aa7SSimon Glass * - #include <debug_uart.h> 412f964aa7SSimon Glass * - Define debug_uart_init(), trying to avoid using the stack 422f964aa7SSimon Glass * - Define _debug_uart_putc() as static inline (avoiding stack usage) 432f964aa7SSimon Glass * - Immediately afterwards, add DEBUG_UART_FUNCS to define the rest of the 442f964aa7SSimon Glass * functionality (printch(), etc.) 452f964aa7SSimon Glass */ 462f964aa7SSimon Glass 472f964aa7SSimon Glass /** 482f964aa7SSimon Glass * debug_uart_init() - Set up the debug UART ready for use 492f964aa7SSimon Glass * 502f964aa7SSimon Glass * This sets up the UART with the correct baud rate, etc. 512f964aa7SSimon Glass * 522f964aa7SSimon Glass * Available CONFIG is: 532f964aa7SSimon Glass * 542f964aa7SSimon Glass * - CONFIG_DEBUG_UART_BASE: Base address of UART 552f964aa7SSimon Glass * - CONFIG_BAUDRATE: Requested baud rate 562f964aa7SSimon Glass * - CONFIG_DEBUG_UART_CLOCK: Input clock for UART 572f964aa7SSimon Glass */ 582f964aa7SSimon Glass void debug_uart_init(void); 592f964aa7SSimon Glass 602f964aa7SSimon Glass /** 612f964aa7SSimon Glass * printch() - Output a character to the debug UART 622f964aa7SSimon Glass * 632f964aa7SSimon Glass * @ch: Character to output 642f964aa7SSimon Glass */ 65*d0d73614SSimon Glass void printch(int ch); 662f964aa7SSimon Glass 672f964aa7SSimon Glass /** 682f964aa7SSimon Glass * printascii() - Output an ASCII string to the debug UART 692f964aa7SSimon Glass * 702f964aa7SSimon Glass * @str: String to output 712f964aa7SSimon Glass */ 72*d0d73614SSimon Glass void printascii(const char *str); 732f964aa7SSimon Glass 742f964aa7SSimon Glass /** 752f964aa7SSimon Glass * printhex2() - Output a 2-digit hex value 762f964aa7SSimon Glass * 772f964aa7SSimon Glass * @value: Value to output 782f964aa7SSimon Glass */ 79*d0d73614SSimon Glass void printhex2(uint value); 802f964aa7SSimon Glass 812f964aa7SSimon Glass /** 822f964aa7SSimon Glass * printhex4() - Output a 4-digit hex value 832f964aa7SSimon Glass * 842f964aa7SSimon Glass * @value: Value to output 852f964aa7SSimon Glass */ 86*d0d73614SSimon Glass void printhex4(uint value); 872f964aa7SSimon Glass 882f964aa7SSimon Glass /** 892f964aa7SSimon Glass * printhex8() - Output a 8-digit hex value 902f964aa7SSimon Glass * 912f964aa7SSimon Glass * @value: Value to output 922f964aa7SSimon Glass */ 93*d0d73614SSimon Glass void printhex8(uint value); 942f964aa7SSimon Glass 952f964aa7SSimon Glass /* 962f964aa7SSimon Glass * Now define some functions - this should be inserted into the serial driver 972f964aa7SSimon Glass */ 982f964aa7SSimon Glass #define DEBUG_UART_FUNCS \ 99*d0d73614SSimon Glass void printch(int ch) \ 1002f964aa7SSimon Glass { \ 1012f964aa7SSimon Glass _debug_uart_putc(ch); \ 1022f964aa7SSimon Glass } \ 1032f964aa7SSimon Glass \ 104*d0d73614SSimon Glass void printascii(const char *str) \ 1052f964aa7SSimon Glass { \ 1062f964aa7SSimon Glass while (*str) \ 1072f964aa7SSimon Glass _debug_uart_putc(*str++); \ 1082f964aa7SSimon Glass } \ 1092f964aa7SSimon Glass \ 1102f964aa7SSimon Glass static inline void printhex1(uint digit) \ 1112f964aa7SSimon Glass { \ 1122f964aa7SSimon Glass digit &= 0xf; \ 1132f964aa7SSimon Glass _debug_uart_putc(digit > 9 ? digit - 10 + 'a' : digit + '0'); \ 1142f964aa7SSimon Glass } \ 1152f964aa7SSimon Glass \ 1162f964aa7SSimon Glass static inline void printhex(uint value, int digits) \ 1172f964aa7SSimon Glass { \ 1182f964aa7SSimon Glass while (digits-- > 0) \ 1192f964aa7SSimon Glass printhex1(value >> (4 * digits)); \ 1202f964aa7SSimon Glass } \ 1212f964aa7SSimon Glass \ 122*d0d73614SSimon Glass void printhex2(uint value) \ 1232f964aa7SSimon Glass { \ 1242f964aa7SSimon Glass printhex(value, 2); \ 1252f964aa7SSimon Glass } \ 1262f964aa7SSimon Glass \ 127*d0d73614SSimon Glass void printhex4(uint value) \ 1282f964aa7SSimon Glass { \ 1292f964aa7SSimon Glass printhex(value, 4); \ 1302f964aa7SSimon Glass } \ 1312f964aa7SSimon Glass \ 132*d0d73614SSimon Glass void printhex8(uint value) \ 1332f964aa7SSimon Glass { \ 1342f964aa7SSimon Glass printhex(value, 8); \ 1352f964aa7SSimon Glass } 1362f964aa7SSimon Glass 1372f964aa7SSimon Glass #endif 138