Преглед на файлове

begin rebuilding the IO type discrimination code

Fabio Battaglia преди 5 години
родител
ревизия
9d33cd27f8

+ 1 - 1
src/main/java/info/hkzlab/dupal/analyzer/App.java

@@ -44,7 +44,7 @@ public class App {
         if (!dpm.enterRemoteMode()) {
             System.out.println("Unable to put DuPAL board in REMOTE MODE!");
             System.exit(-1);
-        }
+        } 
 
         dpan.startAnalisys();
     }

+ 40 - 27
src/main/java/info/hkzlab/dupal/analyzer/board/boardio/DuPALAnalyzer.java

@@ -1,27 +1,13 @@
 package info.hkzlab.dupal.analyzer.board.boardio;
 
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.OutputStream;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.Stack;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import info.hkzlab.dupal.analyzer.board.dupalproto.DuPALProto;
 import info.hkzlab.dupal.analyzer.devices.*;
 import info.hkzlab.dupal.analyzer.exceptions.*;
+import info.hkzlab.dupal.analyzer.utilities.BitUtils;
 
 public class DuPALAnalyzer {
     private static final Logger logger = LoggerFactory.getLogger(DuPALAnalyzer.class);
@@ -30,31 +16,58 @@ public class DuPALAnalyzer {
     private static final String OUT_TABLE = "dupal_thrtable.tbl";
     private static final String DUPAL_STRUCT = "dupal_struct.txt";
 
-    private final DuPALManager dpm;
-    private final PALSpecs pspecs;
     
     private final String serdump_path;
     private final String tblPath;
     private final String structPath;
-    
-    private int IOasOUT_Mask = -1;
-    private int additionalOUTs = 0;
-
 
-    public DuPALAnalyzer(final DuPALManager dpm, final PALSpecs pspecs, final int IOasOUT_Mask, final String outPath) {
-        this.dpm = dpm;
-        this.pspecs = pspecs;
-        this.IOasOUT_Mask = IOasOUT_Mask;
+    private final DuPALCmdInterface dpci;
+    private int ioAsOutMask;
+    
+    public DuPALAnalyzer(final DuPALManager dpm, final PALSpecs palSpecs, int ioAsOutMask, final String outPath) {
+        this.dpci = new DuPALCmdInterface(dpm, palSpecs);
+        this.ioAsOutMask = ioAsOutMask;
 
         serdump_path = outPath + File.separator+ SERIALIZED_DUMP;
         tblPath = outPath + File.separator + OUT_TABLE;
         structPath = outPath + File.separator + DUPAL_STRUCT;
     } 
+
+    public int detectIOTypeMask(final DuPALCmdInterface dpci) throws DuPALBoardException {
+        int ioAsOutMask = 0;
+        int maxINVal = 1 << (dpci.palSpecs.getPinCount_IN() + dpci.palSpecs.getPinCount_IO());
+        int extraOutputs = 0;
+
+        logger.info("Starting IO type detection... This could take a while.");
+        logger.info("Highest address for input pins: " + String.format("%06X", maxINVal-1));
+
+        for(int idx = 0; idx < (maxINVal-extraOutputs); idx++) {
+            if(ioAsOutMask == dpci.palSpecs.getMask_IO_R()) break; // All the IOs we already found to be outputs, no need to continue
+
+            int writeAddr = BitUtils.scatterBitField(idx, dpci.palSpecs.getMask_IN()) | BitUtils.scatterBitField((idx >> dpci.palSpecs.getPinCount_IN()), dpci.palSpecs.getMask_IO_W());
+            int o_write_mask = BitUtils.scatterBitField(BitUtils.consolidateBitField(ioAsOutMask, dpci.palSpecs.getMask_IO_R()), dpci.palSpecs.getMask_IO_W());
+            if((writeAddr & o_write_mask) != 0) continue; // Skip this run as we're setting a pin that we already found as output
+            
+            dpci.write(writeAddr);
+            int pinstat = dpci.read();
+
+            ioAsOutMask |= (pinstat ^ BitUtils.scatterBitField((idx >> dpci.palSpecs.getPinCount_IN()), dpci.palSpecs.getMask_IO_R())) & dpci.palSpecs.getMask_IO_R();
+            
+            logger.info(String.format("idx: C(%06X) -> S(%06X) | M[%06X]", idx, writeAddr, ioAsOutMask));
+        }
+
+        return ioAsOutMask;
+    }
     
-    public DuPALAnalyzer(final DuPALManager dpm, final PALSpecs pspecs) {
-        this(dpm, pspecs, -1, null);
+    public DuPALAnalyzer(final DuPALManager dpm, final PALSpecs palSpecs) {
+        this(dpm, palSpecs, -1, null);
     }
 
     public void startAnalisys() throws InvalidIOPinStateException, ICStateException, DuPALBoardException {
+        if(ioAsOutMask < 0) {
+            ioAsOutMask = detectIOTypeMask(dpci);
+
+            logger.info("Detected the following IO Type mask: " + String.format("%06X", ioAsOutMask));
+        }
     }
 }

+ 15 - 0
src/main/java/info/hkzlab/dupal/analyzer/board/boardio/DuPALCmdInterface.java

@@ -37,6 +37,21 @@ public class DuPALCmdInterface {
         return res;
     }
 
+    public void writeAndPulseClock(int data) throws DuPALBoardException {
+        int data_clk = data | palSpecs.getMask_CLK();
+        int data_noclk = data & ~palSpecs.getMask_CLK();
+
+        try {
+            write(data_noclk);
+            write(data_clk);
+            write(data_noclk);
+        } catch(DuPALBoardException e) {
+            logger.error("Pulsing clock to insert data " + String.format("%06X", data) + " failed.");
+            throw e;
+        }
+
+    }
+
     public int build_WData(int in, int io, boolean clk, boolean oe) {
         int data = 0;
 

+ 6 - 4
src/main/java/info/hkzlab/dupal/analyzer/palanalisys/explorers/OSExplorer.java

@@ -1,11 +1,13 @@
 package info.hkzlab.dupal.analyzer.palanalisys.explorers;
 
-import info.hkzlab.dupal.analyzer.devices.PALSpecs;
+import info.hkzlab.dupal.analyzer.board.boardio.DuPALCmdInterface;
+import info.hkzlab.dupal.analyzer.exceptions.DuPALBoardException;
 
 public class OSExplorer {
-    private OSExplorer() {};
+    private OSExplorer() {
+    };
 
-    private void exploreOutStates() {
-        
+public static void exploreOutStates(final DuPALCmdInterface dpci) throws DuPALBoardException {
+        dpci.write(0); // Set the status to 0
     }
 }

+ 10 - 0
src/main/java/info/hkzlab/dupal/analyzer/utilities/BitUtils.java

@@ -2,6 +2,16 @@ package info.hkzlab.dupal.analyzer.utilities;
 
 public class BitUtils {
     private BitUtils() {};
+   
+    static public int countBits(int mask) {
+        int tot = 0;
+
+        for(int idx = 0; idx < 32; idx++) {
+            if((mask & (0x01 << idx)) > 0) tot++;
+        }
+
+        return tot;
+    }
     
     static public int consolidateBitField(int field, int mask) {
         int data = 0;