Skip to content

Commit

Permalink
Merge pull request #1627 from dbuchwald/issue_1609
Browse files Browse the repository at this point in the history
Multiple updates to SerialUPDI protocol based on discussion 1609 and issues 1621, 1622 and 1623.
  • Loading branch information
stefanrueger authored Jan 28, 2024
2 parents 2f89aec + 1b0b263 commit d4ca977
Show file tree
Hide file tree
Showing 16 changed files with 2,879 additions and 1,156 deletions.
10 changes: 10 additions & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,16 @@ add_library(libavrdude
updi_link.h
updi_nvm.c
updi_nvm.h
updi_nvm_v0.c
updi_nvm_v0.h
updi_nvm_v2.c
updi_nvm_v2.h
updi_nvm_v3.c
updi_nvm_v3.h
updi_nvm_v4.c
updi_nvm_v4.h
updi_nvm_v5.c
updi_nvm_v5.h
updi_readwrite.c
updi_readwrite.h
updi_state.c
Expand Down
10 changes: 10 additions & 0 deletions src/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,16 @@ libavrdude_a_SOURCES = \
updi_readwrite.h \
updi_nvm.c \
updi_nvm.h \
updi_nvm_v0.c \
updi_nvm_v0.h \
updi_nvm_v2.c \
updi_nvm_v2.h \
updi_nvm_v3.c \
updi_nvm_v3.h \
updi_nvm_v4.c \
updi_nvm_v4.h \
updi_nvm_v5.c \
updi_nvm_v5.h \
urclock.c \
urclock.h \
urclock_hash.h \
Expand Down
44 changes: 34 additions & 10 deletions src/serialupdi.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,9 +165,14 @@ static int serialupdi_decode_sib(const PROGRAMMER *pgm, updi_sib_info *sib_info)
updi_set_nvm_mode(pgm, UPDI_NVM_MODE_V3);
updi_set_datalink_mode(pgm, UPDI_LINK_MODE_24BIT);
break;
case '4':
pmsg_notice("NVM type 4: 24-bit, word oriented\n");
updi_set_nvm_mode(pgm, UPDI_NVM_MODE_V4);
updi_set_datalink_mode(pgm, UPDI_LINK_MODE_24BIT);
break;
case '5':
pmsg_notice("NVM type 5: 24-bit, page oriented (Continue as type 3)\n");
updi_set_nvm_mode(pgm, UPDI_NVM_MODE_V3);
pmsg_notice("NVM type 5: 24-bit, page oriented\n");
updi_set_nvm_mode(pgm, UPDI_NVM_MODE_V5);
updi_set_datalink_mode(pgm, UPDI_LINK_MODE_24BIT);
break;
default:
Expand Down Expand Up @@ -279,6 +284,26 @@ static int serialupdi_wait_for_urow(const PROGRAMMER *pgm, unsigned int ms, urow
return -1;
}

static int serialupdi_wait_for_nvmprog(const PROGRAMMER *pgm, unsigned int ms) {

unsigned long start_time;
unsigned long current_time;
uint8_t status;
start_time = avr_ustimestamp();
do {
if (updi_read_cs(pgm, UPDI_ASI_SYS_STATUS, &status) >= 0) {
if (status & (1 << UPDI_ASI_SYS_STATUS_NVMPROG)) {
return 0;
}
}
current_time = avr_ustimestamp();
} while ((current_time - start_time) < (ms * 1000));

pmsg_error("timeout waiting for device to enter NVMPROG mode\n");
return -1;
}


static int serialupdi_in_prog_mode(const PROGRAMMER *pgm, uint8_t *in_prog_mode) {
/*
def in_prog_mode(self):
Expand Down Expand Up @@ -359,6 +384,11 @@ def enter_progmode(self):
return 0;
}

if (serialupdi_reset(pgm, APPLY_RESET) < 0) {
pmsg_error("apply reset operation failed\n");
return -1;
}

memcpy(buffer, UPDI_KEY_NVM, sizeof(buffer));
if (updi_write_key(pgm, buffer, UPDI_KEY_64, sizeof(buffer)) < 0) {
pmsg_error("writing NVM KEY failed\n");
Expand All @@ -372,8 +402,7 @@ def enter_progmode(self):
pmsg_debug("key status: 0x%02X\n", key_status);

if (!(key_status & (1 << UPDI_ASI_KEY_STATUS_NVMPROG))) {
pmsg_error("key was not accepted\n");
return -1;
pmsg_warning("key was not accepted\n");
}

if (serialupdi_reset(pgm, APPLY_RESET) < 0) {
Expand All @@ -391,12 +420,7 @@ def enter_progmode(self):
return -1;
}

if (serialupdi_in_prog_mode(pgm, &in_prog_mode) < 0) {
pmsg_error("checking UPDI NVM prog mode failed\n");
return -1;
}

if (!in_prog_mode) {
if (serialupdi_wait_for_nvmprog(pgm, 500) < 0) {
pmsg_error("unable to enter NVM programming mode\n");
return -1;
}
Expand Down
47 changes: 0 additions & 47 deletions src/updi_constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -106,51 +106,4 @@

#define UPDI_RESET_REQ_VALUE 0x59

// FLASH CONTROLLER
#define UPDI_NVMCTRL_CTRLA 0x00
#define UPDI_NVMCTRL_CTRLB 0x01
#define UPDI_NVMCTRL_STATUS 0x02
#define UPDI_NVMCTRL_INTCTRL 0x03
#define UPDI_NVMCTRL_INTFLAGS 0x04
#define UPDI_NVMCTRL_DATAL 0x06
#define UPDI_NVMCTRL_DATAH 0x07
#define UPDI_NVMCTRL_ADDRL 0x08
#define UPDI_NVMCTRL_ADDRH 0x09

// NVMCTRL v0 CTRLA
#define UPDI_V0_NVMCTRL_CTRLA_NOP 0x00
#define UPDI_V0_NVMCTRL_CTRLA_WRITE_PAGE 0x01
#define UPDI_V0_NVMCTRL_CTRLA_ERASE_PAGE 0x02
#define UPDI_V0_NVMCTRL_CTRLA_ERASE_WRITE_PAGE 0x03
#define UPDI_V0_NVMCTRL_CTRLA_PAGE_BUFFER_CLR 0x04
#define UPDI_V0_NVMCTRL_CTRLA_CHIP_ERASE 0x05
#define UPDI_V0_NVMCTRL_CTRLA_ERASE_EEPROM 0x06
#define UPDI_V0_NVMCTRL_CTRLA_WRITE_FUSE 0x07

// NVMCTRL v2 CTRLA
#define UPDI_V2_NVMCTRL_CTRLA_NOCMD 0x00
#define UPDI_V2_NVMCTRL_CTRLA_FLASH_WRITE 0x02
#define UPDI_V2_NVMCTRL_CTRLA_FLASH_PAGE_ERASE 0x08
#define UPDI_V2_NVMCTRL_CTRLA_EEPROM_ERASE_WRITE 0x13
#define UPDI_V2_NVMCTRL_CTRLA_CHIP_ERASE 0x20
#define UPDI_V2_NVMCTRL_CTRLA_EEPROM_ERASE 0x30

// NVMCTRL v3 CTRLA
#define UPDI_V3_NVMCTRL_CTRLA_NOCMD 0x00
#define UPDI_V3_NVMCTRL_CTRLA_NOP 0x01
#define UPDI_V3_NVMCTRL_CTRLA_FLASH_PAGE_WRITE 0x04
#define UPDI_V3_NVMCTRL_CTRLA_FLASH_PAGE_ERASE_WRITE 0x05
#define UPDI_V3_NVMCTRL_CTRLA_FLASH_PAGE_ERASE 0x08
#define UPDI_V3_NVMCTRL_CTRLA_FLASH_PAGE_BUFFER_CLEAR 0x0F
#define UPDI_V3_NVMCTRL_CTRLA_EEPROM_PAGE_WRITE 0x14
#define UPDI_V3_NVMCTRL_CTRLA_EEPROM_PAGE_ERASE_WRITE 0x15
#define UPDI_V3_NVMCTRL_CTRLA_EEPROM_PAGE_ERASE 0x17
#define UPDI_V3_NVMCTRL_CTRLA_EEPROM_PAGE_BUFFER_CLEAR 0x1F
#define UPDI_V3_NVMCTRL_CTRLA_CHIP_ERASE 0x20
#define UPDI_V3_NVMCTRL_CTRLA_EEPROM_ERASE 0x30

#define UPDI_NVM_STATUS_WRITE_ERROR 2
#define UPDI_NVM_STATUS_EEPROM_BUSY 1
#define UPDI_NVM_STATUS_FLASH_BUSY 0

#endif /* updi_constants_h */
Loading

0 comments on commit d4ca977

Please sign in to comment.