From: Stephan Baerwolf Date: Wed, 14 Nov 2012 00:04:02 +0000 (+0100) Subject: optimize and extend updater.c X-Git-Tag: v0.9~5 X-Git-Url: http://git.linex4red.de/pub/USBaspLoader.git/commitdiff_plain/8c91580014f306b07bb6d972ad75970ae87a68d0 optimize and extend updater.c Signed-off-by: Stephan Baerwolf --- diff --git a/updater/updater.c b/updater/updater.c index 559ce66..b1760fa 100644 --- a/updater/updater.c +++ b/updater/updater.c @@ -2,13 +2,19 @@ #define F_CPU 1000000UL /* 1 Mhz-Takt; hier richtigen Wert eintragen */ #endif -// 1) Test the "changed" - feature by debugging a LED-PIN to high (PB0?) -// 2) Test the "needs_erase" - feature by debugging a LED-PIN to high (PB1?) -// #define mypgmdebug 1 - #include "../firmware/spminterface.h" #include "usbasploader.h" +// activate updaters full set of features +#ifndef CONFIG_UPDATER_REDUCEWRITES + #define CONFIG_UPDATER_REDUCEWRITES +#endif + +#ifndef CONFIG_UPDATER_CLEANMEMCLEAR + #define CONFIG_UPDATER_CLEANMEMCLEAR +#endif + + #include #include #include @@ -146,6 +152,7 @@ size_t mypgm_readpage(const mypgm_addr_t byteaddress,const void* buffer, const s } #endif +#ifdef CONFIG_UPDATER_REDUCEWRITES size_t mypgm_WRITEpage(const mypgm_addr_t byteaddress,const void* buffer, const size_t bufferbytesize, mypgm_spminterface spmfunc) { size_t result = (bufferbytesize < SPM_PAGESIZE)?bufferbytesize:SPM_PAGESIZE; size_t pagesize = result >> 1; @@ -181,23 +188,11 @@ size_t mypgm_WRITEpage(const mypgm_addr_t byteaddress,const void* buffer, const } if (changed) { -#ifdef mypgmdebug - DDRB |= (1<> 1; + uint16_t *pagedata = (void*)buffer; + mypgm_addr_t pageaddr_bakup = byteaddress - (byteaddress % SPM_PAGESIZE); + mypgm_addr_t pageaddr = pageaddr_bakup; + + size_t i; + + //do a page-erase, ATTANTION: flash only can be erased a limited number of times ! + spmfunc(pageaddr_bakup, 0x3, 0); + + // from now on, the page is assumed empty !! (hopefully our code is located somewhere else!) + // now, fill the tempoary buffer + // ATTANTION: see comment on "do_spm" ! + pageaddr = pageaddr_bakup; + for (i=0;isizeof(buffer))?sizeof(buffer):(SIZEOF_new_firmware-i)); mypgm_WRITEpage(NEW_BOOTLOADER_ADDRESS+i, buffer, sizeof(buffer), temp_do_spm); - #ifdef mypgmdebug - PORTD ^= (1< (NEW_SPM_ADDRESS+TEMP_SPM_BLKSIZE)) break; } // C // continue writeing the new_firmware after "NEW_SPM_ADDRESS+TEMP_SPM_BLKSIZE" this time use the "new_do_spm" for (;isizeof(buffer))?sizeof(buffer):(SIZEOF_new_firmware-i)); mypgm_WRITEpage(NEW_BOOTLOADER_ADDRESS+i, buffer, sizeof(buffer), new_do_spm); - #ifdef mypgmdebug - PORTD ^= (1<