diff --git a/src/butterfly.c b/src/butterfly.c index a71d55e6..7fc773aa 100644 --- a/src/butterfly.c +++ b/src/butterfly.c @@ -140,11 +140,21 @@ static int butterfly_vfy_led(const PROGRAMMER *pgm, int value) { * issue the 'chip erase' command to the butterfly board */ static int butterfly_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) { - butterfly_send(pgm, "e", 1); - if (butterfly_vfy_cmd_sent(pgm, "chip erase") < 0) - return -1; + long bak_timeout = serial_recv_timeout; + AVRMEM *fl = avr_locate_mem(p, "flash"); + int ret = 0; - return 0; + // Estimated time it takes to erase all pages in bootloader + long new_timeout = p->chip_erase_delay * (fl? fl->num_pages: 999); + if(serial_recv_timeout < new_timeout) + serial_recv_timeout = new_timeout; + + butterfly_send(pgm, "e", 1); + if(butterfly_vfy_cmd_sent(pgm, "chip erase") < 0) + ret = -1; + + serial_recv_timeout = bak_timeout; + return ret; } diff --git a/src/urclock.c b/src/urclock.c index f686bf85..18ba674c 100644 --- a/src/urclock.c +++ b/src/urclock.c @@ -2105,16 +2105,16 @@ static int urclock_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) { buf[0] = Cmnd_STK_CHIP_ERASE; buf[1] = Sync_CRC_EOP; - if(urclock_send(pgm, buf, 2) < 0) + if(urclock_send(pgm, buf, 2) < 0 || urclock_res_check(pgm, __func__, 0, NULL, 0) < 0) { + serial_recv_timeout = bak_timeout; return -1; - if(urclock_res_check(pgm, __func__, 0, NULL, 0) < 0) - return -1; - + } } else { // Legacy bootloaders use universal extension pmsg_notice2("chip erase via universal STK500v1 command\n"); - if (pgm->cmd == NULL) { // Should not happen + if(pgm->cmd == NULL) { // Should not happen pmsg_error("%s programmer does not provide a cmd() method\n", pgm->type); + serial_recv_timeout = bak_timeout; return -1; } @@ -2125,8 +2125,10 @@ static int urclock_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) { buf[2] = (uint8_t) (Subc_STK_UNIVERSAL_CE>>8); buf[3] = (uint8_t) (Subc_STK_UNIVERSAL_CE); - if(urclock_cmd(pgm, buf, buf+4) < 0) + if(urclock_cmd(pgm, buf, buf+4) < 0) { + serial_recv_timeout = bak_timeout; return -1; + } } serial_recv_timeout = bak_timeout;