From d5e4ed9f8933b78c8f18776a212409bc8119aa00 Mon Sep 17 00:00:00 2001 From: MCUdude Date: Wed, 5 Oct 2022 23:52:05 +0200 Subject: [PATCH 1/2] Fix jtag3_page_erase for targets with UPDI Very handy to have now that #1106 is merged --- src/jtag3.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/jtag3.c b/src/jtag3.c index 902f8735..ce9fbe36 100644 --- a/src/jtag3.c +++ b/src/jtag3.c @@ -1687,8 +1687,8 @@ static int jtag3_page_erase(const PROGRAMMER *pgm, const AVRPART *p, const AVRME avrdude_message(MSG_NOTICE2, "%s: jtag3_page_erase(.., %s, 0x%x)\n", progname, m->desc, addr); - if (!(p->prog_modes & PM_PDI)) { - avrdude_message(MSG_INFO, "%s: jtag3_page_erase: not an Xmega device\n", + if (!(p->prog_modes & (PM_PDI | PM_UPDI))) { + avrdude_message(MSG_INFO, "%s: jtag3_page_erase: not supported\n", progname); return -1; } @@ -1701,7 +1701,7 @@ static int jtag3_page_erase(const PROGRAMMER *pgm, const AVRPART *p, const AVRME cmd[2] = 0; if (strcmp(m->desc, "flash") == 0) { - if (jtag3_memtype(pgm, p, addr) == MTYPE_FLASH) + if (p->prog_modes & PM_UPDI || jtag3_memtype(pgm, p, addr) == MTYPE_FLASH) cmd[3] = XMEGA_ERASE_APP_PAGE; else cmd[3] = XMEGA_ERASE_BOOT_PAGE; @@ -1716,8 +1716,13 @@ static int jtag3_page_erase(const PROGRAMMER *pgm, const AVRPART *p, const AVRME cmd[3] = XMEGA_ERASE_APP_PAGE; } - u32_to_b4(cmd + 4, addr + m->offset); + unsigned int addr_adj = addr; + if(p->prog_modes & PM_PDI) + addr_adj += m->offset; + else // PM_UPDI + addr_adj = jtag3_memaddr(pgm, p, m, addr); + u32_to_b4(cmd + 4, addr_adj); if (jtag3_command(pgm, cmd, 8, &resp, "page erase") < 0) return -1; From 1ca1be04478561a362ab5a8005e7b6bb512146e8 Mon Sep 17 00:00:00 2001 From: MCUdude Date: Thu, 6 Oct 2022 20:59:32 +0200 Subject: [PATCH 2/2] Use avr_mem_is_flash_type() instead of checking m->desc directly --- src/jtag3.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/jtag3.c b/src/jtag3.c index ce9fbe36..112701f6 100644 --- a/src/jtag3.c +++ b/src/jtag3.c @@ -1700,7 +1700,7 @@ static int jtag3_page_erase(const PROGRAMMER *pgm, const AVRPART *p, const AVRME cmd[1] = CMD3_ERASE_MEMORY; cmd[2] = 0; - if (strcmp(m->desc, "flash") == 0) { + if (avr_mem_is_flash_type(m)) { if (p->prog_modes & PM_UPDI || jtag3_memtype(pgm, p, addr) == MTYPE_FLASH) cmd[3] = XMEGA_ERASE_APP_PAGE; else @@ -1710,8 +1710,6 @@ static int jtag3_page_erase(const PROGRAMMER *pgm, const AVRPART *p, const AVRME } else if (strcmp(m->desc, "usersig") == 0 || strcmp(m->desc, "userrow") == 0) { cmd[3] = XMEGA_ERASE_USERSIG; - } else if (strcmp(m->desc, "boot") == 0) { - cmd[3] = XMEGA_ERASE_BOOT_PAGE; } else { cmd[3] = XMEGA_ERASE_APP_PAGE; }