You can subscribe to this list here.
2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(21) |
Nov
(12) |
Dec
(41) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
(25) |
Feb
(54) |
Mar
(63) |
Apr
(52) |
May
(17) |
Jun
(3) |
Jul
(3) |
Aug
(5) |
Sep
(49) |
Oct
(50) |
Nov
(34) |
Dec
(14) |
2009 |
Jan
(9) |
Feb
(15) |
Mar
(38) |
Apr
(12) |
May
(35) |
Jun
(20) |
Jul
(2) |
Aug
(7) |
Sep
(36) |
Oct
(24) |
Nov
(2) |
Dec
(2) |
2010 |
Jan
(14) |
Feb
(1) |
Mar
(36) |
Apr
(2) |
May
(4) |
Jun
(6) |
Jul
(35) |
Aug
(11) |
Sep
(8) |
Oct
(3) |
Nov
|
Dec
(1) |
2011 |
Jan
(11) |
Feb
(12) |
Mar
(3) |
Apr
(7) |
May
(12) |
Jun
(8) |
Jul
|
Aug
(3) |
Sep
(4) |
Oct
|
Nov
(2) |
Dec
(4) |
2012 |
Jan
(2) |
Feb
(1) |
Mar
(14) |
Apr
(5) |
May
(28) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(21) |
Nov
(4) |
Dec
(1) |
2013 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(2) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <ni...@us...> - 2010-07-05 10:41:42
|
Revision: 712 http://mspsim.svn.sourceforge.net/mspsim/?rev=712&view=rev Author: nifi Date: 2010-07-05 10:41:36 +0000 (Mon, 05 Jul 2010) Log Message: ----------- Minor cleanup of debug output Modified Paths: -------------- mspsim/se/sics/mspsim/chip/CC2420.java Modified: mspsim/se/sics/mspsim/chip/CC2420.java =================================================================== --- mspsim/se/sics/mspsim/chip/CC2420.java 2010-07-05 09:55:39 UTC (rev 711) +++ mspsim/se/sics/mspsim/chip/CC2420.java 2010-07-05 10:41:36 UTC (rev 712) @@ -540,7 +540,8 @@ public void receivedByte(byte data) { // Received a byte from the "air" - log("RF Byte received: " + Utils.hex8(data) + " state: " + stateMachine + " noZeroes: " + zeroSymbols + + if (DEBUG) + log("RF Byte received: " + Utils.hex8(data) + " state: " + stateMachine + " noZeroes: " + zeroSymbols + ((stateMachine == RadioState.RX_SFD_SEARCH || stateMachine == RadioState.RX_FRAME) ? "" : " *** Ignored")); if(stateMachine == RadioState.RX_SFD_SEARCH) { @@ -667,10 +668,11 @@ switch(address) { case REG_IOCFG0: setFIFOP(false); - log("IOCFG0: " + registers[address]); + if (DEBUG) log("IOCFG0: " + registers[address]); break; case REG_IOCFG1: - log("IOCFG1: SFDMUX " + if (DEBUG) + log("IOCFG1: SFDMUX " + ((registers[address] & SFDMUX) >> SFDMUX) + " CCAMUX: " + (registers[address] & CCAMUX)); // if( (registers[address] & CCAMUX) == CCA_CCA) @@ -877,7 +879,7 @@ if (DEBUG) { log("Strobe RX-ON!!!"); } - }else{ + } else { if (DEBUG) log("WARNING: SRXON when not IDLE"); } @@ -885,11 +887,11 @@ case REG_SRFOFF: if (DEBUG) { log("Strobe RXTX-OFF!!! at " + cpu.cycles); - } - if (stateMachine == RadioState.TX_ACK || + if (stateMachine == RadioState.TX_ACK || stateMachine == RadioState.TX_FRAME || stateMachine == RadioState.RX_FRAME) { - System.out.println("CC2420: Warning: turning off RXTX during " + stateMachine); + log("WARNING: turning off RXTX during " + stateMachine); + } } setState(RadioState.IDLE); break; @@ -1134,7 +1136,7 @@ private void setFIFOP(boolean fifop) { fifoP = fifop; - if (DEBUG) log(getName() + " setting FIFOP to " + fifop); + if (DEBUG) log("Setting FIFOP to " + fifop); if( (registers[REG_IOCFG0] & FIFOP_POLARITY) == FIFOP_POLARITY) { fifopPort.setPinState(fifopPin, fifop ? 0 : 1); } else { @@ -1143,7 +1145,7 @@ } private void setFIFO(boolean fifo) { - if (DEBUG) log(getName() + " setting FIFO to " + fifo); + if (DEBUG) log("Setting FIFO to " + fifo); currentFIFO = fifo; fifoPort.setPinState(fifoPin, fifo ? 1 : 0); } @@ -1231,7 +1233,7 @@ if(newOn) { // 0.6ms maximum vreg startup from datasheet pg 13 cpu.scheduleTimeEventMillis(vregEvent, 0.1); - if (DEBUG) log(getName() + ": Scheduling vregEvent at: cyc = " + cpu.cycles + + if (DEBUG) log("Scheduling vregEvent at: cyc = " + cpu.cycles + " target: " + vregEvent.getTime() + " current: " + cpu.getTime()); } else { on = false; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ni...@us...> - 2010-07-05 09:55:46
|
Revision: 711 http://mspsim.svn.sourceforge.net/mspsim/?rev=711&view=rev Author: nifi Date: 2010-07-05 09:55:39 +0000 (Mon, 05 Jul 2010) Log Message: ----------- Updated to use Loggable instead of printing to system out Modified Paths: -------------- mspsim/se/sics/mspsim/core/Flash.java Property Changed: ---------------- mspsim/se/sics/mspsim/core/Flash.java mspsim/se/sics/mspsim/core/FlashRange.java Modified: mspsim/se/sics/mspsim/core/Flash.java =================================================================== --- mspsim/se/sics/mspsim/core/Flash.java 2010-07-05 09:49:07 UTC (rev 710) +++ mspsim/se/sics/mspsim/core/Flash.java 2010-07-05 09:55:39 UTC (rev 711) @@ -38,7 +38,6 @@ import se.sics.mspsim.util.Utils; public class Flash extends IOUnit { - private static final boolean DEBUG = true; private static final int FCTL1 = 0x0128; private static final int FCTL2 = 0x012a; @@ -151,7 +150,7 @@ if (blockwrite_count == 64) { // FIXME: What happens if we try to write more than 64 bytes // on real hardware??? - System.out.printf("Last access in block mode. Forced exit?"); + logw("Last access in block mode. Forced exit?"); current_write_mode = WriteMode.WRITE_BLOCK_FINISH; } /* if (DEBUG) { @@ -162,8 +161,7 @@ case WRITE_BLOCK_FINISH: if (DEBUG) { - System.out.println("Programming voltage dropped, " + - "write mode disabled."); + log("Programming voltage dropped, write mode disabled."); } current_write_mode = WriteMode.WRITE_NONE; busy = false; @@ -230,8 +228,7 @@ myfreq = cpu.aclkFrq / freqdiv; finish_msec = ((double)time * freqdiv * 1000) / cpu.aclkFrq; if (DEBUG) - System.out.println("Flash: Using ACLK source with f=" + myfreq - + " Hz\nFlasg: Time required=" + finish_msec + " ms"); + log("Using ACLK source with f=" + myfreq + "Hz. Time required=" + finish_msec + " ms"); cpu.scheduleTimeEventMillis(end_process, finish_msec); break; @@ -247,7 +244,7 @@ case MCLK: if (DEBUG) - System.out.println("Flash: Using MCLK source with div=" + freqdiv); + log("Using MCLK source with div=" + freqdiv); cpu.scheduleCycleEvent(end_process, (long)time * freqdiv); break; } @@ -262,7 +259,7 @@ if (locked) { if (DEBUG) { - System.out.println("Write to flash blocked because of LOCK flag."); + log("Write to flash blocked because of LOCK flag."); } return; } @@ -283,7 +280,7 @@ int area_end = a_area_end[0]; if (DEBUG) { - System.out.println("Segment erase @" + Utils.hex16(address) + + log("Segment erase @" + Utils.hex16(address) + ": erasing area " + Utils.hex16(area_start) + "-" + Utils.hex16(area_end)); } @@ -322,12 +319,10 @@ if (blockwrite_count == 0) { wait_time = BLOCKWRITE_FIRST_TIME; if (DEBUG) { - System.out.println("Flash write in block mode started @" - + Utils.hex16(address)); + log("Flash write in block mode started @" + Utils.hex16(address)); } if (addressInFlash(cpu.readRegister(MSP430.PC))) { - System.out.println("Oops. Block write access only allowed when" + - " executing from RAM."); + logw("Oops. Block write access only allowed when executing from RAM."); } } else { wait_time = BLOCKWRITE_TIME; @@ -358,8 +353,8 @@ } if (DEBUG) { if (wait == false && current_write_mode == WriteMode.WRITE_BLOCK) { - System.out.println("Reading flash prohibited. Would read 0x3fff!!!\n" - + "CPU PC=" + Utils.hex16(cpu.readRegister(MSP430.PC)) + log("Reading flash prohibited. Would read 0x3fff!!!"); + log("CPU PC=" + Utils.hex16(cpu.readRegister(MSP430.PC)) + " read address=" + Utils.hex16(address)); } } @@ -435,7 +430,7 @@ if ((value & KEYMASK) == FWKEY) return true; - System.out.println("Bad key accessing flash controller --> reset"); + logw("Bad key accessing flash controller --> reset"); statusreg |= KEYV; cpu.flagInterrupt(RESET_VECTOR, this, true); return false; @@ -454,11 +449,11 @@ private EraseMode getEraseMode(int regdata) { int idx = (regdata & ERASE_MASK) >> ERASE_SHIFT; - for(EraseMode em : EraseMode.values()) { + for (EraseMode em : EraseMode.values()) { if (em.ordinal() == idx) return em; } - throw new RuntimeException("Invalid erase mode"); + throw new IllegalArgumentException("Invalid erase mode: " + regdata); } private void triggerErase(int newmode) { @@ -475,8 +470,8 @@ private void triggerAccessViolation(String reason) { if (DEBUG) - System.out.println("Flash access violation: " + reason + - "\nPC=" + Utils.hex16(cpu.readRegister(MSP430.PC))); + log("Flash access violation: " + reason + + ". PC=" + Utils.hex16(cpu.readRegister(MSP430.PC))); statusreg |= ACCVIFG; if (sfr.isIEBitsSet(SFR.IE1, ACCVIE)) { @@ -493,7 +488,7 @@ private void triggerBlockWrite() { if (DEBUG) { - System.out.println("Block write triggered"); + log("Block write triggered"); } current_write_mode = WriteMode.WRITE_BLOCK; blockwrite_count = 0; @@ -501,7 +496,7 @@ private void triggerEndBlockWrite() { if (DEBUG) { - System.out.println("Got end of flash block write"); + log("Got end of flash block write"); } current_write_mode = WriteMode.WRITE_BLOCK_FINISH; waitFlashProcess(BLOCKWRITE_END_TIME); @@ -509,7 +504,7 @@ public void write(int address, int value, boolean word, long cycles) { if (!word) { - System.out.println("Invalid access type to flash controller"); + logw("Invalid access type to flash controller"); return; } @@ -529,7 +524,7 @@ if ((mode & ERASE_MASK) != 0 || (mode & WRT) != 0) { if (!((mode & BLKWRT) != 0 && wait)) { triggerAccessViolation( - "FCTL1 write not allowed while erase/write active."); + "FCTL1 write not allowed while erase/write active"); return; } } @@ -597,7 +592,7 @@ public void reset(int type) { if (DEBUG) { - System.out.println("Flash got reset!"); + log("Got reset!"); } if (type == MSP430.RESET_POR) Property changes on: mspsim/se/sics/mspsim/core/Flash.java ___________________________________________________________________ Deleted: svn:executable - * Property changes on: mspsim/se/sics/mspsim/core/FlashRange.java ___________________________________________________________________ Deleted: svn:executable - * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ni...@us...> - 2010-07-05 09:49:13
|
Revision: 710 http://mspsim.svn.sourceforge.net/mspsim/?rev=710&view=rev Author: nifi Date: 2010-07-05 09:49:07 +0000 (Mon, 05 Jul 2010) Log Message: ----------- Added logw() for logging warnings Modified Paths: -------------- mspsim/se/sics/mspsim/core/IOUnit.java Modified: mspsim/se/sics/mspsim/core/IOUnit.java =================================================================== --- mspsim/se/sics/mspsim/core/IOUnit.java 2010-06-22 11:18:03 UTC (rev 709) +++ mspsim/se/sics/mspsim/core/IOUnit.java 2010-07-05 09:49:07 UTC (rev 710) @@ -97,12 +97,22 @@ DEBUG = true; } - public void log(String msg) { + protected void log(String msg) { + PrintStream log = this.log; if (log != null) { log.println(getName() + ": " + msg); } } + protected void logw(String msg) { + String logMessage = getName() + ": " + msg; + PrintStream log = this.log; + if (log != null) { + log.println(logMessage); + } + System.err.println(logMessage); + } + public void setEmulationLogger(EmulationLogger logger) { this.logger = logger; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ni...@us...> - 2010-06-22 11:18:09
|
Revision: 709 http://mspsim.svn.sourceforge.net/mspsim/?rev=709&view=rev Author: nifi Date: 2010-06-22 11:18:03 +0000 (Tue, 22 Jun 2010) Log Message: ----------- Fixed compiler warning Modified Paths: -------------- mspsim/se/sics/mspsim/ui/CPUHeatMap.java Modified: mspsim/se/sics/mspsim/ui/CPUHeatMap.java =================================================================== --- mspsim/se/sics/mspsim/ui/CPUHeatMap.java 2010-06-22 09:45:16 UTC (rev 708) +++ mspsim/se/sics/mspsim/ui/CPUHeatMap.java 2010-06-22 11:18:03 UTC (rev 709) @@ -16,6 +16,8 @@ public class CPUHeatMap extends JComponent implements CPUMonitor { + private static final long serialVersionUID = -7964848220064713887L; + private Timer ticker; private JFrame window; @@ -92,7 +94,6 @@ g.drawImage(heatmap, 0, 0, getWidth(), getHeight(), this); } - @Override public void cpuAction(int type, int adr, int data) { int val = 0; int f = 1; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2010-06-22 09:45:23
|
Revision: 708 http://mspsim.svn.sourceforge.net/mspsim/?rev=708&view=rev Author: joxe Date: 2010-06-22 09:45:16 +0000 (Tue, 22 Jun 2010) Log Message: ----------- added missing class Added Paths: ----------- mspsim/se/sics/mspsim/ui/CPUHeatMap.java Added: mspsim/se/sics/mspsim/ui/CPUHeatMap.java =================================================================== --- mspsim/se/sics/mspsim/ui/CPUHeatMap.java (rev 0) +++ mspsim/se/sics/mspsim/ui/CPUHeatMap.java 2010-06-22 09:45:16 UTC (rev 708) @@ -0,0 +1,116 @@ +package se.sics.mspsim.ui; + +import java.awt.Graphics; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.image.BufferedImage; + +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.Timer; + +import se.sics.mspsim.core.CPUMonitor; +import se.sics.mspsim.core.MSP430Core; + +public class CPUHeatMap extends JComponent implements CPUMonitor { + + private Timer ticker; + + private JFrame window; + private BufferedImage heatmap; + private int[] heatR = new int[MSP430Core.MAX_MEM]; + private int[] heatW = new int[MSP430Core.MAX_MEM]; + private int[] heatE = new int[MSP430Core.MAX_MEM]; + private int heatMax = 0; + private int mode = 1; + + public CPUHeatMap() { + window = new JFrame("CPU Heat Map"); + heatmap = new BufferedImage(128, 512, BufferedImage.TYPE_INT_RGB); + window.setBounds(100, 100, 140, 530); + window.setVisible(true); + window.add(this); + + ticker = new Timer(50, new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + repaint(); + } + }); + ticker.start(); + window.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent ke) { + System.out.println("Key pressed: " + ke.getKeyChar()); + if (ke.getKeyChar() == 'm') { + mode = mode ^ 1; + } + } + }); + } + + public void updateImage() { + double factor = 250.0 / heatMax; + switch (mode) { + case 0: + int me, mr, mw; + for (int i = 0; i < MSP430Core.MAX_MEM; i++) { + mw = me = mr = 0; + if (heatW[i] > 0) mw = 80; + if (heatR[i] > 0) mr = 80; + if (heatE[i] > 0) me = 80; + + heatmap.setRGB(i & 127, i / 128, + ((int)(factor * heatW[i] + mw) << 16) | + ((int)(factor * heatR[i] + mr) << 8) | + (int)(factor * heatE[i]) + me); + } + break; + case 1: + /* slow... */ + for (int i = 0; i < MSP430Core.MAX_MEM; i++) { + int r = heatW[i]; + int g = heatR[i]; + int b = heatE[i]; + + heatW[i] = (99 * r) / 100; + heatR[i] = (99 * g) / 100; + heatE[i] = (99 * b) / 100; + + if (r > 255) r = 255; + if (g > 255) g = 255; + if (b > 255) b = 255; + + heatmap.setRGB(i & 127, i / 128, (r << 16) | (g << 8) | b); + } + break; + } + } + + public void paint(Graphics g) { + updateImage(); + g.drawImage(heatmap, 0, 0, getWidth(), getHeight(), this); + } + + @Override + public void cpuAction(int type, int adr, int data) { + int val = 0; + int f = 1; + if (mode == 1) f = 40; + switch (type) { + case CPUMonitor.EXECUTE: + val = heatE[adr] = heatE[adr] + f; + break; + case CPUMonitor.MEMORY_READ: + val = heatR[adr] = heatR[adr] + f; + break; + case CPUMonitor.MEMORY_WRITE: + val = heatW[adr] = heatW[adr] + f; + break; + } + if (val > heatMax) { + heatMax = val; + } + } + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ni...@us...> - 2010-06-22 09:42:56
|
Revision: 707 http://mspsim.svn.sourceforge.net/mspsim/?rev=707&view=rev Author: nifi Date: 2010-06-22 09:42:47 +0000 (Tue, 22 Jun 2010) Log Message: ----------- Fixed compiler warning Modified Paths: -------------- mspsim/se/sics/mspsim/util/ArrayUtils.java Modified: mspsim/se/sics/mspsim/util/ArrayUtils.java =================================================================== --- mspsim/se/sics/mspsim/util/ArrayUtils.java 2010-06-05 22:34:58 UTC (rev 706) +++ mspsim/se/sics/mspsim/util/ArrayUtils.java 2010-06-22 09:42:47 UTC (rev 707) @@ -2,7 +2,7 @@ public class ArrayUtils { - public static Object[] add(Class componentType, Object[] array, Object value) { + public static Object[] add(Class<?> componentType, Object[] array, Object value) { Object[] tmp; if (array == null) { tmp = (Object[]) java.lang.reflect.Array.newInstance(componentType, 1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2010-06-05 22:35:04
|
Revision: 706 http://mspsim.svn.sourceforge.net/mspsim/?rev=706&view=rev Author: joxe Date: 2010-06-05 22:34:58 +0000 (Sat, 05 Jun 2010) Log Message: ----------- improved stack-trace with PC at call Modified Paths: -------------- mspsim/se/sics/mspsim/core/MSP430Core.java mspsim/se/sics/mspsim/core/Profiler.java mspsim/se/sics/mspsim/util/SimpleProfiler.java Modified: mspsim/se/sics/mspsim/core/MSP430Core.java =================================================================== --- mspsim/se/sics/mspsim/core/MSP430Core.java 2010-06-05 19:50:53 UTC (rev 705) +++ mspsim/se/sics/mspsim/core/MSP430Core.java 2010-06-05 22:34:58 UTC (rev 706) @@ -1063,7 +1063,7 @@ if (function == null) { function = getFunction(map, dst); } - profiler.profileCall(function, cpuCycles); + profiler.profileCall(function, cpuCycles, pc); } write = false; Modified: mspsim/se/sics/mspsim/core/Profiler.java =================================================================== --- mspsim/se/sics/mspsim/core/Profiler.java 2010-06-05 19:50:53 UTC (rev 705) +++ mspsim/se/sics/mspsim/core/Profiler.java 2010-06-05 22:34:58 UTC (rev 706) @@ -54,7 +54,7 @@ public void setCPU(MSP430Core cpu); - public void profileCall(MapEntry entry, long cycles); + public void profileCall(MapEntry entry, long cycles, int from); public void profileReturn(long cycles); public void profileInterrupt(int vector, long cycles); public void profileRETI(long cycles); Modified: mspsim/se/sics/mspsim/util/SimpleProfiler.java =================================================================== --- mspsim/se/sics/mspsim/util/SimpleProfiler.java 2010-06-05 19:50:53 UTC (rev 705) +++ mspsim/se/sics/mspsim/util/SimpleProfiler.java 2010-06-05 22:34:58 UTC (rev 706) @@ -104,7 +104,7 @@ ignoreFunctions.put(function, function); } - public void profileCall(MapEntry entry, long cycles) { + public void profileCall(MapEntry entry, long cycles, int from) { if (cSP == callStack.length) { CallEntry[] tmp = new CallEntry[cSP + 64]; System.arraycopy(callStack, 0, tmp, 0, cSP); @@ -136,7 +136,9 @@ ce.cycles = cycles; ce.exclusiveCycles = cycles; ce.hide = hide; + ce.fromPC = from; newIRQ = false; + CallListener[] listeners = callListeners; if (listeners != null) { @@ -331,7 +333,8 @@ int stackCount = cSP; out.println("Stack Trace: number of calls: " + stackCount); for (int i = 0; i < stackCount; i++) { - out.println(" " + callStack[stackCount - i - 1].function.getInfo()); + out.println(" " + callStack[stackCount - i - 1].function.getInfo() + " called from PC: " + + callStack[stackCount - i - 1].fromPC); } } @@ -377,6 +380,7 @@ } private static class CallEntry { + int fromPC; MapEntry function; long cycles; long exclusiveCycles; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2010-06-05 19:51:00
|
Revision: 705 http://mspsim.svn.sourceforge.net/mspsim/?rev=705&view=rev Author: joxe Date: 2010-06-05 19:50:53 +0000 (Sat, 05 Jun 2010) Log Message: ----------- made IOUnits loggable + added them for chipinfo Modified Paths: -------------- mspsim/se/sics/mspsim/chip/CC2420.java mspsim/se/sics/mspsim/cli/DebugCommands.java mspsim/se/sics/mspsim/cli/ProfilerCommands.java mspsim/se/sics/mspsim/core/CPUMonitor.java mspsim/se/sics/mspsim/core/Chip.java mspsim/se/sics/mspsim/core/IOUnit.java mspsim/se/sics/mspsim/core/Loggable.java mspsim/se/sics/mspsim/core/MSP430Core.java mspsim/se/sics/mspsim/core/USART.java mspsim/se/sics/mspsim/core/Watchdog.java mspsim/se/sics/mspsim/util/StatCommands.java Modified: mspsim/se/sics/mspsim/chip/CC2420.java =================================================================== --- mspsim/se/sics/mspsim/chip/CC2420.java 2010-06-01 22:21:43 UTC (rev 704) +++ mspsim/se/sics/mspsim/chip/CC2420.java 2010-06-05 19:50:53 UTC (rev 705) @@ -1299,7 +1299,7 @@ return MODE_MAX; } - public String chipinfo() { + public String info() { updateActiveFrequency(); return " VREG_ON: " + on + " ChipSel: " + chipSelect + "\n OSC_Stable: " + ((status & STATUS_XOSC16M_STABLE) > 0) + Modified: mspsim/se/sics/mspsim/cli/DebugCommands.java =================================================================== --- mspsim/se/sics/mspsim/cli/DebugCommands.java 2010-06-01 22:21:43 UTC (rev 704) +++ mspsim/se/sics/mspsim/cli/DebugCommands.java 2010-06-05 19:50:53 UTC (rev 705) @@ -44,6 +44,7 @@ import se.sics.mspsim.core.DbgInstruction; import se.sics.mspsim.core.DisAsm; import se.sics.mspsim.core.EmulationException; +import se.sics.mspsim.core.Loggable; import se.sics.mspsim.core.MSP430; import se.sics.mspsim.core.MSP430Constants; import se.sics.mspsim.core.Memory; @@ -523,7 +524,7 @@ ch.registerCommand("loggable", new BasicCommand("list loggable objects", "") { @Override public int executeCommand(CommandContext context) { - Chip[] chips = cpu.getChips(); + Loggable[] chips = cpu.getLoggables(); for (int i = 0; i < chips.length; i++) { context.out.println(chips[i].getName()); } @@ -532,10 +533,10 @@ }); ch.registerCommand("log", new BasicAsyncCommand("log a loggable object", "<loggable>" ) { - Chip chip = null; + Loggable chip = null; @Override public int executeCommand(CommandContext context) { - chip = cpu.getChip(context.getArgument(0)); + chip = cpu.getLoggable(context.getArgument(0)); if (chip == null) { context.err.println("Can not find loggable: " + context.getArgument(0)); } Modified: mspsim/se/sics/mspsim/cli/ProfilerCommands.java =================================================================== --- mspsim/se/sics/mspsim/cli/ProfilerCommands.java 2010-06-01 22:21:43 UTC (rev 704) +++ mspsim/se/sics/mspsim/cli/ProfilerCommands.java 2010-06-05 19:50:53 UTC (rev 705) @@ -46,6 +46,7 @@ import se.sics.mspsim.core.EventSource; import se.sics.mspsim.core.MSP430; import se.sics.mspsim.core.Profiler; +import se.sics.mspsim.ui.CPUHeatMap; import se.sics.mspsim.util.ComponentRegistry; import se.sics.mspsim.util.SimpleProfiler; @@ -225,6 +226,14 @@ return 0; } }); + + ch.registerCommand("readmap", new BasicCommand("read map", "") { + public int executeCommand(CommandContext context) { + CPUHeatMap hm = new CPUHeatMap(); + cpu.setGlobalMonitor(hm); + return 0; + } + }); } } Modified: mspsim/se/sics/mspsim/core/CPUMonitor.java =================================================================== --- mspsim/se/sics/mspsim/core/CPUMonitor.java 2010-06-01 22:21:43 UTC (rev 704) +++ mspsim/se/sics/mspsim/core/CPUMonitor.java 2010-06-05 19:50:53 UTC (rev 705) @@ -47,7 +47,7 @@ public static final int MEMORY_WRITE = 2; public static final int REGISTER_READ = 3; public static final int REGISTER_WRITE = 4; - public static final int BREAK = 5; + public static final int EXECUTE = 5; public void cpuAction(int type, int adr, int data); Modified: mspsim/se/sics/mspsim/core/Chip.java =================================================================== --- mspsim/se/sics/mspsim/core/Chip.java 2010-06-01 22:21:43 UTC (rev 704) +++ mspsim/se/sics/mspsim/core/Chip.java 2010-06-05 19:50:53 UTC (rev 705) @@ -133,7 +133,7 @@ return true; } - public String chipinfo() { + public String info() { return "* no info"; } Modified: mspsim/se/sics/mspsim/core/IOUnit.java =================================================================== --- mspsim/se/sics/mspsim/core/IOUnit.java 2010-06-01 22:21:43 UTC (rev 704) +++ mspsim/se/sics/mspsim/core/IOUnit.java 2010-06-05 19:50:53 UTC (rev 705) @@ -41,11 +41,18 @@ package se.sics.mspsim.core; -public abstract class IOUnit implements InterruptHandler { +import java.io.PrintStream; +public abstract class IOUnit implements InterruptHandler, Loggable { + int[] memory; int offset; + + protected EmulationLogger logger; + private PrintStream log; + protected boolean DEBUG = false; + public IOUnit(int[] memory, int offset) { this.memory = memory; this.offset = offset; @@ -73,5 +80,34 @@ return (data >> 8) & 0xff; } - public abstract String getName(); + public abstract String getName(); + + /* Loggable */ + public void clearLogStream() { + log = null; + DEBUG = false; + } + + public PrintStream getLogStream() { + return log; + } + + public void setLogStream(PrintStream out) { + log = out; + DEBUG = true; + } + + public void log(String msg) { + if (log != null) { + log.println(getName() + ": " + msg); + } + } + + public void setEmulationLogger(EmulationLogger logger) { + this.logger = logger; + } + + public String info() { + return "* no info"; + } } Modified: mspsim/se/sics/mspsim/core/Loggable.java =================================================================== --- mspsim/se/sics/mspsim/core/Loggable.java 2010-06-01 22:21:43 UTC (rev 704) +++ mspsim/se/sics/mspsim/core/Loggable.java 2010-06-05 19:50:53 UTC (rev 705) @@ -40,5 +40,7 @@ public void setEmulationLogger(EmulationLogger log); public void setLogStream(PrintStream out); public void clearLogStream(); + public String getName(); + public String info(); } Modified: mspsim/se/sics/mspsim/core/MSP430Core.java =================================================================== --- mspsim/se/sics/mspsim/core/MSP430Core.java 2010-06-01 22:21:43 UTC (rev 704) +++ mspsim/se/sics/mspsim/core/MSP430Core.java 2010-06-05 19:50:53 UTC (rev 705) @@ -67,6 +67,8 @@ // 16 registers of which some are "special" - PC, SP, etc. public int[] reg = new int[16]; + public CPUMonitor globalMonitor; + public CPUMonitor[] regWriteMonitors = new CPUMonitor[16]; public CPUMonitor[] regReadMonitors = new CPUMonitor[16]; @@ -264,6 +266,10 @@ profiler = prof; profiler.setCPU(this); } + + public void setGlobalMonitor(CPUMonitor mon) { + globalMonitor = mon; + } /* returns port 1 ... 6 */ public IOPort getIOPort(int portID) { @@ -300,6 +306,25 @@ return null; } + public Loggable[] getLoggables() { + Loggable[] ls = new Loggable[ioUnits.length + chips.size()]; + for (int i = 0; i < ioUnits.length; i++) { + ls[i] = ioUnits[i]; + } + for (int i = 0; i < chips.size(); i++) { + ls[i + ioUnits.length] = chips.get(i); + } + return ls; + } + + public Loggable getLoggable(String name) { + Loggable l = getChip(name); + if (l == null) { + l = getIOUnit(name); + } + return l; + } + public Chip[] getChips() { return chips.toArray(new Chip[chips.size()]); } @@ -678,6 +703,10 @@ if (breakPoints[address] != null) { breakPoints[address].cpuAction(CPUMonitor.MEMORY_READ, address, val); } + /* is a null check as fast as a boolean check ?*/ + if (globalMonitor != null) { + globalMonitor.cpuAction(CPUMonitor.MEMORY_READ, address, val); + } return val; } @@ -714,6 +743,11 @@ } } } + /* is a null check as fast as a boolean check */ + if (globalMonitor != null) { + globalMonitor.cpuAction(CPUMonitor.MEMORY_WRITE, dstAddress, dst); + } + } void printWarning(int type, int address) throws EmulationException { @@ -760,22 +794,16 @@ // Push PC and SR to stack // store on stack - always move 2 steps (W) even if B. writeRegister(SP, sp = spBefore - 2); - // Put lo & hi on stack! - memory[sp] = pc & 0xff; - memory[sp + 1] = (pc >> 8) & 0xff; + write(sp, pc, true); writeRegister(SP, sp = sp - 2); - // Put lo & hi on stack! - memory[sp] = sr & 0xff; - memory[sp + 1] = (sr >> 8) & 0xff; + write(sp, sr, true); } // Clear SR writeRegister(SR, 0); // sr & ~CPUOFF & ~SCG1 & ~OSCOFF); // Jump to the address specified in the interrupt vector - writeRegister(PC, pc = - memory[0xffe0 + interruptMax * 2] + - (memory[0xffe0 + interruptMax * 2 + 1] << 8)); + writeRegister(PC, pc = read(0xffe0 + interruptMax * 2, true)); servicedInterrupt = interruptMax; servicedInterruptUnit = interruptSource[servicedInterrupt]; @@ -858,7 +886,7 @@ // efficiently if (breakPoints[pc] != null) { if (breakpointActive) { - breakPoints[pc].cpuAction(CPUMonitor.BREAK, pc, 0); + breakPoints[pc].cpuAction(CPUMonitor.EXECUTE, pc, 0); breakpointActive = false; return false; } else { @@ -866,9 +894,11 @@ breakpointActive = true; } } + if (globalMonitor != null) { + globalMonitor.cpuAction(CPUMonitor.EXECUTE, pc, 0); + } - - instruction = memory[pc] + (memory[pc + 1] << 8); + instruction = read(pc, true); op = instruction >> 12; int sp = 0; int sr = 0; @@ -919,8 +949,8 @@ break; case AM_INDEX: // TODO: needs to handle if SR is used! - dstAddress = readRegisterCG(dstRegister, ad) + - memory[pc] + (memory[pc + 1] << 8); + dstAddress = readRegisterCG(dstRegister, ad) + read(pc, true); +// memory[pc] + (memory[pc + 1] << 8); // When is PC incremented - assuming immediately after "read"? pc += 2; @@ -1002,12 +1032,14 @@ case PUSH: if (word) { // Put lo & hi on stack! - memory[sp] = dst & 0xff; - memory[sp + 1] = dst >> 8; +// memory[sp] = dst & 0xff; +// memory[sp + 1] = dst >> 8; + write(sp, dst, true); } else { // Byte => only lo byte - memory[sp] = dst & 0xff; - memory[sp + 1] = 0; +// memory[sp] = dst & 0xff; +// memory[sp + 1] = 0; + write(sp, dst & 0xff, true); } /* if REG or INDIRECT AUTOINC then add 2 cycles, otherwise 1 */ cycles += (ad == AM_REG || ad == AM_IND_AUTOINC) ? 2 : 1; @@ -1017,8 +1049,9 @@ case CALL: // store current PC on stack. (current PC points to next instr.) pc = readRegister(PC); - memory[sp] = pc & 0xff; - memory[sp + 1] = pc >> 8; +// memory[sp] = pc & 0xff; +// memory[sp + 1] = pc >> 8; + write(sp, pc, true); writeRegister(PC, dst); /* Additional cycles: REG => 3, AM_IND_AUTO => 2, other => 1 */ @@ -1040,9 +1073,13 @@ // Put Top of stack to Status DstRegister (TOS -> SR) servicedInterrupt = -1; /* needed before write to SR!!! */ sp = readRegister(SP); - writeRegister(SR, memory[sp++] + (memory[sp++] << 8)); + writeRegister(SR, read(sp, true)); + sp = sp + 2; + // writeRegister(SR, memory[sp++] + (memory[sp++] << 8)); // TOS -> PC - writeRegister(PC, memory[sp++] + (memory[sp++] << 8)); +// writeRegister(PC, memory[sp++] + (memory[sp++] << 8)); + writeRegister(PC, read(sp, true)); + sp = sp + 2; writeRegister(SP, sp); write = false; updateStatus = false; @@ -1150,8 +1187,8 @@ break; case AM_INDEX: // Indexed if reg != PC & CG1/CG2 - will PC be incremented? - srcAddress = readRegisterCG(srcRegister, as) + - memory[pc] + (memory[pc + 1] << 8); + srcAddress = readRegisterCG(srcRegister, as) + read(pc, true); +// memory[pc] + (memory[pc + 1] << 8); // When is PC incremented - assuming immediately after "read"? incRegister(PC, 2); cycles += dstRegMode ? 3 : 6; @@ -1194,11 +1231,11 @@ pc = readRegister(PC); if (dstRegister == 2) { /* absolute mode */ - dstAddress = memory[pc] + (memory[pc + 1] << 8); + dstAddress = read(pc, true); //memory[pc] + (memory[pc + 1] << 8); } else { // CG here - probably not!??? - dstAddress = readRegister(dstRegister) - + memory[pc] + (memory[pc + 1] << 8); + dstAddress = readRegister(dstRegister) + read(pc, true); +// + memory[pc] + (memory[pc + 1] << 8); } if (op != MOV) Modified: mspsim/se/sics/mspsim/core/USART.java =================================================================== --- mspsim/se/sics/mspsim/core/USART.java 2010-06-01 22:21:43 UTC (rev 704) +++ mspsim/se/sics/mspsim/core/USART.java 2010-06-05 19:50:53 UTC (rev 705) @@ -43,8 +43,6 @@ public class USART extends IOUnit implements SFRModule { - public static final boolean DEBUG = false; //true; - // USART 0/1 register offset (0x70 / 0x78) public static final int UCTL = 0; public static final int UTCTL = 1; @@ -166,7 +164,7 @@ } public void enableChanged(int reg, int bit, boolean enabled) { - if (DEBUG) System.out.println("enableChanged: " + reg + " bit: " + bit + + if (DEBUG) log("enableChanged: " + reg + " bit: " + bit + " enabled = " + enabled + " txBit: " + txbit); if (bit == txbit) { txEnabled = enabled; @@ -215,21 +213,21 @@ case UCTL: uctl = data; spiMode = (data & 0x04) > 0; - if (DEBUG) System.out.println(getName() + " write to UCTL " + data); + if (DEBUG) log(" write to UCTL " + data); break; case UTCTL: utctl = data; - if (DEBUG) System.out.println(getName() + " write to UTCTL " + data); + if (DEBUG) log(" write to UTCTL " + data); if (((data >> 4) & 3) == 1) { clockSource = MSP430Constants.CLK_ACLK; if (DEBUG) { - System.out.println(getName() + " Selected ACLK as source"); + log(" Selected ACLK as source"); } } else { clockSource = MSP430Constants.CLK_SMCLK; if (DEBUG) { - System.out.println(getName() + " Selected SMCLK as source"); + log(" Selected SMCLK as source"); } } if ((data & UTCTL_URXSE) == UTCTL_URXSE) { @@ -244,7 +242,7 @@ break; case UMCTL: umctl = data; - if (DEBUG) System.out.println(getName() + " write to UMCTL " + data); + if (DEBUG) log(" write to UMCTL " + data); break; case UBR0: ubr0 = data; @@ -255,14 +253,14 @@ updateBaudRate(); break; case UTXBUF: - if (DEBUG) System.out.print(getName() + ": USART_UTXBUF:" + (char) data + " = " + data + "\n"); + if (DEBUG) log(": USART_UTXBUF:" + (char) data + " = " + data + "\n"); if (txEnabled || (spiMode && rxEnabled)) { // Interruptflag not set! clrBitIFG(utxifg); /* the TX is no longer empty ! */ utctl &= ~UTCTL_TXEMPTY; /* should the interrupt be flagged off here ? - or only the flags */ - if (DEBUG) System.out.println(getName() + " flagging off transmit interrupt"); + if (DEBUG) log(" flagging off transmit interrupt"); // cpu.flagInterrupt(transmitInterrupt, this, false); // Schedule on cycles here @@ -273,11 +271,11 @@ if (!transmitting) { /* how long time will the copy from the TX_BUF to the shift reg take? */ /* assume 3 cycles? */ - nextTXReady = cycles + 3; //tickPerByte + 3; + nextTXReady = cycles + 1; //tickPerByte + 3; cpu.scheduleCycleEvent(txTrigger, nextTXReady); } } else { - System.out.println("Ignoring UTXBUF data since TX not active..."); + log("Ignoring UTXBUF data since TX not active..."); } utxbuf = data; break; @@ -291,10 +289,10 @@ switch (address) { case UCTL: - if (DEBUG) System.out.println(getName() + " read from UCTL"); + if (DEBUG) log(" read from UCTL"); return uctl; case UTCTL: - if (DEBUG) System.out.println(getName() + " read from UTCTL: " + utctl); + if (DEBUG) log(" read from UTCTL: " + utctl); return utctl; case URCTL: return urctl; @@ -311,7 +309,7 @@ // When byte is read - the interruptflag is cleared! // and error status should also be cleared later... if (MSP430Constants.DEBUGGING_LEVEL > 0) { - System.out.println(getName() + " clearing rx interrupt flag " + cpu.getPC() + " byte: " + tmp); + log(" clearing rx interrupt flag " + cpu.getPC() + " byte: " + tmp); } clrBitIFG(urxifg); if (listener != null) { @@ -329,14 +327,12 @@ } if (clockSource == MSP430Constants.CLK_ACLK) { if (DEBUG) { - System.out.println(getName() + " Baud rate is (bps): " + cpu.aclkFrq / div + - " div = " + div); + log(" Baud rate is (bps): " + cpu.aclkFrq / div + " div = " + div); } baudRate = cpu.aclkFrq / div; } else { if (DEBUG) { - System.out.println(getName() + " Baud rate is (bps): " + cpu.smclkFrq / div + - " div = " + div); + log(" Baud rate is (bps): " + cpu.smclkFrq / div + " div = " + div); } baudRate = cpu.smclkFrq / div; } @@ -344,7 +340,7 @@ // Is this correct??? Is it the DCO or smclkFRQ we should have here??? tickPerByte = (8 * cpu.smclkFrq) / baudRate; if (DEBUG) { - System.out.println(getName() + " Ticks per byte: " + tickPerByte); + log(" Ticks per byte: " + tickPerByte); } } @@ -387,14 +383,14 @@ setBitIFG(utxifg); transmitting = true; nextTXReady = cycles + tickPerByte + 1; - cpu.scheduleCycleEvent(txTrigger, nextTXReady); + cpu.scheduleCycleEvent(txTrigger, nextTXReady); } if (DEBUG) { if (isIEBitsSet(utxifg)) { - System.out.println(getName() + " flagging on transmit interrupt"); + log(" flagging on transmit interrupt"); } - System.out.println(getName() + " Ready to transmit next at: " + cycles); + log(" Ready to transmit next at: " + cycles); } } @@ -409,8 +405,8 @@ public void byteReceived(int b) { if (!rxEnabled) return; - if (MSP430Constants.DEBUGGING_LEVEL > 0) { - System.out.println(getName() + " byteReceived: " + b + " " + (char) b); + if (DEBUG) { + log(" byteReceived: " + b + " " + (char) b); } urxbuf = b & 0xff; // Indicate interrupt also! @@ -418,9 +414,15 @@ // Check if the IE flag is enabled! - same as the IFlag to indicate! if (isIEBitsSet(urxifg)) { - if (MSP430Constants.DEBUGGING_LEVEL > 0) { - System.out.println(getName() + " flagging receive interrupt "); + if (DEBUG) { + log(" flagging receive interrupt "); } } } + + public String info() { + return "UTXIE: " + isIEBitsSet(utxifg) + " URXIE:" + isIEBitsSet(urxifg) + "\n" + + "UTXIFG: " + ((getIFG() & utxifg) > 0) + " URXIFG:" + ((getIFG() & urxifg) > 0); + } + } \ No newline at end of file Modified: mspsim/se/sics/mspsim/core/Watchdog.java =================================================================== --- mspsim/se/sics/mspsim/core/Watchdog.java 2010-06-01 22:21:43 UTC (rev 704) +++ mspsim/se/sics/mspsim/core/Watchdog.java 2010-06-05 19:50:53 UTC (rev 705) @@ -108,6 +108,8 @@ SFR sfr = cpu.getSFR(); sfr.setBitIFG(0, WATCHDOG_INTERRUPT_VALUE); scheduleTimer(); + System.out.println("WDT trigger - will set interrupt flag (no reset)"); + cpu.generateTrace(System.out); } else { System.out.println("WDT trigger - will reset node!"); cpu.generateTrace(System.out); Modified: mspsim/se/sics/mspsim/util/StatCommands.java =================================================================== --- mspsim/se/sics/mspsim/util/StatCommands.java 2010-06-01 22:21:43 UTC (rev 704) +++ mspsim/se/sics/mspsim/util/StatCommands.java 2010-06-05 19:50:53 UTC (rev 705) @@ -48,6 +48,7 @@ import se.sics.mspsim.cli.CommandContext; import se.sics.mspsim.cli.CommandHandler; import se.sics.mspsim.core.Chip; +import se.sics.mspsim.core.Loggable; import se.sics.mspsim.core.MSP430Core; import se.sics.mspsim.core.TimeEvent; @@ -62,7 +63,7 @@ } public void setupCommands(ComponentRegistry registry, CommandHandler handler) { - handler.registerCommand("chipinfo", new BasicCommand("show information about specified chip", + handler.registerCommand("chipinfo", new BasicCommand("show information about specified chip/loggable", "[chips...]") { @Override @@ -70,21 +71,21 @@ if (context.getArgumentCount() > 0) { for (int i = 0, n = context.getArgumentCount(); i < n; i++) { String chipName = context.getArgument(i); - Chip chip = statistics.getChip(chipName); + Loggable chip = cpu.getLoggable(chipName); if (chip == null) { context.out.println(" " + chipName + ": NOT FOUND"); } else { context.out.println(chipName + ": " + chip); - String info = chip.chipinfo(); + String info = chip.info(); if (info != null) { context.out.println(info); } } } } else { - Chip[] chips = statistics.getChips(); + Loggable[] chips = cpu.getLoggables(); if (chips == null) { - context.out.println("No chips found."); + context.out.println("No loggables found."); } else { for (int i = 0, n = chips.length; i < n; i++) { context.out.println(" " + chips[i].getName()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ni...@us...> - 2010-06-01 22:21:50
|
Revision: 704 http://mspsim.svn.sourceforge.net/mspsim/?rev=704&view=rev Author: nifi Date: 2010-06-01 22:21:43 +0000 (Tue, 01 Jun 2010) Log Message: ----------- Added handling of the four operating modes (CONSEQx) and ADC12BUSY Modified Paths: -------------- mspsim/se/sics/mspsim/core/ADC12.java Modified: mspsim/se/sics/mspsim/core/ADC12.java =================================================================== --- mspsim/se/sics/mspsim/core/ADC12.java 2010-05-31 13:54:39 UTC (rev 703) +++ mspsim/se/sics/mspsim/core/ADC12.java 2010-06-01 22:21:43 UTC (rev 704) @@ -96,8 +96,15 @@ 256, 384, 512, 768, 1024, 1024, 1024, 1024 }; + public static final int BUSY_MASK = 0x01; public static final int EOS_MASK = 0x80; - + + public static final int CONSEQ_SINGLE = 0x00; + public static final int CONSEQ_SEQUENCE = 0x01; + public static final int CONSEQ_REPEAT_SINGLE = 0x02; + public static final int CONSEQ_REPEAT_SEQUENCE = 0x03; + public static final int CONSEQ_SEQUENCE_MASK = 0x01; + private final MSP430Core core; private int adc12ctl0 = 0; @@ -111,6 +118,7 @@ private boolean adc12On = false; private boolean enableConversion; private boolean startConversion; + private boolean isConverting; private int shSource = 0; private int startMem = 0; @@ -142,6 +150,7 @@ public void reset(int type) { enableConversion = false; startConversion = false; + isConverting = false; adc12ctl0 = 0; adc12ctl1 = 0; shTime0 = shTime1 = 4; @@ -181,21 +190,20 @@ if (DEBUG) System.out.println(getName() + ": Set SHTime0: " + shTime0 + " SHTime1: " + shTime1 + " ENC:" + enableConversion + " Start: " + startConversion + " ADC12ON: " + adc12On); - if (adc12On && enableConversion && startConversion) { - if (!adcTrigger.isScheduled()) { - // Set the start time to be now! - adc12Pos = startMem; - int delay = adcDiv * ((adc12Pos < 8 ? shTime0 : shTime1) + 13); - core.scheduleTimeEvent(adcTrigger, core.getTime() + delay); - } + if (adc12On && enableConversion && startConversion && !isConverting) { + // Set the start time to be now! + isConverting = true; + adc12Pos = startMem; + int delay = adcDiv * ((adc12Pos < 8 ? shTime0 : shTime1) + 13); + core.scheduleTimeEvent(adcTrigger, core.getTime() + delay); } break; case ADC12CTL1: if (enableConversion) { // Ongoing conversion: only some parts may be changed - adc12ctl1 = (adc12ctl1 & 0xfff8) + (value & 0x7); + adc12ctl1 = (adc12ctl1 & 0xfff8) + (value & 0x6); } else { - adc12ctl1 = value; + adc12ctl1 = value & 0xfffe; startMem = (value >> 12) & 0xf; shSource = (value >> 10) & 0x3; adcDiv = ((value >> 5) & 0x7) + 1; @@ -231,7 +239,7 @@ case ADC12CTL0: return adc12ctl0; case ADC12CTL1: - return adc12ctl1; + return isConverting ? (adc12ctl1 | BUSY_MASK) : adc12ctl1; case ADC12IE: return adc12ie; case ADC12IFG: @@ -261,8 +269,12 @@ int smp = 0; private void convert() { - // If either off or not enable conversion then just return... - if (!adc12On || !enableConversion) return; + // If off then just return... + if (!adc12On) { + isConverting = false; + return; + } + boolean runAgain = enableConversion && conSeq != CONSEQ_SINGLE; // Some noise... ADCInput input = adcInput[adc12mctl[adc12Pos] & 0xf]; adc12mem[adc12Pos] = input != null ? input.nextData() : 2048 + 100 - smp & 255; @@ -274,14 +286,24 @@ //System.out.println("** Trigger ADC12 IRQ for ADCMEM" + adc12Pos); core.flagInterrupt(adc12Vector, this, true); } - // Increase - if ((adc12mctl[adc12Pos] & EOS_MASK) == EOS_MASK) { - adc12Pos = startMem; + if ((conSeq & CONSEQ_SEQUENCE_MASK) != 0) { + // Increase + if ((adc12mctl[adc12Pos] & EOS_MASK) == EOS_MASK) { + adc12Pos = startMem; + if (conSeq == CONSEQ_SEQUENCE) { + // Single sequence only + runAgain = false; + } + } else { + adc12Pos = (adc12Pos + 1) & 0x0f; + } + } + if (!runAgain) { + isConverting = false; } else { - adc12Pos = (adc12Pos + 1) & 0x0f; + int delay = adcDiv * ((adc12Pos < 8 ? shTime0 : shTime1) + 13); + core.scheduleTimeEvent(adcTrigger, adcTrigger.time + delay); } - int delay = adcDiv * ((adc12Pos < 8 ? shTime0 : shTime1) + 13); - core.scheduleTimeEvent(adcTrigger, adcTrigger.time + delay); } public void interruptServiced(int vector) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ni...@us...> - 2010-05-31 13:54:46
|
Revision: 703 http://mspsim.svn.sourceforge.net/mspsim/?rev=703&view=rev Author: nifi Date: 2010-05-31 13:54:39 +0000 (Mon, 31 May 2010) Log Message: ----------- only show chipinfo when available Modified Paths: -------------- mspsim/se/sics/mspsim/util/StatCommands.java Modified: mspsim/se/sics/mspsim/util/StatCommands.java =================================================================== --- mspsim/se/sics/mspsim/util/StatCommands.java 2010-05-28 17:09:29 UTC (rev 702) +++ mspsim/se/sics/mspsim/util/StatCommands.java 2010-05-31 13:54:39 UTC (rev 703) @@ -75,7 +75,10 @@ context.out.println(" " + chipName + ": NOT FOUND"); } else { context.out.println(chipName + ": " + chip); - context.out.println(chip.chipinfo()); + String info = chip.chipinfo(); + if (info != null) { + context.out.println(info); + } } } } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ni...@us...> - 2010-05-28 17:09:36
|
Revision: 702 http://mspsim.svn.sourceforge.net/mspsim/?rev=702&view=rev Author: nifi Date: 2010-05-28 17:09:29 +0000 (Fri, 28 May 2010) Log Message: ----------- * corrected behaviour of ADC12IFG * added write protection during conversion * added reset handling Modified Paths: -------------- mspsim/se/sics/mspsim/core/ADC12.java Modified: mspsim/se/sics/mspsim/core/ADC12.java =================================================================== --- mspsim/se/sics/mspsim/core/ADC12.java 2010-05-17 09:43:04 UTC (rev 701) +++ mspsim/se/sics/mspsim/core/ADC12.java 2010-05-28 17:09:29 UTC (rev 702) @@ -35,7 +35,7 @@ * * Each time a sample is converted the ADC12 system will check for EOS flag * and if not set it just continues with the next conversion (x + 1). - * If EOS next conv is startMem. + * If EOS next conversion is startMem. * Interrupt is triggered when the IE flag are set! * * @@ -47,6 +47,8 @@ package se.sics.mspsim.core; +import java.util.Arrays; + public class ADC12 extends IOUnit { private static final boolean DEBUG = false; @@ -96,6 +98,7 @@ public static final int EOS_MASK = 0x80; + private final MSP430Core core; private int adc12ctl0 = 0; private int adc12ctl1 = 0; @@ -113,7 +116,7 @@ private int startMem = 0; private int adcDiv = 1; - private ADCInput adcInput[] = new ADCInput[8]; + private ADCInput adcInput[] = new ADCInput[16]; private int conSeq; private int adc12ie; @@ -121,7 +124,6 @@ private int adc12iv; private int adcSSel; - private MSP430Core core; private int adc12Vector = 7; private TimeEvent adcTrigger = new TimeEvent(0) { @@ -136,38 +138,70 @@ super(cpu.memory, 0); core = cpu; } - + + public void reset(int type) { + enableConversion = false; + startConversion = false; + adc12ctl0 = 0; + adc12ctl1 = 0; + shTime0 = shTime1 = 4; + adc12On = false; + shSource = 0; + startMem = adc12Pos = 0; + adcDiv = 1; + + conSeq = 0; + adc12ie = 0; + adc12ifg = 0; + adc12iv = 0; + adcSSel = 0; + + Arrays.fill(adc12mctl, 0); + } + public void setADCInput(int adindex, ADCInput input) { adcInput[adindex] = input; } // write a value to the IO unit - public void write(int address, int value, boolean word, - long cycles) { + public void write(int address, int value, boolean word, long cycles) { switch (address) { case ADC12CTL0: - adc12ctl0 = value; - shTime0 = SHTBITS[(value >> 8) & 0x0f]; - shTime1 = SHTBITS[(value >> 12) & 0x0f]; - adc12On = (value & 0x10) > 0; + if (enableConversion) { + // Ongoing conversion: only some parts may be changed + adc12ctl0 = (adc12ctl0 & 0xfff0) + (value & 0xf); + } else { + adc12ctl0 = value; + shTime0 = SHTBITS[(value >> 8) & 0x0f]; + shTime1 = SHTBITS[(value >> 12) & 0x0f]; + adc12On = (value & 0x10) > 0; + } enableConversion = (value & 0x02) > 0; startConversion = (value & 0x01) > 0; if (DEBUG) System.out.println(getName() + ": Set SHTime0: " + shTime0 + " SHTime1: " + shTime1 + " ENC:" + enableConversion + " Start: " + startConversion + " ADC12ON: " + adc12On); if (adc12On && enableConversion && startConversion) { - // Set the start time to be now! - adcTrigger.time = core.getTime(); - convert(); + if (!adcTrigger.isScheduled()) { + // Set the start time to be now! + adc12Pos = startMem; + int delay = adcDiv * ((adc12Pos < 8 ? shTime0 : shTime1) + 13); + core.scheduleTimeEvent(adcTrigger, core.getTime() + delay); + } } break; case ADC12CTL1: - adc12ctl1 = value; - startMem = (value >> 12) & 0xf; - shSource = (value >> 10) & 0x3; - adcDiv = ((value >> 5) & 0x7) + 1; + if (enableConversion) { + // Ongoing conversion: only some parts may be changed + adc12ctl1 = (adc12ctl1 & 0xfff8) + (value & 0x7); + } else { + adc12ctl1 = value; + startMem = (value >> 12) & 0xf; + shSource = (value >> 10) & 0x3; + adcDiv = ((value >> 5) & 0x7) + 1; + adcSSel = (value >> 3) & 0x03; + } conSeq = (value >> 1) & 0x03; - adcSSel = (value >> 3) & 0x03; if (DEBUG) System.out.println(getName() + ": Set startMem: " + startMem + " SHSource: " + shSource + " ConSeq-mode:" + conSeq + " Div: " + adcDiv + " ADCSSEL: " + adcSSel); break; @@ -179,10 +213,13 @@ break; default: if (address >= ADC12MCTL0 && address <= ADC12MCTL15) { - adc12mctl[address - ADC12MCTL0] = value & 0xff; - if (DEBUG) System.out.println("ADC12MCTL" + (address - ADC12MCTL0) + " source = " + (value & 0xf)); - if ((value & 0x80) != 0) { - if (DEBUG) System.out.println("ADC12MCTL" + (address - ADC12MCTL0) + " EOS bit set"); + if (enableConversion) { + /* Ongoing conversion: not possible to modify */ + } else { + adc12mctl[address - ADC12MCTL0] = value & 0xff; + if (DEBUG) System.out.println("ADC12MCTL" + (address - ADC12MCTL0) + + " source = " + (value & 0xf) + + (((value & EOS_MASK) != 0) ? " EOS bit set" : "")); } } } @@ -202,7 +239,7 @@ default: if (address >= ADC12MCTL0 && address <= ADC12MCTL15) { return adc12mctl[address - ADC12MCTL0]; - } else if (address >= ADC12MEM0) { + } else if (address >= ADC12MEM0 && address <= ADC12MEM15) { int reg = (address - ADC12MEM0) / 2; // Clear ifg! adc12ifg &= ~(1 << reg); @@ -226,12 +263,12 @@ private void convert() { // If either off or not enable conversion then just return... if (!adc12On || !enableConversion) return; - // Some noice... - ADCInput input = adcInput[adc12mctl[adc12Pos] & 0x7]; + // Some noise... + ADCInput input = adcInput[adc12mctl[adc12Pos] & 0xf]; adc12mem[adc12Pos] = input != null ? input.nextData() : 2048 + 100 - smp & 255; smp += 7; + adc12ifg |= (1 << adc12Pos); if ((adc12ie & (1 << adc12Pos)) > 0) { - adc12ifg |= (1 << adc12Pos); // This should check if there already is an higher iv! adc12iv = adc12Pos * 2 + 6; //System.out.println("** Trigger ADC12 IRQ for ADCMEM" + adc12Pos); @@ -243,8 +280,7 @@ } else { adc12Pos = (adc12Pos + 1) & 0x0f; } - int delay = adcDiv * (shTime0 + 13); - + int delay = adcDiv * ((adc12Pos < 8 ? shTime0 : shTime1) + 13); core.scheduleTimeEvent(adcTrigger, adcTrigger.time + delay); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fro...@us...> - 2010-05-17 09:43:11
|
Revision: 701 http://mspsim.svn.sourceforge.net/mspsim/?rev=701&view=rev Author: fros4943 Date: 2010-05-17 09:43:04 +0000 (Mon, 17 May 2010) Log Message: ----------- removed debugging output Modified Paths: -------------- mspsim/se/sics/mspsim/util/ArrayFIFO.java Modified: mspsim/se/sics/mspsim/util/ArrayFIFO.java =================================================================== --- mspsim/se/sics/mspsim/util/ArrayFIFO.java 2010-05-17 09:42:35 UTC (rev 700) +++ mspsim/se/sics/mspsim/util/ArrayFIFO.java 2010-05-17 09:43:04 UTC (rev 701) @@ -60,7 +60,7 @@ if (STRICT) { throw new EmulationException("Reading from empty FIFO"); } else { - System.out.println("Reading from empty FIFO"); + /*System.out.println("Reading from empty FIFO");*/ return 0; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fro...@us...> - 2010-05-17 09:42:41
|
Revision: 700 http://mspsim.svn.sourceforge.net/mspsim/?rev=700&view=rev Author: fros4943 Date: 2010-05-17 09:42:35 +0000 (Mon, 17 May 2010) Log Message: ----------- + method that returns current cpu freq Modified Paths: -------------- mspsim/se/sics/mspsim/core/MSP430.java Modified: mspsim/se/sics/mspsim/core/MSP430.java =================================================================== --- mspsim/se/sics/mspsim/core/MSP430.java 2010-04-01 14:28:04 UTC (rev 699) +++ mspsim/se/sics/mspsim/core/MSP430.java 2010-05-17 09:42:35 UTC (rev 700) @@ -297,6 +297,9 @@ setRunning(false); } + public int getDCOFrequency() { + return dcoFrq; + } public int getExecCount(int address) { if (execCounter != null) { return execCounter[address]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2010-04-01 14:28:11
|
Revision: 699 http://mspsim.svn.sourceforge.net/mspsim/?rev=699&view=rev Author: joxe Date: 2010-04-01 14:28:04 +0000 (Thu, 01 Apr 2010) Log Message: ----------- fixed timing of RSSI valid in CC2420 Modified Paths: -------------- mspsim/se/sics/mspsim/chip/CC2420.java Modified: mspsim/se/sics/mspsim/chip/CC2420.java =================================================================== --- mspsim/se/sics/mspsim/chip/CC2420.java 2010-04-01 12:52:47 UTC (rev 698) +++ mspsim/se/sics/mspsim/chip/CC2420.java 2010-04-01 14:28:04 UTC (rev 699) @@ -353,6 +353,11 @@ case RX_CALIBRATE: setState(RadioState.RX_SFD_SEARCH); break; + /* this will be called 8 symbols after first SFD_SEARCH */ + case RX_SFD_SEARCH: + status |= STATUS_RSSI_VALID; + updateCCA(); + break; case TX_CALIBRATE: setState(RadioState.TX_PREAMBLE); @@ -447,8 +452,11 @@ case RX_SFD_SEARCH: zeroSymbols = 0; - // RSSI valid here? - status |= STATUS_RSSI_VALID; + /* eight symbols after first SFD search RSSI will be valid */ + if ((status & STATUS_RSSI_VALID) == 0) { + setSymbolEvent(8); + } +// status |= STATUS_RSSI_VALID; updateCCA(); setMode(MODE_RX_ON); break; @@ -488,9 +496,10 @@ break; case TX_ACK_CALIBRATE: - /* TX active during ACK ? */ + /* TX active during ACK + NOTE: we ignore the SFD when receiveing full packets so + * we need to add another extra 2 symbols here to get a correct timing */ status |= STATUS_TX_ACTIVE; - setSymbolEvent(12 + 2); + setSymbolEvent(12 + 2 + 2); setMode(MODE_TXRX_ON); break; case TX_ACK_PREAMBLE: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2010-04-01 12:52:54
|
Revision: 698 http://mspsim.svn.sourceforge.net/mspsim/?rev=698&view=rev Author: joxe Date: 2010-04-01 12:52:47 +0000 (Thu, 01 Apr 2010) Log Message: ----------- 12 symbols instead of 8 when calibrating RX Modified Paths: -------------- mspsim/se/sics/mspsim/chip/CC2420.java Modified: mspsim/se/sics/mspsim/chip/CC2420.java =================================================================== --- mspsim/se/sics/mspsim/chip/CC2420.java 2010-03-31 20:08:15 UTC (rev 697) +++ mspsim/se/sics/mspsim/chip/CC2420.java 2010-04-01 12:52:47 UTC (rev 698) @@ -441,7 +441,7 @@ case RX_CALIBRATE: /* should be 12 according to specification */ - setSymbolEvent(8); + setSymbolEvent(12); setMode(MODE_RX_ON); break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2010-03-31 20:08:23
|
Revision: 697 http://mspsim.svn.sourceforge.net/mspsim/?rev=697&view=rev Author: joxe Date: 2010-03-31 20:08:15 +0000 (Wed, 31 Mar 2010) Log Message: ----------- removed some debug printout Modified Paths: -------------- mspsim/se/sics/mspsim/chip/CC2420.java Modified: mspsim/se/sics/mspsim/chip/CC2420.java =================================================================== --- mspsim/se/sics/mspsim/chip/CC2420.java 2010-03-31 19:59:22 UTC (rev 696) +++ mspsim/se/sics/mspsim/chip/CC2420.java 2010-03-31 20:08:15 UTC (rev 697) @@ -619,8 +619,8 @@ int crc = rxFIFO.get(-2) << 8; crc += rxFIFO.get(-1); //memory[RAM_RXFIFO + ((rxfifoWritePos + 128 - 1) & 127)]; - if (true && crc != rxCrc.getCRCBitrev()) { - System.out.println("CRC not OK: recv:" + Utils.hex16(crc) + " calc: " + Utils.hex16(rxCrc.getCRCBitrev())); + if (DEBUG && crc != rxCrc.getCRCBitrev()) { + log("CRC not OK: recv:" + Utils.hex16(crc) + " calc: " + Utils.hex16(rxCrc.getCRCBitrev())); } // Should take a RSSI value as input or use a set-RSSI value... rxFIFO.set(-2, registers[REG_RSSI] & 0xff); @@ -636,7 +636,7 @@ if (rxFIFO.length() <= rxlen + 1) { setFIFOP(true); } else { - System.out.println("Did not set FIFOP rxfifoLen: " + rxFIFO.length() + " rxlen: " + rxlen); + if (DEBUG) log("Did not set FIFOP rxfifoLen: " + rxFIFO.length() + " rxlen: " + rxlen); } setSFD(false); if (DEBUG) log("RX: Complete: packetStart: " + rxFIFO.stateToString()); @@ -770,12 +770,12 @@ /* initiate read of another packet - update some variables to keep track of packet reading... */ if (rxfifoReadLeft == 0) { rxfifoReadLeft = fifoData; - System.out.println("Init read of packet - len: " + rxfifoReadLeft + + if (DEBUG) log("Init read of packet - len: " + rxfifoReadLeft + " fifo: " + rxFIFO.stateToString()); } else if (--rxfifoReadLeft == 0) { /* check if we have another complete packet in buffer... */ if (rxFIFO.length() > 0 && rxFIFO.length() > rxFIFO.peek(0)) { - System.out.println("More in FIFO - FIFOP = 1! plen: " + rxFIFO.stateToString()); + if (DEBUG) log("More in FIFO - FIFOP = 1! plen: " + rxFIFO.stateToString()); if (!overflow) setFIFOP(true); } } @@ -880,7 +880,7 @@ if (stateMachine == RadioState.TX_ACK || stateMachine == RadioState.TX_FRAME || stateMachine == RadioState.RX_FRAME) { - System.out.println("Warning: turning off RXTX during " + stateMachine); + System.out.println("CC2420: Warning: turning off RXTX during " + stateMachine); } setState(RadioState.IDLE); break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2010-03-31 19:59:41
|
Revision: 696 http://mspsim.svn.sourceforge.net/mspsim/?rev=696&view=rev Author: joxe Date: 2010-03-31 19:59:22 +0000 (Wed, 31 Mar 2010) Log Message: ----------- fixed bug when reading from empty fifo Modified Paths: -------------- mspsim/se/sics/mspsim/chip/CC2420.java mspsim/se/sics/mspsim/core/Watchdog.java mspsim/se/sics/mspsim/util/ArrayFIFO.java Modified: mspsim/se/sics/mspsim/chip/CC2420.java =================================================================== --- mspsim/se/sics/mspsim/chip/CC2420.java 2010-03-31 15:57:05 UTC (rev 695) +++ mspsim/se/sics/mspsim/chip/CC2420.java 2010-03-31 19:59:22 UTC (rev 696) @@ -395,7 +395,7 @@ // TODO: super(cpu) and chip autoregister chips into the CPU. public CC2420(MSP430Core cpu) { - rxFIFO = new ArrayFIFO(memory, RAM_RXFIFO, 128); + rxFIFO = new ArrayFIFO("RXFIFO", memory, RAM_RXFIFO, 128); registers[REG_SNOP] = 0; registers[REG_TXCTRL] = 0xa0ff; Modified: mspsim/se/sics/mspsim/core/Watchdog.java =================================================================== --- mspsim/se/sics/mspsim/core/Watchdog.java 2010-03-31 15:57:05 UTC (rev 695) +++ mspsim/se/sics/mspsim/core/Watchdog.java 2010-03-31 19:59:22 UTC (rev 696) @@ -124,7 +124,8 @@ if (address == WDTCTL) { if ((value >> 8) == 0x5a) { wdtctl = value & 0xff; - if (DEBUG) System.out.println(getName() + " Wrote to WDTCTL: " + Utils.hex8(wdtctl)); + if (DEBUG) System.out.println(getName() + " Wrote to WDTCTL: " + Utils.hex8(wdtctl) + " from " + cpu.getPC()); + // Is it on? wdtOn = (value & 0x80) == 0; boolean lastACLK = sourceACLK; Modified: mspsim/se/sics/mspsim/util/ArrayFIFO.java =================================================================== --- mspsim/se/sics/mspsim/util/ArrayFIFO.java 2010-03-31 15:57:05 UTC (rev 695) +++ mspsim/se/sics/mspsim/util/ArrayFIFO.java 2010-03-31 19:59:22 UTC (rev 696) @@ -9,6 +9,7 @@ private final int memory[]; private final int start; private final int size; + private final String name; private int readPos = 0; private int writePos = 0; @@ -16,8 +17,9 @@ private int markWritePos; - public ArrayFIFO(int[] mem, int start, int size) { + public ArrayFIFO(String name, int[] mem, int start, int size) { memory = mem; + this.name = name; this.start = start; this.size = size; len = 0; @@ -54,18 +56,19 @@ } public int read() { - int v = memory[start + readPos++]; - if (readPos >= size) { - readPos = 0; - } - len--; - if (len < 0) { + if (len <= 0) { if (STRICT) { throw new EmulationException("Reading from empty FIFO"); } else { System.out.println("Reading from empty FIFO"); + return 0; } } + int v = memory[start + readPos++]; + if (readPos >= size) { + readPos = 0; + } + len--; return v & 0xff; } @@ -115,7 +118,7 @@ public String stateToString() { - return "FIFO: " + len + " rpos: " + readPos + " wpos: " + writePos; + return name + " len: " + len + " rpos: " + readPos + " wpos: " + writePos; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2010-03-31 15:57:11
|
Revision: 695 http://mspsim.svn.sourceforge.net/mspsim/?rev=695&view=rev Author: joxe Date: 2010-03-31 15:57:05 +0000 (Wed, 31 Mar 2010) Log Message: ----------- removed emulation exception since Contiki CC2420 reads a byte when buffer is empty Modified Paths: -------------- mspsim/se/sics/mspsim/util/ArrayFIFO.java Modified: mspsim/se/sics/mspsim/util/ArrayFIFO.java =================================================================== --- mspsim/se/sics/mspsim/util/ArrayFIFO.java 2010-03-31 15:12:21 UTC (rev 694) +++ mspsim/se/sics/mspsim/util/ArrayFIFO.java 2010-03-31 15:57:05 UTC (rev 695) @@ -4,6 +4,8 @@ public class ArrayFIFO { + public static final boolean STRICT = false; + private final int memory[]; private final int start; private final int size; @@ -58,7 +60,11 @@ } len--; if (len < 0) { - throw new EmulationException("Reading from empty FIFO"); + if (STRICT) { + throw new EmulationException("Reading from empty FIFO"); + } else { + System.out.println("Reading from empty FIFO"); + } } return v & 0xff; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2010-03-31 15:12:27
|
Revision: 694 http://mspsim.svn.sourceforge.net/mspsim/?rev=694&view=rev Author: joxe Date: 2010-03-31 15:12:21 +0000 (Wed, 31 Mar 2010) Log Message: ----------- refactored rxfifo handling to external class Modified Paths: -------------- mspsim/se/sics/mspsim/chip/CC2420.java Added Paths: ----------- mspsim/se/sics/mspsim/util/ArrayFIFO.java Modified: mspsim/se/sics/mspsim/chip/CC2420.java =================================================================== --- mspsim/se/sics/mspsim/chip/CC2420.java 2010-03-30 21:20:41 UTC (rev 693) +++ mspsim/se/sics/mspsim/chip/CC2420.java 2010-03-31 15:12:21 UTC (rev 694) @@ -41,6 +41,7 @@ package se.sics.mspsim.chip; import se.sics.mspsim.core.*; +import se.sics.mspsim.util.ArrayFIFO; import se.sics.mspsim.util.CCITT_CRC; import se.sics.mspsim.util.Utils; @@ -237,17 +238,15 @@ // When accessing RAM the second byte of the address contains // a flag indicating read/write public static final int FLAG_RAM_READ = 0x20; - + private static final int[] BC_ADDRESS = new int[] {0xff, 0xff}; + private SpiState state = SpiState.WAITING; private int pos; private int address; private int shrPos; private int txfifoPos; private boolean txfifoFlush; // TXFIFO is automatically flushed on next write - private int rxfifoWritePos; - private int rxfifoReadPos; private int rxfifoReadLeft; // number of bytes left to read from current packet - private int rxfifoLen; private int rxlen; private int rxread; private int zeroSymbols; @@ -268,6 +267,8 @@ private boolean ackRequest = false; private boolean autoCRC = false; private int dsn = 0; + private int fcf0 = 0; + private int fcf1 = 0; private int activeFrequency = 0; @@ -381,8 +382,9 @@ private int[] ackBuf = {0x05, 0x02, 0x00, 0x00, 0x00, 0x00}; private CCITT_CRC rxCrc = new CCITT_CRC(); private CCITT_CRC txCrc = new CCITT_CRC(); - private int rxPacketStart; + private ArrayFIFO rxFIFO; + public void setStateListener(StateListener listener) { stateListener = listener; } @@ -393,14 +395,15 @@ // TODO: super(cpu) and chip autoregister chips into the CPU. public CC2420(MSP430Core cpu) { + rxFIFO = new ArrayFIFO(memory, RAM_RXFIFO, 128); + registers[REG_SNOP] = 0; registers[REG_TXCTRL] = 0xa0ff; this.cpu = cpu; setModeNames(MODE_NAMES); setMode(MODE_POWER_OFF); fifoP = false; - rxfifoReadPos = 0; - rxfifoWritePos = 0; + rxFIFO.reset(); overflow = false; reset(); cpu.addChip(this); @@ -429,9 +432,7 @@ break; case POWER_DOWN: - rxfifoReadPos = 0; - rxfifoReadLeft = 0; - rxfifoWritePos = 0; + rxFIFO.reset(); status &= ~(STATUS_RSSI_VALID | STATUS_XOSC16M_STABLE); reset(); setMode(MODE_POWER_OFF); @@ -506,11 +507,16 @@ ackPos = 0; ackNext(); break; + case RX_FRAME: + /* mark position of frame start - for rejecting when address is wrong */ + rxFIFO.mark(); + rxread = 0; + break; } /* Notify state listener */ if (stateListener != null) { - stateListener.newState(stateMachine); + stateListener.newState(stateMachine); } return true; @@ -523,146 +529,128 @@ * @see se.sics.mspsim.chip.RFListener#receivedByte(byte) */ public void receivedByte(byte data) { - // Received a byte from the "air" + // Received a byte from the "air" - log("RF Byte received: " + Utils.hex8(data) + " state: " + stateMachine + " noZeroes: " + zeroSymbols + - ((stateMachine == RadioState.RX_SFD_SEARCH || stateMachine == RadioState.RX_FRAME) ? "" : " *** Ignored")); + log("RF Byte received: " + Utils.hex8(data) + " state: " + stateMachine + " noZeroes: " + zeroSymbols + + ((stateMachine == RadioState.RX_SFD_SEARCH || stateMachine == RadioState.RX_FRAME) ? "" : " *** Ignored")); - if(stateMachine == RadioState.RX_SFD_SEARCH) { - // Look for the preamble (4 zero bytes) followed by the SFD byte 0x7A - if(data == 0) { - // Count zero bytes - zeroSymbols++; - } else if(zeroSymbols >= 4 && data == 0x7A) { - // If the received byte is !zero, we have counted 4 zero bytes prior to this one, - // and the current received byte == 0x7A (SFD), we're in sync. - // In RX mode, SFD goes high when the SFD is received - setSFD(true); - if (DEBUG) log("RX: Preamble/SFD Synchronized."); - rxread = 0; - setState(RadioState.RX_FRAME); - } else { - /* if not four zeros and 0x7A then no zeroes... */ - zeroSymbols = 0; - } + if(stateMachine == RadioState.RX_SFD_SEARCH) { + // Look for the preamble (4 zero bytes) followed by the SFD byte 0x7A + if(data == 0) { + // Count zero bytes + zeroSymbols++; + } else if(zeroSymbols >= 4 && data == 0x7A) { + // If the received byte is !zero, we have counted 4 zero bytes prior to this one, + // and the current received byte == 0x7A (SFD), we're in sync. + // In RX mode, SFD goes high when the SFD is received + setSFD(true); + if (DEBUG) log("RX: Preamble/SFD Synchronized."); + setState(RadioState.RX_FRAME); + } else { + /* if not four zeros and 0x7A then no zeroes... */ + zeroSymbols = 0; + } - } else if(stateMachine == RadioState.RX_FRAME) { - if(rxfifoLen == 128) { - setRxOverflow(); - } else { - memory[RAM_RXFIFO + rxfifoWritePos] = data & 0xFF; - rxfifoWritePos = (rxfifoWritePos + 1) & 127; - rxfifoLen++; + } else if(stateMachine == RadioState.RX_FRAME) { + if (overflow) { + /* if the CC2420 RX FIFO is in overflow - it needs a flush before receiving again */ + } else if(rxFIFO.isFull()) { + setRxOverflow(); + } else { + rxFIFO.write(data); - if(rxread == 0) { - rxCrc.setCRC(0); - rxlen = data & 0xff; - rxPacketStart = rxfifoWritePos; - //System.out.println("Starting to get packet at: " + rxfifoWritePos + " len = " + rxlen); - - decodeAddress = false; - if (DEBUG) log("RX: Start frame length " + rxlen); - // FIFO pin goes high after length byte is written to RXFIFO - setFIFO(true); - } else if (rxread < rxlen - 1) { - /* As long as we are not in the length or FCF (CRC) we count CRC */ - rxCrc.addBitrev(data & 0xff); - - if (rxread == 2) { - if (TYPE_DATA_FRAME == (memory[RAM_RXFIFO + rxPacketStart] & FRAME_TYPE)) { - decodeAddress = addressDecode; - ackRequest = (memory[RAM_RXFIFO + rxPacketStart] & ACK_REQUEST) > 0; - destinationAddressMode = (memory[RAM_RXFIFO + ((rxPacketStart + 1) & 127)] >> 2) & 3; - } else { + if (rxread == 0) { + rxCrc.setCRC(0); + rxlen = data & 0xff; + //System.out.println("Starting to get packet at: " + rxfifoWritePos + " len = " + rxlen); decodeAddress = false; - ackRequest = false; - } - } else if (rxread == 3) { - // save data sequence number - dsn = data & 0xff; - } - if (decodeAddress) { - boolean flushPacket = false; - /* here we decode the address !!! */ - if (destinationAddressMode == LONG_ADDRESS && rxread == 8 + 5) { - /* here we need to check that this address is correct compared to the stored address */ - int addrPos = rxPacketStart + 5; // where starts the destination address of the packet!!!?? - for (int i = 0; i < 8; i++) { - if (memory[RAM_IEEEADDR + i] != memory[RAM_RXFIFO + ((addrPos + i) & 127)]) { - flushPacket = true; + if (DEBUG) log("RX: Start frame length " + rxlen); + // FIFO pin goes high after length byte is written to RXFIFO + setFIFO(true); + } else if (rxread < rxlen - 1) { + /* As long as we are not in the length or FCF (CRC) we count CRC */ + rxCrc.addBitrev(data & 0xff); + if (rxread == 1) { + fcf0 = data & 0xff; + } else if (rxread == 2) { + fcf1 = data & 0xff; + if (TYPE_DATA_FRAME == (fcf0 & FRAME_TYPE)) { + decodeAddress = addressDecode; + ackRequest = (fcf0 & ACK_REQUEST) > 0; + destinationAddressMode = (fcf1 >> 2) & 3; + } else { + decodeAddress = false; + ackRequest = false; } - } - decodeAddress = false; - } else if (destinationAddressMode == SHORT_ADDRESS && rxread == 2 + 5){ - /* should check short address */ - int addrPos = rxPacketStart + 5; // where starts the destination address of the packet!!!?? - boolean bc = true; - for (int i = 0; i < 2; i++) { - int addrData = memory[RAM_RXFIFO + ((addrPos + i) & 127)]; - if (bc && addrData != 0xff) { - bc = false; + } else if (rxread == 3) { + // save data sequence number + dsn = data & 0xff; + } else if (decodeAddress) { + boolean flushPacket = false; + /* here we decode the address !!! */ + if (destinationAddressMode == LONG_ADDRESS && rxread == 8 + 5) { + /* here we need to check that this address is correct compared to the stored address */ + flushPacket = !rxFIFO.tailEquals(memory, RAM_IEEEADDR, 8); + decodeAddress = false; + } else if (destinationAddressMode == SHORT_ADDRESS && rxread == 2 + 5){ + /* should check short address */ + flushPacket = !rxFIFO.tailEquals(BC_ADDRESS, 0, 2) && + !rxFIFO.tailEquals(memory, RAM_SHORTADDR, 2); + decodeAddress = false; } - if (memory[RAM_SHORTADDR + i] != addrData) { - flushPacket = true; + if (flushPacket) { + // Immediately jump to SFD Search again... something more??? + /* reset state */ + rxFIFO.restore(); + // System.out.("Packet rejected by autoaddress Reverting to: " + rxfifoWritePos + + // " len:" + rxfifoLen); + setSFD(false); + setFIFO(rxFIFO.length() > 0); + setState(RadioState.RX_SFD_SEARCH); } } - if (bc) flushPacket = false; - decodeAddress = false; } - if (flushPacket) { - // Immediately jump to SFD Search again... something more??? - /* reset state */ - rxfifoLen = rxfifoLen - (rxread + 1); - rxfifoWritePos = (rxPacketStart - 1 + 128) & 127; -// System.out.("Packet rejected by autoaddress Reverting to: " + rxfifoWritePos + -// " len:" + rxfifoLen); - setSFD(false); - setFIFO(rxfifoLen > 0); - setState(RadioState.RX_SFD_SEARCH); - } - } - } - - if(rxread++ == rxlen) { - // In RX mode, FIFOP goes high, if threshold is higher than frame length.... - // Here we check the CRC of the packet! - //System.out.println("Reading from " + ((rxfifoWritePos + 128 - 2) & 127)); - int crc = memory[RAM_RXFIFO + ((rxfifoWritePos + 128 - 2) & 127)] << 8; - crc += memory[RAM_RXFIFO + ((rxfifoWritePos + 128 - 1) & 127)]; - - if (true && crc != rxCrc.getCRCBitrev()) { - System.out.println("CRC not OK: recv:" + Utils.hex16(crc) + " calc: " + Utils.hex16(rxCrc.getCRCBitrev())); - } - // Should take a RSSI value as input or use a set-RSSI value... - memory[RAM_RXFIFO + ((rxfifoWritePos + 128 - 2) & 127)] = (registers[REG_RSSI]) & 0xff; - // Set CRC ok and add a correlation - TODO: fix better correlation value!!! - memory[RAM_RXFIFO + ((rxfifoWritePos + 128 - 1) & 127)] = 37 | - (crc == rxCrc.getCRCBitrev() ? 0x80 : 0); + if(rxread++ == rxlen) { + // In RX mode, FIFOP goes high, if threshold is higher than frame length.... - // FIFOP should not be set if CRC is not ok??? - depends on autoCRC! - /* set FIFOP only if this is the first received packet - e.g. if rxfifoLen is at most rxlen + 1 - * TODO: check what happens when rxfifoLen < rxlen - e.g we have been reading before FIFOP - * fix support for FIFOP threshold */ - if (rxfifoLen <= rxlen + 1) { - setFIFOP(true); - } else { - System.out.println("Did not set FIFOP rxfifoLen: " + rxfifoLen + " rxlen: " + rxlen); - } - setSFD(false); - if (DEBUG) log("RX: Complete: packetStart: " + - rxPacketStart + " rxPStart: " + rxPacketStart); + // Here we check the CRC of the packet! + //System.out.println("Reading from " + ((rxfifoWritePos + 128 - 2) & 127)); + int crc = rxFIFO.get(-2) << 8; + crc += rxFIFO.get(-1); //memory[RAM_RXFIFO + ((rxfifoWritePos + 128 - 1) & 127)]; - /* if either manual ack request (shouldAck) or autoack + ACK_REQ on package do ack! */ - // System.out.println("Autoack " + autoAck + " checkAutoack " + checkAutoack() + " shouldAck " + shouldAck); - if ((autoAck && ackRequest) || shouldAck) { - setState(RadioState.TX_ACK_CALIBRATE); - } else { - setState(RadioState.RX_WAIT); + if (true && crc != rxCrc.getCRCBitrev()) { + System.out.println("CRC not OK: recv:" + Utils.hex16(crc) + " calc: " + Utils.hex16(rxCrc.getCRCBitrev())); + } + // Should take a RSSI value as input or use a set-RSSI value... + rxFIFO.set(-2, registers[REG_RSSI] & 0xff); + rxFIFO.set(-1, 37 | (crc == rxCrc.getCRCBitrev() ? 0x80 : 0)); + // memory[RAM_RXFIFO + ((rxfifoWritePos + 128 - 2) & 127)] = ; + // // Set CRC ok and add a correlation - TODO: fix better correlation value!!! + // memory[RAM_RXFIFO + ((rxfifoWritePos + 128 - 1) & 127)] = 37 | + // (crc == rxCrc.getCRCBitrev() ? 0x80 : 0); + + /* set FIFOP only if this is the first received packet - e.g. if rxfifoLen is at most rxlen + 1 + * TODO: check what happens when rxfifoLen < rxlen - e.g we have been reading before FIFOP + * fix support for FIFOP threshold */ + if (rxFIFO.length() <= rxlen + 1) { + setFIFOP(true); + } else { + System.out.println("Did not set FIFOP rxfifoLen: " + rxFIFO.length() + " rxlen: " + rxlen); + } + setSFD(false); + if (DEBUG) log("RX: Complete: packetStart: " + rxFIFO.stateToString()); + + /* if either manual ack request (shouldAck) or autoack + ACK_REQ on package do ack! */ + // System.out.println("Autoack " + autoAck + " checkAutoack " + checkAutoack() + " shouldAck " + shouldAck); + if ((autoAck && ackRequest) || shouldAck) { + setState(RadioState.TX_ACK_CALIBRATE); + } else { + setState(RadioState.RX_WAIT); + } + } } - } } - } } private void setReg(int address, int data) { @@ -764,47 +752,40 @@ } return; //break; - case READ_RXFIFO: - if(DEBUG) log("RXFIFO READ " + rxfifoReadPos + " => " + - (memory[RAM_RXFIFO + rxfifoReadPos] & 0xFF) + " size: " + rxfifoLen); - source.byteReceived( (memory[RAM_RXFIFO + rxfifoReadPos] & 0xFF) ); + case READ_RXFIFO: { + int fifoData = rxFIFO.read(); + if (DEBUG) log("RXFIFO READ: " + rxFIFO.stateToString()); + source.byteReceived(fifoData); - if (rxfifoLen > 0) { - /* first check and clear FIFOP - since we now have read a byte! */ - // TODO: - // -MT FIFOP is lowered when there are less than IOCFG0:FIFOP_THR bytes in the RXFIFO - // If FIFO_THR is greater than the frame length, FIFOP goes low when the first byte is read out. - // As long as we are in "OVERFLOW" the fifoP is not cleared. - if (fifoP && !overflow) { - if (DEBUG) log("*** FIFOP cleared at: " + rxfifoReadPos + - " lastPacketStartPos: " + rxPacketStart); + /* first check and clear FIFOP - since we now have read a byte! */ + // TODO: + // -MT FIFOP is lowered when there are less than IOCFG0:FIFOP_THR bytes in the RXFIFO + // If FIFO_THR is greater than the frame length, FIFOP goes low when the first byte is read out. + // As long as we are in "OVERFLOW" the fifoP is not cleared. + if (fifoP && !overflow) { + if (DEBUG) log("*** FIFOP cleared at: " + rxFIFO.stateToString()); setFIFOP(false); - } - - /* initiate read of another packet - update some variables to keep track of packet reading... */ - if (rxfifoReadLeft == 0) { - rxfifoReadLeft = (memory[RAM_RXFIFO + rxfifoReadPos] & 0xFF); - System.out.println("Init read of packet - len: " + rxfifoReadLeft + - " fifoLen: " + rxfifoLen + " rxfiforReadPos:" + rxfifoReadPos); - } else if (--rxfifoReadLeft == 0) { - /* check if we have another complete packet in buffer... */ - if (rxfifoLen > 1 && rxfifoLen >= (memory[RAM_RXFIFO + (rxfifoReadPos + 1) & 127] & 0xFF) + 1) { - System.out.println("More in FIFO - FIFOP = 1! plen: " + - (memory[RAM_RXFIFO + (rxfifoReadPos + 1) & 127] & 0xFF) + " fifoLen: " + rxfifoLen + - " fifoPos:" + rxfifoReadPos); - if (!overflow) setFIFOP(true); - } - } - rxfifoReadPos = (rxfifoReadPos + 1) & 127; - rxfifoLen--; - } - // Set the FIFO pin low if there are no more bytes available in the RXFIFO. - if(rxfifoLen == 0) { - if (DEBUG) log("Setting FIFO to low (buffer empty)"); - setFIFO(false); - } - - return; + } + + /* initiate read of another packet - update some variables to keep track of packet reading... */ + if (rxfifoReadLeft == 0) { + rxfifoReadLeft = fifoData; + System.out.println("Init read of packet - len: " + rxfifoReadLeft + + " fifo: " + rxFIFO.stateToString()); + } else if (--rxfifoReadLeft == 0) { + /* check if we have another complete packet in buffer... */ + if (rxFIFO.length() > 0 && rxFIFO.length() > rxFIFO.peek(0)) { + System.out.println("More in FIFO - FIFOP = 1! plen: " + rxFIFO.stateToString()); + if (!overflow) setFIFOP(true); + } + } + // Set the FIFO pin low if there are no more bytes available in the RXFIFO. + if (rxFIFO.length() == 0) { + if (DEBUG) log("Setting FIFO to low (buffer empty)"); + setFIFO(false); + } + } + return; /* avoid returning the status byte */ case WRITE_TXFIFO: if(txfifoFlush) { txCursor = 0; @@ -1081,12 +1062,9 @@ private void flushRX() { if (DEBUG) { - log("Flushing RX len = " + rxfifoLen); + log("Flushing RX len = " + rxFIFO.length()); } - rxfifoReadPos = 0; - rxfifoReadLeft = 0; - rxfifoWritePos = 0; - rxfifoLen = 0; + rxFIFO.reset(); setSFD(false); setFIFOP(false); setFIFO(false); @@ -1163,7 +1141,7 @@ private void setRxOverflow() { - if (DEBUG) log("RXFIFO Overflow! Read Pos: " + rxfifoReadPos + " Write Pos: " + rxfifoWritePos); + if (DEBUG) log("RXFIFO Overflow! Read Pos: " + rxFIFO.stateToString()); setFIFOP(true); setFIFO(false); setSFD(false); @@ -1319,8 +1297,8 @@ "\n RSSI_Valid: " + ((status & STATUS_RSSI_VALID) > 0) + " CCA: " + cca + "\n FIFOP Polarity: " + ((registers[REG_IOCFG0] & FIFOP_POLARITY) == FIFOP_POLARITY) + " FIFOP: " + fifoP + " FIFO: " + currentFIFO + " SFD: " + currentSFD + - "\n Radio State: " + stateMachine + " rxFifoLen: " + rxfifoLen + " rxFifoWritePos: " + - rxfifoWritePos + " rxFifoReadPos: " + rxfifoReadPos + + "\n Radio State: " + stateMachine + + "\n RXFIFO: " + rxFIFO.stateToString() + "\n AutoACK: " + autoAck + " AddrDecode: " + addressDecode + " AutoCRC: " + autoCRC + "\n SPI State: " + state + "\n Channel: " + activeChannel + Added: mspsim/se/sics/mspsim/util/ArrayFIFO.java =================================================================== --- mspsim/se/sics/mspsim/util/ArrayFIFO.java (rev 0) +++ mspsim/se/sics/mspsim/util/ArrayFIFO.java 2010-03-31 15:12:21 UTC (rev 694) @@ -0,0 +1,124 @@ +package se.sics.mspsim.util; + +import se.sics.mspsim.core.EmulationException; + +public class ArrayFIFO { + + private final int memory[]; + private final int start; + private final int size; + + private int readPos = 0; + private int writePos = 0; + private int len = 0; + + private int markWritePos; + + public ArrayFIFO(int[] mem, int start, int size) { + memory = mem; + this.start = start; + this.size = size; + len = 0; + } + + + public boolean write(int data) { + memory[start + writePos++] = data; + if (writePos >= size) { + writePos = 0; + } + len++; + return len == size; + } + + public boolean isEmpty() { + return len == 0; + } + + public boolean isFull() { + return len == size; + } + + /* peek data as if it would be read, but leave it on the fifo */ + public int peek(int index) { + int pos = readPos + index; + if (pos < 0) { + pos += size; + } else if (pos >= size) { + pos -= size; + } + int v = memory[start + pos]; + return v & 0xff; + } + + public int read() { + int v = memory[start + readPos++]; + if (readPos >= size) { + readPos = 0; + } + len--; + if (len < 0) { + throw new EmulationException("Reading from empty FIFO"); + } + return v & 0xff; + } + + /* get data relative the write position (typically negative input values */ + public int get(int index) { + int pos = writePos + index; + if (pos < 0) { + pos += size; + } else if (pos >= size) { + pos -= size; + } + return memory[start + pos] & 0xff; + } + + /* set data relative the write position (typically negative input values */ + public void set(int index, int data) { + int pos = writePos + index; + if (pos < 0) { + pos += size; + } else if (pos >= size) { + pos -= size; + } + memory[start + pos] = data & 0xff; + } + + + public int length() { + return len; + } + + public void reset() { + writePos = 0; + readPos = 0; + len = 0; + } + + /* for marking a write pos - needed for supporting dropping non-matching packets */ + public void mark() { + markWritePos = writePos; + } + + public void restore() { + writePos = markWritePos; + len = writePos - readPos; + if (len < 0) len += size; + } + + + public String stateToString() { + return "FIFO: " + len + " rpos: " + readPos + " wpos: " + writePos; + } + + + public boolean tailEquals(int[] data, int offset, int len) { + for (int i = 0; i < len; i++) { + if ((data[offset + i] & 0xff) != get(i - len)) { + return false; + } + } + return true; + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2010-03-30 21:20:47
|
Revision: 693 http://mspsim.svn.sourceforge.net/mspsim/?rev=693&view=rev Author: joxe Date: 2010-03-30 21:20:41 +0000 (Tue, 30 Mar 2010) Log Message: ----------- changed debug printouts Modified Paths: -------------- mspsim/se/sics/mspsim/chip/CC2420.java Modified: mspsim/se/sics/mspsim/chip/CC2420.java =================================================================== --- mspsim/se/sics/mspsim/chip/CC2420.java 2010-03-30 06:03:15 UTC (rev 692) +++ mspsim/se/sics/mspsim/chip/CC2420.java 2010-03-30 21:20:41 UTC (rev 693) @@ -558,7 +558,7 @@ rxCrc.setCRC(0); rxlen = data & 0xff; rxPacketStart = rxfifoWritePos; - System.out.println("Starting to get packet at: " + rxfifoWritePos + " len = " + rxlen); + //System.out.println("Starting to get packet at: " + rxfifoWritePos + " len = " + rxlen); decodeAddress = false; if (DEBUG) log("RX: Start frame length " + rxlen); @@ -614,8 +614,8 @@ /* reset state */ rxfifoLen = rxfifoLen - (rxread + 1); rxfifoWritePos = (rxPacketStart - 1 + 128) & 127; - System.out.println("Packet rejected by autoaddress Reverting to: " + rxfifoWritePos + - " len:" + rxfifoLen); +// System.out.("Packet rejected by autoaddress Reverting to: " + rxfifoWritePos + +// " len:" + rxfifoLen); setSFD(false); setFIFO(rxfifoLen > 0); setState(RadioState.RX_SFD_SEARCH); @@ -784,13 +784,14 @@ /* initiate read of another packet - update some variables to keep track of packet reading... */ if (rxfifoReadLeft == 0) { rxfifoReadLeft = (memory[RAM_RXFIFO + rxfifoReadPos] & 0xFF); - System.out.println("Initiating read of another packet - len: " + rxfifoReadLeft + - " fifoLen: " + rxfifoLen); + System.out.println("Init read of packet - len: " + rxfifoReadLeft + + " fifoLen: " + rxfifoLen + " rxfiforReadPos:" + rxfifoReadPos); } else if (--rxfifoReadLeft == 0) { /* check if we have another complete packet in buffer... */ if (rxfifoLen > 1 && rxfifoLen >= (memory[RAM_RXFIFO + (rxfifoReadPos + 1) & 127] & 0xFF) + 1) { - System.out.println("Another packet in buffer - Setting FIFOP to true! plen: " + - (memory[RAM_RXFIFO + (rxfifoReadPos + 1) & 127] & 0xFF) + " fifoLen: " + rxfifoLen); + System.out.println("More in FIFO - FIFOP = 1! plen: " + + (memory[RAM_RXFIFO + (rxfifoReadPos + 1) & 127] & 0xFF) + " fifoLen: " + rxfifoLen + + " fifoPos:" + rxfifoReadPos); if (!overflow) setFIFOP(true); } } @@ -895,6 +896,11 @@ if (DEBUG) { log("Strobe RXTX-OFF!!! at " + cpu.cycles); } + if (stateMachine == RadioState.TX_ACK || + stateMachine == RadioState.TX_FRAME || + stateMachine == RadioState.RX_FRAME) { + System.out.println("Warning: turning off RXTX during " + stateMachine); + } setState(RadioState.IDLE); break; case REG_STXON: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2010-03-30 06:03:22
|
Revision: 692 http://mspsim.svn.sourceforge.net/mspsim/?rev=692&view=rev Author: joxe Date: 2010-03-30 06:03:15 +0000 (Tue, 30 Mar 2010) Log Message: ----------- fixed length bug when rejecting packets Modified Paths: -------------- mspsim/se/sics/mspsim/chip/CC2420.java Modified: mspsim/se/sics/mspsim/chip/CC2420.java =================================================================== --- mspsim/se/sics/mspsim/chip/CC2420.java 2010-03-29 20:58:19 UTC (rev 691) +++ mspsim/se/sics/mspsim/chip/CC2420.java 2010-03-30 06:03:15 UTC (rev 692) @@ -612,9 +612,10 @@ if (flushPacket) { // Immediately jump to SFD Search again... something more??? /* reset state */ - rxfifoLen = rxfifoLen - rxread; + rxfifoLen = rxfifoLen - (rxread + 1); rxfifoWritePos = (rxPacketStart - 1 + 128) & 127; - System.out.println("Packet rejected by autoaddress Reverting to: " + rxfifoWritePos); + System.out.println("Packet rejected by autoaddress Reverting to: " + rxfifoWritePos + + " len:" + rxfifoLen); setSFD(false); setFIFO(rxfifoLen > 0); setState(RadioState.RX_SFD_SEARCH); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2010-03-29 20:58:25
|
Revision: 691 http://mspsim.svn.sourceforge.net/mspsim/?rev=691&view=rev Author: joxe Date: 2010-03-29 20:58:19 +0000 (Mon, 29 Mar 2010) Log Message: ----------- removed debug printout for acksend Modified Paths: -------------- mspsim/se/sics/mspsim/chip/CC2420.java Modified: mspsim/se/sics/mspsim/chip/CC2420.java =================================================================== --- mspsim/se/sics/mspsim/chip/CC2420.java 2010-03-29 20:43:13 UTC (rev 690) +++ mspsim/se/sics/mspsim/chip/CC2420.java 2010-03-29 20:58:19 UTC (rev 691) @@ -655,8 +655,6 @@ /* if either manual ack request (shouldAck) or autoack + ACK_REQ on package do ack! */ // System.out.println("Autoack " + autoAck + " checkAutoack " + checkAutoack() + " shouldAck " + shouldAck); if ((autoAck && ackRequest) || shouldAck) { - System.out.println("Doing Autoack on lastPacket at " + rxPacketStart + " len: " + rxlen - + " DSN:" + dsn + " =?= " + memory[RAM_RXFIFO + ((rxPacketStart + 2) & 127)]); setState(RadioState.TX_ACK_CALIBRATE); } else { setState(RadioState.RX_WAIT); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2010-03-29 20:43:19
|
Revision: 690 http://mspsim.svn.sourceforge.net/mspsim/?rev=690&view=rev Author: joxe Date: 2010-03-29 20:43:13 +0000 (Mon, 29 Mar 2010) Log Message: ----------- removed unused variable Modified Paths: -------------- mspsim/se/sics/mspsim/chip/CC2420.java Modified: mspsim/se/sics/mspsim/chip/CC2420.java =================================================================== --- mspsim/se/sics/mspsim/chip/CC2420.java 2010-03-29 20:30:39 UTC (rev 689) +++ mspsim/se/sics/mspsim/chip/CC2420.java 2010-03-29 20:43:13 UTC (rev 690) @@ -250,7 +250,6 @@ private int rxfifoLen; private int rxlen; private int rxread; - private int lastPacketStart; private int zeroSymbols; private boolean ramRead = false; @@ -578,7 +577,6 @@ decodeAddress = false; ackRequest = false; } - dsn = data & 0xff; } else if (rxread == 3) { // save data sequence number dsn = data & 0xff; @@ -652,13 +650,13 @@ } setSFD(false); if (DEBUG) log("RX: Complete: packetStart: " + - lastPacketStart + " rxPStart: " + rxPacketStart); + rxPacketStart + " rxPStart: " + rxPacketStart); /* if either manual ack request (shouldAck) or autoack + ACK_REQ on package do ack! */ // System.out.println("Autoack " + autoAck + " checkAutoack " + checkAutoack() + " shouldAck " + shouldAck); if ((autoAck && ackRequest) || shouldAck) { - System.out.println("Doing Autoack on lastPacket at " + lastPacketStart + " len: " + rxlen - + " DSN:" + dsn + " =?= " + memory[RAM_RXFIFO + ((lastPacketStart + 2) & 127)]); + System.out.println("Doing Autoack on lastPacket at " + rxPacketStart + " len: " + rxlen + + " DSN:" + dsn + " =?= " + memory[RAM_RXFIFO + ((rxPacketStart + 2) & 127)]); setState(RadioState.TX_ACK_CALIBRATE); } else { setState(RadioState.RX_WAIT); @@ -780,7 +778,7 @@ // As long as we are in "OVERFLOW" the fifoP is not cleared. if (fifoP && !overflow) { if (DEBUG) log("*** FIFOP cleared at: " + rxfifoReadPos + - " lastPacketStartPos: " + lastPacketStart); + " lastPacketStartPos: " + rxPacketStart); setFIFOP(false); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2010-03-29 20:30:45
|
Revision: 689 http://mspsim.svn.sourceforge.net/mspsim/?rev=689&view=rev Author: joxe Date: 2010-03-29 20:30:39 +0000 (Mon, 29 Mar 2010) Log Message: ----------- fixed bug in printout Modified Paths: -------------- mspsim/se/sics/mspsim/chip/CC2420.java Modified: mspsim/se/sics/mspsim/chip/CC2420.java =================================================================== --- mspsim/se/sics/mspsim/chip/CC2420.java 2010-03-29 20:27:47 UTC (rev 688) +++ mspsim/se/sics/mspsim/chip/CC2420.java 2010-03-29 20:30:39 UTC (rev 689) @@ -658,7 +658,7 @@ // System.out.println("Autoack " + autoAck + " checkAutoack " + checkAutoack() + " shouldAck " + shouldAck); if ((autoAck && ackRequest) || shouldAck) { System.out.println("Doing Autoack on lastPacket at " + lastPacketStart + " len: " + rxlen - + " DSN:" + dsn + " =?= " + memory[(RAM_RXFIFO + lastPacketStart + 2) & 127]); + + " DSN:" + dsn + " =?= " + memory[RAM_RXFIFO + ((lastPacketStart + 2) & 127)]); setState(RadioState.TX_ACK_CALIBRATE); } else { setState(RadioState.RX_WAIT); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2010-03-29 20:27:53
|
Revision: 688 http://mspsim.svn.sourceforge.net/mspsim/?rev=688&view=rev Author: joxe Date: 2010-03-29 20:27:47 +0000 (Mon, 29 Mar 2010) Log Message: ----------- Modified Paths: -------------- mspsim/se/sics/mspsim/chip/CC2420.java Modified: mspsim/se/sics/mspsim/chip/CC2420.java =================================================================== --- mspsim/se/sics/mspsim/chip/CC2420.java 2010-03-29 19:33:15 UTC (rev 687) +++ mspsim/se/sics/mspsim/chip/CC2420.java 2010-03-29 20:27:47 UTC (rev 688) @@ -578,6 +578,7 @@ decodeAddress = false; ackRequest = false; } + dsn = data & 0xff; } else if (rxread == 3) { // save data sequence number dsn = data & 0xff; @@ -656,8 +657,8 @@ /* if either manual ack request (shouldAck) or autoack + ACK_REQ on package do ack! */ // System.out.println("Autoack " + autoAck + " checkAutoack " + checkAutoack() + " shouldAck " + shouldAck); if ((autoAck && ackRequest) || shouldAck) { - System.out.println("Doing Autoack on lastPacket at " + lastPacketStart + " len: " + rxlen); - ackBuf[ACK_SEQPOS] = memory[RAM_RXFIFO + lastPacketStart + 2]; /* find the seq no!!! */ + System.out.println("Doing Autoack on lastPacket at " + lastPacketStart + " len: " + rxlen + + " DSN:" + dsn + " =?= " + memory[(RAM_RXFIFO + lastPacketStart + 2) & 127]); setState(RadioState.TX_ACK_CALIBRATE); } else { setState(RadioState.RX_WAIT); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |