From 3d5186288fe5b1540641c83298062f894888eb26 Mon Sep 17 00:00:00 2001 From: daid Date: Tue, 14 Oct 2014 14:36:44 +0200 Subject: [PATCH] Prevent installing UM2 or UMO+ firmware on an UMO. And the other way around. Also improve the reset feature to see if that helps with people who are getting TIMEOUT errors. --- Cura/avr_isp/stk500v2.py | 67 +++++++++++++++++++++++++------------ Cura/gui/firmwareInstall.py | 18 ++++++++-- 2 files changed, 62 insertions(+), 23 deletions(-) diff --git a/Cura/avr_isp/stk500v2.py b/Cura/avr_isp/stk500v2.py index 56a2223f..62fd1726 100644 --- a/Cura/avr_isp/stk500v2.py +++ b/Cura/avr_isp/stk500v2.py @@ -27,11 +27,13 @@ class Stk500v2(ispBase.IspBase): except: raise ispBase.IspError("Unexpected error while connecting to serial port:" + port + ":" + str(sys.exc_info()[0])) self.seq = 1 - + #Reset the controller - self.serial.setDTR(1) - time.sleep(0.1) - self.serial.setDTR(0) + for n in xrange(0, 2): + self.serial.setDTR(True) + time.sleep(0.1) + self.serial.setDTR(False) + time.sleep(0.1) time.sleep(0.2) self.serial.flushInput() @@ -40,6 +42,12 @@ class Stk500v2(ispBase.IspBase): if self.sendMessage([0x10, 0xc8, 0x64, 0x19, 0x20, 0x00, 0x53, 0x03, 0xac, 0x53, 0x00, 0x00]) != [0x10, 0x00]: self.close() raise ispBase.IspError("Failed to enter programming mode") + + self.sendMessage([0x06, 0x80, 0x00, 0x00, 0x00]) + if self.sendMessage([0xEE])[1] == 0x00: + self._has_checksum = True + else: + self._has_checksum = False self.serial.timeout = 5 def close(self): @@ -60,7 +68,10 @@ class Stk500v2(ispBase.IspBase): def isConnected(self): return self.serial is not None - + + def hasChecksumFunction(self): + return self._has_checksum + def sendISP(self, data): recv = self.sendMessage([0x1D, 4, 4, 0, data[0], data[1], data[2], data[3]]) return recv[2:6] @@ -77,25 +88,39 @@ class Stk500v2(ispBase.IspBase): loadCount = (len(flashData) + pageSize - 1) / pageSize for i in xrange(0, loadCount): recv = self.sendMessage([0x13, pageSize >> 8, pageSize & 0xFF, 0xc1, 0x0a, 0x40, 0x4c, 0x20, 0x00, 0x00] + flashData[(i * pageSize):(i * pageSize + pageSize)]) - if self.progressCallback != None: - self.progressCallback(i + 1, loadCount*2) + if self.progressCallback is not None: + if self._has_checksum: + self.progressCallback(i + 1, loadCount) + else: + self.progressCallback(i + 1, loadCount*2) def verifyFlash(self, flashData): - #Set load addr to 0, in case we have more then 64k flash we need to enable the address extension - flashSize = self.chip['pageSize'] * 2 * self.chip['pageCount'] - if flashSize > 0xFFFF: - self.sendMessage([0x06, 0x80, 0x00, 0x00, 0x00]) + if self._has_checksum: + self.sendMessage([0x06, 0x00, (len(flashData) >> 17) & 0xFF, (len(flashData) >> 9) & 0xFF, (len(flashData) >> 1) & 0xFF]) + res = self.sendMessage([0xEE]) + checksum_recv = res[2] | (res[3] << 8) + checksum = 0 + for d in flashData: + checksum += d + checksum &= 0xFFFF + if hex(checksum) != hex(checksum_recv): + raise ispBase.IspError('Verify checksum mismatch: 0x%x != 0x%x' % (checksum & 0xFFFF, checksum_recv)) else: - self.sendMessage([0x06, 0x00, 0x00, 0x00, 0x00]) - - loadCount = (len(flashData) + 0xFF) / 0x100 - for i in xrange(0, loadCount): - recv = self.sendMessage([0x14, 0x01, 0x00, 0x20])[2:0x102] - if self.progressCallback != None: - self.progressCallback(loadCount + i + 1, loadCount*2) - for j in xrange(0, 0x100): - if i * 0x100 + j < len(flashData) and flashData[i * 0x100 + j] != recv[j]: - raise ispBase.IspError('Verify error at: 0x%x' % (i * 0x100 + j)) + #Set load addr to 0, in case we have more then 64k flash we need to enable the address extension + flashSize = self.chip['pageSize'] * 2 * self.chip['pageCount'] + if flashSize > 0xFFFF: + self.sendMessage([0x06, 0x80, 0x00, 0x00, 0x00]) + else: + self.sendMessage([0x06, 0x00, 0x00, 0x00, 0x00]) + + loadCount = (len(flashData) + 0xFF) / 0x100 + for i in xrange(0, loadCount): + recv = self.sendMessage([0x14, 0x01, 0x00, 0x20])[2:0x102] + if self.progressCallback is not None: + self.progressCallback(loadCount + i + 1, loadCount*2) + for j in xrange(0, 0x100): + if i * 0x100 + j < len(flashData) and flashData[i * 0x100 + j] != recv[j]: + raise ispBase.IspError('Verify error at: 0x%x' % (i * 0x100 + j)) def sendMessage(self, data): message = struct.pack(">BBHB", 0x1B, self.seq, len(data), 0x0E) diff --git a/Cura/gui/firmwareInstall.py b/Cura/gui/firmwareInstall.py index 6f2c27b9..aa0a8b25 100644 --- a/Cura/gui/firmwareInstall.py +++ b/Cura/gui/firmwareInstall.py @@ -60,12 +60,13 @@ class InstallFirmware(wx.Dialog): wx.MessageBox(_("I am sorry, but Cura does not ship with a default firmware for your machine configuration."), _("Firmware update"), wx.OK | wx.ICON_ERROR) self.Destroy() return - if profile.getMachineSetting('machine_type', machineIndex) == 'reprap': + self._machine_type = profile.getMachineSetting('machine_type', machineIndex) + if self._machine_type == 'reprap': wx.MessageBox(_("Cura only supports firmware updates for ATMega2560 based hardware.\nSo updating your RepRap with Cura might or might not work."), _("Firmware update"), wx.OK | wx.ICON_INFORMATION) sizer = wx.BoxSizer(wx.VERTICAL) - self.progressLabel = wx.StaticText(self, -1, 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\nX') + self.progressLabel = wx.StaticText(self, -1, 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\nX\nX') sizer.Add(self.progressLabel, 0, flag=wx.ALIGN_CENTER|wx.ALL, border=5) self.progressGauge = wx.Gauge(self, -1) sizer.Add(self.progressGauge, 0, flag=wx.EXPAND) @@ -120,6 +121,19 @@ class InstallFirmware(wx.Dialog): wx.CallAfter(self.Close) return + if self._machine_type == 'ultimaker': + if programmer.hasChecksumFunction(): + wx.CallAfter(self.updateLabel, _("Failed to install firmware:\nThis firmware is not compatible with this machine.\nTrying to install UMO firmware on an UM2 or UMO+?")) + programmer.close() + wx.CallAfter(self.okButton.Enable) + return + if self._machine_type == 'ultimaker_plus' or self._machine_type == 'ultimaker2': + if not programmer.hasChecksumFunction(): + wx.CallAfter(self.updateLabel, _("Failed to install firmware:\nThis firmware is not compatible with this machine.\nTrying to install UM2 or UMO+ firmware on an UMO?")) + programmer.close() + wx.CallAfter(self.okButton.Enable) + return + wx.CallAfter(self.updateLabel, _("Uploading firmware...")) try: programmer.programChip(hexFile) -- 2.30.2