From f8da0ea20667f3fd7e4d5fc134d07122d840948a Mon Sep 17 00:00:00 2001 From: Niclas Finne Date: Thu, 31 May 2012 01:54:55 +0200 Subject: [PATCH] Updated API for external flash for storage API in MSPSim --- .../interfaces/CoojaExternalFlash.java | 88 +++++++++++++++++++ .../cooja/mspmote/interfaces/CoojaM25P80.java | 49 +++++++++++ 2 files changed, 137 insertions(+) create mode 100644 tools/cooja/apps/mspsim/src/se/sics/cooja/mspmote/interfaces/CoojaExternalFlash.java diff --git a/tools/cooja/apps/mspsim/src/se/sics/cooja/mspmote/interfaces/CoojaExternalFlash.java b/tools/cooja/apps/mspsim/src/se/sics/cooja/mspmote/interfaces/CoojaExternalFlash.java new file mode 100644 index 000000000..0fba43af7 --- /dev/null +++ b/tools/cooja/apps/mspsim/src/se/sics/cooja/mspmote/interfaces/CoojaExternalFlash.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2012, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +package se.sics.cooja.mspmote.interfaces; + +import java.io.IOException; +import se.sics.coffee.CoffeeConfiguration; +import se.sics.coffee.CoffeeImage; +import se.sics.mspsim.chip.MemoryStorage; + +public class CoojaExternalFlash extends MemoryStorage implements CoffeeImage { + + private final String target; + private CoffeeConfiguration coffeeConfiguration; + + public CoojaExternalFlash(String target) { + this.target = target; + } + + /** + * XXX Coffee specific: uses start offset + * @see se.sics.coffee.CoffeeImage#erase(int, int) + */ + public void erase(int size, int offset) throws IOException { + byte[] buffer = new byte[size]; + write(getConfiguration().startOffset + offset, buffer); + } + + /** + * XXX Coffee specific: uses start offset + * @see se.sics.coffee.CoffeeImage#getConfiguration() + */ + public CoffeeConfiguration getConfiguration() { + if (coffeeConfiguration == null) { + try { + coffeeConfiguration = new CoffeeConfiguration(target + ".properties"); + } catch (Exception e) { + // Failed to retrieve coffee configuration + throw new IllegalStateException("no Coffee configuration available for platform " + target); + } + } + return coffeeConfiguration; + } + + /** + * XXX Coffee specific: uses start offset + * @see se.sics.coffee.CoffeeImage#read(byte[], int, int) + */ + public void read(byte[] bytes, int size, int offset) throws IOException { + read(getConfiguration().startOffset + offset, bytes, 0, size); + } + + /** + * XXX Coffee specific: uses start offset + * @see se.sics.coffee.CoffeeImage#write(byte[], int, int) + */ + public void write(byte[] bytes, int size, int offset) throws IOException { + read(getConfiguration().startOffset + offset, bytes, 0, size); + } + +} diff --git a/tools/cooja/apps/mspsim/src/se/sics/cooja/mspmote/interfaces/CoojaM25P80.java b/tools/cooja/apps/mspsim/src/se/sics/cooja/mspmote/interfaces/CoojaM25P80.java index 11edda76d..afc1b6a17 100644 --- a/tools/cooja/apps/mspsim/src/se/sics/cooja/mspmote/interfaces/CoojaM25P80.java +++ b/tools/cooja/apps/mspsim/src/se/sics/cooja/mspmote/interfaces/CoojaM25P80.java @@ -36,6 +36,7 @@ import java.util.Arrays; import se.sics.coffee.CoffeeConfiguration; import se.sics.coffee.CoffeeImage; import se.sics.mspsim.chip.M25P80; +import se.sics.mspsim.chip.Storage; import se.sics.mspsim.core.MSP430Core; public class CoojaM25P80 extends M25P80 implements CoffeeImage { @@ -43,6 +44,53 @@ public class CoojaM25P80 extends M25P80 implements CoffeeImage { public static int SIZE = 1024*1024; private byte[] data = new byte[SIZE]; private long pos; + private Storage storage = new Storage() { + + @Override + public int read(long pos, byte[] buffer) throws IOException { + System.arraycopy(data, (int) pos, buffer, 0, buffer.length); + return buffer.length; + } + + @Override + public int read(long pos, byte[] buffer, int offset, int len) + throws IOException { + System.arraycopy(data, (int) pos, buffer, offset, len); + return len; + } + + @Override + public void write(long pos, byte[] buffer) throws IOException { + System.arraycopy(buffer, 0, data, (int) pos, buffer.length); + } + + @Override + public void write(long pos, byte[] buffer, int offset, int len) + throws IOException { + System.arraycopy(buffer, offset, data, (int) pos, len); + } + + @Override + public long getMaxSize() { + return SIZE; + } + + @Override + public void setMaxSize(long size) { + // Ignore + } + + @Override + public void close() { + // Nothing to close + } + + @Override + public String info() { + return CoojaM25P80.class.getName(); + } + + }; private static CoffeeConfiguration COFFEE_CONF; static { @@ -57,6 +105,7 @@ public class CoojaM25P80 extends M25P80 implements CoffeeImage { public CoojaM25P80(MSP430Core cpu) { super(cpu); pos = 0; + setStorage(storage); } public void seek(long pos) throws IOException {