summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/ports/stm32_hardware/dma_alignment.py88
-rw-r--r--tests/ports/stm32_hardware/dma_alignment.py.exp2
2 files changed, 52 insertions, 38 deletions
diff --git a/tests/ports/stm32_hardware/dma_alignment.py b/tests/ports/stm32_hardware/dma_alignment.py
index 1836b25d8..1c271d48e 100644
--- a/tests/ports/stm32_hardware/dma_alignment.py
+++ b/tests/ports/stm32_hardware/dma_alignment.py
@@ -1,43 +1,59 @@
-from machine import SPI
# Regression test for DMA for DCache coherency bugs with cache line
# written originally for https://github.com/micropython/micropython/issues/13471
# IMPORTANT: This test requires SPI2 MISO (pin Y8 on Pyboard D) to be connected to GND
+import unittest
+from machine import SPI
+
SPI_NUM = 2
+BAUDRATE = 5_000_000
+
+
+class Test(unittest.TestCase):
+ @classmethod
+ def setUpClass(cls):
+ cls.spi = SPI(SPI_NUM, baudrate=BAUDRATE)
+ cls.skip_slow_test = False
+
+ def test_variable_offset_fixed_length(self):
+ buf = bytearray(1024)
+ for offs in range(0, len(buf)):
+ v = memoryview(buf)[offs : offs + 128]
+ self.spi.readinto(v, 0xFF)
+ ok = all(b == 0x00 for b in v)
+ if not ok:
+ print(offs, v.hex())
+ self.skip_slow_test = True
+ self.assertTrue(ok)
+
+ def test_variable_offset_and_lengths(self):
+ # this takes around 30s to run, so skipped if already failing
+ if self.skip_slow_test:
+ self.skipTest("already failing")
+
+ buf = bytearray(1024)
+ for op_len in range(1, 66):
+ print(op_len)
+ wr = b"\xff" * op_len
+ for offs in range(1, len(buf) - op_len - 1):
+ # Place some "sentinel" values before and after the DMA buffer
+ before = offs & 0xFF
+ after = (~offs) & 0xFF
+ buf[offs - 1] = before
+ buf[offs + op_len] = after
+ v = memoryview(buf)[offs : offs + op_len]
+ self.spi.write_readinto(wr, v)
+ ok = (
+ all(b == 0x00 for b in v)
+ and buf[offs - 1] == before
+ and buf[offs + op_len] == after
+ )
+ if not ok:
+ print(v.hex())
+ print(hex(op_len), hex(offs), hex(buf[offs - 1]), hex(buf[offs + op_len]))
+ self.assertTrue(ok)
+
-spi = SPI(SPI_NUM, baudrate=5_000_000)
-buf = bytearray(1024)
-ok = True
-
-for offs in range(0, len(buf)):
- v = memoryview(buf)[offs : offs + 128]
- spi.readinto(v, 0xFF)
- if not all(b == 0x00 for b in v):
- print(offs, v.hex())
- ok = False
-
-print("Variable offset fixed length " + ("OK" if ok else "FAIL"))
-
-# this takes around 30s to run, so skipped if already failing
-if ok:
- for op_len in range(1, 66):
- wr = b"\xFF" * op_len
- for offs in range(1, len(buf) - op_len - 1):
- # Place some "sentinel" values before and after the DMA buffer
- before = offs & 0xFF
- after = (~offs) & 0xFF
- buf[offs - 1] = before
- buf[offs + op_len] = after
- v = memoryview(buf)[offs : offs + op_len]
- spi.write_readinto(wr, v)
- if (
- not all(b == 0x00 for b in v)
- or buf[offs - 1] != before
- or buf[offs + op_len] != after
- ):
- print(v.hex())
- print(hex(op_len), hex(offs), hex(buf[offs - 1]), hex(buf[offs + op_len]))
- ok = False
-
- print("Variable offset and lengths " + ("OK" if ok else "FAIL"))
+if __name__ == "__main__":
+ unittest.main()
diff --git a/tests/ports/stm32_hardware/dma_alignment.py.exp b/tests/ports/stm32_hardware/dma_alignment.py.exp
deleted file mode 100644
index e890e0081..000000000
--- a/tests/ports/stm32_hardware/dma_alignment.py.exp
+++ /dev/null
@@ -1,2 +0,0 @@
-Variable offset fixed length OK
-Variable offset and lengths OK