Skip to content

Commit 39ceed4

Browse files
committed
drivers: modem_cellular: added APP RDY signal handling
Some modems (e.g. Quectel BG95/EG25-G, several SIMCom parts) print “APP RDY” when the application core is ready. Parse this line and proceed from AWAIT_POWER_ON immediately, while keeping the existing startup timeout as a fall-back. * add MODEM_CELLULAR_EVENT_MODEM_READY + chat match * open UART and attach chat in AWAIT_POWER_ON * jump to SET_BAUDRATE / RUN_INIT_SCRIPT on event Signed-off-by: Van Petrosyan <van.petrosyan@sensirion.com>
1 parent 322da1d commit 39ceed4

File tree

1 file changed

+20
-2
lines changed

1 file changed

+20
-2
lines changed

drivers/modem/modem_cellular.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ enum modem_cellular_event {
8181
MODEM_CELLULAR_EVENT_BUS_OPENED,
8282
MODEM_CELLULAR_EVENT_BUS_CLOSED,
8383
MODEM_CELLULAR_EVENT_PPP_DEAD,
84+
MODEM_CELLULAR_EVENT_MODEM_READY,
8485
};
8586

8687
struct modem_cellular_data {
@@ -243,6 +244,8 @@ static const char *modem_cellular_event_str(enum modem_cellular_event event)
243244
return "bus closed";
244245
case MODEM_CELLULAR_EVENT_PPP_DEAD:
245246
return "ppp dead";
247+
case MODEM_CELLULAR_EVENT_MODEM_READY:
248+
return "modem ready";
246249
}
247250

248251
return "";
@@ -355,6 +358,15 @@ static void modem_cellular_chat_callback_handler(struct modem_chat *chat,
355358
}
356359
}
357360

361+
static void modem_cellular_chat_on_modem_ready(struct modem_chat *chat, char **argv, uint16_t argc,
362+
void *user_data)
363+
{
364+
struct modem_cellular_data *data = user_data;
365+
366+
modem_cellular_delegate_event(data, MODEM_CELLULAR_EVENT_MODEM_READY);
367+
}
368+
369+
358370
static void modem_cellular_chat_on_imei(struct modem_chat *chat, char **argv, uint16_t argc,
359371
void *user_data)
360372
{
@@ -514,7 +526,8 @@ MODEM_CHAT_MATCH_DEFINE(cgmr_match __maybe_unused, "", "", modem_cellular_chat_o
514526
MODEM_CHAT_MATCHES_DEFINE(unsol_matches,
515527
MODEM_CHAT_MATCH("+CREG: ", ",", modem_cellular_chat_on_cxreg),
516528
MODEM_CHAT_MATCH("+CEREG: ", ",", modem_cellular_chat_on_cxreg),
517-
MODEM_CHAT_MATCH("+CGREG: ", ",", modem_cellular_chat_on_cxreg));
529+
MODEM_CHAT_MATCH("+CGREG: ", ",", modem_cellular_chat_on_cxreg),
530+
MODEM_CHAT_MATCH("APP RDY", "", modem_cellular_chat_on_modem_ready));
518531

519532
MODEM_CHAT_MATCHES_DEFINE(abort_matches, MODEM_CHAT_MATCH("ERROR", "", NULL));
520533

@@ -772,7 +785,9 @@ static int modem_cellular_on_await_power_on_state_enter(struct modem_cellular_da
772785
(const struct modem_cellular_config *)data->dev->config;
773786

774787
modem_cellular_start_timer(data, K_MSEC(config->startup_time_ms));
775-
return 0;
788+
modem_pipe_attach(data->uart_pipe, modem_cellular_bus_pipe_handler, data);
789+
modem_chat_attach(&data->chat, data->uart_pipe);
790+
return modem_pipe_open_async(data->uart_pipe);
776791
}
777792

778793
static void modem_cellular_await_power_on_event_handler(struct modem_cellular_data *data,
@@ -782,6 +797,9 @@ static void modem_cellular_await_power_on_event_handler(struct modem_cellular_da
782797
(const struct modem_cellular_config *)data->dev->config;
783798

784799
switch (evt) {
800+
case MODEM_CELLULAR_EVENT_MODEM_READY:
801+
/* disable the timer and fall through, as we are ready to proceed */
802+
modem_cellular_stop_timer(data);
785803
case MODEM_CELLULAR_EVENT_TIMEOUT:
786804
if (config->set_baudrate_chat_script != NULL) {
787805
modem_cellular_enter_state(data, MODEM_CELLULAR_STATE_SET_BAUDRATE);

0 commit comments

Comments
 (0)