# Kconfig - Modem configuration options

#
# Copyright (c) 2018 Foundries.io
#
# SPDX-License-Identifier: Apache-2.0
#

menuconfig MODEM
	bool "Modem Drivers"
	help
	  Enable config options for modem drivers.

if MODEM

module = MODEM
module-str = modem
source "subsys/logging/Kconfig.template.log_config"

config MODEM_RECEIVER
	bool "Enable modem receiver helper driver"
	depends on SERIAL_SUPPORT_INTERRUPT
	select UART_INTERRUPT_DRIVEN
	select RING_BUFFER
	help
	  This driver allows modem drivers to communicate over UART with custom
	  defined protocols. Driver doesn't inspect received data and all
	  aspects of received protocol data are handled by application via
	  work method provided.  This driver differs from the pipe UART driver
	  in that callbacks are executed in a different work queue and data is
	  passed around in k_pipe structures.

config MODEM_RECEIVER_MAX_CONTEXTS
	int "Maximum number of modem receiver contexts"
	depends on MODEM_RECEIVER
	range 1 10
	default 1
	help
	  Maximum number of modem receiver contexts to handle.  For most
	  purposes this should stay at 1.

config MODEM_CONTEXT
	bool "Modem context helper driver [EXPERIMENTAL]"
	help
	  This driver allows modem drivers to communicate with an interface
	  using custom defined protocols. Driver doesn't inspect received data
	  and all aspects of received protocol data are handled by application
	  work method provided.  This driver combines abstractions for:
	  modem interface, command handler, pin config and socket handling each
	  of which will need to be configured.

if MODEM_CONTEXT

config MODEM_CONTEXT_MAX_NUM
	int "Maximum number of modem contexts"
	default 1
	help
	  Maximum number of modem contexts to handle.  For most
	  purposes this should stay at 1.

config MODEM_CONTEXT_VERBOSE_DEBUG
	bool "Verbose debug output in the modem context"
	help
	  Enabling this setting will turn on VERY heavy debugging from the
	  modem context helper.  Do NOT leave on for production.

config MODEM_IFACE_UART
	bool "UART-based modem interface"
	depends on SERIAL_SUPPORT_INTERRUPT
	select UART_INTERRUPT_DRIVEN
	select RING_BUFFER
	help
	  To configure this layer for use, create a modem_iface_uart_data
	  object and pass it's reference to modem_iface_uart_init()
	  along with the modem_iface reference from your modem_context object
	  and the UART device name.

config MODEM_CMD_HANDLER
	bool "Generic modem command handler"
	help
	  This generic command handler uses a modem interface to process
	  incoming data and hand it back to the modem driver via callbacks
	  defined for:
	  - modem responses
	  - unsolicited messages
	  - specified handlers for current operation
	  To configure this layer for use, create a modem_cmd_handler_data
	  object and pass it's reference to modem_cmd_handler_init() along with
	  the modem_cmd_handler reference from your modem_context object.

config MODEM_CMD_HANDLER_MAX_PARAM_COUNT
	int "Maximum number of params parsed per command"
	depends on MODEM_CMD_HANDLER
	default 6
	help
	  This option sets the maximum number of parameters which may be
	  parsed by the command handler.  This is also limited by the length
	  of the match_buf (match_buf_len) field as it needs to be large
	  enough to hold a single line of data (ending with /r).

config MODEM_SOCKET
	bool "Generic modem socket support layer"
	help
	  This layer provides much of the groundwork for keeping track of
	  modem "sockets" throughout their lifecycle (from the initial offload
	  API calls through the command handler call back layers).
	  To configure this layer for use, create a modem_socket_config
	  object with your socket data and pass it's reference to
	  modem_socket_init().

config MODEM_SOCKET_PACKET_COUNT
	int "Maximum number of stored packet sizes per socket"
	depends on MODEM_SOCKET
	default 6
	help
	  As the modem indicates more data is available to be received,
	  these values are organized into "packets".  This setting limits
	  the maximum number of packet sizes the socket can keep track of.

endif # MODEM_CONTEXT

config MODEM_SHELL
	bool "Enable modem shell utilities"
	select SHELL
	help
	  Activate shell module that provides modem utilities like
	  sending a command to the modem UART.

source "drivers/modem/Kconfig.ublox-sara-r4"
source "drivers/modem/Kconfig.wncm14a2a"

endif # MODEM
