drivers: modem: quectel-bg9x: fix reset BG95 mdm
In case of BG95 where there is no reset pin, reseting the board
which uses a BG95 modem could result in powering-off the modem
(as oposed to "reset" the modem). This commit is an attempt
to handle this case and re-power the modem.
Signed-off-by: Andrei Hutanu <andrei.hutanu.i@gmail.com>
diff --git a/drivers/modem/quectel-bg9x.c b/drivers/modem/quectel-bg9x.c
index 55c1228..04bb08d 100644
--- a/drivers/modem/quectel-bg9x.c
+++ b/drivers/modem/quectel-bg9x.c
@@ -887,6 +887,13 @@
*/
static void pin_init(void)
{
+#if !DT_INST_NODE_HAS_PROP(0, mdm_reset_gpios)
+ int ret = k_sem_take(&mdata.sem_pin_busy, K_SECONDS(3));
+
+ if (ret < 0) {
+ LOG_DBG("Timeout pin_init()");
+ }
+#endif /* !DT_INST_NODE_HAS_PROP(0, mdm_reset_gpios) */
LOG_INF("Setting Modem Pins");
#if DT_INST_NODE_HAS_PROP(0, mdm_wdisable_gpios)
@@ -910,6 +917,18 @@
k_sleep(K_SECONDS(2));
LOG_INF("... Done!");
+
+#if !DT_INST_NODE_HAS_PROP(0, mdm_reset_gpios)
+ k_sem_give(&mdata.sem_pin_busy);
+#endif /* !DT_INST_NODE_HAS_PROP(0, mdm_reset_gpios) */
+}
+
+MODEM_CMD_DEFINE(on_cmd_unsol_normal_power_down)
+{
+ LOG_INF("Modem powering off. Re-power modem...");
+ pin_init();
+
+ return 0;
}
static const struct modem_cmd response_cmds[] = {
@@ -922,6 +941,7 @@
MODEM_CMD("+QIURC: \"recv\",", on_cmd_unsol_recv, 1U, ""),
MODEM_CMD("+QIURC: \"closed\",", on_cmd_unsol_close, 1U, ""),
MODEM_CMD(MDM_UNSOL_RDY, on_cmd_unsol_rdy, 0U, ""),
+ MODEM_CMD("NORMAL POWER DOWN", on_cmd_unsol_normal_power_down, 0U, ""),
};
/* Commands sent to the modem to set it up at boot time. */
@@ -1140,6 +1160,9 @@
{
int ret; ARG_UNUSED(dev);
+#if !DT_INST_NODE_HAS_PROP(0, mdm_reset_gpios)
+ k_sem_init(&mdata.sem_pin_busy, 1, 1);
+#endif /* !DT_INST_NODE_HAS_PROP(0, mdm_reset_gpios) */
k_sem_init(&mdata.sem_response, 0, 1);
k_sem_init(&mdata.sem_tx_ready, 0, 1);
k_sem_init(&mdata.sem_sock_conn, 0, 1);
diff --git a/drivers/modem/quectel-bg9x.h b/drivers/modem/quectel-bg9x.h
index 7fe51ef..bda84b2 100644
--- a/drivers/modem/quectel-bg9x.h
+++ b/drivers/modem/quectel-bg9x.h
@@ -114,6 +114,9 @@
struct k_sem sem_response;
struct k_sem sem_tx_ready;
struct k_sem sem_sock_conn;
+#if !DT_INST_NODE_HAS_PROP(0, mdm_reset_gpios)
+ struct k_sem sem_pin_busy;
+#endif
};
/* Socket read callback data */