mirror of
https://github.com/avrdudes/avrdude.git
synced 2026-06-02 09:46:34 +03:00
adding possibility to keep supplying power with PK4/5 after exit
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -182,5 +182,5 @@ int get_pickit_tpi_script(SCRIPT *scr, const char* partdesc) {
|
||||
case 7: /* ATtiny9 */
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
return namepos;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user