| Index: embios/trunk/tools/libembiosbootcfg.py | 
| — | — | @@ -0,0 +1,79 @@ | 
|  | 2 | +#!/usr/bin/env python | 
|  | 3 | +# | 
|  | 4 | +# | 
|  | 5 | +#    Copyright 2010 TheSeven | 
|  | 6 | +# | 
|  | 7 | +# | 
|  | 8 | +#    This file is part of emBIOS. | 
|  | 9 | +# | 
|  | 10 | +#    emBIOS is free software: you can redistribute it and/or | 
|  | 11 | +#    modify it under the terms of the GNU General Public License as | 
|  | 12 | +#    published by the Free Software Foundation, either version 2 of the | 
|  | 13 | +#    License, or (at your option) any later version. | 
|  | 14 | +# | 
|  | 15 | +#    emBIOS is distributed in the hope that it will be useful, | 
|  | 16 | +#    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 17 | +#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 
|  | 18 | +#    See the GNU General Public License for more details. | 
|  | 19 | +# | 
|  | 20 | +#    You should have received a copy of the GNU General Public License | 
|  | 21 | +#    along with emBIOS.  If not, see <http://www.gnu.org/licenses/>. | 
|  | 22 | +# | 
|  | 23 | +# | 
|  | 24 | + | 
|  | 25 | +import struct | 
|  | 26 | + | 
|  | 27 | +def configure(binary, **args): | 
|  | 28 | +    start = binary.index("emBIboot", 0, 512) | 
|  | 29 | +    version = struct.unpack("<I", binary[start + 8 : start + 12])[0] | 
|  | 30 | +    if version != 0: raise ValueError("Unknown boot configuration data version") | 
|  | 31 | +    (tryfile, filename, fileflags, filedest, | 
|  | 32 | +     tryflash, flashname, flashflags, flashdest, | 
|  | 33 | +     trymmap, mmapaddr, mmapsize, mmapflags, mmapdest) \ | 
|  | 34 | +     = struct.unpack("<I256sIII8sIIIIIII", binary[start + 12 : start + 320]) | 
|  | 35 | +    if "reset" in args and args["reset"]: | 
|  | 36 | +	tryfile = 0 | 
|  | 37 | +	filename = "\0" * 256 | 
|  | 38 | +	fileflags = 0 | 
|  | 39 | +	filedest = 0 | 
|  | 40 | +	tryflash = 0 | 
|  | 41 | +	flashname = "\0" * 8 | 
|  | 42 | +	flashflags = 0 | 
|  | 43 | +	flashdest = 0 | 
|  | 44 | +	trymmap = 0 | 
|  | 45 | +	mmapaddr = 0 | 
|  | 46 | +	mmapsize = 0 | 
|  | 47 | +	mmapflags = 0 | 
|  | 48 | +	mmapdest = 0 | 
|  | 49 | +    if "tryfile" in args: tryfile = 1 if args["tryfile"] else 0 | 
|  | 50 | +    if "filename" in args: filename = args["filename"].ljust(256, "\0") | 
|  | 51 | +    if "filecomp" in args: | 
|  | 52 | +        if args["filecomp"]: fileflags = fileflags | 2 | 
|  | 53 | +        else: fileflags = fileflags & ~2 | 
|  | 54 | +    if "filecopy" in args: | 
|  | 55 | +        if args["filecopy"]: fileflags = fileflags | 1 | 
|  | 56 | +        else: fileflags = fileflags & ~1 | 
|  | 57 | +    if "filedest" in args: filedest = args["filedest"] | 
|  | 58 | +    if "tryflash" in args: tryflash = 1 if args["tryflash"] else 0 | 
|  | 59 | +    if "flashname" in args: flashname = args["flashname"].ljust(8) | 
|  | 60 | +    if "flashcomp" in args: | 
|  | 61 | +        if args["flashcomp"]: flashflags = flashflags | 2 | 
|  | 62 | +        else: flashflags = flashflags & ~2 | 
|  | 63 | +    if "flashcopy" in args: | 
|  | 64 | +        if args["flashcopy"]: flashflags = flashflags | 1 | 
|  | 65 | +        else: flashflags = flashflags & ~1 | 
|  | 66 | +    if "flashdest" in args: flashdest = args["flashdest"] | 
|  | 67 | +    if "trymmap" in args: trymmap = 1 if args["trymmap"] else 0 | 
|  | 68 | +    if "mmapaddr" in args: mmapaddr = args["mmapaddr"] | 
|  | 69 | +    if "mmapsize" in args: mmapsize = args["mmapsize"] | 
|  | 70 | +    if "mmapcomp" in args: | 
|  | 71 | +        if args["mmapcomp"]: mmapflags = mmapflags | 2 | 
|  | 72 | +        else: mmapflags = mmapflags & ~2 | 
|  | 73 | +    if "mmapcopy" in args: | 
|  | 74 | +        if args["mmapcopy"]: mmapflags = mmapflags | 1 | 
|  | 75 | +        else: mmapflags = mmapflags & ~1 | 
|  | 76 | +    if "mmapdest" in args: mmapdest = args["mmapdest"] | 
|  | 77 | +    data = struct.pack("<I256sIII8sIIIIIII", tryfile, filename, fileflags, filedest, | 
|  | 78 | +                                             tryflash, flashname, flashflags, flashdest, | 
|  | 79 | +                                             trymmap, mmapaddr, mmapsize, mmapflags, mmapdest) | 
|  | 80 | +    return binary[:start + 12] + data + binary[start + 320:] | 
| Index: embios/trunk/tools/embiosbootcfg.py | 
| — | — | @@ -0,0 +1,98 @@ | 
|  | 2 | +#!/usr/bin/env python | 
|  | 3 | +# | 
|  | 4 | +# | 
|  | 5 | +#    Copyright 2010 TheSeven | 
|  | 6 | +# | 
|  | 7 | +# | 
|  | 8 | +#    This file is part of emBIOS. | 
|  | 9 | +# | 
|  | 10 | +#    emBIOS is free software: you can redistribute it and/or | 
|  | 11 | +#    modify it under the terms of the GNU General Public License as | 
|  | 12 | +#    published by the Free Software Foundation, either version 2 of the | 
|  | 13 | +#    License, or (at your option) any later version. | 
|  | 14 | +# | 
|  | 15 | +#    emBIOS is distributed in the hope that it will be useful, | 
|  | 16 | +#    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 17 | +#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 
|  | 18 | +#    See the GNU General Public License for more details. | 
|  | 19 | +# | 
|  | 20 | +#    You should have received a copy of the GNU General Public License | 
|  | 21 | +#    along with emBIOS.  If not, see <http://www.gnu.org/licenses/>. | 
|  | 22 | +# | 
|  | 23 | +# | 
|  | 24 | + | 
|  | 25 | +import sys | 
|  | 26 | +import libembiosbootcfg | 
|  | 27 | +from optparse import * | 
|  | 28 | + | 
|  | 29 | +parser = OptionParser("usage: %prog [options] <infile> <outfile>") | 
|  | 30 | +filegroup = OptionGroup(parser, "Booting from a file", | 
|  | 31 | +                        "Use these options to configure emBIOS to try " | 
|  | 32 | +		        "booting from a file on a FAT32 partition") | 
|  | 33 | +filegroup.add_option("--file", help = "Boot from FILE") | 
|  | 34 | +filegroup.add_option("--file-compressed", action = "store_true", default = False, | 
|  | 35 | +                     help = "Specify this if FILE is compressed") | 
|  | 36 | +filegroup.add_option("--file-run-from", type = "int", metavar = "ADDR", | 
|  | 37 | +                     help = "Make sure FILE is executed from memory address ADDR") | 
|  | 38 | +parser.add_option_group(filegroup) | 
|  | 39 | +flashgroup = OptionGroup(parser, "Booting from a boot flash image", | 
|  | 40 | +                         "Use these options to configure emBIOS to try " | 
|  | 41 | +                         "booting from an image located in the boot flash") | 
|  | 42 | +flashgroup.add_option("--flash", metavar = "NAME", help = "Boot from flash image NAME") | 
|  | 43 | +flashgroup.add_option("--flash-compressed", action = "store_true", default = False, | 
|  | 44 | +                      help = "Specify this if the image is compressed") | 
|  | 45 | +flashgroup.add_option("--flash-run-from", type = "int", metavar = "ADDR", | 
|  | 46 | +                      help = "Make sure the image is executed from memory address ADDR") | 
|  | 47 | +parser.add_option_group(flashgroup) | 
|  | 48 | +mmapgroup = OptionGroup(parser, "Booting from a memory region", | 
|  | 49 | +                        "Use these options to configure emBIOS to try " | 
|  | 50 | +                        "booting from a memory location, such as an embedded " | 
|  | 51 | +			"app or an app located on a memory-mapped flash") | 
|  | 52 | +mmapgroup.add_option("--mmap-addr", metavar = "ADDR", help = "Boot from memory location ADDR") | 
|  | 53 | +mmapgroup.add_option("--mmap-size", metavar = "SIZE", | 
|  | 54 | +                     help = "Specifies the size of the executable at ADDR in bytes") | 
|  | 55 | +mmapgroup.add_option("--mmap-compressed", action = "store_true", default = False, | 
|  | 56 | +                     help = "Specify this if the executable is compressed") | 
|  | 57 | +mmapgroup.add_option("--mmap-run-from", type = "int", metavar = "COPYADDR", | 
|  | 58 | +                     help = "Copy the executable to COPYADDR before executing it") | 
|  | 59 | +parser.add_option_group(mmapgroup) | 
|  | 60 | +(options, args) = parser.parse_args() | 
|  | 61 | +if len(args) != 2: parser.error("incorrect number of arguments") | 
|  | 62 | + | 
|  | 63 | +if (options.mmap_addr and not options.mmap_size) or \ | 
|  | 64 | +   (not options.mmap_addr and options.mmap_size): | 
|  | 65 | +    parser.error("either none or both of --mmap-addr and --map-size must be specified") | 
|  | 66 | + | 
|  | 67 | +file = open(args[0], "rb") | 
|  | 68 | +data = file.read() | 
|  | 69 | +file.close() | 
|  | 70 | + | 
|  | 71 | +config = {"reset": True} | 
|  | 72 | +if options.file: | 
|  | 73 | +    config["tryfile"] = True | 
|  | 74 | +    config["filename"] = options.file | 
|  | 75 | +    if options.file_compressed: config["filecomp"] = True | 
|  | 76 | +    if options.file_run_from: | 
|  | 77 | +        config["filecopy"] = True | 
|  | 78 | +        config["filedest"] = options.file_run_from | 
|  | 79 | +if options.flash: | 
|  | 80 | +    config["tryflash"] = True | 
|  | 81 | +    config["flashname"] = options.flash | 
|  | 82 | +    if options.flash_compressed: config["flashcomp"] = True | 
|  | 83 | +    if options.flash_run_from: | 
|  | 84 | +        config["flashcopy"] = True | 
|  | 85 | +        config["flashdest"] = options.flash_run_from | 
|  | 86 | +if options.mmap_addr: | 
|  | 87 | +    config["trymmap"] = True | 
|  | 88 | +    config["mmapaddr"] = options.mmap_addr | 
|  | 89 | +    config["mmapsize"] = options.mmap_size | 
|  | 90 | +    if options.mmap_compressed: config["mmapcomp"] = True | 
|  | 91 | +    if options.mmap_run_from: | 
|  | 92 | +        config["mmapcopy"] = True | 
|  | 93 | +        config["mmapdest"] = options.mmap_run_from | 
|  | 94 | + | 
|  | 95 | +data = libembiosbootcfg.configure(data, **config) | 
|  | 96 | + | 
|  | 97 | +file = open(args[1], "wb") | 
|  | 98 | +file.write(data) | 
|  | 99 | +file.close() |