From: travisutk Date: Wed, 11 Nov 2009 15:21:38 +0000 (+0000) Subject: Support for dumping AVR Flash. X-Git-Url: http://git.rot13.org/?p=goodfet;a=commitdiff_plain;h=43d125b5bca16f0941450bee6ba7bd94ab41dc72;hp=8596546102fe3fbcb776ca8d47c1a913cac7636d Support for dumping AVR Flash. (Dear God is the addressing weird!) git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@228 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- diff --git a/client/GoodFET.py b/client/GoodFET.py index cd9499e..da652c3 100755 --- a/client/GoodFET.py +++ b/client/GoodFET.py @@ -58,6 +58,8 @@ class GoodFET: self.serialport.write(chr(app)); self.serialport.write(chr(verb)); + #if data!=None: + # count=len(data); #Initial count ignored. #print "TX %02x %02x" % (app,verb); @@ -72,6 +74,7 @@ class GoodFET: #print "Converting %02x at %i" % (data[i],i) data[i]=chr(data[i]); outstr=''.join(data); + #outstr=data; self.serialport.write(outstr); if not self.besilent: self.readcmd(); diff --git a/client/GoodFETAVR.py b/client/GoodFETAVR.py index 46efed7..52f82ba 100644 --- a/client/GoodFETAVR.py +++ b/client/GoodFETAVR.py @@ -23,6 +23,7 @@ class GoodFETAVR(GoodFET): 0x9005: "tiny12", 0x9006: "tiny15", 0x9007: "tiny13", + 0x9108: "tiny25", 0x930B: "tiny85", 0x9001: "S1200", @@ -33,16 +34,22 @@ class GoodFETAVR(GoodFET): 0x9103: "S2343", 0x9201: "S4414", - 0x9203: "S4433", + 0x9203: "S4433", 0x9202: "S4434", 0x9301: "S8515", 0x9303: "S8535", 0x9305: "mega83", + 0x930a: "mega88", 0x9701: "mega103", 0x9401: "mega161", 0x9402: "mega163", + 0x9406: "mega168", + + 0x950f: "mega328", + 0x950d: "mega325", + 0x9508: "mega32" }; def setup(self): @@ -72,6 +79,19 @@ class GoodFETAVR(GoodFET): [ (adr&0xFF), (adr>>8)] );#little-endian address return ord(self.data[0]); + def flashpeek(self, adr): + """Read a byte of the target's EEPROM.""" + self.writecmd(self.AVRAPP,0x02 ,2, + [ (adr&0xFF), (adr>>8)] + );#little-endian address + return ord(self.data[0]); + def flashpeekblock(self, adr): + """Read a byte of the target's EEPROM.""" + self.writecmd(self.AVRAPP,0x02 ,4, + [ (adr&0xFF), (adr>>8) &0xFF, 0x80, 0x00] + ); + return self.data; + def eeprompoke(self, adr, val): """Write a byte of the target's EEPROM.""" self.writecmd(self.AVRAPP,0x91 ,3, diff --git a/client/goodfet.avr b/client/goodfet.avr index a23e5ca..b9eefcb 100755 --- a/client/goodfet.avr +++ b/client/goodfet.avr @@ -15,6 +15,7 @@ if(len(sys.argv)==1): print "%s erase" % sys.argv[0]; #print "%s flash $foo.hex [0x$start 0x$stop]" % sys.argv[0]; #print "%s verify $foo.hex [0x$start 0x$stop]" % sys.argv[0]; + print "%s peekeeprom 0x$start [0x$stop]" % sys.argv[0]; sys.exit(); #Initialize FET and set baud rate @@ -23,7 +24,6 @@ client.serInit() #Connect to target client.start(); -#print "setup" if(sys.argv[1]=="info"): print "Identifies as %s" % client.identstr(); @@ -33,6 +33,28 @@ if(sys.argv[1]=="erase"): if(sys.argv[1]=="lockbits"): print "Lockbits are 0x%02x" % client.lockbits(); +if(sys.argv[1]=="dump"): + f = sys.argv[2]; + start=0x0000; + stop=0xFFFF; + if(len(sys.argv)>3): + start=int(sys.argv[3],16); + if(len(sys.argv)>4): + stop=int(sys.argv[4],16); + + print "Dumping from %04x to %04x as %s." % (start,stop,f); + #h = IntelHex16bit(None); + h = IntelHex(None); + i=start; + while i<=stop: + data=client.flashpeekblock(i); + print "Dumped %06x."%i; + for j in data: + if i<=stop: h[i]=ord(j); + i+=1; + h.write_hex_file(f); + + if(sys.argv[1]=="peekeeprom"): start=0x0000; if(len(sys.argv)>2): @@ -44,6 +66,17 @@ if(sys.argv[1]=="peekeeprom"): while start<=stop: print "%06x: %02x" % (start,client.eeprompeek(start)); start=start+1; +if(sys.argv[1]=="peekflash"): + start=0x0000; + if(len(sys.argv)>2): + start=int(sys.argv[2],16); + stop=start; + if(len(sys.argv)>3): + stop=int(sys.argv[3],16); + print "Peeking from %06x to %06x." % (start,stop); + while start<=stop: + print "%06x: %02x" % (start,client.flashpeek(start)); + start=start+1; if(sys.argv[1]=="pokeeeprom"): start=0x0000; diff --git a/firmware/apps/avr/avr.c b/firmware/apps/avr/avr.c index fdef1aa..a8d9d34 100644 --- a/firmware/apps/avr/avr.c +++ b/firmware/apps/avr/avr.c @@ -111,6 +111,14 @@ u8 avr_pokeeeprom(u16 adr, u8 val){ return avrexchange(0xC0, adr>>8, adr&0xFF, val); } +//! Read a byte of Flash +u8 avr_peekflash(u16 adr){ + u16 a=adr>>1; + if(adr&1) //high byte + return avrexchange(0x28,a>>8,a&0xff,0); + else //low byte + return avrexchange(0x20,a>>8,a&0xff,0); +} //! Handles an AVR command. @@ -118,6 +126,7 @@ void avrhandle(unsigned char app, unsigned char verb, unsigned long len){ unsigned long i; + unsigned int at; static u8 connected=0; if(!avr_isready() && connected) @@ -159,6 +168,22 @@ void avrhandle(unsigned char app, txdata(app,verb,1); break; case PEEK: + //cmddata[0]=avr_peekflash(cmddataword[0]); + //txdata(app,verb,1); + at=cmddataword[0]; + + //Fetch large blocks for bulk fetches, + //small blocks for individual peeks. + if(len>2){ + len=(cmddataword[1]);//always even. + }else{ + len=1; + } + txhead(app,verb,len); + for(i=0;i