@@ -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 {
@@ -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
176180struct 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+
21612186static 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), \
0 commit comments