From 49e75d024452d160eac650e3abc2dce6d1ee5a5a Mon Sep 17 00:00:00 2001 From: cnlohr <lohr85@gmail.com> Date: Fri, 9 Jun 2023 00:50:27 -0400 Subject: [PATCH] Fix a little OOO for ESP32S2 programmer + use 64-byte ops when it makes sense for flash writing. --- minichlink/minichlink.c | 28 ++++++++++++++++++---------- minichlink/pgm-esp32s2-ch32xx.c | 7 +++++-- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/minichlink/minichlink.c b/minichlink/minichlink.c index 4bcae53..33d871d 100644 --- a/minichlink/minichlink.c +++ b/minichlink/minichlink.c @@ -1052,23 +1052,31 @@ int DefaultWriteBinaryBlob( void * dev, uint32_t address_to_write, uint32_t blob { MCF.ReadBinaryBlob( dev, base, 64, tempblock ); - MCF.Erase( dev, base, 64, 0 ); - MCF.WriteWord( dev, 0x40022010, CR_PAGE_PG ); // THIS IS REQUIRED, (intptr_t)&FLASH->CTLR = 0x40022010 - MCF.WriteWord( dev, 0x40022010, CR_BUF_RST | CR_PAGE_PG ); // (intptr_t)&FLASH->CTLR = 0x40022010 - // Permute tempblock int tocopy = end_o_plus_one_in_block - offset_in_block; memcpy( tempblock + offset_in_block, blob + rsofar, tocopy ); rsofar += tocopy; - int j; - for( j = 0; j < 16; j++ ) + if( MCF.BlockWrite64 ) { - MCF.WriteWord( dev, j*4+base, *(uint32_t*)(tempblock + j * 4) ); - rsofar += 4; + int r = MCF.BlockWrite64( dev, base, tempblock ); + if( r ) return r; + } + else + { + MCF.Erase( dev, base, 64, 0 ); + MCF.WriteWord( dev, 0x40022010, CR_PAGE_PG ); // THIS IS REQUIRED, (intptr_t)&FLASH->CTLR = 0x40022010 + MCF.WriteWord( dev, 0x40022010, CR_BUF_RST | CR_PAGE_PG ); // (intptr_t)&FLASH->CTLR = 0x40022010 + + int j; + for( j = 0; j < 16; j++ ) + { + MCF.WriteWord( dev, j*4+base, *(uint32_t*)(tempblock + j * 4) ); + rsofar += 4; + } + MCF.WriteWord( dev, 0x40022014, base ); //0x40022014 -> FLASH->ADDR + MCF.WriteWord( dev, 0x40022010, CR_PAGE_PG|CR_STRT_Set ); // 0x40022010 -> FLASH->CTLR } - MCF.WriteWord( dev, 0x40022014, base ); //0x40022014 -> FLASH->ADDR - MCF.WriteWord( dev, 0x40022010, CR_PAGE_PG|CR_STRT_Set ); // 0x40022010 -> FLASH->CTLR if( MCF.WaitForFlash && MCF.WaitForFlash( dev ) ) goto timedout; } else diff --git a/minichlink/pgm-esp32s2-ch32xx.c b/minichlink/pgm-esp32s2-ch32xx.c index 7b02bbb..f20fc89 100644 --- a/minichlink/pgm-esp32s2-ch32xx.c +++ b/minichlink/pgm-esp32s2-ch32xx.c @@ -256,6 +256,7 @@ int ESPBlockWrite64( void * dev, uint32_t address_to_write, uint8_t * data ) if( timeout > 1000 ) { fprintf( stderr, "Error: Timed out block-writing 64\n" ); + return -49; } } while( eps->replylen < 2 ); @@ -364,7 +365,8 @@ int ESPPollTerminal( void * dev, uint8_t * buffer, int maxlen, uint32_t leavefla int rlen = eps->reply[0]; if( rlen < 1 ) return -8; -/* + +#if 0 int i; printf( "RESP (ML %d): %d\n", maxlen,eps->reply[0] ); @@ -375,7 +377,8 @@ int ESPPollTerminal( void * dev, uint8_t * buffer, int maxlen, uint32_t leavefla if( (i % 16) == 15 ) printf( "\n" ); } printf( "\n" ); -*/ +#endif + int errc = eps->reply[1]; if( errc > 7 ) return -7; -- GitLab