diff options
| -rw-r--r-- | Makefile | 2 | ||||
| -rwxr-xr-x | support/scripts/reset.py | 137 | 
2 files changed, 85 insertions, 54 deletions
@@ -106,7 +106,7 @@ UPLOAD_jtag  := $(OPENOCD_WRAPPER) flash  # Conditionally upload to whatever the last build was  install: INSTALL_TARGET = $(shell cat $(BUILD_PATH)/build-type 2>/dev/null)  install: $(BUILD_PATH)/$(BOARD).bin -	@echo Install target: $(INSTALL_TARGET) +	@echo "Install target:" $(INSTALL_TARGET)  	$(UPLOAD_$(INSTALL_TARGET))  # Force a rebuild if the target changed diff --git a/support/scripts/reset.py b/support/scripts/reset.py index ad26d10..2122d36 100755 --- a/support/scripts/reset.py +++ b/support/scripts/reset.py @@ -1,54 +1,81 @@ -#!/usr/bin/python +#!/usr/bin/env python  import serial  import os +import platform  import sys  import time  from struct import pack -def get_maple_device_path(file_prefix): -    """Try to find the device file for the Maple on OS X; assuming +def unix_get_maple_path(file_prefix): +    """Try to find the device file for the Maple on *nix; assuming      that it looks like /dev/<file_prefix>*.  If there are multiple      possibilities, ask the user what to do.  If the user chooses not      to say, returns None."""      possible_paths = [os.path.join('/dev', x) for x in os.listdir('/dev') \                            if x.startswith(file_prefix)] +    return choose_path(possible_paths) + +def windows_get_maple_path(): +    """Similar to unix_get_maple_path(), but on Windows.""" +    import _winreg as reg +    p = 'HARDWARE\\DEVICEMAP\\SERIALCOMM' +    k = reg.OpenKey(reg.HKEY_LOCAL_MACHINE, p) +    possible_paths = [] +    i = 0 +    while True: +        try: +            possible_paths.append(reg.EnumValue(k, i)[1]) +            i += 1 +        except WindowsError: +            break +    return choose_path(possible_paths) + +def choose_path(possible_paths):      if len(possible_paths) == 0:          return None      elif len(possible_paths) == 1:          return possible_paths[0]      else:          print 'Found multiple candidates for the Maple device:' -        for (i,p) in enumerate(possible_paths): -            print '\t%d. %s' % (i+1, p) - -        prompt = 'Enter a number to select one, or q to quit: ' -        while True: -            resp = raw_input(prompt).strip().lower() -            if resp == 'q': return None - -            try: -                i = int(resp, 10) -            except ValueError: -                pass -            else: -                if 0 <= i-1 < len(possible_paths): -                    return possible_paths[i-1] - -            prompt = 'Please enter a number from the list, or q to quit: ' - -os_sysname = os.uname()[0] -if os_sysname == 'Linux': -    maple_path = get_maple_device_path('ttyACM') +        return choose_among_options(possible_paths) + +def choose_among_options(options): +    for (i,p) in enumerate(options): +        print '\t%d. %s' % (i+1, p) + +    prompt = 'Enter a number to select one, or q to quit: ' +    while True: +        resp = raw_input(prompt).strip().lower() +        if resp == 'q': sys.exit() + +        try: +            i = int(resp, 10) +        except ValueError: +            pass +        else: +            if 0 <= i-1 < len(options): +                return options[i-1] + +        prompt = 'Please enter a number from the list, or q to quit: ' + +plat_sys = platform.system() +plat_bits = platform.architecture()[0] +if plat_sys == 'Linux': +    if plat_bits == '64bit': +        print 'You appear to be using 64-bit Linux. Let us know if this works.' +    maple_path = unix_get_maple_path('ttyACM')      # fall back on /dev/maple if that doesn't work      if maple_path is None:          maple_path = '/dev/maple'          print 'Could not find Maple serial port; defaulting to /dev/maple.' -elif os_sysname == 'Darwin': -    maple_path = get_maple_device_path('tty.usbmodem') +elif plat_sys == 'Darwin': +    maple_path = unix_get_maple_path('tty.usbmodem') +elif plat_sys == 'Windows': +    maple_path = windows_get_maple_path()  else: -    # TODO [mbolivar] what to do for windows, BSD, whatever? -    maple_path = '/dev/maple' +    maple_path = raw_input('Unrecognized platform.  Please enter ' +                           "the path to the Maple's serial port device file:")  if maple_path is None:      print 'Could not find the Maple serial port for reset.', \ @@ -65,30 +92,34 @@ print 'Using %s as Maple serial port' % maple_path  try:      ser = serial.Serial(maple_path, baudrate=115200, xonxoff=1) -    ser.open() - -    # try to toggle DTR/RTS (old scheme) -    ser.setRTS(0) -    time.sleep(0.01) -    ser.setDTR(0) -    time.sleep(0.01) -    ser.setDTR(1) -    time.sleep(0.01) -    ser.setDTR(0) - -    # try magic number -    ser.setRTS(1) -    time.sleep(0.01) -    ser.setDTR(1) -    time.sleep(0.01) -    ser.setDTR(0) -    time.sleep(0.01) -    ser.write("1EAF") - -    # ok we're done here -    ser.close() - -except: -    print 'Failed to open serial port %s for reset.' % maple_path + +    try: +        # try to toggle DTR/RTS (old scheme) +        ser.setRTS(0) +        time.sleep(0.01) +        ser.setDTR(0) +        time.sleep(0.01) +        ser.setDTR(1) +        time.sleep(0.01) +        ser.setDTR(0) + +        # try magic number +        ser.setRTS(1) +        time.sleep(0.01) +        ser.setDTR(1) +        time.sleep(0.01) +        ser.setDTR(0) +        time.sleep(0.01) +        ser.write("1EAF") + +        # Windows quirk: delay a bit before proceeding +        if plat_sys == 'Windows': time.sleep(0.5) +    finally: +        # ok we're done here +        ser.close() + +except Exception as e: +    print 'Failed to open serial port %s for reset: %s' % (maple_path, +                                                           e.message)      sys.exit()  | 
