X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=include%2Fdebug_uart.h;h=34e8b2fc810170ec54cb7176cb2155b696f3d144;hb=305a82217de391bbadce1dc5faac508daa11beaa;hp=f56797b72f4f98f5f87f549fd198b2c7863ddc96;hpb=ded4bc3a8ba6e96811f761b358b4c628ec927ade;p=oweals%2Fu-boot.git diff --git a/include/debug_uart.h b/include/debug_uart.h index f56797b72f..34e8b2fc81 100644 --- a/include/debug_uart.h +++ b/include/debug_uart.h @@ -1,17 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ /* * Early debug UART support * * (C) Copyright 2014 Google, Inc * Writte by Simon Glass - * - * SPDX-License-Identifier: GPL-2.0+ */ #ifndef _DEBUG_UART_H #define _DEBUG_UART_H -#include - /* * 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. @@ -40,10 +37,15 @@ * To enable the debug UART in your serial driver: * * - #include - * - Define debug_uart_init(), trying to avoid using the stack + * - Define _debug_uart_init(), trying to avoid using the stack * - 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.) + * + * 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. */ /** @@ -59,54 +61,87 @@ */ void debug_uart_init(void); +#ifdef CONFIG_DEBUG_UART_BOARD_INIT +void board_debug_uart_init(void); +#else +static inline void board_debug_uart_init(void) +{ +} +#endif + /** * printch() - Output a character to the debug UART * * @ch: Character to output */ -asmlinkage void printch(int ch); +void printch(int ch); /** * printascii() - Output an ASCII string to the debug UART * * @str: String to output */ -asmlinkage void printascii(const char *str); +void printascii(const char *str); /** * printhex2() - Output a 2-digit hex value * * @value: Value to output */ -asmlinkage void printhex2(uint value); +void printhex2(uint value); /** * printhex4() - Output a 4-digit hex value * * @value: Value to output */ -asmlinkage void printhex4(uint value); +void printhex4(uint value); /** * printhex8() - Output a 8-digit hex value * * @value: Value to output */ -asmlinkage void printhex8(uint value); +void printhex8(uint value); + +#ifdef CONFIG_DEBUG_UART_ANNOUNCE +#define _DEBUG_UART_ANNOUNCE printascii(" "); +#else +#define _DEBUG_UART_ANNOUNCE +#endif + +#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) /* * Now define some functions - this should be inserted into the serial driver */ #define DEBUG_UART_FUNCS \ - asmlinkage void printch(int ch) \ +\ + static inline void _printch(int ch) \ { \ + if (ch == '\n') \ + _debug_uart_putc('\r'); \ _debug_uart_putc(ch); \ } \ \ - asmlinkage void printascii(const char *str) \ + void printch(int ch) \ + { \ + _printch(ch); \ + } \ +\ + void printascii(const char *str) \ { \ while (*str) \ - _debug_uart_putc(*str++); \ + _printch(*str++); \ } \ \ static inline void printhex1(uint digit) \ @@ -121,19 +156,26 @@ asmlinkage void printhex8(uint value); printhex1(value >> (4 * digits)); \ } \ \ - asmlinkage void printhex2(uint value) \ + void printhex2(uint value) \ { \ printhex(value, 2); \ } \ \ - asmlinkage void printhex4(uint value) \ + void printhex4(uint value) \ { \ printhex(value, 4); \ } \ \ - asmlinkage void printhex8(uint value) \ + void printhex8(uint value) \ { \ printhex(value, 8); \ - } + } \ +\ + void debug_uart_init(void) \ + { \ + board_debug_uart_init(); \ + _debug_uart_init(); \ + _DEBUG_UART_ANNOUNCE \ + } \ #endif