#
# For a description of the syntax of this configuration file,
# see the file kconfig-language.txt in the NuttX tools repository.
#

config ARCH_HAVE_SERIAL_TERMIOS
	bool
	default n

menuconfig SERIAL
	bool "Serial Driver Support"
	default y
	---help---
		Front-end character drivers for chip-specific UARTs.  This provide
		some TTY-like functionality and are commonly used (but not required
		for) the NuttX system console.  See also include/nuttx/serial/serial.h

if SERIAL

config SERIAL_PM_ACTIVITY_DOMAIN
	int "PM activity domain"
	default 0
	depends on PM
	---help---
		When characters are received on a console device, pm_activity()
		will be called with this PM domain.

config SERIAL_PM_ACTIVITY_PRIORITY
	int "PM activity priority when receive character"
	default 6
	depends on PM
	---help---
		When characters are received on a console device, pm_activity()
		will be called with this PM priority.

config SERIAL_REMOVABLE
	bool
	default n

config SERIAL_CONSOLE
	bool
	default n

menuconfig 16550_UART
	bool "16550 UART Chip support"
	select ARCH_HAVE_SERIAL_TERMIOS
	default n

if 16550_UART
source "drivers/serial/Kconfig-16550"
endif

#
# MCU serial peripheral driver?
#

config OTHER_UART_SERIALDRIVER
	bool
	default n
	select MCU_SERIAL

config MCU_SERIAL
	bool
	default n

config RPMSG_UART
	bool "UART rpmsg support"
	default n
	depends on OPENAMP
	select ARCH_HAVE_SERIAL_TERMIOS
	select SERIAL_RXDMA
	select SERIAL_TXDMA
	select SERIAL_REMOVABLE
	select SERIAL_IFLOWCONTROL

config RPMSG_SERIALINIT
	bool "Add dummy up_serialinit for UART rpmsg"
	default y if !16550_UART && !MCU_SERIAL
	depends on RPMSG_UART

#
# Standard serial driver configuration
#

config STANDARD_SERIAL
	bool "Enable standard \"upper-half\" serial driver"
	default y if MCU_SERIAL
	default n if !MCU_SERIAL
	---help---
		Enable the standard, upper-half serial driver used by most MCU serial peripherals.

config SERIAL_NPOLLWAITERS
	int "Number of poll threads"
	default 4
	---help---
		Maximum number of threads than can be waiting for POLL events.
		Default: 4

config SERIAL_IFLOWCONTROL
	bool
	default n

config SERIAL_RS485CONTROL
	bool
	default n
	---help---
		Use RTS pin to control RS485 direction (Asserted while transmitting).

config SERIAL_OFLOWCONTROL
	bool
	default n

config SERIAL_TXDMA
	bool
	default n

config SERIAL_RXDMA
	bool
	default n

config SERIAL_IFLOWCONTROL_WATERMARKS
	bool "RX flow control watermarks"
	default n
	depends on SERIAL_IFLOWCONTROL
	---help---
		Call the "lower half" rxflowcontrol method whenever the number of
		characters in the serial RX buffer falls above an upper water mark
		level or below a lower watermark level.  The default behavior is to
		call the rxflowcontrol method only when the RX buffer is empty or
		full.

if SERIAL_IFLOWCONTROL_WATERMARKS

config SERIAL_IFLOWCONTROL_LOWER_WATERMARK
	int "RX lower Watermark (percent)"
	default 10
	range 1 99
	---help---
		Call the rxflowcontrol method then there are this amount (or or less)
		data buffered in the serial drivers RX buffer.  This is expressed
		as a percentage of the total size of the RX buffer which may vary
		from instance-to-instance.

config SERIAL_IFLOWCONTROL_UPPER_WATERMARK
	int "RX upper Watermark (percent)"
	default 90
	range 1 99
	---help---
		Call the rxflowcontrol method then there are this amount (or more)
		data buffered in the serial drivers RX buffer.  This is expressed
		as a percentage of the total size of the RX buffer which may vary
		from instance-to-instance.

endif # SERIAL_IFLOWCONTROL_WATERMARKS

config SERIAL_TIOCSERGSTRUCT
	bool "Support TIOCSERGSTRUCT"
	default n
	depends on DEBUG_FEATURES && (MCU_SERIAL || 16550_UART)
	---help---
		As a debug option, many serial bottom half drivers support the TIOCSERGSTRUCT
		that allows you to get the internal driver data structure.  By default, this
		IOCTL is not supported in order to reduce footprint.  But if (1) the driver
		supports the TIOCSERGSTRUCT ioctl, and (2) this option is selected, then
		support for the TIOCSERGSTRUCT will be enabled.

config SERIAL_TERMIOS
	bool "Serial TERMIOS support"
	depends on ARCH_HAVE_SERIAL_TERMIOS
	default n
	---help---
		Serial driver supports termios.h interfaces (tcsetattr, tcflush, etc.).
		If this is not defined, then the terminal settings (baud, parity, etc).
		are not configurable at runtime; serial streams cannot be flushed, etc..

config TTY_FORCE_PANIC
	bool "Enable TTY force crash"
	default n
	depends on DEBUG_FEATURES
	---help---
		This is for debugging system busyloop or deadlock, when the shell can't run,
		then use this force crash the system to see the dumplog.

config TTY_FORCE_PANIC_CHAR
	hex "TTY force crash characters"
	default 0x1F
	depends on TTY_FORCE_PANIC
	---help---
		Use Ctrl-? 0x1F inputs to determine whether panic system

config TTY_SIGINT
	bool "Support SIGINT"
	default n
	depends on SERIAL_TERMIOS
	---help---
		Whether support Ctrl-c/x event.  Enabled automatically for console
		devices.  May be enabled for other serial devices using the ISIG bit
		in the Termios c_lflag.

		REVISIT:  This implementation is compliant but incomplete.  The
		c_lflag ISIG bit normally enables/disables INTR, QUIT, SUSP, and
		DSUSP character processing.  The relationship between these names,
		standard signals, and typical key presses are as follows:

		  INTR   SIGINT   Ctrl-C  ETX(0x03) Interrupt
		  KILL   SIGKILL  Ctrl-U  NAK(0x15) Kill
		  QUIT   SIGQUIT  Ctrl-\  FS (0x1c) Quit
		  SUSP   SIGTSTP  Ctrl-Z  SUB(0x1a) Suspend
		  DSUSP  SIGTSTP  Ctrl-Y  EM (0x19) Delayed suspend

		Additional requirements:
		  - SIGKILL cannot be caught or ignored.  Compared to SIGTERM which
		    is like SIGKILL but can be caught or ignored.
		  - SIGQUIT is like SIGINT but causes generation of a core dump
		  - SIGSTOP cannot be caught or ignored.  SIGTSTP is like SIGSTOP but
		    can be caught or ignored.
		  - The delayed suspend (DSUSD) is like suspend (SUPD), except that
		    the suspension is delayed until the next read operation

		Ctrl-D (EOT 0x04) normally should not generate a signal but, instead,
		should cause an immediate End-of-File result.

config TTY_SIGINT_CHAR
	hex "Serial parse SIGINT characters"
	default 0x03 if SERIAL_CONSOLE
	default 0x04 if !SERIAL_CONSOLE
	depends on TTY_SIGINT
	---help---
		Use ASCII 0x03 (Ctrl-c) or 0x04 (ctrl-d) inputs to determine whether
		to send a SIGINT event.  Other characters may also be selected.

		REVISIT:  Traditionally Ctrl-C would generate SIGINT.  Ctrl-D is the
		End-of-File character that should close the stream.

config TTY_SIGTSTP
	bool "Support SIGTSTP"
	default n
	depends on SERIAL_TERMIOS
	---help---
		Whether support Ctrl-z event.  Enabled automatically for console
		devices.  May be enabled for other serial devices using the ISIG bit
		in the Termios c_lflag.

		REVISIT:  This implementation is compliant but incomplete.  The
		c_lflag ISIG bit normally enables/disables INTR, QUIT, SUSP, and
		DSUSP character processing.  The relationship between these names,
		standard signals, and typical key presses are as follows:

		  INTR   SIGINT   Ctrl-C  ETX(0x03) Interrupt
		  KILL   SIGKILL  Ctrl-U  NAK(0x15) Kill
		  QUIT   SIGQUIT  Ctrl-\  FS (0x1c) Quit
		  SUSP   SIGTSTP  Ctrl-Z  SUB(0x1a) Suspend
		  DSUSP  SIGTSTP  Ctrl-Y  EM (0x19) Delayed suspend

		Additional requirements:
		  - SIGKILL cannot be caught or ignored.  Compared to SIGTERM which
		    is like SIGKILL but can be caught or ignored.
		  - SIGQUIT is like SIGINT but causes generation of a core dump
		  - SIGSTOP cannot be caught or ignored.  SIGTSTP is like SIGSTOP but
		    can be caught or ignored.
		  - The delayed suspend (DSUSD) is like suspend (SUPD), except that
		    the suspension is delayed until the next read operation

config TTY_SIGTSTP_CHAR
	hex "Serial parse SIGTSTP characters"
	default 0x1a
	depends on TTY_SIGTSTP
	---help---
		Use ASCII 0x1a (Ctrl-z) input to determine whether to send a SIGTSTP
		event.  Other characters may also be selected.

#
# Serial console selection
#

choice
	prompt "Serial console"
	default NO_SERIAL_CONSOLE if !OTHER_UART_SERIALDRIVER
	default OTHER_SERIAL_CONSOLE if OTHER_UART_SERIALDRIVER
	depends on MCU_SERIAL
	#depends on DEV_CONSOLE - We may have serial console with no file system at all

config UART_SERIAL_CONSOLE
	bool "UART"
	depends on UART_SERIALDRIVER
	select SERIAL_CONSOLE

config UART0_SERIAL_CONSOLE
	bool "UART0"
	depends on UART0_SERIALDRIVER
	select SERIAL_CONSOLE

config USART0_SERIAL_CONSOLE
	bool "USART0"
	depends on USART0_SERIALDRIVER
	select SERIAL_CONSOLE

config UART1_SERIAL_CONSOLE
	bool "UART1"
	depends on UART1_SERIALDRIVER
	select SERIAL_CONSOLE

config USART1_SERIAL_CONSOLE
	bool "USART1"
	depends on USART1_SERIALDRIVER
	select SERIAL_CONSOLE

config UART2_SERIAL_CONSOLE
	bool "UART2"
	depends on UART2_SERIALDRIVER
	select SERIAL_CONSOLE

config USART2_SERIAL_CONSOLE
	bool "USART2"
	depends on USART2_SERIALDRIVER
	select SERIAL_CONSOLE

config UART3_SERIAL_CONSOLE
	bool "UART3"
	depends on UART3_SERIALDRIVER
	select SERIAL_CONSOLE

config USART3_SERIAL_CONSOLE
	bool "USART3"
	depends on USART3_SERIALDRIVER
	select SERIAL_CONSOLE

config UART4_SERIAL_CONSOLE
	bool "UART4"
	depends on UART4_SERIALDRIVER
	select SERIAL_CONSOLE

config USART4_SERIAL_CONSOLE
	bool "USART4"
	depends on USART4_SERIALDRIVER
	select SERIAL_CONSOLE

config UART5_SERIAL_CONSOLE
	bool "UART5"
	depends on UART5_SERIALDRIVER
	select SERIAL_CONSOLE

config USART5_SERIAL_CONSOLE
	bool "USART5"
	depends on USART5_SERIALDRIVER
	select SERIAL_CONSOLE

config UART6_SERIAL_CONSOLE
	bool "UART6"
	depends on UART6_SERIALDRIVER
	select SERIAL_CONSOLE

config USART6_SERIAL_CONSOLE
	bool "USART6"
	depends on USART6_SERIALDRIVER
	select SERIAL_CONSOLE

config UART7_SERIAL_CONSOLE
	bool "UART7"
	depends on UART7_SERIALDRIVER
	select SERIAL_CONSOLE

config USART7_SERIAL_CONSOLE
	bool "USART7"
	depends on USART7_SERIALDRIVER
	select SERIAL_CONSOLE

config UART8_SERIAL_CONSOLE
	bool "UART8"
	depends on UART8_SERIALDRIVER
	select SERIAL_CONSOLE

config USART8_SERIAL_CONSOLE
	bool "USART8"
	depends on USART8_SERIALDRIVER
	select SERIAL_CONSOLE

config USART9_SERIAL_CONSOLE
	bool "USART8"
	depends on USART9_SERIALDRIVER
	select SERIAL_CONSOLE

config LPUART0_SERIAL_CONSOLE
	bool "LPUART0"
	depends on LPUART0_SERIALDRIVER
	select SERIAL_CONSOLE

config LPUART1_SERIAL_CONSOLE
	bool "LPUART1"
	depends on LPUART1_SERIALDRIVER
	select SERIAL_CONSOLE

config LPUART2_SERIAL_CONSOLE
	bool "LPUART2"
	depends on LPUART2_SERIALDRIVER
	select SERIAL_CONSOLE

config LPUART3_SERIAL_CONSOLE
	bool "LPUART3"
	depends on LPUART3_SERIALDRIVER
	select SERIAL_CONSOLE

config LPUART4_SERIAL_CONSOLE
	bool "LPUART4"
	depends on LPUART4_SERIALDRIVER
	select SERIAL_CONSOLE

config LPUART5_SERIAL_CONSOLE
	bool "LPUART5"
	depends on LPUART5_SERIALDRIVER
	select SERIAL_CONSOLE

config LPUART6_SERIAL_CONSOLE
	bool "LPUART6"
	depends on LPUART6_SERIALDRIVER
	select SERIAL_CONSOLE

config LPUART7_SERIAL_CONSOLE
	bool "LPUART7"
	depends on LPUART7_SERIALDRIVER
	select SERIAL_CONSOLE

config LPUART8_SERIAL_CONSOLE
	bool "LPUART8"
	depends on LPUART8_SERIALDRIVER
	select SERIAL_CONSOLE

config SCI0_SERIAL_CONSOLE
	bool "SCI0"
	depends on SCI0_SERIALDRIVER
	select SERIAL_CONSOLE

config SCI1_SERIAL_CONSOLE
	bool "SCI1"
	depends on SCI1_SERIALDRIVER
	select SERIAL_CONSOLE

config SCI2_SERIAL_CONSOLE
	bool "SCI2"
	depends on SCI2_SERIALDRIVER
	select SERIAL_CONSOLE

config SCI3_SERIAL_CONSOLE
	bool "SCI3"
	depends on SCI3_SERIALDRIVER
	select SERIAL_CONSOLE

config SCI4_SERIAL_CONSOLE
	bool "SCI4"
	depends on SCI4_SERIALDRIVER
	select SERIAL_CONSOLE

config SCI5_SERIAL_CONSOLE
	bool "SCI5"
	depends on SCI5_SERIALDRIVER
	select SERIAL_CONSOLE

config SCI6_SERIAL_CONSOLE
	bool "SCI6"
	depends on SCI6_SERIALDRIVER
	select SERIAL_CONSOLE

config SCI7_SERIAL_CONSOLE
	bool "SCI7"
	depends on SCI7_SERIALDRIVER
	select SERIAL_CONSOLE

config SCI8_SERIAL_CONSOLE
	bool "SCI8"
	depends on SCI8_SERIALDRIVER
	select SERIAL_CONSOLE

config SCI9_SERIAL_CONSOLE
	bool "SCI9"
	depends on SCI9_SERIALDRIVER
	select SERIAL_CONSOLE

config SCI10_SERIAL_CONSOLE
	bool "SCI10"
	depends on SCI10_SERIALDRIVER
	select SERIAL_CONSOLE

config SCI11_SERIAL_CONSOLE
	bool "SCI11"
	depends on SCI11_SERIALDRIVER
	select SERIAL_CONSOLE

config SCI12_SERIAL_CONSOLE
	bool "SCI12"
	depends on SCI12_SERIALDRIVER
	select SERIAL_CONSOLE

config OTHER_SERIAL_CONSOLE
	bool "Other serial console"
	select SERIAL_CONSOLE

config NO_SERIAL_CONSOLE
	bool "No serial console"

endchoice

#
# U[S]ARTn_XYZ settings for MCU serial drivers
#

menu "UART Configuration"
	depends on UART_SERIALDRIVER

config UART_RXBUFSIZE
	int "Receive buffer size"
	default 256
	---help---
		Characters are buffered as they are received. This specifies
		the size of the receive buffer.

config UART_TXBUFSIZE
	int "Transmit buffer size"
	default 256
	---help---
		Characters are buffered before being sent.  This specifies
		the size of the transmit buffer.

config UART_BAUD
	int "BAUD rate"
	default 115200
	---help---
		The configured BAUD of the UART.

config UART_BITS
	int "Character size"
	default 8
	---help---
		The number of bits.  Must be either 7 or 8.

config UART_PARITY
	int "Parity setting"
	default 0
	range 0 2
	---help---
		0=no parity, 1=odd parity, 2=even parity

config UART_2STOP
	int "use 2 stop bits"
	default 0
	---help---
		1=Two stop bits

config UART_IFLOWCONTROL
	bool "UART RTS flow control"
	default n
	select SERIAL_IFLOWCONTROL
	---help---
		Enable UART RTS flow control

config UART_OFLOWCONTROL
	bool "UART CTS flow control"
	default n
	select SERIAL_OFLOWCONTROL
	---help---
		Enable UART CTS flow control

config UART_TXDMA
	bool "UART Tx DMA support"
	default n
	select SERIAL_TXDMA
	---help---
		Enable Tx DMA transfers on UART

config UART_RXDMA
	bool "UART Rx DMA support"
	default n
	select SERIAL_RXDMA
	---help---
		Enable Rx DMA transfers on UART

endmenu

source "drivers/serial/Kconfig-uart"
source "drivers/serial/Kconfig-lpuart"
source "drivers/serial/Kconfig-usart"
source "drivers/serial/Kconfig-sci"

menuconfig PSEUDOTERM
	bool "Pseudo-Terminal (PTY) support"
	default n
	select PIPES
	select ARCH_HAVE_SERIAL_TERMIOS
	---help---
		Enable support support for master and slave pseudo-terminal devices.

if PSEUDOTERM

choice
	prompt "PTY model"
	default PSEUDOTERM_BSD if DISABLE_PSEUDOFS_OPERATIONS
	default PSEUDOTERM_SUSV1 if !DISABLE_PSEUDOFS_OPERATIONS

config PSEUDOTERM_BSD
	bool "BSD style"
	---help---
		Deprecated BSD style PTYs.

		Master: /dev/ptyN
		Slave: /dev/ttypN

		Where N is the minor number

config PSEUDOTERM_SUSV1
	bool "SUSv1 style"
	depends on !DISABLE_PSEUDOFS_OPERATIONS
	---help---
		PTYs as specified in the Single Unix Specification (SUSv1).

		Master: /dev/ptmx (multiplexor)
		Slave: /dev/pts/N

		Where N is the minor number

endchoice # PTY model

config PSEUDOTERM_RXBUFSIZE
	int "Pseudo-Terminal Rx buffer size"
	default 256
	---help---
		Master-to-slave pipe buffer size.  Default: 256

config PSEUDOTERM_TXBUFSIZE
	int "Pseudo-Terminal Tx buffer size"
	default 256
	---help---
		Slave-to-master pipe buffer size.  Default: 256

endif # PSEUDOTERM

menuconfig UART_BTH4
	bool "BT H4 uart pseudo device"
	default n
	select MM_CIRCBUF
	---help---
		Enable support for Bluetooth H4 UART Pseudo Device(eg. /dev/ttyHCI).
		This instantiates a serial-like interface over an existing bluetooth
		controller via HCI interface. Useful for external Bluetooth
		stacks working this way instead of the socket based interface.

if UART_BTH4

config UART_BTH4_TXBUFSIZE
	int "BT H4 uart TX buffer size"
	default 1024
	---help---
		H4 UART TX buffer size.  Default: 1024

config UART_BTH4_RXBUFSIZE
	int "BT H4 uart RX buffer size"
	default 1024
	---help---
		H4 UART RX buffer size.  Default: 1024

config UART_BTH4_NPOLLWAITERS
	int "Number of poll threads"
	default 2
	---help---
		Maximum number of threads than can be waiting for POLL events.
		Default: 2

endif # UART_BTH4

endif # SERIAL