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; > _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel