@@ -411,49 +411,51 @@ static void internal_tx_handler(void)
411
411
}
412
412
}
413
413
414
- static int transport_init (nrf_rpc_tr_receive_handler_t receive_cb )
414
+ static int transport_init_single (nrf_rpc_tr_receive_handler_t receive_cb , const struct nrf_rpc_group * group )
415
415
{
416
- int err = 0 ;
417
- void * iter ;
418
- const struct nrf_rpc_group * group ;
416
+ const struct nrf_rpc_tr * transport = group -> transport ;
417
+ struct nrf_rpc_group_data * data = group -> data ;
418
+ int err ;
419
419
420
- for (NRF_RPC_AUTO_ARR_FOR (iter , group , & nrf_rpc_groups_array ,
421
- const struct nrf_rpc_group )) {
422
- const struct nrf_rpc_tr * transport = group -> transport ;
423
- struct nrf_rpc_group_data * data = group -> data ;
420
+ NRF_RPC_ASSERT (transport != NULL );
424
421
425
- NRF_RPC_ASSERT (transport != NULL );
422
+ if (group -> data -> transport_initialized ) {
423
+ return 0 ;
424
+ }
426
425
427
- /* Initialize all dependencies of `receive_handler` before calling the transport
428
- * init to avoid possible data race if `receive_handler` was invoked before this
429
- * function was completed. */
430
- if (auto_free_rx_buf (transport )) {
431
- err = nrf_rpc_os_event_init (& data -> decode_done_event );
432
- if (err < 0 ) {
433
- continue ;
434
- }
426
+ /* Initialize all dependencies of `receive_handler` before calling the transport
427
+ * init to avoid possible data race if `receive_handler` was invoked before this
428
+ * function was completed. */
429
+ if (auto_free_rx_buf (transport )) {
430
+ err = nrf_rpc_os_event_init (& data -> decode_done_event );
431
+ if (err < 0 ) {
432
+ return err ;
435
433
}
434
+ }
436
435
437
- err = transport -> api -> init (transport , receive_cb , NULL );
438
- if (err ) {
439
- NRF_RPC_ERR ("Failed to initialize transport, err: %d" , err );
440
- continue ;
441
- }
436
+ err = transport -> api -> init (transport , receive_cb , NULL );
437
+ if (err ) {
438
+ NRF_RPC_ERR ("Failed to initialize transport, err: %d" , err );
439
+ return err ;
440
+ }
442
441
443
- group -> data -> transport_initialized = true;
442
+ group -> data -> transport_initialized = true;
444
443
445
- if (group -> flags & NRF_RPC_FLAGS_INITIATOR ) {
446
- err = group_init_send (group );
447
- if (err ) {
448
- NRF_RPC_ERR ("Failed to send group init packet for group id: %d strid: %s err: %d" ,
449
- data -> src_group_id , group -> strid , err );
450
- continue ;
451
- }
444
+ if (group -> flags & NRF_RPC_FLAGS_INITIATOR ) {
445
+ err = group_init_send (group );
446
+ if (err ) {
447
+ NRF_RPC_ERR ("Failed to send group init packet for group id: %d strid: %s err: %d" ,
448
+ data -> src_group_id , group -> strid , err );
449
+ return err ;
452
450
}
453
451
}
454
452
455
- /* Group initialization errors are not propagated to the caller. */
456
- err = 0 ;
453
+ return 0 ;
454
+ }
455
+
456
+ static int groups_init_event_wait (void )
457
+ {
458
+ int err = 0 ;
457
459
458
460
if (waiting_group_count > 0 ) {
459
461
err = nrf_rpc_os_event_wait (& groups_init_event , CONFIG_NRF_RPC_GROUP_INIT_WAIT_TIME );
@@ -465,6 +467,27 @@ static int transport_init(nrf_rpc_tr_receive_handler_t receive_cb)
465
467
return err ;
466
468
}
467
469
470
+ static int transport_init_all (nrf_rpc_tr_receive_handler_t receive_cb )
471
+ {
472
+ void * iter ;
473
+ const struct nrf_rpc_group * group ;
474
+
475
+ for (NRF_RPC_AUTO_ARR_FOR (iter , group , & nrf_rpc_groups_array ,
476
+ const struct nrf_rpc_group )) {
477
+
478
+ transport_init_single (receive_cb , group );
479
+ }
480
+
481
+ /* Group initialization errors are not propagated to the caller. */
482
+ return groups_init_event_wait ();
483
+ }
484
+
485
+ static void default_err_handler (const struct nrf_rpc_err_report * report )
486
+ {
487
+ NRF_RPC_ERR ("nRF RPC error %d ocurred. See nRF RPC logs for more details" , report -> code );
488
+ k_oops ();
489
+ }
490
+
468
491
/* ======================== Receiving Packets ======================== */
469
492
470
493
/* Find in array and execute command or event handler */
@@ -1091,23 +1114,18 @@ void nrf_rpc_set_bound_handler(nrf_rpc_group_bound_handler_t bound_handler)
1091
1114
global_bound_handler = bound_handler ;
1092
1115
}
1093
1116
1094
- int nrf_rpc_init ( nrf_rpc_err_handler_t err_handler )
1117
+ static int nrf_rpc_prepare_init ( void )
1095
1118
{
1096
1119
int err ;
1097
- int i ;
1098
1120
void * iter ;
1099
1121
const struct nrf_rpc_group * group ;
1100
1122
uint8_t group_id = 0 ;
1101
1123
uint8_t wait_count = 0 ;
1102
1124
1103
- NRF_RPC_DBG ("Initializing nRF RPC module" );
1104
-
1105
1125
if (is_initialized ) {
1106
1126
return 0 ;
1107
1127
}
1108
1128
1109
- global_err_handler = err_handler ;
1110
-
1111
1129
for (NRF_RPC_AUTO_ARR_FOR (iter , group , & nrf_rpc_groups_array ,
1112
1130
const struct nrf_rpc_group )) {
1113
1131
struct nrf_rpc_group_data * data = group -> data ;
@@ -1144,20 +1162,63 @@ int nrf_rpc_init(nrf_rpc_err_handler_t err_handler)
1144
1162
return err ;
1145
1163
}
1146
1164
1147
- for (i = 0 ; i < CONFIG_NRF_RPC_CMD_CTX_POOL_SIZE ; i ++ ) {
1165
+ for (int i = 0 ; i < CONFIG_NRF_RPC_CMD_CTX_POOL_SIZE ; i ++ ) {
1148
1166
cmd_ctx_pool [i ].id = i ;
1149
1167
err = nrf_rpc_os_msg_init (& cmd_ctx_pool [i ].recv_msg );
1150
1168
if (err < 0 ) {
1151
1169
return err ;
1152
1170
}
1153
1171
}
1154
1172
1155
- err = transport_init (receive_handler );
1173
+ global_err_handler = default_err_handler ;
1174
+
1175
+ is_initialized = true;
1176
+
1177
+ return 0 ;
1178
+ }
1179
+
1180
+ int nrf_rpc_init_group (const struct nrf_rpc_group * group )
1181
+ {
1182
+ int err = nrf_rpc_prepare_init ();
1183
+ if (err < 0 ) {
1184
+ return err ;
1185
+ }
1186
+
1187
+
1188
+ err = transport_init_single (receive_handler , group );
1189
+ if (err < 0 ) {
1190
+ return err ;
1191
+ }
1192
+
1193
+ NRF_RPC_ASSERT (group_count > 0 );
1194
+ if (initialized_group_count == group_count - 1 ) {
1195
+ return groups_init_event_wait ();
1196
+ }
1197
+
1198
+ return 0 ;
1199
+ }
1200
+
1201
+ int nrf_rpc_init (nrf_rpc_err_handler_t err_handler )
1202
+ {
1203
+ int err ;
1204
+
1205
+ /* Everything is initialized, nothing to do here */
1206
+ if (group_count > 0 && group_count == initialized_group_count ) {
1207
+ return 0 ;
1208
+ }
1209
+
1210
+ NRF_RPC_DBG ("Initializing nRF RPC module" );
1211
+
1212
+ err = nrf_rpc_prepare_init ();
1213
+ if (err < 0 ) {
1214
+ return err ;
1215
+ }
1216
+
1217
+ err = transport_init_all (receive_handler );
1156
1218
if (err < 0 ) {
1157
1219
return err ;
1158
1220
}
1159
1221
1160
- is_initialized = true;
1161
1222
NRF_RPC_DBG ("Done initializing nRF RPC module" );
1162
1223
1163
1224
return err ;
0 commit comments