import machine from uctypes import BF_POS, BF_LEN, UINT32, BFUINT32, struct, addressof ## configure DMA BASE = const(0x50000000) CHAN_WIDTH = const(0x40) CHAN_COUNT = const(12) def dma_num_tempy(x): return BASE + CHAN_WIDTH * x ## ex: dma_num(7) def hexmem(x): return hex(machine.mem32[x]) def hexaddr(x): return hex(addressof(x)) def print_friendly(u32): a = (u32 & 0xFF000000) >> 24 b = (u32 & 0x00FF0000) >> 16 c = (u32 & 0x0000FF00) >> 8 d = (u32 & 0x000000FF) print(f'{a:#010b} {b:#010b} {c:#010b} {d:#010b}') def dma_scan(): used = [] for i in range(12): ctrl_reg_contents = machine.mem32[dma_num_tempy(i)+0x10] if ctrl_reg_contents != 0: used.append(i) print(f"{i:02}: {ctrl_reg_contents:#034b}") print(f"Used DMAs: {used}") def dma_debug(dma): base=addressof(dma.registers) print(f"READ: {dma.registers[0]:x} WRITE: {dma.registers[1]:x} COUNT next: {machine.mem32[base+0x804]} current: {machine.mem32[base+0x08]}") print(dma.unpack_ctrl(dma.ctrl)) print("\n") ## Control fields, packed into a nice structure ## cribbed from rp2040_pio_dma.py ## Thanks to https://github.com/benevpi/MicroPython_PIO_Music_DMA/blob/main/rp2040_pio_dma.py DMA_CTRL_FIELDS = { "AHB_ERROR": 31<