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);