2 # -*- coding: iso-8859-15 -*-
7 from optparse import OptionParser
8 from time import sleep, time
21 def __init__(self, addr):
25 if not self.identify():
26 raise "Bootloader not running"
28 def read_mem(self, addr, num):
29 self.run_cmd(CMD_READ, addr, num)
32 def erase(self, addr):
33 self.run_cmd(CMD_ERASE)
36 self.run_cmd(CMD_ERASE_ALL)
38 def __compare_memarea(self, addr, data):
39 mem_cmp = self.read_mem(addr, 64)
41 print "Expected:", data.encode("hex")
42 print "Got: ", mem_cmp.encode("hex")
43 raise("Compare mismatch at 0x%x" % addr)
46 def __program_memarea(self, addr, data):
47 self.run_cmd(CMD_WRITE, addr, 64, data)
49 def compare(self, filename):
50 return self.__process_hex(filename, self.__compare_memarea)
52 def program(self, filename):
53 return self.__process_hex(filename, self.__program_memarea)
55 def __process_hex(self, filename, handle):
60 f = open(filename, "r")
64 raise("Bad line start character")
65 hex = line[1:].replace("\r\n", "")
66 data = hex.decode("hex")
72 raise("Checksum error")
73 addr, typ, data, chksum = struct.unpack(">HB%ssB" % num, data[1:])
75 if typ == 0: # Data Record
77 if next_addr is not None:
80 buf_addr = addr-len(buf)
82 if len(buf) >= PAGESIZE:
84 # do the first as last one
85 lFirstRow = (buf_addr, buf[:PAGESIZE])
87 print "Addr 0x%x" % buf_addr
88 handle(buf_addr, buf[:PAGESIZE])
90 elif typ == 3: # Start Segment Address Record
91 self.boot_addr = int(data.encode("hex"), 16)
92 elif typ == 1: # End of File Record
93 print "Addr (rest) 0x%x" % buf_addr
95 diff = PAGESIZE-len(buf)
96 buf+=chr(0xff)*diff # fill with 0xff
97 handle(buf_addr, buf[:PAGESIZE])
98 if lFirstRow: # was first
99 buf_addr = lFirstRow[0]
101 print "Addr (First) 0x%x" % buf_addr
102 handle(buf_addr, buf)
104 raise("Unknown type %d" % typ)
107 print "Byte count:", count
110 def jump(self, addr):
111 self.run_cmd(CMD_JUMP)
121 def load(self, filename):
128 self.program(filename)
129 print "Time: %.1fs" % (time() - t1)
132 self.compare(filename)
133 print "Time: %.1fs" % (time() - t1)
135 self.jump(self.boot_addr)
138 dev = i2c(self.i2c_addr)
143 dev = i2c(self.i2c_addr)
148 def run_cmd(self, cmd, addr=0x0, num=0, data=""):
150 s1 = struct.pack("<BLB%ds" % (length), cmd, addr, num, data)
152 s2 = struct.pack("B", 0xff)
156 self.run_cmd(CMD_INFO)
158 return s == "Bootloader"
160 def to_bootloader(addr):
162 s = struct.pack("B", 0xff)
166 if __name__ == "__main__":
167 usage = "usage: %prog [options] addr [ihex]"
168 parser = OptionParser(usage=usage)
169 parser.add_option("-b", "--start-bootloader", action="store_true", dest="bToBoot", default=False, help="Start Bootloader")
171 (options, args) = parser.parse_args()
173 addr = int(args[0], 16)
178 loader = bootloader(addr)