drivers: serial: nrfx_uarte: add support for pinctrl
This patch adds support for the new pinctrl API to the UARTE driver. The old pin property based solution is still kept so that users have time to transition to the new model. Notes: - Some build assertions cannot be performed since the driver does not have direct access to pin settings anymore. As a result user will not be notified if HWFC is enabled but RTS/CTS pins are not configured. - Hardware flow control can be enabled regardless of pin configuration, it is now up to the user to configure RTS/CTS pins in DT. - Some RX enable checks that were performed using pin information has been replaced with a DT property that informs if RX is enabled or not. Signed-off-by: Gerard Marull-Paretas <gerard.marull@nordicsemi.no>
This commit is contained in:
parent
6399ad50f4
commit
3b7215e160
2 changed files with 208 additions and 164 deletions
|
@ -9,7 +9,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <drivers/uart.h>
|
#include <drivers/uart.h>
|
||||||
#include <hal/nrf_gpio.h>
|
|
||||||
#include <hal/nrf_uarte.h>
|
#include <hal/nrf_uarte.h>
|
||||||
#include <nrfx_timer.h>
|
#include <nrfx_timer.h>
|
||||||
#include <sys/util.h>
|
#include <sys/util.h>
|
||||||
|
@ -18,6 +18,12 @@
|
||||||
#include <helpers/nrfx_gppi.h>
|
#include <helpers/nrfx_gppi.h>
|
||||||
LOG_MODULE_REGISTER(uart_nrfx_uarte, LOG_LEVEL_ERR);
|
LOG_MODULE_REGISTER(uart_nrfx_uarte, LOG_LEVEL_ERR);
|
||||||
|
|
||||||
|
#ifdef CONFIG_PINCTRL
|
||||||
|
#include <drivers/pinctrl.h>
|
||||||
|
#else
|
||||||
|
#include <hal/nrf_gpio.h>
|
||||||
|
#endif /* CONFIG_PINCTRL */
|
||||||
|
|
||||||
/* Generalize PPI or DPPI channel management */
|
/* Generalize PPI or DPPI channel management */
|
||||||
#if defined(CONFIG_HAS_HW_NRF_PPI)
|
#if defined(CONFIG_HAS_HW_NRF_PPI)
|
||||||
#include <nrfx_ppi.h>
|
#include <nrfx_ppi.h>
|
||||||
|
@ -132,41 +138,34 @@ struct uarte_nrfx_data {
|
||||||
#define UARTE_LOW_POWER_TX BIT(0)
|
#define UARTE_LOW_POWER_TX BIT(0)
|
||||||
#define UARTE_LOW_POWER_RX BIT(1)
|
#define UARTE_LOW_POWER_RX BIT(1)
|
||||||
|
|
||||||
/* Flag indicating that CTS pin is used. */
|
|
||||||
#define UARTE_CFG_FLAG_CTS_PIN_SET BIT(0)
|
|
||||||
|
|
||||||
/* Flag indicating that RTS pin is used. */
|
|
||||||
#define UARTE_CFG_FLAG_RTS_PIN_SET BIT(1)
|
|
||||||
|
|
||||||
/* If enabled, pins are managed when going to low power mode. */
|
/* If enabled, pins are managed when going to low power mode. */
|
||||||
#define UARTE_CFG_FLAG_GPIO_MGMT BIT(2)
|
#define UARTE_CFG_FLAG_GPIO_MGMT BIT(0)
|
||||||
|
|
||||||
/* If enabled then ENDTX is PPI'ed to TXSTOP */
|
/* If enabled then ENDTX is PPI'ed to TXSTOP */
|
||||||
#define UARTE_CFG_FLAG_PPI_ENDTX BIT(3)
|
#define UARTE_CFG_FLAG_PPI_ENDTX BIT(1)
|
||||||
|
|
||||||
/* If enabled then UARTE peripheral is disabled when not used. This allows
|
/* If enabled then UARTE peripheral is disabled when not used. This allows
|
||||||
* to achieve lowest power consumption in idle.
|
* to achieve lowest power consumption in idle.
|
||||||
*/
|
*/
|
||||||
#define UARTE_CFG_FLAG_LOW_POWER BIT(4)
|
#define UARTE_CFG_FLAG_LOW_POWER BIT(4)
|
||||||
|
|
||||||
#define IS_CTS_PIN_SET(flags) (flags & UARTE_CFG_FLAG_CTS_PIN_SET)
|
|
||||||
#define IS_RTS_PIN_SET(flags) (flags & UARTE_CFG_FLAG_RTS_PIN_SET)
|
|
||||||
#define IS_HWFC_PINS_USED(flags) \
|
|
||||||
(IS_CTS_PIN_SET(flags) | IS_RTS_PIN_SET(flags))
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Structure for UARTE configuration.
|
* @brief Structure for UARTE configuration.
|
||||||
*/
|
*/
|
||||||
struct uarte_nrfx_config {
|
struct uarte_nrfx_config {
|
||||||
NRF_UARTE_Type *uarte_regs; /* Instance address */
|
NRF_UARTE_Type *uarte_regs; /* Instance address */
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
uint32_t pseltxd; /* PSEL.TXD register value */
|
bool disable_rx;
|
||||||
uint32_t pselrxd; /* PSEL.RXD register value */
|
#ifdef CONFIG_PINCTRL
|
||||||
uint32_t pselcts; /* PSEL.CTS register value */
|
const struct pinctrl_dev_config *pcfg;
|
||||||
uint32_t pselrts; /* PSEL.RTS register value */
|
#else
|
||||||
nrf_gpio_pin_pull_t rxd_pull; /* RXD pin pull configuration */
|
uint32_t tx_pin;
|
||||||
nrf_gpio_pin_pull_t cts_pull; /* CTS pin pull configuration */
|
uint32_t rx_pin;
|
||||||
|
uint32_t rts_pin;
|
||||||
|
uint32_t cts_pin;
|
||||||
|
bool rx_pull_up;
|
||||||
|
bool cts_pull_up;
|
||||||
|
#endif /* CONFIG_PINCTRL */
|
||||||
#ifdef CONFIG_UART_ASYNC_API
|
#ifdef CONFIG_UART_ASYNC_API
|
||||||
nrfx_timer_t timer;
|
nrfx_timer_t timer;
|
||||||
#endif
|
#endif
|
||||||
|
@ -189,6 +188,58 @@ static inline NRF_UARTE_Type *get_uarte_instance(const struct device *dev)
|
||||||
return config->uarte_regs;
|
return config->uarte_regs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef CONFIG_PINCTRL
|
||||||
|
static void uarte_nrfx_pins_configure(const struct device *dev, bool sleep)
|
||||||
|
{
|
||||||
|
const struct uarte_nrfx_config *cfg = get_dev_config(dev);
|
||||||
|
|
||||||
|
if (!sleep) {
|
||||||
|
if (cfg->tx_pin != NRF_UARTE_PSEL_DISCONNECTED) {
|
||||||
|
nrf_gpio_pin_write(cfg->tx_pin, 1);
|
||||||
|
nrf_gpio_cfg_output(cfg->tx_pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cfg->rx_pin != NRF_UARTE_PSEL_DISCONNECTED) {
|
||||||
|
nrf_gpio_cfg_input(cfg->rx_pin,
|
||||||
|
(cfg->rx_pull_up ?
|
||||||
|
NRF_GPIO_PIN_PULLUP :
|
||||||
|
NRF_GPIO_PIN_NOPULL));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cfg->rts_pin != NRF_UARTE_PSEL_DISCONNECTED) {
|
||||||
|
nrf_gpio_pin_write(cfg->rts_pin, 1);
|
||||||
|
nrf_gpio_cfg_output(cfg->rts_pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cfg->cts_pin != NRF_UARTE_PSEL_DISCONNECTED) {
|
||||||
|
nrf_gpio_cfg_input(cfg->cts_pin,
|
||||||
|
(cfg->cts_pull_up ?
|
||||||
|
NRF_GPIO_PIN_PULLUP :
|
||||||
|
NRF_GPIO_PIN_NOPULL));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (cfg->tx_pin != NRF_UARTE_PSEL_DISCONNECTED) {
|
||||||
|
nrf_gpio_cfg_default(cfg->tx_pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cfg->rx_pin != NRF_UARTE_PSEL_DISCONNECTED) {
|
||||||
|
nrf_gpio_cfg_default(cfg->rx_pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cfg->rts_pin != NRF_UARTE_PSEL_DISCONNECTED) {
|
||||||
|
nrf_gpio_cfg_default(cfg->rts_pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cfg->cts_pin != NRF_UARTE_PSEL_DISCONNECTED) {
|
||||||
|
nrf_gpio_cfg_default(cfg->cts_pin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nrf_uarte_txrx_pins_set(cfg->uarte_regs, cfg->tx_pin, cfg->rx_pin);
|
||||||
|
nrf_uarte_hwfc_pins_set(cfg->uarte_regs, cfg->rts_pin, cfg->cts_pin);
|
||||||
|
}
|
||||||
|
#endif /* !CONFIG_PINCTRL */
|
||||||
|
|
||||||
static void endtx_isr(const struct device *dev)
|
static void endtx_isr(const struct device *dev)
|
||||||
{
|
{
|
||||||
NRF_UARTE_Type *uarte = get_uarte_instance(dev);
|
NRF_UARTE_Type *uarte = get_uarte_instance(dev);
|
||||||
|
@ -395,11 +446,7 @@ static int uarte_nrfx_configure(const struct device *dev,
|
||||||
uarte_cfg.hwfc = NRF_UARTE_HWFC_DISABLED;
|
uarte_cfg.hwfc = NRF_UARTE_HWFC_DISABLED;
|
||||||
break;
|
break;
|
||||||
case UART_CFG_FLOW_CTRL_RTS_CTS:
|
case UART_CFG_FLOW_CTRL_RTS_CTS:
|
||||||
if (IS_HWFC_PINS_USED(get_dev_config(dev)->flags)) {
|
uarte_cfg.hwfc = NRF_UARTE_HWFC_ENABLED;
|
||||||
uarte_cfg.hwfc = NRF_UARTE_HWFC_ENABLED;
|
|
||||||
} else {
|
|
||||||
return -ENOTSUP;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
|
@ -798,9 +845,10 @@ static int uarte_nrfx_rx_enable(const struct device *dev, uint8_t *buf,
|
||||||
int32_t timeout)
|
int32_t timeout)
|
||||||
{
|
{
|
||||||
struct uarte_nrfx_data *data = get_dev_data(dev);
|
struct uarte_nrfx_data *data = get_dev_data(dev);
|
||||||
|
const struct uarte_nrfx_config *cfg = get_dev_config(dev);
|
||||||
NRF_UARTE_Type *uarte = get_uarte_instance(dev);
|
NRF_UARTE_Type *uarte = get_uarte_instance(dev);
|
||||||
|
|
||||||
if (nrf_uarte_rx_pin_get(uarte) == NRF_UARTE_PSEL_DISCONNECTED) {
|
if (cfg->disable_rx) {
|
||||||
__ASSERT(false, "TX only UARTE instance");
|
__ASSERT(false, "TX only UARTE instance");
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
}
|
}
|
||||||
|
@ -1680,25 +1728,14 @@ static int uarte_instance_init(const struct device *dev,
|
||||||
|
|
||||||
data->dev = dev;
|
data->dev = dev;
|
||||||
|
|
||||||
nrf_gpio_pin_write(cfg->pseltxd, 1);
|
#ifdef CONFIG_PINCTRL
|
||||||
nrf_gpio_cfg_output(cfg->pseltxd);
|
err = pinctrl_apply_state(cfg->pcfg, PINCTRL_STATE_DEFAULT);
|
||||||
|
if (err < 0) {
|
||||||
if (cfg->pselrxd != NRF_UARTE_PSEL_DISCONNECTED) {
|
return err;
|
||||||
nrf_gpio_cfg_input(cfg->pselrxd, cfg->rxd_pull);
|
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
nrf_uarte_txrx_pins_set(uarte, cfg->pseltxd, cfg->pselrxd);
|
uarte_nrfx_pins_configure(dev, false);
|
||||||
|
#endif /* CONFIG_PINCTRL */
|
||||||
if (cfg->pselcts != NRF_UARTE_PSEL_DISCONNECTED) {
|
|
||||||
nrf_gpio_cfg_input(cfg->pselcts, cfg->cts_pull);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cfg->pselrts != NRF_UARTE_PSEL_DISCONNECTED) {
|
|
||||||
nrf_gpio_pin_write(cfg->pselrts, 1);
|
|
||||||
nrf_gpio_cfg_output(cfg->pselrts);
|
|
||||||
}
|
|
||||||
|
|
||||||
nrf_uarte_hwfc_pins_set(uarte, cfg->pselrts, cfg->pselcts);
|
|
||||||
|
|
||||||
err = uarte_nrfx_configure(dev, &get_dev_data(dev)->uart_config);
|
err = uarte_nrfx_configure(dev, &get_dev_data(dev)->uart_config);
|
||||||
if (err) {
|
if (err) {
|
||||||
|
@ -1726,7 +1763,7 @@ static int uarte_instance_init(const struct device *dev,
|
||||||
/* Enable receiver and transmitter */
|
/* Enable receiver and transmitter */
|
||||||
nrf_uarte_enable(uarte);
|
nrf_uarte_enable(uarte);
|
||||||
|
|
||||||
if (cfg->pselrxd != NRF_UARTE_PSEL_DISCONNECTED) {
|
if (!cfg->disable_rx) {
|
||||||
nrf_uarte_event_clear(uarte, NRF_UARTE_EVENT_ENDRX);
|
nrf_uarte_event_clear(uarte, NRF_UARTE_EVENT_ENDRX);
|
||||||
|
|
||||||
nrf_uarte_rx_buffer_set(uarte, &data->rx_data, 1);
|
nrf_uarte_rx_buffer_set(uarte, &data->rx_data, 1);
|
||||||
|
@ -1756,46 +1793,6 @@ static int uarte_instance_init(const struct device *dev,
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PM_DEVICE
|
#ifdef CONFIG_PM_DEVICE
|
||||||
|
|
||||||
static void uarte_nrfx_pins_enable(const struct device *dev, bool enable)
|
|
||||||
{
|
|
||||||
const struct uarte_nrfx_config *cfg = get_dev_config(dev);
|
|
||||||
|
|
||||||
if (!(cfg->flags & UARTE_CFG_FLAG_GPIO_MGMT)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (enable) {
|
|
||||||
nrf_gpio_pin_write(cfg->pseltxd, 1);
|
|
||||||
nrf_gpio_cfg_output(cfg->pseltxd);
|
|
||||||
if (cfg->pselrxd != NRF_UARTE_PSEL_DISCONNECTED) {
|
|
||||||
nrf_gpio_cfg_input(cfg->pselrxd, cfg->rxd_pull);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (IS_RTS_PIN_SET(cfg->flags)) {
|
|
||||||
nrf_gpio_pin_write(cfg->pselrts, 1);
|
|
||||||
nrf_gpio_cfg_output(cfg->pselrts);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (IS_CTS_PIN_SET(cfg->flags)) {
|
|
||||||
nrf_gpio_cfg_input(cfg->pselcts, cfg->cts_pull);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
nrf_gpio_cfg_default(cfg->pseltxd);
|
|
||||||
if (cfg->pselrxd != NRF_UARTE_PSEL_DISCONNECTED) {
|
|
||||||
nrf_gpio_cfg_default(cfg->pselrxd);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (IS_RTS_PIN_SET(cfg->flags)) {
|
|
||||||
nrf_gpio_cfg_default(cfg->pselrts);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (IS_CTS_PIN_SET(cfg->flags)) {
|
|
||||||
nrf_gpio_cfg_default(cfg->pselcts);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @brief Pend until TX is stopped.
|
/** @brief Pend until TX is stopped.
|
||||||
*
|
*
|
||||||
* There are 2 configurations that must be handled:
|
* There are 2 configurations that must be handled:
|
||||||
|
@ -1838,10 +1835,25 @@ static int uarte_nrfx_pm_action(const struct device *dev,
|
||||||
#if defined(CONFIG_UART_ASYNC_API) || defined(UARTE_INTERRUPT_DRIVEN)
|
#if defined(CONFIG_UART_ASYNC_API) || defined(UARTE_INTERRUPT_DRIVEN)
|
||||||
struct uarte_nrfx_data *data = get_dev_data(dev);
|
struct uarte_nrfx_data *data = get_dev_data(dev);
|
||||||
#endif
|
#endif
|
||||||
|
const struct uarte_nrfx_config *cfg = get_dev_config(dev);
|
||||||
|
#ifdef CONFIG_PINCTRL
|
||||||
|
int ret;
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case PM_DEVICE_ACTION_RESUME:
|
case PM_DEVICE_ACTION_RESUME:
|
||||||
uarte_nrfx_pins_enable(dev, true);
|
if (cfg->flags & UARTE_CFG_FLAG_GPIO_MGMT) {
|
||||||
|
#ifdef CONFIG_PINCTRL
|
||||||
|
ret = pinctrl_apply_state(cfg->pcfg,
|
||||||
|
PINCTRL_STATE_DEFAULT);
|
||||||
|
if (ret < 0) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
uarte_nrfx_pins_configure(dev, false);
|
||||||
|
#endif /* CONFIG_PINCTRL */
|
||||||
|
}
|
||||||
|
|
||||||
nrf_uarte_enable(uarte);
|
nrf_uarte_enable(uarte);
|
||||||
|
|
||||||
#ifdef CONFIG_UART_ASYNC_API
|
#ifdef CONFIG_UART_ASYNC_API
|
||||||
|
@ -1852,7 +1864,7 @@ static int uarte_nrfx_pm_action(const struct device *dev,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (nrf_uarte_rx_pin_get(uarte) != NRF_UARTE_PSEL_DISCONNECTED) {
|
if (!cfg->disable_rx) {
|
||||||
|
|
||||||
nrf_uarte_event_clear(uarte, NRF_UARTE_EVENT_ENDRX);
|
nrf_uarte_event_clear(uarte, NRF_UARTE_EVENT_ENDRX);
|
||||||
nrf_uarte_task_trigger(uarte, NRF_UARTE_TASK_STARTRX);
|
nrf_uarte_task_trigger(uarte, NRF_UARTE_TASK_STARTRX);
|
||||||
|
@ -1905,7 +1917,19 @@ static int uarte_nrfx_pm_action(const struct device *dev,
|
||||||
|
|
||||||
wait_for_tx_stopped(dev);
|
wait_for_tx_stopped(dev);
|
||||||
uart_disable(dev);
|
uart_disable(dev);
|
||||||
uarte_nrfx_pins_enable(dev, false);
|
|
||||||
|
if (cfg->flags & UARTE_CFG_FLAG_GPIO_MGMT) {
|
||||||
|
#ifdef CONFIG_PINCTRL
|
||||||
|
ret = pinctrl_apply_state(cfg->pcfg,
|
||||||
|
PINCTRL_STATE_SLEEP);
|
||||||
|
if (ret < 0) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
uarte_nrfx_pins_configure(dev, true);
|
||||||
|
#endif /* CONFIG_PINCTRL */
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -ENOTSUP;
|
return -ENOTSUP;
|
||||||
|
@ -1919,19 +1943,6 @@ static int uarte_nrfx_pm_action(const struct device *dev,
|
||||||
#define UARTE_HAS_PROP(idx, prop) DT_NODE_HAS_PROP(UARTE(idx), prop)
|
#define UARTE_HAS_PROP(idx, prop) DT_NODE_HAS_PROP(UARTE(idx), prop)
|
||||||
#define UARTE_PROP(idx, prop) DT_PROP(UARTE(idx), prop)
|
#define UARTE_PROP(idx, prop) DT_PROP(UARTE(idx), prop)
|
||||||
|
|
||||||
#define UARTE_PSEL(idx, pin_prop) \
|
|
||||||
COND_CODE_1(UARTE_HAS_PROP(idx, pin_prop), \
|
|
||||||
(UARTE_PROP(idx, pin_prop)), \
|
|
||||||
(NRF_UARTE_PSEL_DISCONNECTED))
|
|
||||||
|
|
||||||
#define UARTE_PULL(idx, pull_up_prop) \
|
|
||||||
COND_CODE_1(UARTE_PROP(idx, pull_up_prop), \
|
|
||||||
(NRF_GPIO_PIN_PULLUP), \
|
|
||||||
(NRF_GPIO_PIN_NOPULL))
|
|
||||||
|
|
||||||
#define HWFC_AVAILABLE(idx) \
|
|
||||||
(UARTE_HAS_PROP(idx, rts_pin) || UARTE_HAS_PROP(idx, cts_pin))
|
|
||||||
|
|
||||||
#define UARTE_IRQ_CONFIGURE(idx, isr_handler) \
|
#define UARTE_IRQ_CONFIGURE(idx, isr_handler) \
|
||||||
do { \
|
do { \
|
||||||
IRQ_CONNECT(DT_IRQN(UARTE(idx)), DT_IRQ(UARTE(idx), priority), \
|
IRQ_CONNECT(DT_IRQN(UARTE(idx)), DT_IRQ(UARTE(idx), priority), \
|
||||||
|
@ -1939,26 +1950,36 @@ static int uarte_nrfx_pm_action(const struct device *dev,
|
||||||
irq_enable(DT_IRQN(UARTE(idx))); \
|
irq_enable(DT_IRQN(UARTE(idx))); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define HWFC_CONFIG_CHECK(idx) \
|
#ifdef CONFIG_PINCTRL
|
||||||
BUILD_ASSERT( \
|
/* Low power mode is used when disable_rx is not defined or in async mode if
|
||||||
(UARTE_PROP(idx, hw_flow_control) && HWFC_AVAILABLE(idx)) \
|
|
||||||
|| \
|
|
||||||
!UARTE_PROP(idx, hw_flow_control) \
|
|
||||||
)
|
|
||||||
|
|
||||||
/* Low power mode is used when rx pin is not defined or in async mode if
|
|
||||||
* kconfig option is enabled.
|
* kconfig option is enabled.
|
||||||
*/
|
*/
|
||||||
#define USE_LOW_POWER(idx) \
|
#define USE_LOW_POWER(idx) \
|
||||||
((UARTE_HAS_PROP(idx, rx_pin) && \
|
((!UARTE_HAS_PROP(idx, disable_rx) && \
|
||||||
COND_CODE_1(CONFIG_UART_##idx##_ASYNC, \
|
COND_CODE_1(CONFIG_UART_##idx##_ASYNC, \
|
||||||
(!IS_ENABLED(CONFIG_UART_##idx##_NRF_ASYNC_LOW_POWER)), \
|
(!IS_ENABLED(CONFIG_UART_##idx##_NRF_ASYNC_LOW_POWER)), \
|
||||||
(1))) ? 0 : UARTE_CFG_FLAG_LOW_POWER)
|
(1))) ? 0 : UARTE_CFG_FLAG_LOW_POWER)
|
||||||
|
|
||||||
|
#define UARTE_DISABLE_RX_INIT(node_id) \
|
||||||
|
.disable_rx = DT_PROP(node_id, disable_rx)
|
||||||
|
#else
|
||||||
|
/* Low power mode is used when rx pin is not defined or in async mode if
|
||||||
|
* kconfig option is enabled.
|
||||||
|
*/
|
||||||
|
#define USE_LOW_POWER(idx) \
|
||||||
|
((UARTE_HAS_PROP(idx, rx_pin) && \
|
||||||
|
COND_CODE_1(CONFIG_UART_##idx##_ASYNC, \
|
||||||
|
(!IS_ENABLED(CONFIG_UART_##idx##_NRF_ASYNC_LOW_POWER)), \
|
||||||
|
(1))) ? 0 : UARTE_CFG_FLAG_LOW_POWER)
|
||||||
|
|
||||||
|
#define UARTE_DISABLE_RX_INIT(node_id) \
|
||||||
|
.disable_rx = DT_NODE_HAS_PROP(node_id, rx_pin) ? false : true
|
||||||
|
#endif /* CONFIG_PINCTRL */
|
||||||
|
|
||||||
#define UART_NRF_UARTE_DEVICE(idx) \
|
#define UART_NRF_UARTE_DEVICE(idx) \
|
||||||
HWFC_CONFIG_CHECK(idx); \
|
|
||||||
UARTE_INT_DRIVEN(idx); \
|
UARTE_INT_DRIVEN(idx); \
|
||||||
UARTE_ASYNC(idx); \
|
UARTE_ASYNC(idx); \
|
||||||
|
IF_ENABLED(CONFIG_PINCTRL, (PINCTRL_DT_DEFINE(UARTE(idx)))) \
|
||||||
static struct uarte_nrfx_data uarte_##idx##_data = { \
|
static struct uarte_nrfx_data uarte_##idx##_data = { \
|
||||||
UARTE_CONFIG(idx), \
|
UARTE_CONFIG(idx), \
|
||||||
IF_ENABLED(CONFIG_UART_##idx##_ASYNC, \
|
IF_ENABLED(CONFIG_UART_##idx##_ASYNC, \
|
||||||
|
@ -1967,23 +1988,26 @@ static int uarte_nrfx_pm_action(const struct device *dev,
|
||||||
(.int_driven = &uarte##idx##_int_driven,)) \
|
(.int_driven = &uarte##idx##_int_driven,)) \
|
||||||
}; \
|
}; \
|
||||||
static const struct uarte_nrfx_config uarte_##idx##z_config = { \
|
static const struct uarte_nrfx_config uarte_##idx##z_config = { \
|
||||||
|
COND_CODE_1(CONFIG_PINCTRL, \
|
||||||
|
(.pcfg = PINCTRL_DT_DEV_CONFIG_GET(UARTE(idx)),), \
|
||||||
|
(.tx_pin = DT_PROP_OR(UARTE(idx), tx_pin, \
|
||||||
|
NRF_UARTE_PSEL_DISCONNECTED), \
|
||||||
|
.rx_pin = DT_PROP_OR(UARTE(idx), rx_pin, \
|
||||||
|
NRF_UARTE_PSEL_DISCONNECTED), \
|
||||||
|
.rts_pin = DT_PROP_OR(UARTE(idx), rts_pin, \
|
||||||
|
NRF_UARTE_PSEL_DISCONNECTED), \
|
||||||
|
.cts_pin = DT_PROP_OR(UARTE(idx), cts_pin, \
|
||||||
|
NRF_UARTE_PSEL_DISCONNECTED), \
|
||||||
|
.rx_pull_up = DT_PROP(UARTE(idx), rx_pull_up), \
|
||||||
|
.cts_pull_up = DT_PROP(UARTE(idx), cts_pull_up),)) \
|
||||||
.uarte_regs = (NRF_UARTE_Type *)DT_REG_ADDR(UARTE(idx)), \
|
.uarte_regs = (NRF_UARTE_Type *)DT_REG_ADDR(UARTE(idx)), \
|
||||||
.flags = \
|
.flags = \
|
||||||
(UARTE_HAS_PROP(idx, rts_pin) ? \
|
|
||||||
UARTE_CFG_FLAG_RTS_PIN_SET : 0) | \
|
|
||||||
(UARTE_HAS_PROP(idx, cts_pin) ? \
|
|
||||||
UARTE_CFG_FLAG_CTS_PIN_SET : 0) | \
|
|
||||||
(IS_ENABLED(CONFIG_UART_##idx##_GPIO_MANAGEMENT) ? \
|
(IS_ENABLED(CONFIG_UART_##idx##_GPIO_MANAGEMENT) ? \
|
||||||
UARTE_CFG_FLAG_GPIO_MGMT : 0) | \
|
UARTE_CFG_FLAG_GPIO_MGMT : 0) | \
|
||||||
(IS_ENABLED(CONFIG_UART_##idx##_ENHANCED_POLL_OUT) ? \
|
(IS_ENABLED(CONFIG_UART_##idx##_ENHANCED_POLL_OUT) ? \
|
||||||
UARTE_CFG_FLAG_PPI_ENDTX : 0) | \
|
UARTE_CFG_FLAG_PPI_ENDTX : 0) | \
|
||||||
USE_LOW_POWER(idx), \
|
USE_LOW_POWER(idx), \
|
||||||
.pseltxd = UARTE_PROP(idx, tx_pin), /* must be set */ \
|
UARTE_DISABLE_RX_INIT(UARTE(idx)), \
|
||||||
.pselrxd = UARTE_PSEL(idx, rx_pin), /* optional */ \
|
|
||||||
.pselcts = UARTE_PSEL(idx, cts_pin), /* optional */ \
|
|
||||||
.pselrts = UARTE_PSEL(idx, rts_pin), /* optional */ \
|
|
||||||
.rxd_pull = UARTE_PULL(idx, rx_pull_up), \
|
|
||||||
.cts_pull = UARTE_PULL(idx, cts_pull_up), \
|
|
||||||
IF_ENABLED(CONFIG_UART_##idx##_NRF_HW_ASYNC, \
|
IF_ENABLED(CONFIG_UART_##idx##_NRF_HW_ASYNC, \
|
||||||
(.timer = NRFX_TIMER_INSTANCE( \
|
(.timer = NRFX_TIMER_INSTANCE( \
|
||||||
CONFIG_UART_##idx##_NRF_HW_ASYNC_TIMER),)) \
|
CONFIG_UART_##idx##_NRF_HW_ASYNC_TIMER),)) \
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
include: uart-controller.yaml
|
include: [uart-controller.yaml, pinctrl-device.yaml]
|
||||||
|
|
||||||
properties:
|
properties:
|
||||||
reg:
|
reg:
|
||||||
|
@ -7,42 +7,11 @@ properties:
|
||||||
interrupts:
|
interrupts:
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
tx-pin:
|
disable-rx:
|
||||||
type: int
|
type: boolean
|
||||||
required: true
|
|
||||||
description: |
|
description: |
|
||||||
The TX pin to use.
|
Disable UART reception capabilities (only required to disable reception
|
||||||
|
if CONFIG_PINCTRL is enabled).
|
||||||
For pins P0.0 through P0.31, use the pin number. For example,
|
|
||||||
to use P0.16 for TX, set:
|
|
||||||
|
|
||||||
tx-pin = <16>;
|
|
||||||
|
|
||||||
For pins P1.0 through P1.31, add 32 to the pin number. For
|
|
||||||
example, to use P1.2 for TX, set:
|
|
||||||
|
|
||||||
tx-pin = <34>; /* 32 + 2 */
|
|
||||||
|
|
||||||
rx-pin:
|
|
||||||
type: int
|
|
||||||
required: false
|
|
||||||
description: |
|
|
||||||
The RX pin to use. The pin numbering scheme is the same as the
|
|
||||||
tx-pin property's.
|
|
||||||
|
|
||||||
rts-pin:
|
|
||||||
type: int
|
|
||||||
required: false
|
|
||||||
description: |
|
|
||||||
The RTS pin to use. The pin numbering scheme is the same as the
|
|
||||||
tx-pin property's.
|
|
||||||
|
|
||||||
cts-pin:
|
|
||||||
type: int
|
|
||||||
required: false
|
|
||||||
description: |
|
|
||||||
The CTS pin to use. The pin numbering scheme is the same as the
|
|
||||||
tx-pin property's.
|
|
||||||
|
|
||||||
current-speed:
|
current-speed:
|
||||||
description: |
|
description: |
|
||||||
|
@ -68,12 +37,63 @@ properties:
|
||||||
- 921600
|
- 921600
|
||||||
- 1000000
|
- 1000000
|
||||||
|
|
||||||
|
tx-pin:
|
||||||
|
type: int
|
||||||
|
description: |
|
||||||
|
IMPORTANT: This option will only be used if the new pin control driver
|
||||||
|
is not enabled. It will be deprecated in the future.
|
||||||
|
|
||||||
|
The TX pin to use.
|
||||||
|
|
||||||
|
For pins P0.0 through P0.31, use the pin number. For example,
|
||||||
|
to use P0.16 for TX, set:
|
||||||
|
|
||||||
|
tx-pin = <16>;
|
||||||
|
|
||||||
|
For pins P1.0 through P1.31, add 32 to the pin number. For
|
||||||
|
example, to use P1.2 for TX, set:
|
||||||
|
|
||||||
|
tx-pin = <34>; /* 32 + 2 */
|
||||||
|
|
||||||
|
rx-pin:
|
||||||
|
type: int
|
||||||
|
description: |
|
||||||
|
IMPORTANT: This option will only be used if the new pin control driver
|
||||||
|
is not enabled. It will be deprecated in the future.
|
||||||
|
|
||||||
|
The RX pin to use. The pin numbering scheme is the same as the
|
||||||
|
tx-pin property's.
|
||||||
|
|
||||||
|
rts-pin:
|
||||||
|
type: int
|
||||||
|
description: |
|
||||||
|
IMPORTANT: This option will only be used if the new pin control driver
|
||||||
|
is not enabled. It will be deprecated in the future.
|
||||||
|
|
||||||
|
The RTS pin to use. The pin numbering scheme is the same as the
|
||||||
|
tx-pin property's.
|
||||||
|
|
||||||
|
cts-pin:
|
||||||
|
type: int
|
||||||
|
description: |
|
||||||
|
IMPORTANT: This option will only be used if the new pin control driver
|
||||||
|
is not enabled. It will be deprecated in the future.
|
||||||
|
|
||||||
|
The CTS pin to use. The pin numbering scheme is the same as the
|
||||||
|
tx-pin property's.
|
||||||
|
|
||||||
rx-pull-up:
|
rx-pull-up:
|
||||||
type: boolean
|
type: boolean
|
||||||
required: false
|
description: |
|
||||||
description: Enable pull-up resistor on the RX pin.
|
IMPORTANT: This option will only be used if the new pin control driver
|
||||||
|
is not enabled. It will be deprecated in the future.
|
||||||
|
|
||||||
|
Enable pull-up resistor on the RX pin.
|
||||||
|
|
||||||
cts-pull-up:
|
cts-pull-up:
|
||||||
type: boolean
|
type: boolean
|
||||||
required: false
|
description: |
|
||||||
description: Enable pull-up resistor on the CTS pin.
|
IMPORTANT: This option will only be used if the new pin control driver
|
||||||
|
is not enabled. It will be deprecated in the future.
|
||||||
|
|
||||||
|
Enable pull-up resistor on the CTS pin.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue