Skip to content

Commit 713f1a1

Browse files
committed
[TEST/DMA] Add DMA Engine test
Signed-off-by: GuEe-GUI <[email protected]>
1 parent e7ea49b commit 713f1a1

File tree

1 file changed

+146
-0
lines changed

1 file changed

+146
-0
lines changed

examples/test/dma_test.c

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
/*
2+
* Copyright (c) 2006-2021, RT-Thread Development Team
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*
6+
* Change Logs:
7+
* Date Author Notes
8+
* 2023-02-25 GuEe-GUI the first version
9+
*/
10+
11+
#include <rthw.h>
12+
#include <rtthread.h>
13+
#include <rtdevice.h>
14+
15+
#if defined(RT_USING_DMA) && defined(RT_USING_FINSH)
16+
#include <stdlib.h>
17+
18+
static void test_dma_callback(struct rt_dma_chan *chan, rt_size_t size)
19+
{
20+
rt_bool_t *done_ptr = chan->priv;
21+
22+
*done_ptr = RT_TRUE;
23+
rt_hw_wmb();
24+
}
25+
26+
static int dma_memcpy_test(int argc, char**argv)
27+
{
28+
rt_bool_t done;
29+
int dma_sz = 64;
30+
rt_ubase_t dma_addr;
31+
char *src_addr, *dst_addr;
32+
struct rt_device dev = {};
33+
struct rt_dma_slave_config config;
34+
struct rt_dma_slave_transfer transfer;
35+
struct rt_dma_chan *chn = rt_dma_chan_request(&dev, RT_NULL);
36+
37+
if (rt_is_err_or_null(chn))
38+
{
39+
rt_kputs("Alloc DMA channel fail");
40+
return 0;
41+
}
42+
43+
if (argc > 1)
44+
{
45+
dma_sz = atoi(argv[1]);
46+
}
47+
48+
if (dma_sz % sizeof(rt_uint32_t))
49+
{
50+
dma_sz = RT_ALIGN_DOWN(dma_sz, sizeof(rt_uint32_t));
51+
rt_kprintf("DMA size align to %d\n", dma_sz);
52+
}
53+
54+
if (!(src_addr = rt_dma_alloc_coherent(&dev, dma_sz, &dma_addr)))
55+
{
56+
rt_kprintf("Alloc DMA %s buffer(size = %d) fail\n", "SRC", dma_sz);
57+
goto _free_dma_chan;
58+
}
59+
config.src_addr = dma_addr;
60+
61+
if (!(dst_addr = rt_dma_alloc_coherent(&dev, dma_sz, &dma_addr)))
62+
{
63+
rt_kprintf("Alloc DMA %s buffer(size = %d) fail\n", "DST", dma_sz);
64+
goto _free_src_addr;
65+
}
66+
config.dst_addr = dma_addr;
67+
68+
config.direction = RT_DMA_MEM_TO_MEM;
69+
config.src_addr_width = sizeof(rt_uint32_t);
70+
config.src_maxburst = sizeof(rt_uint32_t);
71+
config.dst_addr_width = sizeof(rt_uint32_t);
72+
config.dst_maxburst = sizeof(rt_uint32_t);
73+
74+
chn->callback = test_dma_callback;
75+
chn->priv = &done;
76+
if (rt_dma_chan_config(chn, &config))
77+
{
78+
rt_kprintf("DMA channel %s fail\n", "config");
79+
goto _free_dst_addr;
80+
}
81+
82+
rt_memset(&transfer, 0, sizeof(transfer));
83+
transfer.src_addr = config.src_addr;
84+
transfer.dst_addr = config.dst_addr;
85+
transfer.buffer_len = dma_sz;
86+
87+
if (rt_dma_prep_memcpy(chn, &transfer))
88+
{
89+
rt_kprintf("DMA channel %s fail\n", "prep");
90+
goto _free_dst_addr;
91+
}
92+
93+
rt_memset(src_addr, 0xff, dma_sz);
94+
rt_memset(dst_addr, 0, dma_sz);
95+
96+
rt_kprintf("%s %s:\n", "SRC", "start");
97+
for (int i = 0; i < dma_sz; ++i)
98+
{
99+
rt_kprintf("%02x ", src_addr[i]);
100+
}
101+
rt_kputs("\n");
102+
103+
rt_kprintf("%s %s:\n", "DST", "start");
104+
for (int i = 0; i < dma_sz; ++i)
105+
{
106+
rt_kprintf("%02x ", dst_addr[i]);
107+
}
108+
rt_kputs("\n");
109+
110+
done = RT_FALSE;
111+
if (rt_dma_chan_start(chn))
112+
{
113+
rt_kprintf("DMA channel %s fail\n", "start");
114+
goto _free_dst_addr;
115+
}
116+
117+
while (!done)
118+
{
119+
rt_hw_cpu_relax();
120+
}
121+
122+
rt_kprintf("%s %s:\n", "SRC", "end");
123+
for (int i = 0; i < dma_sz; ++i)
124+
{
125+
rt_kprintf("%02x ", src_addr[i]);
126+
}
127+
rt_kputs("\n");
128+
129+
rt_kprintf("%s %s:\n", "DST", "end");
130+
for (int i = 0; i < dma_sz; ++i)
131+
{
132+
rt_kprintf("%02x ", dst_addr[i]);
133+
}
134+
rt_kputs("\n");
135+
136+
_free_dst_addr:
137+
rt_dma_free_coherent(&dev, dma_sz, dst_addr, config.dst_addr);
138+
_free_src_addr:
139+
rt_dma_free_coherent(&dev, dma_sz, src_addr, config.src_addr);
140+
_free_dma_chan:
141+
rt_dma_chan_release(chn);
142+
143+
return 0;
144+
}
145+
MSH_CMD_EXPORT(dma_memcpy_test, test dma memcpy e.g: dma_memcpy_test(64));
146+
#endif /* RT_USING_DMA && RT_USING_FINSH */

0 commit comments

Comments
 (0)