# in toprammer class IO_ihex def toBinary(self, ihexData): bin = [] for i in range(0,0xFFFF,1): bin += chr(0xFF) try: lines = ihexData.splitlines() hiAddr = 0 for line in lines: line = line.strip() if len(line) == 0: continue if len(line) < 11 or (len(line) - 1) % 2 != 0: raise TOPException("Invalid IHEX format (length error)") if line[0] != ':': raise TOPException("Invalid IHEX format (magic error)") count = int(line[1:3], 16) if len(line) != count * 2 + 11: raise TOPException("Invalid IHEX format (count error)") addr = (int(line[3:5], 16) << 8) | int(line[5:7], 16) addr |= hiAddr << 16 type = int(line[7:9], 16) checksum = 0 for i in range(1, len(line), 2): byte = int(line[i:i+2], 16) checksum = (checksum + byte) & 0xFF checksum = checksum & 0xFF # if checksum != 0: # raise TOPException("Invalid IHEX format (checksum error)") if type == self.TYPE_EOF: break if type == self.TYPE_ELAR: if count != 2: raise TOPException("Invalid IHEX format (inval ELAR)") hiAddr = (int(line[9:11], 16) << 8) | int(line[11:13], 16) continue if type == self.TYPE_DATA: if len(bin) < addr + count: # Reallocate bin += ['\0'] * (addr + count - len(bin)) for i in range(9, 9 + count * 2, 2): byte = chr(int(line[i:i+2], 16)) # if bin[(i - 9) / 2 + addr] != '\0': # raise TOPException("Invalid IHEX format (corruption)") bin[(i - 9) / 2 + addr] = byte continue raise TOPException("Invalid IHEX format (unsup type %d)" % type) except ValueError: raise TOPException("Invalid IHEX format (digit format)") return "".join(bin) # in chip_m2764a.py def writeEEPROM(self, image): # if len(image) != 0x2000: # self.throwError("Invalid EPROM image size %d (expected %d)" %\ # (len(image), 0x2000)) self.top.cmdSetVCCXVoltage(5) self.top.cmdSetVPPVoltage(12) self.top.vccx.setLayoutPins( (38,) ) self.top.vpp.setLayoutPins( (5, 6, 7, 9, 11) ) self.top.gnd.setLayoutPins( (24,) ) self.progressMeterInit("Writing EPROM", 0x2000) self.__setEG(E=1, G=1) for addr in range(0, 0x2000): self.progressMeter(addr) if ord(image[addr]) != 0xFF: self.__writeData(addr, ord(image[addr])) self.__setEG(E=1, G=1) self.progressMeterFinish() def __readData(self, addr): self.__loadAddr(addr) self.__setEG(E=0, G=0) self.top.cmdFPGAReadByte() stat = self.top.cmdReadStatusReg() return stat[0] def __writeData(self, addr, data): self.__setEG(E=0, G=1) self.__loadAddr(addr) self.__loadData(data) self.__loadPPulseLen(1) self.__runCommandSync(self.PROGCMD_PPULSE) for i in range(0, 25): r = ord(self.__readData(addr)) if r == data: break self.__setEG(E=0, G=1) self.__runCommandSync(self.PROGCMD_PPULSE) else: self.throwError("Failed to program 0x%04X (got 0x%02X, expected 0x%02X)" %\ (addr, r, data)) self.__setEG(E=0, G=1) self.__loadPPulseLen(3 * (i + 1)) self.__runCommandSync(self.PROGCMD_PPULSE)