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);
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
#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);
+
+
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
);
}
+//! 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<len;i++)
- cmddata[i]=spitrans8(cmddata[i]);
+ cmddata[i]=avrtrans8(cmddata[i]);
txdata(app,verb,len);
break;
case SETUP:
cmddata[i]=avr_sig(i);
txdata(app,verb,4);
break;
+ case AVR_ERASE:
+ avr_erase();
+ txdata(app,verb,0);
+ break;
+ case AVR_PEEKLOCK:
+ cmddata[0]=avr_lockbits();
+ txdata(app,verb,1);
+ break;
+
+ case AVR_POKEEEPROM:
+ avr_pokeeeprom(cmddataword[0], cmddata[2]);
+ //no break here.
+ case AVR_PEEKEEPROM:
+ cmddata[0]=avr_peekeeprom(cmddataword[0]);
+ txdata(app,verb,1);
+ break;
case PEEK:
case POKE:
default:
void avr_prgen();
//! Read AVR device code.
u8 avr_sig(u8 i);
+//! Erase an AVR device
+void avr_erase();
+//! Read lock bits.
+u8 avr_lockbits();
+
+
+//! Read a byte of EEPROM.
+u8 avr_peekeeprom(u16 adr);
+//! Read a byte of EEPROM.
+u8 avr_pokeeeprom(u16 adr, u8 val);
+//! Is the AVR ready or busy?
+u8 avr_isready();
//Command codes.
//! Performa chip erase.
#define AVR_PEEKPGM 0x80
//! Read EEPROM
#define AVR_PEEKEEPROM 0x81
+//! Write EEPROM
+#define AVR_POKEEEPROM 0x91
//! Read lock bits.
#define AVR_PEEKLOCK 0x82
//! Read signature.