Zephyr Project API 4.5.0-rc2
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
modem_cellular.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2026 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
12
13#ifndef ZEPHYR_INCLUDE_DRIVERS_CELLULAR_INTERNAL_H_
14#define ZEPHYR_INCLUDE_DRIVERS_CELLULAR_INTERNAL_H_
15
18#include <zephyr/drivers/uart.h>
19#include <zephyr/drivers/gpio.h>
20#include <zephyr/pm/device.h>
21#include <zephyr/modem/chat.h>
22#include <zephyr/modem/cmux.h>
23#include <zephyr/modem/pipe.h>
25#include <zephyr/modem/ppp.h>
27#include <zephyr/sys/atomic.h>
28
29#ifdef __cplusplus
30extern "C" {
31#endif
32
40
42
43#define MODEM_CELLULAR_DATA_IMEI_LEN (16)
44#define MODEM_CELLULAR_DATA_SN_LEN (CONFIG_MODEM_CELLULAR_SERIAL_NUMBER_MAX_SIZE + 1)
45#define MODEM_CELLULAR_DATA_MODEL_ID_LEN (65)
46#define MODEM_CELLULAR_DATA_IMSI_LEN (23)
47#define MODEM_CELLULAR_DATA_ICCID_LEN (22)
48#define MODEM_CELLULAR_DATA_MANUFACTURER_LEN (65)
49#define MODEM_CELLULAR_DATA_FW_VERSION_LEN (65)
50#define MODEM_CELLULAR_DATA_APN_LEN (32)
51#define MODEM_CELLULAR_MAX_APN_CMDS (2)
52#define MODEM_CELLULAR_APN_BUF_SIZE (64)
53
54/* Zephyr networking interface states:
55 * NET_IF_LOWER_UP: Carrier is on in AWAIT_REGISTERED and REGISTERED
56 * NET_IF_DORMANT: Interface is dormant in every state except REGISTERED
57 */
58enum modem_cellular_state {
59 MODEM_CELLULAR_STATE_IDLE = 0,
60 MODEM_CELLULAR_STATE_RECOVERY,
61 MODEM_CELLULAR_STATE_RESET_PULSE,
62 MODEM_CELLULAR_STATE_AWAIT_RESET,
63 MODEM_CELLULAR_STATE_POWER_ON_PULSE,
64 MODEM_CELLULAR_STATE_AWAIT_POWER_ON,
65 MODEM_CELLULAR_STATE_SET_BAUDRATE,
66 MODEM_CELLULAR_STATE_RUN_INIT_SCRIPT,
67 MODEM_CELLULAR_STATE_CONNECT_CMUX,
68 MODEM_CELLULAR_STATE_OPEN_DLCI1,
69 MODEM_CELLULAR_STATE_OPEN_DLCI2,
70 MODEM_CELLULAR_STATE_RUN_BOARD_INIT_SCRIPT,
71 MODEM_CELLULAR_STATE_WAIT_FOR_APN,
72 MODEM_CELLULAR_STATE_RUN_APN_SCRIPT,
73 MODEM_CELLULAR_STATE_RUN_NETWORK_SCRIPT,
74 MODEM_CELLULAR_STATE_RUN_DIAL_SCRIPT,
75 MODEM_CELLULAR_STATE_AWAIT_REGISTERED,
76 MODEM_CELLULAR_STATE_REGISTERED,
77 MODEM_CELLULAR_STATE_AWAIT_PPP_DEAD,
78 MODEM_CELLULAR_STATE_INIT_POWER_OFF,
79 MODEM_CELLULAR_STATE_RUN_SHUTDOWN_SCRIPT,
80 MODEM_CELLULAR_STATE_POWER_OFF_PULSE,
81 MODEM_CELLULAR_STATE_AWAIT_POWER_OFF,
82 MODEM_CELLULAR_STATE_AWAIT_DIAL,
83};
84
85enum modem_cellular_event {
86 MODEM_CELLULAR_EVENT_RESUME = 0,
87 MODEM_CELLULAR_EVENT_SUSPEND,
88 MODEM_CELLULAR_EVENT_SCRIPT_SUCCESS,
89 MODEM_CELLULAR_EVENT_SCRIPT_FAILED,
90 MODEM_CELLULAR_EVENT_CMUX_CONNECTED,
91 MODEM_CELLULAR_EVENT_CMUX_DISCONNECTED,
92 MODEM_CELLULAR_EVENT_DLCI1_OPENED,
93 MODEM_CELLULAR_EVENT_DLCI2_OPENED,
94 MODEM_CELLULAR_EVENT_TIMEOUT,
95 MODEM_CELLULAR_EVENT_REGISTERED,
96 MODEM_CELLULAR_EVENT_DEREGISTERED,
97 MODEM_CELLULAR_EVENT_BUS_OPENED,
98 MODEM_CELLULAR_EVENT_BUS_CLOSED,
99 MODEM_CELLULAR_EVENT_PPP_DEAD,
100 MODEM_CELLULAR_EVENT_MODEM_READY,
101 MODEM_CELLULAR_EVENT_APN_SET,
102 MODEM_CELLULAR_EVENT_RING,
103 MODEM_CELLULAR_EVENT_PERIODIC_KICK,
104 MODEM_CELLULAR_EVENT_DIAL,
105 MODEM_CELLULAR_EVENT_HANGUP,
106} __packed;
107
108struct modem_cellular_event_cb {
111 void *user_data;
112};
113
114struct modem_cellular_event_pkg {
115 uint8_t event;
116 const void *ptr;
117};
118
120
131 /* UART backend */
132 struct modem_pipe *uart_pipe;
133 struct modem_backend_uart uart_backend;
134 uint8_t uart_backend_receive_buf[CONFIG_MODEM_CELLULAR_UART_BUFFER_SIZES];
135 uint8_t uart_backend_transmit_buf[CONFIG_MODEM_CELLULAR_UART_BUFFER_SIZES];
136 uint32_t original_baudrate;
137
138 /* CMUX */
139 struct modem_cmux cmux;
140 uint8_t cmux_receive_buf[MODEM_CMUX_WORK_BUFFER_SIZE];
141 uint8_t cmux_transmit_buf[MODEM_CMUX_WORK_BUFFER_SIZE];
142
143 struct modem_cmux_dlci dlci1;
144 struct modem_cmux_dlci dlci2;
145 struct modem_pipe *dlci1_pipe;
146 struct modem_pipe *dlci2_pipe;
147 /* Points to dlci1_pipe or NULL. Used for shutdown script if not NULL */
148 struct modem_pipe *cmd_pipe;
149 uint8_t dlci1_receive_buf[MODEM_CMUX_WORK_BUFFER_SIZE];
150 /* DLCI 2 is only used for chat scripts. */
151 uint8_t dlci2_receive_buf[MODEM_CMUX_WORK_BUFFER_SIZE];
152
153 /* Modem chat */
154 struct modem_chat chat;
155 uint8_t chat_receive_buf[CONFIG_MODEM_CELLULAR_CHAT_BUFFER_SIZE];
156 uint8_t *chat_argv[32];
157 uint8_t script_failure_counter;
158 uint8_t recovery_count;
159
160 /* Status */
161 enum cellular_registration_status registration_status_gsm;
162 enum cellular_registration_status registration_status_gprs;
163 enum cellular_registration_status registration_status_lte;
164 enum cellular_registration_status registration_status_5g;
165 enum cellular_access_technology access_tech;
166 uint8_t rssi;
167 uint8_t rsrp;
168 uint8_t rsrq;
169 struct cellular_evt_network_status network_status;
170 bool network_status_valid;
171 uint8_t imei[MODEM_CELLULAR_DATA_IMEI_LEN];
172 uint8_t sn[MODEM_CELLULAR_DATA_SN_LEN];
173 uint8_t model_id[MODEM_CELLULAR_DATA_MODEL_ID_LEN];
174 uint8_t imsi[MODEM_CELLULAR_DATA_IMSI_LEN];
175 uint8_t iccid[MODEM_CELLULAR_DATA_ICCID_LEN];
176 uint8_t manufacturer[MODEM_CELLULAR_DATA_MANUFACTURER_LEN];
177 uint8_t fw_version[MODEM_CELLULAR_DATA_FW_VERSION_LEN];
178 uint8_t apn[MODEM_CELLULAR_DATA_APN_LEN];
179
180 struct modem_chat_script_chat apn_chats[MODEM_CELLULAR_MAX_APN_CMDS];
181 struct modem_chat_script apn_script;
182 char apn_buf[MODEM_CELLULAR_MAX_APN_CMDS][MODEM_CELLULAR_APN_BUF_SIZE];
183
184 struct modem_chat_script board_init_script;
185
187#if defined(CONFIG_MODEM_CELLULAR_ON_DEMAND_CONNECT)
188 struct net_mgmt_event_callback if_event_callback;
189#endif
190
191 enum modem_cellular_state state;
192 const struct device *dev;
193 struct k_work_delayable timeout_work;
194
195 /* Power management */
196 struct k_sem suspended_sem;
197
198 /* Event dispatcher */
199 struct k_work event_dispatch_work;
200 struct k_msgq event_queue;
201 struct modem_cellular_event_pkg event_buf[8];
202 const void *event_ptr;
203
204 struct k_mutex api_lock;
205 struct modem_cellular_event_cb cb;
206
207 /* Ring interrupt */
208 struct gpio_callback ring_gpio_cb;
209
211 atomic_t periodic_paused;
213 bool periodic_timeout_skipped;
217 bool power_on_skipped;
218
219#if defined(CONFIG_MODEM_CELLULAR_STATS)
221 struct cellular_stats stats;
223 uint32_t stats_outage_start_ms;
224#endif
226};
227
229
230struct modem_cellular_user_pipe {
231 struct modem_cmux_dlci dlci;
232 uint8_t dlci_address;
233 uint8_t *dlci_receive_buf;
234 uint16_t dlci_receive_buf_size;
235 struct modem_pipe *pipe;
236 struct modem_pipelink *pipelink;
237};
238
240
270
316
318
319struct modem_cellular_config {
320 const struct device *uart;
321 const struct modem_cellular_vendor_config *vendor;
322 const void *vendor_specific;
323 struct modem_ppp *ppp;
324 struct gpio_dt_spec power_gpio;
325 struct gpio_dt_spec reset_gpio;
326 struct gpio_dt_spec wake_gpio;
327 struct gpio_dt_spec ring_gpio;
328 struct gpio_dt_spec dtr_gpio;
329 struct gpio_dt_spec status_gpio;
330 bool autostarts;
331 bool hold_reset_on_suspend;
332 bool reset_on_resume;
333 bool reset_on_recovery;
334 bool cmux_enable_runtime_power_save;
335 bool cmux_close_pipe_on_power_save;
336 bool cmux_no_powersave_handshake;
337 bool use_default_pdp_context;
338 bool use_default_apn;
339 k_timeout_t cmux_idle_timeout;
340 struct modem_cellular_user_pipe *user_pipes;
341 uint8_t user_pipes_size;
342};
343
347int modem_cellular_init(const struct device *dev);
348
349int modem_cellular_pm_action(const struct device *dev, enum pm_device_action action);
350
351extern const struct cellular_driver_api modem_cellular_api;
352
353void modem_cellular_emit_event(struct modem_cellular_data *data, enum cellular_event evt,
354 const void *payload);
355
356/*
357 * Store the latest serving-cell status and emit CELLULAR_EVENT_NETWORK_STATUS_CHANGED
358 * only when it changed, ignoring signal quality (rsrp/rsrq) so periodic polls do not
359 * re-fire the event on signal fluctuation.
360 */
361void modem_cellular_emit_network_status(struct modem_cellular_data *data,
362 const struct cellular_evt_network_status *status);
363
364void modem_cellular_chat_on_imei(struct modem_chat *chat, char **argv, uint16_t argc,
365 void *user_data);
366void modem_cellular_chat_on_cgsn_sn(struct modem_chat *chat, char **argv, uint16_t argc,
367 void *user_data);
368void modem_cellular_chat_on_cgsn_imei(struct modem_chat *chat, char **argv, uint16_t argc,
369 void *user_data);
370void modem_cellular_chat_on_cgmm(struct modem_chat *chat, char **argv, uint16_t argc,
371 void *user_data);
372void modem_cellular_chat_on_csq(struct modem_chat *chat, char **argv, uint16_t argc,
373 void *user_data);
374void modem_cellular_chat_on_cesq(struct modem_chat *chat, char **argv, uint16_t argc,
375 void *user_data);
376void modem_cellular_chat_on_iccid(struct modem_chat *chat, char **argv, uint16_t argc,
377 void *user_data);
378void modem_cellular_chat_on_imsi(struct modem_chat *chat, char **argv, uint16_t argc,
379 void *user_data);
380void modem_cellular_chat_on_cgmi(struct modem_chat *chat, char **argv, uint16_t argc,
381 void *user_data);
382void modem_cellular_chat_on_cgmr(struct modem_chat *chat, char **argv, uint16_t argc,
383 void *user_data);
384void modem_cellular_chat_on_cxreg(struct modem_chat *chat, char **argv, uint16_t argc,
385 void *user_data);
386void modem_cellular_chat_on_cgev(struct modem_chat *chat, char **argv, uint16_t argc,
387 void *user_data);
388void modem_cellular_chat_on_modem_ready(struct modem_chat *chat, char **argv, uint16_t argc,
389 void *user_data);
390
392
405 enum modem_chat_script_result result,
406 const struct modem_chat_script_completion_info *info,
407 void *user_data);
408
418
427#define MODEM_CELLULAR_INST_NAME(name, inst) \
428 CONCAT(name, _, DT_DRV_COMPAT, inst)
429
431
432#define MODEM_CELLULAR_DEFINE_USER_PIPE_DATA(inst, name, size) \
433 MODEM_PIPELINK_DT_INST_DEFINE(inst, name); \
434 static uint8_t MODEM_CELLULAR_INST_NAME(name, inst)[size] \
435
436#define MODEM_CELLULAR_INIT_USER_PIPE(_inst, _name, _dlci_address) \
437 { \
438 .dlci_address = _dlci_address, \
439 .dlci_receive_buf = MODEM_CELLULAR_INST_NAME(_name, _inst), \
440 .dlci_receive_buf_size = sizeof(MODEM_CELLULAR_INST_NAME(_name, _inst)), \
441 .pipelink = MODEM_PIPELINK_DT_INST_GET(_inst, _name), \
442 }
443
444#define MODEM_CELLULAR_DEFINE_USER_PIPES(inst, ...) \
445 static struct modem_cellular_user_pipe MODEM_CELLULAR_INST_NAME(user_pipes, inst)[] = { \
446 __VA_ARGS__ \
447 }
448
449#define MODEM_CELLULAR_GET_USER_PIPES(inst) \
450 MODEM_CELLULAR_INST_NAME(user_pipes, inst)
451
452/* Extract the first argument (pipe name) from a pair */
453#define MODEM_CELLULAR_GET_PIPE_NAME_ARG(arg1, ...) arg1
454
455/* Extract the second argument (DLCI address) from a pair */
456#define MODEM_CELLULAR_GET_DLCI_ADDRESS_ARG(arg1, arg2, ...) arg2
457
458/* Define user pipe data using instance and extracted pipe name */
459#define MODEM_CELLULAR_DEFINE_USER_PIPE_DATA_HELPER(_args, inst) \
460 MODEM_CELLULAR_DEFINE_USER_PIPE_DATA(inst, \
461 MODEM_CELLULAR_GET_PIPE_NAME_ARG _args, \
462 CONFIG_MODEM_CELLULAR_USER_PIPE_BUFFER_SIZES)
463
464/* Initialize user pipe using instance, extracted pipe name, and DLCI address */
465#define MODEM_CELLULAR_INIT_USER_PIPE_HELPER(_args, inst) \
466 MODEM_CELLULAR_INIT_USER_PIPE(inst, \
467 MODEM_CELLULAR_GET_PIPE_NAME_ARG _args, \
468 MODEM_CELLULAR_GET_DLCI_ADDRESS_ARG _args)
469
471
482#define MODEM_CELLULAR_DEFINE_AND_INIT_USER_PIPES(inst, ...) \
483 FOR_EACH_FIXED_ARG(MODEM_CELLULAR_DEFINE_USER_PIPE_DATA_HELPER, \
484 (;), inst, __VA_ARGS__); \
485 MODEM_CELLULAR_DEFINE_USER_PIPES( \
486 inst, \
487 FOR_EACH_FIXED_ARG(MODEM_CELLULAR_INIT_USER_PIPE_HELPER, \
488 (,), inst, __VA_ARGS__) \
489 );
490
501#define MODEM_CELLULAR_OK_CHAT_MATCH_DEFINE(_sym, _match, _separators, _callback) \
502 MODEM_CHAT_MATCHES_DEFINE(_sym, \
503 MODEM_CHAT_MATCH_INITIALIZER(_match, _separators, _callback, false, true), \
504 MODEM_CHAT_MATCH("OK", "", NULL))
505
513#define MODEM_CELLULAR_COMMON_CHAT_MATCHES() \
514 MODEM_CHAT_MATCH_DEFINE(ok_match, "OK", "", NULL); \
515 MODEM_CHAT_MATCHES_DEFINE(__maybe_unused allow_match, \
516 MODEM_CHAT_MATCH("OK", "", NULL), \
517 MODEM_CHAT_MATCH("ERROR", "", NULL)); \
518 MODEM_CELLULAR_OK_CHAT_MATCH_DEFINE(__maybe_unused imei_match, \
519 "", "", modem_cellular_chat_on_imei); \
520 MODEM_CELLULAR_OK_CHAT_MATCH_DEFINE(__maybe_unused cgsn_sn_match, \
521 "", "", modem_cellular_chat_on_cgsn_sn); \
522 MODEM_CELLULAR_OK_CHAT_MATCH_DEFINE(__maybe_unused cgsn_imei_match, \
523 "+CGSN: ", "", modem_cellular_chat_on_cgsn_imei); \
524 MODEM_CELLULAR_OK_CHAT_MATCH_DEFINE(__maybe_unused cgmm_match, \
525 "", "", modem_cellular_chat_on_cgmm); \
526 MODEM_CELLULAR_OK_CHAT_MATCH_DEFINE(__maybe_unused csq_match, \
527 "+CSQ: ", ",", modem_cellular_chat_on_csq); \
528 MODEM_CELLULAR_OK_CHAT_MATCH_DEFINE(__maybe_unused cesq_match, \
529 "+CESQ: ", ",", modem_cellular_chat_on_cesq); \
530 MODEM_CELLULAR_OK_CHAT_MATCH_DEFINE(__maybe_unused qccid_match, \
531 "+QCCID: ", "", modem_cellular_chat_on_iccid); \
532 MODEM_CELLULAR_OK_CHAT_MATCH_DEFINE(__maybe_unused iccid_match, \
533 "+ICCID: ", "", modem_cellular_chat_on_iccid); \
534 MODEM_CELLULAR_OK_CHAT_MATCH_DEFINE(__maybe_unused ccid_match, \
535 "+CCID: ", "", modem_cellular_chat_on_iccid); \
536 MODEM_CELLULAR_OK_CHAT_MATCH_DEFINE(__maybe_unused cimi_match, \
537 "", "", modem_cellular_chat_on_imsi); \
538 MODEM_CELLULAR_OK_CHAT_MATCH_DEFINE(__maybe_unused cgmi_match, \
539 "", "", modem_cellular_chat_on_cgmi); \
540 MODEM_CELLULAR_OK_CHAT_MATCH_DEFINE(__maybe_unused cgmr_match, \
541 "", "", modem_cellular_chat_on_cgmr); \
542 MODEM_CHAT_MATCH_DEFINE(connect_match __maybe_unused, \
543 "CONNECT", "", NULL); \
544 MODEM_CHAT_MATCHES_DEFINE(__maybe_unused abort_matches, \
545 MODEM_CHAT_MATCH("ERROR", "", NULL)); \
546 MODEM_CHAT_MATCHES_DEFINE(__maybe_unused dial_abort_matches, \
547 MODEM_CHAT_MATCH("ERROR", "", NULL), \
548 MODEM_CHAT_MATCH("BUSY", "", NULL), \
549 MODEM_CHAT_MATCH("NO ANSWER", "", NULL), \
550 MODEM_CHAT_MATCH("NO CARRIER", "", NULL), \
551 MODEM_CHAT_MATCH("NO DIALTONE", "", NULL))
552
559#define MODEM_CELLULAR_COMMON_UNSOL_MATCHES \
560 MODEM_CHAT_MATCH("+CREG: ", ",", modem_cellular_chat_on_cxreg), \
561 MODEM_CHAT_MATCH("+CEREG: ", ",", modem_cellular_chat_on_cxreg), \
562 MODEM_CHAT_MATCH("+CGREG: ", ",", modem_cellular_chat_on_cxreg), \
563 MODEM_CHAT_MATCH("+CGEV: ", ",", modem_cellular_chat_on_cgev), \
564 MODEM_CHAT_MATCH("APP RDY", "", modem_cellular_chat_on_modem_ready), \
565 MODEM_CHAT_MATCH("Ready", "", modem_cellular_chat_on_modem_ready)
566
580#define MODEM_CELLULAR_DEFINE_INSTANCE(inst, vendor_config, _vendor_specific) \
581 BUILD_ASSERT(vendor_config != NULL, "vendor_config must be non-NULL"); \
582 static const struct modem_cellular_config MODEM_CELLULAR_INST_NAME(config, inst) = { \
583 .uart = DEVICE_DT_GET(DT_INST_BUS(inst)), \
584 .vendor = vendor_config, \
585 .vendor_specific = _vendor_specific, \
586 .ppp = &MODEM_CELLULAR_INST_NAME(ppp, inst), \
587 .power_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_power_gpios, {}), \
588 .reset_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_reset_gpios, {}), \
589 .wake_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_wake_gpios, {}), \
590 .ring_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_ring_gpios, {}), \
591 .dtr_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_dtr_gpios, {}), \
592 .status_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_status_gpios, {}), \
593 .autostarts = DT_INST_PROP(inst, autostarts), \
594 .hold_reset_on_suspend = \
595 DT_INST_ENUM_HAS_VALUE(inst, zephyr_mdm_reset_behavior, hold_on_suspend), \
596 .reset_on_resume = DT_INST_ENUM_HAS_VALUE(inst, zephyr_mdm_reset_behavior, \
597 toggle_on_resume), \
598 .reset_on_recovery = DT_INST_ENUM_HAS_VALUE(inst, zephyr_mdm_reset_behavior, \
599 toggle_on_recovery), \
600 .cmux_enable_runtime_power_save = \
601 DT_INST_PROP_OR(inst, cmux_enable_runtime_power_save, 0), \
602 .cmux_close_pipe_on_power_save = \
603 DT_INST_PROP_OR(inst, cmux_close_pipe_on_power_save, 0), \
604 .cmux_no_powersave_handshake = \
605 DT_INST_PROP_OR(inst, cmux_no_powersave_handshake, 0), \
606 .use_default_pdp_context = DT_INST_PROP_OR(inst, zephyr_use_default_pdp_ctx, 0), \
607 .use_default_apn = DT_INST_PROP_OR(inst, zephyr_use_default_apn, 0), \
608 .cmux_idle_timeout = K_MSEC(DT_INST_PROP_OR(inst, cmux_idle_timeout_ms, 0)), \
609 .user_pipes = MODEM_CELLULAR_GET_USER_PIPES(inst), \
610 .user_pipes_size = ARRAY_SIZE(MODEM_CELLULAR_GET_USER_PIPES(inst)), \
611 }; \
612 \
613 PM_DEVICE_DT_INST_DEFINE(inst, modem_cellular_pm_action); \
614 \
615 DEVICE_DT_INST_DEFINE(inst, modem_cellular_init, PM_DEVICE_DT_INST_GET(inst), \
616 &MODEM_CELLULAR_INST_NAME(data, inst), \
617 &MODEM_CELLULAR_INST_NAME(config, inst), POST_KERNEL, \
618 CONFIG_MODEM_CELLULAR_INIT_PRIORITY, &modem_cellular_api);
619
626 const struct device *dev;
628};
629
642#if defined(CONFIG_MODEM_CELLULAR)
643#define MODEM_CELLULAR_BOARD_INIT_DEFINE(node_id, _script) \
644 static const STRUCT_SECTION_ITERABLE( \
645 modem_cellular_board_init, \
646 CONCAT(modem_cellular_board_init_, DT_DEP_ORD(node_id))) = { \
647 .dev = DEVICE_DT_GET(node_id), \
648 .script = (_script), \
649 }
650#else
651#define MODEM_CELLULAR_BOARD_INIT_DEFINE(node_id, _script)
652#endif
653
655
657
662
680
697
699
700#ifdef __cplusplus
701}
702#endif
703
704#endif /* ZEPHYR_INCLUDE_DRIVERS_CELLULAR_INTERNAL_H_ */
Main header file for cellular modem driver API.
Main header file for GPIO driver API.
Main header file for UART driver API.
long atomic_t
Atomic integer variable.
Definition atomic_types.h:34
cellular_access_technology
Cellular access technologies (3GPP TS 27.007 AcT).
Definition cellular.h:39
cellular_event
Events emitted asynchronously by a cellular driver.
Definition cellular.h:145
int cellular_modem_pause_periodic_script(const struct device *dev)
Pause the cellular_modem driver's periodic chat script.
int cellular_modem_resume_periodic_script(const struct device *dev)
Resume the cellular_modem driver's periodic chat script.
cellular_registration_status
Cellular registration status (3GPP TS 27.007).
Definition cellular.h:117
uint32_t cellular_event_mask_t
Definition cellular.h:159
void(* cellular_event_cb_t)(const struct device *dev, enum cellular_event event, const void *payload, void *user_data)
Prototype for cellular event callbacks.
Definition cellular.h:234
void modem_cellular_chat_callback_handler(struct modem_chat *chat, enum modem_chat_script_result result, const struct modem_chat_script_completion_info *info, void *user_data)
Handle completion of a modem chat script.
modem_chat_script_result
Definition chat.h:250
pm_device_action
Device PM actions.
Definition device.h:154
state
Definition parser_state.h:29
Header file for the Device Power Management API.
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
@driver_ops{Cellular}
Definition cellular.h:284
Payload for CELLULAR_EVENT_NETWORK_STATUS_CHANGED.
Definition cellular.h:182
Cellular link operational statistics.
Definition cellular.h:205
Runtime device structure (in ROM) per driver instance.
Definition device.h:543
GPIO callback structure.
Definition gpio.h:771
Container for GPIO pin information specified in devicetree.
Definition gpio.h:296
Message Queue Structure.
Definition kernel.h:5257
Kernel mutex structure.
Definition kernel.h:3500
Semaphore structure.
Definition kernel.h:3738
Kernel timeout type.
Definition clock.h:65
A structure used to submit work after a delay.
Definition kernel.h:4691
A structure used to submit work.
Definition kernel.h:4649
Definition uart.h:69
Descriptor binding a board-supplied init script to a modem instance.
Definition modem_cellular.h:625
const struct modem_chat_script * script
Definition modem_cellular.h:627
const struct device * dev
Definition modem_cellular.h:626
Chat scripts for cellular modem.
Definition modem_cellular.h:254
const struct modem_chat_script * periodic
Optional script that periodically polls modem state while registered.
Definition modem_cellular.h:264
const struct modem_chat_script * dial
Script that starts the PPP data connection.
Definition modem_cellular.h:262
const struct modem_chat_script * network
Optional script that waits for network registration before dialing.
Definition modem_cellular.h:260
const struct modem_chat_script * set_baudrate
Optional script that configures the modem's UART baud rate.
Definition modem_cellular.h:256
const struct modem_chat_script * shutdown
Optional script that prepares the modem for power-off.
Definition modem_cellular.h:266
const struct modem_chat_script * init
Script that initializes the modem and enables CMUX.
Definition modem_cellular.h:258
const struct modem_chat_script * dlci_setup
Optional script for configuring DLCI channels after opening.
Definition modem_cellular.h:268
Runtime data for a cellular modem driver instance.
Definition modem_cellular.h:129
Vendor-specific cellular modem configuration.
Definition modem_cellular.h:277
uint16_t shutdown_time_ms
Maximum modem shutdown delay, in milliseconds.
Definition modem_cellular.h:312
uint16_t reset_pulse_duration_ms
Duration of the modem reset pulse, in milliseconds.
Definition modem_cellular.h:303
bool force_autostart
Force autostart regardless of the devicetree autostarts property.
Definition modem_cellular.h:314
const char * chat_delimiter
Command delimiter used by the modem, as a NULL-terminated string.
Definition modem_cellular.h:292
struct modem_cellular_vendor_config::@125173161324242306355007001312260252170162237167 unsol_matches
Unsolicited modem response matches.
struct modem_cellular_config_scripts scripts
Chat scripts implementing the modem lifecycle.
Definition modem_cellular.h:279
const struct modem_chat_match * matches
Array of unsolicited response matches, or NULL when size is zero.
Definition modem_cellular.h:283
uint16_t size
Number of elements in matches.
Definition modem_cellular.h:285
uint16_t power_pulse_duration_ms
Duration of the modem power-key pulse, in milliseconds.
Definition modem_cellular.h:301
const char * chat_filter
Characters filtered from modem responses, as a NULL-terminated string.
Definition modem_cellular.h:299
uint16_t cmux_disconnect_timeout_ms
Timeout for the modem to revert from CMUX to AT mode after a CMUX disconnect, in milliseconds.
Definition modem_cellular.h:308
uint16_t startup_time_ms
Maximum modem startup delay, in milliseconds.
Definition modem_cellular.h:310
Modem chat match.
Definition chat.h:58
Modem chat script chat.
Definition chat.h:125
Extra information about the script that completed.
Definition chat.h:259
Modem chat script.
Definition chat.h:287
Chat instance internal context.
Definition chat.h:333
Network Management event callback structure Used to register a callback into the network management e...
Definition net_mgmt.h:164
Header file for the Atomic operations API.
Iterable sections helpers.