[PATCH v4] zynq-uart: Fix set_attributes implementation

Gedare Bloom gedare at rtems.org
Thu Dec 3 19:21:17 UTC 2020


looks good to me

On Thu, Dec 3, 2020 at 12:10 PM Kinsey Moore <kinsey.moore at oarcorp.com>
wrote:

> The zynq-uart set_attributes implementation was configured to always
> return false which causes spconsole01 to fail. This restores the
> disabled implementation which sets the baud rate registers
> appropriately and allows spconsole01 to pass. This also expands the
> set_attributes functionality to allow setting of the stop bits,
> character width, and parity.
> ---
>  bsps/include/dev/serial/zynq-uart.h       |  7 +++
>  bsps/shared/dev/serial/zynq-uart-polled.c |  2 +-
>  bsps/shared/dev/serial/zynq-uart.c        | 56 +++++++++++++++++++++--
>  3 files changed, 59 insertions(+), 6 deletions(-)
>
> diff --git a/bsps/include/dev/serial/zynq-uart.h
> b/bsps/include/dev/serial/zynq-uart.h
> index 2c0f250a3a..0eb1dd5f29 100644
> --- a/bsps/include/dev/serial/zynq-uart.h
> +++ b/bsps/include/dev/serial/zynq-uart.h
> @@ -78,6 +78,13 @@ void zynq_uart_write_polled(
>    */
>  void zynq_uart_reset_tx_flush(zynq_uart_context *ctx);
>
> +int zynq_cal_baud_rate(
> +  uint32_t  baudrate,
> +  uint32_t* brgr,
> +  uint32_t* bauddiv,
> +  uint32_t  modereg
> +);
> +
>  #ifdef __cplusplus
>  }
>  #endif /* __cplusplus */
> diff --git a/bsps/shared/dev/serial/zynq-uart-polled.c
> b/bsps/shared/dev/serial/zynq-uart-polled.c
> index a1b51ea521..442431d502 100644
> --- a/bsps/shared/dev/serial/zynq-uart-polled.c
> +++ b/bsps/shared/dev/serial/zynq-uart-polled.c
> @@ -40,7 +40,7 @@ uint32_t zynq_uart_input_clock(void)
>    return ZYNQ_CLOCK_UART;
>  }
>
> -static int zynq_cal_baud_rate(uint32_t  baudrate,
> +int zynq_cal_baud_rate(uint32_t  baudrate,
>                                uint32_t* brgr,
>                                uint32_t* bauddiv,
>                                uint32_t  modereg)
> diff --git a/bsps/shared/dev/serial/zynq-uart.c
> b/bsps/shared/dev/serial/zynq-uart.c
> index 41adb196ab..8f17d3ca65 100644
> --- a/bsps/shared/dev/serial/zynq-uart.c
> +++ b/bsps/shared/dev/serial/zynq-uart.c
> @@ -142,25 +142,71 @@ static bool zynq_uart_set_attributes(
>    const struct termios *term
>  )
>  {
> -#if 0
> -  volatile zynq_uart *regs = zynq_uart_get_regs(minor);
> +  zynq_uart_context *ctx = (zynq_uart_context *) context;
> +  volatile zynq_uart *regs = ctx->regs;
>    uint32_t brgr = 0;
>    uint32_t bauddiv = 0;
> +  uint32_t mode = 0;
>    int rc;
>
>    rc = zynq_cal_baud_rate(115200, &brgr, &bauddiv, regs->mode);
>    if (rc != 0)
>      return rc;
>
> +  /*
> +   * Configure the mode register
> +   */
> +  mode |= ZYNQ_UART_MODE_CHMODE(ZYNQ_UART_MODE_CHMODE_NORMAL);
> +
> +  /*
> +   * Parity
> +   */
> +  mode |= ZYNQ_UART_MODE_PAR(ZYNQ_UART_MODE_PAR_NONE);
> +  if (term->c_cflag & PARENB) {
> +    if (!(term->c_cflag & PARODD)) {
> +      mode |= ZYNQ_UART_MODE_PAR(ZYNQ_UART_MODE_PAR_ODD);
> +    } else {
> +      mode |= ZYNQ_UART_MODE_PAR(ZYNQ_UART_MODE_PAR_EVEN);
> +    }
> +  }
> +
> +  /*
> +   * Character Size
> +   */
> +  switch (term->c_cflag & CSIZE)
> +  {
> +  case CS5:
> +    return false;
> +  case CS6:
> +    mode |= ZYNQ_UART_MODE_CHRL(ZYNQ_UART_MODE_CHRL_6);
> +    break;
> +  case CS7:
> +    mode |= ZYNQ_UART_MODE_CHRL(ZYNQ_UART_MODE_CHRL_7);
> +    break;
> +  case CS8:
> +  default:
> +    mode |= ZYNQ_UART_MODE_CHRL(ZYNQ_UART_MODE_CHRL_8);
> +    break;
> +  }
> +
> +  /*
> +   * Stop Bits
> +   */
> +  if (term->c_cflag & CSTOPB) {
> +    /* 2 stop bits */
> +    mode |= ZYNQ_UART_MODE_NBSTOP(ZYNQ_UART_MODE_NBSTOP_STOP_2);
> +  } else {
> +    /* 1 stop bit */
> +    mode |= ZYNQ_UART_MODE_NBSTOP(ZYNQ_UART_MODE_NBSTOP_STOP_1);
> +  }
> +
>    regs->control &= ~(ZYNQ_UART_CONTROL_RXEN | ZYNQ_UART_CONTROL_TXEN);
> +  regs->mode = mode;
>    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_RXEN | ZYNQ_UART_CONTROL_TXEN;
>
>    return true;
> -#else
> -  return false;
> -#endif
>  }
>
>  const rtems_termios_device_handler zynq_uart_handler = {
> --
> 2.20.1
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20201203/77f813de/attachment.html>


More information about the devel mailing list