# Virtual UART RTT driver option

# Copyright (c) 2019 omSquare s.r.o.
# SPDX-License-Identifier: Apache-2.0

menuconfig UART_RTT
	bool "UART RTT driver"
	default y
	depends on DT_HAS_SEGGER_RTT_UART_ENABLED
	depends on USE_SEGGER_RTT
	select SEGGER_RTT_CUSTOM_LOCKING
	help
	  This option enables access RTT channel as UART device.

if UART_RTT

# Workaround for not being able to have commas in macro arguments
DT_COMPAT_SEGGER_RTT_UART  := segger,rtt-uart

config UART_RTT_0
	def_bool $(dt_nodelabel_enabled_with_compat,rtt0,$(DT_COMPAT_SEGGER_RTT_UART))
	depends on SEGGER_RTT_MAX_NUM_UP_BUFFERS >= 1 && SEGGER_RTT_MAX_NUM_DOWN_BUFFERS >= 1
	depends on SEGGER_RTT_MODE_NO_BLOCK_SKIP
	select SERIAL_HAS_DRIVER
	select UART_RTT_DRIVER
	help
	  Enable UART on (default) RTT channel 0. Default channel has to be configured in non-blocking skip mode.

config UART_RTT_1
	def_bool $(dt_nodelabel_enabled_with_compat,rtt1,$(DT_COMPAT_SEGGER_RTT_UART))
	depends on SEGGER_RTT_MAX_NUM_UP_BUFFERS >= 2 && SEGGER_RTT_MAX_NUM_DOWN_BUFFERS >= 2
	select SERIAL_HAS_DRIVER
	select UART_RTT_DRIVER
	help
	  Enable UART on RTT channel 1

config UART_RTT_2
	def_bool $(dt_nodelabel_enabled_with_compat,rtt2,$(DT_COMPAT_SEGGER_RTT_UART))
	depends on SEGGER_RTT_MAX_NUM_UP_BUFFERS >= 3 && SEGGER_RTT_MAX_NUM_DOWN_BUFFERS >= 3
	select SERIAL_HAS_DRIVER
	select UART_RTT_DRIVER
	help
	  Enable UART on RTT channel 2

config UART_RTT_3
	def_bool $(dt_nodelabel_enabled_with_compat,rtt3,$(DT_COMPAT_SEGGER_RTT_UART))
	depends on SEGGER_RTT_MAX_NUM_UP_BUFFERS >= 4 && SEGGER_RTT_MAX_NUM_DOWN_BUFFERS >= 4
	select SERIAL_HAS_DRIVER
	select UART_RTT_DRIVER
	help
	  Enable UART on RTT channel 3

config UART_RTT_DRIVER
	bool

endif
