adding possibility to keep supplying power with PK4/5 after exit

This commit is contained in:
MX682X
2025-05-02 21:40:58 +02:00
parent 568b709087
commit e1a6551b1e
9 changed files with 58 additions and 12 deletions

View File

@@ -1414,6 +1414,8 @@ this setting will be ignored. When AVRDUDE detects an external voltage outside
of this range, it will terminate the operation. You can disable this check by
setting the voltage to 0@w{ }V. If an XMEGA part was selected, a requested voltage
above 3.49@w{ }V will lead to an abort of operation.
Usually, the programmer will stop providing power when the session ends.
To continue to power the target you can use the @code{-E vcc} option.
@item hvupdi
High-voltage UPDI programming is used to enable a UPDI pin that has previously
been set to RESET or GPIO mode. Use @code{-x hvupdi} to enable high-voltage UPDI

View File

@@ -83,6 +83,7 @@ struct pdata {
unsigned char pk_op_mode; // See PK_OP_ defines
unsigned char power_source; // 0: external / 1: from PICkit / 2: ignore check
unsigned char hvupdi_enabled; // 0: no HV / 1: HV generation enabled
unsigned char keep_power; // 0: No power on exit / 1: Keeps supplying power on exit
double target_voltage; // Voltage to supply to target
double measured_vcc; // This and below for print_params()
@@ -246,6 +247,43 @@ static void pickit5_teardown(PROGRAMMER *pgm) {
pgm->cookie = NULL;
}
static int pickit5_parseexitspecs(PROGRAMMER *pgm, const char *sp) {
char *cp, *s, *str = mmt_strdup(sp);
int rv = 0;
bool help = false;
s = str;
while((cp = strtok(s, ","))) {
s = NULL;
if(str_eq(cp, "vcc")) {
if(!can_power_target(pgm)) {
pmsg_warning("-E vcc setting detected, but programmer can not provide power, ignoring.\n");
continue;
}
my.keep_power = 0x01;
continue;
}
if(str_eq(cp, "help")) {
help = true;
rv = LIBAVRDUDE_EXIT;
}
if(!help) {
pmsg_error("invalid exitspec parameter -E %s\n", cp);
rv = -1;
}
msg_error("%s -c %s exitspec parameter options:\n", progname, pgmid);
if(can_power_target(pgm))
msg_error(" -E vcc Programmer will continue to provide power after the session ended\n");
msg_error(" -E help Show this help menu and exit\n");
mmt_free(str);
return rv;
}
mmt_free(str);
return rv;
}
static int pickit5_parseextparms(const PROGRAMMER *pgm, const LISTID extparms) {
LNODEID ln;
const char *extended_param;
@@ -256,9 +294,11 @@ static int pickit5_parseextparms(const PROGRAMMER *pgm, const LISTID extparms) {
if(str_starts(extended_param, "vtarg=")) {
double voltage = -1.0;
if(!can_power_target(pgm)) {
pmsg_warning("-x vtarg setting detected, but programmer can not provide power, ignoring.\n");
continue;
}
if(sscanf(extended_param, "vtarg=%lf", &voltage) != 1) {
pmsg_error("invalid voltage parameter %s\n", extended_param);
rv = -1;
continue;
@@ -731,7 +771,8 @@ static int pickit5_open(PROGRAMMER *pgm, const char *port) {
static void pickit5_close(PROGRAMMER *pgm) {
pmsg_debug("%s()\n", __func__);
pickit5_set_vtarget(pgm, 0.0); // Switches off PICkit voltage regulator if enabled
if (!my.keep_power)
pickit5_set_vtarget(pgm, 0.0); // Switches off PICkit voltage regulator if enabled
serial_close(&pgm->fd);
}
@@ -922,12 +963,14 @@ static int pickit5_initialize(const PROGRAMMER *pgm, const AVRPART *p) {
if(rc == -1) {
pmsg_error("no matching prog_mode found, aborting\n");
return -1;
}
if(rc == -2) {
} else if(rc == -2) {
pmsg_error("failed to match scripts to %s, aborting\n", p->desc);
return -1;
} else {
pmsg_debug("found scripts at namepos %d", rc);
}
if(my.hvupdi_enabled > 0) {
if(p->hvupdi_variant == UPDI_ENABLE_HV_UPDI)
pmsg_notice("high-voltage SYSCFG0 override on UPDI pin enabled\n");
@@ -2065,6 +2108,7 @@ void pickit5_initpgm(PROGRAMMER *pgm) {
// Mandatory functions
pgm->initialize = pickit5_initialize;
pgm->parseextparams = pickit5_parseextparms;
pgm->parseexitspecs = pickit5_parseexitspecs;
pgm->display = pickit5_display;
pgm->enable = pickit5_enable;
pgm->disable = pickit5_disable;

View File

@@ -4437,5 +4437,5 @@ int get_pickit_dw_script(SCRIPT *scr, const char* partdesc) {
scr->ReadMem8_len = sizeof(ReadMem8_dw_5);
break;
}
return 0;
return namepos;
}

View File

@@ -3546,5 +3546,5 @@ int get_pickit_isp_script(SCRIPT *scr, const char* partdesc) {
scr->WriteConfigmemLock_len = sizeof(WriteConfigmemLock_isp_0);
break;
}
return 0;
return namepos;
}

View File

@@ -2024,5 +2024,5 @@ int get_pickit_jtag_script(SCRIPT *scr, const char* partdesc) {
scr->ReadMem8_len = sizeof(ReadMem8_jtag_6);
break;
}
return 0;
return namepos;
}

View File

@@ -567,5 +567,5 @@ int get_pickit_pdi_script(SCRIPT *scr, const char* partdesc) {
scr->ReadIDmem_len = sizeof(ReadIDmem_pdi_2);
break;
}
return 0;
return namepos;
}

View File

@@ -182,5 +182,5 @@ int get_pickit_tpi_script(SCRIPT *scr, const char* partdesc) {
case 7: /* ATtiny9 */
break;
}
return 0;
return namepos;
}

View File

@@ -1477,5 +1477,5 @@ int get_pickit_updi_script(SCRIPT *scr, const char* partdesc) {
scr->ReadIDmem_len = sizeof(ReadIDmem_updi_1);
break;
}
return 0;
return namepos;
}

View File

@@ -445,7 +445,7 @@ def convert_xml(xml_path, c_funcs):
c_file.write(" scr->{0}_len = sizeof({1});\n".format(func_name, func))
c_file.write(" break;\n")
c_file.write(" }\n return 0;\n}")
c_file.write(" }\n return namepos;\n}")
# End of switch case
print("finished " + prog_iface)