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>
This commit is contained in:
Van Petrosyan 2025-07-12 15:13:21 +02:00 committed by Anas Nashif
parent 7bc1756396
commit 8eb2a9c507

View File

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