Something went wrong. Try again.
Completely reimplimented in zig (eventually)
Something went wrong. Try again.
Java
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163package com.microchip.mplab.ipelib.device;
import com.microchip.mplab.ipelib.common.SharedData;import com.microchip.mplab.ipelib.tools.IPENotifier;import com.microchip.mplab.mdbcore.MessageMediator.Message;import com.microchip.mplab.mdbcore.assemblies.Assembly;import com.microchip.mplab.mdbcore.debugger.DebugException;import com.microchip.mplab.mdbcore.debugger.Debugger;import com.microchip.mplab.mdbcore.debugger.Debugger.CONNECTION_TYPE;import com.microchip.mplab.mdbcore.debugger.Debugger.PROGRAM_OPERATION;import com.microchip.mplab.mdbcore.memory.MemoryModel;import com.microchip.mplab.mdbcore.memory.VirtualMemory;import com.microchip.mplab.mdbcore.memory.memorytypes.FileRegisters;import com.microchip.mplab.mdbcore.translator.interfaces.ITranslator;import java.awt.Color;import java.util.Optional;import java.util.Properties;
public class CECOTPSupport { private Debugger mdb = null; private Assembly session = null; private final long STATUS_BIT_ADDRESS = 1148672L; private final byte PASS_BIT = -86; private final byte FAIL_BIT = 51; private long resetVectorAddress = -1L; private IPENotifier ipeNotify = null; private final SharedData sharedData;
public CECOTPSupport(Debugger mdb, Assembly session) { this.mdb = mdb; this.session = session; this.ipeNotify = IPENotifier.getIPENotifierController(); this.sharedData = SharedData.getSingletonObject(); }
public boolean processCECOTPMemory(boolean isVerify) { return this.mdb != null && this.session != null ? this.writeMemoryForCECDevice(isVerify) : false; }
private long getResetVectorAddressForCEC() { this.resetVectorAddress = -1L; Optional.ofNullable(this.session.getLookup().lookup(ITranslator.class)) .ifPresent(trans -> this.resetVectorAddress = trans.getArmSramResetHandlerAddress()); return this.resetVectorAddress; }
private void printUserMessage(String msg) { if (!this.sharedData.getUIMode()) { System.out.println("IPE:" + msg); } else { Message message = new Message(); message.setMessageString(msg); message.setTextColorForOutputWindow(Color.BLUE); this.ipeNotify.SetMessageObjectNotify(message, 1); } }
private boolean processOTPWrite(Debugger mdb, long statusBitAddrress, boolean isVerify) { boolean retOTPStatus = false; boolean retVal = false; byte retStatus = 0; int Tries = 0; long MaxReadTriesInMs = 2L; String statusMsg; if (isVerify) { statusMsg = "verification"; } else { statusMsg = "programming"; }
while (!retVal && Tries < MaxReadTriesInMs) { try { mdb.Halt(); delayMS(100); retStatus = this.getValueFromSpecificFileRegistersAddress(statusBitAddrress); if (Byte.compare(retStatus, (byte)-86) == 0) { retOTPStatus = true; retVal = true; this.printUserMessage("OTP program execution completed and " + statusMsg + " success.\n"); } else if (Byte.compare(retStatus, (byte)51) == 0) { retOTPStatus = false; retVal = true; this.printUserMessage("OTP program execution completed and " + statusMsg + " failed.\n"); }
if (!retVal) { Tries++; delayMS(100); mdb.Run(); delayMS(5000); } } catch (DebugException var13) { } }
if (!retVal) { this.printUserMessage("OTP program execution incompleted, Invalid status bit " + Integer.toHexString(Byte.toUnsignedInt(retStatus)) + " found.\n"); }
return retOTPStatus; }
private byte getValueFromSpecificFileRegistersAddress(long address) { byte readByte = -1; MemoryModel m_MemoryModel = (MemoryModel)this.session.getLookup().lookup(FileRegisters.class); if (m_MemoryModel != null) { VirtualMemory vmem = m_MemoryModel.GetVirtualMemory(); if (vmem != null) { byte[] pBuf = new byte[2]; vmem.RefreshFromTarget(address, 2L); long count = vmem.Read(address, 2L, pBuf); if (count > 0L) { readByte = pBuf[0]; } } }
return readByte; }
private boolean writeMemoryForCECDevice(boolean isVerifyMode) { boolean retVal = false;
try { Properties properties = this.session.GetToolProperties(); if (properties != null && this.session.GetToolName().contains("jlink") && "true".equals(properties.getProperty("programoptions.resetafterprogram", "false"))) { properties.put("programoptions.resetafterprogram", "false"); SharedData.getSingletonObject().getassemblyFactory().PutProperties(this.session, "jlink", properties); }
this.mdb.Connect(CONNECTION_TYPE.DEBUGGER); this.mdb.Program(PROGRAM_OPERATION.AUTO_SELECT); long tempResetVectorAddress = this.getResetVectorAddressForCEC(); if (tempResetVectorAddress > -1L) { this.mdb.SetPC(tempResetVectorAddress); this.mdb.Run(); delayMS(5000); retVal = this.processOTPWrite(this.mdb, 1148672L, isVerifyMode); this.mdb.Disconnect(); } } catch (DebugException var6) { if (isVerifyMode) { String errDesc = var6.toString(); if (errDesc.contains("Could not connect to tool hardware")) { this.printUserMessage("JTAG Disabled.\n"); return true; } } }
return retVal; }
public static void delayMS(int milliSec) { try { Thread.sleep(milliSec); } catch (InterruptedException var2) { } }}