Skip to content

Commit e596d9d

Browse files
SeppoTakalorlubos
authored andcommitted
[nrf fromlist] 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. Upstream PR #: 97362 Signed-off-by: Seppo Takalo <[email protected]>
1 parent efdf6dc commit e596d9d

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 {
@@ -170,6 +171,9 @@ struct modem_cellular_data {
170171

171172
struct k_mutex api_lock;
172173
struct modem_cellular_event_cb cb;
174+
175+
/* Ring interrupt */
176+
struct gpio_callback ring_gpio_cb;
173177
};
174178

175179
struct modem_cellular_user_pipe {
@@ -186,6 +190,7 @@ struct modem_cellular_config {
186190
struct gpio_dt_spec power_gpio;
187191
struct gpio_dt_spec reset_gpio;
188192
struct gpio_dt_spec wake_gpio;
193+
struct gpio_dt_spec ring_gpio;
189194
struct gpio_dt_spec dtr_gpio;
190195
uint16_t power_pulse_duration_ms;
191196
uint16_t reset_pulse_duration_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 "";
@@ -1242,7 +1249,10 @@ static void modem_cellular_run_dial_script_event_handler(struct modem_cellular_d
12421249
case MODEM_CELLULAR_EVENT_SUSPEND:
12431250
modem_cellular_enter_state(data, MODEM_CELLULAR_STATE_INIT_POWER_OFF);
12441251
break;
1245-
1252+
case MODEM_CELLULAR_EVENT_RING:
1253+
LOG_INF("RING received!");
1254+
modem_pipe_open_async(data->uart_pipe);
1255+
break;
12461256
default:
12471257
break;
12481258
}
@@ -1287,7 +1297,10 @@ static void modem_cellular_await_registered_event_handler(struct modem_cellular_
12871297
case MODEM_CELLULAR_EVENT_SUSPEND:
12881298
modem_cellular_enter_state(data, MODEM_CELLULAR_STATE_INIT_POWER_OFF);
12891299
break;
1290-
1300+
case MODEM_CELLULAR_EVENT_RING:
1301+
LOG_INF("RING received!");
1302+
modem_pipe_open_async(data->uart_pipe);
1303+
break;
12911304
default:
12921305
break;
12931306
}
@@ -1332,7 +1345,10 @@ static void modem_cellular_carrier_on_event_handler(struct modem_cellular_data *
13321345
modem_ppp_release(data->ppp);
13331346
modem_cellular_enter_state(data, MODEM_CELLULAR_STATE_INIT_POWER_OFF);
13341347
break;
1335-
1348+
case MODEM_CELLULAR_EVENT_RING:
1349+
LOG_INF("RING received!");
1350+
modem_pipe_open_async(data->uart_pipe);
1351+
break;
13361352
default:
13371353
break;
13381354
}
@@ -2069,6 +2085,15 @@ static void net_mgmt_event_handler(struct net_mgmt_event_callback *cb, uint64_t
20692085
}
20702086
}
20712087

2088+
static void modem_cellular_ring_gpio_callback(const struct device *dev, struct gpio_callback *cb,
2089+
uint32_t pins)
2090+
{
2091+
struct modem_cellular_data *data =
2092+
CONTAINER_OF(cb, struct modem_cellular_data, ring_gpio_cb);
2093+
2094+
modem_cellular_delegate_event(data, MODEM_CELLULAR_EVENT_RING);
2095+
}
2096+
20722097
static void modem_cellular_init_apn(struct modem_cellular_data *data)
20732098
{
20742099
#ifdef CONFIG_MODEM_CELLULAR_APN
@@ -2115,6 +2140,33 @@ static int modem_cellular_init(const struct device *dev)
21152140
gpio_pin_configure_dt(&config->reset_gpio, GPIO_OUTPUT_ACTIVE);
21162141
}
21172142

2143+
if (modem_cellular_gpio_is_enabled(&config->ring_gpio)) {
2144+
int ret;
2145+
2146+
ret = gpio_pin_configure_dt(&config->ring_gpio, GPIO_INPUT);
2147+
if (ret < 0) {
2148+
LOG_ERR("Failed to configure ring GPIO (%d)", ret);
2149+
return ret;
2150+
}
2151+
2152+
gpio_init_callback(&data->ring_gpio_cb, modem_cellular_ring_gpio_callback,
2153+
BIT(config->ring_gpio.pin));
2154+
2155+
ret = gpio_add_callback(config->ring_gpio.port, &data->ring_gpio_cb);
2156+
if (ret < 0) {
2157+
LOG_ERR("Failed to add ring GPIO callback (%d)", ret);
2158+
return ret;
2159+
}
2160+
2161+
ret = gpio_pin_interrupt_configure_dt(&config->ring_gpio, GPIO_INT_EDGE_TO_ACTIVE);
2162+
if (ret < 0) {
2163+
LOG_ERR("Failed to configure ring GPIO interrupt (%d)", ret);
2164+
return ret;
2165+
}
2166+
2167+
LOG_DBG("Ring GPIO interrupt configured");
2168+
}
2169+
21182170
if (modem_cellular_gpio_is_enabled(&config->dtr_gpio)) {
21192171
gpio_pin_configure_dt(&config->dtr_gpio, GPIO_OUTPUT_INACTIVE);
21202172
dtr_gpio = &config->dtr_gpio;
@@ -2891,6 +2943,7 @@ MODEM_CHAT_SCRIPT_DEFINE(sqn_gm02s_periodic_chat_script,
28912943
.power_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_power_gpios, {}), \
28922944
.reset_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_reset_gpios, {}), \
28932945
.wake_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_wake_gpios, {}), \
2946+
.ring_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_ring_gpios, {}), \
28942947
.dtr_gpio = GPIO_DT_SPEC_INST_GET_OR(inst, mdm_dtr_gpios, {}), \
28952948
.power_pulse_duration_ms = (power_ms), \
28962949
.reset_pulse_duration_ms = (reset_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
mdm-dtr-gpios:
2226
type: phandle-array
2327
description: |

0 commit comments

Comments
 (0)