forked from M-Labs/artiq
comm_serial: cleanup
This commit is contained in:
parent
20adb57140
commit
94218f785e
|
@ -22,7 +22,7 @@ class _H2DMsgType(Enum):
|
||||||
REQUEST_IDENT = 1
|
REQUEST_IDENT = 1
|
||||||
LOAD_OBJECT = 2
|
LOAD_OBJECT = 2
|
||||||
RUN_KERNEL = 3
|
RUN_KERNEL = 3
|
||||||
UART_SET_BDRATE = 4
|
SET_BAUD_RATE = 4
|
||||||
|
|
||||||
|
|
||||||
class _D2HMsgType(Enum):
|
class _D2HMsgType(Enum):
|
||||||
|
@ -59,32 +59,9 @@ class Comm:
|
||||||
def __init__(self, dev="/dev/ttyUSB1", baud=115200):
|
def __init__(self, dev="/dev/ttyUSB1", baud=115200):
|
||||||
self._fd = os.open(dev, os.O_RDWR | os.O_NOCTTY)
|
self._fd = os.open(dev, os.O_RDWR | os.O_NOCTTY)
|
||||||
self.port = os.fdopen(self._fd, "r+b", buffering=0)
|
self.port = os.fdopen(self._fd, "r+b", buffering=0)
|
||||||
self.dev = dev
|
self.set_baud(115200)
|
||||||
real_baud = baud
|
self.set_remote_baud(baud)
|
||||||
baud = 115200
|
|
||||||
self.set_baud(baud)
|
self.set_baud(baud)
|
||||||
if real_baud != baud:
|
|
||||||
baud = real_baud
|
|
||||||
self.set_remote_baud(baud)
|
|
||||||
self.set_baud(baud)
|
|
||||||
self.current_baud = baud
|
|
||||||
|
|
||||||
def set_remote_baud(self, baud):
|
|
||||||
clk_freq = 80000000
|
|
||||||
_write_exactly(self.port, struct.pack(
|
|
||||||
">lbl", 0x5a5a5a5a, _H2DMsgType.UART_SET_BDRATE.value,
|
|
||||||
int((baud/clk_freq)*2**32)))
|
|
||||||
handshake = 0
|
|
||||||
while handshake < 4:
|
|
||||||
recv = struct.unpack(
|
|
||||||
"B", _read_exactly(self.port, 1))
|
|
||||||
if recv[0] == 0x5a:
|
|
||||||
handshake += 1
|
|
||||||
else:
|
|
||||||
logger.debug("SYNC ERR {:02x}\n".format(int(recv[0])))
|
|
||||||
handshake = 0
|
|
||||||
self.set_baud(baud)
|
|
||||||
logger.debug("Synchronized")
|
|
||||||
|
|
||||||
def set_baud(self, baud):
|
def set_baud(self, baud):
|
||||||
iflag, oflag, cflag, lflag, ispeed, ospeed, cc = \
|
iflag, oflag, cflag, lflag, ispeed, ospeed, cc = \
|
||||||
|
@ -101,12 +78,27 @@ class Comm:
|
||||||
termios.tcdrain(self._fd)
|
termios.tcdrain(self._fd)
|
||||||
termios.tcflush(self._fd, termios.TCOFLUSH)
|
termios.tcflush(self._fd, termios.TCOFLUSH)
|
||||||
termios.tcflush(self._fd, termios.TCIFLUSH)
|
termios.tcflush(self._fd, termios.TCIFLUSH)
|
||||||
logger.debug("connected to {} at {} baud".format(self.dev, baud))
|
logger.debug("baud rate set to".format(baud))
|
||||||
|
|
||||||
|
def set_remote_baud(self, baud):
|
||||||
|
_write_exactly(self.port, struct.pack(
|
||||||
|
">lbl", 0x5a5a5a5a, _H2DMsgType.SET_BAUD_RATE.value, baud))
|
||||||
|
handshake = 0
|
||||||
|
while handshake < 4:
|
||||||
|
recv = struct.unpack(
|
||||||
|
"B", _read_exactly(self.port, 1))
|
||||||
|
if recv[0] == 0x5a:
|
||||||
|
handshake += 1
|
||||||
|
else:
|
||||||
|
# FIXME: when loading immediately after a board reset,
|
||||||
|
# we erroneously get some zeros back.
|
||||||
|
logger.warning("unexpected sync character: {:02x}".format(int(recv[0])))
|
||||||
|
handshake = 0
|
||||||
|
self.set_baud(baud)
|
||||||
|
logger.debug("synchronized")
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
if self.current_baud != 115200:
|
self.set_remote_baud(115200)
|
||||||
self.set_remote_baud(115200)
|
|
||||||
self.set_baud(115200)
|
|
||||||
self.port.close()
|
self.port.close()
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
|
@ -117,19 +109,7 @@ class Comm:
|
||||||
|
|
||||||
def _get_device_msg(self):
|
def _get_device_msg(self):
|
||||||
while True:
|
while True:
|
||||||
# FIXME: when loading immediately after a board reset,
|
(reply, ) = struct.unpack("B", _read_exactly(self.port, 1))
|
||||||
# we erroneously get some zeros back.
|
|
||||||
# Ignore them with a warning for now.
|
|
||||||
spurious_zero_count = 0
|
|
||||||
while True:
|
|
||||||
(reply, ) = struct.unpack("B", _read_exactly(self.port, 1))
|
|
||||||
if reply == 0:
|
|
||||||
spurious_zero_count += 1
|
|
||||||
else:
|
|
||||||
break
|
|
||||||
if spurious_zero_count:
|
|
||||||
logger.warning("received {} spurious zeros".format(
|
|
||||||
spurious_zero_count))
|
|
||||||
msg = _D2HMsgType(reply)
|
msg = _D2HMsgType(reply)
|
||||||
if msg == _D2HMsgType.LOG:
|
if msg == _D2HMsgType.LOG:
|
||||||
(length, ) = struct.unpack(">h", _read_exactly(self.port, 2))
|
(length, ) = struct.unpack(">h", _read_exactly(self.port, 2))
|
||||||
|
|
|
@ -10,7 +10,7 @@ enum {
|
||||||
MSGTYPE_REQUEST_IDENT = 1,
|
MSGTYPE_REQUEST_IDENT = 1,
|
||||||
MSGTYPE_LOAD_OBJECT,
|
MSGTYPE_LOAD_OBJECT,
|
||||||
MSGTYPE_RUN_KERNEL,
|
MSGTYPE_RUN_KERNEL,
|
||||||
MSGTYPE_UART_SETBDRATE,
|
MSGTYPE_SET_BAUD_RATE,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* device to host */
|
/* device to host */
|
||||||
|
@ -162,8 +162,10 @@ void comm_serve(object_loader load_object, kernel_runner run_kernel)
|
||||||
receive_and_load_object(load_object);
|
receive_and_load_object(load_object);
|
||||||
else if(msgtype == MSGTYPE_RUN_KERNEL)
|
else if(msgtype == MSGTYPE_RUN_KERNEL)
|
||||||
receive_and_run_kernel(run_kernel);
|
receive_and_run_kernel(run_kernel);
|
||||||
else if(msgtype == MSGTYPE_UART_SETBDRATE) {
|
else if(msgtype == MSGTYPE_SET_BAUD_RATE) {
|
||||||
unsigned int ftw = receive_int();
|
unsigned int ftw;
|
||||||
|
|
||||||
|
ftw = ((long long)receive_int() << 32LL)/(long long)identifier_frequency_read();
|
||||||
send_int(0x5a5a5a5a);
|
send_int(0x5a5a5a5a);
|
||||||
uart_sync();
|
uart_sync();
|
||||||
uart_tuning_word_write(ftw);
|
uart_tuning_word_write(ftw);
|
||||||
|
|
Loading…
Reference in New Issue