# 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 "Enable 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 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_INIT_PRIORITY
	int "Init priority"
	default 95 if USB_UART_CONSOLE
	default 60
	depends on UART_CONSOLE
	help
	  Device driver initialization priority.
	  Console has to be initialized after the UART driver
	  it uses.

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 "Enable 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 "Enable 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 USB_UART_CONSOLE
	bool "Use USB port for console outputs"
	select UART_CONSOLE
	select USB_CDC_ACM
	help
	  Enable this option to use the USB CDC ACM class for console.
	  As for the console driver, this option only changes the initialization
	  level.

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.

# Workaround for not being able to have commas in macro arguments
DT_CHOSEN_Z_IPM_CONSOLE := zephyr,console

config IPM_CONSOLE_ON_DEV_NAME
	string "IPM device name used by console"
	default "$(dt_chosen_label,$(DT_CHOSEN_Z_IPM_CONSOLE))" if HAS_DTS
	default "IPM_0"
	depends on IPM_CONSOLE
	help
	  IPM device name used by IPM console driver.

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_PIPE
	bool "Enable pipe UART driver"
	select UART_INTERRUPT_DRIVEN
	help
	  Enable pipe UART driver. This driver allows application to communicate
	  over UART with custom defined protocol. Driver doesn't inspect received
	  data (as contrary to console UART driver) and all aspects of received
	  protocol data are handled by application provided callback.

# Workaround for not being able to have commas in macro arguments
DT_CHOSEN_Z_UART_PIPE := zephyr,uart-pipe

config UART_PIPE_ON_DEV_NAME
	string "Device Name of UART Device for pipe UART"
	default "$(dt_chosen_label,$(DT_CHOSEN_Z_UART_PIPE))" if HAS_DTS
	default "UART_0"
	depends on UART_PIPE
	help
	  This option specifies the name of UART device to be used
	  for pipe UART.

config UART_MCUMGR
	bool "Enable 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 XTENSA_CONSOLE_INIT_PRIORITY
	int "Init priority"
	default 60
	depends on XTENSA_SIM_CONSOLE
	help
	  Device driver initialization priority.

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 CPU_CORTEX_M || ARM64
	help
	  Enable this option to use semihosting for console.
	  Semihosting is a mechanism that enables code running on an ARM target
	  to communicate and use the Input/Output facilities on a host computer
	  that is running a debugger.
	  Additional information can be found in:
	  https://developer.arm.com/docs/dui0471/k/what-is-semihosting/what-is-semihosting
	  This option is compatible with hardware and with QEMU, through the
	  (automatic) use of the -semihosting-config switch when invoking it.

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

source "drivers/console/Kconfig.gsm_mux"

config UART_MUX
	bool "Enable UART muxing (GSM 07.10) support [EXPERIMENTAL]"
	depends on SERIAL_SUPPORT_INTERRUPT && GSM_MUX
	select UART_INTERRUPT_DRIVEN
	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_INIT_PRIORITY
	int "Init priority"
	default 95
	help
	  Device driver initialization priority. UART mux has to be
	  initialized after the UART driver it uses.

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.


endif # CONSOLE
