diff --git a/minichlink/minichlink.c b/minichlink/minichlink.c index 41509236e105a68064d94515338dc3d7bed46bef..83c4de73398d30538281cfd603105e3e417926d2 100644 --- a/minichlink/minichlink.c +++ b/minichlink/minichlink.c @@ -18,6 +18,11 @@ void Sleep(uint32_t dwMilliseconds); #include <unistd.h> #endif + +#if defined(WINDOWS) || defined(WIN32) || defined(_WIN32) + #define usleep(x) Sleep((x)/1000); +#endif + static int64_t StringToMemoryAddress( const char * number ) __attribute__((used)); static void StaticUpdatePROGBUFRegs( void * dev ) __attribute__((used)); int DefaultReadBinaryBlob( void * dev, uint32_t address_to_read_from, uint32_t read_size, uint8_t * blob ); @@ -543,7 +548,7 @@ keep_going: fprintf( stderr, "Error: File I/O Fault.\n" ); exit( -10 ); } - if( len > 16384 ) + if( len > iss->flash_size ) { fprintf( stderr, "Error: Image for CH32V003 too large (%d)\n", len ); exit( -9 ); @@ -733,7 +738,7 @@ int DefaultSetupInterface( void * dev ) struct InternalState * iss = (struct InternalState*)(((struct ProgrammerStructBase*)dev)->internal); if( MCF.Control3v3 ) MCF.Control3v3( dev, 1 ); - if( MCF.DelayUS ) MCF.DelayUS( dev, 16000 ); + MCF.DelayUS( dev, 16000 ); MCF.WriteReg32( dev, DMSHDWCFGR, 0x5aa50000 | (1<<10) ); // Shadow Config Reg MCF.WriteReg32( dev, DMCFGR, 0x5aa50000 | (1<<10) ); // CFGR (1<<10 == Allow output from slave) MCF.WriteReg32( dev, DMCFGR, 0x5aa50000 | (1<<10) ); // Bug in silicon? If coming out of cold boot, and we don't do our little "song and dance" this has to be called. @@ -1230,7 +1235,7 @@ int DefaultWriteBinaryBlob( void * dev, uint32_t address_to_write, uint32_t blob } #endif - if(MCF.DelayUS) MCF.DelayUS( dev, 100 ); // Why do we need this? (We seem to need this on the WCH programmers?) + MCF.DelayUS( dev, 100 ); // Why do we need this? (We seem to need this on the WCH programmers?) return 0; timedout: fprintf( stderr, "Timed out\n" ); @@ -1610,6 +1615,10 @@ static int DefaultHaltMode( void * dev, int mode ) iss->flash_unlocked = 0; iss->processor_in_mode = mode; + + // In case processor halt process needs to complete, i.e. if it was in the middle of a flash op. + MCF.DelayUS( dev, 3000 ); + return 0; } @@ -1709,13 +1718,7 @@ int DefaultUnbrick( void * dev ) if( MCF.DelayUS ) MCF.DelayUS( dev, 20000 ); else - { -#if defined(WINDOWS) || defined(WIN32) || defined(_WIN32) - Sleep(20); -#else usleep(20000); -#endif - } if( timeout == max_timeout ) { @@ -1773,6 +1776,12 @@ int DefaultVoidHighLevelState( void * dev ) return 0; } +int DefaultDelayUS( void * dev, int us ) +{ + usleep( us ); + return 0; +} + int SetupAutomaticHighLevelFunctions( void * dev ) { // Will populate high-level functions from low-level functions. @@ -1827,11 +1836,14 @@ int SetupAutomaticHighLevelFunctions( void * dev ) MCF.ConfigureNRSTAsGPIO = DefaultConfigureNRSTAsGPIO; if( !MCF.VoidHighLevelState ) MCF.VoidHighLevelState = DefaultVoidHighLevelState; + if( !MCF.DelayUS ) + MCF.DelayUS = DefaultDelayUS; struct InternalState * iss = calloc( 1, sizeof( struct InternalState ) ); iss->ram_base = 0x20000000; iss->ram_size = 2048; iss->sector_size = 64; + iss->flash_size = 16384; ((struct ProgrammerStructBase*)dev)->internal = iss; return 0; diff --git a/minichlink/minichlink.h b/minichlink/minichlink.h index 2992e5f93193bcdca57e4cdf6e3230c2c2a3cb8c..50f859cebb757ec913694c7809a2d35ce738e1dd 100644 --- a/minichlink/minichlink.h +++ b/minichlink/minichlink.h @@ -115,6 +115,7 @@ struct InternalState uint32_t ram_base; uint32_t ram_size; int sector_size; + int flash_size; uint8_t flash_sector_status[MAX_FLASH_SECTORS]; // 0 means unerased/unknown. 1 means erased. };