From 696decb5eee7c6c37b56800b5beff58efc0b64dd Mon Sep 17 00:00:00 2001 From: MX682X <58419867+MX682X@users.noreply.github.com> Date: Sat, 14 Jun 2025 11:50:22 +0200 Subject: [PATCH 1/3] maybe fix fuse reads on Attiny15 --- src/pickit5.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/pickit5.c b/src/pickit5.c index 6429bb82..9b248f52 100644 --- a/src/pickit5.c +++ b/src/pickit5.c @@ -1651,7 +1651,7 @@ static int pickit5_isp_read_fuse(const PROGRAMMER *pgm, const AVRMEM *mem, unsig unsigned char read_fuse_isp [] = { // As we pull the command from avrdude's conf file, this isn't limited to fuses 0x90, 0x00, 0x32, 0x00, 0x00, 0x00, // load 0x32 to r00 0x1E, 0x37, 0x00, // Enable Programming? - 0x9F, // Send status from temp_reg to host + //0x9F, // Send status from temp_reg to host 0xA8, 0x00, 0x00, 0x00, 0x00, // ??? 0x90, 0x01, (cmd >> 24), (cmd >> 16), (cmd >> 8), cmd, // load programming command to r01 (swapped bitorder) 0x9B, 0x02, 0x03, // Load 0x03 to r02 @@ -1671,15 +1671,15 @@ static int pickit5_isp_read_fuse(const PROGRAMMER *pgm, const AVRMEM *mem, unsig pmsg_error("read fuse script failed\n"); return -1; } - if(0x02 != my.rxBuf[20]) { // Length + if(0x01 != my.rxBuf[20]) { // Length pmsg_error("unexpected amount (%d) of bytes returned\n", my.rxBuf[20]); return -1; } - if(0x00 != my.rxBuf[24]) { - pmsg_error("failed to start fuse read operation (%d)\n", my.rxBuf[24]); - return -1; - } - *value = my.rxBuf[25]; // Return value + //if(0x00 != my.rxBuf[24]) { + // pmsg_error("failed to start fuse read operation (%d)\n", my.rxBuf[24]); + // return -1; + //} + *value = my.rxBuf[24]; // Return value return 1; } From c382bd5d1ef123c475a4a9dd4bfd0576d24561f5 Mon Sep 17 00:00:00 2001 From: MX682X <58419867+MX682X@users.noreply.github.com> Date: Wed, 18 Jun 2025 21:43:12 +0200 Subject: [PATCH 2/3] fix Attiny15 fuse readback --- src/pickit5.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/pickit5.c b/src/pickit5.c index 9b248f52..f908203c 100644 --- a/src/pickit5.c +++ b/src/pickit5.c @@ -1637,6 +1637,10 @@ static int pickit5_isp_write_fuse(const PROGRAMMER *pgm, const AVRMEM *mem, unsi pmsg_error("failed to start fuse write operation(%d)\n", my.rxBuf[24]); return -1; } + + /* fix slow AVRs without write status polling. Performance impact shouldn't be + * noticable, as it's just for fuse writes and less then 10ms */ + usleep(mem->min_write_delay); return 1; } @@ -1651,7 +1655,7 @@ static int pickit5_isp_read_fuse(const PROGRAMMER *pgm, const AVRMEM *mem, unsig unsigned char read_fuse_isp [] = { // As we pull the command from avrdude's conf file, this isn't limited to fuses 0x90, 0x00, 0x32, 0x00, 0x00, 0x00, // load 0x32 to r00 0x1E, 0x37, 0x00, // Enable Programming? - //0x9F, // Send status from temp_reg to host + 0x9F, // Send status from temp_reg to host 0xA8, 0x00, 0x00, 0x00, 0x00, // ??? 0x90, 0x01, (cmd >> 24), (cmd >> 16), (cmd >> 8), cmd, // load programming command to r01 (swapped bitorder) 0x9B, 0x02, 0x03, // Load 0x03 to r02 @@ -1671,15 +1675,15 @@ static int pickit5_isp_read_fuse(const PROGRAMMER *pgm, const AVRMEM *mem, unsig pmsg_error("read fuse script failed\n"); return -1; } - if(0x01 != my.rxBuf[20]) { // Length + if(0x02 != my.rxBuf[20]) { // Length pmsg_error("unexpected amount (%d) of bytes returned\n", my.rxBuf[20]); return -1; } - //if(0x00 != my.rxBuf[24]) { - // pmsg_error("failed to start fuse read operation (%d)\n", my.rxBuf[24]); - // return -1; - //} - *value = my.rxBuf[24]; // Return value + if(0x00 != my.rxBuf[24]) { + pmsg_error("failed to start fuse read operation (%d)\n", my.rxBuf[24]); + return -1; + } + *value = my.rxBuf[25]; // Return value return 1; } From 739295bd05f3892ec0455cd81e7d3c454c2d6267 Mon Sep 17 00:00:00 2001 From: MX682X <58419867+MX682X@users.noreply.github.com> Date: Thu, 19 Jun 2025 08:05:26 +0200 Subject: [PATCH 3/3] delay guard against negative values --- src/pickit5.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/pickit5.c b/src/pickit5.c index f908203c..975c9884 100644 --- a/src/pickit5.c +++ b/src/pickit5.c @@ -1639,8 +1639,12 @@ static int pickit5_isp_write_fuse(const PROGRAMMER *pgm, const AVRMEM *mem, unsi } /* fix slow AVRs without write status polling. Performance impact shouldn't be - * noticable, as it's just for fuse writes and less then 10ms */ - usleep(mem->min_write_delay); + * noticable, as it's just for fuse writes and less then 10ms per fuse + */ + int delay = mem->min_write_delay; + if (delay > 0) { + usleep(delay); + } return 1; }