Skip to content

Commit ba4fc7c

Browse files
committed
driver: Add Zephyr modem driver for Serial Modem 2.0
Add Zephyr modem driver for Serial Modem 2.0, including the nRF91M1 module. Signed-off-by: Seppo Takalo <seppo.takalo@nordicsemi.no>
1 parent c1404a1 commit ba4fc7c

10 files changed

Lines changed: 136 additions & 2 deletions

drivers/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
44

55
add_subdirectory_ifdef(CONFIG_DTR_UART dtr_uart)
6+
add_subdirectory_ifdef(CONFIG_MODEM_NRF91SM nrf91-sm)

drivers/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@
55

66
menu "Drivers"
77
rsource "dtr_uart/Kconfig"
8+
rsource "nrf91-sm/Kconfig"
89
endmenu

drivers/nrf91-sm/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#
2+
# Copyright (c) 2026 Nordic Semiconductor ASA
3+
#
4+
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
#
6+
7+
zephyr_library()
8+
zephyr_library_sources(nordic_nrf91sm.c)

drivers/nrf91-sm/Kconfig

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#
2+
# Copyright (c) 2026 Nordic Semiconductor ASA
3+
#
4+
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
6+
config MODEM_NRF91SM
7+
bool "Nordic nRF91 Serial Modem support"
8+
default y
9+
depends on DT_HAS_NORDIC_NRF91_SM_V2_ENABLED
10+
select MODEM_CELLULAR
11+
help
12+
Modem driver for Nordic nRF91 series running
13+
the Serial Modem application v2.0.0 or later.

drivers/nrf91-sm/nordic_nrf91sm.c

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#include <zephyr/drivers/modem/modem_cellular.h>
2+
#include <zephyr/device.h>
3+
4+
MODEM_CELLULAR_COMMON_CHAT_MATCHES();
5+
6+
MODEM_CELLULAR_UNSOL_DEFINE(nordic_nrf91_unsol, MODEM_CELLULAR_COMMON_UNSOL_MATCHES);
7+
8+
MODEM_CHAT_MATCH_DEFINE(xiccid_match, "%XICCID: ", "", modem_cellular_chat_on_iccid);
9+
MODEM_CHAT_MATCH_DEFINE(uicc_initialized, "%XSIM: 1", "", NULL);
10+
11+
MODEM_CHAT_SCRIPT_CMDS_DEFINE(
12+
init_chat_script_cmds, MODEM_CHAT_SCRIPT_CMD_RESP("AT", ok_match),
13+
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CMEE=1", ok_match),
14+
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGSN", imei_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
15+
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGMM", cgmm_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
16+
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGMI", cgmi_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
17+
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGMR", cgmr_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
18+
MODEM_CHAT_SCRIPT_CMD_RESP("AT#XCMUXURC=1", ok_match),
19+
MODEM_CHAT_SCRIPT_CMD_RESP("AT%XSIM=1", ok_match),
20+
MODEM_CHAT_SCRIPT_CMD_RESP("AT%XSIM?\rAT+CFUN=41", uicc_initialized),
21+
MODEM_CHAT_SCRIPT_CMD_RESP("AT%XICCID", xiccid_match),
22+
MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match), MODEM_CHAT_SCRIPT_CMD_RESP("AT+CIMI", cimi_match),
23+
MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match), MODEM_CHAT_SCRIPT_CMD_RESP("AT%XSIM=0", ok_match),
24+
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CMUX=0", ok_match));
25+
26+
MODEM_CHAT_SCRIPT_DEFINE(init_chat_script, init_chat_script_cmds, abort_matches,
27+
modem_cellular_chat_callback_handler, 10);
28+
29+
MODEM_CHAT_SCRIPT_CMDS_DEFINE(network_cmds, MODEM_CHAT_SCRIPT_CMD_RESP("AT+CEREG=1", ok_match),
30+
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CEREG?", ok_match),
31+
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CFUN=1", ok_match));
32+
33+
MODEM_CHAT_SCRIPT_DEFINE(network_chat_script, network_cmds, abort_matches,
34+
modem_cellular_chat_callback_handler, 10);
35+
36+
MODEM_CHAT_SCRIPT_CMDS_DEFINE(dial_chat_script_cmds,
37+
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGDATA", connect_match));
38+
39+
MODEM_CHAT_SCRIPT_DEFINE(dial_chat_script, dial_chat_script_cmds, abort_matches,
40+
modem_cellular_chat_callback_handler, 10);
41+
42+
MODEM_CHAT_SCRIPT_CMDS_DEFINE(shutdown_chat_script_cmds,
43+
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CEREG=0", ok_match),
44+
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CFUN=0", ok_match));
45+
46+
MODEM_CHAT_SCRIPT_DEFINE(shutdown_chat_script, shutdown_chat_script_cmds, abort_matches,
47+
modem_cellular_chat_callback_handler, 10);
48+
49+
static const struct modem_cellular_config_scripts nrf91_sm_scripts = {
50+
.init = &init_chat_script,
51+
.network = &network_chat_script,
52+
.dial = &dial_chat_script,
53+
.shutdown = &shutdown_chat_script,
54+
};
55+
56+
#define NRF91SM_DEVICE(inst) \
57+
MODEM_DT_INST_PPP_DEFINE(inst, MODEM_CELLULAR_INST_NAME(ppp, inst), NULL, 98, 1500, 64); \
58+
\
59+
static struct modem_cellular_data MODEM_CELLULAR_INST_NAME(data, inst) = { \
60+
.chat_delimiter = "\r\n", \
61+
.ppp = &MODEM_CELLULAR_INST_NAME(ppp, inst), \
62+
}; \
63+
\
64+
MODEM_CELLULAR_DEFINE_AND_INIT_USER_PIPES(inst, (user_pipe_0, 3), (user_pipe_1, 4)) \
65+
\
66+
MODEM_CELLULAR_DEFINE_INSTANCE(inst, 0, 500, 2000, 100, true, &nrf91_sm_scripts, \
67+
&nordic_nrf91_unsol)
68+
69+
#define DT_DRV_COMPAT nordic_nrf91_sm_v2
70+
DT_INST_FOREACH_STATUS_OKAY(NRF91SM_DEVICE)
71+
#undef DT_DRV_COMPAT
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Copyright (c) 2026 Nordic Semiconductor ASA
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
title: Nordic nRF91 Serial Modem
5+
6+
description: |
7+
Nordic nRF91 series running the Serial Modem application v2.0.0 or later.
8+
This includes the nRF91M1 module.
9+
10+
compatible: "nordic,nrf91-sm-v2"
11+
12+
include: zephyr,cellular-modem-device.yaml
13+
14+
properties:
15+
zephyr,use-default-pdp-ctx:
16+
default: 1
17+
18+
zephyr,mdm-reset-behavior:
19+
default: ["toggle_on_recovery"]
20+
21+
autostarts:
22+
required: true

samples/sm_ppp_shell/boards/nrf54l15dk_nrf54l15_cpuapp.conf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,8 @@ CONFIG_SHELL_BACKEND_SERIAL_API_ASYNC=y
1313
# For debugging purposes, enable GPIO shell commands.
1414
CONFIG_GPIO=y
1515
CONFIG_GPIO_SHELL=y
16+
17+
CONFIG_SHELL_WILDCARD=n
18+
CONFIG_MODEM_AT_SHELL=y
19+
CONFIG_MODEM_AT_USER_PIPE_IDX=0
20+
CONFIG_MODEM_CMUX_MSC_FC_THRESHOLD=32

samples/sm_ppp_shell/boards/nrf54l15dk_nrf54l15_cpuapp.overlay

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
zephyr,console = &uart20;
2525
zephyr,shell-uart = &uart20;
2626
};
27+
aliases {
28+
modem = &modem;
29+
};
2730
};
2831

2932
/* Zephyr modem UART <-> nRF91 Serial Modem UART */
@@ -35,14 +38,15 @@
3538

3639
/* Nordic nRF91 Serial Modem configuration */
3740
modem: modem {
38-
compatible = "nordic,nrf91-slm";
41+
compatible = "nordic,nrf91-sm-v2";
3942
status = "okay";
4043
mdm-ring-gpios = <&gpio1 12 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
4144
mdm-dtr-gpios = <&gpio1 11 GPIO_ACTIVE_LOW>;
4245
zephyr,pm-device-runtime-auto;
4346
cmux-enable-runtime-power-save;
4447
cmux-close-pipe-on-power-save;
4548
cmux-idle-timeout-ms = <5000>;
49+
autostarts;
4650
};
4751
};
4852

samples/sm_ppp_shell/boards/nrf54l15dk_nrf54l15_cpuapp_ns.conf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,8 @@ CONFIG_GPIO_SHELL=y
1616

1717
# When building for /NS, silence TFM logs to avoid conflicts with modem UART.
1818
CONFIG_TFM_LOG_LEVEL_SILENCE=y
19+
20+
CONFIG_SHELL_WILDCARD=n
21+
CONFIG_MODEM_AT_SHELL=y
22+
CONFIG_MODEM_AT_USER_PIPE_IDX=0
23+
CONFIG_MODEM_CMUX_MSC_FC_THRESHOLD=32

samples/sm_ppp_shell/boards/nrf54l15dk_nrf54l15_cpuapp_ns.overlay

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
zephyr,console = &uart20;
2525
zephyr,shell-uart = &uart20;
2626
};
27+
aliases {
28+
modem = &modem;
29+
};
2730
};
2831

2932
/* Zephyr modem UART <-> nRF91 Serial Modem UART */
@@ -35,14 +38,15 @@
3538

3639
/* Nordic nRF91 Serial Modem configuration */
3740
modem: modem {
38-
compatible = "nordic,nrf91-slm";
41+
compatible = "nordic,nrf91-sm-v2";
3942
status = "okay";
4043
mdm-ring-gpios = <&gpio1 12 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
4144
mdm-dtr-gpios = <&gpio1 11 GPIO_ACTIVE_LOW>;
4245
zephyr,pm-device-runtime-auto;
4346
cmux-enable-runtime-power-save;
4447
cmux-close-pipe-on-power-save;
4548
cmux-idle-timeout-ms = <5000>;
49+
autostarts;
4650
};
4751
};
4852

0 commit comments

Comments
 (0)