]> oss.titaniummirror.com Git - tinyos-2.x.git/blobdiff - tools/tinyos/misc/tos-storage-stm25p.in
Merge devel code into the trunk.
[tinyos-2.x.git] / tools / tinyos / misc / tos-storage-stm25p.in
diff --git a/tools/tinyos/misc/tos-storage-stm25p.in b/tools/tinyos/misc/tos-storage-stm25p.in
new file mode 100644 (file)
index 0000000..c26793b
--- /dev/null
@@ -0,0 +1,141 @@
+#!@pathpython@
+# -*- python -*-
+# Copyright (c) 2005-2006 Arched Rock Corporation
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# - Redistributions of source code must retain the above copyright
+#   notice, this list of conditions and the following disclaimer.
+# - 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.
+# - Neither the name of the Arched Rock Corporation 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 COPYRIGHT HOLDERS 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
+# ARCHED ROCK OR ITS 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
+#
+# @author Jonathan Hui <jhui@archedrock.com>
+#
+# $Revision$
+# $Date$
+#
+                                  
+from re import match
+from sys import *
+from xml.dom import minidom
+
+NUM_SECTORS = 16
+SECTOR_SIZE = 65536
+
+volumes = {}
+
+volumeNames = []
+volumeSizes = []
+volumeOffsets = []
+freeSectors = NUM_SECTORS*[ True ]
+
+def error_exit( s ):
+    stderr.write( "ERROR: " + s + "\n" )
+    exit( 2 )
+
+try:
+    dom = minidom.parse( stdin )
+except xml.parsers.expat.ExpatError:
+    error_exit( "input invalid" )
+
+# extract information
+for volume in dom.documentElement.getElementsByTagName( "volume" ):
+    name = volume.getAttribute( "name" )
+    size = volume.getAttribute( "size" )
+    base = volume.getAttribute( "base" )
+    if name == "":
+        error_exit( "volume has no name" )
+    elif not match( "^[a-zA-Z0-9_]+$", name ):
+        error_exit( "volume has invalid name '%s'" % name )
+    elif volumes.has_key( name ):
+        error_exit( "duplicate volume definition '%s'" % name )
+    else:
+        volumes[ name ] = "blah"
+    
+    if size == "":
+        error_exit( "volume '%s' has no size" % name )
+    try:
+        size = int( size )
+    except ValueError:
+        error_exit( "volume '%s' has invalid size" % name )
+    if base != "":
+        try:
+            base = int( base )
+        except ValueError:
+            error_exit( "volume '%s' has invalid base" % name )
+    if ( size & ( SECTOR_SIZE - 1 ) ) != 0:
+        error_exit( "size of volume '%s' is not a multiple of %d" % \
+                    ( name, SECTOR_SIZE ) )
+    if base != "" and ( base & ( SECTOR_SIZE - 1 ) ) != 0:
+        error_exit( "base of volume '%s' is not a multiple of %d" % \
+                    ( name, SECTOR_SIZE ) )
+
+    volumeNames.append( "VOLUME_" + name )
+    volumeSizes.append( size / SECTOR_SIZE )
+    if base == "":
+        volumeOffsets.append( -1 )
+    else:
+        base = base / SECTOR_SIZE
+        volumeOffsets.append( base )
+        for i in range( size ):
+            freeSectors[ i + base ] = False
+
+# allocate with first fit policy
+for i in range( len( volumeOffsets ) ):
+    size = volumeSizes[ i ]
+    if volumeOffsets[ i ] == -1:
+        for j in range( NUM_SECTORS ):
+            if freeSectors[ j ]:
+                size -= 1
+                if size == 0:
+                    volumeOffsets[ i ] = j - ( volumeSizes[ i ] - 1 )
+                    break
+            else:
+                size = volumeSizes[ i ]
+        if volumeOffsets[ i ] == -1:
+            raise "Unable to satisfy allocation request."
+        else:
+            for j in range( volumeSizes[ i ] ):
+                freeSectors[ volumeOffsets[ i ] + j ] = False
+
+# output C file
+
+print "#ifndef __STORAGE_VOLUME_H__"
+print "#define __STORAGE_VOLUME_H__"
+print ""
+print "#include \"Stm25p.h\""
+print ""
+
+for i in range( len( volumeNames ) ):
+    print "#define %s %d" % ( volumeNames[ i ], i )
+print ""
+        
+print "static const stm25p_volume_info_t STM25P_VMAP[ %d ] = {" % \
+      len( volumeNames )
+for i in range( len( volumeNames ) ):
+    print "    { base : %d, size : %d }," % \
+          ( volumeOffsets[ i ], volumeSizes[ i ] )
+print "};"
+
+print ""
+print "#endif"