X-Git-Url: http://git.linex4red.de/pub/USBaspLoader.git/blobdiff_plain/5b0272d9af73a164da192d796fc33ec736b93f0a..refs/heads/testing:/updater/updater.c diff --git a/updater/updater.c b/updater/updater.c index 6b9cde3..479df80 100644 --- a/updater/updater.c +++ b/updater/updater.c @@ -2,14 +2,21 @@ #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 "../misc/iofixes.h" #include "../firmware/spminterface.h" -#include "firmware.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 @@ -20,7 +27,15 @@ #include #include +#define updater_pagefillcode ((1< 65535 +# define FULLCORRECTFLASHADDRESS(addr) (((mypgm_addr_t)(addr)) | (((mypgm_addr_t)FLASHADDRESS) & ((mypgm_addr_t)0xffff0000))) +# define mymemcpy_PF mymemcpy_PF_far +void *mymemcpy_PF_far (void *dest, mypgm_addr_t src, size_t n) { + uint8_t *pagedata = (void*)dest; + mypgm_addr_t pageaddr = src; + size_t i; + + for (i=0;i> 1; @@ -156,7 +191,11 @@ size_t mypgm_WRITEpage(const mypgm_addr_t byteaddress,const void* buffer, const // just check, if page needs a rewrite or an erase... for (i=0;i 65535) + deeword=pgm_read_word_far(pageaddr); +#else deeword=pgm_read_word(pageaddr); +#endif if (deeword != pagedata[i]) changed=1; @@ -178,35 +217,23 @@ 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, updater_pageerasecode, 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;i 65535) + crcval = update_crc_32(crcval, pgm_read_byte_far(FULLCORRECTFLASHADDRESS(&new_firmware[i]))); +#else + crcval = update_crc_32(crcval, pgm_read_byte(FULLCORRECTFLASHADDRESS(&new_firmware[i]))); #endif + } + crcval ^= D_32; - + // allow to change the firmware + if (crcval == ((uint32_t)UPDATECRC32)) { +#endif // check if firmware would change... buffer[0]=0; for (i=0;i 65535) + a=pgm_read_word_far(FULLCORRECTFLASHADDRESS(&new_firmware[i])); + b=pgm_read_word_far(NEW_BOOTLOADER_ADDRESS+i); +#else + a=pgm_read_word(FULLCORRECTFLASHADDRESS(&new_firmware[i])); b=pgm_read_word(NEW_BOOTLOADER_ADDRESS+i); +#endif if (a!=b) { buffer[0]=1; break; @@ -251,67 +325,45 @@ int main(void) // need to change the firmware... if (buffer[0]) { - // A // copy the current "bootloader__do_spm" to tempoary position via std. "bootloader__do_spm" for (i=0;isizeof(buffer))?sizeof(buffer):(SIZEOF_new_firmware-i)); +#endif + mymemcpy_PF((void*)buffer, (uint_farptr_t)(FULLCORRECTFLASHADDRESS(&new_firmware[i])), ((SIZEOF_new_firmware-i)>sizeof(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)); +#endif + mymemcpy_PF((void*)buffer, (uint_farptr_t)(FULLCORRECTFLASHADDRESS(&new_firmware[i])), ((SIZEOF_new_firmware-i)>sizeof(buffer))?sizeof(buffer):(SIZEOF_new_firmware-i)); mypgm_WRITEpage(NEW_BOOTLOADER_ADDRESS+i, buffer, sizeof(buffer), new_do_spm); - #ifdef mypgmdebug - PORTD ^= (1<