# Console driver configuration options

# Copyright (c) 2014-2015 Wind River Systems, Inc.
# Copyright (c) 2016 Cadence Design Systems, Inc.
# SPDX-License-Identifier: Apache-2.0

# Setting shared by different subsystems

menuconfig CONSOLE
	bool "Console drivers"

if CONSOLE

config CONSOLE_INPUT_MAX_LINE_LEN
	int "Console maximum input line length"
	default 128
	help
	  This option can be used to modify the maximum length a console input
	  can be.

config CONSOLE_HAS_DRIVER
	bool
	help
	  This is an option to be enabled by console drivers to signal
	  that some kind of console exists.

config CONSOLE_HANDLER
	bool "Console input handler"
	depends on UART_CONSOLE && SERIAL_SUPPORT_INTERRUPT
	select UART_INTERRUPT_DRIVEN
	help
	  This option enables console input handler allowing to write simple
	  interaction between serial console and the OS.

config CONSOLE_INIT_PRIORITY
	int "Console init priority"
	default 95 if UART_MUX
	default 60 if UART_CONSOLE || XTENSA_SIM_CONSOLE
	default KERNEL_INIT_PRIORITY_DEFAULT
	help
	  Console driver device initialization priority.

config UART_CONSOLE
	bool "Use UART for console"
	depends on SERIAL && SERIAL_HAS_DRIVER
	select CONSOLE_HAS_DRIVER
	help
	  Enable this option to use one UART for console.

config UART_CONSOLE_DEBUG_SERVER_HOOKS
	bool "Debug server hooks in debug console"
	depends on UART_CONSOLE
	help
	  This option allows a debug server agent such as GDB to take over the
	  handling of traffic that goes through the console logic. The debug
	  server looks at characters received and decides to handle them itself if
	  they are some sort of control characters, or let the regular console
	  code handle them if they are of no special significance to it.

config UART_CONSOLE_MCUMGR
	bool "UART console mcumgr passthrough"
	depends on UART_CONSOLE
	help
	  Enables the UART console to receive mcumgr frames for image upgrade
	  and device management.  When enabled, the UART console does not
	  process mcumgr frames, but it hands them up to a higher level module
	  (e.g., the shell).  If unset, incoming mcumgr frames are dropped.

config UART_CONSOLE_INPUT_EXPIRED
	bool "Support for UART console input expired mechanism"
	default y
	depends on UART_CONSOLE && PM
	help
	  This option allows a notification to the power management module that
	  the module for UART console is in use now. If the interval of console
	  module doesn't receive any input message exceeds expired timeout, such
	  as UART_CONSOLE_INPUT_EXPIRED_TIMEOUT, the power management module is
	  allowed to enter sleep/deep sleep state and turn off the clock of UART
	  console module. This mechanism gives a window in which the users can
	  organize input message if CONFIG_PM is enabled.

config UART_CONSOLE_INPUT_EXPIRED_TIMEOUT
	int "Fixed amount of time to keep the UART console in use flag true"
	default 15000
	depends on UART_CONSOLE_INPUT_EXPIRED
	help
	  Fixed amount of time which unit is milliseconds to keep the UART
	  console in use flag true.

config JAILHOUSE_DEBUG_CONSOLE
	bool "Use JAILHOUSE_DEBUG console"
	select CONSOLE_HAS_DRIVER
	depends on ARM64
	help
	  Emit console messages to a jailhouse hypervisor debug console.
	  Useful in board bring-up if there aren't any working serial
	  drivers.

config RAM_CONSOLE
	bool "Use RAM console"
	select CONSOLE_HAS_DRIVER
	help
	  Emit console messages to a RAM buffer "ram_console" which can
	  be examined at runtime with a debugger. Useful in board bring-up
	  if there aren't any working serial drivers.

config RAM_CONSOLE_BUFFER_SIZE
	int "Ram Console buffer size"
	default 1024
	depends on RAM_CONSOLE
	help
	  Size of the RAM console buffer. Messages will wrap around if the
	  length is exceeded.

config RTT_CONSOLE
	bool "Use RTT console"
	depends on USE_SEGGER_RTT
	select CONSOLE_HAS_DRIVER
	help
	  Emit console messages to a RAM buffer that is then read by the
	  Segger J-Link software and displayed on a computer in real-time.
	  Requires support for Segger J-Link on the companion IC onboard.

if RTT_CONSOLE

config RTT_TX_RETRY_CNT
	int "Number of TX retries"
	default 2
	help
	  Number of TX retries before dropping the byte and assuming that
	  RTT session is inactive.

config RTT_TX_RETRY_DELAY_MS
	int "Delay between TX retries in milliseconds"
	default 2
	help
	  Sleep period between TX retry attempts. During RTT session, host pulls data
	  periodically. Period starts from 1-2 milliseconds and can be increased
	  if traffic on RTT increases (also from host to device). In case of
	  heavy traffic data can be lost and it may be necessary to increase
	  delay or number of retries.

config RTT_TX_RETRY_IN_INTERRUPT
	bool "Busy wait in the interrupt context for TX retry"
	help
	  If enabled RTT console will busy wait between TX retries when console
	  assumes that RTT session is active. In case of heavy traffic data can
	  be lost and it may be necessary to increase delay or number of
	  retries.

endif

config IPM_CONSOLE_SENDER
	bool "Inter-processor Mailbox console sender"
	select CONSOLE_HAS_DRIVER
	help
	  Enable the sending side of IPM console

config IPM_CONSOLE_RECEIVER
	bool "Inter-processor Mailbox console receiver"
	select RING_BUFFER
	help
	  Enable the receiving side of IPM console

config IPM_CONSOLE_STACK_SIZE
	int "Stack size for IPM console receiver thread"
	depends on IPM_CONSOLE_RECEIVER
	default 2048 if COVERAGE
	default 512
	help
	  Each instance of the IPM console receiver driver creates a worker
	  thread to print out incoming messages from the remote CPU. Specify the
	  stack size for these threads here.

config IPM_CONSOLE
	bool "Inter-processor Mailbox console"
	depends on IPM
	select CONSOLE_HAS_DRIVER
	help
	  Enable console over Inter-processor Mailbox.

config IPM_CONSOLE_LINE_BUF_LEN
	int "IPM console line buffer length"
	default 128
	depends on IPM_CONSOLE
	help
	  IPM console line buffer length specify amount of the buffer
	  where characters are stored before sending the whole line.

config UART_MCUMGR
	bool "Mcumgr UART driver"
	select UART_INTERRUPT_DRIVEN
	help
	  Enable the mcumgr UART driver. This driver allows the application to
	  communicate over UART using the mcumgr protocol for image upgrade and
	  device management. The driver doesn't inspect received data (as
	  contrary to console UART driver) and all aspects of received protocol
	  data are handled by an application provided callback.

if UART_MCUMGR

config UART_MCUMGR_RX_BUF_SIZE
	int "Size of receive buffer for mcumgr fragments received over UART, in bytes"
	default 128
	help
	  Specifies the size of the mcumgr UART receive buffer, in bytes. This
	  value must be large enough to accommodate any line sent by an mcumgr
	  client.

config UART_MCUMGR_RX_BUF_COUNT
	int "Number of receive buffers for mcumgr fragments received over UART"
	default 2
	help
	  Specifies the number of the mcumgr UART receive buffers.  Receive
	  buffers hold received mcumgr fragments prior to reassembly.  This
	  setting's value must satisfy the following relation:
	  UART_MCUMGR_RX_BUF_COUNT * UART_MCUMGR_RX_BUF_SIZE >=
	  MCUMGR_SMP_UART_MTU

endif # UART_MCUMGR

config XTENSA_SIM_CONSOLE
	bool "Use Xtensa simulator console"
	depends on SIMULATOR_XTENSA
	select CONSOLE_HAS_DRIVER
	default y
	help
	  Use simulator console to print messages.

config NATIVE_POSIX_CONSOLE
	bool "Use the host terminal for console"
	depends on ARCH_POSIX
	select CONSOLE_HAS_DRIVER
	help
	  Use the host terminal (where the native_posix binary was launched) for the
	  Zephyr console

config NATIVE_POSIX_STDIN_CONSOLE
	bool "Use the host terminal stdin"
	depends on NATIVE_POSIX_CONSOLE
	help
	  No current use. Kept only as there is plans to start using these
	  drivers with the shell

config NATIVE_STDIN_POLL_PERIOD
	int "Polling period for stdin"
	depends on NATIVE_POSIX_STDIN_CONSOLE
	default 20
	help
	  In ms, polling period for stdin

config NATIVE_POSIX_STDOUT_CONSOLE
	bool "Print to the host terminal stdout"
	depends on NATIVE_POSIX_CONSOLE
	default y
	help
	  Zephyr's printk messages will be directed to the host terminal stdout.

config NATIVE_POSIX_CONSOLE_INIT_PRIORITY
	int "Init priority"
	default 99
	depends on NATIVE_POSIX_CONSOLE
	help
	  Device driver initialization priority.

config SEMIHOST_CONSOLE
	bool "Use semihosting for console"
	select CONSOLE_HAS_DRIVER
	depends on SEMIHOST
	help
	  Enable this option to use semihosting for console.
	  See SEMIHOST for a more complete description of semihosting.

module = UART_CONSOLE
module-str = UART console
source "subsys/logging/Kconfig.template.log_config"

source "drivers/console/Kconfig.gsm_mux"

config UART_MUX
	bool "UART muxing (GSM 07.10) support [EXPERIMENTAL]"
	depends on SERIAL_SUPPORT_INTERRUPT && GSM_MUX
	select UART_INTERRUPT_DRIVEN
	select EXPERIMENTAL
	help
	  Enable this option to create UART muxer that run over a physical
	  UART. The GSM 07.10 muxing protocol is used to separate the data
	  between these muxed UARTs.

if UART_MUX

config UART_MUX_DEVICE_NAME
	string "UART mux device name template"
	default "GSM"
	help
	  Device name template for the UART mux Devices. First device would
	  have name $(UART_MUX_DEVICE_NAME)_0, etc. User will access muxed
	  UART using this name.

config UART_MUX_RINGBUF_SIZE
	int "UART mux ring buffer size"
	default 256
	help
	  UART mux ring buffer size when passing data from RX ISR to worker
	  thread that will do the unmuxing.

config UART_MUX_TEMP_BUF_SIZE
	int "Size of the temp buffer when reading data from real UART"
	default 32
	help
	  Size of the temporary RX buffer in receiving ISR.

config UART_MUX_DEVICE_COUNT
	int "Number of UART mux devices (DLCIs)"
	default GSM_MUX_DLCI_MAX
	range 1 64
	help
	  Number of instances of UART muxes. Default value is set by
	  maximum number of DLCIs (Data Link Connection Identifiers)
	  configured in the system.

config UART_MUX_REAL_DEVICE_COUNT
	int "Number of real UART devices"
	default 1
	help
	  Tells how many real UART devices there are. Typically there is
	  only one UART and the muxed UARTs are run on top of that. If you have
	  two modems for example, then you would need to increase this to two.

config UART_MUX_RX_STACK_SIZE
	int "Size of the stack allocated for receiving data from UART"
	default 512
	help
	  Sets the stack size which will be used by the PPP RX workqueue.

config UART_MUX_RX_PRIORITY
	int "RX workqueue thread priority"
	default 7
	help
	  Sets the priority of the RX workqueue thread.

module = UART_MUX
module-str = UART mux
source "subsys/logging/Kconfig.template.log_config"

endif # UART_MUX

config UART_MUX_VERBOSE_DEBUG
	bool "Print hexdump of sent and received packets"
	depends on UART_MUX_LOG_LEVEL_DBG
	help
	  As there might be lot of debug output printed, only enable
	  this if really needed.

config EFI_CONSOLE
	bool "Use EFI console for console output"
	select CONSOLE_HAS_DRIVER
	help
	  Enable this option to use EFI console output.

endif # CONSOLE
