diff --git a/src/avrcache.c b/src/avrcache.c index c7bfae3a..da40c7a7 100644 --- a/src/avrcache.c +++ b/src/avrcache.c @@ -318,6 +318,9 @@ static int guessBootStart(const PROGRAMMER *pgm, const AVRPART *p) { int bootstart = 0; const AVR_Cache *cp = pgm->cp_flash; + if(p->prog_modes & PM_UPDI) // Modern AVRs put the bootloader at 0 + return 0; + if(p->n_boot_sections > 0 && p->boot_section_size > 0) bootstart = cp->size - (p->boot_section_size<<(p->n_boot_sections-1)); @@ -328,6 +331,17 @@ static int guessBootStart(const PROGRAMMER *pgm, const AVRPART *p) { } +// Page erase but without error messages if it does not work +static int silent_page_erase(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM *m, unsigned int a) { + int bakverb = verbose; + verbose = -123; + int ret = pgm->page_erase? pgm->page_erase(pgm, p, m, a): -1; + verbose = bakverb; + + return ret; +} + + typedef struct { AVRMEM *mem; AVR_Cache *cp; @@ -397,7 +411,7 @@ int avr_flush_cache(const PROGRAMMER *pgm, const AVRPART *p) { } // Probably NOR memory, check out page erase - if(pgm->page_erase && pgm->page_erase(pgm, p, mem, n) >= 0) { + if(silent_page_erase(pgm, p, mem, n) >= 0) { if(writeCachePage(cp, pgm, p, mem, n, 1) < 0) return LIBAVRDUDE_GENERAL_FAILURE; // Worked OK? Can use page erase on this memory @@ -713,7 +727,7 @@ int avr_page_erase_cached(const PROGRAMMER *pgm, const AVRPART *p, const AVRMEM if(fallback_write_byte(pgm, p, mem, uaddr, 0xff) < 0) return LIBAVRDUDE_GENERAL_FAILURE; } else { - if(!pgm->page_erase || pgm->page_erase(pgm, p, mem, uaddr) < 0) + if(silent_page_erase(pgm, p, mem, uaddr) < 0) return LIBAVRDUDE_GENERAL_FAILURE; }