From f7ed26cb67d4037538cee73051db650f81ad3d46 Mon Sep 17 00:00:00 2001 From: MCUdude Date: Sun, 15 Jan 2023 13:14:57 +0100 Subject: [PATCH] Minor improvement based on feedback from @stefanrueger --- src/jtag3.c | 24 ++++++++++++++---------- src/stk500v2.c | 30 +++++++++++++++++------------- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/jtag3.c b/src/jtag3.c index 4a9c4df1..b18dc844 100644 --- a/src/jtag3.c +++ b/src/jtag3.c @@ -1117,13 +1117,13 @@ static int jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { // Read or write SUFFER register if (PDATA(pgm)->suffer_get || PDATA(pgm)->suffer_set) { // Read existing SUFFER value - if (jtag3_getparm(pgm, SCOPE_EDBG, MEDBG_REG_SUFFER_BANK + 0x10, MEDBG_REG_SUFFER_OFFSET, &(PDATA(pgm)->suffer_data[0]), 1) < 0) + if (jtag3_getparm(pgm, SCOPE_EDBG, MEDBG_REG_SUFFER_BANK + 0x10, MEDBG_REG_SUFFER_OFFSET, PDATA(pgm)->suffer_data, 1) < 0) return -1; if (!PDATA(pgm)->suffer_set) msg_info("SUFFER register value read as 0x%02x\n", PDATA(pgm)->suffer_data[0]); // Write new SUFFER value else { - if (jtag3_setparm(pgm, SCOPE_EDBG, MEDBG_REG_SUFFER_BANK + 0x10, MEDBG_REG_SUFFER_OFFSET, &(PDATA(pgm)->suffer_data[1]), 1) < 0) + if (jtag3_setparm(pgm, SCOPE_EDBG, MEDBG_REG_SUFFER_BANK + 0x10, MEDBG_REG_SUFFER_OFFSET, PDATA(pgm)->suffer_data+1, 1) < 0) return -1; msg_info("SUFFER register value changed from 0x%02x to 0x%02x\n", PDATA(pgm)->suffer_data[0], PDATA(pgm)->suffer_data[1]); } @@ -1132,13 +1132,13 @@ static int jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { // Read or write Vtarg switch if (PDATA(pgm)->vtarg_switch_get || PDATA(pgm)->vtarg_switch_set) { // Read existing Vtarg switch value - if (jtag3_getparm(pgm, SCOPE_EDBG, EDBG_CTXT_CONTROL, EDBG_CONTROL_TARGET_POWER, &(PDATA(pgm)->vtarg_switch_data[0]), 1) < 0) + if (jtag3_getparm(pgm, SCOPE_EDBG, EDBG_CTXT_CONTROL, EDBG_CONTROL_TARGET_POWER, PDATA(pgm)->vtarg_switch_data, 1) < 0) return -1; if (!PDATA(pgm)->vtarg_switch_set) - msg_info("Vtarg switch setting read as %u. Target power is switched %s\n", PDATA(pgm)->vtarg_switch_data[0], PDATA(pgm)->vtarg_switch_data[0] ? "on" : "off"); + msg_info("Vtarg switch setting read as %u: target power is switched %s\n", PDATA(pgm)->vtarg_switch_data[0], PDATA(pgm)->vtarg_switch_data[0] ? "on" : "off"); // Write Vtarg switch value else { - if (jtag3_setparm(pgm, SCOPE_EDBG, EDBG_CTXT_CONTROL, EDBG_CONTROL_TARGET_POWER, &(PDATA(pgm)->vtarg_switch_data[1]), 1) < 0) + if (jtag3_setparm(pgm, SCOPE_EDBG, EDBG_CTXT_CONTROL, EDBG_CONTROL_TARGET_POWER, PDATA(pgm)->vtarg_switch_data+1, 1) < 0) return -1; msg_info("Vtarg switch setting changed from %u to %u\n", PDATA(pgm)->vtarg_switch_data[0], PDATA(pgm)->vtarg_switch_data[1]); } @@ -1482,7 +1482,7 @@ static int jtag3_parseextparms(const PROGRAMMER *pgm, const LISTID extparms) { // SUFFER bits // Bit 7 ARDUINO: Adds control of extra LEDs when set to 0 - // Bit 6..3: Reserved (masked out with 0x78 in the code below) + // Bit 6..3: Reserved (must be set to 1) // Bit 2 EOF: Agressive power-down, sleep after 5 seconds if no USB enumeration when set to 0 // Bit 1 LOWP: forces running at 1 MHz when bit set to 0 // Bit 0 FUSE: Fuses are safe-masked when bit sent to 1 Fuses are unprotected when set to 0 @@ -1490,12 +1490,16 @@ static int jtag3_parseextparms(const PROGRAMMER *pgm, const LISTID extparms) { if(pgm->extra_features & HAS_SUFFER) { // Set SUFFER value if (matches(extended_param, "suffer=")) { - int sscanf_success = sscanf(extended_param, "suffer=%hhx", (&PDATA(pgm)->suffer_data[1])); - if (sscanf_success < 1 || ( ~PDATA(pgm)->suffer_data[1] & 0x78)) { - pmsg_error("invalid suffer value '%s'\n", extended_param); + if (sscanf(extended_param, "suffer=%hhi", PDATA(pgm)->suffer_data+1) < 1) { + pmsg_error("invalid -xsuffer= '%s'\n", extended_param); rv = -1; break; } + if((PDATA(pgm)->suffer_data[1] & 0x78) != 0x78) { + PDATA(pgm)->suffer_data[1] |= 0x78; + pmsg_info("setting -xsuffer=0x%02x so that reserved bits 3..6 are set\n", + PDATA(pgm)->suffer_data[1]); + } PDATA(pgm)->suffer_set = true; } // Get SUFFER value @@ -1509,7 +1513,7 @@ static int jtag3_parseextparms(const PROGRAMMER *pgm, const LISTID extparms) { if(pgm->extra_features & HAS_VTARG_SWITCH) { // Set Vtarget switch value if (matches(extended_param, "vtarg_switch=")) { - int sscanf_success = sscanf(extended_param, "vtarg_switch=%hhu", (&PDATA(pgm)->vtarg_switch_data[1])); + int sscanf_success = sscanf(extended_param, "vtarg_switch=%hhi", PDATA(pgm)->vtarg_switch_data+1); if (sscanf_success < 1 || PDATA(pgm)->vtarg_switch_data[1] > 1) { pmsg_error("invalid vtarg_switch value '%s'\n", extended_param); rv = -1; diff --git a/src/stk500v2.c b/src/stk500v2.c index 510818e6..f8d66804 100644 --- a/src/stk500v2.c +++ b/src/stk500v2.c @@ -1318,30 +1318,30 @@ static int stk500v2_jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { // Read or write SUFFER register if (PDATA(pgm)->suffer_get || PDATA(pgm)->suffer_set) { // Read existing SUFFER value - if (jtag3_getparm(pgmcp, SCOPE_EDBG, MEDBG_REG_SUFFER_BANK + 0x10, MEDBG_REG_SUFFER_OFFSET, &(PDATA(pgm)->suffer_data[0]), 1) < 0) + if (jtag3_getparm(pgmcp, SCOPE_EDBG, MEDBG_REG_SUFFER_BANK + 0x10, MEDBG_REG_SUFFER_OFFSET, PDATA(pgm)->suffer_data, 1) < 0) return -1; if (!PDATA(pgm)->suffer_set) - msg_info("SUFFER register value read as 0x%02x\n", PDATA(pgm)->suffer_data[0]); + imsg_info("SUFFER register value read as 0x%02x\n", PDATA(pgm)->suffer_data[0]); // Write new SUFFER value else { - if (jtag3_setparm(pgmcp, SCOPE_EDBG, MEDBG_REG_SUFFER_BANK + 0x10, MEDBG_REG_SUFFER_OFFSET, &(PDATA(pgm)->suffer_data[1]), 1) < 0) + if (jtag3_setparm(pgmcp, SCOPE_EDBG, MEDBG_REG_SUFFER_BANK + 0x10, MEDBG_REG_SUFFER_OFFSET, PDATA(pgm)->suffer_data+1, 1) < 0) return -1; - msg_info("SUFFER register value changed from 0x%02x to 0x%02x\n", PDATA(pgm)->suffer_data[0], PDATA(pgm)->suffer_data[1]); + imsg_info("SUFFER register value changed from 0x%02x to 0x%02x\n", PDATA(pgm)->suffer_data[0], PDATA(pgm)->suffer_data[1]); } } // Read or write Vtarg switch if (PDATA(pgm)->vtarg_switch_get || PDATA(pgm)->vtarg_switch_set) { // Read existing Vtarg switch value - if (jtag3_getparm(pgmcp, SCOPE_EDBG, EDBG_CTXT_CONTROL, EDBG_CONTROL_TARGET_POWER, &(PDATA(pgm)->vtarg_switch_data[0]), 1) < 0) + if (jtag3_getparm(pgmcp, SCOPE_EDBG, EDBG_CTXT_CONTROL, EDBG_CONTROL_TARGET_POWER, PDATA(pgm)->vtarg_switch_data, 1) < 0) return -1; if (!PDATA(pgm)->vtarg_switch_set) - msg_info("Vtarg switch setting read as %u. Target power is switched %s\n", PDATA(pgm)->vtarg_switch_data[0], PDATA(pgm)->vtarg_switch_data[0] ? "on" : "off"); + imsg_info("Vtarg switch setting read as %u: target power is switched %s\n", PDATA(pgm)->vtarg_switch_data[0], PDATA(pgm)->vtarg_switch_data[0] ? "on" : "off"); // Write Vtarg switch value else { - if (jtag3_setparm(pgmcp, SCOPE_EDBG, EDBG_CTXT_CONTROL, EDBG_CONTROL_TARGET_POWER, &(PDATA(pgm)->vtarg_switch_data[1]), 1) < 0) + if (jtag3_setparm(pgmcp, SCOPE_EDBG, EDBG_CTXT_CONTROL, EDBG_CONTROL_TARGET_POWER, PDATA(pgm)->vtarg_switch_data+1, 1) < 0) return -1; - msg_info("Vtarg switch setting changed from %u to %u\n", PDATA(pgm)->vtarg_switch_data[0], PDATA(pgm)->vtarg_switch_data[1]); + imsg_info("Vtarg switch setting changed from %u to %u\n", PDATA(pgm)->vtarg_switch_data[0], PDATA(pgm)->vtarg_switch_data[1]); } } @@ -1568,7 +1568,7 @@ static int stk500v2_jtag3_parseextparms(const PROGRAMMER *pgm, const LISTID extp // SUFFER bits // Bit 7 ARDUINO: Adds control of extra LEDs when set to 0 - // Bit 6..3: Reserved (masked out with 0x78 in the code below) + // Bit 6..3: Reserved (must be set to 1) // Bit 2 EOF: Agressive power-down, sleep after 5 seconds if no USB enumeration when set to 0 // Bit 1 LOWP: forces running at 1 MHz when bit set to 0 // Bit 0 FUSE: Fuses are safe-masked when bit sent to 1 Fuses are unprotected when set to 0 @@ -1576,12 +1576,16 @@ static int stk500v2_jtag3_parseextparms(const PROGRAMMER *pgm, const LISTID extp if(pgm->extra_features & HAS_SUFFER) { // Set SUFFER value if (strncmp(extended_param, "suffer=", strlen("suffer=")) == 0) { - int sscanf_success = sscanf(extended_param, "suffer=%hhx", (&PDATA(pgm)->suffer_data[1])); - if (sscanf_success < 1 || (~PDATA(pgm)->suffer_data[1] & 0x78)) { - pmsg_error("invalid suffer value '%s'\n", extended_param); + if (sscanf(extended_param, "suffer=%hhi", PDATA(pgm)->suffer_data+1) < 1) { + pmsg_error("invalid -xsuffer= '%s'\n", extended_param); rv = -1; break; } + if((PDATA(pgm)->suffer_data[1] & 0x78) != 0x78) { + PDATA(pgm)->suffer_data[1] |= 0x78; + pmsg_info("setting -xsuffer=0x%02x so that reserved bits 3..6 are set\n", + PDATA(pgm)->suffer_data[1]); + } PDATA(pgm)->suffer_set = true; } // Get SUFFER value @@ -1595,7 +1599,7 @@ static int stk500v2_jtag3_parseextparms(const PROGRAMMER *pgm, const LISTID extp if(pgm->extra_features & HAS_VTARG_SWITCH) { // Set Vtarget switch value if (strncmp(extended_param, "vtarg_switch=", strlen("vtarg_switch=")) == 0) { - int sscanf_success = sscanf(extended_param, "vtarg_switch=%hhu", (&PDATA(pgm)->vtarg_switch_data[1])); + int sscanf_success = sscanf(extended_param, "vtarg_switch=%hhi", PDATA(pgm)->vtarg_switch_data+1); if (sscanf_success < 1 || PDATA(pgm)->vtarg_switch_data[1] > 1) { pmsg_error("invalid vtarg_switch value '%s'\n", extended_param); rv = -1;