Implemented lockbits programming and forced chip erase procedure

git-svn-id: svn://svn.savannah.nongnu.org/avrdude/branches/serialupdi@1522 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
Dawid Buchwald 2021-12-15 14:00:14 +00:00 committed by Marius Greuel
parent dc846ba7e8
commit c3100763cb
1 changed files with 46 additions and 24 deletions

View File

@ -238,6 +238,8 @@ static int serialupdi_in_prog_mode(PROGRAMMER * pgm, uint8_t * in_prog_mode)
return 0;
}
static int serialupdi_unlock(PROGRAMMER * pgm, AVRPART * p);
static int serialupdi_enter_progmode(PROGRAMMER * pgm)
{
/*
@ -283,8 +285,20 @@ def enter_progmode(self):
uint8_t key_status;
if (serialupdi_in_prog_mode(pgm, &in_prog_mode) < 0) {
avrdude_message(MSG_INFO, "%s: Checking UPDI NVM prog mode failed\n", progname);
return -1;
avrdude_message(MSG_INFO, "%s: Checking UPDI NVM prog mode failed, attempting reset\n", progname);
if (serialupdi_leave_progmode(pgm) < 0) {
avrdude_message(MSG_INFO, "%s: Unable to leave progmode\n", progname);
return -1;
}
if (updi_link_init(pgm) < 0) {
avrdude_message(MSG_INFO, "%s: UPDI link initialization failed\n", progname);
return -1;
}
avrdude_message(MSG_INFO, "%s: UPDI link initialization OK\n", progname);
if (serialupdi_in_prog_mode(pgm, &in_prog_mode) < 0) {
avrdude_message(MSG_INFO, "%s: Checking UPDI NVM prog mode failed again, exiting\n", progname);
return -1;
}
}
if (in_prog_mode) {
avrdude_message(MSG_DEBUG, "%s: Already in prog mode\n", progname);
@ -321,7 +335,16 @@ def enter_progmode(self):
if (serialupdi_wait_for_unlock(pgm, 100) < 0) {
avrdude_message(MSG_INFO, "%s: Failed to enter NVM programming mode: device is locked\n", progname);
return -1;
if (!ovsigck) {
return -1;
}
if (serialupdi_unlock(pgm, 0x00) < 0) {
return -1;
}
if (updi_link_init(pgm) < 0) {
return -1;
}
return serialupdi_enter_progmode(pgm);
}
if (serialupdi_in_prog_mode(pgm, &in_prog_mode) < 0) {
@ -335,6 +358,18 @@ def enter_progmode(self):
}
avrdude_message(MSG_DEBUG, "%s: Entered NVM programming mode\n", progname);
updi_sib_info * sib_info = updi_get_sib_info(pgm);
if (updi_read_sib(pgm, sib_info->sib_string, 32) < 0) {
avrdude_message(MSG_INFO, "%s: Read SIB operation failed\n", progname);
return -1;
}
if (serialupdi_decode_sib(pgm, sib_info) < 0) {
avrdude_message(MSG_INFO, "%s: Decode SIB_INFO failed\n", progname);
return -1;
}
return 0;
}
@ -368,21 +403,11 @@ static int serialupdi_leave_progmode(PROGRAMMER * pgm)
static int serialupdi_initialize(PROGRAMMER * pgm, AVRPART * p)
{
updi_sib_info * sib_info = updi_get_sib_info(pgm);
if (updi_link_init(pgm) < 0) {
avrdude_message(MSG_INFO, "%s: UPDI link initialization failed\n", progname);
return -1;
}
avrdude_message(MSG_INFO, "%s: UPDI link initialization OK\n", progname);
if (updi_read_sib(pgm, sib_info->sib_string, 32) < 0) {
avrdude_message(MSG_INFO, "%s: Read SIB operation failed\n", progname);
return -1;
}
if (serialupdi_decode_sib(pgm, sib_info) < 0) {
avrdude_message(MSG_INFO, "%s: Decode SIB_INFO failed\n", progname);
return -1;
}
if (serialupdi_enter_progmode(pgm) < 0) {
avrdude_message(MSG_INFO, "%s: Unable to enter NVM programming mode\n", progname);
return -1;
@ -437,11 +462,19 @@ static int serialupdi_write_byte(PROGRAMMER * pgm, AVRPART * p, AVRMEM * mem,
if (strstr(mem->desc, "fuse") != 0) {
return updi_nvm_write_fuse(pgm, p, mem->offset + addr, value);
}
if (strcmp(mem->desc, "lock") == 0) {
return updi_nvm_write_fuse(pgm, p, mem->offset + addr, value);
}
if (strcmp(mem->desc, "eeprom") == 0) {
unsigned char buffer[1];
buffer[0]=value;
return updi_nvm_write_eeprom(pgm, p, mem->offset + addr, buffer, 1);
}
if (strcmp(mem->desc, "flash") == 0) {
unsigned char buffer[1];
buffer[0]=value;
return updi_nvm_write_flash(pgm, p, mem->offset + addr, buffer, 1);
}
return updi_write_byte(pgm, mem->offset + addr, value);
}
@ -478,12 +511,6 @@ static int serialupdi_paged_write(PROGRAMMER * pgm, AVRPART * p, AVRMEM * m,
unsigned int addr, unsigned int n_bytes)
{
int rc;
if (serialupdi_enter_progmode(pgm) < 0) {
avrdude_message(MSG_INFO, "%s: Unable to enter NVM programming mode\n", progname);
return -1;
}
if (n_bytes > m->page_size) {
unsigned int write_offset = addr;
unsigned int remaining_bytes = n_bytes;
@ -585,11 +612,6 @@ static int serialupdi_unlock(PROGRAMMER * pgm, AVRPART * p)
static int serialupdi_chip_erase(PROGRAMMER * pgm, AVRPART * p)
{
if (serialupdi_enter_progmode(pgm) < 0) {
avrdude_message(MSG_INFO, "%s: Unable to enter NVM programming mode\n", progname);
return -1;
}
if (updi_nvm_chip_erase(pgm, p) < 0) {
avrdude_message(MSG_INFO, "%s: Chip erase failed, device might be locked, attempting unlock now\n", progname);
return serialupdi_unlock(pgm, p);