ArduinoAm29F010

Changeset

23:64ba8abb1b91
2015-03-08 Paul Boddie raw files shortlog changelog graph Added a verify-only mode for uploaded files, and made uploading/verifying stop the program if it fails.
upload.py (file)
     1.1 --- a/upload.py	Sat Mar 07 23:32:25 2015 +0100
     1.2 +++ b/upload.py	Sun Mar 08 19:36:35 2015 +0100
     1.3 @@ -58,33 +58,43 @@
     1.4      except EOFError:
     1.5          print "Session closed."
     1.6  
     1.7 -def upload(filename, sector):
     1.8 +def upload(filename, sector, verify_only=False):
     1.9      data = open(filename, "rb").read()
    1.10  
    1.11      if len(data) != 0x4000:
    1.12          print >>sys.stderr, "File", filename, "is not", 0x4000, "bytes long."
    1.13          return False
    1.14  
    1.15 -    print >>sys.stderr, "Erasing sector", sector, "..."
    1.16 +    if not verify_only:
    1.17 +        print >>sys.stderr, "Erasing sector", sector, "..."
    1.18  
    1.19 -    writeToPort("S%x\n" % sector)
    1.20 -    resp = readFromPort()
    1.21 -    if resp != "S":
    1.22 -        print >>sys.stderr, "Sector %d erase failed: %s" % (sector, resp)
    1.23 -        return False
    1.24 +        writeToPort("S%x\n" % sector)
    1.25 +        resp = readFromPort()
    1.26 +        if resp != "S":
    1.27 +            print >>sys.stderr, "Sector %d erase failed: %s" % (sector, resp)
    1.28 +            return False
    1.29  
    1.30 -    print >>sys.stderr, "Uploading", filename, "to sector", sector, "..."
    1.31 +        print >>sys.stderr, "Uploading", filename, "to sector", sector, "..."
    1.32 +    else:
    1.33 +        print >>sys.stderr, "Verifying sector", sector, "..."
    1.34  
    1.35      i = 0
    1.36      while i < 0x4000:
    1.37          value = ord(data[i])
    1.38          addr = (sector << 14) | i
    1.39  
    1.40 -        writeToPort("P%04x%02x\n" % (addr, value))
    1.41 -        resp = readFromPort()
    1.42 -        if resp != "P":
    1.43 -            print >>sys.stderr, "Program of location %04x failed: %s" % (addr, resp)
    1.44 -            return False
    1.45 +        if not verify_only:
    1.46 +            writeToPort("P%04x%02x\n" % (addr, value))
    1.47 +            resp = readFromPort()
    1.48 +            if resp != "P":
    1.49 +                print >>sys.stderr, "Program of location %04x failed: %s" % (addr, resp)
    1.50 +                return False
    1.51 +        else:
    1.52 +            writeToPort("R%04x\n" % addr)
    1.53 +            resp = readFromPort()
    1.54 +            if resp != "%02X" % value and resp != "%X" % value:
    1.55 +                print >>sys.stderr, "Verify of location %04x failed: %s" % (addr, resp)
    1.56 +                return False
    1.57  
    1.58          i += 1
    1.59  
    1.60 @@ -103,11 +113,18 @@
    1.61              else:
    1.62                  base = 0
    1.63                  i = 1
    1.64 +            if len(sys.argv) > i and sys.argv[i] == "-v":
    1.65 +                verify_only = True
    1.66 +                i += 1
    1.67 +            else:
    1.68 +                verify_only = False
    1.69 +
    1.70              for sector, filename in enumerate(sys.argv[i:]):
    1.71 -                upload(filename, sector + base)
    1.72 +                if not upload(filename, sector + base, verify_only):
    1.73 +                    break
    1.74                  sleep(5) # give the device a rest
    1.75          else:
    1.76 -            print >>sys.stderr, sys.argv[0], "-i | <filename>..."
    1.77 +            print >>sys.stderr, sys.argv[0], "-i | [ -s <sector> ] [ -v ] <filename>..."
    1.78              sys.exit(1)
    1.79      finally:
    1.80          closePort()