@@ -107,6 +107,7 @@ struct modem_cellular_data {
107
107
struct modem_backend_uart uart_backend ;
108
108
uint8_t uart_backend_receive_buf [CONFIG_MODEM_CELLULAR_UART_BUFFER_SIZES ];
109
109
uint8_t uart_backend_transmit_buf [CONFIG_MODEM_CELLULAR_UART_BUFFER_SIZES ];
110
+ uint32_t original_baudrate ;
110
111
111
112
/* CMUX */
112
113
struct modem_cmux cmux ;
@@ -829,6 +830,30 @@ static int modem_cellular_on_idle_state_leave(struct modem_cellular_data *data)
829
830
return 0 ;
830
831
}
831
832
833
+ static uint32_t modem_cellular_baudrate_update (struct modem_cellular_data * data ,
834
+ uint32_t desired_baudrate )
835
+ {
836
+ const struct modem_cellular_config * config =
837
+ (const struct modem_cellular_config * )data -> dev -> config ;
838
+ struct uart_config cfg = {0 };
839
+ uint32_t original_baudrate ;
840
+ int ret ;
841
+
842
+ ret = uart_config_get (config -> uart , & cfg );
843
+ if (ret < 0 ) {
844
+ LOG_ERR ("Failed to get UART configuration (%d)" , ret );
845
+ return 0 ;
846
+ }
847
+ original_baudrate = cfg .baudrate ;
848
+ cfg .baudrate = desired_baudrate ;
849
+ ret = uart_configure (config -> uart , & cfg );
850
+ if (ret < 0 ) {
851
+ LOG_ERR ("Failed to set new baudrate (%d)" , ret );
852
+ return 0 ;
853
+ }
854
+ return original_baudrate ;
855
+ }
856
+
832
857
static int modem_cellular_on_reset_pulse_state_enter (struct modem_cellular_data * data )
833
858
{
834
859
const struct modem_cellular_config * config =
@@ -838,6 +863,11 @@ static int modem_cellular_on_reset_pulse_state_enter(struct modem_cellular_data
838
863
gpio_pin_set_dt (& config -> wake_gpio , 0 );
839
864
}
840
865
866
+ /* Revert to original baudrate if we have changed it */
867
+ if (data -> original_baudrate ) {
868
+ modem_cellular_baudrate_update (data , data -> original_baudrate );
869
+ }
870
+
841
871
gpio_pin_set_dt (& config -> reset_gpio , 1 );
842
872
modem_cellular_start_timer (data , K_MSEC (config -> reset_pulse_duration_ms ));
843
873
return 0 ;
@@ -961,8 +991,6 @@ static void modem_cellular_set_baudrate_event_handler(struct modem_cellular_data
961
991
{
962
992
const struct modem_cellular_config * config =
963
993
(const struct modem_cellular_config * )data -> dev -> config ;
964
- struct uart_config cfg = {0 };
965
- int ret ;
966
994
967
995
switch (evt ) {
968
996
case MODEM_CELLULAR_EVENT_BUS_OPENED :
@@ -986,17 +1014,9 @@ static void modem_cellular_set_baudrate_event_handler(struct modem_cellular_data
986
1014
modem_pipe_attach (data -> uart_pipe , modem_cellular_bus_pipe_handler , data );
987
1015
modem_pipe_close_async (data -> uart_pipe );
988
1016
989
- ret = uart_config_get (config -> uart , & cfg );
990
- if (ret < 0 ) {
991
- LOG_ERR ("Failed to get UART configuration (%d)" , ret );
992
- break ;
993
- }
994
- cfg .baudrate = CONFIG_MODEM_CELLULAR_NEW_BAUDRATE ;
995
- ret = uart_configure (config -> uart , & cfg );
996
- if (ret < 0 ) {
997
- LOG_ERR ("Failed to set new baudrate (%d)" , ret );
998
- break ;
999
- }
1017
+ /* Update UART port baudrate and preserve the original value */
1018
+ data -> original_baudrate = modem_cellular_baudrate_update (
1019
+ data , CONFIG_MODEM_CELLULAR_NEW_BAUDRATE );
1000
1020
break ;
1001
1021
1002
1022
case MODEM_CELLULAR_EVENT_BUS_CLOSED :
0 commit comments