diff --git a/litex/tools/remote/comm_pcie.py b/litex/tools/remote/comm_pcie.py index 6d2b0e88a..6f477b023 100644 --- a/litex/tools/remote/comm_pcie.py +++ b/litex/tools/remote/comm_pcie.py @@ -1,35 +1,33 @@ -# This file is Copyright (c) 2015-2019 Florent Kermarrec +# This file is Copyright (c) 2015-2020 Florent Kermarrec # License: BSD +import os +import ctypes import mmap - class CommPCIe: def __init__(self, bar, debug=False): - self.bar = bar + self.bar = bar self.debug = debug def open(self): - if hasattr(self, "sysfs"): + if hasattr(self, "file"): return - self.sysfs = open(self.bar, "r+b") - self.sysfs.flush() - self.mmap = mmap.mmap(self.sysfs.fileno(), 0) + self.file = os.open(self.bar, os.O_RDWR | os.O_SYNC) + self.mmap = mmap.mmap(self.file, 0) def close(self): - if not hasattr(self, "sysfs"): + if not hasattr(self, "file"): return + self.file.close() + del self.file self.mmap.close() - del self.mmap - self.sysfs.close() - del self.sysfs def read(self, addr, length=None): data = [] length_int = 1 if length is None else length for i in range(length_int): - self.mmap.seek(addr + 4*i) - value = int.from_bytes(self.mmap.read(4), byteorder="little") + value = ctypes.c_uint32.from_buffer(self.mmap, addr + 4*i).value if self.debug: print("read {:08x} @ {:08x}".format(value, addr + 4*i)) if length is None: @@ -41,6 +39,6 @@ class CommPCIe: data = data if isinstance(data, list) else [data] length = len(data) for i, value in enumerate(data): - self.mmap[addr + 4*i:addr + 4*(i + 1)] = value.to_bytes(4, byteorder="little") + ctypes.c_uint32.from_buffer(self.mmap, addr + 4*i).value = value if self.debug: print("write {:08x} @ {:08x}".format(value, addr + 4*i))