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 <hake.huang@oss.nxp.com>
This commit is contained in:
Hake Huang 2020-04-19 13:09:46 +08:00 committed by Maureen Helm
parent 2ca3473349
commit abce94bb98
2 changed files with 47 additions and 11 deletions

View file

@ -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));

View file

@ -14,13 +14,23 @@
#include <string.h>
/* 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];