From 3588b94b06a046d6b25c4b5320c9212212302d6b Mon Sep 17 00:00:00 2001 From: Michael Scott Date: Tue, 29 Jan 2019 11:44:53 -0800 Subject: [PATCH] drivers: serial: mcux: Introduce support for HW flow control Now that a hw-flow-control DTS binding has been added for MCUX uart, let's check for the DT_ define and enable support in the MCUX HAL layer. Signed-off-by: Michael Scott --- drivers/serial/uart_mcux.c | 11 +++++++++++ soc/arm/nxp_kinetis/k6x/dts_fixup.h | 6 ++++++ soc/arm/nxp_kinetis/kwx/dts_fixup.h | 4 ++++ 3 files changed, 21 insertions(+) diff --git a/drivers/serial/uart_mcux.c b/drivers/serial/uart_mcux.c index f1604198481..86137ec5ddc 100644 --- a/drivers/serial/uart_mcux.c +++ b/drivers/serial/uart_mcux.c @@ -16,6 +16,7 @@ struct uart_mcux_config { char *clock_name; clock_control_subsys_t clock_subsys; u32_t baud_rate; + u8_t hw_flow_control; #ifdef CONFIG_UART_INTERRUPT_DRIVEN void (*irq_config_func)(struct device *dev); #endif @@ -245,6 +246,10 @@ static int uart_mcux_init(struct device *dev) UART_GetDefaultConfig(&uart_config); uart_config.enableTx = true; uart_config.enableRx = true; + if (config->hw_flow_control) { + uart_config.enableRxRTS = true; + uart_config.enableTxCTS = true; + } uart_config.baudRate_Bps = config->baud_rate; UART_Init(config->base, &uart_config, clock_freq); @@ -289,6 +294,7 @@ static const struct uart_mcux_config uart_mcux_0_config = { .clock_name = DT_UART_MCUX_0_CLOCK_NAME, .clock_subsys = (clock_control_subsys_t)DT_UART_MCUX_0_CLOCK_SUBSYS, .baud_rate = DT_UART_MCUX_0_BAUD_RATE, + .hw_flow_control = DT_UART_MCUX_0_HW_FLOW_CONTROL, #ifdef CONFIG_UART_INTERRUPT_DRIVEN .irq_config_func = uart_mcux_config_func_0, #endif @@ -332,6 +338,7 @@ static const struct uart_mcux_config uart_mcux_1_config = { .clock_name = DT_UART_MCUX_1_CLOCK_NAME, .clock_subsys = (clock_control_subsys_t)DT_UART_MCUX_1_CLOCK_SUBSYS, .baud_rate = DT_UART_MCUX_1_BAUD_RATE, + .hw_flow_control = DT_UART_MCUX_1_HW_FLOW_CONTROL, #ifdef CONFIG_UART_INTERRUPT_DRIVEN .irq_config_func = uart_mcux_config_func_1, #endif @@ -375,6 +382,7 @@ static const struct uart_mcux_config uart_mcux_2_config = { .clock_name = DT_UART_MCUX_2_CLOCK_NAME, .clock_subsys = (clock_control_subsys_t)DT_UART_MCUX_2_CLOCK_SUBSYS, .baud_rate = DT_UART_MCUX_2_BAUD_RATE, + .hw_flow_control = DT_UART_MCUX_2_HW_FLOW_CONTROL, #ifdef CONFIG_UART_INTERRUPT_DRIVEN .irq_config_func = uart_mcux_config_func_2, #endif @@ -418,6 +426,7 @@ static const struct uart_mcux_config uart_mcux_3_config = { .clock_name = DT_UART_MCUX_3_CLOCK_NAME, .clock_subsys = (clock_control_subsys_t)DT_UART_MCUX_3_CLOCK_SUBSYS, .baud_rate = DT_UART_MCUX_3_BAUD_RATE, + .hw_flow_control = DT_UART_MCUX_3_HW_FLOW_CONTROL, #ifdef CONFIG_UART_INTERRUPT_DRIVEN .irq_config_func = uart_mcux_config_func_3, #endif @@ -461,6 +470,7 @@ static const struct uart_mcux_config uart_mcux_4_config = { .clock_name = DT_UART_MCUX_4_CLOCK_NAME, .clock_subsys = (clock_control_subsys_t)DT_UART_MCUX_4_CLOCK_SUBSYS, .baud_rate = DT_UART_MCUX_4_BAUD_RATE, + .hw_flow_control = DT_UART_MCUX_4_HW_FLOW_CONTROL, #ifdef CONFIG_UART_INTERRUPT_DRIVEN .irq_config_func = uart_mcux_config_func_4, #endif @@ -504,6 +514,7 @@ static const struct uart_mcux_config uart_mcux_5_config = { .clock_name = DT_UART_MCUX_5_CLOCK_NAME, .clock_subsys = (clock_control_subsys_t)DT_UART_MCUX_5_CLOCK_SUBSYS, .baud_rate = DT_UART_MCUX_5_BAUD_RATE, + .hw_flow_control = DT_UART_MCUX_5_HW_FLOW_CONTROL, #ifdef CONFIG_UART_INTERRUPT_DRIVEN .irq_config_func = uart_mcux_config_func_5, #endif diff --git a/soc/arm/nxp_kinetis/k6x/dts_fixup.h b/soc/arm/nxp_kinetis/k6x/dts_fixup.h index ac42f279f08..66c979940a7 100644 --- a/soc/arm/nxp_kinetis/k6x/dts_fixup.h +++ b/soc/arm/nxp_kinetis/k6x/dts_fixup.h @@ -7,6 +7,7 @@ #define DT_UART_MCUX_0_IRQ_ERROR_PRI DT_NXP_KINETIS_UART_4006A000_IRQ_ERROR_PRIORITY #define DT_UART_MCUX_0_IRQ_STATUS DT_NXP_KINETIS_UART_4006A000_IRQ_STATUS #define DT_UART_MCUX_0_IRQ_STATUS_PRI DT_NXP_KINETIS_UART_4006A000_IRQ_STATUS_PRIORITY +#define DT_UART_MCUX_0_HW_FLOW_CONTROL DT_NXP_KINETIS_UART_4006A000_HW_FLOW_CONTROL #define DT_UART_MCUX_0_CLOCK_NAME DT_NXP_KINETIS_UART_4006A000_CLOCK_CONTROLLER #define DT_UART_MCUX_0_CLOCK_SUBSYS DT_NXP_KINETIS_UART_4006A000_CLOCK_NAME @@ -16,6 +17,7 @@ #define DT_UART_MCUX_1_IRQ_ERROR_PRI DT_NXP_KINETIS_UART_4006B000_IRQ_ERROR_PRIORITY #define DT_UART_MCUX_1_IRQ_STATUS DT_NXP_KINETIS_UART_4006B000_IRQ_STATUS #define DT_UART_MCUX_1_IRQ_STATUS_PRI DT_NXP_KINETIS_UART_4006B000_IRQ_STATUS_PRIORITY +#define DT_UART_MCUX_1_HW_FLOW_CONTROL DT_NXP_KINETIS_UART_4006B000_HW_FLOW_CONTROL #define DT_UART_MCUX_1_CLOCK_NAME DT_NXP_KINETIS_UART_4006B000_CLOCK_CONTROLLER #define DT_UART_MCUX_1_CLOCK_SUBSYS DT_NXP_KINETIS_UART_4006B000_CLOCK_NAME @@ -25,6 +27,7 @@ #define DT_UART_MCUX_2_IRQ_ERROR_PRI DT_NXP_KINETIS_UART_4006C000_IRQ_ERROR_PRIORITY #define DT_UART_MCUX_2_IRQ_STATUS DT_NXP_KINETIS_UART_4006C000_IRQ_STATUS #define DT_UART_MCUX_2_IRQ_STATUS_PRI DT_NXP_KINETIS_UART_4006C000_IRQ_STATUS_PRIORITY +#define DT_UART_MCUX_2_HW_FLOW_CONTROL DT_NXP_KINETIS_UART_4006C000_HW_FLOW_CONTROL #define DT_UART_MCUX_2_CLOCK_NAME DT_NXP_KINETIS_UART_4006C000_CLOCK_CONTROLLER #define DT_UART_MCUX_2_CLOCK_SUBSYS DT_NXP_KINETIS_UART_4006C000_CLOCK_NAME @@ -34,6 +37,7 @@ #define DT_UART_MCUX_3_IRQ_ERROR_PRI DT_NXP_KINETIS_UART_4006D000_IRQ_ERROR_PRIORITY #define DT_UART_MCUX_3_IRQ_STATUS DT_NXP_KINETIS_UART_4006D000_IRQ_STATUS #define DT_UART_MCUX_3_IRQ_STATUS_PRI DT_NXP_KINETIS_UART_4006D000_IRQ_STATUS_PRIORITY +#define DT_UART_MCUX_3_HW_FLOW_CONTROL DT_NXP_KINETIS_UART_4006D000_HW_FLOW_CONTROL #define DT_UART_MCUX_3_CLOCK_NAME DT_NXP_KINETIS_UART_4006D000_CLOCK_CONTROLLER #define DT_UART_MCUX_3_CLOCK_SUBSYS DT_NXP_KINETIS_UART_4006D000_CLOCK_NAME @@ -43,6 +47,7 @@ #define DT_UART_MCUX_4_IRQ_ERROR_PRI DT_NXP_KINETIS_UART_400EA000_IRQ_ERROR_PRIORITY #define DT_UART_MCUX_4_IRQ_STATUS DT_NXP_KINETIS_UART_400EA000_IRQ_STATUS #define DT_UART_MCUX_4_IRQ_STATUS_PRI DT_NXP_KINETIS_UART_400EA000_IRQ_STATUS_PRIORITY +#define DT_UART_MCUX_4_HW_FLOW_CONTROL DT_NXP_KINETIS_UART_400EA000_HW_FLOW_CONTROL #define DT_UART_MCUX_4_CLOCK_NAME DT_NXP_KINETIS_UART_400EA000_CLOCK_CONTROLLER #define DT_UART_MCUX_4_CLOCK_SUBSYS DT_NXP_KINETIS_UART_400EA000_CLOCK_NAME @@ -52,6 +57,7 @@ #define DT_UART_MCUX_5_IRQ_ERROR_PRI DT_NXP_KINETIS_UART_400EB000_IRQ_ERROR_PRIORITY #define DT_UART_MCUX_5_IRQ_STATUS DT_NXP_KINETIS_UART_400EB000_IRQ_STATUS #define DT_UART_MCUX_5_IRQ_STATUS_PRI DT_NXP_KINETIS_UART_400EB000_IRQ_STATUS_PRIORITY +#define DT_UART_MCUX_5_HW_FLOW_CONTROL DT_NXP_KINETIS_UART_400EB000_HW_FLOW_CONTROL #define DT_UART_MCUX_5_CLOCK_NAME DT_NXP_KINETIS_UART_400EB000_CLOCK_CONTROLLER #define DT_UART_MCUX_5_CLOCK_SUBSYS DT_NXP_KINETIS_UART_400EB000_CLOCK_NAME diff --git a/soc/arm/nxp_kinetis/kwx/dts_fixup.h b/soc/arm/nxp_kinetis/kwx/dts_fixup.h index 62ef7b9bd59..03f24e12cf9 100644 --- a/soc/arm/nxp_kinetis/kwx/dts_fixup.h +++ b/soc/arm/nxp_kinetis/kwx/dts_fixup.h @@ -41,6 +41,7 @@ #define DT_UART_MCUX_0_IRQ_ERROR_PRI DT_NXP_KINETIS_UART_4006A000_IRQ_ERROR_PRIORITY #define DT_UART_MCUX_0_IRQ_STATUS DT_NXP_KINETIS_UART_4006A000_IRQ_STATUS #define DT_UART_MCUX_0_IRQ_STATUS_PRI DT_NXP_KINETIS_UART_4006A000_IRQ_STATUS_PRIORITY +#define DT_UART_MCUX_0_HW_FLOW_CONTROL DT_NXP_KINETIS_UART_4006A000_HW_FLOW_CONTROL #define DT_UART_MCUX_0_CLOCK_NAME DT_NXP_KINETIS_UART_4006A000_CLOCK_CONTROLLER #define DT_UART_MCUX_0_CLOCK_SUBSYS DT_NXP_KINETIS_UART_4006A000_CLOCK_NAME @@ -50,6 +51,7 @@ #define DT_UART_MCUX_1_IRQ_ERROR_PRI DT_NXP_KINETIS_UART_4006B000_IRQ_ERROR_PRIORITY #define DT_UART_MCUX_1_IRQ_STATUS DT_NXP_KINETIS_UART_4006B000_IRQ_STATUS #define DT_UART_MCUX_1_IRQ_STATUS_PRI DT_NXP_KINETIS_UART_4006B000_IRQ_STATUS_PRIORITY +#define DT_UART_MCUX_1_HW_FLOW_CONTROL DT_NXP_KINETIS_UART_4006B000_HW_FLOW_CONTROL #define DT_UART_MCUX_1_CLOCK_NAME DT_NXP_KINETIS_UART_4006B000_CLOCK_CONTROLLER #define DT_UART_MCUX_1_CLOCK_SUBSYS DT_NXP_KINETIS_UART_4006B000_CLOCK_NAME @@ -59,6 +61,7 @@ #define DT_UART_MCUX_2_IRQ_ERROR_PRI DT_NXP_KINETIS_UART_4006C000_IRQ_ERROR_PRIORITY #define DT_UART_MCUX_2_IRQ_STATUS DT_NXP_KINETIS_UART_4006C000_IRQ_STATUS #define DT_UART_MCUX_2_IRQ_STATUS_PRI DT_NXP_KINETIS_UART_4006C000_IRQ_STATUS_PRIORITY +#define DT_UART_MCUX_2_HW_FLOW_CONTROL DT_NXP_KINETIS_UART_4006C000_HW_FLOW_CONTROL #define DT_UART_MCUX_2_CLOCK_NAME DT_NXP_KINETIS_UART_4006C000_CLOCK_CONTROLLER #define DT_UART_MCUX_2_CLOCK_SUBSYS DT_NXP_KINETIS_UART_4006C000_CLOCK_NAME @@ -68,6 +71,7 @@ #define DT_UART_MCUX_3_IRQ_ERROR_PRI DT_NXP_KINETIS_UART_4006D000_IRQ_ERROR_PRIORITY #define DT_UART_MCUX_3_IRQ_STATUS DT_NXP_KINETIS_UART_4006D000_IRQ_STATUS #define DT_UART_MCUX_3_IRQ_STATUS_PRI DT_NXP_KINETIS_UART_4006D000_IRQ_STATUS_PRIORITY +#define DT_UART_MCUX_3_HW_FLOW_CONTROL DT_NXP_KINETIS_UART_4006D000_HW_FLOW_CONTROL #define DT_UART_MCUX_3_CLOCK_NAME DT_NXP_KINETIS_UART_4006D000_CLOCK_CONTROLLER #define DT_UART_MCUX_3_CLOCK_SUBSYS DT_NXP_KINETIS_UART_4006D000_CLOCK_NAME