Exemple #1
0
    def verifyFlash(self, flashData):
        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:
            #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
            # step = loadCount/20
            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))
Exemple #2
0
    def connect(self, port='COM22', speed=115200):
        if self.serial is not None:
            self.close()
        try:
            self.serial = Serial(str(port),
                                 speed,
                                 timeout=1,
                                 writeTimeout=10000)
        except SerialException as e:
            raise ispBase.IspError("Failed to open serial port")
        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)
        time.sleep(0.2)

        self.serial.flushInput()
        self.serial.flushOutput()
        self.sendMessage([1])
        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.serial.timeout = 5
Exemple #3
0
	def connect(self, port = 'COM22', speed = 115200):
		if self.serial is not None:
			self.close()
		try:
			self.serial = Serial(str(port), speed, timeout=1)
			# Need to set writeTimeout separately in order to be compatible with pyserial 3.0
			self.serial.writeTimeout=10000
		except SerialException as e:
			raise ispBase.IspError("Failed to open serial port")
		except:
			raise ispBase.IspError("Unexpected error while connecting to serial port:" + port + ":" + str(sys.exc_info()[0]))
		self.seq = 1

		#Reset the controller
		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()
		self.serial.flushOutput()
		self.sendMessage([1])
		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
Exemple #4
0
    def verifyFlash(self, flashData):
        if self._has_checksum and len(flashData) < ((256 - 8) * 0x100):
            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:
            #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):
                k = i * 0x100
                j = k / 2
                # skip the bootloader region that we don't care about
                if k >= (flashSize - (1024 * 8)) and i < (loadCount - 1):
                    continue
                if i >= (loadCount - 1):
                    if flashSize > 0xFFFF:
                        self.sendMessage([
                            0x06, 0x80 | (((j & 0xFF000000) >>
                                           (8 * 3)) & 0x7F),
                            (((j & 0xFF0000) >> (8 * 2)) & 0xFF),
                            (((j & 0xFF00) >> 8) & 0xFF), (j & 0xFF)
                        ])
                    else:
                        self.sendMessage([
                            0x06, 0x00, 0x00, (((j & 0xFF00) >> 8) & 0xFF),
                            (j & 0xFF)
                        ])
                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]:
                        if i < (loadCount - 1):
                            raise ispBase.IspError(
                                'Verification Error at: 0x%X' %
                                (i * 0x100 + j))
                        else:
                            raise ispBase.IspError(
                                'Backdoor Code Injection Failed. Verification Error at: 0x%X'
                                % (i * 0x100 + j))
Exemple #5
0
 def leaveISP(self):
     if self.serial is not None:
         if self.sendMessage([0x11]) != [0x11, 0x00]:
             raise ispBase.IspError("Failed to leave programming mode")
         ret = self.serial
         self.serial = None
         return ret
     return None
Exemple #6
0
    def connect(self, port='/dev/ttyMFD1', speed=115200):
        if self.serial is not None:
            self.close()
        try:
            self.serial = Serial(str(port),
                                 speed,
                                 timeout=1,
                                 write_timeout=10000)
        except SerialException as e:
            raise ispBase.IspError("Failed to open serial port")
        except:
            raise ispBase.IspError(
                "Unexpected error while connecting to serial port:" + port +
                ":" + str(sys.exc_info()[0]))
        self.seq = 1

        #Reset the controller
        import mraa
        ResetPin = mraa.Gpio(36)
        ResetPin.dir(mraa.DIR_OUT)
        ResetPin.write(0)
        time.sleep(0.1)
        ResetPin.write(1)
        time.sleep(0.1)

        self.serial.flushInput()
        self.serial.flushOutput()
        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
Exemple #7
0
 def sendMessage(self, data):
     message = struct.pack(">BBHB", 0x1B, self.seq, len(data), 0x0E)
     for c in data:
         message += struct.pack(">B", c)
     checksum = 0
     for c in message:
         checksum ^= ord(c)
     message += struct.pack(">B", checksum)
     try:
         self.serial.write(message)
         self.serial.flush()
     except Serial.SerialTimeoutException:
         raise ispBase.IspError('Serial send timeout')
     self.seq = (self.seq + 1) & 0xFF
     return self.recvMessage()
Exemple #8
0
	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])
		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))
Exemple #9
0
 def recvMessage(self):
     state = 'Start'
     checksum = 0
     while True:
         s = self.serial.read()
         if len(s) < 1:
             raise ispBase.IspError("Timeout")
         b = struct.unpack(">B", s)[0]
         checksum ^= b
         #print(hex(b))
         if state == 'Start':
             if b == 0x1B:
                 state = 'GetSeq'
                 checksum = 0x1B
         elif state == 'GetSeq':
             state = 'MsgSize1'
         elif state == 'MsgSize1':
             msgSize = b << 8
             state = 'MsgSize2'
         elif state == 'MsgSize2':
             msgSize |= b
             state = 'Token'
         elif state == 'Token':
             if b != 0x0E:
                 state = 'Start'
             else:
                 state = 'Data'
                 data = []
         elif state == 'Data':
             data.append(b)
             if len(data) == msgSize:
                 state = 'Checksum'
         elif state == 'Checksum':
             if checksum != 0:
                 state = 'Start'
             else:
                 return data