Skip to content

Commit 341f635

Browse files
committedApr 18, 2015
litescope: add PCIe driver (mmap/Sysfs) and use it on litepcie example design
1 parent 602eaf6 commit 341f635

File tree

2 files changed

+60
-0
lines changed
  • misoclib
    • com/litepcie/example_designs/test
    • tools/litescope/host/driver

2 files changed

+60
-0
lines changed
 

Diff for: ‎misoclib/com/litepcie/example_designs/test/make.py

+5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ def _get_args():
1010
parser.add_argument("--baudrate", default=115200, help="UART baudrate")
1111
parser.add_argument("--ip_address", default="192.168.0.42", help="Etherbone IP address")
1212
parser.add_argument("--udp_port", default=20000, help="Etherbone UDP port")
13+
parser.add_argument("--bar", default="/sys/bus/pci/devices/0000:04:00.0/resource0", help="PCIe BAR")
14+
parser.add_argument("--bar_size", default=1*1024*1024, help="PCIe BAR size")
1315
parser.add_argument("--busword", default=32, help="CSR busword")
1416

1517
parser.add_argument("test", nargs="+", help="specify a test")
@@ -25,6 +27,9 @@ def _get_args():
2527
elif args.bridge == "etherbone":
2628
from misoclib.tools.litescope.host.driver.etherbone import LiteScopeEtherboneDriver
2729
wb = LiteScopeEtherboneDriver(args.ip_address, int(args.udp_port), "./csr.csv", int(args.busword), debug=False)
30+
elif args.bridge == "pcie":
31+
from misoclib.tools.litescope.host.driver.pcie import LiteScopePCIeDriver
32+
wb = LiteScopePCIeDriver(args.bar, args.bar_size, "./csr.csv", int(args.busword), debug=False)
2833
else:
2934
ValueError("Invalid bridge {}".format(args.bridge))
3035

Diff for: ‎misoclib/tools/litescope/host/driver/pcie.py

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
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

Comments
 (0)
Please sign in to comment.