Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
76b838e
[nrf fromtree] modem: cellular: rename `CARRIER_ON` to `REGISTERED`
JordanYates Apr 9, 2026
a2da3b4
[nrf fromtree] modem: cellular: rename `DORMANT` to `AWAIT_PPP_DEAD`
JordanYates Apr 9, 2026
dd1a3da
[nrf fromtree] modem: cellular: fix dormant state control
JordanYates Apr 9, 2026
7294abe
[nrf fromtree] modem: cellular: update carrier state locations
JordanYates Apr 9, 2026
2443fd2
[nrf fromtree] net: Add net_pkt_skip API return error handling
namjoshiniks Apr 13, 2026
3bbe6c7
[nrf fromtree] net: Add net_pkt_write API return error handling
namjoshiniks Apr 13, 2026
32192c5
[nrf fromtree] modem: uart_isr: support mdm-dtr-gpios
mniestroj Feb 11, 2026
55c8ae7
[nrf fromtree] drivers: modem_cellular: add "Ready" signal handling
mniestroj Feb 12, 2026
16c9519
[nrf fromtree] drivers: modem: cellular: Add small delay after PPP DEAD
SeppoTakalo Apr 13, 2026
2fedfb3
[nrf fromtree] modem: cmux: Close pipes on CMUX close
SeppoTakalo Apr 2, 2026
bdf0b86
[nrf fromtree] modem: cmux: Prevent sending to DLC pipes before CMUX …
SeppoTakalo Apr 2, 2026
24f3d29
[nrf fromtree] modem: ppp: reset frame state on attach
JordanYates Apr 21, 2026
df059aa
[nrf fromtree] modem: ppp: detect "NO CARRIER" event
JordanYates Apr 21, 2026
25fb684
[nrf fromtree] modem: cellular: consistent AT command DLCI channel
JordanYates Apr 22, 2026
d652c89
[nrf fromtree] drivers: modem: modem_cellular: populate IMSI and ICCI…
FacepalmMute Apr 24, 2026
9d8ce7a
[nrf fromtree] modem: cellular: move common handlers to header
JordanYates Apr 22, 2026
4d5857f
[nrf fromtree] modem: cellular: move individual modems to dedicated f…
JordanYates Apr 22, 2026
7e731e9
[nrf fromtree] modem: cellular: remove `modem_cellular_config` casting
JordanYates Apr 30, 2026
f3736bf
[nrf fromtree] modem: chat: make work buffer size configurable
JordanYates May 7, 2026
2239bee
[nrf fromtree] modem: cmux: fix flow control for user pipes
JordanYates May 7, 2026
f9a27ae
[nrf fromtree] modem: cellular: group scripts into struct
JordanYates May 7, 2026
727b86d
[nrf fromtree] net: l2: ppp: misc: add missing net_log.h include
coran21 May 11, 2026
3a4fd73
[nrf fromtree] modem: chat: Check NULL pointer for modem_chat_run_scr…
SeppoTakalo Apr 24, 2026
9936b7b
[nrf fromtree] modem: chat: Allow re-attach without side effects
SeppoTakalo Apr 29, 2026
48dbace
[nrf fromtree] modem: cellular: Allow defining separate script for ne…
SeppoTakalo Apr 24, 2026
7ba5433
[nrf fromtree] modem: cellular: Refactor nRF91-slm driver for network…
SeppoTakalo May 5, 2026
d4e1852
[nrf fromtree] modem: cellular: allow vendor unsol_matches via config
wkhadgar May 11, 2026
651830e
[nrf fromtree] modem: cmux: Wake up before sending disconnect
SeppoTakalo May 12, 2026
8998cd3
[nrf fromtree] modem: cmux: Add testcases for power saving mode
SeppoTakalo May 13, 2026
64d0ea3
[nrf fromlist] modem: cellular: Delay redialing when PPP dies
SeppoTakalo May 12, 2026
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
1 change: 1 addition & 0 deletions drivers/modem/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ zephyr_library_include_directories(${ZEPHYR_BASE}/subsys/net/ip)
zephyr_library_include_directories(${ZEPHYR_BASE}/subsys/net/lib/sockets)
add_subdirectory(simcom)
add_subdirectory_ifdef(CONFIG_MODEM_HL78XX hl78xx)
add_subdirectory_ifdef(CONFIG_MODEM_CELLULAR vendor_modem_cellular)

# zephyr-keep-sorted-start
zephyr_library_sources_ifdef(CONFIG_MODEM_AT_SHELL modem_at_shell.c)
Expand Down
1,302 changes: 219 additions & 1,083 deletions drivers/modem/modem_cellular.c

Large diffs are not rendered by default.

23 changes: 23 additions & 0 deletions drivers/modem/vendor_modem_cellular/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# SPDX-License-Identifier: Apache-2.0

if((CONFIG_DT_HAS_QUECTEL_BG95_ENABLED) OR (CONFIG_DT_HAS_QUECTEL_BG96_ENABLED))
zephyr_library_sources(cellular_quectel_bg9x.c)
endif()
if((CONFIG_DT_HAS_TELIT_ME910G1_ENABLED) OR (CONFIG_DT_HAS_TELIT_ME310G1_ENABLED))
zephyr_library_sources(cellular_telit_mex10g1.c)
endif()

# zephyr-keep-sorted-start
zephyr_library_sources_ifdef(CONFIG_DT_HAS_NORDIC_NRF91_SLM_ENABLED cellular_nordic_nrf91_slm.c)
zephyr_library_sources_ifdef(CONFIG_DT_HAS_QUECTEL_EG25_G_ENABLED cellular_quectel_eg25_g.c)
zephyr_library_sources_ifdef(CONFIG_DT_HAS_QUECTEL_EG800Q_ENABLED cellular_quectel_eg800q.c)
zephyr_library_sources_ifdef(CONFIG_DT_HAS_SIMCOM_A76XX_ENABLED cellular_simcom_a76xx.c)
zephyr_library_sources_ifdef(CONFIG_DT_HAS_SIMCOM_SIM7080_ENABLED cellular_simcom_sim7080.c)
zephyr_library_sources_ifdef(CONFIG_DT_HAS_SQN_GM02S_ENABLED cellular_sqn_gm02s.c)
zephyr_library_sources_ifdef(CONFIG_DT_HAS_SWIR_HL7800_ENABLED cellular_swir_hl7800.c)
zephyr_library_sources_ifdef(CONFIG_DT_HAS_TELIT_LE910C1TX_ENABLED cellular_telit_le910c1tx.c)
zephyr_library_sources_ifdef(CONFIG_DT_HAS_TRASNA_LEXI_R10_ENABLED cellular_trasna_lexi_r10.c)
zephyr_library_sources_ifdef(CONFIG_DT_HAS_U_BLOX_LARA_R6_ENABLED cellular_u_blox_lara_r6.c)
zephyr_library_sources_ifdef(CONFIG_DT_HAS_U_BLOX_SARA_R4_ENABLED cellular_u_blox_sara_r4.c)
zephyr_library_sources_ifdef(CONFIG_DT_HAS_U_BLOX_SARA_R5_ENABLED cellular_u_blox_sara_r5.c)
# zephyr-keep-sorted-stop
80 changes: 80 additions & 0 deletions drivers/modem/vendor_modem_cellular/cellular_nordic_nrf91_slm.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
/*
* Copyright (c) 2026 Embeint Inc
*
* SPDX-License-Identifier: Apache-2.0
*/

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

#define DT_DRV_COMPAT nordic_nrf91_slm

MODEM_CELLULAR_COMMON_CHAT_MATCHES();

MODEM_CELLULAR_UNSOL_DEFINE(nordic_nrf91_slm_unsol, MODEM_CELLULAR_COMMON_UNSOL_MATCHES);

MODEM_CHAT_MATCH_DEFINE(xiccid_match, "%XICCID: ", "", modem_cellular_chat_on_iccid);
MODEM_CHAT_MATCH_DEFINE(uicc_initialized, "%XSIM: 1", "", NULL);

MODEM_CHAT_SCRIPT_CMDS_DEFINE(nordic_nrf91_slm_init_chat_script_cmds,
MODEM_CHAT_SCRIPT_CMD_RESP("AT", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CMEE=1", ok_match),

Check notice on line 20 in drivers/modem/vendor_modem_cellular/cellular_nordic_nrf91_slm.c

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

drivers/modem/vendor_modem_cellular/cellular_nordic_nrf91_slm.c:20 -MODEM_CHAT_SCRIPT_CMDS_DEFINE(nordic_nrf91_slm_init_chat_script_cmds, - MODEM_CHAT_SCRIPT_CMD_RESP("AT", ok_match), +MODEM_CHAT_SCRIPT_CMDS_DEFINE( + nordic_nrf91_slm_init_chat_script_cmds, MODEM_CHAT_SCRIPT_CMD_RESP("AT", ok_match), See https://docs.zephyrproject.org/latest/contribute/guidelines.html#clang-format for more details.
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGSN", imei_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGMM", cgmm_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGMI", cgmi_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGMR", cgmr_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT%XSIM=1", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CFUN=41", uicc_initialized),
MODEM_CHAT_SCRIPT_CMD_RESP("AT%XICCID", xiccid_match),
MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CIMI", cimi_match),
MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT%XSIM=0", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT#XCMUX=1", ok_match));

Check notice on line 32 in drivers/modem/vendor_modem_cellular/cellular_nordic_nrf91_slm.c

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

drivers/modem/vendor_modem_cellular/cellular_nordic_nrf91_slm.c:32 - MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match), - MODEM_CHAT_SCRIPT_CMD_RESP("AT+CIMI", cimi_match), - MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match), - MODEM_CHAT_SCRIPT_CMD_RESP("AT%XSIM=0", ok_match), + MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match), MODEM_CHAT_SCRIPT_CMD_RESP("AT+CIMI", cimi_match), + MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match), MODEM_CHAT_SCRIPT_CMD_RESP("AT%XSIM=0", ok_match), See https://docs.zephyrproject.org/latest/contribute/guidelines.html#clang-format for more details.

MODEM_CHAT_SCRIPT_DEFINE(nordic_nrf91_slm_init_chat_script, nordic_nrf91_slm_init_chat_script_cmds,
abort_matches, modem_cellular_chat_callback_handler, 10);

MODEM_CHAT_SCRIPT_CMDS_DEFINE(nordic_nrf91_slm_network_cmds,
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CEREG=1", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CEREG?", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT#XPPP=1", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CFUN=1", ok_match));

MODEM_CHAT_SCRIPT_DEFINE(nordic_nrf91_slm_network_chat_script, nordic_nrf91_slm_network_cmds,
abort_matches, modem_cellular_chat_callback_handler, 10);

/* In nRF91 Serial Modem AT#XPPP=1 triggers PPP automatically on a secondary DLC,
* so empty dial script is used
*/
MODEM_CHAT_SCRIPT_NO_ABORT_DEFINE(nordic_nrf91_slm_dial_chat_script, modem_chat_empty_script_chats,
modem_cellular_chat_callback_handler, 0);

MODEM_CHAT_SCRIPT_CMDS_DEFINE(nordic_nrf91_slm_shutdown_chat_script_cmds,
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CEREG=0", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CFUN=0", ok_match));

MODEM_CHAT_SCRIPT_DEFINE(nordic_nrf91_slm_shutdown_chat_script,
nordic_nrf91_slm_shutdown_chat_script_cmds, abort_matches,
modem_cellular_chat_callback_handler, 5);

static const struct modem_cellular_config_scripts nrf91_slm_scripts = {
.init = &nordic_nrf91_slm_init_chat_script,
.network = &nordic_nrf91_slm_network_chat_script,
.dial = &nordic_nrf91_slm_dial_chat_script,
.shutdown = &nordic_nrf91_slm_shutdown_chat_script,
};

#define MODEM_CELLULAR_DEVICE_NORDIC_NRF91_SLM(inst) \
MODEM_DT_INST_PPP_DEFINE(inst, MODEM_CELLULAR_INST_NAME(ppp, inst), NULL, 98, 1500, 1500); \
\
static struct modem_cellular_data MODEM_CELLULAR_INST_NAME(data, inst) = { \
.chat_delimiter = "\r\n", \
.ppp = &MODEM_CELLULAR_INST_NAME(ppp, inst), \
}; \
\
MODEM_CELLULAR_DEFINE_AND_INIT_USER_PIPES(inst, (gnss_pipe, 3)) \
\
MODEM_CELLULAR_DEFINE_INSTANCE(inst, 0, 500, 5000, 0, false, &nrf91_slm_scripts, \
&nordic_nrf91_slm_unsol)

DT_INST_FOREACH_STATUS_OKAY(MODEM_CELLULAR_DEVICE_NORDIC_NRF91_SLM)
89 changes: 89 additions & 0 deletions drivers/modem/vendor_modem_cellular/cellular_quectel_bg9x.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
/*
* Copyright (c) 2026 Embeint Inc
*
* SPDX-License-Identifier: Apache-2.0
*/

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

MODEM_CELLULAR_COMMON_CHAT_MATCHES();

MODEM_CELLULAR_UNSOL_DEFINE(quectel_bg9x_unsol, MODEM_CELLULAR_COMMON_UNSOL_MATCHES);

MODEM_CHAT_SCRIPT_CMDS_DEFINE(quectel_bg9x_set_baudrate_cmds,
MODEM_CHAT_SCRIPT_CMD_RESP("ATE0", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+IPR="
STRINGIFY(CONFIG_MODEM_CELLULAR_NEW_BAUDRATE), ok_match));

MODEM_CHAT_SCRIPT_DEFINE(quectel_bg9x_set_baudrate_chat_script, quectel_bg9x_set_baudrate_cmds,
abort_matches, modem_cellular_chat_callback_handler, 1);

MODEM_CHAT_SCRIPT_CMDS_DEFINE(quectel_bg9x_init_chat_script_cmds,
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CFUN=4", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CMEE=1", ok_match),

Check notice on line 23 in drivers/modem/vendor_modem_cellular/cellular_quectel_bg9x.c

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

drivers/modem/vendor_modem_cellular/cellular_quectel_bg9x.c:23 -MODEM_CHAT_SCRIPT_CMDS_DEFINE(quectel_bg9x_set_baudrate_cmds, - MODEM_CHAT_SCRIPT_CMD_RESP("ATE0", ok_match), - MODEM_CHAT_SCRIPT_CMD_RESP("AT+IPR=" - STRINGIFY(CONFIG_MODEM_CELLULAR_NEW_BAUDRATE), ok_match)); +MODEM_CHAT_SCRIPT_CMDS_DEFINE( + quectel_bg9x_set_baudrate_cmds, MODEM_CHAT_SCRIPT_CMD_RESP("ATE0", ok_match), + MODEM_CHAT_SCRIPT_CMD_RESP("AT+IPR=" STRINGIFY(CONFIG_MODEM_CELLULAR_NEW_BAUDRATE), + ok_match)); MODEM_CHAT_SCRIPT_DEFINE(quectel_bg9x_set_baudrate_chat_script, quectel_bg9x_set_baudrate_cmds, abort_matches, modem_cellular_chat_callback_handler, 1); -MODEM_CHAT_SCRIPT_CMDS_DEFINE(quectel_bg9x_init_chat_script_cmds, - MODEM_CHAT_SCRIPT_CMD_RESP("AT+CFUN=4", ok_match), +MODEM_CHAT_SCRIPT_CMDS_DEFINE( + quectel_bg9x_init_chat_script_cmds, MODEM_CHAT_SCRIPT_CMD_RESP("AT+CFUN=4", ok_match), See https://docs.zephyrproject.org/latest/contribute/guidelines.html#clang-format for more details.
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGSN", imei_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGMM", cgmm_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGMI", cgmi_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+QGMR", cgmr_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CIMI", cimi_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+QCCID", qccid_match),
MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP_NONE("AT+CMUX=0,0,5,127", 300));

MODEM_CHAT_SCRIPT_DEFINE(quectel_bg9x_init_chat_script, quectel_bg9x_init_chat_script_cmds,
abort_matches, modem_cellular_chat_callback_handler, 10);

MODEM_CHAT_SCRIPT_CMDS_DEFINE(quectel_bg9x_dial_chat_script_cmds,
MODEM_CHAT_SCRIPT_CMD_RESP("ATD*99***1#", connect_match));

MODEM_CHAT_SCRIPT_DEFINE(quectel_bg9x_dial_chat_script, quectel_bg9x_dial_chat_script_cmds,
dial_abort_matches, modem_cellular_chat_callback_handler, 10);

MODEM_CHAT_SCRIPT_CMDS_DEFINE(quectel_bg9x_network_setup_cmds,
MODEM_CHAT_SCRIPT_CMD_RESP("AT+QCFG=\"cmux/urcport\",1", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CEREG=1", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CEREG?", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CFUN=1", ok_match));

MODEM_CHAT_SCRIPT_DEFINE(quectel_bg9x_network_chat_script,
quectel_bg9x_network_setup_cmds, abort_matches,
modem_cellular_chat_callback_handler, 60);

Check notice on line 51 in drivers/modem/vendor_modem_cellular/cellular_quectel_bg9x.c

View workflow job for this annotation

GitHub Actions / Run compliance checks on patch series (PR)

You may want to run clang-format on this change

drivers/modem/vendor_modem_cellular/cellular_quectel_bg9x.c:51 -MODEM_CHAT_SCRIPT_DEFINE(quectel_bg9x_network_chat_script, - quectel_bg9x_network_setup_cmds, abort_matches, - modem_cellular_chat_callback_handler, 60); +MODEM_CHAT_SCRIPT_DEFINE(quectel_bg9x_network_chat_script, quectel_bg9x_network_setup_cmds, + abort_matches, modem_cellular_chat_callback_handler, 60); See https://docs.zephyrproject.org/latest/contribute/guidelines.html#clang-format for more details.
MODEM_CHAT_MATCH_DEFINE(powerdown_match, "POWERED DOWN", "", NULL);

MODEM_CHAT_SCRIPT_CMDS_DEFINE(quectel_bg9x_shutdown_chat_script_cmds,
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CEREG=0", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+QPOWD=1", powerdown_match));

MODEM_CHAT_SCRIPT_DEFINE(quectel_bg9x_shutdown_chat_script, quectel_bg9x_shutdown_chat_script_cmds,
abort_matches, modem_cellular_chat_callback_handler, 5);

static const struct modem_cellular_config_scripts quectel_bg9x_scripts = {
.set_baudrate = &quectel_bg9x_set_baudrate_chat_script,
.init = &quectel_bg9x_init_chat_script,
.network = &quectel_bg9x_network_chat_script,
.dial = &quectel_bg9x_dial_chat_script,
.shutdown = &quectel_bg9x_shutdown_chat_script,
};

#define MODEM_CELLULAR_DEVICE_QUECTEL_BG9X(inst) \
MODEM_DT_INST_PPP_DEFINE(inst, MODEM_CELLULAR_INST_NAME(ppp, inst), NULL, 98, 1500, 64); \
\
static struct modem_cellular_data MODEM_CELLULAR_INST_NAME(data, inst) = { \
.chat_delimiter = "\r", \
.chat_filter = "\n", \
.ppp = &MODEM_CELLULAR_INST_NAME(ppp, inst), \
}; \
\
MODEM_CELLULAR_DEFINE_AND_INIT_USER_PIPES(inst, (user_pipe_0, 3), (user_pipe_1, 4)) \
\
MODEM_CELLULAR_DEFINE_INSTANCE(inst, 500, 1000, 5000, 2000, false, &quectel_bg9x_scripts, \
&quectel_bg9x_unsol)

#define DT_DRV_COMPAT quectel_bg95
DT_INST_FOREACH_STATUS_OKAY(MODEM_CELLULAR_DEVICE_QUECTEL_BG9X)
#undef DT_DRV_COMPAT

#define DT_DRV_COMPAT quectel_bg96
DT_INST_FOREACH_STATUS_OKAY(MODEM_CELLULAR_DEVICE_QUECTEL_BG9X)
#undef DT_DRV_COMPAT
73 changes: 73 additions & 0 deletions drivers/modem/vendor_modem_cellular/cellular_quectel_eg25_g.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/*
* Copyright (c) 2026 Embeint Inc
*
* SPDX-License-Identifier: Apache-2.0
*/

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

#define DT_DRV_COMPAT quectel_eg25_g

MODEM_CELLULAR_COMMON_CHAT_MATCHES();

MODEM_CELLULAR_UNSOL_DEFINE(quectel_eg25_g_unsol, MODEM_CELLULAR_COMMON_UNSOL_MATCHES);

MODEM_CHAT_SCRIPT_CMDS_DEFINE(
quectel_eg25_g_init_chat_script_cmds, MODEM_CHAT_SCRIPT_CMD_RESP("ATE0", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CFUN=4", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CMEE=1", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CREG=1", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGREG=1", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CEREG=1", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CREG?", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CEREG?", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGREG?", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGSN", imei_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGMM", cgmm_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGMI", cgmi_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGMR", cgmr_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CIMI", cimi_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP_NONE("AT+CMUX=0,0,5,127,10,3,30,10,2", 100));

MODEM_CHAT_SCRIPT_DEFINE(quectel_eg25_g_init_chat_script, quectel_eg25_g_init_chat_script_cmds,
abort_matches, modem_cellular_chat_callback_handler, 10);

MODEM_CHAT_SCRIPT_CMDS_DEFINE(quectel_eg25_g_dial_chat_script_cmds,
MODEM_CHAT_SCRIPT_CMD_RESP_MULT("AT+CGACT=0,1", allow_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CFUN=1", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("ATD*99***1#", connect_match));

MODEM_CHAT_SCRIPT_DEFINE(quectel_eg25_g_dial_chat_script, quectel_eg25_g_dial_chat_script_cmds,
dial_abort_matches, modem_cellular_chat_callback_handler, 10);

MODEM_CHAT_SCRIPT_CMDS_DEFINE(quectel_eg25_g_periodic_chat_script_cmds,
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CREG?", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CEREG?", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGREG?", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CSQ", csq_match));

MODEM_CHAT_SCRIPT_DEFINE(quectel_eg25_g_periodic_chat_script,
quectel_eg25_g_periodic_chat_script_cmds, abort_matches,
modem_cellular_chat_callback_handler, 4);

static const struct modem_cellular_config_scripts quectel_eg25_g_scripts = {
.init = &quectel_eg25_g_init_chat_script,
.dial = &quectel_eg25_g_dial_chat_script,
.periodic = &quectel_eg25_g_periodic_chat_script,
};

#define MODEM_CELLULAR_DEVICE_QUECTEL_EG25_G(inst) \
MODEM_DT_INST_PPP_DEFINE(inst, MODEM_CELLULAR_INST_NAME(ppp, inst), NULL, 98, 1500, 64); \
\
static struct modem_cellular_data MODEM_CELLULAR_INST_NAME(data, inst) = { \
.chat_delimiter = "\r", \
.chat_filter = "\n", \
.ppp = &MODEM_CELLULAR_INST_NAME(ppp, inst), \
}; \
\
MODEM_CELLULAR_DEFINE_AND_INIT_USER_PIPES(inst, (user_pipe_0, 3), (user_pipe_1, 4)) \
\
MODEM_CELLULAR_DEFINE_INSTANCE(inst, 1500, 500, 15000, 5000, false, \
&quectel_eg25_g_scripts, &quectel_eg25_g_unsol)

DT_INST_FOREACH_STATUS_OKAY(MODEM_CELLULAR_DEVICE_QUECTEL_EG25_G)
71 changes: 71 additions & 0 deletions drivers/modem/vendor_modem_cellular/cellular_quectel_eg800q.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
* Copyright (c) 2026 Embeint Inc
*
* SPDX-License-Identifier: Apache-2.0
*/

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

#define DT_DRV_COMPAT quectel_eg800q

MODEM_CELLULAR_COMMON_CHAT_MATCHES();

MODEM_CELLULAR_UNSOL_DEFINE(quectel_eg800q_unsol, MODEM_CELLULAR_COMMON_UNSOL_MATCHES);

MODEM_CHAT_SCRIPT_CMDS_DEFINE(
quectel_eg800q_init_chat_script_cmds, MODEM_CHAT_SCRIPT_CMD_RESP("AT", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("ATE0", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CFUN?", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CFUN=4", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CMEE=1", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CEREG=1", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CEREG?", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGSN", imei_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGMM", cgmm_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGMI", cgmi_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CGMR", cgmr_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CIMI", cimi_match), MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CMUX=0,0,5,127", ok_match));

MODEM_CHAT_SCRIPT_DEFINE(quectel_eg800q_init_chat_script, quectel_eg800q_init_chat_script_cmds,
abort_matches, modem_cellular_chat_callback_handler, 30);

MODEM_CHAT_SCRIPT_CMDS_DEFINE(quectel_eg800q_dial_chat_script_cmds,
MODEM_CHAT_SCRIPT_CMD_RESP_MULT("AT+CGACT=0,1", allow_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CFUN=1", ok_match),
/* this at command is required as a small delay before performing
* dialing, otherwise we get 'NO CARRIER' and abort
*/
MODEM_CHAT_SCRIPT_CMD_RESP_NONE("AT", 500),
MODEM_CHAT_SCRIPT_CMD_RESP("ATD*99***1#", connect_match));

MODEM_CHAT_SCRIPT_DEFINE(quectel_eg800q_dial_chat_script, quectel_eg800q_dial_chat_script_cmds,
dial_abort_matches, modem_cellular_chat_callback_handler, 10);

MODEM_CHAT_SCRIPT_CMDS_DEFINE(quectel_eg800q_periodic_chat_script_cmds,
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CEREG?", ok_match),
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CSQ", csq_match));

MODEM_CHAT_SCRIPT_DEFINE(quectel_eg800q_periodic_chat_script,
quectel_eg800q_periodic_chat_script_cmds, abort_matches,
modem_cellular_chat_callback_handler, 4);

static const struct modem_cellular_config_scripts quectel_eg800q_scripts = {
.init = &quectel_eg800q_init_chat_script,
.dial = &quectel_eg800q_dial_chat_script,
.periodic = &quectel_eg800q_periodic_chat_script,
};

#define MODEM_CELLULAR_DEVICE_QUECTEL_EG800Q(inst) \
MODEM_DT_INST_PPP_DEFINE(inst, MODEM_CELLULAR_INST_NAME(ppp, inst), NULL, 98, 1500, 64); \
\
static struct modem_cellular_data MODEM_CELLULAR_INST_NAME(data, inst) = { \
.chat_delimiter = "\r", \
.chat_filter = "\n", \
.ppp = &MODEM_CELLULAR_INST_NAME(ppp, inst), \
}; \
\
MODEM_CELLULAR_DEFINE_AND_INIT_USER_PIPES(inst, (user_pipe_0, 3), (user_pipe_1, 4)) \
\
MODEM_CELLULAR_DEFINE_INSTANCE(inst, 1500, 500, 15000, 5000, false, \
&quectel_eg800q_scripts, &quectel_eg800q_unsol)
Loading
Loading