Fix firmware uploading to Arduino Leonardo-based boards // Resolve #40

This commit is contained in:
Ivan Kravets
2014-12-28 20:41:21 +02:00
parent fe60369b6a
commit 7af9f50426
2 changed files with 50 additions and 4 deletions

View File

@ -58,7 +58,6 @@ env.Replace(
UPLOADER=join("$PIOPACKAGES_DIR", "tool-avrdude", "avrdude"), UPLOADER=join("$PIOPACKAGES_DIR", "tool-avrdude", "avrdude"),
UPLOADERFLAGS=[ UPLOADERFLAGS=[
"-V", # do not verify
"-q", # suppress progress output "-q", # suppress progress output
"-D", # disable auto erase for flash memory "-D", # disable auto erase for flash memory
"-p", "$BOARD_MCU", "-p", "$BOARD_MCU",
@ -118,7 +117,19 @@ def before_upload():
rpi_sysgpio("/sys/class/gpio/gpio18/value", 0) rpi_sysgpio("/sys/class/gpio/gpio18/value", 0)
rpi_sysgpio("/sys/class/gpio/unexport", 18) rpi_sysgpio("/sys/class/gpio/unexport", 18)
else: else:
return env.FlushSerialBuffer("$UPLOAD_PORT") upload_options = env.get("BOARD_OPTIONS", {}).get("upload", {})
if not upload_options.get("disable_flushing", False):
env.FlushSerialBuffer("$UPLOAD_PORT")
before_ports = [i['port'] for i in get_serialports()]
if (upload_options.get("use_1200bps_touch", False) and
"UPLOAD_PORT" in env):
env.TouchSerialPort("$UPLOAD_PORT", 1200)
if upload_options.get("wait_for_upload_port", False):
env.Replace(UPLOAD_PORT=env.WaitForNewSerialPort(before_ports))
CORELIBS = env.ProcessGeneral() CORELIBS = env.ProcessGeneral()
@ -174,7 +185,7 @@ if is_uptarget:
for item in get_serialports(): for item in get_serialports():
if "VID:PID" in item['hwid']: if "VID:PID" in item['hwid']:
print "Auto-detected UPLOAD_PORT: %s" % item['port'] print "Auto-detected UPLOAD_PORT: %s" % item['port']
env['UPLOAD_PORT'] = item['port'] env.Replace(UPLOAD_PORT=item['port'])
break break
if "UPLOAD_PORT" not in env: if "UPLOAD_PORT" not in env:

View File

@ -2,14 +2,17 @@
# See LICENSE for details. # See LICENSE for details.
import atexit import atexit
import platform
import re import re
from os import getenv, listdir, remove, walk from os import getenv, listdir, remove, walk
from os.path import basename, isdir, isfile, join from os.path import basename, isdir, isfile, join
from time import sleep from time import sleep
from SCons.Script import SConscript, SConscriptChdir from SCons.Script import Exit, SConscript, SConscriptChdir
from serial import Serial from serial import Serial
from platformio.util import get_serialports
def ProcessGeneral(env): def ProcessGeneral(env):
corelibs = [] corelibs = []
@ -187,6 +190,36 @@ def FlushSerialBuffer(env, port):
s.close() s.close()
def TouchSerialPort(env, port, baudrate):
s = Serial(port=env.subst(port), baudrate=baudrate)
s.close()
if platform.system() != "Darwin":
sleep(0.3)
def WaitForNewSerialPort(env, before):
new_port = None
elapsed = 0
while elapsed < 10:
now = [i['port'] for i in get_serialports()]
diff = list(set(now) - set(before))
if diff:
new_port = diff[0]
break
before = now
sleep(0.25)
elapsed += 0.25
if not new_port:
Exit("Error: Couldn't find a board on the selected port. "
"Check that you have the correct port selected. "
"If it is correct, try pressing the board's reset "
"button after initiating the upload.")
return new_port
def exists(_): def exists(_):
return True return True
@ -202,4 +235,6 @@ def generate(env):
env.AddMethod(VariantDirRecursive) env.AddMethod(VariantDirRecursive)
env.AddMethod(ConvertInoToCpp) env.AddMethod(ConvertInoToCpp)
env.AddMethod(FlushSerialBuffer) env.AddMethod(FlushSerialBuffer)
env.AddMethod(TouchSerialPort)
env.AddMethod(WaitForNewSerialPort)
return env return env