Skip to content

Commit 131bec5

Browse files
JordanYatesjhedberg
authored andcommitted
modem: modem_cellular: delay after reset de-assert
Add a delay after de-asserting the reset pin before pulsing the power on pin, if both are enabled. Signed-off-by: Jordan Yates <[email protected]>
1 parent 0ba20dd commit 131bec5

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

drivers/modem/Kconfig.cellular

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ config MODEM_CELLULAR_NEW_BAUDRATE_DELAY
7474
default 100 if DT_HAS_U_BLOX_LARA_R6_ENABLED
7575
default 300
7676

77+
config MODEM_CELLULAR_RESET_POWER_ON_DELAY_MS
78+
int "Delay between de-asserting the reset pin and pulsing the power pin"
79+
default 500
80+
7781
if DT_HAS_U_BLOX_LARA_R6_ENABLED
7882

7983
choice MODEM_CELLULAR_RAT

drivers/modem/modem_cellular.c

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ BUILD_ASSERT(sizeof(CONFIG_MODEM_CELLULAR_APN) - 1 < MODEM_CELLULAR_DATA_APN_LEN
5858
enum modem_cellular_state {
5959
MODEM_CELLULAR_STATE_IDLE = 0,
6060
MODEM_CELLULAR_STATE_RESET_PULSE,
61+
MODEM_CELLULAR_STATE_AWAIT_RESET,
6162
MODEM_CELLULAR_STATE_POWER_ON_PULSE,
6263
MODEM_CELLULAR_STATE_AWAIT_POWER_ON,
6364
MODEM_CELLULAR_STATE_SET_BAUDRATE,
@@ -206,6 +207,8 @@ static const char *modem_cellular_state_str(enum modem_cellular_state state)
206207
return "idle";
207208
case MODEM_CELLULAR_STATE_RESET_PULSE:
208209
return "reset pulse";
210+
case MODEM_CELLULAR_STATE_AWAIT_RESET:
211+
return "await reset";
209212
case MODEM_CELLULAR_STATE_POWER_ON_PULSE:
210213
return "power pulse";
211214
case MODEM_CELLULAR_STATE_AWAIT_POWER_ON:
@@ -288,6 +291,7 @@ static bool modem_cellular_apn_change_allowed(enum modem_cellular_state st)
288291
switch (st) {
289292
case MODEM_CELLULAR_STATE_IDLE:
290293
case MODEM_CELLULAR_STATE_RESET_PULSE:
294+
case MODEM_CELLULAR_STATE_AWAIT_RESET:
291295
case MODEM_CELLULAR_STATE_POWER_ON_PULSE:
292296
case MODEM_CELLULAR_STATE_AWAIT_POWER_ON:
293297
case MODEM_CELLULAR_STATE_SET_BAUDRATE:
@@ -876,9 +880,16 @@ static int modem_cellular_on_reset_pulse_state_enter(struct modem_cellular_data
876880
static void modem_cellular_reset_pulse_event_handler(struct modem_cellular_data *data,
877881
enum modem_cellular_event evt)
878882
{
883+
const struct modem_cellular_config *config =
884+
(const struct modem_cellular_config *)data->dev->config;
885+
879886
switch (evt) {
880887
case MODEM_CELLULAR_EVENT_TIMEOUT:
881-
modem_cellular_enter_state(data, MODEM_CELLULAR_STATE_AWAIT_POWER_ON);
888+
if (modem_cellular_gpio_is_enabled(&config->power_gpio)) {
889+
modem_cellular_enter_state(data, MODEM_CELLULAR_STATE_AWAIT_RESET);
890+
} else {
891+
modem_cellular_enter_state(data, MODEM_CELLULAR_STATE_AWAIT_POWER_ON);
892+
}
882893
break;
883894

884895
case MODEM_CELLULAR_EVENT_SUSPEND:
@@ -905,6 +916,41 @@ static int modem_cellular_on_reset_pulse_state_leave(struct modem_cellular_data
905916
return 0;
906917
}
907918

919+
static int modem_cellular_on_await_reset_state_enter(struct modem_cellular_data *data)
920+
{
921+
modem_cellular_start_timer(data, K_MSEC(CONFIG_MODEM_CELLULAR_RESET_POWER_ON_DELAY_MS));
922+
return 0;
923+
}
924+
925+
static void modem_cellular_await_reset_event_handler(struct modem_cellular_data *data,
926+
enum modem_cellular_event evt)
927+
{ const struct modem_cellular_config *config =
928+
(const struct modem_cellular_config *)data->dev->config;
929+
930+
switch (evt) {
931+
case MODEM_CELLULAR_EVENT_TIMEOUT:
932+
if (modem_cellular_gpio_is_enabled(&config->power_gpio)) {
933+
modem_cellular_enter_state(data, MODEM_CELLULAR_STATE_POWER_ON_PULSE);
934+
} else {
935+
modem_cellular_enter_state(data, MODEM_CELLULAR_STATE_AWAIT_POWER_ON);
936+
}
937+
break;
938+
939+
case MODEM_CELLULAR_EVENT_SUSPEND:
940+
modem_cellular_enter_state(data, MODEM_CELLULAR_STATE_IDLE);
941+
break;
942+
943+
default:
944+
break;
945+
}
946+
}
947+
948+
static int modem_cellular_on_await_reset_state_leave(struct modem_cellular_data *data)
949+
{
950+
modem_cellular_stop_timer(data);
951+
return 0;
952+
}
953+
908954
static int modem_cellular_on_power_on_pulse_state_enter(struct modem_cellular_data *data)
909955
{
910956
const struct modem_cellular_config *config =
@@ -1551,6 +1597,10 @@ static int modem_cellular_on_state_enter(struct modem_cellular_data *data)
15511597
ret = modem_cellular_on_reset_pulse_state_enter(data);
15521598
break;
15531599

1600+
case MODEM_CELLULAR_STATE_AWAIT_RESET:
1601+
ret = modem_cellular_on_await_reset_state_enter(data);
1602+
break;
1603+
15541604
case MODEM_CELLULAR_STATE_POWER_ON_PULSE:
15551605
ret = modem_cellular_on_power_on_pulse_state_enter(data);
15561606
break;
@@ -1636,6 +1686,10 @@ static int modem_cellular_on_state_leave(struct modem_cellular_data *data)
16361686
ret = modem_cellular_on_reset_pulse_state_leave(data);
16371687
break;
16381688

1689+
case MODEM_CELLULAR_STATE_AWAIT_RESET:
1690+
ret = modem_cellular_on_await_reset_state_leave(data);
1691+
break;
1692+
16391693
case MODEM_CELLULAR_STATE_POWER_ON_PULSE:
16401694
ret = modem_cellular_on_power_on_pulse_state_leave(data);
16411695
break;
@@ -1723,6 +1777,10 @@ static void modem_cellular_event_handler(struct modem_cellular_data *data,
17231777
modem_cellular_reset_pulse_event_handler(data, evt);
17241778
break;
17251779

1780+
case MODEM_CELLULAR_STATE_AWAIT_RESET:
1781+
modem_cellular_await_reset_event_handler(data, evt);
1782+
break;
1783+
17261784
case MODEM_CELLULAR_STATE_POWER_ON_PULSE:
17271785
modem_cellular_power_on_pulse_event_handler(data, evt);
17281786
break;

0 commit comments

Comments
 (0)