[PATCH] bsps/zynq-uart: Make post baud change kick global

Gedare Bloom gedare at rtems.org
Tue Jun 29 16:19:30 UTC 2021


ok

On Mon, Jun 28, 2021 at 7:04 AM Kinsey Moore <kinsey.moore at oarcorp.com> wrote:
>
> The existing fix for the ZynqMP UART hardware bug only caught the vast
> majority of instances where it could occur. To fully fix the data
> corruption, this fix must be applied after every baud rate change. This
> makes the logic reset and kick apply in any locations where the baud
> rate could be changed.
> ---
>  bsps/aarch64/xilinx-zynqmp/console/console.c | 5 -----
>  bsps/shared/dev/serial/zynq-uart-polled.c    | 6 ++++++
>  bsps/shared/dev/serial/zynq-uart.c           | 8 ++++++++
>  3 files changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/bsps/aarch64/xilinx-zynqmp/console/console.c b/bsps/aarch64/xilinx-zynqmp/console/console.c
> index 9886a117dc..d1948f1a0c 100644
> --- a/bsps/aarch64/xilinx-zynqmp/console/console.c
> +++ b/bsps/aarch64/xilinx-zynqmp/console/console.c
> @@ -113,11 +113,6 @@ static void zynqmp_debug_console_early_init(char c)
>
>    zynq_uart_initialize(base);
>    BSP_output_char = zynqmp_debug_console_out;
> -  /*
> -   * Some ZynqMP UARTs have a hardware bug that causes TX/RX logic restarts to
> -   * require a kick after baud rate registers are initialized.
> -   */
> -  zynqmp_debug_console_out(0);
>    zynqmp_debug_console_out(c);
>  }
>
> diff --git a/bsps/shared/dev/serial/zynq-uart-polled.c b/bsps/shared/dev/serial/zynq-uart-polled.c
> index 74e7255ec2..95c51dea11 100644
> --- a/bsps/shared/dev/serial/zynq-uart-polled.c
> +++ b/bsps/shared/dev/serial/zynq-uart-polled.c
> @@ -144,6 +144,12 @@ void zynq_uart_initialize(rtems_termios_device_context *base)
>    regs->control = ZYNQ_UART_CONTROL_RXEN
>      | ZYNQ_UART_CONTROL_TXEN
>      | ZYNQ_UART_CONTROL_RSTTO;
> +
> +  /*
> +   * Some ZynqMP UARTs have a hardware bug that causes TX/RX logic restarts to
> +   * require a kick after baud rate registers are initialized.
> +   */
> +  zynq_uart_write_polled(base, 0);
>  }
>
>  int zynq_uart_read_polled(rtems_termios_device_context *base)
> diff --git a/bsps/shared/dev/serial/zynq-uart.c b/bsps/shared/dev/serial/zynq-uart.c
> index cd0d0e7584..8503e31d49 100644
> --- a/bsps/shared/dev/serial/zynq-uart.c
> +++ b/bsps/shared/dev/serial/zynq-uart.c
> @@ -214,9 +214,17 @@ static bool zynq_uart_set_attributes(
>    if (baud > 0) {
>      regs->baud_rate_gen = ZYNQ_UART_BAUD_RATE_GEN_CD(brgr);
>      regs->baud_rate_div = ZYNQ_UART_BAUD_RATE_DIV_BDIV(bauddiv);
> +    regs->control |= ZYNQ_UART_CONTROL_RXRES
> +      | ZYNQ_UART_CONTROL_TXRES;
>    }
>    regs->control |= ZYNQ_UART_CONTROL_RXEN | ZYNQ_UART_CONTROL_TXEN;
>
> +  /*
> +   * Some ZynqMP UARTs have a hardware bug that causes TX/RX logic restarts to
> +   * require a kick after baud rate registers are initialized.
> +   */
> +  zynq_uart_write_polled(context, 0);
> +
>    return true;
>  }
>
> --
> 2.20.1
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list