From 39ceed483b5c8f639203075f5dad7ceab138e171 Mon Sep 17 00:00:00 2001 From: Van Petrosyan Date: Sat, 12 Jul 2025 15:13:21 +0200 Subject: [PATCH] drivers: modem_cellular: added APP RDY signal handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- drivers/modem/modem_cellular.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/drivers/modem/modem_cellular.c b/drivers/modem/modem_cellular.c index c3f73a1dbbb64..e7333039496da 100644 --- a/drivers/modem/modem_cellular.c +++ b/drivers/modem/modem_cellular.c @@ -81,6 +81,7 @@ enum modem_cellular_event { MODEM_CELLULAR_EVENT_BUS_OPENED, MODEM_CELLULAR_EVENT_BUS_CLOSED, MODEM_CELLULAR_EVENT_PPP_DEAD, + MODEM_CELLULAR_EVENT_MODEM_READY, }; struct modem_cellular_data { @@ -243,6 +244,8 @@ static const char *modem_cellular_event_str(enum modem_cellular_event event) return "bus closed"; case MODEM_CELLULAR_EVENT_PPP_DEAD: return "ppp dead"; + case MODEM_CELLULAR_EVENT_MODEM_READY: + return "modem ready"; } return ""; @@ -355,6 +358,15 @@ static void modem_cellular_chat_callback_handler(struct modem_chat *chat, } } +static void modem_cellular_chat_on_modem_ready(struct modem_chat *chat, char **argv, uint16_t argc, + void *user_data) +{ + struct modem_cellular_data *data = user_data; + + modem_cellular_delegate_event(data, MODEM_CELLULAR_EVENT_MODEM_READY); +} + + static void modem_cellular_chat_on_imei(struct modem_chat *chat, char **argv, uint16_t argc, void *user_data) { @@ -514,7 +526,8 @@ MODEM_CHAT_MATCH_DEFINE(cgmr_match __maybe_unused, "", "", modem_cellular_chat_o MODEM_CHAT_MATCHES_DEFINE(unsol_matches, MODEM_CHAT_MATCH("+CREG: ", ",", modem_cellular_chat_on_cxreg), MODEM_CHAT_MATCH("+CEREG: ", ",", modem_cellular_chat_on_cxreg), - MODEM_CHAT_MATCH("+CGREG: ", ",", modem_cellular_chat_on_cxreg)); + MODEM_CHAT_MATCH("+CGREG: ", ",", modem_cellular_chat_on_cxreg), + MODEM_CHAT_MATCH("APP RDY", "", modem_cellular_chat_on_modem_ready)); MODEM_CHAT_MATCHES_DEFINE(abort_matches, MODEM_CHAT_MATCH("ERROR", "", NULL)); @@ -772,7 +785,9 @@ static int modem_cellular_on_await_power_on_state_enter(struct modem_cellular_da (const struct modem_cellular_config *)data->dev->config; modem_cellular_start_timer(data, K_MSEC(config->startup_time_ms)); - return 0; + modem_pipe_attach(data->uart_pipe, modem_cellular_bus_pipe_handler, data); + modem_chat_attach(&data->chat, data->uart_pipe); + return modem_pipe_open_async(data->uart_pipe); } 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 (const struct modem_cellular_config *)data->dev->config; switch (evt) { + case MODEM_CELLULAR_EVENT_MODEM_READY: + /* disable the timer and fall through, as we are ready to proceed */ + modem_cellular_stop_timer(data); case MODEM_CELLULAR_EVENT_TIMEOUT: if (config->set_baudrate_chat_script != NULL) { modem_cellular_enter_state(data, MODEM_CELLULAR_STATE_SET_BAUDRATE);