# 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
