From: thequux Date: Tue, 16 Nov 2010 20:40:39 +0000 (+0000) Subject: Added basic AVR flashing support, and an associated avrdude patch X-Git-Url: http://git.rot13.org/?p=goodfet;a=commitdiff_plain;h=3e4992b4d109f361b42abdda403471860edfeabf;ds=sidebyside Added basic AVR flashing support, and an associated avrdude patch git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@763 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- diff --git a/firmware/apps/avr/avr.c b/firmware/apps/avr/avr.c index 9531563..0cc4c0d 100644 --- a/firmware/apps/avr/avr.c +++ b/firmware/apps/avr/avr.c @@ -130,6 +130,16 @@ u8 avr_peekflash(u16 adr){ return avrexchange(0x20,a>>8,a&0xff,0); } +void avr_bulk_load(u16 start, u16 len, u8 *data) { + u16 adr; + for (adr = 0; adr < len; adr++) { + u16 a = adr + start; + avrexchange((adr & 1) ? 0x48 : 0x40, + a >> 9, + (a >> 1) & 0xff, + data[adr]); + } +} //! Handles an AVR command. void avrhandle(unsigned char app, @@ -158,6 +168,9 @@ void avrhandle(unsigned char app, avrconnect(); txdata(app,verb,0); break;//Used to fall through here. + case STOP: + SETSS; + txdata(app, verb, 0); case AVR_PEEKSIG: for(i=0;i<4;i++) cmddata[i]=avr_sig(i); @@ -182,6 +195,16 @@ void avrhandle(unsigned char app, cmddata[0]=avr_peekeeprom(cmddataword[0]); txdata(app,verb,1); break; + case AVR_BULKLOAD: + if (len < 3) { + debugstr("Length too short"); + txdata(app, NOK, 0); + } else { + at = cmddataword[0]; + avr_bulk_load(at, len - 2, cmddata + 2); + txdata(app, verb, 0); + } + break; case PEEK: //cmddata[0]=avr_peekflash(cmddataword[0]); //txdata(app,verb,1); diff --git a/firmware/include/avr.h b/firmware/include/avr.h index c56d86c..f0e8614 100644 --- a/firmware/include/avr.h +++ b/firmware/include/avr.h @@ -55,3 +55,5 @@ u8 avr_isready(); #define AVR_READFUSES 0x84 //! Read calibration byte. #define AVR_READCAL 0x85 +//! Bulk load data +#define AVR_BULKLOAD 0x86