Read the signature on -c jtag2updi exit if last op was write/erase

This commit is contained in:
stefanrueger
2024-02-06 10:21:55 +13:00
parent 571a8063b9
commit 60f04f05fb
3 changed files with 21 additions and 0 deletions

View File

@@ -87,6 +87,9 @@ struct pdata
/* Major firmware version (needed for Xmega programming) */
unsigned int fwver;
/* Most recent operation was a memory write or erase */
int recently_written;
#define FLAGS32_INIT_SMC 1 // Part will undergo chip erase
#define FLAGS32_WRITE 2 // At least one write operation specified
// Couple of flag bits for AVR32 programming
@@ -850,6 +853,7 @@ static int jtagmkII_chip_erase(const PROGRAMMER *pgm, const AVRPART *p) {
if (!(p->prog_modes & (PM_PDI | PM_UPDI)))
pgm->initialize(pgm, p);
PDATA(pgm)->recently_written = 1;
return 0;
}
@@ -1128,6 +1132,7 @@ static int jtagmkII_program_disable(const PROGRAMMER *pgm) {
return -1;
}
PDATA(pgm)->recently_written = 0;
PDATA(pgm)->prog_enabled = 0;
(void)jtagmkII_reset(pgm, 0x01);
@@ -2012,6 +2017,7 @@ static int jtagmkII_paged_write(const PROGRAMMER *pgm, const AVRPART *p, const A
free(cmd);
serial_recv_timeout = otimeout;
PDATA(pgm)->recently_written = 1;
return n_bytes;
}
@@ -2102,6 +2108,7 @@ static int jtagmkII_paged_load(const PROGRAMMER *pgm, const AVRPART *p, const AV
}
serial_recv_timeout = otimeout;
PDATA(pgm)->recently_written = 0;
return n_bytes;
}
@@ -2290,6 +2297,7 @@ retry:
*value = resp[1];
free(resp);
PDATA(pgm)->recently_written = 0;
return 0;
fail:
@@ -2400,6 +2408,7 @@ retry:
}
free(resp);
PDATA(pgm)->recently_written = 1;
return 0;
fail:
@@ -3635,6 +3644,11 @@ static int jtagmkII_updi_term_keep_alive(const PROGRAMMER *pgm, const AVRPART *p
return 0;
}
// Read the signature if most recent operation was an erase or a write to ensure it finished
static int jtagmkII_updi_end_programming(const PROGRAMMER *pgm, const AVRPART *p) {
return PDATA(pgm)->recently_written? avr_read(pgm, p, "signature", NULL): 0;
}
#ifdef __OBJC__
#pragma mark -
#endif
@@ -3772,6 +3786,7 @@ void jtagmkII_updi_initpgm(PROGRAMMER *pgm) {
pgm->page_size = 256;
pgm->flag = PGM_FL_IS_PDI;
pgm->term_keep_alive= jtagmkII_updi_term_keep_alive;
pgm->end_programming= jtagmkII_updi_end_programming;
}
const char jtagmkII_dragon_desc[] = "Atmel AVR Dragon in JTAG mode";

View File

@@ -993,6 +993,8 @@ typedef struct programmer_t {
int (*read_sib) (const struct programmer_t *pgm, const AVRPART *p, char *sib);
int (*read_chip_rev) (const struct programmer_t *pgm, const AVRPART *p, unsigned char *chip_rev);
int (*term_keep_alive)(const struct programmer_t *pgm, const AVRPART *p);
int (*end_programming)(const struct programmer_t *pgm, const AVRPART *p);
void (*print_parms) (const struct programmer_t *pgm, FILE *fp);
int (*set_vtarget) (const struct programmer_t *pgm, double v);
int (*get_vtarget) (const struct programmer_t *pgm, double *v);

View File

@@ -1735,6 +1735,10 @@ skipopen:
}
pgm->flush_cache(pgm, p);
if(pgm->end_programming)
if(pgm->end_programming(pgm, p) < 0)
pmsg_error("could not end programming, aborting\n");
main_exit:
// Program complete