|
@@ -36,33 +36,32 @@ public class DuPALAnalyzer {
|
|
|
public int detectIOTypeMask(final DuPALCmdInterface dpci) throws DuPALBoardException {
|
|
public int detectIOTypeMask(final DuPALCmdInterface dpci) throws DuPALBoardException {
|
|
|
int ioAsOutMask = 0;
|
|
int ioAsOutMask = 0;
|
|
|
int maxINVal = 1 << (dpci.palSpecs.getPinCount_IN() + dpci.palSpecs.getPinCount_IO());
|
|
int maxINVal = 1 << (dpci.palSpecs.getPinCount_IN() + dpci.palSpecs.getPinCount_IO());
|
|
|
- int extraOutputs = 0;
|
|
|
|
|
|
|
+ int maxINDivider = 1;
|
|
|
|
|
|
|
|
logger.info("Starting IO type detection... This could take a while.");
|
|
logger.info("Starting IO type detection... This could take a while.");
|
|
|
logger.info("Highest address for input pins: " + String.format("%06X", maxINVal-1));
|
|
logger.info("Highest address for input pins: " + String.format("%06X", maxINVal-1));
|
|
|
|
|
|
|
|
int writeAddr, o_write_mask;
|
|
int writeAddr, o_write_mask;
|
|
|
- for(int idx = 0; idx < maxINVal; idx++) {
|
|
|
|
|
- for(int sub_idx = 0; sub_idx < maxINVal; sub_idx++) {
|
|
|
|
|
|
|
+ for(int idx = 0; idx < (maxINVal / maxINDivider); idx++) {
|
|
|
|
|
+ for(int sub_idx = 0; sub_idx < (maxINVal / maxINDivider); sub_idx++) {
|
|
|
if(ioAsOutMask == dpci.palSpecs.getMask_IO_R()) break; // All the IOs we already found to be outputs, no need to continue
|
|
if(ioAsOutMask == dpci.palSpecs.getMask_IO_R()) break; // All the IOs we already found to be outputs, no need to continue
|
|
|
|
|
|
|
|
o_write_mask = BitUtils.scatterBitField(BitUtils.consolidateBitField(ioAsOutMask, (dpci.palSpecs.getMask_IO_R())), dpci.palSpecs.getMask_IO_W());
|
|
o_write_mask = BitUtils.scatterBitField(BitUtils.consolidateBitField(ioAsOutMask, (dpci.palSpecs.getMask_IO_R())), dpci.palSpecs.getMask_IO_W());
|
|
|
- writeAddr = BitUtils.scatterBitField(sub_idx, dpci.palSpecs.getMask_IN()) | BitUtils.scatterBitField(sub_idx >> dpci.palSpecs.getPinCount_IN(), dpci.palSpecs.getMask_IO_W());
|
|
|
|
|
- if((writeAddr & o_write_mask) != 0) continue;
|
|
|
|
|
-
|
|
|
|
|
|
|
+ writeAddr = BitUtils.scatterBitField(sub_idx, dpci.palSpecs.getMask_IN()) | BitUtils.scatterBitField(sub_idx >> dpci.palSpecs.getPinCount_IN(), dpci.palSpecs.getMask_IO_W() & ~o_write_mask);
|
|
|
|
|
+
|
|
|
dpci.write(writeAddr);
|
|
dpci.write(writeAddr);
|
|
|
int pinstat = dpci.read();
|
|
int pinstat = dpci.read();
|
|
|
|
|
|
|
|
ioAsOutMask |= (pinstat ^ BitUtils.scatterBitField((sub_idx >> dpci.palSpecs.getPinCount_IN()), dpci.palSpecs.getMask_IO_R())) & dpci.palSpecs.getMask_IO_R();
|
|
ioAsOutMask |= (pinstat ^ BitUtils.scatterBitField((sub_idx >> dpci.palSpecs.getPinCount_IN()), dpci.palSpecs.getMask_IO_R())) & dpci.palSpecs.getMask_IO_R();
|
|
|
|
|
|
|
|
|
|
+ maxINDivider = (1<<BitUtils.countBits(ioAsOutMask));
|
|
|
logger.info(String.format("idx: C(%06X) -> S(%06X) | M[%06X]", sub_idx, writeAddr, ioAsOutMask));
|
|
logger.info(String.format("idx: C(%06X) -> S(%06X) | M[%06X]", sub_idx, writeAddr, ioAsOutMask));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if(dpci.palSpecs.getPinCount_RO() == 0) break; // No need to try multiple registered states
|
|
if(dpci.palSpecs.getPinCount_RO() == 0) break; // No need to try multiple registered states
|
|
|
|
|
|
|
|
o_write_mask = BitUtils.scatterBitField(BitUtils.consolidateBitField(ioAsOutMask, (dpci.palSpecs.getMask_IO_R())), dpci.palSpecs.getMask_IO_W());
|
|
o_write_mask = BitUtils.scatterBitField(BitUtils.consolidateBitField(ioAsOutMask, (dpci.palSpecs.getMask_IO_R())), dpci.palSpecs.getMask_IO_W());
|
|
|
- writeAddr = BitUtils.scatterBitField(idx, dpci.palSpecs.getMask_IN()) | BitUtils.scatterBitField((idx >> dpci.palSpecs.getPinCount_IN()), dpci.palSpecs.getMask_IO_W());
|
|
|
|
|
- if((writeAddr & o_write_mask) != 0) continue;
|
|
|
|
|
|
|
+ writeAddr = BitUtils.scatterBitField(idx, dpci.palSpecs.getMask_IN()) | BitUtils.scatterBitField((idx >> dpci.palSpecs.getPinCount_IN()), dpci.palSpecs.getMask_IO_W() & ~o_write_mask);
|
|
|
|
|
|
|
|
dpci.writeAndPulseClock(writeAddr);
|
|
dpci.writeAndPulseClock(writeAddr);
|
|
|
}
|
|
}
|