2015-02-18 09:32:34 -05:00
|
|
|
import serial
|
|
|
|
from struct import *
|
2015-02-28 04:27:16 -05:00
|
|
|
from misoclib.tools.litescope.host.driver.reg import *
|
2015-02-18 09:32:34 -05:00
|
|
|
|
2015-04-13 07:18:21 -04:00
|
|
|
|
2015-02-18 09:32:34 -05:00
|
|
|
def write_b(uart, data):
|
2015-04-13 07:23:48 -04:00
|
|
|
uart.write(pack('B', data))
|
2015-02-18 09:32:34 -05:00
|
|
|
|
2015-04-13 07:18:21 -04:00
|
|
|
|
2015-02-18 09:32:34 -05:00
|
|
|
class LiteScopeUARTDriver:
|
2015-04-13 07:09:44 -04:00
|
|
|
cmds = {
|
2015-04-13 07:25:27 -04:00
|
|
|
"write": 0x01,
|
|
|
|
"read": 0x02
|
2015-04-13 07:09:44 -04:00
|
|
|
}
|
|
|
|
def __init__(self, port, baudrate=115200, addrmap=None, busword=8, debug=False):
|
|
|
|
self.port = port
|
|
|
|
self.baudrate = str(baudrate)
|
|
|
|
self.debug = debug
|
|
|
|
self.uart = serial.Serial(port, baudrate, timeout=0.25)
|
|
|
|
if addrmap is not None:
|
|
|
|
self.regs = build_map(addrmap, busword, self.read, self.write)
|
2015-02-18 09:32:34 -05:00
|
|
|
|
2015-04-13 07:09:44 -04:00
|
|
|
def open(self):
|
|
|
|
self.uart.flushOutput()
|
|
|
|
self.uart.close()
|
|
|
|
self.uart.open()
|
|
|
|
self.uart.flushInput()
|
|
|
|
try:
|
|
|
|
self.regs.uart2wb_sel.write(1)
|
|
|
|
except:
|
|
|
|
pass
|
2015-02-18 09:32:34 -05:00
|
|
|
|
2015-04-13 07:09:44 -04:00
|
|
|
def close(self):
|
|
|
|
try:
|
|
|
|
self.regs.uart2wb_sel.write(0)
|
|
|
|
except:
|
|
|
|
pass
|
|
|
|
self.uart.flushOutput()
|
|
|
|
self.uart.close()
|
2015-02-18 09:32:34 -05:00
|
|
|
|
2015-04-13 07:09:44 -04:00
|
|
|
def read(self, addr, burst_length=None, repeats=None):
|
|
|
|
datas = []
|
|
|
|
def to_int(v):
|
|
|
|
return 1 if v is None else v
|
|
|
|
for i in range(to_int(repeats)):
|
|
|
|
self.uart.flushInput()
|
|
|
|
write_b(self.uart, self.cmds["read"])
|
|
|
|
write_b(self.uart, burst_length)
|
|
|
|
write_b(self.uart, (addr//4 & 0xff000000) >> 24)
|
|
|
|
write_b(self.uart, (addr//4 & 0x00ff0000) >> 16)
|
|
|
|
write_b(self.uart, (addr//4 & 0x0000ff00) >> 8)
|
|
|
|
write_b(self.uart, (addr//4 & 0x000000ff))
|
|
|
|
for j in range(to_int(burst_length)):
|
|
|
|
data = 0
|
|
|
|
for k in range(4):
|
|
|
|
data = data << 8
|
|
|
|
data |= ord(self.uart.read())
|
|
|
|
if self.debug:
|
2015-04-13 07:37:46 -04:00
|
|
|
print("RD {:08X} @ {:08X}".format(data, (addr+j)*4))
|
2015-04-13 07:09:44 -04:00
|
|
|
datas.append(data)
|
|
|
|
return datas
|
2015-02-18 09:32:34 -05:00
|
|
|
|
2015-04-13 07:09:44 -04:00
|
|
|
def write(self, addr, data):
|
|
|
|
if isinstance(data, list):
|
|
|
|
burst_length = len(data)
|
|
|
|
else:
|
|
|
|
burst_length = 1
|
|
|
|
write_b(self.uart, self.cmds["write"])
|
|
|
|
write_b(self.uart, burst_length)
|
|
|
|
write_b(self.uart, (addr//4 & 0xff000000) >> 24)
|
|
|
|
write_b(self.uart, (addr//4 & 0x00ff0000) >> 16)
|
|
|
|
write_b(self.uart, (addr//4 & 0x0000ff00) >> 8)
|
|
|
|
write_b(self.uart, (addr//4 & 0x000000ff))
|
|
|
|
if isinstance(data, list):
|
|
|
|
for i in range(len(data)):
|
|
|
|
dat = data[i]
|
|
|
|
for j in range(4):
|
|
|
|
write_b(self.uart, (dat & 0xff000000) >> 24)
|
|
|
|
dat = dat << 8
|
|
|
|
if self.debug:
|
2015-04-13 07:37:46 -04:00
|
|
|
print("WR {:08X} @ {:08X}".format(data[i], (addr + i)*4))
|
2015-04-13 07:09:44 -04:00
|
|
|
else:
|
|
|
|
dat = data
|
|
|
|
for j in range(4):
|
|
|
|
write_b(self.uart, (dat & 0xff000000) >> 24)
|
|
|
|
dat = dat << 8
|
|
|
|
if self.debug:
|
2015-04-13 07:37:46 -04:00
|
|
|
print("WR {:08X} @ {:08X}".format(data, (addr * 4)))
|