From 7744d805d94ff440557d532ebdbe9f04ff60e34d Mon Sep 17 00:00:00 2001 From: MCUdude Date: Thu, 25 Jun 2026 08:31:22 +0200 Subject: [PATCH 1/4] Always set Xmega JTAG bit clock when using PICkit4 or SNAP If the bitclock isn't explicity set, the programmer crashes and needs a power cycle to recover --- src/jtag3.c | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/jtag3.c b/src/jtag3.c index f3560bde..178d29b9 100644 --- a/src/jtag3.c +++ b/src/jtag3.c @@ -1068,16 +1068,28 @@ static int jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { my.set_sck = jtag3_set_sck_mega_jtag; } - if(pgm->bitclock && my.set_sck) { - unsigned int clock = 1E-3/pgm->bitclock; // kHz + if(my.set_sck) { + unsigned int xmega_default_jtag_bitclock = 0; - if(!(pgm->extra_features & HAS_BITCLOCK_ADJ)) - pmsg_warning("setting bitclock despite HAS_BITCLOCK_ADJ missing in pgm->extra_features\n"); - pmsg_notice2("%s(): trying to set JTAG clock to %u kHz\n", __func__, clock); - parm[0] = clock & 0xff; - parm[1] = (clock >> 8) & 0xff; - if(my.set_sck(pgm, parm) < 0) - return -1; + if(!pgm->bitclock) { + // ICkit 4 and SNAP requires the bitclock to be explicity set when programming Xmegas using JTAG + if(my.set_sck == jtag3_set_sck_xmega_jtag && (str_starts(pgmid, "pickit4") || str_starts(pgmid, "snap"))) { + xmega_default_jtag_bitclock = 7500; // Use a default Xmega JTAG bitclock of 7500 kHz + pmsg_notice2("%s(): programmer requires a JTAG clock speed to be specified\n", __func__); + } + } + + if(pgm->bitclock || xmega_default_jtag_bitclock) { + unsigned int clock = pgm->bitclock? 1E-3/pgm->bitclock: xmega_default_jtag_bitclock; // kHz + + if(!(pgm->extra_features & HAS_BITCLOCK_ADJ)) + pmsg_warning("setting bitclock despite HAS_BITCLOCK_ADJ missing in pgm->extra_features\n"); + pmsg_notice2("%s(): trying to set JTAG clock to %u kHz\n", __func__, clock); + parm[0] = clock & 0xff; + parm[1] = (clock >> 8) & 0xff; + if(my.set_sck(pgm, parm) < 0) + return -1; + } } if(conn == PARM3_CONN_JTAG) { From 89f0b33780c928956bcf5d7784ac6831eefefc19 Mon Sep 17 00:00:00 2001 From: MCUdude Date: Thu, 25 Jun 2026 09:18:51 +0200 Subject: [PATCH 2/4] Fix typos in comment --- src/jtag3.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jtag3.c b/src/jtag3.c index 178d29b9..62a86c73 100644 --- a/src/jtag3.c +++ b/src/jtag3.c @@ -1072,7 +1072,7 @@ static int jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { unsigned int xmega_default_jtag_bitclock = 0; if(!pgm->bitclock) { - // ICkit 4 and SNAP requires the bitclock to be explicity set when programming Xmegas using JTAG + // PICkit 4 and SNAP requires the bitclock to be explicitly set when programming Xmegas using JTAG if(my.set_sck == jtag3_set_sck_xmega_jtag && (str_starts(pgmid, "pickit4") || str_starts(pgmid, "snap"))) { xmega_default_jtag_bitclock = 7500; // Use a default Xmega JTAG bitclock of 7500 kHz pmsg_notice2("%s(): programmer requires a JTAG clock speed to be specified\n", __func__); From 21ff6751f458b7c1ef7aa13979de815106386cba Mon Sep 17 00:00:00 2001 From: MCUdude Date: Thu, 25 Jun 2026 20:18:47 +0200 Subject: [PATCH 3/4] Only force a default JTAG clock speed of 7.5MHz if the stored value is actually invalid --- src/jtag3.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/jtag3.c b/src/jtag3.c index 62a86c73..cdda70b1 100644 --- a/src/jtag3.c +++ b/src/jtag3.c @@ -1073,9 +1073,14 @@ static int jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { if(!pgm->bitclock) { // PICkit 4 and SNAP requires the bitclock to be explicitly set when programming Xmegas using JTAG + // However, we will not set a new bit clock value if it already has a valid clock speed if(my.set_sck == jtag3_set_sck_xmega_jtag && (str_starts(pgmid, "pickit4") || str_starts(pgmid, "snap"))) { - xmega_default_jtag_bitclock = 7500; // Use a default Xmega JTAG bitclock of 7500 kHz - pmsg_notice2("%s(): programmer requires a JTAG clock speed to be specified\n", __func__); + double bclk = 0; + pgm->get_sck_period(pgm, &bclk); + if(1/bclk < 32e3 || 1/bclk > 7500e3) {// Invalid clock speed. Should be between 32kHz - 7.5MHz + xmega_default_jtag_bitclock = 7500; // Use a default Xmega JTAG bitclock of 7500 kHz + pmsg_notice2("%s(): programmer has an invalid JTAG clock speed. Setting default speed\n", __func__); + } } } From 3f36b1a4a9214eb376fe3f1b5500dbdd2fd19889 Mon Sep 17 00:00:00 2001 From: MCUdude Date: Thu, 25 Jun 2026 23:24:46 +0200 Subject: [PATCH 4/4] add gaurd to pgm->get_sck_period() --- src/jtag3.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/jtag3.c b/src/jtag3.c index cdda70b1..1966439a 100644 --- a/src/jtag3.c +++ b/src/jtag3.c @@ -1076,7 +1076,8 @@ static int jtag3_initialize(const PROGRAMMER *pgm, const AVRPART *p) { // However, we will not set a new bit clock value if it already has a valid clock speed if(my.set_sck == jtag3_set_sck_xmega_jtag && (str_starts(pgmid, "pickit4") || str_starts(pgmid, "snap"))) { double bclk = 0; - pgm->get_sck_period(pgm, &bclk); + if(pgm->get_sck_period) + pgm->get_sck_period(pgm, &bclk); if(1/bclk < 32e3 || 1/bclk > 7500e3) {// Invalid clock speed. Should be between 32kHz - 7.5MHz xmega_default_jtag_bitclock = 7500; // Use a default Xmega JTAG bitclock of 7500 kHz pmsg_notice2("%s(): programmer has an invalid JTAG clock speed. Setting default speed\n", __func__);