diff options
| author | John Whittington <git@jbrengineering.co.uk> | 2018-01-02 17:35:47 +0000 |
|---|---|---|
| committer | John Whittington <git@jbrengineering.co.uk> | 2018-02-24 11:15:53 +0000 |
| commit | f80486609505876fb0f103c3c1d03aba8f6a0f79 (patch) | |
| tree | 3bde2adcc00485a98da3f74839462238d42c38ee /bin | |
| parent | a6d979ef90ddae3549876917f80847ea647c284a (diff) | |
SAMD Cortex M0 device support (Zero, MKR1000, etc)
Compilation improvements by adding variant as other obj but not working on device
Arduino Zero devices with OpenOCD working
Created ARM_TOOLS_DIR and define arm toolchain executables in Sam.mk
Check avr-gcc on last AVR_TOOLS_DIR detect and indenting formatting
GDB debugging and programming added
Documentation updates and define ARDMK_VENDOR rather than include Sam.mk
Expand all parse_boards when defined rather than when used
Trim extra defines regex working on both macOS and Linux but need better fix
Print USB ids and added debug usage to readme
Add note on Arduino package dir and made board.txt work
Do ARM ARDUINO_ARCH define in Arduino.mk]
Add MZeroBlink to non-testable examples for now
Remove \B from extra defines grep
Add ARDUINO_PACKAGE_DIR for board support files
Fix a typo in the README
Fix typo in arduino-mk-vars.md
Prevent re-including Arduino.mk from Sam.mk when make restarts for upload
Add catrina to ARD_REST_OPTS if/else
Remove realpath in Sam.mk for cygwin compatability
SAMD bootloader support in ard-reset using --zero
Enters bootloader using open/close of port at 1200 BAUD, then polls the
attached devices for new port enumerating (bootloader). This is how the
Arduino IDE operates
Bossa support for Zero, MKR1000 etc
Re-word Arm README section after Native USB development
Reset for zero refactored like IDE
Zero bootloader reset tested on macOS and comments added
Re-word ARM bootloader and remove imports from testing
Patch changes ARDMK_VENDOR->ARCHITECHTURE, show_config_vars, ignore CORE_VER if emtpy
Common.mk header guard, openocd/bossac avoid separator, typos
Documentation update for patch changes
Move ARM tools to Sam.mk and auto-detect include
Correct accidental commit of Blink Makefile change
Lib fix with alternative core and documentation
Append zero to ARD_RESET_OPTS rather than set
Prioritise package ARM upload tools over path installed
Add note in README on ARM tools versions
Move openocd variant config script flag to OPTS
Diffstat (limited to 'bin')
| -rwxr-xr-x | bin/ard-reset-arduino | 90 |
1 files changed, 89 insertions, 1 deletions
diff --git a/bin/ard-reset-arduino b/bin/ard-reset-arduino index 1f2c7e9..d6f974f 100755 --- a/bin/ard-reset-arduino +++ b/bin/ard-reset-arduino @@ -2,6 +2,7 @@ from __future__ import print_function import serial +import serial.tools.list_ports import os.path import argparse from time import sleep @@ -13,13 +14,100 @@ except: pyserial_version = 2 # less than 2.3 parser = argparse.ArgumentParser(description='Reset an Arduino') +parser.add_argument('--zero', action='store_true', help='Reset Arduino Zero or similar Native USB to enter bootloader') parser.add_argument('--caterina', action='store_true', help='Reset a Leonardo, Micro, Robot or LilyPadUSB.') parser.add_argument('--verbose', action='store_true', help="Watch what's going on on STDERR.") parser.add_argument('--period', default=0.1, help='Specify the DTR pulse width in seconds.') parser.add_argument('port', nargs=1, help='Serial device e.g. /dev/ttyACM0') args = parser.parse_args() -if args.caterina: + +def list_ports(output=False): + """ Lists serial ports attached + + :returns + A list of paths to serial ports on system + """ + ports = serial.tools.list_ports.comports() + connected = [port[0] for port in ports] + if output: + print(connected) + + return connected + + +def new_port(old, new): + """ Checks if a new port has attached + + Args: + old: previous list of ports to check + new: current list of ports to check + Returns: + index of port in 'new' if new port found, otherwise -1 + """ + new_port = -1 + + for port in new: + if port not in old: + new_port = new.index(port) + break + + return new_port + + +if args.zero: + # number of trys to attempt + zero_attempts = 20 # ~2 seconds + initial_ports = list_ports(args.verbose) + + if args.verbose: + print('Attempting to enter bootloader using 1200 bps open/close on port %s' % args.port[0]) + + ser = serial.Serial(args.port[0], 57600) + ser.close() + + if pyserial_version < 3: + ser.setBaudrate(1200) + else: + ser.baudrate = 1200 + + # do the open/close at 1200 BAUD + ser.open() + ser.close() + + if args.verbose: + print('Done. Waiting for bootloader port to attach...') + + # get new list of ports + reset_ports = list_ports(args.verbose) + + # wait for new port or port to return + port_index = new_port(initial_ports, reset_ports) + + # keep checking until new port appears or timeout + while port_index < 0: + # count down attempts and leave if expired + zero_attempts -= 1 + if zero_attempts < 0: + break + sleep(0.1) + # get list of ports after bootloader toggle performed + reset_ports = list_ports(args.verbose) + # if a port drops, set initial ports to reset ports so that + # next attached device will be new port + if (len(reset_ports) < len(initial_ports)): + initial_ports = reset_ports + # check if a new port has attached and return the index if it has + port_index = new_port(initial_ports, reset_ports) + # return the new port if detected, otherwise return passed port + if port_index is -1: + bootloader_port = args.port[0] + else: + bootloader_port = reset_ports[port_index] + + # print so that `tail -1` can be piped for bootloader port + print(bootloader_port) +elif args.caterina: if args.verbose: print('Forcing reset using 1200bps open/close on port %s' % args.port[0]) ser = serial.Serial(args.port[0], 57600) ser.close() |
