diff --git a/src/doc/avrdude.texi b/src/doc/avrdude.texi index 01ea3a11..7120f33a 100644 --- a/src/doc/avrdude.texi +++ b/src/doc/avrdude.texi @@ -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 diff --git a/src/pickit5.c b/src/pickit5.c index 29bd498c..22c46c97 100644 --- a/src/pickit5.c +++ b/src/pickit5.c @@ -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; diff --git a/src/pickit5_lut_dw.c b/src/pickit5_lut_dw.c index 294e1431..999de606 100644 --- a/src/pickit5_lut_dw.c +++ b/src/pickit5_lut_dw.c @@ -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; } \ No newline at end of file diff --git a/src/pickit5_lut_isp.c b/src/pickit5_lut_isp.c index 2837d07f..ac0eab7a 100644 --- a/src/pickit5_lut_isp.c +++ b/src/pickit5_lut_isp.c @@ -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; } \ No newline at end of file diff --git a/src/pickit5_lut_jtag.c b/src/pickit5_lut_jtag.c index 94c11be3..a09c2fdb 100644 --- a/src/pickit5_lut_jtag.c +++ b/src/pickit5_lut_jtag.c @@ -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; } \ No newline at end of file diff --git a/src/pickit5_lut_pdi.c b/src/pickit5_lut_pdi.c index 2ab59a50..c9c86953 100644 --- a/src/pickit5_lut_pdi.c +++ b/src/pickit5_lut_pdi.c @@ -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; } \ No newline at end of file diff --git a/src/pickit5_lut_tpi.c b/src/pickit5_lut_tpi.c index 56680729..f3d50e11 100644 --- a/src/pickit5_lut_tpi.c +++ b/src/pickit5_lut_tpi.c @@ -182,5 +182,5 @@ int get_pickit_tpi_script(SCRIPT *scr, const char* partdesc) { case 7: /* ATtiny9 */ break; } - return 0; + return namepos; } \ No newline at end of file diff --git a/src/pickit5_lut_updi.c b/src/pickit5_lut_updi.c index 1c185a05..6ad04262 100644 --- a/src/pickit5_lut_updi.c +++ b/src/pickit5_lut_updi.c @@ -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; } \ No newline at end of file diff --git a/tools/scripts_decoder.py b/tools/scripts_decoder.py index 6e6179ae..85f1b206 100644 --- a/tools/scripts_decoder.py +++ b/tools/scripts_decoder.py @@ -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)