Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

drivers: modem: Added SMS subsystem for modem #59805

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions drivers/modem/Kconfig
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Modem configuration options

# Copyright (c) 2018 Foundries.io
# Copyright (c) 2023 T-Mobile USA, Inc.
# SPDX-License-Identifier: Apache-2.0

menuconfig MODEM
Expand Down Expand Up @@ -192,6 +193,7 @@ 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.sms"

source "drivers/modem/Kconfig.hl7800"
source "drivers/modem/Kconfig.simcom-sim7080"
Expand Down
43 changes: 43 additions & 0 deletions drivers/modem/Kconfig.sms
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Modem SMS options

# Copyright (c) 2023 T-Moblie
# SPDX-License-Identifier: Apache-2.0

menuconfig MODEM_SMS
bool "Modem SMS handler"
default y
depends on MODEM_CONTEXT
help
Choose this setting to enable SMS functionality for
modems.

if MODEM_SMS

config MODEM_SMS_IN_MSG_MAX_LEN
int "Maximum length of inbound SMS messages"
default 160
help
This is the maximum length of inbound (received) SMS messages.
Inbound SMS messages longer than this will be truncated.
The absolute maximum value may be network- and/or modem-dependent,
but a smaller value may be preferred in order to conserve memory.

config MODEM_SMS_OUT_MSG_MAX_LEN
int "Maximum length of outbound SMS messages"
default MODEM_SMS_IN_MSG_MAX_LEN
help
This is the maximum length of outbound SMS messages (being sent).
SMS message send requests longer than this are not possible.
The absolute maximum value may be network- and/or modem-dependent,
but a smaller value may be preferred in order to conserve memory.

config MODEM_SMS_CALLBACK
bool "Use SMS Receive callbacks"
default n
help
This option allows a callback to be registered for SMS receive
events. SMS messages reported via the callback will not be
buffered, and therefore client code must handle buffering if
required.

endif # MODEM_SMS
13 changes: 13 additions & 0 deletions drivers/modem/modem_context.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

/*
* Copyright (c) 2019 Foundries.io
* Copyright (c) 2023 T-Mobile USA, Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/
Expand All @@ -20,6 +21,8 @@
#include <zephyr/sys/ring_buffer.h>
#include <zephyr/drivers/gpio.h>

#include <zephyr/drivers/modem/sms.h>

#ifdef __cplusplus
extern "C" {
#endif
Expand Down Expand Up @@ -68,6 +71,16 @@ struct modem_context {
/* command handler config */
struct modem_cmd_handler cmd_handler;

/* modem device pointer */
const struct device *dev;

#if defined(CONFIG_MODEM_SMS)
/* SMS functions */
send_sms_func_t send_sms;
recv_sms_func_t recv_sms;
recv_sms_cb_en_func_t recv_sms_cb_en;
#endif

/* driver data */
void *driver_data;
};
Expand Down
117 changes: 117 additions & 0 deletions drivers/modem/modem_sms.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
/*
* Copyright (c) 2023 T-Mobile USA, Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/

#include <zephyr/kernel.h>
#include <zephyr/drivers/modem/sms.h>

#include "modem_sms.h"
#include "modem_context.h"

static sys_slist_t sms_recv_cbs = SYS_SLIST_STATIC_INIT(&sms_recv_cbs);

void notify_sms_recv(const struct device *dev, struct sms_in *sms, int csms_ref, int csms_idx,
int csms_tot)
{
struct sms_recv_cb *cb, *next;

SYS_SLIST_FOR_EACH_CONTAINER_SAFE(&sms_recv_cbs, cb, next, node) {
if (cb->recv) {
cb->recv(dev, sms, csms_ref, csms_idx, csms_tot);
}
}
}

static struct modem_context *modem_context_from_modem_dev(const struct device *dev)
{
struct modem_context *mctx;

for (int i = 0; i < CONFIG_MODEM_CONTEXT_MAX_NUM; i++) {
mctx = modem_context_from_id(i);
if (mctx && mctx->dev == dev) {
return mctx;
}
}
return 0;
}

int sms_msg_send(const struct device *dev, const struct sms_out *sms)
{
struct modem_context *mctx;

mctx = modem_context_from_modem_dev(dev);

if (!mctx) {
return -ENODEV;
}

if (!mctx->send_sms) {
return -ENOSYS;
}

return mctx->send_sms(sms);
}

int sms_msg_recv(const struct device *dev, struct sms_in *sms)
{
struct modem_context *mctx;

mctx = modem_context_from_modem_dev(dev);

if (!mctx) {
return -ENODEV;
}

if (!mctx->recv_sms) {
return -ENOSYS;
}

return mctx->recv_sms(sms);
}

#if defined(CONFIG_MODEM_SMS_CALLBACK)

int sms_recv_cb_en(const struct device *dev, bool enable)
{
struct modem_context *mctx;

mctx = modem_context_from_modem_dev(dev);

if (!mctx) {
return -ENODEV;
}

if (!mctx->recv_sms_cb_en) {
return -ENOSYS;
}

return mctx->recv_sms_cb_en(enable);
}

int sms_recv_cb_register(struct sms_recv_cb *cb)
{
if (cb == NULL) {
return -EINVAL;
}

sys_slist_append(&sms_recv_cbs, &cb->node);

return 0;
}

int sms_recv_cb_unregister(struct sms_recv_cb *cb)
{
if (cb == NULL) {
return -EINVAL;
}

if (!sys_slist_find_and_remove(&sms_recv_cbs, &cb->node)) {
return -EALREADY;
}

return 0;
}

#endif /* CONFIG_MODEM_SMS_CALLBACK */
25 changes: 25 additions & 0 deletions drivers/modem/modem_sms.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* Copyright (c) 2023 T-Mobile USA, Inc.
*
* SPDX-License-Identifier: Apache-2.0
*/

#ifndef ZEPHYR_DRIVERS_MODEM_MODEM_SMS_H_
#define ZEPHYR_DRIVERS_MODEM_MODEM_SMS_H_

#include <zephyr/drivers/modem/sms.h>

/**
* @brief Notify all registered callbacks of a received SMS message
*
* @param dev Device pointer of modem which received the SMS message
* @param sms Received SMS message
* @param csms_ref CSMS Reference number (if available, value is set to -1 if not)
* @param csms_idx CSMS Index number (if available, value is set to 0 if not)
* @param csms_tot CSMS Total segment count (if available, value is set to 1 if not)
*
*/
void notify_sms_recv(const struct device *dev, struct sms_in *sms, int csms_ref, int csms_idx,
int csms_tot);

#endif /* ZEPHYR_DRIVERS_MODEM_MODEM_SMS_H_ */
Loading
Loading