Skip to content

Commit 0ba20dd

Browse files
JordanYatesjhedberg
authored andcommitted
modem: modem_cellular: revert baudrate on reset
Revert the UART port baudrate to its original value after performing a pin reset on the modem. Signed-off-by: Jordan Yates <[email protected]>
1 parent e662d77 commit 0ba20dd

File tree

1 file changed

+33
-13
lines changed

1 file changed

+33
-13
lines changed

drivers/modem/modem_cellular.c

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ struct modem_cellular_data {
107107
struct modem_backend_uart uart_backend;
108108
uint8_t uart_backend_receive_buf[CONFIG_MODEM_CELLULAR_UART_BUFFER_SIZES];
109109
uint8_t uart_backend_transmit_buf[CONFIG_MODEM_CELLULAR_UART_BUFFER_SIZES];
110+
uint32_t original_baudrate;
110111

111112
/* CMUX */
112113
struct modem_cmux cmux;
@@ -829,6 +830,30 @@ static int modem_cellular_on_idle_state_leave(struct modem_cellular_data *data)
829830
return 0;
830831
}
831832

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+
832857
static int modem_cellular_on_reset_pulse_state_enter(struct modem_cellular_data *data)
833858
{
834859
const struct modem_cellular_config *config =
@@ -838,6 +863,11 @@ static int modem_cellular_on_reset_pulse_state_enter(struct modem_cellular_data
838863
gpio_pin_set_dt(&config->wake_gpio, 0);
839864
}
840865

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+
841871
gpio_pin_set_dt(&config->reset_gpio, 1);
842872
modem_cellular_start_timer(data, K_MSEC(config->reset_pulse_duration_ms));
843873
return 0;
@@ -961,8 +991,6 @@ static void modem_cellular_set_baudrate_event_handler(struct modem_cellular_data
961991
{
962992
const struct modem_cellular_config *config =
963993
(const struct modem_cellular_config *)data->dev->config;
964-
struct uart_config cfg = {0};
965-
int ret;
966994

967995
switch (evt) {
968996
case MODEM_CELLULAR_EVENT_BUS_OPENED:
@@ -986,17 +1014,9 @@ static void modem_cellular_set_baudrate_event_handler(struct modem_cellular_data
9861014
modem_pipe_attach(data->uart_pipe, modem_cellular_bus_pipe_handler, data);
9871015
modem_pipe_close_async(data->uart_pipe);
9881016

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);
10001020
break;
10011021

10021022
case MODEM_CELLULAR_EVENT_BUS_CLOSED:

0 commit comments

Comments
 (0)