Skip to content

Commit 50b809c

Browse files
committed
tests/ports/rp2: Add rp2-specific tests with a test for rp2.DMA.
Signed-off-by: Damien George <damien@micropython.org>
1 parent 7bbcee3 commit 50b809c

3 files changed

Lines changed: 107 additions & 1 deletion

File tree

tests/ports/rp2/rp2_dma.py

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# Test rp2.DMA functionality.
2+
3+
import time
4+
import machine
5+
import rp2
6+
7+
src = bytes(i & 0xFF for i in range(16 * 1024))
8+
9+
print("# test basic usage")
10+
11+
dma = rp2.DMA()
12+
print(dma)
13+
print(rp2.DMA.unpack_ctrl(dma.pack_ctrl()))
14+
dma.read = 0
15+
dma.write = 0
16+
dma.count = 0
17+
dma.ctrl = dma.pack_ctrl()
18+
print(dma.read, dma.write, dma.count, dma.ctrl & 0x01FFFFFF, dma.channel, dma.registers)
19+
dma.close()
20+
21+
# Test closing when already closed.
22+
dma.close()
23+
24+
# Test using when closed.
25+
try:
26+
dma.active()
27+
assert False
28+
except ValueError:
29+
print("ValueError")
30+
31+
# Test simple memory copy.
32+
print("# test memory copy")
33+
dest = bytearray(1024)
34+
dma = rp2.DMA()
35+
dma.config(read=src, write=dest, count=len(dest) // 4, ctrl=dma.pack_ctrl(), trigger=False)
36+
print(not any(dest))
37+
dma.active(True)
38+
while dma.active():
39+
pass
40+
print(dest[:8], dest[-8:])
41+
dma.close()
42+
43+
44+
# Test time taken for a large memory copy.
45+
def run_and_time_dma(dma):
46+
ticks_us = time.ticks_us
47+
irq_state = machine.disable_irq()
48+
t0 = ticks_us()
49+
dma.active(True)
50+
while dma.active():
51+
pass
52+
t1 = ticks_us()
53+
machine.enable_irq(irq_state)
54+
return time.ticks_diff(t1, t0)
55+
56+
57+
print("# test timing")
58+
dest = bytearray(16 * 1024)
59+
dma = rp2.DMA()
60+
dma.read = src
61+
dma.write = dest
62+
dma.count = len(dest) // 4
63+
dma.ctrl = dma.pack_ctrl()
64+
dt = run_and_time_dma(dma)
65+
print(60 <= dt <= 90)
66+
print(dest[:8], dest[-8:])
67+
dma.close()
68+
69+
# Test using .config(trigger=True).
70+
print("# test immediate trigger")
71+
dest = bytearray(1024)
72+
dma = rp2.DMA()
73+
dma.config(read=src, write=dest, count=len(dest) // 4, ctrl=dma.pack_ctrl(), trigger=True)
74+
while dma.active():
75+
pass
76+
print(dest[:8], dest[-8:])
77+
dma.close()
78+
79+
# Test the DMA.irq() method.
80+
print("# test irq")
81+
dest = bytearray(1024)
82+
dma = rp2.DMA()
83+
dma.irq(lambda _: print("irq fired"))
84+
dma.config(
85+
read=src, write=dest, count=len(dest) // 4, ctrl=dma.pack_ctrl(irq_quiet=0), trigger=True
86+
)
87+
while dma.active():
88+
pass
89+
print(dest[:8], dest[-8:])
90+
dma.close()

tests/ports/rp2/rp2_dma.py.exp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# test basic usage
2+
DMA(0)
3+
{'inc_read': 1, 'high_pri': 0, 'write_err': 0, 'ring_sel': 0, 'enable': 1, 'treq_sel': 63, 'sniff_en': 0, 'irq_quiet': 1, 'read_err': 0, 'chain_to': 0, 'busy': 0, 'inc_write': 1, 'ring_size': 0, 'bswap': 0, 'size': 2, 'ahb_err': 0}
4+
0 0 0 4161593 0 <memoryview>
5+
ValueError
6+
# test memory copy
7+
True
8+
bytearray(b'\x00\x01\x02\x03\x04\x05\x06\x07') bytearray(b'\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff')
9+
# test timing
10+
True
11+
bytearray(b'\x00\x01\x02\x03\x04\x05\x06\x07') bytearray(b'\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff')
12+
# test immediate trigger
13+
bytearray(b'\x00\x01\x02\x03\x04\x05\x06\x07') bytearray(b'\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff')
14+
# test irq
15+
irq fired
16+
bytearray(b'\x00\x01\x02\x03\x04\x05\x06\x07') bytearray(b'\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff')

tests/run-tests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1040,7 +1040,7 @@ def main():
10401040
elif args.target in ("renesas-ra"):
10411041
test_dirs += ("float", "inlineasm", "ports/renesas-ra")
10421042
elif args.target == "rp2":
1043-
test_dirs += ("float", "stress", "inlineasm", "thread")
1043+
test_dirs += ("float", "stress", "inlineasm", "thread", "ports/rp2")
10441044
elif args.target in ("esp8266", "esp32", "minimal", "nrf"):
10451045
test_dirs += ("float",)
10461046
elif args.target == "wipy":

0 commit comments

Comments
 (0)