|
| 1 | +import string |
| 2 | +import mmap |
| 3 | +from misoclib.tools.litescope.host.driver.reg import * |
| 4 | + |
| 5 | + |
| 6 | +class LiteScopePCIeDriver: |
| 7 | + def __init__(self, bar, bar_size, addrmap=None, busword=8, debug=False): |
| 8 | + self.bar = bar |
| 9 | + self.bar_size = bar_size |
| 10 | + self.debug = debug |
| 11 | + self.f = None |
| 12 | + self.mmap = None |
| 13 | + self.regs = build_map(addrmap, busword, self.read, self.write) |
| 14 | + |
| 15 | + def open(self): |
| 16 | + self.f = open(self.bar, "r+b") |
| 17 | + self.f.flush() |
| 18 | + self.mmap = mmap.mmap(self.f.fileno(), self.bar_size) |
| 19 | + |
| 20 | + def close(self): |
| 21 | + self.mmap.close() |
| 22 | + self.f.close() |
| 23 | + |
| 24 | + def read(self, addr, burst_length=None, repeats=None): |
| 25 | + if repeats is not None: |
| 26 | + raise NotImplementedError |
| 27 | + values = [] |
| 28 | + for i in range(burst_length): |
| 29 | + self.mmap.seek(addr + 4*i) |
| 30 | + dat = self.mmap.read(4) |
| 31 | + val = dat[3] << 24 |
| 32 | + val |= dat[2] << 16 |
| 33 | + val |= dat[1] << 8 |
| 34 | + val |= dat[0] << 0 |
| 35 | + if self.debug: |
| 36 | + print("RD {:08X} @ {:08X}".format(val, addr + 4*i)) |
| 37 | + values.append(val) |
| 38 | + return values |
| 39 | + |
| 40 | + def write(self, addr, data): |
| 41 | + if isinstance(data, list): |
| 42 | + burst_length = len(data) |
| 43 | + else: |
| 44 | + burst_length = 1 |
| 45 | + data = [data] |
| 46 | + |
| 47 | + for i, dat in enumerate(data): |
| 48 | + dat_bytes = [0, 0, 0, 0] |
| 49 | + dat_bytes[3] = (dat >> 24) & 0xff |
| 50 | + dat_bytes[2] = (dat >> 16) & 0xff |
| 51 | + dat_bytes[1] = (dat >> 8) & 0xff |
| 52 | + dat_bytes[0] = (dat >> 0) & 0xff |
| 53 | + self.mmap[addr + 4*i:addr + 4*(i+1)] = bytes(dat_bytes) |
| 54 | + if self.debug: |
| 55 | + print("WR {:08X} @ {:08X}".format(dat, (addr + i)*4)) |
0 commit comments