summaryrefslogtreecommitdiff
path: root/tools/proxyclient/experiments/spi.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/proxyclient/experiments/spi.py')
-rw-r--r--tools/proxyclient/experiments/spi.py182
1 files changed, 182 insertions, 0 deletions
diff --git a/tools/proxyclient/experiments/spi.py b/tools/proxyclient/experiments/spi.py
new file mode 100644
index 0000000..82d9528
--- /dev/null
+++ b/tools/proxyclient/experiments/spi.py
@@ -0,0 +1,182 @@
+import sys, pathlib
+sys.path.append(str(pathlib.Path(__file__).resolve().parents[1]))
+
+from m1n1.setup import *
+from m1n1 import asm
+from m1n1.shell import run_shell
+from m1n1.gpiola import GPIOLogicAnalyzer
+from m1n1.hw.spi import *
+
+p.smp_start_secondaries()
+
+p.set32(0x28e580208, 1<<31)
+p.clear32(0x28e580208, 1<<31)
+
+spi = u.adt["arm-io/spi3"].get_reg(0)[0]
+regs = SPIRegs(u, spi)
+
+mon.add(spi, 0x10)
+mon.add(spi + 0x30, 0x10)
+mon.add(spi + 0x40, 0x400)
+
+aic = u.adt["arm-io/aic"].get_reg(0)[0]
+mon.add(aic + 0x6800 + (1109 // 32) * 4, 4)
+
+gpio = u.adt["arm-io/gpio0"].get_reg(0)[0]
+
+mon.add(gpio, 0x1c8)
+mon.add(gpio+0x1e0, 0x300)
+
+mon.poll()
+
+m = GPIOLogicAnalyzer(u, "arm-io/gpio0",
+ pins={"miso": 0x34, "mosi": 0x35, "clk": 0x36, "cs": 0x37},
+ #pins={"miso": 0xa, "mosi": 0xb, "clk": 0x20, "cs": 0x21},
+ #pins={"clk": 46, "mosi": 47, "miso": 48, "cs": 49},
+ div=1, on_pin_change=False)
+
+#p.write32(spi + 0x100, 0xffffffff)
+
+regs.CTRL.val = 0xc
+regs.PIN.val = 0x2
+regs.CONFIG.val = 0x20 | (1<<15) | 6
+regs.CONFIG.val = 0x20 | (1<<15) | 4
+regs.CONFIG.val = 0x20 | (1<<15) | 2
+regs.CONFIG.val = 0x20 | (3<<15) | 0
+
+def try_all_bits():
+ for i in range(0, 0x200, 4):
+ v = p.read32(spi + i)
+ for j in range(32):
+ p.write32(spi + i, v ^ (1<<j))
+ print(f"{i:4x}:{v:8x}:{j:2d} FIFO level:", regs.FIFO_LEVEL.reg.LEVEL_TX)
+ mon.poll()
+ p.write32(spi + i, v)
+
+
+m.regs = {
+ "CTRL": (spi + 0x00, R_CTRL),
+ "STATUS": (spi + 0x08, R_STATUS),
+ "RXCNT": (spi + 0x34),
+ "TXCNT": (spi + 0x4c),
+ "FIFO_STAT": (spi + 0x10c, R_FIFO_STAT),
+ "ISTATUS1": (spi + 0x134, R_ISTATUS1),
+ "ISTATUS2": (spi + 0x13c, R_ISTATUS2),
+ "XFSTATUS": (spi + 0x1c0),
+ "SHIFTCONFIG": (spi + 0x150),
+ "PINCONFIG": (spi + 0x154),
+ "PIN": (spi + 0xc),
+ "3c": (spi + 0x3c),
+ "DIVSTATUS": (spi + 0x1e0, R_DIVSTATUS)
+}
+
+m.regs = {}
+
+m.start(300000, bufsize=0x80000)
+
+
+regs.STATUS.val = 0xffffffff
+regs.ISTATUS1.val = 0xffffffff
+regs.ISTATUS2.val = 0xffffffff
+
+regs.CLKDIV.val = 0xfff
+regs.INTER_DLY.val = 0x1000
+
+regs.SHIFTCONFIG.val = 0x20fcf7
+
+regs.PIN.val = 0x2
+print("pinconfig", hex(regs.PINCONFIG.val))
+regs.PINCONFIG.val = 0x100
+#regs.PINCONFIG.val = 0x2-7
+print("pinconfig", hex(regs.PINCONFIG.val))
+print("shiftconfig", hex(regs.SHIFTCONFIG.val))
+
+#regs.PIN.val = 0x0
+#regs.PIN.val = 0x2
+# auto_cs OR pin_cs
+
+#p.write32(spi + 0x150, 0x80c07)
+#p.write32(spi + 0x150, 0x88c07)
+print(hex(p.read32(spi + 0x150)))
+
+#p.write32(spi + 0x160, 0)
+p.write32(spi + 0x160, 0xfff0020)
+p.write32(spi + 0x168, 0xffffb20)
+#p.write32(spi + 0x164, 0x06000210)
+#p.write32(spi + 0x180, 0x02000000)
+#p.write32(spi + 0x18c, 0x500)
+#regs.INTER_DLY2 = 0x20000001
+
+p.write32(spi + 0x200, 0x0010)
+
+p.write32(spi + 0x3c, 0xffffffff)
+
+regs.PINCONFIG.val = 0x002
+regs.PINCONFIG.val = 0x200
+
+
+#p.write32(0x28e0380bc, 0x80100000)
+#p.write32(0x28e0380c4, 0x80100000)
+
+data = b"Asahi Linux"
+
+for i in range(2):
+ for j in data:
+ regs.TXDATA.val = j
+ regs.RXCNT.val = len(data)
+ regs.TXCNT.val = len(data)
+
+ regs.STATUS.val = 0xffffffff
+ regs.ISTATUS1.val = 0xffffffff
+ regs.ISTATUS2.val = 0xffffffff
+
+ regs.PIN.val = 0x0
+ regs.CTRL.val = 0x1
+ #regs.TXDATA.val = 0xff
+ #regs.TXDATA.val = 0xff
+
+ i = 0
+ while regs.TXCNT.val != 0:
+ print(f"{regs.TXCNT.val:#x} {regs.FIFO_STAT.reg} {regs.STATUS.val:#x} {regs.ISTATUS2.val:#x} {p.read32(spi + 0x134):#x}")
+ regs.STATUS.val = 0xffffffff
+ regs.ISTATUS1.val = 0xffffffff
+ regs.ISTATUS2.val = 0xffffffff
+ #regs.CTRL.val = 0x0
+ #time.sleep(0.1)
+ #regs.CTRL.val = 0x1[
+ print(hex(i))
+ #p.write32(spi + i, 0xffffffff)
+ #p.write32(spi + i, 0)
+ i += 4
+ if i > 0x100:
+ break
+ time.sleep(0.001)
+ print(f"{regs.RXCNT.val:#x} {regs.FIFO_STAT.reg} {regs.STATUS.val:#x} {regs.ISTATUS2.val:#x}")
+ regs.STATUS.val = 0xffffffff
+ regs.ISTATUS1.val = 0xffffffff
+ regs.ISTATUS2.val = 0xffffffff
+
+ mon.poll()
+
+ while regs.FIFO_STAT.reg.LEVEL_RX:
+ print("RX", hex(regs.RXDATA.val))
+
+ regs.CTRL.val = 0
+
+m.complete()
+m.show()
+
+def poll(count=1000):
+ lval = None
+ for i in range(count):
+ pins = 0x35, 0x36, 0x37
+ vals = [p.read32(gpio + 4 * pin) & 1 for pin in pins]
+ if vals != lval:
+ print(f"{i:6d}: {vals}")
+ lval = vals
+
+mon.poll()
+
+#run_shell(globals(), msg="Have fun!")
+
+