diff --git a/minichlink/minichlink.c b/minichlink/minichlink.c index 4bcae53678cb9d3b4f4c1e04d6ad414e55d35614..33d871d7d4d26100cd2b053b31da606f5a23cddb 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 7b02bbb40323e667a073bd95cfab4c3f4719dd02..f20fc89a7ce84fa4daea23469cbad4f11c636a12 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;