@@ -23,7 +23,7 @@ LOG_MODULE_REGISTER(mspi_nrfe, CONFIG_MSPI_LOG_LEVEL);
23
23
#define MSPI_NRFE_NODE DT_DRV_INST(0)
24
24
#define MAX_TX_MSG_SIZE (DT_REG_SIZE(DT_NODELABEL(sram_tx)))
25
25
#define MAX_RX_MSG_SIZE (DT_REG_SIZE(DT_NODELABEL(sram_rx)))
26
- #define CONFIG_TIMEOUT_MS 100
26
+ #define IPC_TIMEOUT_MS 100
27
27
#define EP_SEND_TIMEOUT_MS 10
28
28
29
29
#define SDP_MPSI_PINCTRL_DEV_CONFIG_INIT (node_id ) \
@@ -65,6 +65,10 @@ static atomic_t ipc_atomic_sem = ATOMIC_INIT(0);
65
65
.sw_multi_periph = false, \
66
66
}
67
67
68
+ struct mspi_nrfe_data {
69
+ nrfe_mspi_xfer_config_msg_t xfer_config_msg ;
70
+ };
71
+
68
72
struct mspi_nrfe_config {
69
73
struct mspi_cfg mspicfg ;
70
74
const struct pinctrl_dev_config * pcfg ;
@@ -75,6 +79,8 @@ static const struct mspi_nrfe_config dev_config = {
75
79
.pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET (0 ),
76
80
};
77
81
82
+ static struct mspi_nrfe_data dev_data ;
83
+
78
84
static void ep_recv (const void * data , size_t len , void * priv );
79
85
80
86
static void ep_bound (void * priv )
@@ -254,27 +260,35 @@ static int nrfe_mspi_wait_for_response(nrfe_mspi_opcode_t opcode, uint32_t timeo
254
260
}
255
261
256
262
/**
257
- * @brief Send a configuration struct to the FLPR core using the IPC service.
263
+ * @brief Send data to the FLPR core using the IPC service, and wait for FLPR response .
258
264
*
259
265
* @param opcode The configuration packet opcode to send.
260
- * @param config The data to send.
266
+ * @param data The data to send.
261
267
* @param len The length of the data to send.
262
268
*
263
269
* @return 0 on success, negative errno code on failure.
264
270
*/
265
- static int send_config (nrfe_mspi_opcode_t opcode , const void * config , size_t len )
271
+ static int send_data (nrfe_mspi_opcode_t opcode , const void * data , size_t len )
266
272
{
267
273
int rc ;
268
- rc = mspi_ipc_data_send (opcode , config , len );
274
+
275
+ #ifdef CONFIG_MSPI_NRFE_IPC_NO_COPY
276
+ (void )len ;
277
+ void * data_ptr = (void * )data ;
278
+
279
+ rc = mspi_ipc_data_send (opcode , & data_ptr , sizeof (void * ));
280
+ #else
281
+ rc = mspi_ipc_data_send (opcode , data , len );
282
+ #endif
269
283
270
284
if (rc < 0 ) {
271
- LOG_ERR ("Configuration send failed: %d" , rc );
285
+ LOG_ERR ("Data transfer failed: %d" , rc );
272
286
return rc ;
273
287
}
274
288
275
- rc = nrfe_mspi_wait_for_response (opcode , CONFIG_TIMEOUT_MS );
289
+ rc = nrfe_mspi_wait_for_response (opcode , IPC_TIMEOUT_MS );
276
290
if (rc < 0 ) {
277
- LOG_ERR ("FLPR config : %d response timeout: %d!" , opcode , rc );
291
+ LOG_ERR ("Data transfer : %d response timeout: %d!" , opcode , rc );
278
292
}
279
293
280
294
return rc ;
@@ -337,8 +351,8 @@ static int api_config(const struct mspi_dt_spec *spec)
337
351
mspi_pin_config .opcode = NRFE_MSPI_CONFIG_PINS ;
338
352
339
353
/* Send pinout configuration to FLPR */
340
- return send_config (NRFE_MSPI_CONFIG_PINS , (const void * )& mspi_pin_config ,
341
- sizeof (nrfe_mspi_pinctrl_soc_pin_msg_t ));
354
+ return send_data (NRFE_MSPI_CONFIG_PINS , (const void * )& mspi_pin_config ,
355
+ sizeof (nrfe_mspi_pinctrl_soc_pin_msg_t ));
342
356
}
343
357
344
358
static int check_io_mode (enum mspi_io_mode io_mode )
@@ -425,8 +439,8 @@ static int api_dev_config(const struct device *dev, const struct mspi_dev_id *de
425
439
mspi_dev_config_msg .dev_config .freq = cfg -> freq ;
426
440
mspi_dev_config_msg .dev_config .ce_index = cfg -> ce_num ;
427
441
428
- return send_config (NRFE_MSPI_CONFIG_DEV , (void * )& mspi_dev_config_msg ,
429
- sizeof (nrfe_mspi_dev_config_msg_t ));
442
+ return send_data (NRFE_MSPI_CONFIG_DEV , (void * )& mspi_dev_config_msg ,
443
+ sizeof (nrfe_mspi_dev_config_msg_t ));
430
444
}
431
445
432
446
static int api_get_channel_status (const struct device * dev , uint8_t ch )
@@ -449,27 +463,38 @@ static int api_get_channel_status(const struct device *dev, uint8_t ch)
449
463
static int xfer_packet (struct mspi_xfer_packet * packet , uint32_t timeout )
450
464
{
451
465
int rc ;
466
+ nrfe_mspi_opcode_t opcode = (packet -> dir == MSPI_RX ) ? NRFE_MSPI_TXRX : NRFE_MSPI_TX ;
467
+
468
+ #ifdef CONFIG_MSPI_NRFE_IPC_NO_COPY
469
+ /* Check for alignment problems. */
470
+ uint32_t len = ((uint32_t )packet -> data_buf ) % sizeof (uint32_t ) != 0
471
+ ? sizeof (nrfe_mspi_xfer_packet_msg_t ) + packet -> num_bytes
472
+ : sizeof (nrfe_mspi_xfer_packet_msg_t );
473
+ #else
452
474
uint32_t len = sizeof (nrfe_mspi_xfer_packet_msg_t ) + packet -> num_bytes ;
475
+ #endif
453
476
uint8_t buffer [len ];
454
477
nrfe_mspi_xfer_packet_msg_t * xfer_packet = (nrfe_mspi_xfer_packet_msg_t * )buffer ;
455
478
456
- xfer_packet -> opcode = ( packet -> dir == MSPI_RX ) ? NRFE_MSPI_TXRX : NRFE_MSPI_TX ;
479
+ xfer_packet -> opcode = opcode ;
457
480
xfer_packet -> command = packet -> cmd ;
458
481
xfer_packet -> address = packet -> address ;
459
482
xfer_packet -> num_bytes = packet -> num_bytes ;
460
483
461
- memcpy ((void * )xfer_packet -> data , (void * )packet -> data_buf , packet -> num_bytes );
462
-
463
- rc = mspi_ipc_data_send (xfer_packet -> opcode , buffer , len );
464
- if (rc < 0 ) {
465
- LOG_ERR ("Packet transfer error: %d" , rc );
484
+ #ifdef CONFIG_MSPI_NRFE_IPC_NO_COPY
485
+ /* Check for alignlemt problems. */
486
+ if (((uint32_t )packet -> data_buf ) % sizeof (uint32_t ) != 0 ) {
487
+ memcpy ((void * )(buffer + sizeof (nrfe_mspi_xfer_packet_msg_t )),
488
+ (void * )packet -> data_buf , packet -> num_bytes );
489
+ xfer_packet -> data = buffer + sizeof (nrfe_mspi_xfer_packet_msg_t );
490
+ } else {
491
+ xfer_packet -> data = packet -> data_buf ;
466
492
}
493
+ #else
494
+ memcpy ((void * )xfer_packet -> data , (void * )packet -> data_buf , packet -> num_bytes );
495
+ #endif
467
496
468
- rc = nrfe_mspi_wait_for_response (xfer_packet -> opcode , timeout );
469
- if (rc < 0 ) {
470
- LOG_ERR ("FLPR Xfer response timeout: %d" , rc );
471
- return rc ;
472
- }
497
+ rc = send_data (xfer_packet -> opcode , xfer_packet , len );
473
498
474
499
/* Wait for the transfer to complete and receive data. */
475
500
if ((packet -> dir == MSPI_RX ) && (ipc_receive_buffer != NULL ) && (ipc_received > 0 )) {
@@ -534,10 +559,9 @@ static int start_next_packet(struct mspi_xfer *xfer, uint32_t packets_done)
534
559
static int api_transceive (const struct device * dev , const struct mspi_dev_id * dev_id ,
535
560
const struct mspi_xfer * req )
536
561
{
537
- ( void ) dev ;
562
+ struct mspi_nrfe_data * drv_data = dev -> data ;
538
563
uint32_t packets_done = 0 ;
539
564
int rc ;
540
- nrfe_mspi_xfer_config_msg_t mspi_xfer_config_msg ;
541
565
542
566
/* TODO: add support for asynchronous transfers */
543
567
if (req -> async ) {
@@ -549,16 +573,17 @@ static int api_transceive(const struct device *dev, const struct mspi_dev_id *de
549
573
return - EFAULT ;
550
574
}
551
575
552
- mspi_xfer_config_msg .opcode = NRFE_MSPI_CONFIG_XFER ;
553
- mspi_xfer_config_msg .xfer_config .device_index = dev_id -> dev_idx ;
554
- mspi_xfer_config_msg .xfer_config .command_length = req -> cmd_length ;
555
- mspi_xfer_config_msg .xfer_config .address_length = req -> addr_length ;
556
- mspi_xfer_config_msg .xfer_config .hold_ce = req -> hold_ce ;
557
- mspi_xfer_config_msg .xfer_config .tx_dummy = req -> tx_dummy ;
558
- mspi_xfer_config_msg .xfer_config .rx_dummy = req -> rx_dummy ;
576
+ drv_data -> xfer_config_msg .opcode = NRFE_MSPI_CONFIG_XFER ;
577
+ drv_data -> xfer_config_msg .xfer_config .device_index = dev_id -> dev_idx ;
578
+ drv_data -> xfer_config_msg .xfer_config .command_length = req -> cmd_length ;
579
+ drv_data -> xfer_config_msg .xfer_config .address_length = req -> addr_length ;
580
+ drv_data -> xfer_config_msg .xfer_config .hold_ce = req -> hold_ce ;
581
+ drv_data -> xfer_config_msg .xfer_config .tx_dummy = req -> tx_dummy ;
582
+ drv_data -> xfer_config_msg .xfer_config .rx_dummy = req -> rx_dummy ;
583
+
584
+ rc = send_data (NRFE_MSPI_CONFIG_XFER , (void * )& drv_data -> xfer_config_msg ,
585
+ sizeof (nrfe_mspi_xfer_config_msg_t ));
559
586
560
- rc = send_config (NRFE_MSPI_CONFIG_XFER , (void * )& mspi_xfer_config_msg ,
561
- sizeof (nrfe_mspi_xfer_config_msg_t ));
562
587
if (rc < 0 ) {
563
588
LOG_ERR ("Send xfer config error: %d" , rc );
564
589
return rc ;
@@ -678,5 +703,5 @@ static const struct mspi_driver_api drv_api = {
678
703
679
704
PM_DEVICE_DT_INST_DEFINE (0 , dev_pm_action_cb );
680
705
681
- DEVICE_DT_INST_DEFINE (0 , nrfe_mspi_init , PM_DEVICE_DT_INST_GET (0 ), NULL , & dev_config , POST_KERNEL ,
682
- CONFIG_MSPI_NRFE_INIT_PRIORITY , & drv_api );
706
+ DEVICE_DT_INST_DEFINE (0 , nrfe_mspi_init , PM_DEVICE_DT_INST_GET (0 ), & dev_data , & dev_config ,
707
+ POST_KERNEL , CONFIG_MSPI_NRFE_INIT_PRIORITY , & drv_api );
0 commit comments