Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: m-labs/misoc
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 653a9907bfb3
Choose a base ref
...
head repository: m-labs/misoc
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: e4ffd99073ee
Choose a head ref
  • 2 commits
  • 1 file changed
  • 1 contributor

Commits on Feb 24, 2016

  1. 3
    Copy the full SHA
    f6abd6d View commit details
  2. flterm: cleanup getkey

    sbourdeauducq committed Feb 24, 2016
    1
    Copy the full SHA
    e4ffd99 View commit details
Showing with 31 additions and 46 deletions.
  1. +31 −46 misoc/tools/flterm.py
77 changes: 31 additions & 46 deletions misoc/tools/flterm.py
Original file line number Diff line number Diff line change
@@ -7,31 +7,35 @@
import threading
import argparse

# TODO: cleanup getkey function
if sys.platform == "win32":
import msvcrt

def init_getkey():
pass

def deinit_getkey():
pass

def getkey():
import msvcrt
return msvcrt.getch()
else:
def getkey():
import termios
import termios

def init_getkey():
global old_termios

fd = sys.stdin.fileno()
old = termios.tcgetattr(fd)
new = termios.tcgetattr(fd)
old_termios = termios.tcgetattr(fd)
new = old_termios.copy()
new[3] = new[3] & ~termios.ICANON & ~termios.ECHO
new[6][termios.VMIN] = 1
new[6][termios.VTIME] = 0
termios.tcsetattr(fd, termios.TCSANOW, new)
c = None
try:
c = os.read(fd, 1)
finally:
termios.tcsetattr(fd, termios.TCSAFLUSH, old)
return c

def deinit_getkey():
termios.tcsetattr(sys.stdin.fileno(), termios.TCSANOW, old_termios)

def getkey():
return os.read(sys.stdin.fileno(), 1)

sfl_prompt_req = b"F7: boot from serial\n"
sfl_prompt_ack = b"\x06"

sfl_magic_req = b"sL5DdSMmkekro\n"
sfl_magic_ack = b"z6IHG7cYDID6o\n"
@@ -108,15 +112,13 @@ def encode(self):


class Flterm:
def __init__(self, serial_boot, kernel_image, kernel_address):
self.serial_boot = serial_boot
def __init__(self, kernel_image, kernel_address):
self.kernel_image = kernel_image
self.kernel_address = kernel_address

self.reader_alive = False
self.writer_alive = False

self.prompt_detect_buffer = bytes(len(sfl_prompt_req))
self.magic_detect_buffer = bytes(len(sfl_magic_req))

def open(self, port, baudrate):
@@ -180,17 +182,6 @@ def boot(self):
frame.payload = self.kernel_address.to_bytes(4, "big")
self.send_frame(frame)

def detect_prompt(self, data):
if len(data):
self.prompt_detect_buffer = self.prompt_detect_buffer[1:] + data
return self.prompt_detect_buffer == sfl_prompt_req
else:
return False

def answer_prompt(self):
print("[FLTERM] Received serial boot prompt from the device.")
self.port.write(sfl_prompt_ack)

def detect_magic(self, data):
if len(data):
self.magic_detect_buffer = self.magic_detect_buffer[1:] + data
@@ -217,8 +208,6 @@ def reader(self):
sys.stdout.flush()

if self.kernel_image is not None:
if self.serial_boot and self.detect_prompt(c):
self.answer_prompt()
if self.detect_magic(c):
self.answer_magic()

@@ -239,13 +228,7 @@ def stop_reader(self):
def writer(self):
try:
while self.writer_alive:
b = getkey()
if b == b"\x03":
self.stop()
elif b == b"\n":
self.port.write(b"\x0a")
else:
self.port.write(b)
self.port.write(getkey())
except:
self.writer_alive = False
raise
@@ -279,22 +262,24 @@ def _get_args():
parser = argparse.ArgumentParser()
parser.add_argument("port", help="serial port")
parser.add_argument("--speed", default=115200, help="serial baudrate")
parser.add_argument("--serial-boot", default=False, action='store_true',
help="automatically initiate serial boot")
parser.add_argument("--kernel", default=None, help="kernel image")
parser.add_argument("--kernel-adr", type=lambda a: int(a, 0), default=0x40000000, help="kernel address")
return parser.parse_args()


def main():
args = _get_args()
flterm = Flterm(args.serial_boot, args.kernel, args.kernel_adr)
flterm = Flterm(args.kernel, args.kernel_adr)
init_getkey()
try:
flterm.open(args.port, args.speed)
flterm.start()
flterm.join(True)
try:
flterm.open(args.port, args.speed)
flterm.start()
flterm.join(True)
finally:
flterm.close()
finally:
flterm.close()
deinit_getkey()


if __name__ == "__main__":