Skip to content

Commit d946a28

Browse files
authored
Merge pull request #658 from monte-monte/master
Fix unbrick. Enhance prints for b003boot init.
2 parents 7fb6ad9 + 8764386 commit d946a28

File tree

5 files changed

+51
-7
lines changed

5 files changed

+51
-7
lines changed

minichlink/minichlink.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3025,6 +3025,7 @@ int DefaultPollTerminal( void * dev, uint8_t * buffer, int maxlen, uint32_t leav
30253025

30263026
int DefaultUnbrick( void * dev )
30273027
{
3028+
if( MCF.ResetInterface) MCF.ResetInterface( dev );
30283029
printf( "Entering Unbrick Mode\n" );
30293030
if( MCF.Control5v ) MCF.Control5v( dev, 0 );
30303031
MCF.Control3v3( dev, 0 );
@@ -3039,7 +3040,7 @@ int DefaultUnbrick( void * dev )
30393040
MCF.FlushLLCommands( dev );
30403041

30413042
int timeout = 0;
3042-
int max_timeout = 50000; // An absurdly long time.
3043+
int max_timeout = 500; // An absurdly long time.
30433044
uint32_t ds = 0;
30443045
for( timeout = 0; timeout < max_timeout; timeout++ )
30453046
{
@@ -3059,6 +3060,7 @@ int DefaultUnbrick( void * dev )
30593060
}
30603061
MCF.FlushLLCommands( dev );
30613062
if( ds != 0xffffffff && ds != 0x00000000 ) break;
3063+
else fprintf( stderr, "%08x\n", ds );
30623064
}
30633065

30643066
if( timeout == max_timeout )

minichlink/minichlink.exe

512 Bytes
Binary file not shown.

minichlink/minichlink.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,10 @@ struct MiniChlinkFunctions
8181

8282
int (*WriteByte)( void * dev, uint32_t address_to_write, uint8_t data );
8383
int (*ReadByte)( void * dev, uint32_t address_to_read, uint8_t * data );
84-
int (*GetUUID)( void * dev, uint8_t * buffer );
85-
int (*SetClock)( void * dev, uint32_t clock );
86-
int (*EnableDebug)( void * dev, uint8_t disable );
84+
int (*GetUUID)( void * dev, uint8_t * buffer );
85+
int (*SetClock)( void * dev, uint32_t clock );
86+
int (*EnableDebug)( void * dev, uint8_t disable );
87+
int (*ResetInterface)( void * dev );
8788
};
8889

8990
/** If you are writing a driver, the minimal number of functions you can implement are:

minichlink/pgm-b003fun.c

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,11 +460,30 @@ static int B003FunSetupInterface( void * dev )
460460
struct InternalState * iss = (struct InternalState*)(((struct B003FunProgrammerStruct*)eps)->internal);
461461
iss->target_chip = &ch32v003;
462462
iss->target_chip_type = CHIP_CH32V003;
463-
iss->flash_size = 16*1024;
463+
iss->flash_size = 16;
464+
iss->ram_base = iss->target_chip->ram_base;
465+
iss->ram_size = iss->target_chip->ram_size;
466+
iss->sector_size = iss->target_chip->sector_size;
464467
printf( "Halting Boot Countdown\n" );
465468
ResetOp( eps );
466469
WriteOpArb( eps, halt_wait_blob, sizeof(halt_wait_blob) );
467470
if( CommitOp( eps ) ) return -5;
471+
472+
uint32_t one;
473+
int two;
474+
uint8_t read_protection;
475+
MCF.ReadWord( dev, 0x4002201c, &one );
476+
MCF.ReadWord( dev, 0x40022020, (uint32_t*)&two );
477+
478+
if( (one & 2) || two != -1 ) read_protection = 1;
479+
480+
uint8_t uuid[8];
481+
fprintf( stderr, "Detected %s\n", iss->target_chip->name_str );
482+
fprintf( stderr, "Flash Storage: %d kB\n", iss->flash_size );
483+
if( MCF.GetUUID( dev, uuid ) ) fprintf( stderr, "Couldn't read UUID\n" );
484+
else fprintf( stderr, "Part UUID: %02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\n", uuid[0], uuid[1], uuid[2], uuid[3], uuid[4], uuid[5], uuid[6], uuid[7] );
485+
// fprintf( stderr, "Part Type: %02x-%02x-%02x-%02x\n", part_type[3], part_type[2], part_type[1], part_type[0] );
486+
fprintf( stderr, "Read protection: %s\n", (read_protection > 0)?"enabled":"disabled" );
468487
return 0;
469488
}
470489

@@ -638,6 +657,19 @@ int B003PollTerminal( void * dev, uint8_t * buffer, int maxlen, uint32_t leavefl
638657
}
639658
}
640659

660+
static int B003FunGetUUID(void * dev, uint8_t * buffer)
661+
{
662+
int ret = 0;
663+
uint8_t local_buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0};
664+
665+
ret |= MCF.ReadWord( dev, 0x1ffff7e8, (uint32_t*)local_buffer );
666+
ret |= MCF.ReadWord( dev, 0x1ffff7ec, (uint32_t*)(local_buffer + 4) );
667+
668+
*((uint32_t*)buffer) = local_buffer[0]<<24|local_buffer[1]<<16|local_buffer[2]<<8|local_buffer[3];
669+
*(((uint32_t*)buffer)+1) = local_buffer[4]<<24|local_buffer[5]<<16|local_buffer[6]<<8|local_buffer[7];
670+
return ret;
671+
}
672+
641673
void * TryInit_B003Fun(uint32_t id)
642674
{
643675
hid_init();
@@ -705,6 +737,8 @@ void * TryInit_B003Fun(uint32_t id)
705737

706738
MCF.HaltMode = B003FunHaltMode;
707739

740+
MCF.GetUUID = B003FunGetUUID;
741+
708742
return eps;
709743
}
710744

minichlink/pgm-wch-linke.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,14 @@ int LEFlushLLCommands( void * dev )
292292
return 0;
293293
}
294294

295+
int LEResetInterface( void * d )
296+
{
297+
libusb_device_handle * dev = ((struct LinkEProgrammerStruct*)d)->devh;
298+
wch_link_command( dev, "\x81\x0d\x01\xff", 4, 0, 0, 0 );
299+
wch_link_command( dev, "\x81\x0d\x01\x01", 4, 0, 0, 0 );
300+
return 0;
301+
}
302+
295303
static int LESetupInterface( void * d )
296304
{
297305
libusb_device_handle * dev = ((struct LinkEProgrammerStruct*)d)->devh;
@@ -627,6 +635,7 @@ void * TryInit_WCHLinkE()
627635
MCF.WriteReg32 = LEWriteReg32;
628636
MCF.FlushLLCommands = LEFlushLLCommands;
629637

638+
MCF.ResetInterface = LEResetInterface;
630639
MCF.SetupInterface = LESetupInterface;
631640
MCF.Control3v3 = LEControl3v3;
632641
MCF.Control5v = LEControl5v;
@@ -1040,5 +1049,3 @@ static int LEWriteBinaryBlob( void * d, uint32_t address_to_write, uint32_t len,
10401049

10411050
return 0;
10421051
}
1043-
1044-

0 commit comments

Comments
 (0)