def __init__(self): super(XMEGAProgrammerDialog, self).__init__(CWMainGUI.getInstance()) # self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint) self.xmega = XMEGAProgrammer() self.setWindowTitle("ChipWhisperer-Lite XMEGA Programmer") layout = QVBoxLayout() layoutFW = QHBoxLayout() self.flashLocation = QtFixes.QLineEdit() flashFileButton = QPushButton("Find") flashFileButton.clicked.connect(self.findFlash) layoutFW.addWidget(QLabel("FLASH File")) layoutFW.addWidget(self.flashLocation) layoutFW.addWidget(flashFileButton) layout.addLayout(layoutFW) self.flashLocation.setText(QSettings().value("xmega-flash-location")) # Add buttons readSigBut = QPushButton("Check Signature") readSigBut.clicked.connect(self.readSignature) verifyFlashBut = QPushButton("Verify FLASH") verifyFlashBut.clicked.connect(self.verifyFlash) verifyFlashBut.setEnabled(False) progFlashBut = QPushButton("Erase/Program/Verify FLASH") progFlashBut.clicked.connect(self.writeFlash) layoutBut = QHBoxLayout() layoutBut.addWidget(readSigBut) layoutBut.addWidget(verifyFlashBut) layoutBut.addWidget(progFlashBut) layout.addLayout(layoutBut) # Add status stuff self.statusLine = QPlainTextEdit() self.statusLine.setReadOnly(True) # self.statusLine.setFixedHeight(QFontMetrics(self.statusLine.font()).lineSpacing() * 5 + 10) self.statusLine.append = self.statusLine.appendPlainText layout.addWidget(self.statusLine) self.xmega._logging = self.statusLine.append # Set dialog layout self.setLayout(layout)
def run(self): # Deletes previous saved data if os.path.isfile("projects/tut_randkey_randplain.cwp"): os.remove("projects/tut_randkey_randplain.cwp") shutil.rmtree("projects/tut_randkey_randplain_data", ignore_errors=True) if os.path.isfile("projects/tut_fixedkey_randplain.cwp"): os.remove("projects/tut_fixedkey_randplain.cwp") shutil.rmtree("projects/tut_fixedkey_randplain_data", ignore_errors=True) # Setup the capture hardware self.api.setParameter(['Generic Settings', 'Scope Module', 'ChipWhisperer/OpenADC']) self.api.setParameter(['Generic Settings', 'Target Module', 'Simple Serial']) self.api.setParameter(['Generic Settings', 'Trace Format', 'ChipWhisperer/Native']) self.api.setParameter(['Simple Serial', 'Connection', 'NewAE USB (CWLite/CW1200)']) self.api.setParameter(['ChipWhisperer/OpenADC', 'Connection', 'NewAE USB (CWLite/CW1200)']) # Conect both: scope and target self.api.connect() # Flash the firmware xmega = XMEGAProgrammer() xmega.setUSBInterface(self.api.getScope().scopetype.dev.xmega) xmega._logging = None xmega.find() xmega.erase() xmega.program(r"simpleserial-aes-xmega.hex", memtype="flash", verify=True) xmega.close() # Setup the capture parameters lstexample = [['CW Extra Settings', 'Trigger Pins', 'Target IO4 (Trigger Line)', True], ['CW Extra Settings', 'Target IOn Pins', 'Target IO1', 'Serial RXD'], ['CW Extra Settings', 'Target IOn Pins', 'Target IO2', 'Serial TXD'], ['OpenADC', 'Clock Setup', 'CLKGEN Settings', 'Desired Frequency', 7370000.0], ['CW Extra Settings', 'Target HS IO-Out', 'CLKGEN'], ['OpenADC', 'Clock Setup', 'ADC Clock', 'Source', 'CLKGEN x4 via DCM'], ['OpenADC', 'Trigger Setup', 'Total Samples', 3000], ['OpenADC', 'Trigger Setup', 'Offset', 1250], ['OpenADC', 'Gain Setting', 'Setting', 45], ['OpenADC', 'Trigger Setup', 'Mode', 'rising edge'], #Final step: make DCMs relock in case they are lost ['OpenADC', 'Clock Setup', 'ADC Clock', 'Reset ADC DCM', None], ] for cmd in lstexample: self.api.setParameter(cmd) # Capture a set of traces with random key and save the project self.api.setParameter(['Generic Settings', 'Basic', 'Key', 'Random']) self.api.setParameter(['Generic Settings', 'Acquisition Settings', 'Number of Traces', 1500]) self.api.saveProject("projects/tut_randkey_randplain.cwp") self.api.captureM() self.api.saveProject() # Capture a set of traces with fixed key and save the project self.api.newProject() self.api.saveProject("projects/tut_fixedkey_randplain.cwp") self.api.setParameter(['Generic Settings', 'Basic', 'Key', 'Fixed']) self.api.setParameter(['Generic Settings', 'Acquisition Settings', 'Number of Traces', 20]) self.api.captureM() self.api.saveProject()
def run(self): # Delete previous project files if os.path.isfile("projects/glitchtest.cwp"): os.remove("projects/glitchtest.cwp") shutil.rmtree("projects/glitchtest_data", ignore_errors=True) # Save current open project (default) to a new place self.api.saveProject("projects/glitchtest.cwp") print "Software Setup - 1. Connect to the ChipWhisperer device:" self.api.setParameter(['Generic Settings', 'Scope Module', 'ChipWhisperer/OpenADC']) self.api.setParameter(['Generic Settings', 'Target Module', 'Simple Serial']) self.api.setParameter(['Generic Settings', 'Trace Format', 'None']) self.api.setParameter(['Simple Serial', 'Connection', 'NewAE USB (CWLite/CW1200)']) self.api.setParameter(['ChipWhisperer/OpenADC', 'Connection', 'NewAE USB (CWLite/CW1200)']) # Connect to both: scope and target self.api.connect() print "Software Setup - 2. Setup the CLKGEN Module to Generate a 7.37 MHz clock and route it through the Glitch Generator" lstexample = [ ['OpenADC', 'Clock Setup', 'Freq Counter Src', 'CLKGEN Output'], ['OpenADC', 'Clock Setup', 'CLKGEN Settings', 'Desired Frequency', 7370000.0], ['OpenADC', 'Clock Setup', 'ADC Clock', 'Reset ADC DCM', None], ['Glitch Module', 'Clock Source', 'CLKGEN'], ['CW Extra Settings', 'Target HS IO-Out', 'Glitch Module'], ] for cmd in lstexample: self.api.setParameter(cmd) print "Software Setup - 3. Connect the Serial Port" lstexample = [ ['CW Extra Settings', 'Target IOn Pins', 'Target IO1', 'Serial RXD'], ['CW Extra Settings', 'Target IOn Pins', 'Target IO2', 'Serial TXD'] ] for cmd in lstexample: self.api.setParameter(cmd) print "Software Setup - 3.4. Flashing test firmware" xmega = XMEGAProgrammer() xmega.setUSBInterface(self.api.getScope().scopetype.dev.xmega) xmega._logging = None xmega.find() xmega.erase() xmega.program(r"glitchsimple.hex", memtype="flash", verify=True) xmega.close() print "Manual Glitch Trigger" lstexample = [ ['Glitch Module', 'Glitch Width (as % of period)', 10], ['Glitch Module', 'Glitch Offset (as % of period)', 26.6], ['Glitch Module', 'Repeat', 105], ['Glitch Module', 'Glitch Trigger', 'Manual'], ['Glitch Module', 'Manual Trigger / Single-Shot Arm', None], # Push the button ] for cmd in lstexample: self.api.setParameter(cmd) print "Automatically Resetting Target" lstexample = [ ['Generic Settings', 'Auxiliary Module', 'Reset AVR/XMEGA via CW-Lite'], ['Aux Settings', 'Reset AVR/XMEGA via CW-Lite', 'Interface', 'xmega (PDI)'], ['Aux Settings', 'Reset AVR/XMEGA via CW-Lite', 'Test Reset', None], # Push the button ['Simple Serial', 'Load Key Command', u''], ['Simple Serial', 'Go Command', u''], ['Simple Serial', 'Output Format', u''], ] for cmd in lstexample: self.api.setParameter(cmd) self.api.capture1() self.api.capture1() self.api.capture1() print "Automatically Triggering Glitch - Enable the power analysis capture" lstexample = [ ['OpenADC', 'Clock Setup', 'ADC Clock', 'Source', 'CLKGEN x4 via DCM'], ['OpenADC', 'Clock Setup', 'ADC Clock', 'Reset ADC DCM', None], # Push the button ['OpenADC', 'Trigger Setup', 'Mode', 'rising edge'], ['OpenADC', 'Trigger Setup', 'Total Samples', 1000], ['OpenADC', 'Gain Setting', 'Setting', 40], ] for cmd in lstexample: self.api.setParameter(cmd) self.api.capture1() self.api.capture1() self.api.capture1() print "Automatically Triggering Glitch - Enable the trigger of the glitch to occur based on this external trigger pin" self.api.setParameter(['Glitch Module', 'Glitch Trigger', 'Ext Trigger:Single-Shot']) self.api.capture1() self.api.capture1() self.api.capture1() print "Using the Glitch Explorer" self.api.setParameter(['Simple Serial', 'Output Format', u'$GLITCH$']) self.api.capture1() self.api.capture1() self.api.capture1() lstexample = [ ['Glitch Explorer', 'Normal Response', u"s == '\\x00hello\\nA'"], ['Glitch Explorer', 'Successful Response', u"s.endswith('1234')"], ] for cmd in lstexample: self.api.setParameter(cmd) self.api.capture1() self.api.capture1() self.api.capture1() print "Using the Glitch Explorer - Tune the glitch offset to attempt to get a successful clock glitch" self.api.setParameter(['Glitch Explorer', 'Plot Widget', None]) # Push the button lstexample = [ ['Glitch Explorer', 'Tuning Parameters', 1], ['Glitch Explorer', 'Tuning Parameter 0', 'Name', u'Offset'], ['Glitch Explorer', 'Tuning Parameter 0', 'Parameter Path', u"['Glitch Module', 'Glitch Offset (as % of period)']"], ['Glitch Explorer', 'Tuning Parameter 0', 'Data Format', 'Float'], ['Glitch Explorer', 'Tuning Parameter 0', 'Range', (-30, 30)], ['Glitch Explorer', 'Tuning Parameter 0', 'Value', -30.0], ['Glitch Explorer', 'Tuning Parameter 0', 'Step', 0.5], ['Glitch Explorer', 'Tuning Parameter 0', 'Repeat', 1], ['Glitch Module', 'Repeat', 10], ['Glitch Module', 'Glitch Width (as % of period)', 8.0], ['Generic Settings', 'Acquisition Settings', 'Number of Traces', 121] ] for cmd in lstexample: self.api.setParameter(cmd) self.api.captureM() print "Using the Glitch Explorer - Tune the Glitch Width" lstexample = [ ['Glitch Explorer', 'Tuning Parameters', 2], ['Glitch Explorer', 'Tuning Parameter 1', 'Name', u'Width'], ['Glitch Explorer', 'Tuning Parameter 1', 'Parameter Path', u"['Glitch Module', 'Glitch Width (as % of period)']"], ['Glitch Explorer', 'Tuning Parameter 1', 'Data Format', 'Float'], ['Glitch Explorer', 'Tuning Parameter 1', 'Range', (4, 11)], ['Glitch Explorer', 'Tuning Parameter 1', 'Value', 4], ['Glitch Explorer', 'Tuning Parameter 1', 'Step', 0.5], ['Glitch Explorer', 'Tuning Parameter 1', 'Repeat', 1], ['Glitch Explorer', 'Tuning Parameter 0', 'Range', (-8, 3)], ['Glitch Explorer', 'Tuning Parameter 0', 'Value', -8], ['Glitch Module', 'Repeat', 1], ['Generic Settings', 'Acquisition Settings', 'Number of Traces', 345], ] for cmd in lstexample: self.api.setParameter(cmd) self.api.captureM() print "Using the Glitch Explorer - Fine-tune those values" self.api.setParameter(['Glitch Module', 'Glitch Offset (as % of period)',-3.5]) self.api.setParameter(['Glitch Module', 'Glitch Width (as % of period)',7.5]) self.api.capture1() self.api.capture1() self.api.capture1() self.api.setParameter(['Glitch Module', 'Glitch Offset (fine adjust)', 44]) self.api.capture1() self.api.capture1() self.api.capture1()
class XMEGAProgrammerDialog(QtFixes.QDialog): def __init__(self): super(XMEGAProgrammerDialog, self).__init__(CWMainGUI.getInstance()) # self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint) self.xmega = XMEGAProgrammer() self.setWindowTitle("ChipWhisperer-Lite XMEGA Programmer") layout = QVBoxLayout() layoutFW = QHBoxLayout() self.flashLocation = QtFixes.QLineEdit() flashFileButton = QPushButton("Find") flashFileButton.clicked.connect(self.findFlash) layoutFW.addWidget(QLabel("FLASH File")) layoutFW.addWidget(self.flashLocation) layoutFW.addWidget(flashFileButton) layout.addLayout(layoutFW) self.flashLocation.setText(QSettings().value("xmega-flash-location")) # Add buttons readSigBut = QPushButton("Check Signature") readSigBut.clicked.connect(self.readSignature) verifyFlashBut = QPushButton("Verify FLASH") verifyFlashBut.clicked.connect(self.verifyFlash) verifyFlashBut.setEnabled(False) progFlashBut = QPushButton("Erase/Program/Verify FLASH") progFlashBut.clicked.connect(self.writeFlash) layoutBut = QHBoxLayout() layoutBut.addWidget(readSigBut) layoutBut.addWidget(verifyFlashBut) layoutBut.addWidget(progFlashBut) layout.addLayout(layoutBut) # Add status stuff self.statusLine = QPlainTextEdit() self.statusLine.setReadOnly(True) # self.statusLine.setFixedHeight(QFontMetrics(self.statusLine.font()).lineSpacing() * 5 + 10) self.statusLine.append = self.statusLine.appendPlainText layout.addWidget(self.statusLine) self.xmega._logging = self.statusLine.append # Set dialog layout self.setLayout(layout) def findFlash(self): fname, _ = QFileDialog.getOpenFileName(self, 'Find FLASH File', QSettings().value("xmega-flash-location"), '*.hex') if fname: self.flashLocation.setText(fname) QSettings().setValue("xmega-flash-location", fname) def readSignature(self, close=True): self.xmega.find() if close: self.xmega.close() def verifyFlash(self): pass def writeFlash(self, erase=True, verify=True): status = "FAILED" fname = self.flashLocation.text() self.statusLine.append("***Starting FLASH program process at %s***" % datetime.now().strftime('%H:%M:%S')) if (os.path.isfile(fname)): self.statusLine.append("File %s last changed on %s" % (fname, time.ctime(os.path.getmtime(fname)))) QCoreApplication.processEvents() try: self.statusLine.append("Entering Programming Mode") QCoreApplication.processEvents() self.readSignature(close=False) if erase: try: self.statusLine.append("Erasing Chip") QCoreApplication.processEvents() self.xmega.erase() except IOError: self.statusLine.append("**chip-erase timeout, erasing application only**") QCoreApplication.processEvents() self.xmega.xmega.enablePDI(False) self.xmega.xmega.enablePDI(True) self.xmega.erase("app") QCoreApplication.processEvents() self.xmega.program(self.flashLocation.text(), memtype="flash", verify=verify) QCoreApplication.processEvents() self.statusLine.append("Exiting programming mode") self.xmega.close() QCoreApplication.processEvents() status = "SUCCEEDED" except IOError, e: self.statusLine.append("FAILED: %s" % str(e)) try: self.xmega.close() except IOError: pass else:
def run(self): for cmd in [ ['Generic Settings', 'Scope Module', 'ChipWhisperer/OpenADC'], ['Generic Settings', 'Target Module', 'Simple Serial'], ['Generic Settings', 'Trace Format', 'ChipWhisperer/Native'], ['Simple Serial', 'Connection', 'NewAE USB (CWLite/CW1200)'], ['ChipWhisperer/OpenADC', 'Connection', 'NewAE USB (CWLite/CW1200)'], ]: self.api.setParameter(cmd) self.api.connect() # Flash the firmware xmega = XMEGAProgrammer() xmega.setUSBInterface(self.api.getScope().scopetype.dev.xmega) xmega.find() xmega.erase() xmega.program(getFirmwarePath('usb-descriptor-simple'), memtype='flash', verify=True) xmega.close() # Capture parameters for cmd in [ ['Simple Serial', 'Load Key Command', u''], ['Simple Serial', 'Go Command', u'\n'], ['Simple Serial', 'Output Format', u'$GLITCH$8000'], ['Simple Serial', 'NewAE USB (CWLite/CW1200)', 'baud', 115200], ['CW Extra Settings', 'Trigger Pins', 'Target IO4 (Trigger Line)', True], ['CW Extra Settings', 'Target IOn Pins', 'Target IO1', 'Serial RXD'], ['CW Extra Settings', 'Target IOn Pins', 'Target IO2', 'Serial TXD'], ['CW Extra Settings', 'Target HS IO-Out', 'CLKGEN'], ['OpenADC', 'Clock Setup', 'CLKGEN Settings', 'Desired Frequency', 12e6], ['OpenADC', 'Clock Setup', 'ADC Clock', 'Source', 'CLKGEN x4 via DCM'], ['OpenADC', 'Trigger Setup', 'Total Samples', 24400], ['OpenADC', 'Trigger Setup', 'Pre-Trigger Samples', 0], ['OpenADC', 'Trigger Setup', 'Offset', 14100], ['OpenADC', 'Gain Setting', 'Setting', 38], ['OpenADC', 'Trigger Setup', 'Mode', 'rising edge'], ['OpenADC', 'Clock Setup', 'ADC Clock', 'Reset ADC DCM', None], ['Generic Settings', 'Acquisition Settings', 'Number of Traces', 500], ['CW Extra Settings', 'HS-Glitch Out Enable (Low Power)', True], ['CW Extra Settings', 'HS-Glitch Out Enable (High Power)', True], ['Glitch Module', 'Clock Source', 'CLKGEN'], ['Glitch Module', 'Single-Shot Arm', 'Before Scope Arm'], ['Glitch Module', 'Glitch Trigger', 'Ext Trigger:Single-Shot'], ['Glitch Module', 'Output Mode', 'Glitch Only'], ['Glitch Module', 'Glitch Width (as % of period)', 44.4], ['Glitch Module', 'Glitch Offset (as % of period)', 5.3], ['Glitch Module', 'Repeat', 2], ['Glitch Module', 'Ext Trigger Offset', 7218], # Fixme: these are specific to the target device I'm experimenting on ['Glitch Explorer', 'Normal Response', u's.find("rcode 5 total 34") >= 0'], ['Glitch Explorer', 'Successful Response', u"(lambda n: n.isdigit() and int(n))((s+' x').split('total ')[-1].split()[0]) > 34"], ]: self.api.setParameter(cmd) self.api.capture1() self.api.capture1()
def run(self): # Deletes previous saved data if os.path.isfile("projects/tut_cpa.cwp"): os.remove("projects/tut_cpa.cwp") shutil.rmtree("projects/tut_cpa_data", ignore_errors=True) # Setup the capture hardware self.api.setParameter( ['Generic Settings', 'Scope Module', 'ChipWhisperer/OpenADC']) self.api.setParameter( ['Generic Settings', 'Target Module', 'Simple Serial']) self.api.setParameter( ['Generic Settings', 'Trace Format', 'ChipWhisperer/Native']) self.api.setParameter( ['Simple Serial', 'Connection', 'NewAE USB (CWLite/CW1200)']) self.api.setParameter([ 'ChipWhisperer/OpenADC', 'Connection', 'NewAE USB (CWLite/CW1200)' ]) # Conect both: scope and target self.api.connect() # Flash the firmware xmega = XMEGAProgrammer() xmega.setUSBInterface(self.api.getScope().scopetype.dev.xmega) xmega._logging = None xmega.find() xmega.erase() xmega.program(r"simeplserial-aes-xmega.hex", memtype="flash", verify=True) xmega.close() # Setup the capture parameters lstexample = [ [ 'CW Extra Settings', 'Trigger Pins', 'Target IO4 (Trigger Line)', True ], [ 'CW Extra Settings', 'Target IOn Pins', 'Target IO1', 'Serial RXD' ], [ 'CW Extra Settings', 'Target IOn Pins', 'Target IO2', 'Serial TXD' ], [ 'OpenADC', 'Clock Setup', 'CLKGEN Settings', 'Desired Frequency', 7370000.0 ], ['CW Extra Settings', 'Target HS IO-Out', 'CLKGEN'], [ 'OpenADC', 'Clock Setup', 'ADC Clock', 'Source', 'CLKGEN x4 via DCM' ], ['OpenADC', 'Trigger Setup', 'Total Samples', 3000], ['OpenADC', 'Trigger Setup', 'Offset', 1250], ['OpenADC', 'Gain Setting', 'Setting', 45], ['OpenADC', 'Trigger Setup', 'Mode', 'rising edge'], #Final step: make DCMs relock in case they are lost ['OpenADC', 'Clock Setup', 'ADC Clock', 'Reset ADC DCM', None], ] for cmd in lstexample: self.api.setParameter(cmd) # Capture a set of traces with fixed key and save the project self.api.newProject() self.api.saveProject("projects/tut_cpa.cwp") self.api.setParameter(['Generic Settings', 'Basic', 'Key', 'Fixed']) self.api.setParameter([ 'Generic Settings', 'Basic', 'Fixed Encryption Key', u'2B 7E 15 16 28 AE D2 A6 AB F7 15 88 09 CF 4F 3C' ]) self.api.setParameter([ 'Generic Settings', 'Acquisition Settings', 'Number of Traces', 50 ]) time.sleep(1) self.api.captureM() self.api.saveProject()
scope.gain.gain = 45 scope.adc.samples = 3000 scope.adc.offset = 0 scope.adc.basic_mode = "rising_edge" scope.clock.clkgen_freq = 7370000 scope.clock.adc_src = "clkgen_x4" scope.trigger.triggers = "tio4" scope.io.tio1 = "serial_rx" scope.io.tio2 = "serial_tx" scope.io.hs2 = "glitch" target.go_cmd = "" target.key_cmd = "" # program the XMEGA with the built hex file programmer = XMEGAProgrammer() programmer.scope = scope programmer._logging = None programmer.find() programmer.erase() glitch_simple_firmware_dir = os.path.join(FIRMWARE_DIR, 'glitch-simple') glitch_simple_hex = os.path.join(glitch_simple_firmware_dir, r"glitchsimple-CW303.hex") programmer.program(glitch_simple_hex, memtype="flash", verify=True) programmer.close() # format output table headers = ['target output', 'width', 'offset', 'success'] #glitch_display = GlitchResultsDisplay(headers) # set glitch parameters
class XMEGAProgrammerDialog(QtFixes.QDialog): def __init__(self): super(XMEGAProgrammerDialog, self).__init__(CWMainGUI.getInstance()) # self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint) self.xmega = XMEGAProgrammer() self.setWindowTitle("ChipWhisperer-Lite XMEGA Programmer") layout = QVBoxLayout() layoutFW = QHBoxLayout() self.flashLocation = QtFixes.QLineEdit() flashFileButton = QPushButton("Find") flashFileButton.clicked.connect(self.findFlash) layoutFW.addWidget(QLabel("FLASH File")) layoutFW.addWidget(self.flashLocation) layoutFW.addWidget(flashFileButton) layout.addLayout(layoutFW) self.flashLocation.setText(QSettings().value("xmega-flash-location")) # Add buttons readSigBut = QPushButton("Check Signature") readSigBut.clicked.connect(self.readSignature) verifyFlashBut = QPushButton("Verify FLASH") verifyFlashBut.clicked.connect(self.verifyFlash) verifyFlashBut.setEnabled(False) progFlashBut = QPushButton("Erase/Program/Verify FLASH") progFlashBut.clicked.connect(self.writeFlash) layoutBut = QHBoxLayout() layoutBut.addWidget(readSigBut) layoutBut.addWidget(verifyFlashBut) layoutBut.addWidget(progFlashBut) layout.addLayout(layoutBut) # Add status stuff self.statusLine = QPlainTextEdit() self.statusLine.setReadOnly(True) # self.statusLine.setFixedHeight(QFontMetrics(self.statusLine.font()).lineSpacing() * 5 + 10) self.xmega.newTextLog.connect(self.append) layout.addWidget(self.statusLine) # Set dialog layout self.setLayout(layout) def append(self, text): self.statusLine.appendPlainText(text) def findFlash(self): fname, _ = QFileDialog.getOpenFileName( self, 'Find FLASH File', QSettings().value("xmega-flash-location"), '*.hex') if fname: self.flashLocation.setText(fname) QSettings().setValue("xmega-flash-location", fname) def readSignature(self, close=True): self.xmega.find() if close: self.xmega.close() def verifyFlash(self): pass def writeFlash(self, erase=True, verify=True): status = "FAILED" fname = self.flashLocation.text() self.statusLine.appendPlainText( "***Starting FLASH program process at %s***" % datetime.now().strftime('%H:%M:%S')) if (os.path.isfile(fname)): self.statusLine.appendPlainText( "File %s last changed on %s" % (fname, time.ctime(os.path.getmtime(fname)))) QCoreApplication.processEvents() try: self.statusLine.appendPlainText("Entering Programming Mode") QCoreApplication.processEvents() self.readSignature(close=False) if erase: try: self.xmega.erase() except IOError: self.statusLine.appendPlainText( "**chip-erase timeout, erasing application only**") QCoreApplication.processEvents() self.xmega.xmega.enablePDI(False) self.xmega.xmega.enablePDI(True) self.xmega.erase("app") QCoreApplication.processEvents() self.xmega.program(self.flashLocation.text(), memtype="flash", verify=verify) QCoreApplication.processEvents() self.statusLine.appendPlainText("Exiting programming mode") self.xmega.close() QCoreApplication.processEvents() status = "SUCCEEDED" except IOError, e: self.statusLine.appendPlainText("FAILED: %s" % str(e)) try: self.xmega.close() except IOError: pass else: