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:
parent
2ca3473349
commit
abce94bb98
2 changed files with 47 additions and 11 deletions
|
@ -26,8 +26,16 @@
|
||||||
#define DMA_DEVICE_NAME CONFIG_DMA_0_NAME
|
#define DMA_DEVICE_NAME CONFIG_DMA_0_NAME
|
||||||
#define RX_BUFF_SIZE (48)
|
#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 };
|
static char rx_data[RX_BUFF_SIZE] = { 0 };
|
||||||
|
#endif
|
||||||
|
|
||||||
static void test_done(void *arg, uint32_t id, int error_code)
|
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)
|
static int test_task(uint32_t chan_id, uint32_t blen)
|
||||||
{
|
{
|
||||||
struct dma_config dma_cfg = {0};
|
struct dma_config dma_cfg = { 0 };
|
||||||
struct dma_block_config dma_block_cfg = {0};
|
struct dma_block_config dma_block_cfg = { 0 };
|
||||||
struct device *dma = device_get_binding(DMA_DEVICE_NAME);
|
struct device *dma = device_get_binding(DMA_DEVICE_NAME);
|
||||||
|
|
||||||
if (!dma) {
|
if (!dma) {
|
||||||
|
@ -49,6 +57,10 @@ static int test_task(uint32_t chan_id, uint32_t blen)
|
||||||
return TC_FAIL;
|
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.channel_direction = MEMORY_TO_MEMORY;
|
||||||
dma_cfg.source_data_size = 1U;
|
dma_cfg.source_data_size = 1U;
|
||||||
dma_cfg.dest_data_size = 1U;
|
dma_cfg.dest_data_size = 1U;
|
||||||
|
@ -59,6 +71,9 @@ static int test_task(uint32_t chan_id, uint32_t blen)
|
||||||
dma_cfg.error_callback_en = 1U;
|
dma_cfg.error_callback_en = 1U;
|
||||||
dma_cfg.block_count = 1U;
|
dma_cfg.block_count = 1U;
|
||||||
dma_cfg.head_block = &dma_block_cfg;
|
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",
|
TC_PRINT("Preparing DMA Controller: Chan_ID=%u, BURST_LEN=%u\n",
|
||||||
chan_id, blen >> 3);
|
chan_id, blen >> 3);
|
||||||
|
|
|
@ -17,10 +17,20 @@
|
||||||
#define SLEEPTIME 1000
|
#define SLEEPTIME 1000
|
||||||
|
|
||||||
#define TRANSFER_LOOPS (5)
|
#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";
|
#if CONFIG_NOCACHE_MEMORY
|
||||||
static char rx_data[TRANSFER_LOOPS][RX_BUFF_SIZE] = {{ 0 } };
|
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"
|
#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)
|
static void test_transfer(struct device *dev, uint32_t id)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
transfer_count++;
|
transfer_count++;
|
||||||
if (transfer_count < TRANSFER_LOOPS) {
|
if (transfer_count < TRANSFER_LOOPS) {
|
||||||
dma_block_cfg.block_size = strlen(tx_data);
|
dma_block_cfg.block_size = strlen(tx_data);
|
||||||
|
@ -70,6 +79,13 @@ void main(void)
|
||||||
DMA_DEVICE_NAME);
|
DMA_DEVICE_NAME);
|
||||||
printk("Preparing DMA Controller\n");
|
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);
|
dma = device_get_binding(DMA_DEVICE_NAME);
|
||||||
if (!dma) {
|
if (!dma) {
|
||||||
printk("Cannot get dma controller\n");
|
printk("Cannot get dma controller\n");
|
||||||
|
@ -85,10 +101,15 @@ void main(void)
|
||||||
dma_cfg.dma_callback = dma_user_callback;
|
dma_cfg.dma_callback = dma_user_callback;
|
||||||
dma_cfg.block_count = 1U;
|
dma_cfg.block_count = 1U;
|
||||||
dma_cfg.head_block = &dma_block_cfg;
|
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;
|
chan_id = 0U;
|
||||||
|
transfer_count = 0;
|
||||||
printk("Starting the transfer and waiting for 1 second\n");
|
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.block_size = strlen(tx_data);
|
||||||
dma_block_cfg.source_address = (uint32_t)tx_data;
|
dma_block_cfg.source_address = (uint32_t)tx_data;
|
||||||
dma_block_cfg.dest_address = (uint32_t)rx_data[transfer_count];
|
dma_block_cfg.dest_address = (uint32_t)rx_data[transfer_count];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue