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];
165 uint8_t script_failure_counter;
176 uint8_t imei[MODEM_CELLULAR_DATA_IMEI_LEN];
177 uint8_t model_id[MODEM_CELLULAR_DATA_MODEL_ID_LEN];
178 uint8_t imsi[MODEM_CELLULAR_DATA_IMSI_LEN];
179 uint8_t iccid[MODEM_CELLULAR_DATA_ICCID_LEN];
180 uint8_t manufacturer[MODEM_CELLULAR_DATA_MANUFACTURER_LEN];
181 uint8_t fw_version[MODEM_CELLULAR_DATA_FW_VERSION_LEN];
182 uint8_t apn[MODEM_CELLULAR_DATA_APN_LEN];
186 char apn_buf[MODEM_CELLULAR_MAX_APN_CMDS][MODEM_CELLULAR_APN_BUF_SIZE];
199 enum modem_cellular_state
state;
204 struct k_sem suspended_sem;
207 struct k_work event_dispatch_work;
212 struct modem_cellular_event_cb cb;
220 bool periodic_timeout_skipped;
222#if defined(CONFIG_MODEM_CELLULAR_STATS)
233struct modem_cellular_user_pipe {
234 struct modem_cmux_dlci dlci;
238 struct modem_pipe *pipe;
239 struct modem_pipelink *pipelink;
307struct modem_cellular_config {
308 const struct device *uart;
316 bool hold_reset_on_suspend;
317 bool reset_on_resume;
318 bool reset_on_recovery;
319 bool cmux_enable_runtime_power_save;
320 bool cmux_close_pipe_on_power_save;
321 bool cmux_no_powersave_handshake;
322 bool use_default_pdp_context;
323 bool use_default_apn;
325 struct modem_cellular_user_pipe *user_pipes;
332int modem_cellular_init(
const struct device *dev);
339 const void *payload);
361void modem_cellular_chat_on_modem_ready(
struct modem_chat *chat,
char **argv,
uint16_t argc,
397#define MODEM_CELLULAR_INST_NAME(name, inst) \
398 CONCAT(name, _, DT_DRV_COMPAT, inst)
402#define MODEM_CELLULAR_DEFINE_USER_PIPE_DATA(inst, name, size) \
403 MODEM_PIPELINK_DT_INST_DEFINE(inst, name); \
404 static uint8_t MODEM_CELLULAR_INST_NAME(name, inst)[size] \
406#define MODEM_CELLULAR_INIT_USER_PIPE(_inst, _name, _dlci_address) \
408 .dlci_address = _dlci_address, \
409 .dlci_receive_buf = MODEM_CELLULAR_INST_NAME(_name, _inst), \
410 .dlci_receive_buf_size = sizeof(MODEM_CELLULAR_INST_NAME(_name, _inst)), \
411 .pipelink = MODEM_PIPELINK_DT_INST_GET(_inst, _name), \
414#define MODEM_CELLULAR_DEFINE_USER_PIPES(inst, ...) \
415 static struct modem_cellular_user_pipe MODEM_CELLULAR_INST_NAME(user_pipes, inst)[] = { \
419#define MODEM_CELLULAR_GET_USER_PIPES(inst) \
420 MODEM_CELLULAR_INST_NAME(user_pipes, inst)
423#define MODEM_CELLULAR_GET_PIPE_NAME_ARG(arg1, ...) arg1
426#define MODEM_CELLULAR_GET_DLCI_ADDRESS_ARG(arg1, arg2, ...) arg2
429#define MODEM_CELLULAR_DEFINE_USER_PIPE_DATA_HELPER(_args, inst) \
430 MODEM_CELLULAR_DEFINE_USER_PIPE_DATA(inst, \
431 MODEM_CELLULAR_GET_PIPE_NAME_ARG _args, \
432 CONFIG_MODEM_CELLULAR_USER_PIPE_BUFFER_SIZES)
435#define MODEM_CELLULAR_INIT_USER_PIPE_HELPER(_args, inst) \
436 MODEM_CELLULAR_INIT_USER_PIPE(inst, \
437 MODEM_CELLULAR_GET_PIPE_NAME_ARG _args, \
438 MODEM_CELLULAR_GET_DLCI_ADDRESS_ARG _args)
452#define MODEM_CELLULAR_DEFINE_AND_INIT_USER_PIPES(inst, ...) \
453 FOR_EACH_FIXED_ARG(MODEM_CELLULAR_DEFINE_USER_PIPE_DATA_HELPER, \
454 (;), inst, __VA_ARGS__); \
455 MODEM_CELLULAR_DEFINE_USER_PIPES( \
457 FOR_EACH_FIXED_ARG(MODEM_CELLULAR_INIT_USER_PIPE_HELPER, \
458 (,), inst, __VA_ARGS__) \
468#define MODEM_CELLULAR_COMMON_CHAT_MATCHES() \
469 MODEM_CHAT_MATCH_DEFINE(ok_match, "OK", "", NULL); \
470 MODEM_CHAT_MATCHES_DEFINE(__maybe_unused allow_match, \
471 MODEM_CHAT_MATCH("OK", "", NULL), \
472 MODEM_CHAT_MATCH("ERROR", "", NULL)); \
473 MODEM_CHAT_MATCH_DEFINE(imei_match __maybe_unused, \
474 "", "", modem_cellular_chat_on_imei); \
475 MODEM_CHAT_MATCH_DEFINE(cgmm_match __maybe_unused, \
476 "", "", modem_cellular_chat_on_cgmm); \
477 MODEM_CHAT_MATCH_DEFINE(csq_match __maybe_unused, \
478 "+CSQ: ", ",", modem_cellular_chat_on_csq); \
479 MODEM_CHAT_MATCH_DEFINE(cesq_match __maybe_unused, \
480 "+CESQ: ", ",", modem_cellular_chat_on_cesq); \
481 MODEM_CHAT_MATCH_DEFINE(qccid_match __maybe_unused, \
482 "+QCCID: ", "", modem_cellular_chat_on_iccid); \
483 MODEM_CHAT_MATCH_DEFINE(iccid_match __maybe_unused, \
484 "+ICCID: ", "", modem_cellular_chat_on_iccid); \
485 MODEM_CHAT_MATCH_DEFINE(ccid_match __maybe_unused, \
486 "+CCID: ", "", modem_cellular_chat_on_iccid); \
487 MODEM_CHAT_MATCH_DEFINE(cimi_match __maybe_unused, \
488 "", "", modem_cellular_chat_on_imsi); \
489 MODEM_CHAT_MATCH_DEFINE(cgmi_match __maybe_unused, \
490 "", "", modem_cellular_chat_on_cgmi); \
491 MODEM_CHAT_MATCH_DEFINE(cgmr_match __maybe_unused, \
492 "", "", modem_cellular_chat_on_cgmr); \
493 MODEM_CHAT_MATCH_DEFINE(connect_match __maybe_unused, \
494 "CONNECT", "", NULL); \
495 MODEM_CHAT_MATCHES_DEFINE(__maybe_unused abort_matches, \
496 MODEM_CHAT_MATCH("ERROR", "", NULL)); \
497 MODEM_CHAT_MATCHES_DEFINE(__maybe_unused dial_abort_matches, \
498 MODEM_CHAT_MATCH("ERROR", "", NULL), \
499 MODEM_CHAT_MATCH("BUSY", "", NULL), \
500 MODEM_CHAT_MATCH("NO ANSWER", "", NULL), \
501 MODEM_CHAT_MATCH("NO CARRIER", "", NULL), \
502 MODEM_CHAT_MATCH("NO DIALTONE", "", NULL))
510#define MODEM_CELLULAR_COMMON_UNSOL_MATCHES \
511 MODEM_CHAT_MATCH("+CREG: ", ",", modem_cellular_chat_on_cxreg), \
512 MODEM_CHAT_MATCH("+CEREG: ", ",", modem_cellular_chat_on_cxreg), \
513 MODEM_CHAT_MATCH("+CGREG: ", ",", modem_cellular_chat_on_cxreg), \
514 MODEM_CHAT_MATCH("+CGEV: ", ",", modem_cellular_chat_on_cgev), \
515 MODEM_CHAT_MATCH("APP RDY", "", modem_cellular_chat_on_modem_ready), \
516 MODEM_CHAT_MATCH("Ready", "", modem_cellular_chat_on_modem_ready)
529#define MODEM_CELLULAR_DEFINE_INSTANCE(inst, vendor_config) \
530 BUILD_ASSERT(vendor_config != NULL, "vendor_config must be non-NULL"); \
531 static const struct modem_cellular_config MODEM_CELLULAR_INST_NAME(config, inst) = { \
532 .uart = DEVICE_DT_GET(DT_INST_BUS(inst)), \
533 .vendor = vendor_config, \
534 .power_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_power_gpios, {}), \
535 .reset_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_reset_gpios, {}), \
536 .wake_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_wake_gpios, {}), \
537 .ring_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_ring_gpios, {}), \
538 .dtr_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_dtr_gpios, {}), \
539 .autostarts = DT_INST_PROP(inst, autostarts), \
540 .hold_reset_on_suspend = \
541 DT_INST_ENUM_HAS_VALUE(inst, zephyr_mdm_reset_behavior, hold_on_suspend), \
542 .reset_on_resume = DT_INST_ENUM_HAS_VALUE(inst, zephyr_mdm_reset_behavior, \
544 .reset_on_recovery = DT_INST_ENUM_HAS_VALUE(inst, zephyr_mdm_reset_behavior, \
545 toggle_on_recovery), \
546 .cmux_enable_runtime_power_save = \
547 DT_INST_PROP_OR(inst, cmux_enable_runtime_power_save, 0), \
548 .cmux_close_pipe_on_power_save = \
549 DT_INST_PROP_OR(inst, cmux_close_pipe_on_power_save, 0), \
550 .cmux_no_powersave_handshake = \
551 DT_INST_PROP_OR(inst, cmux_no_powersave_handshake, 0), \
552 .use_default_pdp_context = DT_INST_PROP_OR(inst, zephyr_use_default_pdp_ctx, 0), \
553 .use_default_apn = DT_INST_PROP_OR(inst, zephyr_use_default_apn, 0), \
554 .cmux_idle_timeout = K_MSEC(DT_INST_PROP_OR(inst, cmux_idle_timeout_ms, 0)), \
555 .user_pipes = MODEM_CELLULAR_GET_USER_PIPES(inst), \
556 .user_pipes_size = ARRAY_SIZE(MODEM_CELLULAR_GET_USER_PIPES(inst)), \
559 PM_DEVICE_DT_INST_DEFINE(inst, modem_cellular_pm_action); \
561 DEVICE_DT_INST_DEFINE(inst, modem_cellular_init, PM_DEVICE_DT_INST_GET(inst), \
562 &MODEM_CELLULAR_INST_NAME(data, inst), \
563 &MODEM_CELLULAR_INST_NAME(config, inst), POST_KERNEL, \
564 CONFIG_MODEM_CELLULAR_INIT_PRIORITY, &modem_cellular_api);
588#if defined(CONFIG_MODEM_CELLULAR)
589#define MODEM_CELLULAR_BOARD_INIT_DEFINE(node_id, _script) \
590 static const STRUCT_SECTION_ITERABLE( \
591 modem_cellular_board_init, \
592 CONCAT(modem_cellular_board_init_, DT_DEP_ORD(node_id))) = { \
593 .dev = DEVICE_DT_GET(node_id), \
594 .script = (_script), \
597#define MODEM_CELLULAR_BOARD_INIT_DEFINE(node_id, _script)
Header file for the Atomic operations API.
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
<span class="mlabel">Driver Operations</span> Cellular driver operations
Definition cellular.h:274
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:3476
Kernel pipe structure.
Definition kernel.h:5719
Semaphore structure.
Definition kernel.h:3702
Kernel timeout type.
Definition clock.h:65
A structure used to submit work after a delay.
Definition kernel.h:4642
A structure used to submit work.
Definition kernel.h:4600
Descriptor binding a board-supplied init script to a modem instance.
Definition modem_cellular.h:571
const struct modem_chat_script * script
Definition modem_cellular.h:573
const struct device * dev
Definition modem_cellular.h:572
Chat scripts for cellular modem.
Definition modem_cellular.h:257
const struct modem_chat_script * periodic
Optional script that periodically polls modem state while registered.
Definition modem_cellular.h:267
const struct modem_chat_script * dial
Script that starts the PPP data connection.
Definition modem_cellular.h:265
const struct modem_chat_script * network
Optional script that waits for network registration before dialing.
Definition modem_cellular.h:263
const struct modem_chat_script * set_baudrate
Optional script that configures the modem's UART baud rate.
Definition modem_cellular.h:259
const struct modem_chat_script * shutdown
Optional script that prepares the modem for power-off.
Definition modem_cellular.h:269
const struct modem_chat_script * init
Script that initializes the modem and enables CMUX.
Definition modem_cellular.h:261
Runtime data for a cellular modem driver instance.
Definition modem_cellular.h:120
uint8_t * chat_delimiter
Command delimiter used by the modem, as a NULL-terminated string.
Definition modem_cellular.h:154
struct modem_ppp * ppp
PPP context used for the modem data connection.
Definition modem_cellular.h:194
uint8_t * chat_filter
Characters filtered from modem responses, as a NULL-terminated string.
Definition modem_cellular.h:161
Vendor-specific cellular modem configuration.
Definition modem_cellular.h:278
uint16_t shutdown_time_ms
Maximum modem shutdown delay, in milliseconds.
Definition modem_cellular.h:300
uint16_t reset_pulse_duration_ms
Duration of the modem reset pulse, in milliseconds.
Definition modem_cellular.h:291
bool force_autostart
Force autostart regardless of the devicetree autostarts property.
Definition modem_cellular.h:302
struct modem_cellular_config_scripts scripts
Chat scripts implementing the modem lifecycle.
Definition modem_cellular.h:280
const struct modem_chat_match * matches
Array of unsolicited response matches, or NULL when size is zero.
Definition modem_cellular.h:284
uint16_t size
Number of elements in matches.
Definition modem_cellular.h:286
uint16_t power_pulse_duration_ms
Duration of the modem power-key pulse, in milliseconds.
Definition modem_cellular.h:289
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:296
uint16_t startup_time_ms
Maximum modem startup delay, in milliseconds.
Definition modem_cellular.h:298
struct modem_cellular_vendor_config::@176377142265263031027036153116374317160311334210 unsol_matches
Unsolicited modem response matches.
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
Iterable sections helpers.