📄 jtag.py
字号:
raise NotImplementedError #sys.stderr.write("Load PC with 0x%04x ...\n" % address) def funclet(self): """download and start funclet""" sys.stderr.write("Download and execute of funclet...\n") if len(self.data) > 1: raise JTAGException("don't know how to handle multiple segments in funclets") _parjtag.funclet(self.data[0].data) sys.stderr.write("Funclet OK.\n")def usage(): """print some help message""" sys.stderr.write("""USAGE: %s [options] [file]Version: %sIf "-" is specified as file the data is read from the stdinput.A file ending with ".txt" is considered to be in TIText format allother filenames are considered IntelHex.General options: -h, --help Show this help screen. -l, --lpt=name Specify an other parallel port. (defaults to LPT1 (/dev/parport0 on unix) -D, --debug Increase level of debug messages. This won't be very useful for the average user... -I, --intelhex Force fileformat to IntelHex -T, --titext Force fileformat to be TIText -f, --funclet The given file is a funclet (a small program to be run in RAM) -R, --ramsize Specify the amont of RAM to be used to program flash (default 256).Program Flow Specifiers: -e, --masserase Mass Erase (clear all flash memory) -m, --mainerase Erase main flash memory only --eraseinfo Erase info flash memory only (0x1000-0x10ff) --erase=address Selectively erase segment at the specified address -E, --erasecheck Erase Check by file -p, --program Program file -v, --verify Verify by fileThe order of the above options matters! The table is ordered by normalexecution order. For the options "Epv" a file must be specified.Program flow specifiers default to "p" if a file is given.Don't forget to specify "e" or "eE" when programming flash!"p" already verifies the programmed data, "v" adds an additionalverification though uploading the written data for a 1:1 compare.No default action is taken if "p" and/or "v" is given, say specifyingonly "v" does a check by file of a programmed device.Data retreiving: -u, --upload=addr Upload a datablock (see also: -s). -s, --size=num Size of the data block do upload. (Default is 2) -x, --hex Show a hexadecimal display of the uploaded data. (Default) -b, --bin Get binary uploaded data. This can be used to redirect the output into a file. -i, --ihex Uploaded data is output in Intel HEX format. This can be used to clone a device.Do before exit: -g, --go=address Start programm execution at specified address. This implies option "w" (wait) -r, --reset Reset connected MSP430. Starts application. This is a normal device reset and will start the programm that is specified in the reset interrupt vector. (see also -g) -w, --wait Wait for <ENTER> before closing parallel port.""" % (sys.argv[0], VERSION))def main(): global DEBUG import getopt filetype = None filename = None reset = 0 wait = 0 goaddr = None jtag = JTAG() toinit = [] todo = [] startaddr = None size = 2 outputformat= HEX lpt = None funclet = None ramsize = None sys.stderr.write("MSP430 parallel JTAG programmer Version: %s\n" % VERSION) try: opts, args = getopt.getopt(sys.argv[1:], "hl:weEmpvrg:Du:d:s:xbiITfR:S", ["help", "lpt=", "wait" "masserase", "erasecheck", "mainerase", "program", "erase=", "eraseinfo", "verify", "reset", "go=", "debug", "upload=", "download=", "size=", "hex", "bin", "ihex", "intelhex", "titext", "funclet", "ramsize=", "progress"] ) except getopt.GetoptError: # print help information and exit: usage() sys.exit(2) for o, a in opts: if o in ("-h", "--help"): usage() sys.exit() elif o in ("-l", "--lpt"): lpt = a elif o in ("-w", "--wait"): wait = 1 elif o in ("-e", "--masserase"): toinit.append(jtag.actionMassErase) #Erase Flash elif o in ("-E", "--erasecheck"): toinit.append(jtag.actionEraseCheck) #Erase Check (by file) elif o in ("-m", "--mainerase"): toinit.append(jtag.actionMainErase) #Erase main Flash elif o == "--erase": try: seg = int(a, 0) toinit.append(jtag.makeActionSegmentErase(seg)) except ValueError: sys.stderr.write("segment address must be a valid number in dec, hex or octal\n") sys.exit(2) elif o == "--eraseinfo": toinit.append(jtag.makeActionSegmentErase(0x1000)) toinit.append(jtag.makeActionSegmentErase(0x1080)) elif o in ("-p", "--program"): todo.append(jtag.actionProgram) #Program file elif o in ("-v", "--verify"): todo.append(jtag.actionVerify) #Verify file elif o in ("-r", "--reset"): reset = 1 elif o in ("-g", "--go"): try: goaddr = int(a, 0) #try to convert decimal except ValueError: sys.stderr.write("upload address must be a valid number in dec, hex or octal\n") sys.exit(2) elif o in ("-D", "--debug"): DEBUG = DEBUG + 1 elif o in ("-u", "--upload"): try: startaddr = int(a, 0) #try to convert number of any base except ValueError: sys.stderr.write("upload address must be a valid number in dec, hex or octal\n") sys.exit(2) elif o in ("-s", "--size"): try: size = int(a, 0) except ValueError: sys.stderr.write("upload address must be a valid number in dec, hex or octal\n") sys.exit(2) #outut formats elif o in ("-x", "--hex"): outputformat = HEX elif o in ("-b", "--bin"): outputformat = BINARY elif o in ("-i", "--ihex"): outputformat = INTELHEX #input formats elif o in ("-I", "--intelhex"): filetype = 0 elif o in ("-T", "--titext"): filetype = 1 #others elif o in ("-f", "--funclet"): funclet = 1 elif o in ("-R", "--ramsize"): try: ramsize = int(a, 0) except ValueError: sys.stderr.write("ramsize must be a valid number in dec, hex or octal\n") sys.exit(2) elif o in ("-S", "--progress"): jtag.showprogess = 1 if len(args) == 0: sys.stderr.write("Use -h for help\n") elif len(args) == 1: #a filename is given if not funclet: if not todo: #if there are no actions yet todo.extend([ #add some useful actions... jtag.actionProgram, ]) filename = args[0] else: #number of args is wrong usage() sys.exit(2) if DEBUG: #debug infos sys.stderr.write("debug level set to %d\n" % DEBUG) _parjtag.configure(DEBUG_OPTION, DEBUG) sys.stderr.write("python version: %s\n" % sys.version) #sanity check of options if goaddr and reset: sys.stderr.write("Warning: option --reset ignored as --go is specified!\n") reset = 0 if startaddr and reset: sys.stderr.write("Warning: option --reset ignored as --upload is specified!\n") reset = 0 #prepare data to download jtag.data = Memory() #prepare downloaded data if filetype is not None: #if the filetype is given... if filename is None: raise ValueError("no filename but filetype specified") if filename == '-': #get data from stdin file = sys.stdin else: file = open(filename,"rb") #or from a file if filetype == 0: #select load function jtag.data.loadIHex(file) #intel hex elif filetype == 1: jtag.data.loadTIText(file) #TI's format else: raise ValueError("illegal filetype specified") else: #no filetype given... if filename == '-': #for stdin: jtag.data.loadIHex(sys.stdin) #assume intel hex elif filename: jtag.data.loadFile(filename) #autodetect otherwise if DEBUG > 5: sys.stderr.write("File: %r\n" % filename) try: jtag.connect(lpt) #try to open port except IOError: raise #do not handle here else: #continue if open was successful if ramsize is not None: _parjtag.configure(RAMSIZE_OPTION, ramsize) #initialization list if toinit: #erase and erase check if DEBUG: sys.stderr.write("Preparing device ...\n") for f in toinit: f() #work list if todo: if DEBUG > 0: #debug #show a nice list of sheduled actions sys.stderr.write("TODO list:\n") for f in todo: try: sys.stderr.write(" %s\n" % f.func_name) except AttributeError: sys.stderr.write(" %r\n" % f) for f in todo: f() #work through todo list if reset: #reset device first if desired jtag.actionReset() if funclet is not None: #download and start funclet jtag.funclet() if goaddr is not None: #start user programm at specified address jtag.actionRun(goaddr) #load PC and execute #upload datablock and output if startaddr is not None: if goaddr: #if a program was started... raise NotImplementedError #TODO: #sys.stderr.write("Waiting to device for reconnect for upload: ") data = jtag.uploadData(startaddr, size) #upload data if outputformat == HEX: #depending on output format hexdump( (startaddr, data) ) #print a hex display elif outputformat == INTELHEX: makeihex( (startaddr, data) ) #ouput a intel-hex file else: sys.stdout.write(data) #binary output w/o newline! wait = 0 #wait makes no sense as after the upload the device is still stopped if wait: #wait at the end if desired sys.stderr.write("Press <ENTER> ...\n") #display a prompt raw_input() #wait for newline _parjtag.reset(1, 1) #reset and release target #~ jtag.actionReset() jtag.close() #Release communication portif __name__ == '__main__': try: main() except SystemExit: raise #let pass exit() calls except KeyboardInterrupt: if DEBUG: raise #show full trace in debug mode sys.stderr.write("user abort.\n") #short messy in user mode sys.exit(1) #set errorlevel for script usage except Exception, msg: #every Exception is caught and displayed if DEBUG: raise #show full trace in debug mode sys.stderr.write("\nAn error occoured:\n%s\n" % msg) #short messy in user mode sys.exit(1) #set errorlevel for script usage
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -