📄 download.py
字号:
#! /usr/bin/env python## Copyright (C) 2003, MLB Associates## This program is used to read a Motorola S-record file and# download it using the GDB protocol.import os, string, sys, timetrace = open("/tmp/download.trace", "w")## Use up some time#def spin(): j = 0 for i in range(0,200): j = j + 1## Compute the checksum for a string#def cksum(str):# sys.stderr.write("cksum %s\n" % str) sum = 0 cs = str[1:] while cs: sum = sum + ord(cs[:1]) cs = cs[1:] return sum & 0xFF## Send a string via the GDB protocol. Note: this routine# computes and adds the checksum before starting.#def send(str): str = str + "#%02x" % cksum(str)# trace.write("ready to send: %s\n" % str)# trace.flush() while 1: s = str while s: os.write(1, s[:1]) spin() # time.sleep(0.001) s = s[1:] c = os.read(0, 1) if c <> '+': trace.write("~ACK: %c\n" % c) trace.write("sent: %s\n" % str) trace.flush() continue res = '' while 1: c = os.read(0, 1) if c == '#': break res = res + c # trace.write("ACK: %c, res: %s\n" % (c, res)) # trace.flush() # trace.write("res = %s\n" % res) # trace.flush() csum = cksum(res) cs = os.read(0, 1) cs = cs + os.read(0, 1) sum = string.atoi(cs, 16) if csum <> sum: os.write(1, '-') trace.write("RES = %s, sum: %x/%x\n" % (res, csum, sum)) trace.write("sent: %s\n" % str) trace.flush() continue os.write(1, '+') trace.flush() return## Process a stream of S-records, supplied by 'readline()'#def download(readline): # send("$Hc-1") # send("$Hg0") last_addr = 0 while 1: line = readline() if not line: break if line[0] <> 'S': raise ("Invalid input:" + line) if line[1] in "123": len = string.atoi(line[2:4],16) an = ord(line[1]) - ord('1') + 2 ae = 4 + (an*2) addr = string.atoi(line[4:ae],16) #print "len = %d, addr = 0x%x " % (len, addr) len = len - (an+1) line = line[ae:] out = "$M%x,%x:" % (addr, len) for i in range(0,len): val = string.atoi(line[:2],16) #print "val = 0x%x" % val line = line[2:] out = out + "%02x" % val if (addr - last_addr) >= 0x400: last_addr = addr sys.stderr.write("0x%x\n" % addr) send(out) elif line[1] in "789": len = string.atoi(line[2:4],16) eos = 10 if line[1] == '7': eos = 12 addr = string.atoi(line[4:12],16) #print "len = %d, addr = 0x%x " % (len, addr) len = len - 4 line = line[eos:] out = "$P40=%08x" % addr sys.stderr.write("Set PC = 0x%x\n" % addr) send(out) # This command starts the program send("$c#63") if __name__ == '__main__': # testing import sys if len(sys.argv) > 1: download(open(sys.argv[1]).readline) else: download(sys.stdin.readline)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -