serial: Add imx uart driver shim
Adds a shim layer around the imx uart driver to adapt it to the Zephyr serial interface. Modem mode was introduce to control it as DCE and DTE and can be configured in the device tree: modem-mode: type: int category: required description: Set the UART Port to modem mode 0 (dce) 1 (dte) generation: define For now only the UART 2 was tested. Signed-off-by: Diego Sueiro <diego.sueiro@gmail.com>
This commit is contained in:
parent
3afc2b6c61
commit
346165b2e8
6 changed files with 660 additions and 0 deletions
|
@ -1,4 +1,5 @@
|
||||||
zephyr_sources_ifdef(CONFIG_UART_ALTERA_JTAG uart_altera_jtag_hal.c)
|
zephyr_sources_ifdef(CONFIG_UART_ALTERA_JTAG uart_altera_jtag_hal.c)
|
||||||
|
zephyr_sources_if_kconfig(uart_imx.c)
|
||||||
zephyr_sources_if_kconfig(uart_cc32xx.c)
|
zephyr_sources_if_kconfig(uart_cc32xx.c)
|
||||||
zephyr_sources_if_kconfig(uart_cmsdk_apb.c)
|
zephyr_sources_if_kconfig(uart_cmsdk_apb.c)
|
||||||
zephyr_sources_if_kconfig(uart_esp32.c)
|
zephyr_sources_if_kconfig(uart_esp32.c)
|
||||||
|
|
|
@ -73,6 +73,8 @@ source "drivers/serial/Kconfig.mcux_lpsci"
|
||||||
|
|
||||||
source "drivers/serial/Kconfig.mcux_lpuart"
|
source "drivers/serial/Kconfig.mcux_lpuart"
|
||||||
|
|
||||||
|
source "drivers/serial/Kconfig.imx"
|
||||||
|
|
||||||
source "drivers/serial/Kconfig.stellaris"
|
source "drivers/serial/Kconfig.stellaris"
|
||||||
|
|
||||||
source "drivers/serial/Kconfig.nsim"
|
source "drivers/serial/Kconfig.nsim"
|
||||||
|
|
73
drivers/serial/Kconfig.imx
Normal file
73
drivers/serial/Kconfig.imx
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
# Kconfig - iMX7 M4 UART
|
||||||
|
#
|
||||||
|
# Copyright (c) 2018, NXP
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
|
||||||
|
|
||||||
|
menuconfig UART_IMX
|
||||||
|
bool "NXP i.MX7 family processor UART driver"
|
||||||
|
default n
|
||||||
|
select SERIAL_HAS_DRIVER
|
||||||
|
select SERIAL_SUPPORT_INTERRUPT
|
||||||
|
depends on HAS_IMX_HAL
|
||||||
|
help
|
||||||
|
This option enables the UART driver for NXP i.MX7
|
||||||
|
family processors.
|
||||||
|
|
||||||
|
config UART_IMX_UART_1
|
||||||
|
bool "Enable NXP i.MX7 UART1 Port"
|
||||||
|
default n
|
||||||
|
depends on UART_IMX
|
||||||
|
help
|
||||||
|
Enable support for UART1 port in the driver. Say y here
|
||||||
|
if you want to use UART1 device.
|
||||||
|
|
||||||
|
config UART_IMX_UART_2
|
||||||
|
bool "Enable NXP i.MX7 UART2 Port"
|
||||||
|
default n
|
||||||
|
depends on UART_IMX
|
||||||
|
help
|
||||||
|
Enable support for UART2 port in the driver. Say y here
|
||||||
|
if you want to use UART2 device.
|
||||||
|
|
||||||
|
config UART_IMX_UART_3
|
||||||
|
bool "Enable NXP i.MX7 UART3 Port"
|
||||||
|
default n
|
||||||
|
depends on UART_IMX
|
||||||
|
help
|
||||||
|
Enable support for UART3 port in the driver. Say y here
|
||||||
|
if you want to use UART3 device.
|
||||||
|
|
||||||
|
config UART_IMX_UART_4
|
||||||
|
bool "Enable NXP i.MX7 UART4 Port"
|
||||||
|
default n
|
||||||
|
depends on UART_IMX
|
||||||
|
help
|
||||||
|
Enable support for UART4 port in the driver. Say y here
|
||||||
|
if you want to use UART4 device.
|
||||||
|
|
||||||
|
config UART_IMX_UART_5
|
||||||
|
bool "Enable NXP i.MX7 UART5 Port"
|
||||||
|
default n
|
||||||
|
depends on UART_IMX
|
||||||
|
help
|
||||||
|
Enable support for UART5 port in the driver. Say y here
|
||||||
|
if you want to use UART5 device.
|
||||||
|
|
||||||
|
config UART_IMX_UART_6
|
||||||
|
bool "Enable NXP i.MX7 UART6 Port"
|
||||||
|
default n
|
||||||
|
depends on UART_IMX
|
||||||
|
help
|
||||||
|
Enable support for UART6 port in the driver. Say y here
|
||||||
|
if you want to use UART6 device.
|
||||||
|
|
||||||
|
config UART_IMX_UART_7
|
||||||
|
bool "Enable NXP i.MX7 UART7 Port"
|
||||||
|
default n
|
||||||
|
depends on UART_IMX
|
||||||
|
help
|
||||||
|
Enable support for UART7 port in the driver. Say y here
|
||||||
|
if you want to use UART7 device.
|
528
drivers/serial/uart_imx.c
Normal file
528
drivers/serial/uart_imx.c
Normal file
|
@ -0,0 +1,528 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018 Diego Sueiro <diego.sueiro@gmail.com>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Driver for UART on NXP IMX family processor.
|
||||||
|
*
|
||||||
|
* For full serial function, use the USART controller.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <kernel.h>
|
||||||
|
#include <arch/cpu.h>
|
||||||
|
#include <misc/__assert.h>
|
||||||
|
#include <board.h>
|
||||||
|
#include <init.h>
|
||||||
|
#include <uart.h>
|
||||||
|
#include <uart_imx.h>
|
||||||
|
|
||||||
|
#define DEV_CFG(dev) \
|
||||||
|
((const struct imx_uart_config *const)(dev)->config->config_info)
|
||||||
|
#define UART_STRUCT(dev) \
|
||||||
|
((UART_Type *)(DEV_CFG(dev))->base)
|
||||||
|
|
||||||
|
struct imx_uart_config {
|
||||||
|
UART_Type *base;
|
||||||
|
u32_t baud_rate;
|
||||||
|
u8_t modem_mode;
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
void (*irq_config_func)(struct device *dev);
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
struct imx_uart_data {
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
uart_irq_callback_t callback;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Initialize UART channel
|
||||||
|
*
|
||||||
|
* This routine is called to reset the chip in a quiescent state.
|
||||||
|
* It is assumed that this function is called only once per UART.
|
||||||
|
*
|
||||||
|
* @param dev UART device struct
|
||||||
|
*
|
||||||
|
* @return 0
|
||||||
|
*/
|
||||||
|
static int uart_imx_init(struct device *dev)
|
||||||
|
{
|
||||||
|
UART_Type *uart = UART_STRUCT(dev);
|
||||||
|
const struct imx_uart_config *config = dev->config->config_info;
|
||||||
|
int old_level;
|
||||||
|
|
||||||
|
/* disable interrupts */
|
||||||
|
old_level = irq_lock();
|
||||||
|
|
||||||
|
/* Setup UART init structure */
|
||||||
|
uart_init_config_t initConfig = {
|
||||||
|
.baudRate = config->baud_rate,
|
||||||
|
.wordLength = uartWordLength8Bits,
|
||||||
|
.stopBitNum = uartStopBitNumOne,
|
||||||
|
.parity = uartParityDisable,
|
||||||
|
.direction = uartDirectionTxRx
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Get current module clock frequency */
|
||||||
|
initConfig.clockRate = get_uart_clock_freq(uart);
|
||||||
|
|
||||||
|
UART_Init(uart, &initConfig);
|
||||||
|
|
||||||
|
/* Set UART build-in hardware FIFO Watermark. */
|
||||||
|
UART_SetTxFifoWatermark(uart, 1);
|
||||||
|
UART_SetRxFifoWatermark(uart, 1);
|
||||||
|
|
||||||
|
/* restore interrupt state */
|
||||||
|
irq_unlock(old_level);
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
config->irq_config_func(dev);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Set UART modem mode */
|
||||||
|
UART_SetModemMode(uart, config->modem_mode);
|
||||||
|
|
||||||
|
/* Finally, enable the UART module */
|
||||||
|
UART_Enable(uart);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static unsigned char uart_imx_poll_out(struct device *dev, unsigned char c)
|
||||||
|
{
|
||||||
|
UART_Type *uart = UART_STRUCT(dev);
|
||||||
|
|
||||||
|
while (!UART_GetStatusFlag(uart, uartStatusTxReady))
|
||||||
|
;
|
||||||
|
UART_Putchar(uart, c);
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int uart_imx_poll_in(struct device *dev, unsigned char *c)
|
||||||
|
{
|
||||||
|
UART_Type *uart = UART_STRUCT(dev);
|
||||||
|
|
||||||
|
while (!UART_GetStatusFlag(uart, uartStatusRxReady))
|
||||||
|
;
|
||||||
|
*c = UART_Getchar(uart);
|
||||||
|
|
||||||
|
if (UART_GetStatusFlag(uart, uartStatusRxOverrun)) {
|
||||||
|
UART_ClearStatusFlag(uart, uartStatusRxOverrun);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
|
||||||
|
static int uart_imx_fifo_fill(struct device *dev, const u8_t *tx_data,
|
||||||
|
int size)
|
||||||
|
{
|
||||||
|
UART_Type *uart = UART_STRUCT(dev);
|
||||||
|
unsigned int num_tx = 0;
|
||||||
|
|
||||||
|
while (((size - num_tx) > 0) &&
|
||||||
|
UART_GetStatusFlag(uart, uartStatusTxReady)) {
|
||||||
|
/* Send a character */
|
||||||
|
UART_Putchar(uart, tx_data[num_tx]);
|
||||||
|
num_tx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (int)num_tx;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int uart_imx_fifo_read(struct device *dev, u8_t *rx_data,
|
||||||
|
const int size)
|
||||||
|
{
|
||||||
|
UART_Type *uart = UART_STRUCT(dev);
|
||||||
|
unsigned int num_rx = 0;
|
||||||
|
|
||||||
|
while (((size - num_rx) > 0) &&
|
||||||
|
UART_GetStatusFlag(uart, uartStatusRxReady)) {
|
||||||
|
/* Receive a character */
|
||||||
|
rx_data[num_rx++] = UART_Getchar(uart);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UART_GetStatusFlag(uart, uartStatusRxOverrun)) {
|
||||||
|
UART_ClearStatusFlag(uart, uartStatusRxOverrun);
|
||||||
|
}
|
||||||
|
|
||||||
|
return num_rx;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void uart_imx_irq_tx_enable(struct device *dev)
|
||||||
|
{
|
||||||
|
UART_Type *uart = UART_STRUCT(dev);
|
||||||
|
|
||||||
|
UART_SetIntCmd(uart, uartIntTxReady, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void uart_imx_irq_tx_disable(struct device *dev)
|
||||||
|
{
|
||||||
|
UART_Type *uart = UART_STRUCT(dev);
|
||||||
|
|
||||||
|
UART_SetIntCmd(uart, uartIntTxReady, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int uart_imx_irq_tx_ready(struct device *dev)
|
||||||
|
{
|
||||||
|
UART_Type *uart = UART_STRUCT(dev);
|
||||||
|
|
||||||
|
return UART_GetStatusFlag(uart, uartStatusTxReady);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void uart_imx_irq_rx_enable(struct device *dev)
|
||||||
|
{
|
||||||
|
UART_Type *uart = UART_STRUCT(dev);
|
||||||
|
|
||||||
|
UART_SetIntCmd(uart, uartIntRxReady, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void uart_imx_irq_rx_disable(struct device *dev)
|
||||||
|
{
|
||||||
|
UART_Type *uart = UART_STRUCT(dev);
|
||||||
|
|
||||||
|
UART_SetIntCmd(uart, uartIntRxReady, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int uart_imx_irq_rx_ready(struct device *dev)
|
||||||
|
{
|
||||||
|
UART_Type *uart = UART_STRUCT(dev);
|
||||||
|
|
||||||
|
return UART_GetStatusFlag(uart, uartStatusRxReady);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void uart_imx_irq_err_enable(struct device *dev)
|
||||||
|
{
|
||||||
|
UART_Type *uart = UART_STRUCT(dev);
|
||||||
|
|
||||||
|
UART_SetIntCmd(uart, uartIntParityError, true);
|
||||||
|
UART_SetIntCmd(uart, uartIntFrameError, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void uart_imx_irq_err_disable(struct device *dev)
|
||||||
|
{
|
||||||
|
UART_Type *uart = UART_STRUCT(dev);
|
||||||
|
|
||||||
|
UART_SetIntCmd(uart, uartIntParityError, false);
|
||||||
|
UART_SetIntCmd(uart, uartIntFrameError, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int uart_imx_irq_is_pending(struct device *dev)
|
||||||
|
{
|
||||||
|
UART_Type *uart = UART_STRUCT(dev);
|
||||||
|
|
||||||
|
return UART_GetStatusFlag(uart, uartStatusRxReady) ||
|
||||||
|
UART_GetStatusFlag(uart, uartStatusTxReady);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int uart_imx_irq_update(struct device *dev)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void uart_imx_irq_callback_set(struct device *dev,
|
||||||
|
uart_irq_callback_t cb)
|
||||||
|
{
|
||||||
|
struct imx_uart_data *data = dev->driver_data;
|
||||||
|
|
||||||
|
data->callback = cb;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Interrupt service routine.
|
||||||
|
*
|
||||||
|
* This simply calls the callback function, if one exists.
|
||||||
|
*
|
||||||
|
* Note: imx UART Tx interrupts when ready to send; Rx interrupts when char
|
||||||
|
* received.
|
||||||
|
*
|
||||||
|
* @param arg Argument to ISR.
|
||||||
|
*
|
||||||
|
* @return N/A
|
||||||
|
*/
|
||||||
|
void uart_imx_isr(void *arg)
|
||||||
|
{
|
||||||
|
struct device *dev = arg;
|
||||||
|
struct imx_uart_data *data = dev->driver_data;
|
||||||
|
|
||||||
|
if (data->callback) {
|
||||||
|
data->callback(dev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_UART_INTERRUPT_DRIVEN */
|
||||||
|
|
||||||
|
static const struct uart_driver_api uart_imx_driver_api = {
|
||||||
|
.poll_in = uart_imx_poll_in,
|
||||||
|
.poll_out = uart_imx_poll_out,
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
.fifo_fill = uart_imx_fifo_fill,
|
||||||
|
.fifo_read = uart_imx_fifo_read,
|
||||||
|
.irq_tx_enable = uart_imx_irq_tx_enable,
|
||||||
|
.irq_tx_disable = uart_imx_irq_tx_disable,
|
||||||
|
.irq_tx_ready = uart_imx_irq_tx_ready,
|
||||||
|
.irq_rx_enable = uart_imx_irq_rx_enable,
|
||||||
|
.irq_rx_disable = uart_imx_irq_rx_disable,
|
||||||
|
.irq_rx_ready = uart_imx_irq_rx_ready,
|
||||||
|
.irq_err_enable = uart_imx_irq_err_enable,
|
||||||
|
.irq_err_disable = uart_imx_irq_err_disable,
|
||||||
|
.irq_is_pending = uart_imx_irq_is_pending,
|
||||||
|
.irq_update = uart_imx_irq_update,
|
||||||
|
.irq_callback_set = uart_imx_irq_callback_set,
|
||||||
|
#endif /* CONFIG_UART_INTERRUPT_DRIVEN */
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_IMX_UART_1
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
static void irq_config_func_1(struct device *port);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const struct imx_uart_config imx_uart_1_config = {
|
||||||
|
.base = (UART_Type *) CONFIG_UART_IMX_UART_1_BASE_ADDRESS,
|
||||||
|
.baud_rate = CONFIG_UART_IMX_UART_1_BAUD_RATE,
|
||||||
|
.modem_mode = CONFIG_UART_IMX_UART_1_MODEM_MODE,
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
.irq_config_func = irq_config_func_1,
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct imx_uart_data imx_uart_1_data;
|
||||||
|
|
||||||
|
DEVICE_AND_API_INIT(uart_1, CONFIG_UART_IMX_UART_1_NAME, &uart_imx_init,
|
||||||
|
&imx_uart_1_data, &imx_uart_1_config,
|
||||||
|
PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEVICE,
|
||||||
|
&uart_imx_driver_api);
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
static void irq_config_func_1(struct device *dev)
|
||||||
|
{
|
||||||
|
IRQ_CONNECT(CONFIG_UART_IMX_UART_1_IRQ_NUM,
|
||||||
|
CONFIG_UART_IMX_UART_1_IRQ_PRI,
|
||||||
|
uart_imx_isr, DEVICE_GET(uart_1),
|
||||||
|
0);
|
||||||
|
irq_enable(CONFIG_UART_IMX_UART_1_IRQ_NUM);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* CONFIG_UART_IMX_UART_1 */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_IMX_UART_2
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
static void irq_config_func_2(struct device *port);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const struct imx_uart_config imx_uart_2_config = {
|
||||||
|
.base = (UART_Type *) CONFIG_UART_IMX_UART_2_BASE_ADDRESS,
|
||||||
|
.baud_rate = CONFIG_UART_IMX_UART_2_BAUD_RATE,
|
||||||
|
.modem_mode = CONFIG_UART_IMX_UART_2_MODEM_MODE,
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
.irq_config_func = irq_config_func_2,
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct imx_uart_data imx_uart_2_data;
|
||||||
|
|
||||||
|
DEVICE_AND_API_INIT(uart_2, CONFIG_UART_IMX_UART_2_NAME, &uart_imx_init,
|
||||||
|
&imx_uart_2_data, &imx_uart_2_config,
|
||||||
|
PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEVICE,
|
||||||
|
&uart_imx_driver_api);
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
static void irq_config_func_2(struct device *dev)
|
||||||
|
{
|
||||||
|
IRQ_CONNECT(CONFIG_UART_IMX_UART_2_IRQ_NUM,
|
||||||
|
CONFIG_UART_IMX_UART_2_IRQ_PRI,
|
||||||
|
uart_imx_isr, DEVICE_GET(uart_2),
|
||||||
|
0);
|
||||||
|
irq_enable(CONFIG_UART_IMX_UART_2_IRQ_NUM);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* CONFIG_UART_IMX_UART_2 */
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_IMX_UART_3
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
static void irq_config_func_3(struct device *port);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const struct imx_uart_config imx_uart_3_config = {
|
||||||
|
.base = (UART_Type *) CONFIG_UART_IMX_UART_3_BASE_ADDRESS,
|
||||||
|
.baud_rate = CONFIG_UART_IMX_UART_3_BAUD_RATE,
|
||||||
|
.modem_mode = CONFIG_UART_IMX_UART_3_MODEM_MODE,
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
.irq_config_func = irq_config_func_3,
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct imx_uart_data imx_uart_3_data;
|
||||||
|
|
||||||
|
DEVICE_AND_API_INIT(uart_3, CONFIG_UART_IMX_UART_3_NAME, &uart_imx_init,
|
||||||
|
&imx_uart_3_data, &imx_uart_3_config,
|
||||||
|
PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEVICE,
|
||||||
|
&uart_imx_driver_api);
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
static void irq_config_func_3(struct device *dev)
|
||||||
|
{
|
||||||
|
IRQ_CONNECT(CONFIG_UART_IMX_UART_3_IRQ_NUM,
|
||||||
|
CONFIG_UART_IMX_UART_3_IRQ_PRI,
|
||||||
|
uart_imx_isr, DEVICE_GET(uart_3),
|
||||||
|
0);
|
||||||
|
irq_enable(CONFIG_UART_IMX_UART_3_IRQ_NUM);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* CONFIG_UART_IMX_UART_3 */
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_IMX_UART_4
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
static void irq_config_func_4(struct device *port);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const struct imx_uart_config imx_uart_4_config = {
|
||||||
|
.base = (UART_Type *) CONFIG_UART_IMX_UART_4_BASE_ADDRESS,
|
||||||
|
.baud_rate = CONFIG_UART_IMX_UART_4_BAUD_RATE,
|
||||||
|
.modem_mode = CONFIG_UART_IMX_UART_4_MODEM_MODE,
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
.irq_config_func = irq_config_func_4,
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct imx_uart_data imx_uart_4_data;
|
||||||
|
|
||||||
|
DEVICE_AND_API_INIT(uart_4, CONFIG_UART_IMX_UART_4_NAME, &uart_imx_init,
|
||||||
|
&imx_uart_4_data, &imx_uart_4_config,
|
||||||
|
PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEVICE,
|
||||||
|
&uart_imx_driver_api);
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
static void irq_config_func_4(struct device *dev)
|
||||||
|
{
|
||||||
|
IRQ_CONNECT(CONFIG_UART_IMX_UART_4_IRQ_NUM,
|
||||||
|
CONFIG_UART_IMX_UART_4_IRQ_PRI,
|
||||||
|
uart_imx_isr, DEVICE_GET(uart_4),
|
||||||
|
0);
|
||||||
|
irq_enable(CONFIG_UART_IMX_UART_4_IRQ_NUM);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* CONFIG_UART_IMX_UART_4 */
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_IMX_UART_5
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
static void irq_config_func_5(struct device *port);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const struct imx_uart_config imx_uart_5_config = {
|
||||||
|
.base = (UART_Type *) CONFIG_UART_IMX_UART_5_BASE_ADDRESS,
|
||||||
|
.baud_rate = CONFIG_UART_IMX_UART_5_BAUD_RATE,
|
||||||
|
.modem_mode = CONFIG_UART_IMX_UART_5_MODEM_MODE,
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
.irq_config_func = irq_config_func_5,
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct imx_uart_data imx_uart_5_data;
|
||||||
|
|
||||||
|
DEVICE_AND_API_INIT(uart_5, CONFIG_UART_IMX_UART_5_NAME, &uart_imx_init,
|
||||||
|
&imx_uart_5_data, &imx_uart_5_config,
|
||||||
|
PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEVICE,
|
||||||
|
&uart_imx_driver_api);
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
static void irq_config_func_5(struct device *dev)
|
||||||
|
{
|
||||||
|
IRQ_CONNECT(CONFIG_UART_IMX_UART_5_IRQ_NUM,
|
||||||
|
CONFIG_UART_IMX_UART_5_IRQ_PRI,
|
||||||
|
uart_imx_isr, DEVICE_GET(uart_5),
|
||||||
|
0);
|
||||||
|
irq_enable(CONFIG_UART_IMX_UART_5_IRQ_NUM);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* CONFIG_UART_IMX_UART_5 */
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_IMX_UART_6
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
static void irq_config_func_6(struct device *port);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const struct imx_uart_config imx_uart_6_config = {
|
||||||
|
.base = (UART_Type *) CONFIG_UART_IMX_UART_6_BASE_ADDRESS,
|
||||||
|
.baud_rate = CONFIG_UART_IMX_UART_6_BAUD_RATE,
|
||||||
|
.modem_mode = CONFIG_UART_IMX_UART_6_MODEM_MODE,
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
.irq_config_func = irq_config_func_6,
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct imx_uart_data imx_uart_6_data;
|
||||||
|
|
||||||
|
DEVICE_AND_API_INIT(uart_6, CONFIG_UART_IMX_UART_6_NAME, &uart_imx_init,
|
||||||
|
&imx_uart_6_data, &imx_uart_6_config,
|
||||||
|
PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEVICE,
|
||||||
|
&uart_imx_driver_api);
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
static void irq_config_func_6(struct device *dev)
|
||||||
|
{
|
||||||
|
IRQ_CONNECT(CONFIG_UART_IMX_UART_6_IRQ_NUM,
|
||||||
|
CONFIG_UART_IMX_UART_6_IRQ_PRI,
|
||||||
|
uart_imx_isr, DEVICE_GET(uart_6),
|
||||||
|
0);
|
||||||
|
irq_enable(CONFIG_UART_IMX_UART_6_IRQ_NUM);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* CONFIG_UART_IMX_UART_6 */
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_IMX_UART_7
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
static void irq_config_func_7(struct device *port);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const struct imx_uart_config imx_uart_7_config = {
|
||||||
|
.base = (UART_Type *) CONFIG_UART_IMX_UART_7_BASE_ADDRESS,
|
||||||
|
.baud_rate = CONFIG_UART_IMX_UART_7_BAUD_RATE,
|
||||||
|
.modem_mode = CONFIG_UART_IMX_UART_7_MODEM_MODE,
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
.irq_config_func = irq_config_func_7,
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct imx_uart_data imx_uart_7_data;
|
||||||
|
|
||||||
|
DEVICE_AND_API_INIT(uart_7, CONFIG_UART_IMX_UART_7_NAME, &uart_imx_init,
|
||||||
|
&imx_uart_7_data, &imx_uart_7_config,
|
||||||
|
PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEVICE,
|
||||||
|
&uart_imx_driver_api);
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
static void irq_config_func_7(struct device *dev)
|
||||||
|
{
|
||||||
|
IRQ_CONNECT(CONFIG_UART_IMX_UART_7_IRQ_NUM,
|
||||||
|
CONFIG_UART_IMX_UART_7_IRQ_PRI,
|
||||||
|
uart_imx_isr, DEVICE_GET(uart_7),
|
||||||
|
0);
|
||||||
|
irq_enable(CONFIG_UART_IMX_UART_7_IRQ_NUM);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* CONFIG_UART_IMX_UART_7 */
|
54
dts/bindings/serial/nxp,imx-uart.yaml
Normal file
54
dts/bindings/serial/nxp,imx-uart.yaml
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
#
|
||||||
|
# Copyright (c) 2017, NXP
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
---
|
||||||
|
title: iMX Uart
|
||||||
|
id: nxp,imx-uart
|
||||||
|
version: 0.1
|
||||||
|
|
||||||
|
description: >
|
||||||
|
This binding gives a base representation of the iMX UART
|
||||||
|
|
||||||
|
inherits:
|
||||||
|
!include uart.yaml
|
||||||
|
|
||||||
|
properties:
|
||||||
|
compatible:
|
||||||
|
type: string
|
||||||
|
category: required
|
||||||
|
description: compatible strings
|
||||||
|
constraint: "nxp,imx-uart"
|
||||||
|
|
||||||
|
reg:
|
||||||
|
type: array
|
||||||
|
description: mmio register space
|
||||||
|
generation: define
|
||||||
|
category: required
|
||||||
|
|
||||||
|
interrupts:
|
||||||
|
type: array
|
||||||
|
category: required
|
||||||
|
description: required interrupts
|
||||||
|
generation: define
|
||||||
|
|
||||||
|
pinctrl-\d+:
|
||||||
|
type: array
|
||||||
|
category: optional
|
||||||
|
description: pinmux information for RX, TX, CTS, RTS
|
||||||
|
generation: define
|
||||||
|
|
||||||
|
clocks:
|
||||||
|
type: array
|
||||||
|
category: required
|
||||||
|
description: Clock gate control information
|
||||||
|
generation: structures
|
||||||
|
|
||||||
|
modem-mode:
|
||||||
|
type: int
|
||||||
|
category: required
|
||||||
|
description: Set the UART Port to modem mode 0 (dce) 1 (dte)
|
||||||
|
generation: define
|
||||||
|
|
||||||
|
...
|
|
@ -4,3 +4,5 @@ if(CONFIG_SOC_MCIMX7_M4)
|
||||||
zephyr_sources_ifdef(CONFIG_CLOCK_CONTROL_IMX_CCM ccm_imx7d.c)
|
zephyr_sources_ifdef(CONFIG_CLOCK_CONTROL_IMX_CCM ccm_imx7d.c)
|
||||||
zephyr_sources_ifdef(CONFIG_CLOCK_CONTROL_IMX_CCM ccm_analog_imx7d.c)
|
zephyr_sources_ifdef(CONFIG_CLOCK_CONTROL_IMX_CCM ccm_analog_imx7d.c)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
zephyr_sources_ifdef(CONFIG_UART_IMX uart_imx.c)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue