From 957c8803443fdb6553aee8c543cfd522fe9b09e2 Mon Sep 17 00:00:00 2001 From: Alexander Mandera <alexander@mandera.eu> Date: Mon, 26 Jun 2023 19:17:13 +0200 Subject: [PATCH] Add support for V10x --- minichlink/minichlink.exe | Bin 96768 -> 98816 bytes minichlink/minichlink.h | 12 +++- minichlink/pgm-wch-linke.c | 118 ++++++++++++++++++++++++++++++++++--- 3 files changed, 120 insertions(+), 10 deletions(-) diff --git a/minichlink/minichlink.exe b/minichlink/minichlink.exe index 41c7a0961ea714c1698c7f42a519ef9283b9b923..64720779b1a4060fc876e65c9be7c39ce9fe6f80 100644 GIT binary patch delta 21747 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 delta 19649 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 Y*1WBVQz~$N0Pp<ZLgwHn@u<%K1A@q>hX4Qo diff --git a/minichlink/minichlink.h b/minichlink/minichlink.h index 1433f6d..a46793c 100644 --- a/minichlink/minichlink.h +++ b/minichlink/minichlink.h @@ -104,6 +104,16 @@ struct ProgrammerStructBase #define MAX_FLASH_SECTORS 262144 +enum RiscVChip { + CH32V10x = 0x01, + CH57x = 0x02, + CH56x = 0x03, + CH32V20x = 0x05, + CH32V30x = 0x06, + CH58x = 0x07, + CH32V003 = 0x09 +}; + struct InternalState { uint32_t statetag; @@ -116,7 +126,7 @@ struct InternalState uint32_t ram_size; int sector_size; int flash_size; - int target_chip_type; // 0 for unknown (or 003), otherwise a part number. + enum RiscVChip target_chip_type; uint8_t flash_sector_status[MAX_FLASH_SECTORS]; // 0 means unerased/unknown. 1 means erased. }; diff --git a/minichlink/pgm-wch-linke.c b/minichlink/pgm-wch-linke.c index 6034f24..6db9750 100644 --- a/minichlink/pgm-wch-linke.c +++ b/minichlink/pgm-wch-linke.c @@ -16,6 +16,48 @@ struct LinkEProgrammerStruct int lasthaltmode; // For non-003 chips }; +static void printChipInfo(enum RiscVChip chip) { + switch(chip) { + case CH32V10x: + fprintf(stderr, "Detected: CH32V10x\n"); + break; + case CH57x: + fprintf(stderr, "Detected: CH57x\n"); + break; + case CH56x: + fprintf(stderr, "Detected: CH56x\n"); + break; + case CH32V20x: + fprintf(stderr, "Detected: CH32V20x\n"); + break; + case CH32V30x: + fprintf(stderr, "Detected: CH32V30x\n"); + break; + case CH58x: + fprintf(stderr, "Detected: CH58x\n"); + break; + case CH32V003: + fprintf(stderr, "Detected: CH32V003\n"); + break; + } +} + +static int checkChip(enum RiscVChip chip) { + switch(chip) { + case CH32V003: + return 0; // Use direct mode + case CH32V10x: + case CH32V20x: + case CH32V30x: + return 1; // Use binary blob mode + case CH56x: + case CH57x: + case CH58x: + default: + return -1; // Not supported yet + } +} + // For non-ch32v003 chips. //static int LEReadBinaryBlob( void * d, uint32_t offset, uint32_t amount, uint8_t * readbuff ); static int InternalLinkEHaltMode( void * d, int mode ); @@ -230,26 +272,36 @@ static int LESetupInterface( void * d ) // This puts the processor on hold to allow the debugger to run. 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) + if (rbuff[0] == 0x81 && rbuff[1] == 0x55) { fprintf(stderr, "link error, nothing connected to linker\n"); return -1; } - uint32_t mcu_series = rbuff[4] << 4; - uint32_t target_chip_type = mcu_series + (rbuff[5] >> 4); - fprintf(stderr, "Chip Type: %03x\n", target_chip_type); + if(rbuff[3] == 0x08 || rbuff[3] > 0x09) { + fprintf( stderr, "Chip Type unknown. Aborting...\n" ); + return -1; + } - if( mcu_series == 0x300 || mcu_series == 0x200 ) + enum RiscVChip chip = (enum RiscVChip)rbuff[3]; + printChipInfo(chip); + + int result = checkChip(chip); + if( result == 1 ) // Using blob write { - fprintf( stderr, "CH32V30x or CH32V20x MCU detected. Using binary blob write for operation.\n" ); + 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 ) { + 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. @@ -299,7 +351,6 @@ static int LESetupInterface( void * d ) } iss->flash_size = ((rbuff[2]<<8) | rbuff[3])*1024; - iss->target_chip_type = target_chip_type; return 0; } @@ -405,7 +456,41 @@ void * TryInit_WCHLinkE() // Flash Bootloader for V20x and V30x series MCUs -const uint8_t * bootloader = (const uint8_t*) +const uint8_t * bootloader_v1 = (const uint8_t*) +"\x93\x77\x15\x00\x41\x11\x99\xCF\xB7\x06\x67\x45\xB7\x27\x02\x40" \ +"\x93\x86\x36\x12\x37\x97\xEF\xCD\xD4\xC3\x13\x07\xB7\x9A\xD8\xC3" \ +"\xD4\xD3\xD8\xD3\x93\x77\x25\x00\x9D\xC7\xB7\x27\x02\x40\x98\x4B" \ +"\xAD\x66\x37\x38\x00\x40\x13\x67\x47\x00\x98\xCB\x98\x4B\x93\x86" \ +"\xA6\xAA\x13\x67\x07\x04\x98\xCB\xD8\x47\x05\x8B\x63\x1F\x07\x10" \ +"\x98\x4B\x6D\x9B\x98\xCB\x93\x77\x45\x00\xA9\xCB\x93\x07\xF6\x07" \ +"\x9D\x83\x2E\xC0\x2D\x68\x81\x76\x3E\xC4\xB7\x08\x02\x00\xB7\x27" \ +"\x02\x40\x37\x33\x00\x40\x13\x08\xA8\xAA\xFD\x16\x98\x4B\x33\x67" \ +"\x17\x01\x98\xCB\x02\x47\xD8\xCB\x98\x4B\x13\x67\x07\x04\x98\xCB" \ +"\xD8\x47\x05\x8B\x71\xEF\x98\x4B\x75\x8F\x98\xCB\x02\x47\x13\x07" \ +"\x07\x08\x3A\xC0\x22\x47\x7D\x17\x3A\xC4\x69\xFB\x93\x77\x85\x00" \ +"\xED\xC3\x93\x07\xF6\x07\x2E\xC0\x9D\x83\x37\x27\x02\x40\x3E\xC4" \ +"\x1C\x4B\xC1\x66\x37\x08\x08\x00\xD5\x8F\x1C\xCB\xA1\x48\x37\x17" \ +"\x00\x20\xB7\x27\x02\x40\x37\x03\x04\x00\x94\x4B\xB3\xE6\x06\x01" \ +"\x94\xCB\xD4\x47\x85\x8A\xF5\xFE\x82\x46\x3A\x8E\x36\xC2\x46\xC6" \ +"\x92\x46\x83\x2E\x07\x00\x41\x07\x23\xA0\xD6\x01\x92\x46\x83\x2E" \ +"\x47\xFF\x23\xA2\xD6\x01\x92\x46\x83\x2E\x87\xFF\x23\xA4\xD6\x01" \ +"\x92\x46\x03\x2E\xCE\x00\x23\xA6\xC6\x01\x94\x4B\xB3\xE6\x66\x00" \ +"\x94\xCB\xD4\x47\x85\x8A\xF5\xFE\x92\x46\x3A\x8E\xC1\x06\x36\xC2" \ +"\xB2\x46\xFD\x16\x36\xC6\xCD\xFE\x82\x46\xD4\xCB\x94\x4B\x93\xE6" \ +"\x06\x04\x94\xCB\xD4\x47\x85\x8A\xF5\xFE\xD4\x47\xD1\x8A\x85\xC6" \ +"\xD8\x47\xB7\x06\xF3\xFF\xFD\x16\x13\x67\x47\x01\xD8\xC7\x98\x4B" \ +"\x21\x45\x75\x8F\x98\xCB\x41\x01\x02\x90\x23\x20\xD8\x00\xE9\xBD" \ +"\x23\x20\x03\x01\x31\xBF\x82\x46\x93\x86\x06\x08\x36\xC0\xA2\x46" \ +"\xFD\x16\x36\xC4\xB9\xFA\x98\x4B\xB7\x06\xF3\xFF\xFD\x16\x75\x8F" \ +"\x98\xCB\x41\x89\x15\xC9\x2E\xC0\x0D\x06\x02\xC4\x09\x82\x32\xC6" \ +"\xB7\x17\x00\x20\x98\x43\x13\x86\x47\x00\xA2\x47\x82\x46\x8A\x07" \ +"\xB6\x97\x9C\x43\x63\x1C\xF7\x00\xA2\x47\x85\x07\x3E\xC4\xA2\x46" \ +"\x32\x47\xB2\x87\xE3\xE0\xE6\xFE\x01\x45\x71\xBF\x41\x45\x61\xBF" \ +"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" \ +"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" \ +"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"; + +const uint8_t * bootloader_v2 = (const uint8_t*) "\x93\x77\x15\x00\x41\x11\x99\xcf\xb7\x06\x67\x45\xb7\x27\x02\x40" \ "\x93\x86\x36\x12\x37\x97\xef\xcd\xd4\xc3\x13\x07\xb7\x9a\xd8\xc3" \ "\xd4\xd3\xd8\xd3\x93\x77\x25\x00\x95\xc7\xb7\x27\x02\x40\x98\x4b" \ @@ -442,6 +527,18 @@ const uint8_t * bootloader = (const uint8_t*) int bootloader_len = 512; #endif +static const uint8_t * GetFlashLoader( enum RiscVChip chip ) +{ + switch(chip) { + case CH32V10x: + return bootloader_v1; + case CH32V20x: + case CH32V30x: + default: + return bootloader_v2; + } +} + static int InternalLinkEHaltMode( void * d, int mode ) { libusb_device_handle * dev = ((struct LinkEProgrammerStruct*)d)->devh; @@ -556,7 +653,10 @@ static int LEWriteBinaryBlob( void * d, uint32_t address_to_write, uint32_t len, wch_link_command( (libusb_device_handle *)dev, rksbuff, 11, 0, 0, 0 ); wch_link_command( (libusb_device_handle *)dev, "\x81\x02\x01\x05", 4, 0, 0, 0 ); - + + uint32_t mcu_series = iss->target_chip_type & 0xf00; + const uint8_t *bootloader = GetFlashLoader(mcu_series); + int pplace = 0; for( pplace = 0; pplace < bootloader_len; pplace += iss->sector_size ) { -- GitLab