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:
parent
7bc1756396
commit
8eb2a9c507
@ -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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user