[PATCH 2/2] serial: introduce CONFIG_CONSOLE_FLUSH_ON_NEWLINE

Michal Suchánek msuchanek at suse.de
Mon Sep 25 14:10:40 CEST 2023


Hello,

On Mon, Sep 25, 2023 at 01:01:01PM +0200, Rasmus Villemoes wrote:
> When debugging, one sometimes only gets partial output lines or
> nothing at all from the last printf, because the uart has a largish
> buffer, and the code after the printf() may cause the CPU to hang
> before the uart IP has time to actually emit all the characters. That
> can be very confusing, because one doesn't then know exactly where the
> hang happens.
> 
> Introduce a config knob allowing one to wait for the uart fifo to
> drain whenever a newline character is printed, roughly corresponding
> to the effect of setvbuf(..., _IOLBF, ...) in ordinary C programs.
> 
> Signed-off-by: Rasmus Villemoes <rasmus.villemoes at prevas.dk>
> ---
>  common/Kconfig                 | 11 +++++++++++
>  drivers/serial/serial-uclass.c |  8 ++++++--
>  2 files changed, 17 insertions(+), 2 deletions(-)
> 
> diff --git a/common/Kconfig b/common/Kconfig
> index cdb77a6a7d..49130f2a2b 100644
> --- a/common/Kconfig
> +++ b/common/Kconfig
> @@ -224,6 +224,17 @@ config CONSOLE_FLUSH_SUPPORT
>  	help
>  	  This enables compilation of flush() function for console flush support.
>  
> +config CONSOLE_FLUSH_ON_NEWLINE
> +	bool "Flush console buffer on every newline character"
> +	depends on CONSOLE_FLUSH_SUPPORT

Maybe selects would be more appropriate here if it can be arbitrarily
enabled on any console

> +	depends on DM_SERIAL
> +	help
> +	  This makes the serial core code flush the console device
> +	  whenever a newline (\n) character has been emitted. This can
> +	  be especially useful when "printf debugging", as otherwise
> +	  lots of output could still be in the UART's FIFO by the time
> +	  one hits the code which causes the CPU to hang or reset.
> +
>  config CONSOLE_MUX
>  	bool "Enable console multiplexing"
>  	default y if VIDEO || LCD
> diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c
> index 2f75ff878c..b41e3ebe7f 100644
> --- a/drivers/serial/serial-uclass.c
> +++ b/drivers/serial/serial-uclass.c
> @@ -181,7 +181,6 @@ int serial_initialize(void)
>  	return serial_init();
>  }
>  
> -#ifdef CONFIG_CONSOLE_FLUSH_SUPPORT

This should not be removed. CONSOLE_FLUSH_ON_NEWLINE will only ever be
configured when CONFIG_CONSOLE_FLUSH_SUPPORT is also enabled so there is
no need to remove, either.

Thanks

Michal

>  static void _serial_flush(struct udevice *dev)
>  {
>  	struct dm_serial_ops *ops = serial_get_ops(dev);
> @@ -191,7 +190,6 @@ static void _serial_flush(struct udevice *dev)
>  	while (ops->pending(dev, false) > 0)
>  		;
>  }
> -#endif
>  
>  static void _serial_putc(struct udevice *dev, char ch)
>  {
> @@ -204,6 +202,9 @@ static void _serial_putc(struct udevice *dev, char ch)
>  	do {
>  		err = ops->putc(dev, ch);
>  	} while (err == -EAGAIN);
> +
> +	if (IS_ENABLED(CONSOLE_FLUSH_ON_NEWLINE) && ch == '\n')
> +		_serial_flush(dev);
>  }
>  
>  static int __serial_puts(struct udevice *dev, const char *str, size_t len)
> @@ -242,6 +243,9 @@ static void _serial_puts(struct udevice *dev, const char *str)
>  		if (*newline && __serial_puts(dev, "\r\n", 2))
>  			return;
>  
> +		if (IS_ENABLED(CONSOLE_FLUSH_ON_NEWLINE) && *newline)
> +			_serial_flush(dev);
> +
>  		str += len + !!*newline;
>  	} while (*str);
>  }
> -- 
> 2.37.2
> 


More information about the U-Boot mailing list