import struct import sys import pic18 import pic24 import pk2cmd_script datfile = open("../pk2cmd/pk2cmd/PK2DeviceFile.dat").read() def readstr(datfile, offset): length = ord(datfile[offset]) & 0xff offset += 1 if length > 0x7f: length &= 0x7f length += 0x80 * (ord(datfile[offset]) & 0xff) offset += 1 s = "" for i in range(length): s += datfile[offset] offset += 1 # if s[-1] == '\x0d': # s += datfile[offset] # offset += 1 return (offset, s) def readDeviceFileParams(datfile, offset): result = {} (result['versionMajor'], result['versionMinor'], result['versionDot']) = struct.unpack_from('=iii', datfile, offset) offset += 12 (offset, result['versionNote']) = readstr(datfile, offset) (result['numFamilies'], result['numParts'], result['numScripts']) = struct.unpack_from('=iii', datfile, offset) offset += 12 result['compatibility'] = ord(datfile[offset]) offset += 1 offset += 1 + 2 + 4 return (offset, result) (offset, params) = readDeviceFileParams(datfile, offset=0) print(params) families = {} parts = {} scripts = {} def readDevicePart(datfile, offset): result = {} (offset, result['name']) = readstr(datfile, offset) ( result['family'], result['id'], result['programMem'], result['EEMem'], result['EEAddr'], result['configWords'], result['configAddr'], result['userIDWords'], result['userIDAddr'], result['bandGapMask'] ) = struct.unpack_from('=HIIHIBIBII', datfile, offset) offset += 2 + 4 + 4 + 2 + 4 + 1 + 4 + 1 + 4 + 4 result['configMasks'] = [0] * 9 # entry 8 will come later. ~backwards compat~ ( result['configMasks'][0], result['configMasks'][0], result['configMasks'][0], result['configMasks'][0], result['configMasks'][0], result['configMasks'][0], result['configMasks'][0], result['configMasks'][0] ) = struct.unpack_from('=HHHHHHHH', datfile, offset) offset += 2 * 8 result['configBlank'] = [0] * 9 # entry 8 will come later. ~backwards compat~ ( result['configBlank'][0], result['configBlank'][0], result['configBlank'][0], result['configBlank'][0], result['configBlank'][0], result['configBlank'][0], result['configBlank'][0], result['configBlank'][0] ) = struct.unpack_from('=HHHHHHHH', datfile, offset) offset += 2 * 8 ( result['CPMask'], result['CPConfig'], result['OSSCALSave'], result['ignoreAddress'], result['vddMin'], result['vddMax'], result['vddErase'], result['calibrationWords'], result['chipEraseScript'], result['progMemAddrSetScript'], result['progMemAddrBytes'], result['progMemRdScript'], result['progMemRdWords'], result['EERdPrepScript'], result['EERdScript'], result['EERdLocations'], result['userIDRdPrepScript'], result['userIDRdScript'], result['configRdPrepScript'], result['configRdScript'], result['progMemWrPrepScript'], result['progMemWrScript'], result['progMemWrWords'], result['progMemPanelBufs'], result['progMemPanelOffset'], result['EEWrPrepScript'], result['EEWrScript'], result['EEWrLocations'], result['userIDWrPrepScript'], result['userIDWrScript'], result['configWrPrepScript'], result['configWrScript'], result['OSCCALRdScript'], result['OSCCALWrScript'], result['DPMask'], result['writeCfgOnErase'], result['blankCheckSkipUsrIDs'], result['ignoreBytes'], result['chipErasePrepScript'], result['bootFlash'] ) = struct.unpack_from('=HB?IfffBHHBHHHHHHHHHHHHBIIIIIIIIIII??HHI', datfile, offset) # f I B ? H offset += 4 * 3 + 4 * 13 + 1 * 4 + 1 * 3 + 2 * 17 ( result['configMasks'][8], # and these are the last entries above result['configBlank'][8], result['progMemEraseScript'], result['EEMemEraseScript'], result['configMemEraseScript'], result['Reserved1EraseScript'], result['Reserved2EraseScript'], result['testMemoryRdScript'], result['testMemoryRdWords'], result['EERowEraseScript'], result['EERowEraseWords'], result['exportToMPLAB'], result['debugHaltScript'], result['debugRunScript'], result['debugStatusScript'], result['debugReadExecVerScript'], result['debugSingleStepScript'], result['debugBulkWrDataScript'], result['debugBulkRdDataScript'], result['debugWriteVectorScript'], result['debugReadVectorScript'], result['debugRowEraseScript'], result['debugRowEraseSize'], result['debugReserved5Script'], result['debugReserved6Script'], result['debugReserved7Script'], result['debugReserved8Script'], result['LVPScript'] ) = struct.unpack_from('=HHHHHHHHHHH?HHHHHHHHHHHHHHHH', datfile, offset) offset += 2 * 27 + 1 * 1 # uhhhhh offset -= 20 return (offset, result) def readDeviceFamily(datfile, offset): result = {} (result['id'], result['type'], result['searchPriority']) = struct.unpack_from('=HHH', datfile, offset) offset += 6 (offset, result['name']) = readstr(datfile, offset) (result['progEntryScript'], result['progExitScript'], result['readDevIDScript'], result['deviceIDMask'], result['blankValue'], result['bytesPerLocation'], result['addressIncrement']) = struct.unpack_from('=HHHiiBB', datfile, offset) offset += 2 * 3 + 4 * 2 + 1 * 2 result['partDetect'] = ord(datfile[offset]) offset += 1 ( result['progEntryVPPScript'], result['unused1'], result['EEMemBytesPerWord'], result['EEMemAddressIncrement'], result['userIDHexBytes'], result['userIDBytes'], result['progMemHexBytes'], result['EEMemHexBytes'], result['progMemShift'], result['testMemoryStart'], result['testMemoryLength'], result['vpp'] ) = struct.unpack_from('=HHBBBBBBBiHf', datfile, offset) offset += 2 * 2 + 1 * 7 + 4 + 2 + 4 return (offset, result) def readScript(datfile, offset): result = {} result['number'] = struct.unpack_from('=H', datfile, offset)[0] offset += 2 (offset, result['name']) = readstr(datfile, offset) (result['version'], result['unused1'], result['length']) = struct.unpack_from('=HIH', datfile, offset) offset += 8 script = [] print("Reading script " + result['name'] + " at " + hex(offset) + " len=" + str(result['length'])) for i in range(result['length']): script.append(struct.unpack_from('=B', datfile, offset)[0]) # script.append(struct.unpack_from('=B', datfile, offset + 1)[0]) offset += 2 result['script'] = script (offset, result['comment']) = readstr(datfile, offset) return (offset, result) print("Reading families...") for i in range(params['numFamilies']): (offset, family) = readDeviceFamily(datfile, offset) families[family['id']] = family print("Reading parts...") for i in range(params['numParts']): (offset, part) = readDevicePart(datfile, offset) parts[part['id']] = part print("Reading scripts...") for i in range(params['numScripts']): (offset, script) = readScript(datfile, offset) scripts[script['number']] = script database = { "parts": parts, "families": families, "scripts": scripts } print("Ready!") def findPart(model, database): for p in database['parts']: if database['parts'][p]['name'] == model: return database['parts'][p] return None part = findPart("PIC24FJ256DA206", database) if part is None: print("Could not find part.") sys.exit(1) def disassemble_script(content): offset = 0 while offset < len(content): (offset, instr) = pk2cmd_script.disassemble(content, offset) print(instr) def printScript(script): print(" Name: " + script['name']) print(" Script length: " + str(script['length'])) if True: disassemble_script(script['script']) # print("Comment: " + script['comment']) def printPart(part, database): print("Name: " + part['name']) family = database["families"][part["family"]] print("Family: " + family['name']) print("Program memory: " + str(part['programMem'])) print("Vdd_min: " + str(part['vddMin'])) print("Vdd_max: " + str(part['vddMax'])) print("Vdd_erase: " + str(part['vddErase'])) print("ProgMemAddrBytes: " + str(part['progMemAddrBytes'])) print("ChipEraseScript: ") printScript(database['scripts'][part['chipEraseScript']]) print("ProgEntryScript: ") printScript(database['scripts'][family['progEntryScript']]) print("ProgExitScript: ") printScript(database['scripts'][family['progExitScript']]) print("ReadDevIDScript: ") printScript(database['scripts'][family['readDevIDScript']]) print("ProgMemRdScript (id " + str(part['progMemRdScript']) + "): ") printScript(database['scripts'][part['progMemRdScript']]) print("ProgMemAddrSetScript (id " + str(part['progMemAddrSetScript']) + "): ") printScript(database['scripts'][part['progMemAddrSetScript']]) printPart(part, database)