# nrfx UART configuration

# Copyright (c) 2016 - 2018, Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0

menuconfig UART_NRFX
	bool "nRF UART nrfx drivers"
	default y
	select SERIAL_HAS_DRIVER
	select SERIAL_SUPPORT_INTERRUPT
	select SERIAL_SUPPORT_ASYNC
	select PINCTRL
	depends on DT_HAS_NORDIC_NRF_UART_ENABLED || DT_HAS_NORDIC_NRF_UARTE_ENABLED
	help
	  Enable support for nrfx UART drivers for nRF MCU series.
	  Peripherals with the same instance ID cannot be used together,
	  e.g. UART_0 and UARTE_0.

if UART_NRFX

config UART_NRFX_UART
	def_bool y
	depends on DT_HAS_NORDIC_NRF_UART_ENABLED

config UART_NRFX_UARTE
	def_bool y
	depends on DT_HAS_NORDIC_NRF_UARTE_ENABLED

config UART_ASYNC_TX_CACHE_SIZE
	int "TX cache buffer size"
	depends on UART_ASYNC_API
	depends on UART_NRFX_UARTE
	default 8
	help
	  For UARTE, TX cache buffer is used when provided TX buffer is not located
	  in RAM, because EasyDMA in UARTE peripherals can only transfer data
	  from RAM.

# ----------------- port 0 -----------------
if HAS_HW_NRF_UART0 || HAS_HW_NRF_UARTE0

config UART_0_ENHANCED_POLL_OUT
	bool "Efficient poll out on port 0"
	default y
	depends on HAS_HW_NRF_UARTE0
	help
	  When enabled, polling out does not trigger interrupt which stops TX.
	  Feature uses a PPI channel.

config UART_0_INTERRUPT_DRIVEN
	bool "Interrupt support on port 0"
	depends on UART_INTERRUPT_DRIVEN
	default y
	help
	  This option enables UART interrupt support on port 0.

config UART_0_ASYNC
	bool "Asynchronous API support on port 0"
	depends on UART_ASYNC_API && !UART_0_INTERRUPT_DRIVEN
	default y
	help
	  This option enables UART Asynchronous API support on port 0.

config UART_0_NRF_PARITY_BIT
	bool "Parity bit"
	help
	  Enable parity bit.

config UART_0_NRF_TX_BUFFER_SIZE
	int "Size of RAM buffer"
	depends on HAS_HW_NRF_UARTE0
	range 1 65535
	default 32
	help
	  Size of the transmit buffer for API function: fifo_fill.
	  This value is limited by range of TXD.MAXCNT register for
	  particular SoC.

config UART_0_NRF_HW_ASYNC
	bool "Use hardware RX byte counting"
	depends on HAS_HW_NRF_UARTE0
	depends on UART_ASYNC_API
	help
	  If default driver uses interrupts to count incoming bytes, it is possible
	  that with higher speeds and/or high cpu load some data can be lost.
	  It is recommended to use hardware byte counting in such scenarios.
	  Hardware RX byte counting requires timer instance and one PPI channel

config UART_0_NRF_ASYNC_LOW_POWER
	bool "Low power mode"
	depends on HAS_HW_NRF_UARTE0
	depends on UART_ASYNC_API
	help
	  When enabled, UARTE is enabled before each TX or RX usage and disabled
	  when not used. Disabling UARTE while in idle allows to achieve lowest
	  power consumption. It is only feasible if receiver is not always on.

config UART_0_NRF_HW_ASYNC_TIMER
	int "Timer instance"
	depends on UART_0_NRF_HW_ASYNC

config UART_0_GPIO_MANAGEMENT
	bool "GPIO management on port 0"
	depends on PM_DEVICE
	default y
	help
	  If enabled, the driver will configure the GPIOs used by the uart to
	  their default configuration when device is powered down. The GPIOs
	  will be configured back to correct state when UART is powered up.

endif # HAS_HW_NRF_UART0 || HAS_HW_NRF_UARTE0

# ----------------- port 1 -----------------
if HAS_HW_NRF_UARTE1

config UART_1_INTERRUPT_DRIVEN
	bool "Interrupt support on port 1"
	depends on UART_INTERRUPT_DRIVEN
	default y
	help
	  This option enables UART interrupt support on port 1.

config UART_1_ASYNC
	bool "Asynchronous API support on port 1"
	depends on UART_ASYNC_API && !UART_1_INTERRUPT_DRIVEN
	default y
	help
	  This option enables UART Asynchronous API support on port 1.

config UART_1_ENHANCED_POLL_OUT
	bool "Efficient poll out on port 1"
	default y
	help
	  When enabled, polling out does not trigger interrupt which stops TX.
	  Feature uses a PPI channel.

config UART_1_NRF_PARITY_BIT
	bool "Parity bit"
	help
	  Enable parity bit.

config UART_1_NRF_TX_BUFFER_SIZE
	int "Size of RAM buffer"
	depends on UART_INTERRUPT_DRIVEN
	range 1 65535
	default 32
	help
	  Size of the transmit buffer for API function: fifo_fill.
	  This value is limited by range of TXD.MAXCNT register for
	  particular SoC.

config UART_1_NRF_HW_ASYNC
	bool "Use hardware RX byte counting"
	depends on UART_1_ASYNC
	help
	  If default driver uses interrupts to count incoming bytes, it is possible
	  that with higher speeds and/or high cpu load some data can be lost.
	  It is recommended to use hardware byte counting in such scenarios.
	  Hardware RX byte counting requires timer instance and one PPI channel

config UART_1_NRF_ASYNC_LOW_POWER
	bool "Low power mode"
	depends on UART_ASYNC_API
	help
	  When enabled, UARTE is enabled before each TX or RX usage and disabled
	  when not used. Disabling UARTE while in idle allows to achieve lowest
	  power consumption. It is only feasible if receiver is not always on.

config UART_1_NRF_HW_ASYNC_TIMER
	int "Timer instance"
	depends on UART_1_NRF_HW_ASYNC

config UART_1_GPIO_MANAGEMENT
	bool "GPIO management on port 1"
	depends on PM_DEVICE
	default y
	help
	  If enabled, the driver will configure the GPIOs used by the uart to
	  their default configuration when device is powered down. The GPIOs
	  will be configured back to correct state when UART is powered up.

endif # HAS_HW_NRF_UARTE1

# ----------------- port 2 -----------------
if HAS_HW_NRF_UARTE2

config UART_2_INTERRUPT_DRIVEN
	bool "Interrupt support on port 2"
	depends on UART_INTERRUPT_DRIVEN
	default y
	help
	  This option enables UART interrupt support on port 2.

config UART_2_ASYNC
	bool "Asynchronous API support on port 2"
	depends on UART_ASYNC_API && !UART_2_INTERRUPT_DRIVEN
	default y
	help
	  This option enables UART Asynchronous API support on port 2.

config UART_2_ENHANCED_POLL_OUT
	bool "Efficient poll out on port 2"
	default y
	help
	  When enabled, polling out does not trigger interrupt which stops TX.
	  Feature uses a PPI channel.

config UART_2_NRF_PARITY_BIT
	bool "Parity bit"
	help
	  Enable parity bit.

config UART_2_NRF_TX_BUFFER_SIZE
	int "Size of RAM buffer"
	range 1 65535
	default 32
	help
	  Size of the transmit buffer for API function: fifo_fill.
	  This value is limited by range of TXD.MAXCNT register for
	  particular SoC.

config UART_2_NRF_HW_ASYNC
	bool "Use hardware RX byte counting"
	depends on UART_2_ASYNC
	help
	  If default driver uses interrupts to count incoming bytes, it is possible
	  that with higher speeds and/or high cpu load some data can be lost.
	  It is recommended to use hardware byte counting in such scenarios.
	  Hardware RX byte counting requires timer instance and one PPI channel

config UART_2_NRF_ASYNC_LOW_POWER
	bool "Low power mode"
	depends on UART_ASYNC_API
	help
	  When enabled, UARTE is enabled before each TX or RX usage and disabled
	  when not used. Disabling UARTE while in idle allows to achieve lowest
	  power consumption. It is only feasible if receiver is not always on.

config UART_2_NRF_HW_ASYNC_TIMER
	int "Timer instance"
	depends on UART_2_NRF_HW_ASYNC

config UART_2_GPIO_MANAGEMENT
	bool "GPIO management on port 2"
	depends on PM_DEVICE
	default y
	help
	  If enabled, the driver will configure the GPIOs used by the uart to
	  their default configuration when device is powered down. The GPIOs
	  will be configured back to correct state when UART is powered up.

endif # HAS_HW_NRF_UARTE2

# ----------------- port 3 -----------------
if HAS_HW_NRF_UARTE3

config UART_3_INTERRUPT_DRIVEN
	bool "Interrupt support on port 3"
	depends on UART_INTERRUPT_DRIVEN
	default y
	help
	  This option enables UART interrupt support on port 3.

config UART_3_ASYNC
	bool "Asynchronous API support on port 3"
	depends on UART_ASYNC_API && !UART_3_INTERRUPT_DRIVEN
	default y
	help
	  This option enables UART Asynchronous API support on port 3.

config UART_3_ENHANCED_POLL_OUT
	bool "Efficient poll out on port 3"
	default y
	help
	  When enabled, polling out does not trigger interrupt which stops TX.
	  Feature uses a PPI channel.

config UART_3_NRF_PARITY_BIT
	bool "Parity bit"
	help
	  Enable parity bit.

config UART_3_NRF_TX_BUFFER_SIZE
	int "Size of RAM buffer"
	range 1 65535
	default 32
	help
	  Size of the transmit buffer for API function: fifo_fill.
	  This value is limited by range of TXD.MAXCNT register for
	  particular SoC.

config UART_3_NRF_HW_ASYNC
	bool "Use hardware RX byte counting"
	depends on UART_3_ASYNC
	help
	  If default driver uses interrupts to count incoming bytes, it is possible
	  that with higher speeds and/or high cpu load some data can be lost.
	  It is recommended to use hardware byte counting in such scenarios.
	  Hardware RX byte counting requires timer instance and one PPI channel

config UART_3_NRF_ASYNC_LOW_POWER
	bool "Low power mode"
	depends on UART_ASYNC_API
	help
	  When enabled, UARTE is enabled before each TX or RX usage and disabled
	  when not used. Disabling UARTE while in idle allows to achieve lowest
	  power consumption. It is only feasible if receiver is not always on.

config UART_3_NRF_HW_ASYNC_TIMER
	int "Timer instance"
	depends on UART_3_NRF_HW_ASYNC

config UART_3_GPIO_MANAGEMENT
	bool "GPIO management on port 3"
	depends on PM_DEVICE
	default y
	help
	  If enabled, the driver will configure the GPIOs used by the uart to
	  their default configuration when device is powered down. The GPIOs
	  will be configured back to correct state when UART is powered up.

endif # HAS_HW_NRF_UARTE3


config NRFX_TIMER0
	default y
	depends on UART_0_NRF_HW_ASYNC_TIMER = 0 \
		|| UART_1_NRF_HW_ASYNC_TIMER = 0 \
		|| UART_2_NRF_HW_ASYNC_TIMER = 0 \
		|| UART_3_NRF_HW_ASYNC_TIMER = 0

config NRFX_TIMER1
	default y
	depends on UART_0_NRF_HW_ASYNC_TIMER = 1 \
		|| UART_1_NRF_HW_ASYNC_TIMER = 1 \
		|| UART_2_NRF_HW_ASYNC_TIMER = 1 \
		|| UART_3_NRF_HW_ASYNC_TIMER = 1

config NRFX_TIMER2
	default y
	depends on UART_0_NRF_HW_ASYNC_TIMER = 2 \
		|| UART_1_NRF_HW_ASYNC_TIMER = 2 \
		|| UART_2_NRF_HW_ASYNC_TIMER = 2 \
		|| UART_3_NRF_HW_ASYNC_TIMER = 2

config NRFX_TIMER3
	default y
	depends on UART_0_NRF_HW_ASYNC_TIMER = 3 \
		|| UART_1_NRF_HW_ASYNC_TIMER = 3 \
		|| UART_2_NRF_HW_ASYNC_TIMER = 3 \
		|| UART_3_NRF_HW_ASYNC_TIMER = 3

config NRFX_TIMER4
	default y
	depends on UART_0_NRF_HW_ASYNC_TIMER = 4 \
		|| UART_1_NRF_HW_ASYNC_TIMER = 4 \
		|| UART_2_NRF_HW_ASYNC_TIMER = 4 \
		|| UART_3_NRF_HW_ASYNC_TIMER = 4


config UARTE_NRF_HW_ASYNC
	def_bool y
	depends on UART_0_NRF_HW_ASYNC \
		|| UART_1_NRF_HW_ASYNC \
		|| UART_2_NRF_HW_ASYNC \
		|| UART_3_NRF_HW_ASYNC
	select NRFX_PPI if HAS_HW_NRF_PPI
	select NRFX_DPPI if HAS_HW_NRF_DPPIC

config UART_ENHANCED_POLL_OUT
	def_bool y
	depends on UART_0_ENHANCED_POLL_OUT \
		|| UART_1_ENHANCED_POLL_OUT \
		|| UART_2_ENHANCED_POLL_OUT \
		|| UART_3_ENHANCED_POLL_OUT
	select NRFX_PPI if HAS_HW_NRF_PPI
	select NRFX_DPPI if HAS_HW_NRF_DPPIC

endif # UART_NRFX
