From abce94bb98abe66e645248470ebfce06110d8db7 Mon Sep 17 00:00:00 2001 From: Hake Huang Date: Sun, 19 Apr 2020 13:09:46 +0800 Subject: [PATCH] dma: add EDMA test support for MCUX for RT series CONFIG_NOCACHE_MEMORY need enabled for Kinetis series CONFIG_DMA_TEST_SLOT_START for test modify the target and dest alignment frdmk64f need replace strlen to sizeof in irq callback clean the unused receive buffer, so output is tidy Signed-off-by: Hake Huang --- .../dma/chan_blen_transfer/src/test_dma.c | 23 +++++++++--- tests/drivers/dma/loop_transfer/src/dma.c | 35 +++++++++++++++---- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/tests/drivers/dma/chan_blen_transfer/src/test_dma.c b/tests/drivers/dma/chan_blen_transfer/src/test_dma.c index 899daaef99c..835e27aadde 100644 --- a/tests/drivers/dma/chan_blen_transfer/src/test_dma.c +++ b/tests/drivers/dma/chan_blen_transfer/src/test_dma.c @@ -26,8 +26,16 @@ #define DMA_DEVICE_NAME CONFIG_DMA_0_NAME #define RX_BUFF_SIZE (48) -static const char tx_data[] = "It is harder to be kind than to be wise"; +#ifdef CONFIG_NOCACHE_MEMORY +static __aligned(32) char tx_data[RX_BUFF_SIZE] __used + __attribute__((__section__(".nocache"))); +static const char TX_DATA[] = "It is harder to be kind than to be wise........"; +static __aligned(32) char rx_data[RX_BUFF_SIZE] __used + __attribute__((__section__(".nocache.dma"))); +#else +static const char tx_data[] = "It is harder to be kind than to be wise........"; static char rx_data[RX_BUFF_SIZE] = { 0 }; +#endif static void test_done(void *arg, uint32_t id, int error_code) { @@ -40,8 +48,8 @@ static void test_done(void *arg, uint32_t id, int error_code) static int test_task(uint32_t chan_id, uint32_t blen) { - struct dma_config dma_cfg = {0}; - struct dma_block_config dma_block_cfg = {0}; + struct dma_config dma_cfg = { 0 }; + struct dma_block_config dma_block_cfg = { 0 }; struct device *dma = device_get_binding(DMA_DEVICE_NAME); if (!dma) { @@ -49,6 +57,10 @@ static int test_task(uint32_t chan_id, uint32_t blen) return TC_FAIL; } +#ifdef CONFIG_NOCACHE_MEMORY + memcpy(tx_data, TX_DATA, sizeof(TX_DATA)); +#endif + dma_cfg.channel_direction = MEMORY_TO_MEMORY; dma_cfg.source_data_size = 1U; dma_cfg.dest_data_size = 1U; @@ -59,9 +71,12 @@ static int test_task(uint32_t chan_id, uint32_t blen) dma_cfg.error_callback_en = 1U; dma_cfg.block_count = 1U; dma_cfg.head_block = &dma_block_cfg; +#ifdef CONFIG_DMA_MCUX_TEST_SLOT_START + dma_cfg.dma_slot = CONFIG_DMA_MCUX_TEST_SLOT_START; +#endif TC_PRINT("Preparing DMA Controller: Chan_ID=%u, BURST_LEN=%u\n", - chan_id, blen >> 3); + chan_id, blen >> 3); TC_PRINT("Starting the transfer\n"); (void)memset(rx_data, 0, sizeof(rx_data)); diff --git a/tests/drivers/dma/loop_transfer/src/dma.c b/tests/drivers/dma/loop_transfer/src/dma.c index 437f17ee6d8..1464ad43339 100644 --- a/tests/drivers/dma/loop_transfer/src/dma.c +++ b/tests/drivers/dma/loop_transfer/src/dma.c @@ -14,13 +14,23 @@ #include /* in millisecond */ -#define SLEEPTIME 1000 +#define SLEEPTIME 1000 #define TRANSFER_LOOPS (5) -#define RX_BUFF_SIZE (50) +#define RX_BUFF_SIZE (64) -static const char tx_data[] = "The quick brown fox jumps over the lazy dog"; -static char rx_data[TRANSFER_LOOPS][RX_BUFF_SIZE] = {{ 0 } }; +#if CONFIG_NOCACHE_MEMORY +static const char TX_DATA[] = "The quick brown fox jumps over the lazy dog"; +static __aligned(16) char tx_data[64] __used + __attribute__((__section__(".nocache"))); +static __aligned(16) char rx_data[TRANSFER_LOOPS][RX_BUFF_SIZE] __used + __attribute__((__section__(".nocache.dma"))); +#else +/* pad to times of 8*/ +static const char tx_data[] = + "The quick brown fox jumps over the lazy dog ...."; +static __aligned(16) char rx_data[TRANSFER_LOOPS][RX_BUFF_SIZE] = { { 0 } }; +#endif #define DMA_DEVICE_NAME "DMA_0" @@ -31,7 +41,6 @@ static struct dma_block_config dma_block_cfg = {0}; static void test_transfer(struct device *dev, uint32_t id) { int ret; - transfer_count++; if (transfer_count < TRANSFER_LOOPS) { dma_block_cfg.block_size = strlen(tx_data); @@ -67,9 +76,16 @@ void main(void) static uint32_t chan_id; printk("DMA memory to memory transfer started on %s\n", - DMA_DEVICE_NAME); + DMA_DEVICE_NAME); printk("Preparing DMA Controller\n"); +#if CONFIG_NOCACHE_MEMORY + memset(tx_data, 0, sizeof(tx_data)); + memcpy(tx_data, TX_DATA, sizeof(TX_DATA)); +#endif + + memset(rx_data, 0, sizeof(rx_data)); + dma = device_get_binding(DMA_DEVICE_NAME); if (!dma) { printk("Cannot get dma controller\n"); @@ -85,10 +101,15 @@ void main(void) dma_cfg.dma_callback = dma_user_callback; dma_cfg.block_count = 1U; dma_cfg.head_block = &dma_block_cfg; +#ifdef CONFIG_DMA_MCUX_TEST_SLOT_START + dma_cfg.dma_slot = CONFIG_DMA_MCUX_TEST_SLOT_START; +#endif chan_id = 0U; - + transfer_count = 0; printk("Starting the transfer and waiting for 1 second\n"); + printk("TX data: %s\n", tx_data); + printk("block_size %d\n", strlen(tx_data)); dma_block_cfg.block_size = strlen(tx_data); dma_block_cfg.source_address = (uint32_t)tx_data; dma_block_cfg.dest_address = (uint32_t)rx_data[transfer_count];