Fix Updater-bug, when linked to position in flash space
(FLASHADDRESS > 64K - SIZEOF_new_firmware - "a little more")
void* always is 16Bit - for real addresses take FLASADDRESS
into account in order to find upper address bit:
(http://www.mikrocontroller.net/topic/298174#
3186932)
Signed-off-by: Stephan Baerwolf <stephan.baerwolf@tu-ilmenau.de>
typedef void (*mypgm_spminterface)(const uint32_t flash_byteaddress, const uint8_t spmcrval, const uint16_t dataword);
#if FLASHEND > 65535
typedef void (*mypgm_spminterface)(const uint32_t flash_byteaddress, const uint8_t spmcrval, const uint16_t dataword);
#if FLASHEND > 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;
# define mymemcpy_PF mymemcpy_PF_far
void *mymemcpy_PF_far (void *dest, mypgm_addr_t src, size_t n) {
uint8_t *pagedata = (void*)dest;
+# define FULLCORRECTFLASHADDRESS(addr) (addr)
# define mymemcpy_PF memcpy_PF
#endif
# define mymemcpy_PF memcpy_PF
#endif
for (i=0;i<SIZEOF_new_firmware;i+=2) {
uint16_t a, b;
#if (FLASHEND > 65535)
for (i=0;i<SIZEOF_new_firmware;i+=2) {
uint16_t a, b;
#if (FLASHEND > 65535)
- a=pgm_read_word_far((void*)&new_firmware[i]);
+ a=pgm_read_word_far(FULLCORRECTFLASHADDRESS(&new_firmware[i]));
b=pgm_read_word_far(NEW_BOOTLOADER_ADDRESS+i);
#else
b=pgm_read_word_far(NEW_BOOTLOADER_ADDRESS+i);
#else
- a=pgm_read_word((void*)&new_firmware[i]);
+ a=pgm_read_word(FULLCORRECTFLASHADDRESS(&new_firmware[i]));
b=pgm_read_word(NEW_BOOTLOADER_ADDRESS+i);
#endif
if (a!=b) {
b=pgm_read_word(NEW_BOOTLOADER_ADDRESS+i);
#endif
if (a!=b) {
#ifdef CONFIG_UPDATER_CLEANMEMCLEAR
memset((void*)buffer, 0xff, sizeof(buffer));
#endif
#ifdef CONFIG_UPDATER_CLEANMEMCLEAR
memset((void*)buffer, 0xff, sizeof(buffer));
#endif
- mymemcpy_PF((void*)buffer, (uint_farptr_t)((void*)&new_firmware[i]), ((SIZEOF_new_firmware-i)>sizeof(buffer))?sizeof(buffer):(SIZEOF_new_firmware-i));
+ 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);
mypgm_WRITEpage(NEW_BOOTLOADER_ADDRESS+i, buffer, sizeof(buffer), temp_do_spm);
#ifdef CONFIG_UPDATER_CLEANMEMCLEAR
memset((void*)buffer, 0xff, sizeof(buffer));
#endif
#ifdef CONFIG_UPDATER_CLEANMEMCLEAR
memset((void*)buffer, 0xff, sizeof(buffer));
#endif
- mymemcpy_PF((void*)buffer, (uint_farptr_t)((void*)&new_firmware[i]), ((SIZEOF_new_firmware-i)>sizeof(buffer))?sizeof(buffer):(SIZEOF_new_firmware-i));
+ 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);
mypgm_WRITEpage(NEW_BOOTLOADER_ADDRESS+i, buffer, sizeof(buffer), new_do_spm);