[PATCH 1/2] libchip/ns16550: Allow user calculate baud divisor

Christian Mauderer list at c-mauderer.de
Tue Jan 21 21:04:08 UTC 2020


On 17/01/2020 15:50, G S Niteesh wrote:
> This patch will allow the user to pass a function to calculate
> the baud divisor.
> This is will allow for more flexibility, since for some BSP's
> like raspberrypi, the calculate of baud divisor is different
> from what is in the current driver.
> ---
>  bsps/include/libchip/ns16550.h           | 9 +++++++--
>  bsps/shared/dev/serial/ns16550-context.c | 2 ++
>  2 files changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/bsps/include/libchip/ns16550.h b/bsps/include/libchip/ns16550.h
> index f053c8767f9..a08c58b7b6e 100644
> --- a/bsps/include/libchip/ns16550.h
> +++ b/bsps/include/libchip/ns16550.h
> @@ -60,7 +60,11 @@ typedef uint8_t (*ns16550_get_reg)(uintptr_t port, uint8_t reg);
>  
>  typedef void (*ns16550_set_reg)(uintptr_t port, uint8_t reg, uint8_t value);
>  
> -typedef struct {
> +typedef struct ns16550_context ns16550_context;
> +
> +typedef uint32_t (*ns16550_calculate_baud_divisor)(ns16550_context *ctx, uint32_t baud);
> +
> +struct ns16550_context{
>    rtems_termios_device_context base;
>    ns16550_get_reg get_reg;
>    ns16550_set_reg set_reg;
> @@ -70,6 +74,7 @@ typedef struct {
>    uint32_t initial_baud;
>    bool has_fractional_divider_register;
>    bool has_precision_clock_synthesizer;
> +  ns16550_calculate_baud_divisor calculate_baud_divisor;

Can you add the field to the end of the structure? In C there are two
possibilities to initialize structures: With named fields and just by
order. If you add the field to the end you have backwards compatibility
for both variants.

>    uint8_t modem_control;
>    uint8_t line_control;
>    uint32_t baud_divisor;
> @@ -78,7 +83,7 @@ typedef struct {
>    size_t out_current;
>    const char *out_buf;
>    rtems_termios_tty *tty;
> -} ns16550_context;
> +};
>  
>  extern const rtems_termios_device_handler ns16550_handler_interrupt;
>  extern const rtems_termios_device_handler ns16550_handler_polled;
> diff --git a/bsps/shared/dev/serial/ns16550-context.c b/bsps/shared/dev/serial/ns16550-context.c
> index ce55b8309cc..dbf6c64af4a 100644
> --- a/bsps/shared/dev/serial/ns16550-context.c
> +++ b/bsps/shared/dev/serial/ns16550-context.c
> @@ -112,6 +112,8 @@ static uint32_t NS16550_GetBaudDivisor(ns16550_context *ctx, uint32_t baud)
>        NS16550_FRACTIONAL_DIVIDER,
>        fractionalDivider
>      );
> +  } else if (ctx->calculate_baud_divisor != NULL) {
> +    baudDivisor = ctx->calculate_baud_divisor(ctx, baud);
>    }
>  
>    return baudDivisor;
> 


More information about the devel mailing list