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

config ZEPHYR_SEGGER_MODULE
	bool

config HAS_SEGGER_RTT
	bool
	help
	  Indicates that the platform supports SEGGER J-Link RTT.

config USE_SEGGER_RTT
	bool "SEGGER RTT libraries."
	depends on HAS_SEGGER_RTT
	select STM32_ENABLE_DEBUG_SLEEP_STOP if SOC_FAMILY_STM32
	help
	  Enable Segger J-Link RTT libraries for platforms that support it.
	  Selection of this option enables use of RTT for various subsystems.
	  Note that by enabling this option, RTT buffers consume more RAM.

if USE_SEGGER_RTT

config SEGGER_RTT_CUSTOM_LOCKING
	bool "Custom locking"
	help
	  Enable custom locking using Zephyr APIs.

config SEGGER_RTT_MAX_NUM_UP_BUFFERS
	int "Maximum number of up-buffers"
	default 3

config SEGGER_RTT_MAX_NUM_DOWN_BUFFERS
	int "Maximum number of down-buffers"
	default 3

config SEGGER_RTT_BUFFER_SIZE_UP
	int "Size of the buffer for terminal output of target, up to host"
	default 1024

config SEGGER_RTT_BUFFER_SIZE_DOWN
	int "Size of the buffer for terminal input of target, from host"
	default 32 if SHELL_BACKEND_RTT
	default 16

config SEGGER_RTT_PRINTF_BUFFER_SIZE
	int "Size of buffer for RTT printf to bulk-send chars via RTT"
	default 64

choice SEGGER_RTT_MODE
	prompt "Mode for pre-initialized terminal channel (buffer 0)"
	default SEGGER_RTT_MODE_NO_BLOCK_SKIP

config SEGGER_RTT_MODE_NO_BLOCK_SKIP
	bool "Skip. Do not block, output nothing."

config SEGGER_RTT_MODE_NO_BLOCK_TRIM
	bool "Trim: Do not block, output as much as fits."

config SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL
	bool "Block: Wait until there is space in the buffer."

endchoice

config SEGGER_RTT_MODE
	int
	default 2 if SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL
	default 1 if SEGGER_RTT_MODE_NO_BLOCK_TRIM
	default 0

config SEGGER_RTT_MEMCPY_USE_BYTELOOP
	bool "Use a simple byte-loop instead of standard memcpy"

choice SEGGER_RTT_SECTION
	prompt "Choose RTT data linker section"
	default SEGGER_RTT_SECTION_CUSTOM

config SEGGER_RTT_SECTION_NONE
	bool "Place RTT data in the default linker section"

config SEGGER_RTT_SECTION_DTCM
	bool "Place RTT data in the DTCM linker section"

config SEGGER_RTT_SECTION_CCM
	bool "Place RTT data in the CCM linker section"

if CPU_CORTEX_M

config SEGGER_RTT_SECTION_CUSTOM
	bool "Place RTT data in custom linker section at RAM start"

config SEGGER_RTT_SECTION_CUSTOM_DTS_REGION
	bool "Place RTT data in custom linker section defined by a memory region in DTS"

endif

endchoice

if SEGGER_RTT_SECTION_CUSTOM || SEGGER_RTT_SECTION_CUSTOM_DTS_REGION

config SEGGER_RTT_SECTION_CUSTOM_NAME
	string "Name of RTT data custom linker section"
	default ".rtt_buff_data"

endif

choice SEGGER_RTT_INIT_MODE
	prompt "RTT Initialization mode"
	help
		RTT inizialization function can avoid re-init of Cntrol Block
		if another program (e.g. bootloader) has already initialized it.
	default SEGGER_RTT_INIT_MODE_STRONG_CHECK if SEGGER_RTT_SECTION_CUSTOM
	default SEGGER_RTT_INIT_MODE_STRONG_CHECK

config SEGGER_RTT_INIT_MODE_ALWAYS
	bool "RTT Initialization done without conditions"

config SEGGER_RTT_INIT_MODE_STRONG_CHECK
	bool "RTT Initialization done if full check on Control Block ID fails"

config SEGGER_RTT_INIT_MODE_WEAK_CHECK
	bool "RTT Initialization done if partial check on Control Block ID fails"

endchoice

endif
