tools/remote/comm_pcie: use ctypes.c_uint32 to do 32-bit accesses and avoid double...
authorFlorent Kermarrec <florent@enjoy-digital.fr>
Tue, 30 Jun 2020 12:12:35 +0000 (14:12 +0200)
committerFlorent Kermarrec <florent@enjoy-digital.fr>
Tue, 30 Jun 2020 12:12:35 +0000 (14:12 +0200)
litex/tools/remote/comm_pcie.py

index 6d2b0e88ad9e0704124ce50cd79fef5162ff18ba..6f477b02393d102feff530e672b555f4436e3c04 100644 (file)
@@ -1,35 +1,33 @@
-# This file is Copyright (c) 2015-2019 Florent Kermarrec <florent@enjoy-digital.fr>
+# This file is Copyright (c) 2015-2020 Florent Kermarrec <florent@enjoy-digital.fr>
 # 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))