mirror of
https://github.com/zephyrproject-rtos/zephyr
synced 2025-08-06 20:55:48 +00:00
Refactoring poll_out to be ready for handling preemption. uart_tx and uart_fifo_fill modified so they are resilient to being preempted by uart_poll_out. Refactored uart_poll_out implementation to be common for interrupt driven API and asynchronous API. In both APIs active state is detected by evaluating state of ENDTX and TXSTOPPED events. If anyone is set it means that new transfer can be started. Patch is fixing existing issues: - potential bytes dropping with flow control enabled - busywaiting for ENDTX (asynchronous API) - poor performance - potential bytes dropping during preemption - potential uart_tx returning -EBUSY when interrupted poll_out Signed-off-by: Krzysztof Chruscinski <krzysztof.chruscinski@nordicsemi.no>
367 lines
10 KiB
Plaintext
367 lines
10 KiB
Plaintext
# 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
|
|
depends on SOC_FAMILY_NRF
|
|
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
|
|
|
|
# Workaround for not being able to have commas in macro arguments
|
|
DT_COMPAT_NORDIC_NRF_UART := nordic,nrf-uart
|
|
DT_COMPAT_NORDIC_NRF_UARTE := nordic,nrf-uarte
|
|
|
|
# ----------------- port 0 -----------------
|
|
config UART_0_NRF_UART
|
|
def_bool $(dt_nodelabel_has_compat,uart0,$(DT_COMPAT_NORDIC_NRF_UART))
|
|
select NRF_UART_PERIPHERAL
|
|
help
|
|
Enable nRF UART without EasyDMA on port 0.
|
|
|
|
config UART_0_NRF_UARTE
|
|
def_bool $(dt_nodelabel_has_compat,uart0,$(DT_COMPAT_NORDIC_NRF_UARTE))
|
|
select NRF_UARTE_PERIPHERAL
|
|
help
|
|
Enable nRF UART with EasyDMA on port 0.
|
|
|
|
if UART_0_NRF_UART || UART_0_NRF_UARTE
|
|
|
|
config UART_0_ENHANCED_POLL_OUT
|
|
bool "Efficient poll out on port 0"
|
|
default y
|
|
depends on UART_0_NRF_UARTE
|
|
select NRFX_PPI if HAS_HW_NRF_PPI
|
|
select NRFX_DPPI if HAS_HW_NRF_DPPIC
|
|
help
|
|
When enabled, polling out does not trigger interrupt which stops TX.
|
|
Feature uses a PPI channel.
|
|
|
|
config UART_0_INTERRUPT_DRIVEN
|
|
bool "Enable 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 "Enable 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 "Enable parity bit"
|
|
help
|
|
Enable parity bit.
|
|
|
|
config UART_0_NRF_TX_BUFFER_SIZE
|
|
int "Size of RAM buffer"
|
|
depends on UART_0_NRF_UARTE
|
|
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 UART_0_NRF_UARTE
|
|
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_HW_ASYNC_TIMER
|
|
int "Timer instance"
|
|
depends on UART_0_NRF_HW_ASYNC
|
|
|
|
config UART_0_GPIO_MANAGEMENT
|
|
bool "Enable GPIO management on port 0"
|
|
depends on DEVICE_POWER_MANAGEMENT
|
|
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 # UART_0_NRF_UART || UART_0_NRF_UARTE
|
|
|
|
# ----------------- port 1 -----------------
|
|
config UART_1_NRF_UARTE
|
|
def_bool $(dt_nodelabel_has_compat,uart1,$(DT_COMPAT_NORDIC_NRF_UARTE))
|
|
select NRF_UARTE_PERIPHERAL
|
|
help
|
|
Enable nRF UART with EasyDMA on port 1.
|
|
|
|
if UART_1_NRF_UARTE
|
|
|
|
config UART_1_INTERRUPT_DRIVEN
|
|
bool "Enable 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 "Enable 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
|
|
select NRFX_PPI if HAS_HW_NRF_PPI
|
|
select NRFX_DPPI if HAS_HW_NRF_DPPIC
|
|
help
|
|
When enabled, polling out does not trigger interrupt which stops TX.
|
|
Feature uses a PPI channel.
|
|
|
|
config UART_1_NRF_PARITY_BIT
|
|
bool "Enable 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_HW_ASYNC_TIMER
|
|
int "Timer instance"
|
|
depends on UART_1_NRF_HW_ASYNC
|
|
|
|
config UART_1_GPIO_MANAGEMENT
|
|
bool "Enable GPIO management on port 1"
|
|
depends on DEVICE_POWER_MANAGEMENT
|
|
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 # UART_1_NRF_UARTE
|
|
|
|
# ----------------- port 2 -----------------
|
|
config UART_2_NRF_UARTE
|
|
def_bool $(dt_nodelabel_has_compat,uart2,$(DT_COMPAT_NORDIC_NRF_UARTE))
|
|
select NRF_UARTE_PERIPHERAL
|
|
help
|
|
Enable nRF UART with EasyDMA on port 2.
|
|
|
|
if UART_2_NRF_UARTE
|
|
|
|
config UART_2_INTERRUPT_DRIVEN
|
|
bool "Enable 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 "Enable 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
|
|
select NRFX_PPI if HAS_HW_NRF_PPI
|
|
select NRFX_DPPI if HAS_HW_NRF_DPPIC
|
|
help
|
|
When enabled, polling out does not trigger interrupt which stops TX.
|
|
Feature uses a PPI channel.
|
|
|
|
config UART_2_NRF_PARITY_BIT
|
|
bool "Enable 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_HW_ASYNC_TIMER
|
|
int "Timer instance"
|
|
depends on UART_2_NRF_HW_ASYNC
|
|
|
|
config UART_2_GPIO_MANAGEMENT
|
|
bool "Enable GPIO management on port 2"
|
|
depends on DEVICE_POWER_MANAGEMENT
|
|
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 # UART_2_NRF_UARTE
|
|
|
|
# ----------------- port 3 -----------------
|
|
config UART_3_NRF_UARTE
|
|
def_bool $(dt_nodelabel_has_compat,uart3,$(DT_COMPAT_NORDIC_NRF_UARTE))
|
|
select NRF_UARTE_PERIPHERAL
|
|
help
|
|
Enable nRF UART with EasyDMA on port 3.
|
|
|
|
if UART_3_NRF_UARTE
|
|
|
|
config UART_3_INTERRUPT_DRIVEN
|
|
bool "Enable 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 "Enable 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
|
|
select NRFX_PPI if HAS_HW_NRF_PPI
|
|
select NRFX_DPPI if HAS_HW_NRF_DPPIC
|
|
help
|
|
When enabled, polling out does not trigger interrupt which stops TX.
|
|
Feature uses a PPI channel.
|
|
|
|
config UART_3_NRF_PARITY_BIT
|
|
bool "Enable 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_HW_ASYNC_TIMER
|
|
int "Timer instance"
|
|
depends on UART_3_NRF_HW_ASYNC
|
|
|
|
config UART_3_GPIO_MANAGEMENT
|
|
bool "Enable GPIO management on port 3"
|
|
depends on DEVICE_POWER_MANAGEMENT
|
|
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 # UART_3_NRF_UARTE
|
|
|
|
|
|
config NRFX_TIMER0
|
|
default y
|
|
depends on UART_0_NRF_HW_ASYNC_TIMER = 0 || UART_1_NRF_HW_ASYNC_TIMER = 0 || \
|
|
UART_3_NRF_HW_ASYNC_TIMER = 0 || UART_2_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_3_NRF_HW_ASYNC_TIMER = 1 || UART_2_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_3_NRF_HW_ASYNC_TIMER = 2 || UART_2_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_3_NRF_HW_ASYNC_TIMER = 3 || UART_2_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_3_NRF_HW_ASYNC_TIMER = 4 || UART_2_NRF_HW_ASYNC_TIMER = 4
|
|
|
|
|
|
if UART_0_NRF_HW_ASYNC || UART_1_NRF_HW_ASYNC || UART_2_NRF_HW_ASYNC || UART_3_NRF_HW_ASYNC
|
|
|
|
config NRFX_TIMER
|
|
default y
|
|
|
|
config NRFX_PPI
|
|
depends on HAS_HW_NRF_PPI
|
|
default y
|
|
|
|
config NRFX_DPPI
|
|
depends on HAS_HW_NRF_DPPIC
|
|
default y
|
|
|
|
config UARTE_NRF_HW_ASYNC
|
|
bool
|
|
default y
|
|
|
|
endif
|
|
|
|
config NRF_UART_PERIPHERAL
|
|
bool
|
|
|
|
config NRF_UARTE_PERIPHERAL
|
|
bool
|
|
|
|
endif # UART_NRFX
|