Skip to content

Commit 00ee185

Browse files
Merge pull request zephyrproject-rtos#10 from converge-io/lucas/variable-baudrate
Lucas/variable baudrate
2 parents 8fb601a + e873942 commit 00ee185

File tree

2 files changed

+85
-2
lines changed

2 files changed

+85
-2
lines changed

drivers/modem/Kconfig.cellular

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,43 @@ config MODEM_CELLULAR_USER_PIPE_BUFFER_SIZES
5454
int "The size of the buffers used for each user pipe in bytes."
5555
default 128
5656

57+
choice
58+
prompt "Choose a uart baudrate"
59+
60+
config MODEM_CELLULAR_UART_BAUDRATE_9600
61+
bool "9600"
62+
config MODEM_CELLULAR_UART_BAUDRATE_19200
63+
bool "19200"
64+
config MODEM_CELLULAR_UART_BAUDRATE_38400
65+
bool "38400"
66+
config MODEM_CELLULAR_UART_BAUDRATE_57600
67+
bool "57600"
68+
config MODEM_CELLULAR_UART_BAUDRATE_115200
69+
bool "115200"
70+
config MODEM_CELLULAR_UART_BAUDRATE_230400
71+
bool "230400"
72+
config MODEM_CELLULAR_UART_BAUDRATE_460800
73+
bool "460800"
74+
endchoice
75+
76+
config MODEM_CELLULAR_UART_BAUDRATE
77+
int
78+
default 9600 if MODEM_CELLULAR_UART_BAUDRATE_9600
79+
default 19200 if MODEM_CELLULAR_UART_BAUDRATE_19200
80+
default 38400 if MODEM_CELLULAR_UART_BAUDRATE_38400
81+
default 57600 if MODEM_CELLULAR_UART_BAUDRATE_57600
82+
default 115200 if MODEM_CELLULAR_UART_BAUDRATE_115200
83+
default 230400 if MODEM_CELLULAR_UART_BAUDRATE_230400
84+
default 460800 if MODEM_CELLULAR_UART_BAUDRATE_460800
85+
86+
config MODEM_CELLULAR_CMUX_BAUDRATE
87+
int
88+
default 1 if MODEM_CELLULAR_UART_BAUDRATE_9600
89+
default 2 if MODEM_CELLULAR_UART_BAUDRATE_19200
90+
default 3 if MODEM_CELLULAR_UART_BAUDRATE_38400
91+
default 4 if MODEM_CELLULAR_UART_BAUDRATE_57600
92+
default 5 if MODEM_CELLULAR_UART_BAUDRATE_115200
93+
default 6 if MODEM_CELLULAR_UART_BAUDRATE_230400
94+
default 7 if MODEM_CELLULAR_UART_BAUDRATE_460800
95+
5796
endif

drivers/modem/modem_cellular.c

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include <zephyr/net/ppp.h>
1818
#include <zephyr/pm/device.h>
1919
#include <zephyr/sys/atomic.h>
20+
#include <zephyr/drivers/uart.h>
2021

2122
#include <zephyr/logging/log.h>
2223
LOG_MODULE_REGISTER(modem_cellular, CONFIG_MODEM_LOG_LEVEL);
@@ -34,6 +35,7 @@ LOG_MODULE_REGISTER(modem_cellular, CONFIG_MODEM_LOG_LEVEL);
3435
#define MODEM_CELLULAR_DATA_MANUFACTURER_LEN (65)
3536
#define MODEM_CELLULAR_DATA_FW_VERSION_LEN (65)
3637

38+
#define MODEM_CELLULAR_DEFAULT_BAUDRATE (115200)
3739
#define MODEM_CELLULAR_RESERVED_DLCIS (2)
3840

3941
/* Magic constants */
@@ -239,6 +241,18 @@ static bool modem_cellular_gpio_is_enabled(const struct gpio_dt_spec *gpio)
239241
return gpio->port != NULL;
240242
}
241243

244+
static int modem_cellular_set_baudrate(const struct device * uart, uint32_t baudrate) {
245+
struct uart_config config;
246+
int rc = uart_config_get(uart, &config);
247+
if (rc != 0) {
248+
return rc;
249+
}
250+
251+
config.baudrate = baudrate;
252+
253+
return uart_configure(uart, &config);
254+
}
255+
242256
static void modem_cellular_notify_user_pipes_connected(struct modem_cellular_data *data)
243257
{
244258
const struct modem_cellular_config *config =
@@ -477,7 +491,22 @@ static void modem_cellular_chat_on_cxreg(struct modem_chat *chat, char **argv, u
477491
}
478492
}
479493

494+
495+
static void modem_cellular_chat_on_ipr(struct modem_chat *chat, char **argv, uint16_t argc, void *user_data){
496+
int rc;
497+
struct modem_cellular_data *data = (struct modem_cellular_data *)user_data;
498+
499+
const struct device * uart = data->uart_backend.uart;
500+
501+
rc = modem_cellular_set_baudrate(uart, CONFIG_MODEM_CELLULAR_UART_BAUDRATE);
502+
503+
if (rc != 0) {
504+
LOG_DBG("Configure UART to %d", CONFIG_MODEM_CELLULAR_UART_BAUDRATE);
505+
}
506+
}
507+
480508
MODEM_CHAT_MATCH_DEFINE(ok_match, "OK", "", NULL);
509+
MODEM_CHAT_MATCH_DEFINE(ipr_match, "OK", "", modem_cellular_chat_on_ipr);
481510
MODEM_CHAT_MATCHES_DEFINE(allow_match,
482511
MODEM_CHAT_MATCH("OK", "", NULL),
483512
MODEM_CHAT_MATCH("ERROR", "", NULL));
@@ -651,6 +680,10 @@ static int modem_cellular_on_reset_pulse_state_enter(struct modem_cellular_data
651680
(const struct modem_cellular_config *)data->dev->config;
652681

653682
gpio_pin_set_dt(&config->reset_gpio, 1);
683+
684+
const struct device * uart = data->uart_backend.uart;
685+
modem_cellular_set_baudrate(uart, MODEM_CELLULAR_DEFAULT_BAUDRATE);
686+
654687
modem_cellular_start_timer(data, K_MSEC(config->reset_pulse_duration_ms));
655688
return 0;
656689
}
@@ -1772,7 +1805,16 @@ MODEM_CHAT_SCRIPT_DEFINE(quectel_bg95_get_signal_chat_script,
17721805

17731806
#if DT_HAS_COMPAT_STATUS_OKAY(quectel_eg25_g)
17741807
MODEM_CHAT_SCRIPT_CMDS_DEFINE(
1775-
quectel_eg25_g_init_chat_script_cmds, MODEM_CHAT_SCRIPT_CMD_RESP("ATE0", ok_match),
1808+
quectel_eg25_g_init_chat_script_cmds,
1809+
MODEM_CHAT_SCRIPT_CMD_RESP("AT+IPR=" STRINGIFY(CONFIG_MODEM_CELLULAR_UART_BAUDRATE), ipr_match),
1810+
MODEM_CHAT_SCRIPT_CMD_RESP_NONE("ATE0", 100),
1811+
MODEM_CHAT_SCRIPT_CMD_RESP_NONE("ATE0", 100),
1812+
MODEM_CHAT_SCRIPT_CMD_RESP_NONE("ATE0", 100),
1813+
MODEM_CHAT_SCRIPT_CMD_RESP_NONE("ATE0", 100),
1814+
MODEM_CHAT_SCRIPT_CMD_RESP_NONE("ATE0", 100),
1815+
MODEM_CHAT_SCRIPT_CMD_RESP_NONE("ATE0", 100),
1816+
MODEM_CHAT_SCRIPT_CMD_RESP_NONE("ATE0", 100),
1817+
MODEM_CHAT_SCRIPT_CMD_RESP("ATE0", ok_match),
17761818
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CFUN=4", ok_match),
17771819
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CMEE=1", ok_match),
17781820
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CREG=1", ok_match),
@@ -1791,7 +1833,9 @@ MODEM_CHAT_SCRIPT_CMDS_DEFINE(
17911833
MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
17921834
MODEM_CHAT_SCRIPT_CMD_RESP("AT+CIMI", cimi_match),
17931835
MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
1794-
MODEM_CHAT_SCRIPT_CMD_RESP_NONE("AT+CMUX=0,0,5,127,10,3,30,10,2", 100));
1836+
MODEM_CHAT_SCRIPT_CMD_RESP("AT+QCCID", qccid_match),
1837+
MODEM_CHAT_SCRIPT_CMD_RESP("", ok_match),
1838+
MODEM_CHAT_SCRIPT_CMD_RESP_NONE("AT+CMUX=0,0," STRINGIFY(CONFIG_MODEM_CMUX_BAUDRATE) ",127,10,3,30,10,2", 100));
17951839

17961840
MODEM_CHAT_SCRIPT_DEFINE(quectel_eg25_g_init_chat_script, quectel_eg25_g_init_chat_script_cmds,
17971841
abort_matches, modem_cellular_chat_callback_handler, 10);

0 commit comments

Comments
 (0)