# 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"
	select NET_BUF
	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.

config MODEM_SIM_NUMBERS
	bool "Enable querying the SIM for IMSI and ICCID"
	depends on MODEM_SHELL
	default y
	help
	  Query the SIM card for the IMSI and ICCID identifiers. This
	  can be disabled if the application does not use a SIM.

config MODEM_CELL_INFO
	bool "Enable querying for operator and cell info"
	depends on MODEM_SHELL
	help
	  Query for numerical operator id, location area code and cell id.

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

source "drivers/modem/Kconfig.hl7800"

endif # MODEM
