@@ -66,7 +66,6 @@ struct dma_mcux_channel_transfer_edma_settings {
66
66
uint32_t source_data_size ;
67
67
uint32_t dest_data_size ;
68
68
uint32_t source_burst_length ;
69
- uint32_t dest_burst_length ;
70
69
enum dma_channel_direction direction ;
71
70
edma_transfer_type_t transfer_type ;
72
71
bool valid ;
@@ -462,6 +461,7 @@ static int dma_mcux_edma_configure_basic(const struct device *dev,
462
461
{
463
462
edma_handle_t * p_handle = DEV_EDMA_HANDLE (dev , channel );
464
463
struct call_back * data = DEV_CHANNEL_DATA (dev , channel );
464
+ struct dma_mcux_channel_transfer_edma_settings * xfer_settings = & data -> transfer_settings ;
465
465
struct dma_block_config * block_config = config -> head_block ;
466
466
uint32_t hw_channel ;
467
467
int ret = 0 ;
@@ -473,7 +473,7 @@ static int dma_mcux_edma_configure_basic(const struct device *dev,
473
473
config -> source_data_size ,
474
474
(void * )block_config -> dest_address ,
475
475
config -> dest_data_size ,
476
- config -> source_burst_length ,
476
+ xfer_settings -> source_burst_length ,
477
477
block_config -> block_size , transfer_type );
478
478
479
479
const status_t submit_status = EDMA_SubmitTransfer (p_handle , & (data -> transferConfig ));
@@ -488,7 +488,7 @@ static int dma_mcux_edma_configure_basic(const struct device *dev,
488
488
return ret ;
489
489
}
490
490
491
- static void dma_mcux_edma_configure_hardware (const struct device * dev , uint32_t channel ,
491
+ static int dma_mcux_edma_configure_hardware (const struct device * dev , uint32_t channel ,
492
492
struct dma_config * config )
493
493
{
494
494
struct call_back * data = DEV_CHANNEL_DATA (dev , channel );
@@ -499,6 +499,14 @@ static void dma_mcux_edma_configure_hardware(const struct device *dev, uint32_t
499
499
500
500
dma_mcux_edma_configure_muxes (dev , channel , config );
501
501
502
+ #if defined(CONFIG_DMA_MCUX_EDMA_V3 ) && \
503
+ (!defined(FSL_FEATURE_SOC_DMAMUX_COUNT ) || (FSL_FEATURE_SOC_DMAMUX_COUNT == 0 ))
504
+ if (transfer_type == kEDMA_MemoryToMemory && (sg_mode || config -> block_count > 1 )) {
505
+ LOG_WRN ("mem2mem xfer scatter gather not supported" );
506
+ return - ENOTSUP ;
507
+ }
508
+ #endif
509
+
502
510
if (sg_mode && config -> cyclic ) {
503
511
dma_mcux_edma_configure_sg_loop (dev , channel , config , transfer_type );
504
512
} else if (sg_mode ) {
@@ -519,6 +527,8 @@ static void dma_mcux_edma_configure_hardware(const struct device *dev, uint32_t
519
527
}
520
528
521
529
EDMA_EnableChannelInterrupts (DEV_BASE (dev ), hw_channel , kEDMA_ErrorInterruptEnable );
530
+
531
+ return 0 ;
522
532
}
523
533
524
534
static inline int dma_mcux_edma_validate_cfg (const struct device * dev ,
@@ -594,7 +604,15 @@ static inline void dma_mcux_edma_set_xfer_settings(const struct device *dev, uin
594
604
struct dma_mcux_channel_transfer_edma_settings * xfer_settings = & data -> transfer_settings ;
595
605
596
606
xfer_settings -> source_burst_length = config -> source_burst_length ;
597
- xfer_settings -> dest_burst_length = config -> dest_burst_length ;
607
+ #if defined(CONFIG_DMA_MCUX_EDMA_V3 ) && \
608
+ (!defined(FSL_FEATURE_SOC_DMAMUX_COUNT ) || (FSL_FEATURE_SOC_DMAMUX_COUNT == 0 ))
609
+ struct dma_block_config * block_config = config -> head_block ;
610
+
611
+ if (xfer_settings -> transfer_type == kEDMA_MemoryToMemory ) {
612
+ xfer_settings -> source_burst_length = block_config -> block_size ;
613
+
614
+ }
615
+ #endif
598
616
xfer_settings -> source_data_size = config -> source_data_size ;
599
617
xfer_settings -> dest_data_size = config -> dest_data_size ;
600
618
xfer_settings -> direction = config -> channel_direction ;
@@ -644,7 +662,10 @@ static int dma_mcux_edma_configure(const struct device *dev, uint32_t channel,
644
662
sizeof (DEV_CFG (dev )-> tcdpool [channel ][i ]));
645
663
}
646
664
647
- dma_mcux_edma_configure_hardware (dev , channel , config );
665
+ ret = dma_mcux_edma_configure_hardware (dev , channel , config );
666
+ if (ret ) {
667
+ return ret ;
668
+ }
648
669
649
670
struct call_back * data = DEV_CHANNEL_DATA (dev , channel );
650
671
@@ -675,6 +696,14 @@ static int dma_mcux_edma_start(const struct device *dev, uint32_t channel)
675
696
#endif
676
697
data -> busy = true;
677
698
EDMA_StartTransfer (DEV_EDMA_HANDLE (dev , channel ));
699
+ #if defined(CONFIG_DMA_MCUX_EDMA_V3 ) && \
700
+ (!defined(FSL_FEATURE_SOC_DMAMUX_COUNT ) || (FSL_FEATURE_SOC_DMAMUX_COUNT == 0 ))
701
+ struct dma_mcux_channel_transfer_edma_settings * xfer_settings = & data -> transfer_settings ;
702
+
703
+ if (xfer_settings -> transfer_type == kEDMA_MemoryToMemory ) {
704
+ EDMA_TriggerChannelStart (DEV_BASE (dev ), channel );
705
+ }
706
+ #endif
678
707
return 0 ;
679
708
}
680
709
@@ -704,6 +733,16 @@ static int dma_mcux_edma_suspend(const struct device *dev, uint32_t channel)
704
733
{
705
734
struct call_back * data = DEV_CHANNEL_DATA (dev , channel );
706
735
736
+ #if defined(CONFIG_DMA_MCUX_EDMA_V3 ) && \
737
+ (!defined(FSL_FEATURE_SOC_DMAMUX_COUNT ) || (FSL_FEATURE_SOC_DMAMUX_COUNT == 0 ))
738
+ struct dma_mcux_channel_transfer_edma_settings * xfer_settings = & data -> transfer_settings ;
739
+
740
+ if (xfer_settings -> transfer_type == kEDMA_MemoryToMemory ) {
741
+ /* can't suspend this transfer, effectively a not implemented function */
742
+ return - ENOSYS ;
743
+ }
744
+ #endif
745
+
707
746
if (!data -> busy ) {
708
747
return - EINVAL ;
709
748
}
0 commit comments