diff --git a/minichlink/minichlink.c b/minichlink/minichlink.c index 018b49ee9af0219855e5acfa1df163774b7bc65b..b1d1f4b96f2b1f7c2e7cdcbbd9b837fbe375d8d4 100644 --- a/minichlink/minichlink.c +++ b/minichlink/minichlink.c @@ -684,14 +684,21 @@ int DefaultSetupInterface( void * dev ) static void StaticUpdatePROGBUFRegs( void * dev ) { - MCF.WriteReg32( dev, DMDATA0, 0xe00000f4 ); // DATA0's location in memory. - MCF.WriteReg32( dev, DMCOMMAND, 0x0023100a ); // Copy data to x10 - MCF.WriteReg32( dev, DMDATA0, 0xe00000f8 ); // DATA1's location in memory. - MCF.WriteReg32( dev, DMCOMMAND, 0x0023100b ); // Copy data to x11 - MCF.WriteReg32( dev, DMDATA0, 0x40022010 ); //FLASH->CTLR - MCF.WriteReg32( dev, DMCOMMAND, 0x0023100c ); // Copy data to x12 + uint32_t rr; + if( MCF.ReadReg32( dev, DMHARTINFO, &rr ) ) + { + fprintf( stderr, "Error: Could not get hart info.\n" ); + return; + } + uint32_t data0offset = 0xe0000000 | ( rr & 0x7ff ); + MCF.WriteReg32( dev, DMDATA0, data0offset ); // DATA0's location in memory. + MCF.WriteReg32( dev, DMCOMMAND, 0x0023100a ); // Copy data to x10 + MCF.WriteReg32( dev, DMDATA0, data0offset + 4 ); // DATA1's location in memory. + MCF.WriteReg32( dev, DMCOMMAND, 0x0023100b ); // Copy data to x11 + MCF.WriteReg32( dev, DMDATA0, 0x40022010 ); // FLASH->CTLR + MCF.WriteReg32( dev, DMCOMMAND, 0x0023100c ); // Copy data to x12 MCF.WriteReg32( dev, DMDATA0, CR_PAGE_PG|CR_BUF_LOAD); - MCF.WriteReg32( dev, DMCOMMAND, 0x0023100d ); // Copy data to x13 + MCF.WriteReg32( dev, DMCOMMAND, 0x0023100d ); // Copy data to x13 } static int InternalUnlockBootloader( void * dev ) @@ -742,7 +749,7 @@ static int DefaultWriteHalfWord( void * dev, uint32_t address_to_write, uint16_t ret |= MCF.WaitForDoneOp( dev, 0 ); iss->currentstateval = -1; - + if( ret ) fprintf( stderr, "Fault on DefaultWriteHalfWord\n" ); return ret; } @@ -768,6 +775,8 @@ static int DefaultReadHalfWord( void * dev, uint32_t address_to_write, uint16_t ret |= MCF.WaitForDoneOp( dev, 0 ); iss->currentstateval = -1; + if( ret ) fprintf( stderr, "Fault on DefaultReadHalfWord\n" ); + uint32_t rr; ret |= MCF.ReadReg32( dev, DMDATA0, &rr ); *data = rr; @@ -796,6 +805,7 @@ static int DefaultWriteByte( void * dev, uint32_t address_to_write, uint8_t data MCF.WriteReg32( dev, DMCOMMAND, 0x00271008 ); // Copy data to x8, and execute program. ret |= MCF.WaitForDoneOp( dev, 0 ); + if( ret ) fprintf( stderr, "Fault on DefaultWriteByte\n" ); iss->currentstateval = -1; return ret; } @@ -820,6 +830,7 @@ static int DefaultReadByte( void * dev, uint32_t address_to_write, uint8_t * dat MCF.WriteReg32( dev, DMCOMMAND, 0x00221008 ); // Read x8 into DATA0. ret |= MCF.WaitForDoneOp( dev, 0 ); + if( ret ) fprintf( stderr, "Fault on DefaultReadByte\n" ); iss->currentstateval = -1; uint32_t rr; @@ -892,7 +903,10 @@ static int DefaultWriteWord( void * dev, uint32_t address_to_write, uint32_t dat iss->currentstateval = address_to_write; if( is_flash ) + { ret |= MCF.WaitForDoneOp( dev, 0 ); + if( ret ) fprintf( stderr, "Fault on DefaultWriteWord Part 1\n" ); + } } else { @@ -908,10 +922,12 @@ static int DefaultWriteWord( void * dev, uint32_t address_to_write, uint32_t dat // XXX TODO: This likely can be a very short delay. // XXX POSSIBLE OPTIMIZATION REINVESTIGATE. ret |= MCF.WaitForDoneOp( dev, 0 ); + if( ret ) fprintf( stderr, "Fault on DefaultWriteWord Part 2\n" ); } else { ret |= MCF.WaitForDoneOp( dev, 0 ); + if( ret ) fprintf( stderr, "Fault on DefaultWriteWord Part 3\n" ); } } @@ -1144,6 +1160,7 @@ static int DefaultReadWord( void * dev, uint32_t address_to_read, uint32_t * dat iss->currentstateval = address_to_read; r |= MCF.WaitForDoneOp( dev, 0 ); + if( r ) fprintf( stderr, "Fault on DefaultReadWord Part 1\n" ); } if( iss->autoincrement ) @@ -1282,8 +1299,9 @@ int DefaultReadBinaryBlob( void * dev, uint32_t address_to_read_from, uint32_t r } } } - MCF.WaitForDoneOp( dev, 0 ); - return 0; + int r = MCF.WaitForDoneOp( dev, 0 ); + if( r ) fprintf( stderr, "Fault on DefaultReadBinaryBlob\n" ); + return r; } int DefaultReadCPURegister( void * dev, uint32_t regno, uint32_t * regret ) diff --git a/minichlink/pgm-wch-linke.c b/minichlink/pgm-wch-linke.c index 530f366fc1dadcb8ac030d72d170c74beb412243..6189f1e9164c8504c43a9331a03e649eb90920b5 100644 --- a/minichlink/pgm-wch-linke.c +++ b/minichlink/pgm-wch-linke.c @@ -17,9 +17,11 @@ struct LinkEProgrammerStruct }; // For non-ch32v003 chips. +#if 0 static int LEReadBinaryBlob( void * d, uint32_t offset, uint32_t amount, uint8_t * readbuff ); static int InternalLinkEHaltMode( void * d, int mode ); static int LEWriteBinaryBlob( void * d, uint32_t address_to_write, uint32_t len, uint8_t * blob ); +#endif #define WCHTIMEOUT 5000 #define WCHCHECK(x) if( (status = x) ) { fprintf( stderr, "Bad USB Operation on " __FILE__ ":%d (%d)\n", __LINE__, status ); exit( status ); } @@ -39,8 +41,13 @@ void wch_link_command( libusb_device_handle * devh, const void * command_v, int { reply = buffer; replymax = sizeof( buffer ); } - + +// printf("wch_link_command send (%d)", commandlen); for(int i = 0; i< commandlen; printf(" %02x",command[i++])); printf("\n"); + status = libusb_bulk_transfer( devh, 0x81, reply, replymax, transferred, WCHTIMEOUT ); + +// printf("wch_link_command reply (%d)", *transferred); for(int i = 0; i< *transferred; printf(" %02x",reply[i++])); printf("\n"); + if( status ) goto sendfail; return; sendfail: @@ -223,9 +230,9 @@ static int LESetupInterface( void * d ) if( rbuff[2] == 0x05 && rbuff[3] == 0x06 ) { - fprintf( stderr, "CH32V307 Detected. Allowing old-flash-mode for operation.\n" ); - MCF.WriteBinaryBlob = LEWriteBinaryBlob; - MCF.ReadBinaryBlob = LEReadBinaryBlob; +// fprintf( stderr, "CH32V307 Detected. Allowing old-flash-mode for operation.\n" ); +// MCF.WriteBinaryBlob = LEWriteBinaryBlob; +// MCF.ReadBinaryBlob = LEReadBinaryBlob; } else { @@ -316,7 +323,7 @@ void * TryInit_WCHLinkE() }; - +#if 0 // In case you are using a non-CH32V003 board. @@ -506,3 +513,5 @@ static int LEWriteBinaryBlob( void * d, uint32_t address_to_write, uint32_t len, return 0; } + +#endif \ No newline at end of file