From 7f360a42d9a958a5e7ef36fec63ee79a6aeae317 Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Wed, 21 Jun 2023 09:05:18 +0100 Subject: [PATCH 1/2] Increase timeout for emulated butterfly chip erase depending on part --- src/butterfly.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) 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; } From 3a5933299d169c7853d9ebb89e02618d8ce743dd Mon Sep 17 00:00:00 2001 From: Stefan Rueger Date: Wed, 21 Jun 2023 09:15:02 +0100 Subject: [PATCH 2/2] Restore serial_recv_timeout on failure --- src/urclock.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) 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;