chiark / gitweb /
Prevent installing UM2 or UMO+ firmware on an UMO. And the other way around. Also...
authordaid <daid303@gmail.com>
Tue, 14 Oct 2014 12:36:44 +0000 (14:36 +0200)
committerYouness Alaoui <kakaroto@kakaroto.homelinux.net>
Wed, 14 Jan 2015 16:04:23 +0000 (11:04 -0500)
Cura/avr_isp/stk500v2.py
Cura/gui/firmwareInstall.py

index 56a2223fef4ee78604d80d102f0bf680a61c127b..62fd17260f0d78ea7c91f510040378103a1a48f8 100644 (file)
@@ -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)
index 6f2c27b93fa0d5b7e7374044fcf5c9b402750e88..aa0a8b250dc30d5638f54d77534cf095dbaa636d 100644 (file)
@@ -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)