From a8b263f1f08676c4bdff3e45344aa85f11d68a88 Mon Sep 17 00:00:00 2001 From: MCUdude Date: Mon, 17 Apr 2023 22:18:04 +0200 Subject: [PATCH] Add -xvtarg to jtag3.c --- src/jtag3.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/jtag3.c b/src/jtag3.c index 92606409..a91c716c 100644 --- a/src/jtag3.c +++ b/src/jtag3.c @@ -84,6 +84,11 @@ struct pdata bool vtarg_switch_set; unsigned char vtarg_switch_data[2]; + /* Get/set flags for adjustable target voltage */ + bool vtarg_get; + bool vtarg_set; + double vtarg_data; + /* Function to set the appropriate clock parameter */ int (*set_sck)(const PROGRAMMER *, unsigned char *); }; @@ -1144,6 +1149,26 @@ static int jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { } } + // Read or write target voltage + if (PDATA(pgm)->vtarg_get || PDATA(pgm)->vtarg_set) { + // Read current target voltage set value + unsigned char buf[2]; + if (jtag3_getparm(pgm, SCOPE_GENERAL, 1, PARM3_VADJUST, buf, 2) < 0) + return -1; + double vtarg_read = b2_to_u16(buf) / 1000.0; + if (PDATA(pgm)->vtarg_get) + msg_info("Target voltage value read as %.2fV\n", vtarg_read); + // Write target voltage value + else { + u16_to_b2(buf, (unsigned)(PDATA(pgm)->vtarg_data * 1000)); + msg_info("Changing target voltage from %.2f to %.2fV\n", vtarg_read, PDATA(pgm)->vtarg_data); + if (jtag3_setparm(pgm, SCOPE_GENERAL, 1, PARM3_VADJUST, buf, sizeof(buf)) < 0) { + msg_warning("Cannot set target voltage %.2fV\n", PDATA(pgm)->vtarg_data); + return -1; + } + } + } + /* set device descriptor data */ if ((p->prog_modes & PM_PDI)) { struct xmega_device_desc xd; @@ -1528,6 +1553,29 @@ static int jtag3_parseextparms(const PROGRAMMER *pgm, const LISTID extparms) { } } + else if (str_starts(extended_param, "vtarg")) { + if (pgm->extra_features & HAS_VTARG_ADJ) { + // Set target voltage + if (str_starts(extended_param, "vtarg=") ) { + double vtarg_set_val = 0; + int sscanf_success = sscanf(extended_param, "vtarg=%lf", &vtarg_set_val); + PDATA(pgm)->vtarg_data = (double)((int)(vtarg_set_val * 100 + .5)) / 100; + if (sscanf_success < 1 || vtarg_set_val < 0) { + pmsg_error("invalid vtarg value '%s'\n", extended_param); + rv = -1; + break; + } + PDATA(pgm)->vtarg_set = true; + } + // Get target voltage + else if(str_eq(extended_param, "vtarg")) + PDATA(pgm)->vtarg_get = true; + else + break; + continue; + } + } + else if (str_eq(extended_param, "help")) { char *prg = (char *)ldata(lfirst(pgm->id)); msg_error("%s -c %s extended options:\n", progname, prg);