Skip to content

Commit 59d4d9d

Browse files
committed
drivers: modem: Implement support for RING indicator
Use ring indicator to wake up the CMUX device from sleep. Only used for runtime power management, but same event could be used for initiating idle -> connected as well. Signed-off-by: Seppo Takalo <[email protected]>
1 parent 34c155f commit 59d4d9d

File tree

2 files changed

+60
-3
lines changed

2 files changed

+60
-3
lines changed

drivers/modem/modem_cellular.c

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ enum modem_cellular_event {
9696
MODEM_CELLULAR_EVENT_PPP_DEAD,
9797
MODEM_CELLULAR_EVENT_MODEM_READY,
9898
MODEM_CELLULAR_EVENT_APN_SET,
99+
MODEM_CELLULAR_EVENT_RING,
99100
};
100101

101102
struct modem_cellular_event_cb {
@@ -171,6 +172,9 @@ struct modem_cellular_data {
171172

172173
struct k_mutex api_lock;
173174
struct modem_cellular_event_cb cb;
175+
176+
/* Ring interrupt */
177+
struct gpio_callback ring_gpio_cb;
174178
};
175179

176180
struct modem_cellular_user_pipe {
@@ -187,6 +191,7 @@ struct modem_cellular_config {
187191
struct gpio_dt_spec power_gpio;
188192
struct gpio_dt_spec reset_gpio;
189193
struct gpio_dt_spec wake_gpio;
194+
struct gpio_dt_spec ring_gpio;
190195
uint16_t power_pulse_duration_ms;
191196
uint16_t reset_pulse_duration_ms;
192197
uint16_t startup_time_ms;
@@ -285,6 +290,8 @@ static const char *modem_cellular_event_str(enum modem_cellular_event event)
285290
return "modem ready";
286291
case MODEM_CELLULAR_EVENT_APN_SET:
287292
return "apn set";
293+
case MODEM_CELLULAR_EVENT_RING:
294+
return "RING";
288295
}
289296

290297
return "";
@@ -1315,7 +1322,10 @@ static void modem_cellular_run_dial_script_event_handler(struct modem_cellular_d
13151322
case MODEM_CELLULAR_EVENT_SUSPEND:
13161323
modem_cellular_enter_state(data, MODEM_CELLULAR_STATE_INIT_POWER_OFF);
13171324
break;
1318-
1325+
case MODEM_CELLULAR_EVENT_RING:
1326+
LOG_INF("RING received!");
1327+
modem_pipe_open_async(data->uart_pipe);
1328+
break;
13191329
default:
13201330
break;
13211331
}
@@ -1360,7 +1370,10 @@ static void modem_cellular_await_registered_event_handler(struct modem_cellular_
13601370
case MODEM_CELLULAR_EVENT_SUSPEND:
13611371
modem_cellular_enter_state(data, MODEM_CELLULAR_STATE_INIT_POWER_OFF);
13621372
break;
1363-
1373+
case MODEM_CELLULAR_EVENT_RING:
1374+
LOG_INF("RING received!");
1375+
modem_pipe_open_async(data->uart_pipe);
1376+
break;
13641377
default:
13651378
break;
13661379
}
@@ -1405,7 +1418,10 @@ static void modem_cellular_carrier_on_event_handler(struct modem_cellular_data *
14051418
modem_ppp_release(data->ppp);
14061419
modem_cellular_enter_state(data, MODEM_CELLULAR_STATE_INIT_POWER_OFF);
14071420
break;
1408-
1421+
case MODEM_CELLULAR_EVENT_RING:
1422+
LOG_INF("RING received!");
1423+
modem_pipe_open_async(data->uart_pipe);
1424+
break;
14091425
default:
14101426
break;
14111427
}
@@ -2158,6 +2174,15 @@ static void net_mgmt_event_handler(struct net_mgmt_event_callback *cb, uint64_t
21582174
}
21592175
}
21602176

2177+
static void modem_cellular_ring_gpio_callback(const struct device *dev, struct gpio_callback *cb,
2178+
uint32_t pins)
2179+
{
2180+
struct modem_cellular_data *data =
2181+
CONTAINER_OF(cb, struct modem_cellular_data, ring_gpio_cb);
2182+
2183+
modem_cellular_delegate_event(data, MODEM_CELLULAR_EVENT_RING);
2184+
}
2185+
21612186
static void modem_cellular_init_apn(struct modem_cellular_data *data)
21622187
{
21632188
#ifdef CONFIG_MODEM_CELLULAR_APN
@@ -2203,6 +2228,33 @@ static int modem_cellular_init(const struct device *dev)
22032228
gpio_pin_configure_dt(&config->reset_gpio, GPIO_OUTPUT_ACTIVE);
22042229
}
22052230

2231+
if (modem_cellular_gpio_is_enabled(&config->ring_gpio)) {
2232+
int ret;
2233+
2234+
ret = gpio_pin_configure_dt(&config->ring_gpio, GPIO_INPUT);
2235+
if (ret < 0) {
2236+
LOG_ERR("Failed to configure ring GPIO (%d)", ret);
2237+
return ret;
2238+
}
2239+
2240+
gpio_init_callback(&data->ring_gpio_cb, modem_cellular_ring_gpio_callback,
2241+
BIT(config->ring_gpio.pin));
2242+
2243+
ret = gpio_add_callback(config->ring_gpio.port, &data->ring_gpio_cb);
2244+
if (ret < 0) {
2245+
LOG_ERR("Failed to add ring GPIO callback (%d)", ret);
2246+
return ret;
2247+
}
2248+
2249+
ret = gpio_pin_interrupt_configure_dt(&config->ring_gpio, GPIO_INT_EDGE_TO_ACTIVE);
2250+
if (ret < 0) {
2251+
LOG_ERR("Failed to configure ring GPIO interrupt (%d)", ret);
2252+
return ret;
2253+
}
2254+
2255+
LOG_DBG("Ring GPIO interrupt configured");
2256+
}
2257+
22062258
{
22072259
const struct modem_backend_uart_config uart_backend_config = {
22082260
.uart = config->uart,
@@ -2973,6 +3025,7 @@ MODEM_CHAT_SCRIPT_DEFINE(sqn_gm02s_periodic_chat_script,
29733025
.power_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_power_gpios, {}), \
29743026
.reset_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_reset_gpios, {}), \
29753027
.wake_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_wake_gpios, {}), \
3028+
.ring_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_ring_gpios, {}), \
29763029
.power_pulse_duration_ms = (power_ms), \
29773030
.reset_pulse_duration_ms = (reset_ms), \
29783031
.startup_time_ms = (startup_ms), \

dts/bindings/modem/zephyr,cellular-modem-device.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ properties:
1818
type: phandle-array
1919
description: GPIO for modem wake
2020

21+
mdm-ring-gpios:
22+
type: phandle-array
23+
description: GPIO for modem ring indicator
24+
2125
cmux-enable-runtime-power-save:
2226
type: boolean
2327
description: Enable runtime power saving using CMUX PSC commands.

0 commit comments

Comments
 (0)