diff --git a/examples_x035/blink/blink.c b/examples_x035/blink/blink.c index 61199a8157db9db48eac855e1dac263b6d12b8fd..234a8c5f8319a9c423c1a309e3283f4ad47a93ae 100644 --- a/examples_x035/blink/blink.c +++ b/examples_x035/blink/blink.c @@ -11,21 +11,12 @@ int main() while(1) { - funDigitalWrite( PA0, FUN_HIGH ); // Turn on GPIO - funDigitalWrite( PA0, FUN_HIGH ); // Turn on GPIO - funDigitalWrite( PA0, FUN_HIGH ); // Turn on GPIO - funDigitalWrite( PA0, FUN_HIGH ); // Turn on GPIO - funDigitalWrite( PA0, FUN_HIGH ); // Turn on GPIO funDigitalWrite( PA0, FUN_HIGH ); // Turn on GPIO //Delay_Ms( 1000 ); funDigitalWrite( PA0, FUN_LOW ); // Turn off GPIO - funDigitalWrite( PA0, FUN_LOW ); // Turn off GPIO - funDigitalWrite( PA0, FUN_LOW ); // Turn off GPIO - funDigitalWrite( PA0, FUN_LOW ); // Turn off GPIO - funDigitalWrite( PA0, FUN_LOW ); // Turn off GPIO - funDigitalWrite( PA0, FUN_LOW ); // Turn off GPIO - funDigitalWrite( PA0, FUN_LOW ); // Turn off GPIO - funDigitalWrite( PA0, FUN_LOW ); // Turn off GPIO //Delay_Ms( 1000 ); + funDigitalWrite( PA0, FUN_HIGH ); // Turn on GPIO + asm volatile( "c.nop" ); + funDigitalWrite( PA0, FUN_LOW ); // Turn off GPIO } } diff --git a/minichlink/minichlink.h b/minichlink/minichlink.h index 170667f9abe4ce1d78001bda1d9316d5a4f839e5..6266cbb910a32700d4554e7cf22d1d46539ef32d 100644 --- a/minichlink/minichlink.h +++ b/minichlink/minichlink.h @@ -111,7 +111,8 @@ enum RiscVChip { CHIP_CH32V20x = 0x05, CHIP_CH32V30x = 0x06, CHIP_CH58x = 0x07, - CHIP_CH32V003 = 0x09 + CHIP_CH32V003 = 0x09, + CHIP_CH32X03x = 0x1000, // TODO: Figure out how to get the programmer to really tell us what this is. }; struct InternalState diff --git a/minichlink/pgm-wch-linke.c b/minichlink/pgm-wch-linke.c index b7250bd9a25fac1abacf0dc0a9a588a91eea1333..6835298064f31bb2f7d735424b622904f28b94fb 100644 --- a/minichlink/pgm-wch-linke.c +++ b/minichlink/pgm-wch-linke.c @@ -37,6 +37,9 @@ static void printChipInfo(enum RiscVChip chip) { case CHIP_CH58x: fprintf(stderr, "Detected: CH58x\n"); break; + case CHIP_CH32X03x: + fprintf(stderr, "Detected: CH32X03x\n"); + break; case CHIP_CH32V003: fprintf(stderr, "Detected: CH32V003\n"); break; @@ -46,6 +49,7 @@ static void printChipInfo(enum RiscVChip chip) { static int checkChip(enum RiscVChip chip) { switch(chip) { case CHIP_CH32V003: + case CHIP_CH32X03x: return 0; // Use direct mode case CHIP_CH32V10x: case CHIP_CH32V20x: @@ -333,12 +337,13 @@ static int LESetupInterface( void * d ) if( is_already_connected ) { printf( "Already Connected\n" ); + // Still need to read in the data so we can select the correct chip. + wch_link_command( dev, "\x81\x0d\x01\x02", 4, (int*)&transferred, rbuff, 1024 ); // ?? this seems to work? break; } is_already_connected = 1; } - wch_link_command( dev, "\x81\x0d\x01\x02", 4, (int*)&transferred, rbuff, 1024 ); // Reply: Ignored, 820d050900300500 if (rbuff[0] == 0x81 && rbuff[1] == 0x55 && rbuff[2] == 0x01 ) // && rbuff[3] == 0x01 ) { @@ -382,26 +387,13 @@ static int LESetupInterface( void * d ) enum RiscVChip chip = (enum RiscVChip)rbuff[3]; printChipInfo(chip); - int result = checkChip(chip); - if( result == 1 ) // Using blob write - { - fprintf( stderr, "Using binary blob write for operation.\n" ); - MCF.WriteBinaryBlob = LEWriteBinaryBlob; - - iss->sector_size = 256; - - wch_link_command( dev, "\x81\x0d\x01\x03", 4, (int*)&transferred, rbuff, 1024 ); // Reply: Ignored, 820d050900300500 - } else if( result < 0 ) { - fprintf( stderr, "Chip type not supported. Aborting...\n" ); - return -1; - } - iss->target_chip_type = chip; // For some reason, if we don't do this sometimes the programmer starts in a hosey mode. MCF.WriteReg32( d, DMCONTROL, 0x80000001 ); // Make the debug module work properly. MCF.WriteReg32( d, DMCONTROL, 0x80000001 ); // Initiate a halt request. - MCF.WriteReg32( d, DMCONTROL, 0x80000001 ); // No, really make sure. + MCF.WriteReg32( d, DMCONTROL, 0x80000003 ); // No, really make sure, and also super halt processor. + MCF.WriteReg32( d, DMCONTROL, 0x80000001 ); // Un-super-halt processor. MCF.WriteReg32( d, DMABSTRACTCS, 0x00000700 ); // Ignore any pending errors. MCF.WriteReg32( d, DMABSTRACTAUTO, 0 ); MCF.WriteReg32( d, DMCOMMAND, 0x00221000 ); // Read x0 (Null command) with nopostexec (to fix v307 read issues) @@ -428,11 +420,34 @@ static int LESetupInterface( void * d ) fprintf( stderr, "Error: could not get part status\n" ); return -1; } - fprintf( stderr, "Flash Storage: %d kB\n", (rbuff[2]<<8) | rbuff[3] ); // Is this Flash size? + int flash_size = (rbuff[2]<<8) | rbuff[3]; + fprintf( stderr, "Flash Storage: %d kB\n", flash_size ); // Is this Flash size? fprintf( stderr, "Part UUID : %02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\n", rbuff[4], rbuff[5], rbuff[6], rbuff[7], rbuff[8], rbuff[9], rbuff[10], rbuff[11] ); fprintf( stderr, "PFlags : %02x-%02x-%02x-%02x\n", rbuff[12], rbuff[13], rbuff[14], rbuff[15] ); fprintf( stderr, "Part Type (B): %02x-%02x-%02x-%02x\n", rbuff[16], rbuff[17], rbuff[18], rbuff[19] ); + if( iss->target_chip_type == CHIP_CH32V10x && flash_size == 62 ) + { + fprintf( stderr, "While the debugger reports this as a CH32V10x, it's probably a CH32X03x\n" ); + chip = iss->target_chip_type = CHIP_CH32X03x; + iss->sector_size = 256; + } + + int result = checkChip(chip); + if( result == 1 ) // Using blob write + { + fprintf( stderr, "Using binary blob write for operation.\n" ); + MCF.WriteBinaryBlob = LEWriteBinaryBlob; + + iss->sector_size = 256; + + wch_link_command( dev, "\x81\x0d\x01\x03", 4, (int*)&transferred, rbuff, 1024 ); // Reply: Ignored, 820d050900300500 + } else if( result < 0 ) { + fprintf( stderr, "Chip type not supported. Aborting...\n" ); + return -1; + } + + // Check for read protection wch_link_command( dev, "\x81\x06\x01\x01", 4, (int*)&transferred, rbuff, 1024 ); if(transferred != 4) { @@ -790,6 +805,13 @@ static int LEWriteBinaryBlob( void * d, uint32_t address_to_write, uint32_t len, WCHCHECK( libusb_bulk_transfer( (libusb_device_handle *)dev, 0x02, blob+pplace, iss->sector_size, &transferred, WCHTIMEOUT ) ); } } + + uint32_t rr; + int r = MCF.ReadReg32( d, DMABSTRACTCS, &rr ); + printf( "PLX HALT %08x %d\n", rr, r ); + + r = MCF.ReadReg32( d, DMSTATUS, &rr ); + printf( "PLX HALT %08x %d\n", rr, r ); return 0; }