123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310 |
- #!/usr/bin/env python
- """
- # TOP2049 Open Source programming suite
- #
- # Commandline utility
- #
- # Copyright (c) 2009-2013 Michael Buesch <m@bues.ch>
- #
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation; either version 2 of the License, or
- # (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License along
- # with this program; if not, write to the Free Software Foundation, Inc.,
- # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- """
- from libtoprammer.main import *
- from libtoprammer.util import *
- import getopt
- def usage():
- print "TOP2049 Open Source programming suite v%s" % VERSION
- print ""
- print "Usage: %s [OPTIONS] [ACTIONS]" % sys.argv[0]
- print ""
- print " -c|--chip-id The ID of the handled chip. (mandatory)"
- print " See -t|--list for a list of supported chips."
- print ""
- print "Optional:"
- print " -C|--chip-opt NAME=VAL Set a chip-id specific option."
- print " Use -c CHIPID -t to get a list of options."
- print ""
- print "Actions:"
- print " -s|--read-sig FILE Read the signature bytes"
- print " -x|--erase Erase the chip"
- print " -T|--test Run chip unit-test"
- print ""
- print " -p|--read-prog FILE Read the program memory"
- print " -P|--write-prog FILE Write the program memory"
- print ""
- print " -e|--read-eeprom FILE Read the EEPROM"
- print " -E|--write-eeprom FILE Write the EEPROM"
- print ""
- print " -f|--read-fuse FILE Read the fuse bits"
- print " -F|--write-fuse FILE Write the fuse bits"
- print ""
- print " -l|--read-lock FILE Read the lock bits"
- print " -L|--write-lock FILE Write the lock bits"
- print ""
- print " -r|--read-ram FILE Read the RAM"
- print " -R|--write-ram FILE Write the RAM"
- print ""
- print " -a|--read-uil FILE Read the User ID Location"
- print " -A|--write-uil FILE Write the User ID Location"
- print ""
- print "Other options:"
- print " -t|--list Print a list of supported chips and exit."
- print " Use -V|--verbose to control the list verbosity (0-4)"
- print " -d|--device DEVID Use a specific programmer. Example for USB:"
- print " usb:TOP2049:0"
- print " First found programmer is used, if not given."
- print " -V|--verbose LEVEL Set the verbosity level:"
- print " 0 => show warnings"
- print " 1 => also show informational messages (default)"
- print " 2 => also show debugging messages"
- print " 3 => also dump all USB commands"
- print " -o|--force LEVEL Set the force level. Default = 0"
- print " Note that any value greater than 0 may brick devices"
- print " -U|--force-upload Force upload the bitfile, even if it already appears"
- print " to be uploaded."
- print " -Q|--noqueue Disable command queuing. Really slow!"
- print " -B|--broken Also use broken algorithms"
- print " -I|--in-format FMT Input file format. Default = autodetect"
- print " -O|--out-format FMT Output file format. Default = bin"
- print ""
- print "File formats (FMT):"
- print " auto Autodetect. (input only)"
- print " bin Raw binary data"
- print " ihex Intel hex"
- print " ihex-raw Raw Intel hex (don't interpret sections)"
- print " ahex Hex with ASCII dump"
- IO_handlers = {
- "bin" : IO_binary,
- "ihex" : IO_ihex,
- "ihex-raw" : IO_ihex,
- "ahex" : IO_ahex,
- }
- def fileOut(filename, fmtString, data):
- handler = IO_handlers[fmtString]()
- data = handler.fromBinary(data)
- if filename == "-":
- sys.stdout.write(data)
- else:
- open(filename, "w+b").write(data)
- def fileIn(top, action, filename, fmtString):
- if filename == "-":
- data = sys.stdin.read()
- else:
- data = open(filename, "rb").read()
- if fmtString == "auto":
- handler = IO_autodetect(data)()
- else:
- handler = IO_handlers[fmtString]()
- if isinstance(handler, IO_ihex):
- interp = top.getChip().getIHexInterpreter()
- interp.interpret(data)
- if interp.cumulativeSupported():
- readRaw = fmtString.endswith("-raw")
- else:
- readRaw = True
- if action == "write-prog":
- binData = interp.getProgmem(dontInterpretSections = readRaw)
- elif action == "write-eeprom":
- binData = interp.getEEPROM(dontInterpretSections = readRaw)
- elif action == "write-fuse":
- binData = interp.getFusebits(dontInterpretSections = readRaw)
- elif action == "write-lock":
- binData = interp.getLockbits(dontInterpretSections = readRaw)
- elif action == "write-ram":
- binData = interp.getRAM(dontInterpretSections = readRaw)
- elif action == "write-uil":
- binData = interp.getUIL(dontInterpretSections = readRaw)
- else:
- assert(0)
- return binData
- return handler.toBinary(data)
- def main(argv):
- opt_verbose = 1
- opt_forceLevel = 0
- opt_forceBitfileUpload = False
- opt_chipID = None
- opt_chipOptions = []
- opt_device = None
- opt_action = None
- opt_file = None
- opt_noqueue = False
- opt_usebroken = False
- opt_informat = "auto"
- opt_outformat = "bin"
- try:
- (opts, args) = getopt.getopt(sys.argv[1:],
- "hc:d:V:Qs:xTp:P:e:E:f:F:o:Ul:L:r:R:BtI:O:C:a:A:",
- [ "help", "chip-id=", "device=", "verbose=", "noqueue",
- "read-sig=", "erase", "test", "read-prog=", "write-prog=",
- "read-eeprom=", "write-eeprom=", "read-fuse=", "write-fuse=",
- "read-lock=", "write-lock=", "read-ram=", "write-ram=",
- "force=", "force-upload", "broken", "list",
- "in-format=", "out-format=", "chip-opt=",
- "read-uil=", "write-uil=" ])
- for (o, v) in opts:
- if o in ("-h", "--help"):
- usage()
- return 0
- if o in ("-c", "--chip-id"):
- opt_chipID = v
- if o in ("-C", "--chip-opt"):
- try:
- v = v.split('=')
- name, value = v[0], v[1]
- except (IndexError, ValueError), e:
- print "-C|--chip-opt invalid parameter"
- return 1
- copt = AssignedChipOption(name, value)
- opt_chipOptions.append(copt)
- if o in ("-t", "--list"):
- opt_action = "print-list"
- if o in ("-d", "--device"):
- opt_device = v
- if o in ("-V", "--verbose"):
- opt_verbose = int(v)
- if o in ("-o", "--force"):
- opt_forceLevel = int(v)
- if o in ("-U", "--force-upload"):
- opt_forceBitfileUpload = True
- if o in ("-Q", "--noqueue"):
- opt_noqueue = True
- if o in ("-B", "--broken"):
- opt_usebroken = True
- if o in ("-I", "--in-format"):
- opt_informat = v.lower()
- if o in ("-O", "--out-format"):
- opt_outformat = v.lower()
- if o in ("-s", "--read-sig"):
- opt_action = "read-sig"
- opt_file = v
- if o in ("-x", "--erase"):
- opt_action = "erase"
- if o in ("-T", "--test"):
- opt_action = "test"
- if o in ("-P", "--write-prog"):
- opt_action = "write-prog"
- opt_file = v
- if o in ("-p", "--read-prog"):
- opt_action = "read-prog"
- opt_file = v
- if o in ("-E", "--write-eeprom"):
- opt_action = "write-eeprom"
- opt_file = v
- if o in ("-e", "--read-eeprom"):
- opt_action = "read-eeprom"
- opt_file = v
- if o in ("-F", "--write-fuse"):
- opt_action = "write-fuse"
- opt_file = v
- if o in ("-f", "--read-fuse"):
- opt_action = "read-fuse"
- opt_file = v
- if o in ("-l", "--read-lock"):
- opt_action = "read-lock"
- opt_file = v
- if o in ("-L", "--write-lock"):
- opt_action = "write-lock"
- opt_file = v
- if o in ("-r", "--read-ram"):
- opt_action = "read-ram"
- opt_file = v
- if o in ("-R", "--write-ram"):
- opt_action = "write-ram"
- opt_file = v
- if o in ("-a", "--read-uil"):
- opt_action = "read-uil"
- opt_file = v
- if o in ("-A", "--write-uil"):
- opt_action = "write-uil"
- opt_file = v
- except (getopt.GetoptError, ValueError), e:
- usage()
- return 1
- if opt_action != "print-list" and not opt_chipID:
- print "-c|--chip-id is mandatory!"
- return 1
- if not opt_informat in ("auto", "bin", "ihex", "ihex-raw", "ahex"):
- print "Invalid -I|--in-format"
- return 1
- if not opt_outformat in ("bin", "ihex", "ihex-raw", "ahex"):
- print "Invalid -O|--out-format"
- return 1
- try:
- if opt_action == "print-list":
- if opt_chipID:
- desc = ChipDescription.findOne(opt_chipID, True)
- desc.dump(sys.stdout, verbose=opt_verbose)
- else:
- ChipDescription.dumpAll(sys.stdout,
- verbose=opt_verbose, showBroken=True)
- return 0
- top = TOP(devIdentifier = opt_device,
- verbose = opt_verbose, forceLevel = opt_forceLevel,
- noqueue = opt_noqueue, usebroken = opt_usebroken,
- forceBitfileUpload = opt_forceBitfileUpload)
- top.initializeChip(chipID = opt_chipID,
- assignedChipOptions = opt_chipOptions)
- if opt_action == "read-sig":
- fileOut(opt_file, opt_outformat, top.readSignature())
- elif opt_action == "erase":
- top.eraseChip()
- elif opt_action == "test":
- top.testChip()
- elif opt_action == "read-prog":
- fileOut(opt_file, opt_outformat, top.readProgmem())
- elif opt_action == "write-prog":
- image = fileIn(top, opt_action, opt_file, opt_informat)
- top.writeProgmem(image)
- elif opt_action == "read-eeprom":
- fileOut(opt_file, opt_outformat, top.readEEPROM())
- elif opt_action == "write-eeprom":
- top.writeEEPROM(fileIn(top, opt_action, opt_file, opt_informat))
- elif opt_action == "read-fuse":
- fileOut(opt_file, opt_outformat, top.readFuse())
- elif opt_action == "write-fuse":
- image = fileIn(top, opt_action, opt_file, opt_informat)
- top.writeFuse(image)
- elif opt_action == "read-lock":
- fileOut(opt_file, opt_outformat, top.readLockbits())
- elif opt_action == "write-lock":
- top.writeLockbits(fileIn(top, opt_action, opt_file, opt_informat))
- elif opt_action == "read-ram":
- fileOut(opt_file, opt_outformat, top.readRAM())
- elif opt_action == "write-ram":
- top.writeRAM(fileIn(top, opt_action, opt_file, opt_informat))
- elif opt_action == "read-uil":
- fileOut(opt_file, opt_outformat, top.readUserIdLocation())
- elif opt_action == "write-uil":
- top.writeUserIdLocation(fileIn(top, opt_action, opt_file, opt_informat))
- else:
- if opt_verbose >= 1:
- print "No action specified"
- top.shutdownChip()
- except (TOPException, BitfileException, IOError), e:
- print e
- return 1
- return 0
- if __name__ == "__main__":
- sys.exit(main(sys.argv))
|