@@ -58,6 +58,7 @@ BUILD_ASSERT(sizeof(CONFIG_MODEM_CELLULAR_APN) - 1 < MODEM_CELLULAR_DATA_APN_LEN
58
58
enum modem_cellular_state {
59
59
MODEM_CELLULAR_STATE_IDLE = 0 ,
60
60
MODEM_CELLULAR_STATE_RESET_PULSE ,
61
+ MODEM_CELLULAR_STATE_AWAIT_RESET ,
61
62
MODEM_CELLULAR_STATE_POWER_ON_PULSE ,
62
63
MODEM_CELLULAR_STATE_AWAIT_POWER_ON ,
63
64
MODEM_CELLULAR_STATE_SET_BAUDRATE ,
@@ -206,6 +207,8 @@ static const char *modem_cellular_state_str(enum modem_cellular_state state)
206
207
return "idle" ;
207
208
case MODEM_CELLULAR_STATE_RESET_PULSE :
208
209
return "reset pulse" ;
210
+ case MODEM_CELLULAR_STATE_AWAIT_RESET :
211
+ return "await reset" ;
209
212
case MODEM_CELLULAR_STATE_POWER_ON_PULSE :
210
213
return "power pulse" ;
211
214
case MODEM_CELLULAR_STATE_AWAIT_POWER_ON :
@@ -288,6 +291,7 @@ static bool modem_cellular_apn_change_allowed(enum modem_cellular_state st)
288
291
switch (st ) {
289
292
case MODEM_CELLULAR_STATE_IDLE :
290
293
case MODEM_CELLULAR_STATE_RESET_PULSE :
294
+ case MODEM_CELLULAR_STATE_AWAIT_RESET :
291
295
case MODEM_CELLULAR_STATE_POWER_ON_PULSE :
292
296
case MODEM_CELLULAR_STATE_AWAIT_POWER_ON :
293
297
case MODEM_CELLULAR_STATE_SET_BAUDRATE :
@@ -876,9 +880,16 @@ static int modem_cellular_on_reset_pulse_state_enter(struct modem_cellular_data
876
880
static void modem_cellular_reset_pulse_event_handler (struct modem_cellular_data * data ,
877
881
enum modem_cellular_event evt )
878
882
{
883
+ const struct modem_cellular_config * config =
884
+ (const struct modem_cellular_config * )data -> dev -> config ;
885
+
879
886
switch (evt ) {
880
887
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
+ }
882
893
break ;
883
894
884
895
case MODEM_CELLULAR_EVENT_SUSPEND :
@@ -905,6 +916,41 @@ static int modem_cellular_on_reset_pulse_state_leave(struct modem_cellular_data
905
916
return 0 ;
906
917
}
907
918
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
+
908
954
static int modem_cellular_on_power_on_pulse_state_enter (struct modem_cellular_data * data )
909
955
{
910
956
const struct modem_cellular_config * config =
@@ -1551,6 +1597,10 @@ static int modem_cellular_on_state_enter(struct modem_cellular_data *data)
1551
1597
ret = modem_cellular_on_reset_pulse_state_enter (data );
1552
1598
break ;
1553
1599
1600
+ case MODEM_CELLULAR_STATE_AWAIT_RESET :
1601
+ ret = modem_cellular_on_await_reset_state_enter (data );
1602
+ break ;
1603
+
1554
1604
case MODEM_CELLULAR_STATE_POWER_ON_PULSE :
1555
1605
ret = modem_cellular_on_power_on_pulse_state_enter (data );
1556
1606
break ;
@@ -1636,6 +1686,10 @@ static int modem_cellular_on_state_leave(struct modem_cellular_data *data)
1636
1686
ret = modem_cellular_on_reset_pulse_state_leave (data );
1637
1687
break ;
1638
1688
1689
+ case MODEM_CELLULAR_STATE_AWAIT_RESET :
1690
+ ret = modem_cellular_on_await_reset_state_leave (data );
1691
+ break ;
1692
+
1639
1693
case MODEM_CELLULAR_STATE_POWER_ON_PULSE :
1640
1694
ret = modem_cellular_on_power_on_pulse_state_leave (data );
1641
1695
break ;
@@ -1723,6 +1777,10 @@ static void modem_cellular_event_handler(struct modem_cellular_data *data,
1723
1777
modem_cellular_reset_pulse_event_handler (data , evt );
1724
1778
break ;
1725
1779
1780
+ case MODEM_CELLULAR_STATE_AWAIT_RESET :
1781
+ modem_cellular_await_reset_event_handler (data , evt );
1782
+ break ;
1783
+
1726
1784
case MODEM_CELLULAR_STATE_POWER_ON_PULSE :
1727
1785
modem_cellular_power_on_pulse_event_handler (data , evt );
1728
1786
break ;
0 commit comments