X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=tools%2Ftinyos%2Fmisc%2Ftos-storage-stm25p.in;fp=tools%2Ftinyos%2Fmisc%2Ftos-storage-stm25p.in;h=c26793be078dd0d3429101d86cf787fa8b905f99;hb=1ba974b83d19fc41bf80acd52726f36f7f1df297;hp=0000000000000000000000000000000000000000;hpb=4db69a460ad5d18d33cbf5c3ef74ad584d9e2886;p=tinyos-2.x.git diff --git a/tools/tinyos/misc/tos-storage-stm25p.in b/tools/tinyos/misc/tos-storage-stm25p.in new file mode 100644 index 00000000..c26793be --- /dev/null +++ b/tools/tinyos/misc/tos-storage-stm25p.in @@ -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 +# +# $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"