@@ -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
101102struct 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
175179struct 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+
20722097static 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), \
0 commit comments