4 # Copyright (C) 2003, MLB Associates
7 # This program is used to read a Motorola S-record file and
8 # download it using the GDB protocol.
10 import os, string, sys, time
12 trace = open("/tmp/download.trace", "w")
19 for i in range(0,200):
23 # Compute the checksum for a string
26 # sys.stderr.write("cksum %s\n" % str)
30 sum = sum + ord(cs[:1])
35 # Send a string via the GDB protocol. Note: this routine
36 # computes and adds the checksum before starting.
39 str = str + "#%02x" % cksum(str)
40 # trace.write("ready to send: %s\n" % str)
51 trace.write("~ACK: %c\n" % c)
52 trace.write("sent: %s\n" % str)
60 # trace.write("ACK: %c, res: %s\n" % (c, res))
62 # trace.write("res = %s\n" % res)
66 cs = cs + os.read(0, 1)
67 sum = string.atoi(cs, 16)
70 trace.write("RES = %s, sum: %x/%x\n" % (res, csum, sum))
71 trace.write("sent: %s\n" % str)
79 # Process a stream of S-records, supplied by 'readline()'
81 def download(readline):
89 raise ("Invalid input:" + line)
91 len = string.atoi(line[2:4],16)
92 an = ord(line[1]) - ord('1') + 2
94 addr = string.atoi(line[4:ae],16)
95 #print "len = %d, addr = 0x%x " % (len, addr)
98 out = "$M%x,%x:" % (addr, len)
99 for i in range(0,len):
100 val = string.atoi(line[:2],16)
101 #print "val = 0x%x" % val
103 out = out + "%02x" % val
104 if (addr - last_addr) >= 0x400:
106 sys.stderr.write("0x%x\n" % addr)
108 elif line[1] in "789":
109 len = string.atoi(line[2:4],16)
113 addr = string.atoi(line[4:12],16)
114 #print "len = %d, addr = 0x%x " % (len, addr)
117 out = "$P40=%08x" % addr
118 sys.stderr.write("Set PC = 0x%x\n" % addr)
120 # This command starts the program
123 if __name__ == '__main__': # testing
125 if len(sys.argv) > 1: download(open(sys.argv[1]).readline)
126 else: download(sys.stdin.readline)