From 166ecd9b06d0fd98ad69379f5b0d91c755adff2b Mon Sep 17 00:00:00 2001 From: travisutk Date: Thu, 26 Nov 2009 07:32:24 +0000 Subject: [PATCH] AVR support for setting lock bits. git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@244 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- client/GoodFETAVR.py | 5 +++++ client/goodfet.avr | 4 +++- firmware/apps/avr/avr.c | 11 ++++++++++- firmware/include/avr.h | 5 +++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/client/GoodFETAVR.py b/client/GoodFETAVR.py index 2f06722..ee5b180 100644 --- a/client/GoodFETAVR.py +++ b/client/GoodFETAVR.py @@ -74,6 +74,11 @@ class GoodFETAVR(GoodFET): """Read the target's lockbits.""" self.writecmd(self.AVRAPP,0x82,0,None); return ord(self.data[0]); + def setlockbits(self,bits=0x00): + """Read the target's lockbits.""" + self.writecmd(self.AVRAPP,0x92,1,[bits]); + return self.lockbits(); + def eeprompeek(self, adr): """Read a byte of the target's EEPROM.""" self.writecmd(self.AVRAPP,0x81 ,2, diff --git a/client/goodfet.avr b/client/goodfet.avr index 953e1b4..8692dcf 100755 --- a/client/goodfet.avr +++ b/client/goodfet.avr @@ -10,7 +10,7 @@ if(len(sys.argv)==1): print "Usage: %s verb [objects]\n" % sys.argv[0]; print "%s test" % sys.argv[0]; print "%s info" % sys.argv[0]; - print "%s lockbits" % sys.argv[0]; + print "%s lockbits [value]" % 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]; @@ -56,6 +56,8 @@ if(sys.argv[1]=="erase"): client.erase(); if(sys.argv[1]=="lockbits"): print "Lockbits are 0x%02x" % client.lockbits(); + if(len(sys.argv)>2): + print "Lockbits set 0x%02x" % client.setlockbits(int(sys.argv[2],16)); #if(sys.argv[1]=="lock"): #if(sys.argv[1]=="unlock"): diff --git a/firmware/apps/avr/avr.c b/firmware/apps/avr/avr.c index c9d0b94..a4ba6fd 100644 --- a/firmware/apps/avr/avr.c +++ b/firmware/apps/avr/avr.c @@ -104,6 +104,12 @@ void avr_erase(){ u8 avr_lockbits(){ return avrexchange(0x58, 0, 0, 0); } +//! Write lock bits. +void avr_setlock(u8 bits){ + debugstr("Setting lock bits."); + avrexchange(0xAC,0xE0,0x00, + bits); +} //! Read a byte of EEPROM. u8 avr_peekeeprom(u16 adr){ @@ -162,7 +168,10 @@ void avrhandle(unsigned char app, cmddata[0]=avr_lockbits(); txdata(app,verb,1); break; - + case AVR_POKELOCK: + avr_setlock(cmddata[0]); + txdata(app,verb,0); + break; case AVR_POKEEEPROM: avr_pokeeeprom(cmddataword[0], cmddata[2]); //no break here. diff --git a/firmware/include/avr.h b/firmware/include/avr.h index cd19a38..930ab99 100644 --- a/firmware/include/avr.h +++ b/firmware/include/avr.h @@ -19,6 +19,9 @@ u8 avr_sig(u8 i); void avr_erase(); //! Read lock bits. u8 avr_lockbits(); +//! Write lock bits. +void avr_setlock(u8 bits); + //! Read a byte of Flash u8 avr_peekflash(u16 adr); @@ -44,6 +47,8 @@ u8 avr_isready(); #define AVR_POKEEEPROM 0x91 //! Read lock bits. #define AVR_PEEKLOCK 0x82 +//! Write lock its. +#define AVR_POKELOCK 0x92 //! Read signature. #define AVR_PEEKSIG 0x83 //! Read fuse bits. -- 2.20.1