13#ifndef ZEPHYR_INCLUDE_DRIVERS_CELLULAR_INTERNAL_H_
14#define ZEPHYR_INCLUDE_DRIVERS_CELLULAR_INTERNAL_H_
43#define MODEM_CELLULAR_DATA_IMEI_LEN (16)
44#define MODEM_CELLULAR_DATA_MODEL_ID_LEN (65)
45#define MODEM_CELLULAR_DATA_IMSI_LEN (23)
46#define MODEM_CELLULAR_DATA_ICCID_LEN (22)
47#define MODEM_CELLULAR_DATA_MANUFACTURER_LEN (65)
48#define MODEM_CELLULAR_DATA_FW_VERSION_LEN (65)
49#define MODEM_CELLULAR_DATA_APN_LEN (32)
50#define MODEM_CELLULAR_MAX_APN_CMDS (2)
51#define MODEM_CELLULAR_APN_BUF_SIZE (64)
57enum modem_cellular_state {
58 MODEM_CELLULAR_STATE_IDLE = 0,
59 MODEM_CELLULAR_STATE_RECOVERY,
60 MODEM_CELLULAR_STATE_RESET_PULSE,
61 MODEM_CELLULAR_STATE_AWAIT_RESET,
62 MODEM_CELLULAR_STATE_POWER_ON_PULSE,
63 MODEM_CELLULAR_STATE_AWAIT_POWER_ON,
64 MODEM_CELLULAR_STATE_SET_BAUDRATE,
65 MODEM_CELLULAR_STATE_RUN_INIT_SCRIPT,
66 MODEM_CELLULAR_STATE_CONNECT_CMUX,
67 MODEM_CELLULAR_STATE_OPEN_DLCI1,
68 MODEM_CELLULAR_STATE_OPEN_DLCI2,
69 MODEM_CELLULAR_STATE_RUN_BOARD_INIT_SCRIPT,
70 MODEM_CELLULAR_STATE_WAIT_FOR_APN,
71 MODEM_CELLULAR_STATE_RUN_APN_SCRIPT,
72 MODEM_CELLULAR_STATE_RUN_NETWORK_SCRIPT,
73 MODEM_CELLULAR_STATE_RUN_DIAL_SCRIPT,
74 MODEM_CELLULAR_STATE_AWAIT_REGISTERED,
75 MODEM_CELLULAR_STATE_REGISTERED,
76 MODEM_CELLULAR_STATE_AWAIT_PPP_DEAD,
77 MODEM_CELLULAR_STATE_INIT_POWER_OFF,
78 MODEM_CELLULAR_STATE_RUN_SHUTDOWN_SCRIPT,
79 MODEM_CELLULAR_STATE_POWER_OFF_PULSE,
80 MODEM_CELLULAR_STATE_AWAIT_POWER_OFF,
83enum modem_cellular_event {
84 MODEM_CELLULAR_EVENT_RESUME = 0,
85 MODEM_CELLULAR_EVENT_SUSPEND,
86 MODEM_CELLULAR_EVENT_SCRIPT_SUCCESS,
87 MODEM_CELLULAR_EVENT_SCRIPT_FAILED,
88 MODEM_CELLULAR_EVENT_CMUX_CONNECTED,
89 MODEM_CELLULAR_EVENT_CMUX_DISCONNECTED,
90 MODEM_CELLULAR_EVENT_DLCI1_OPENED,
91 MODEM_CELLULAR_EVENT_DLCI2_OPENED,
92 MODEM_CELLULAR_EVENT_TIMEOUT,
93 MODEM_CELLULAR_EVENT_REGISTERED,
94 MODEM_CELLULAR_EVENT_DEREGISTERED,
95 MODEM_CELLULAR_EVENT_BUS_OPENED,
96 MODEM_CELLULAR_EVENT_BUS_CLOSED,
97 MODEM_CELLULAR_EVENT_PPP_DEAD,
98 MODEM_CELLULAR_EVENT_MODEM_READY,
99 MODEM_CELLULAR_EVENT_APN_SET,
100 MODEM_CELLULAR_EVENT_RING,
101 MODEM_CELLULAR_EVENT_PERIODIC_KICK,
104struct modem_cellular_event_cb {
123 struct modem_pipe *uart_pipe;
125 uint8_t uart_backend_receive_buf[CONFIG_MODEM_CELLULAR_UART_BUFFER_SIZES];
126 uint8_t uart_backend_transmit_buf[CONFIG_MODEM_CELLULAR_UART_BUFFER_SIZES];
130 struct modem_cmux cmux;
131 uint8_t cmux_receive_buf[MODEM_CMUX_WORK_BUFFER_SIZE];
132 uint8_t cmux_transmit_buf[MODEM_CMUX_WORK_BUFFER_SIZE];
134 struct modem_cmux_dlci dlci1;
135 struct modem_cmux_dlci dlci2;
136 struct modem_pipe *dlci1_pipe;
137 struct modem_pipe *dlci2_pipe;
139 struct modem_pipe *cmd_pipe;
140 uint8_t dlci1_receive_buf[MODEM_CMUX_WORK_BUFFER_SIZE];
142 uint8_t dlci2_receive_buf[MODEM_CMUX_WORK_BUFFER_SIZE];
146 uint8_t chat_receive_buf[CONFIG_MODEM_CELLULAR_CHAT_BUFFER_SIZE];
148 uint8_t script_failure_counter;
160 bool network_status_valid;
161 uint8_t imei[MODEM_CELLULAR_DATA_IMEI_LEN];
162 uint8_t model_id[MODEM_CELLULAR_DATA_MODEL_ID_LEN];
163 uint8_t imsi[MODEM_CELLULAR_DATA_IMSI_LEN];
164 uint8_t iccid[MODEM_CELLULAR_DATA_ICCID_LEN];
165 uint8_t manufacturer[MODEM_CELLULAR_DATA_MANUFACTURER_LEN];
166 uint8_t fw_version[MODEM_CELLULAR_DATA_FW_VERSION_LEN];
167 uint8_t apn[MODEM_CELLULAR_DATA_APN_LEN];
171 char apn_buf[MODEM_CELLULAR_MAX_APN_CMDS][MODEM_CELLULAR_APN_BUF_SIZE];
177 enum modem_cellular_state
state;
182 struct k_sem suspended_sem;
185 struct k_work event_dispatch_work;
190 struct modem_cellular_event_cb cb;
198 bool periodic_timeout_skipped;
202 bool power_on_skipped;
204#if defined(CONFIG_MODEM_CELLULAR_STATS)
215struct modem_cellular_user_pipe {
216 struct modem_cmux_dlci dlci;
220 struct modem_pipe *pipe;
221 struct modem_pipelink *pipelink;
302struct modem_cellular_config {
303 const struct device *uart;
305 struct modem_ppp *ppp;
313 bool hold_reset_on_suspend;
314 bool reset_on_resume;
315 bool reset_on_recovery;
316 bool cmux_enable_runtime_power_save;
317 bool cmux_close_pipe_on_power_save;
318 bool cmux_no_powersave_handshake;
319 bool use_default_pdp_context;
320 bool use_default_apn;
322 struct modem_cellular_user_pipe *user_pipes;
329int modem_cellular_init(
const struct device *dev);
336 const void *payload);
366void modem_cellular_chat_on_modem_ready(
struct modem_chat *chat,
char **argv,
uint16_t argc,
402#define MODEM_CELLULAR_INST_NAME(name, inst) \
403 CONCAT(name, _, DT_DRV_COMPAT, inst)
407#define MODEM_CELLULAR_DEFINE_USER_PIPE_DATA(inst, name, size) \
408 MODEM_PIPELINK_DT_INST_DEFINE(inst, name); \
409 static uint8_t MODEM_CELLULAR_INST_NAME(name, inst)[size] \
411#define MODEM_CELLULAR_INIT_USER_PIPE(_inst, _name, _dlci_address) \
413 .dlci_address = _dlci_address, \
414 .dlci_receive_buf = MODEM_CELLULAR_INST_NAME(_name, _inst), \
415 .dlci_receive_buf_size = sizeof(MODEM_CELLULAR_INST_NAME(_name, _inst)), \
416 .pipelink = MODEM_PIPELINK_DT_INST_GET(_inst, _name), \
419#define MODEM_CELLULAR_DEFINE_USER_PIPES(inst, ...) \
420 static struct modem_cellular_user_pipe MODEM_CELLULAR_INST_NAME(user_pipes, inst)[] = { \
424#define MODEM_CELLULAR_GET_USER_PIPES(inst) \
425 MODEM_CELLULAR_INST_NAME(user_pipes, inst)
428#define MODEM_CELLULAR_GET_PIPE_NAME_ARG(arg1, ...) arg1
431#define MODEM_CELLULAR_GET_DLCI_ADDRESS_ARG(arg1, arg2, ...) arg2
434#define MODEM_CELLULAR_DEFINE_USER_PIPE_DATA_HELPER(_args, inst) \
435 MODEM_CELLULAR_DEFINE_USER_PIPE_DATA(inst, \
436 MODEM_CELLULAR_GET_PIPE_NAME_ARG _args, \
437 CONFIG_MODEM_CELLULAR_USER_PIPE_BUFFER_SIZES)
440#define MODEM_CELLULAR_INIT_USER_PIPE_HELPER(_args, inst) \
441 MODEM_CELLULAR_INIT_USER_PIPE(inst, \
442 MODEM_CELLULAR_GET_PIPE_NAME_ARG _args, \
443 MODEM_CELLULAR_GET_DLCI_ADDRESS_ARG _args)
457#define MODEM_CELLULAR_DEFINE_AND_INIT_USER_PIPES(inst, ...) \
458 FOR_EACH_FIXED_ARG(MODEM_CELLULAR_DEFINE_USER_PIPE_DATA_HELPER, \
459 (;), inst, __VA_ARGS__); \
460 MODEM_CELLULAR_DEFINE_USER_PIPES( \
462 FOR_EACH_FIXED_ARG(MODEM_CELLULAR_INIT_USER_PIPE_HELPER, \
463 (,), inst, __VA_ARGS__) \
473#define MODEM_CELLULAR_COMMON_CHAT_MATCHES() \
474 MODEM_CHAT_MATCH_DEFINE(ok_match, "OK", "", NULL); \
475 MODEM_CHAT_MATCHES_DEFINE(__maybe_unused allow_match, \
476 MODEM_CHAT_MATCH("OK", "", NULL), \
477 MODEM_CHAT_MATCH("ERROR", "", NULL)); \
478 MODEM_CHAT_MATCH_DEFINE(imei_match __maybe_unused, \
479 "", "", modem_cellular_chat_on_imei); \
480 MODEM_CHAT_MATCH_DEFINE(cgmm_match __maybe_unused, \
481 "", "", modem_cellular_chat_on_cgmm); \
482 MODEM_CHAT_MATCH_DEFINE(csq_match __maybe_unused, \
483 "+CSQ: ", ",", modem_cellular_chat_on_csq); \
484 MODEM_CHAT_MATCH_DEFINE(cesq_match __maybe_unused, \
485 "+CESQ: ", ",", modem_cellular_chat_on_cesq); \
486 MODEM_CHAT_MATCH_DEFINE(qccid_match __maybe_unused, \
487 "+QCCID: ", "", modem_cellular_chat_on_iccid); \
488 MODEM_CHAT_MATCH_DEFINE(iccid_match __maybe_unused, \
489 "+ICCID: ", "", modem_cellular_chat_on_iccid); \
490 MODEM_CHAT_MATCH_DEFINE(ccid_match __maybe_unused, \
491 "+CCID: ", "", modem_cellular_chat_on_iccid); \
492 MODEM_CHAT_MATCH_DEFINE(cimi_match __maybe_unused, \
493 "", "", modem_cellular_chat_on_imsi); \
494 MODEM_CHAT_MATCH_DEFINE(cgmi_match __maybe_unused, \
495 "", "", modem_cellular_chat_on_cgmi); \
496 MODEM_CHAT_MATCH_DEFINE(cgmr_match __maybe_unused, \
497 "", "", modem_cellular_chat_on_cgmr); \
498 MODEM_CHAT_MATCH_DEFINE(connect_match __maybe_unused, \
499 "CONNECT", "", NULL); \
500 MODEM_CHAT_MATCHES_DEFINE(__maybe_unused abort_matches, \
501 MODEM_CHAT_MATCH("ERROR", "", NULL)); \
502 MODEM_CHAT_MATCHES_DEFINE(__maybe_unused dial_abort_matches, \
503 MODEM_CHAT_MATCH("ERROR", "", NULL), \
504 MODEM_CHAT_MATCH("BUSY", "", NULL), \
505 MODEM_CHAT_MATCH("NO ANSWER", "", NULL), \
506 MODEM_CHAT_MATCH("NO CARRIER", "", NULL), \
507 MODEM_CHAT_MATCH("NO DIALTONE", "", NULL))
515#define MODEM_CELLULAR_COMMON_UNSOL_MATCHES \
516 MODEM_CHAT_MATCH("+CREG: ", ",", modem_cellular_chat_on_cxreg), \
517 MODEM_CHAT_MATCH("+CEREG: ", ",", modem_cellular_chat_on_cxreg), \
518 MODEM_CHAT_MATCH("+CGREG: ", ",", modem_cellular_chat_on_cxreg), \
519 MODEM_CHAT_MATCH("+CGEV: ", ",", modem_cellular_chat_on_cgev), \
520 MODEM_CHAT_MATCH("APP RDY", "", modem_cellular_chat_on_modem_ready), \
521 MODEM_CHAT_MATCH("Ready", "", modem_cellular_chat_on_modem_ready)
534#define MODEM_CELLULAR_DEFINE_INSTANCE(inst, vendor_config) \
535 BUILD_ASSERT(vendor_config != NULL, "vendor_config must be non-NULL"); \
536 static const struct modem_cellular_config MODEM_CELLULAR_INST_NAME(config, inst) = { \
537 .uart = DEVICE_DT_GET(DT_INST_BUS(inst)), \
538 .vendor = vendor_config, \
539 .ppp = &MODEM_CELLULAR_INST_NAME(ppp, inst), \
540 .power_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_power_gpios, {}), \
541 .reset_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_reset_gpios, {}), \
542 .wake_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_wake_gpios, {}), \
543 .ring_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_ring_gpios, {}), \
544 .dtr_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_dtr_gpios, {}), \
545 .status_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_status_gpios, {}), \
546 .autostarts = DT_INST_PROP(inst, autostarts), \
547 .hold_reset_on_suspend = \
548 DT_INST_ENUM_HAS_VALUE(inst, zephyr_mdm_reset_behavior, hold_on_suspend), \
549 .reset_on_resume = DT_INST_ENUM_HAS_VALUE(inst, zephyr_mdm_reset_behavior, \
551 .reset_on_recovery = DT_INST_ENUM_HAS_VALUE(inst, zephyr_mdm_reset_behavior, \
552 toggle_on_recovery), \
553 .cmux_enable_runtime_power_save = \
554 DT_INST_PROP_OR(inst, cmux_enable_runtime_power_save, 0), \
555 .cmux_close_pipe_on_power_save = \
556 DT_INST_PROP_OR(inst, cmux_close_pipe_on_power_save, 0), \
557 .cmux_no_powersave_handshake = \
558 DT_INST_PROP_OR(inst, cmux_no_powersave_handshake, 0), \
559 .use_default_pdp_context = DT_INST_PROP_OR(inst, zephyr_use_default_pdp_ctx, 0), \
560 .use_default_apn = DT_INST_PROP_OR(inst, zephyr_use_default_apn, 0), \
561 .cmux_idle_timeout = K_MSEC(DT_INST_PROP_OR(inst, cmux_idle_timeout_ms, 0)), \
562 .user_pipes = MODEM_CELLULAR_GET_USER_PIPES(inst), \
563 .user_pipes_size = ARRAY_SIZE(MODEM_CELLULAR_GET_USER_PIPES(inst)), \
566 PM_DEVICE_DT_INST_DEFINE(inst, modem_cellular_pm_action); \
568 DEVICE_DT_INST_DEFINE(inst, modem_cellular_init, PM_DEVICE_DT_INST_GET(inst), \
569 &MODEM_CELLULAR_INST_NAME(data, inst), \
570 &MODEM_CELLULAR_INST_NAME(config, inst), POST_KERNEL, \
571 CONFIG_MODEM_CELLULAR_INIT_PRIORITY, &modem_cellular_api);
595#if defined(CONFIG_MODEM_CELLULAR)
596#define MODEM_CELLULAR_BOARD_INIT_DEFINE(node_id, _script) \
597 static const STRUCT_SECTION_ITERABLE( \
598 modem_cellular_board_init, \
599 CONCAT(modem_cellular_board_init_, DT_DEP_ORD(node_id))) = { \
600 .dev = DEVICE_DT_GET(node_id), \
601 .script = (_script), \
604#define MODEM_CELLULAR_BOARD_INIT_DEFINE(node_id, _script)
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:31
cellular_access_technology
Cellular access technologies (3GPP TS 27.007 AcT).
Definition cellular.h:37
cellular_event
Events emitted asynchronously by a cellular driver.
Definition cellular.h:141
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:113
uint32_t cellular_event_mask_t
Definition cellular.h:153
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:228
void modem_cellular_chat_callback_handler(struct modem_chat *chat, enum modem_chat_script_result result, void *user_data)
Handle completion of a modem chat script.
modem_chat_script_result
Definition chat.h:156
pm_device_action
Device PM actions.
Definition device.h:150
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:278
Payload for CELLULAR_EVENT_NETWORK_STATUS_CHANGED.
Definition cellular.h:176
Cellular link operational statistics.
Definition cellular.h:199
Runtime device structure (in ROM) per driver instance.
Definition device.h:513
GPIO callback structure.
Definition gpio.h:747
Container for GPIO pin information specified in devicetree.
Definition gpio.h:296
Kernel mutex structure.
Definition kernel.h:3572
Kernel pipe structure.
Definition kernel.h:5832
Semaphore structure.
Definition kernel.h:3798
Kernel timeout type.
Definition clock.h:65
A structure used to submit work after a delay.
Definition kernel.h:4750
A structure used to submit work.
Definition kernel.h:4708
Descriptor binding a board-supplied init script to a modem instance.
Definition modem_cellular.h:578
const struct modem_chat_script * script
Definition modem_cellular.h:580
const struct device * dev
Definition modem_cellular.h:579
Chat scripts for cellular modem.
Definition modem_cellular.h:239
const struct modem_chat_script * periodic
Optional script that periodically polls modem state while registered.
Definition modem_cellular.h:249
const struct modem_chat_script * dial
Script that starts the PPP data connection.
Definition modem_cellular.h:247
const struct modem_chat_script * network
Optional script that waits for network registration before dialing.
Definition modem_cellular.h:245
const struct modem_chat_script * set_baudrate
Optional script that configures the modem's UART baud rate.
Definition modem_cellular.h:241
const struct modem_chat_script * shutdown
Optional script that prepares the modem for power-off.
Definition modem_cellular.h:251
const struct modem_chat_script * init
Script that initializes the modem and enables CMUX.
Definition modem_cellular.h:243
Runtime data for a cellular modem driver instance.
Definition modem_cellular.h:120
Vendor-specific cellular modem configuration.
Definition modem_cellular.h:260
uint16_t shutdown_time_ms
Maximum modem shutdown delay, in milliseconds.
Definition modem_cellular.h:295
uint16_t reset_pulse_duration_ms
Duration of the modem reset pulse, in milliseconds.
Definition modem_cellular.h:286
bool force_autostart
Force autostart regardless of the devicetree autostarts property.
Definition modem_cellular.h:297
const char * chat_delimiter
Command delimiter used by the modem, as a NULL-terminated string.
Definition modem_cellular.h:275
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:262
const struct modem_chat_match * matches
Array of unsolicited response matches, or NULL when size is zero.
Definition modem_cellular.h:266
uint16_t size
Number of elements in matches.
Definition modem_cellular.h:268
uint16_t power_pulse_duration_ms
Duration of the modem power-key pulse, in milliseconds.
Definition modem_cellular.h:284
const char * chat_filter
Characters filtered from modem responses, as a NULL-terminated string.
Definition modem_cellular.h:282
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:291
uint16_t startup_time_ms
Maximum modem startup delay, in milliseconds.
Definition modem_cellular.h:293
Modem chat match.
Definition chat.h:47
Modem chat script chat.
Definition chat.h:110
Modem chat script.
Definition chat.h:175
Chat instance internal context.
Definition chat.h:223
Network Management event callback structure Used to register a callback into the network management e...
Definition net_mgmt.h:163
Header file for the Atomic operations API.
Iterable sections helpers.