From: travisutk Date: Wed, 7 Oct 2009 12:03:53 +0000 (+0000) Subject: Reading and writing of EEPROM works on AVR! X-Git-Url: http://git.rot13.org/?p=goodfet;a=commitdiff_plain;h=c84fe49161b904593101f7fa21aee65d54e03987 Reading and writing of EEPROM works on AVR! git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@192 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- diff --git a/client/GoodFETAVR.py b/client/GoodFETAVR.py index 97724ca..46efed7 100644 --- a/client/GoodFETAVR.py +++ b/client/GoodFETAVR.py @@ -59,10 +59,29 @@ class GoodFETAVR(GoodFET): def start(self): """Start the connection.""" self.writecmd(self.AVRAPP,0x20,0,None); - + def erase(self): + """Erase the target chip.""" + self.writecmd(self.AVRAPP,0xF0,0,None); + def lockbits(self): + """Read the target's lockbits.""" + self.writecmd(self.AVRAPP,0x82,0,None); + return ord(self.data[0]); + def eeprompeek(self, adr): + """Read a byte of the target's EEPROM.""" + self.writecmd(self.AVRAPP,0x81 ,2, + [ (adr&0xFF), (adr>>8)] + );#little-endian address + return ord(self.data[0]); + def eeprompoke(self, adr, val): + """Write a byte of the target's EEPROM.""" + self.writecmd(self.AVRAPP,0x91 ,3, + [ (adr&0xFF), (adr>>8), val] + );#little-endian address + return ord(self.data[0]); + def identstr(self): """Return an identifying string.""" - self.writecmd(self.AVRAPP,0x83,0,None); + self.writecmd(self.AVRAPP,0x83,0, None); vendor=self.AVRVendors.get(ord(self.data[0])); deviceid=(ord(self.data[1])<<8)+ord(self.data[2]); device=self.AVRDevices.get(deviceid); diff --git a/client/goodfet.avr b/client/goodfet.avr index ca16880..a23e5ca 100644 --- a/client/goodfet.avr +++ b/client/goodfet.avr @@ -9,10 +9,12 @@ from intelhex import IntelHex16bit, IntelHex; if(len(sys.argv)==1): print "Usage: %s verb [objects]\n" % sys.argv[0]; print "%s test" % sys.argv[0]; - print "%s dump $foo.hex [0x$start 0x$stop]" % sys.argv[0]; + print "%s info" % sys.argv[0]; + print "%s lockbits" % sys.argv[0]; + #print "%s dump $foo.hex [0x$start 0x$stop]" % sys.argv[0]; 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 flash $foo.hex [0x$start 0x$stop]" % sys.argv[0]; + #print "%s verify $foo.hex [0x$start 0x$stop]" % sys.argv[0]; sys.exit(); #Initialize FET and set baud rate @@ -24,4 +26,32 @@ client.start(); #print "setup" if(sys.argv[1]=="info"): - print "Identifies as %s" % client.identstr(); + print "Identifies as %s" % client.identstr(); +if(sys.argv[1]=="erase"): + print "Erasing %s" % client.identstr(); + client.erase(); +if(sys.argv[1]=="lockbits"): + print "Lockbits are 0x%02x" % client.lockbits(); + +if(sys.argv[1]=="peekeeprom"): + 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.eeprompeek(start)); + start=start+1; + +if(sys.argv[1]=="pokeeeprom"): + start=0x0000; + val=0x00; + if(len(sys.argv)>2): + start=int(sys.argv[2],16); + if(len(sys.argv)>3): + val=int(sys.argv[3],16); + client.eeprompoke(start,val); + + diff --git a/firmware/apps/avr/avr.c b/firmware/apps/avr/avr.c index 707ab9e..c659034 100644 --- a/firmware/apps/avr/avr.c +++ b/firmware/apps/avr/avr.c @@ -78,6 +78,11 @@ void avr_prgen(){ avrexchange(0xAC, 0x53, 0, 0); } +//! Is the AVR ready or busy? +u8 avr_isready(){ + return avrexchange(0xF0, 0, 0, 0); +} + //! Read AVR device code. u8 avr_sig(u8 i){ return avrexchange(0x30, //Read signature byte @@ -87,18 +92,40 @@ u8 avr_sig(u8 i){ ); } +//! Erase an AVR device +void avr_erase(){ + avrexchange(0xAC, 0x80, 0, 0); +} + +//! Read lock bits. +u8 avr_lockbits(){ + return avrexchange(0x58, 0, 0, 0); +} + +//! Read a byte of EEPROM. +u8 avr_peekeeprom(u16 adr){ + return avrexchange(0xA0, adr>>8, adr&0xFF, 0); +} +//! Read a byte of EEPROM. +u8 avr_pokeeeprom(u16 adr, u8 val){ + return avrexchange(0xC0, adr>>8, adr&0xFF, val); +} + //! Handles an AVR command. void avrhandle(unsigned char app, unsigned char verb, unsigned long len){ unsigned long i; + static u8 connected=0; + if(!avr_isready() && connected) + debugstr("AVR is not yet ready."); switch(verb){ case READ: case WRITE: for(i=0;i