Subversion Repositories freemyipod

Rev

Rev 427 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 427 Rev 524
Line 21... Line 21...
21
#
21
#
22
#
22
#
23
 
23
 
24
import struct
24
import struct
25
 
25
 
26
def configure(binary, **args):
26
def encode(addr, option):
27
    start = binary.index("emBIboot", 0, 512)
-
 
28
    version = struct.unpack("<I", binary[start + 8 : start + 12])[0]
-
 
29
    if version != 0: raise ValueError("Unknown boot configuration data version")
-
 
30
    (tryfile, filename, fileflags, filedest,
-
 
31
     tryflash, flashname, flashflags, flashdest,
-
 
32
     trymmap, mmapaddr, mmapsize, mmapflags, mmapdest) \
-
 
33
     = struct.unpack("<I256sIII8sIIIIIII", binary[start + 12 : start + 320])
-
 
34
    if "reset" in args and args["reset"]:
27
    if option == None: return ""
35
	tryfile = 0
-
 
36
	filename = "\0" * 256
28
    addr = addr + 16
37
	fileflags = 0
-
 
38
	filedest = 0
-
 
39
	tryflash = 0
-
 
40
	flashname = "\0" * 8
29
    data1 = encode(addr, option[2])
41
	flashflags = 0
30
    if len(data1) == 0: addr1 = 0
42
	flashdest = 0
31
    else: addr1 = addr
43
	trymmap = 0
-
 
44
	mmapaddr = 0
32
    addr = addr + addr1
45
	mmapsize = 0
-
 
46
	mmapflags = 0
-
 
47
	mmapdest = 0
-
 
48
    if "tryfile" in args: tryfile = 1 if args["tryfile"] else 0
33
    data2 = encode(addr, option[3])
49
    if "filename" in args: filename = args["filename"].ljust(256, "\0")
-
 
50
    if "filecomp" in args:
34
    if len(data2) == 0: addr2 = 0
51
        if args["filecomp"]: fileflags = fileflags | 1
-
 
52
        else: fileflags = fileflags & ~1
35
    else: addr2 = addr
53
    if "filecopy" in args:
36
    addr = addr + addr2
54
        if args["filecopy"]: fileflags = fileflags | 2
37
    if type(option[1]).__name__ == "str":
55
        else: fileflags = fileflags & ~2
38
        data = option[1] + '\0'
56
    if "filedest" in args: filedest = args["filedest"]
39
        data = data.ljust((len(data) + 3) & ~3, '\0')
57
    if "tryflash" in args: tryflash = 1 if args["tryflash"] else 0
-
 
58
    if "flashname" in args: flashname = args["flashname"].ljust(8)
-
 
59
    if "flashcomp" in args:
40
    else:
60
        if args["flashcomp"]: flashflags = flashflags | 1
-
 
61
        else: flashflags = flashflags & ~1
41
        data = ""
62
    if "flashcopy" in args:
42
        addr = option[1]
63
        if args["flashcopy"]: flashflags = flashflags | 2
43
    return struct.pack("<IIII", addr1, addr2, option[0], addr) + data1 + data2 + data
-
 
44
    
-
 
45
 
64
        else: flashflags = flashflags & ~2
46
def configure(binary, options):
65
    if "flashdest" in args: flashdest = args["flashdest"]
47
    fileaddr =  binary.index("emCOboot")
66
    if "trymmap" in args: trymmap = 1 if args["trymmap"] else 0
-
 
67
    if "mmapaddr" in args: mmapaddr = args["mmapaddr"]
48
    version = struct.unpack("<I", binary[fileaddr + 8 : fileaddr + 12])[0]
68
    if "mmapsize" in args: mmapsize = args["mmapsize"]
49
    if version != 1: raise ValueError("Unknown boot configuration data version")
69
    if "mmapcomp" in args:
-
 
70
        if args["mmapcomp"]: mmapflags = mmapflags | 1
50
    memaddr = struct.unpack("<I", binary[fileaddr + 12 : fileaddr + 16])[0]
71
        else: mmapflags = mmapflags & ~1
51
    data = encode(memaddr + 24, options)
72
    if "mmapcopy" in args:
52
    if len(data) == 0: addr = 0
73
        if args["mmapcopy"]: mmapflags = mmapflags | 2
-
 
74
        else: mmapflags = mmapflags & ~2
53
    else: addr = memaddr + 24
75
    if "mmapdest" in args: mmapdest = args["mmapdest"]
-
 
76
    data = struct.pack("<I256sIII8sIIIIIII", tryfile, filename, fileflags, filedest,
-
 
77
                                             tryflash, flashname, flashflags, flashdest,
-
 
78
                                             trymmap, mmapaddr, mmapsize, mmapflags, mmapdest)
-
 
79
    return binary[:start + 12] + data + binary[start + 320:]
54
    return binary[:fileaddr + 16] + struct.pack("<II", len(data) + 24, addr) + data
-
 
55
    
80
56