Skip to content

Commit 7efbc7c

Browse files
zafersnkartben
authored andcommitted
drivers: modem: modem_cellular: fix HL7800 communication timeout
HL7800 may enter sleep, blocking init without proper config. Signed-off-by: Zafer SEN <zafersn93@gmail.com>
1 parent 2ae4110 commit 7efbc7c

File tree

1 file changed

+33
-4
lines changed

1 file changed

+33
-4
lines changed

drivers/modem/modem_cellular.c

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ struct modem_cellular_config {
154154
const struct device *uart;
155155
struct gpio_dt_spec power_gpio;
156156
struct gpio_dt_spec reset_gpio;
157+
struct gpio_dt_spec wake_gpio;
157158
uint16_t power_pulse_duration_ms;
158159
uint16_t reset_pulse_duration_ms;
159160
uint16_t startup_time_ms;
@@ -599,6 +600,10 @@ static int modem_cellular_on_idle_state_enter(struct modem_cellular_data *data)
599600
const struct modem_cellular_config *config =
600601
(const struct modem_cellular_config *)data->dev->config;
601602

603+
if (modem_cellular_gpio_is_enabled(&config->wake_gpio)) {
604+
gpio_pin_set_dt(&config->wake_gpio, 0);
605+
}
606+
602607
if (modem_cellular_gpio_is_enabled(&config->reset_gpio)) {
603608
gpio_pin_set_dt(&config->reset_gpio, 1);
604609
}
@@ -662,6 +667,10 @@ static int modem_cellular_on_idle_state_leave(struct modem_cellular_data *data)
662667
gpio_pin_set_dt(&config->reset_gpio, 0);
663668
}
664669

670+
if (modem_cellular_gpio_is_enabled(&config->wake_gpio)) {
671+
gpio_pin_set_dt(&config->wake_gpio, 1);
672+
}
673+
665674
return 0;
666675
}
667676

@@ -670,6 +679,10 @@ static int modem_cellular_on_reset_pulse_state_enter(struct modem_cellular_data
670679
const struct modem_cellular_config *config =
671680
(const struct modem_cellular_config *)data->dev->config;
672681

682+
if (modem_cellular_gpio_is_enabled(&config->wake_gpio)) {
683+
gpio_pin_set_dt(&config->wake_gpio, 0);
684+
}
685+
673686
gpio_pin_set_dt(&config->reset_gpio, 1);
674687
modem_cellular_start_timer(data, K_MSEC(config->reset_pulse_duration_ms));
675688
return 0;
@@ -698,6 +711,11 @@ static int modem_cellular_on_reset_pulse_state_leave(struct modem_cellular_data
698711
(const struct modem_cellular_config *)data->dev->config;
699712

700713
gpio_pin_set_dt(&config->reset_gpio, 0);
714+
715+
if (modem_cellular_gpio_is_enabled(&config->wake_gpio)) {
716+
gpio_pin_set_dt(&config->wake_gpio, 1);
717+
}
718+
701719
modem_cellular_stop_timer(data);
702720
return 0;
703721
}
@@ -1715,6 +1733,10 @@ static int modem_cellular_init(const struct device *dev)
17151733

17161734
k_sem_init(&data->suspended_sem, 0, 1);
17171735

1736+
if (modem_cellular_gpio_is_enabled(&config->wake_gpio)) {
1737+
gpio_pin_configure_dt(&config->wake_gpio, GPIO_OUTPUT_INACTIVE);
1738+
}
1739+
17181740
if (modem_cellular_gpio_is_enabled(&config->power_gpio)) {
17191741
gpio_pin_configure_dt(&config->power_gpio, GPIO_OUTPUT_INACTIVE);
17201742
}
@@ -2127,10 +2149,16 @@ MODEM_CHAT_SCRIPT_DEFINE(u_blox_lara_r6_periodic_chat_script,
21272149

21282150
#if DT_HAS_COMPAT_STATUS_OKAY(swir_hl7800)
21292151
MODEM_CHAT_SCRIPT_CMDS_DEFINE(swir_hl7800_init_chat_script_cmds,
2130-
MODEM_CHAT_SCRIPT_CMD_RESP_NONE("AT", 100),
2131-
MODEM_CHAT_SCRIPT_CMD_RESP_NONE("AT", 100),
2132-
MODEM_CHAT_SCRIPT_CMD_RESP_NONE("AT", 100),
2133-
MODEM_CHAT_SCRIPT_CMD_RESP_NONE("AT", 100),
2152+
MODEM_CHAT_SCRIPT_CMD_RESP_NONE("AT", 1000),
2153+
MODEM_CHAT_SCRIPT_CMD_RESP_NONE("AT", 1000),
2154+
MODEM_CHAT_SCRIPT_CMD_RESP_NONE("AT", 1000),
2155+
MODEM_CHAT_SCRIPT_CMD_RESP_NONE("AT", 1000),
2156+
/* Turn off sleep mode */
2157+
MODEM_CHAT_SCRIPT_CMD_RESP("AT+KSLEEP=2", ok_match),
2158+
/* Turn off PSM */
2159+
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CPSMS=0", ok_match),
2160+
/* Turn off eDRX */
2161+
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CEDRXS=0", ok_match),
21342162
MODEM_CHAT_SCRIPT_CMD_RESP("ATE0", ok_match),
21352163
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CFUN=1", ok_match),
21362164
MODEM_CHAT_SCRIPT_CMD_RESP_MULT("AT+CGACT=0", allow_match),
@@ -2388,6 +2416,7 @@ MODEM_CHAT_SCRIPT_DEFINE(sqn_gm02s_periodic_chat_script,
23882416
.uart = DEVICE_DT_GET(DT_INST_BUS(inst)), \
23892417
.power_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_power_gpios, {}), \
23902418
.reset_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_reset_gpios, {}), \
2419+
.wake_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_wake_gpios, {}), \
23912420
.power_pulse_duration_ms = (power_ms), \
23922421
.reset_pulse_duration_ms = (reset_ms), \
23932422
.startup_time_ms = (startup_ms), \

0 commit comments

Comments
 (0)