From b9b29bec9ef54c4b2b11e1a2ab3fbe0b0d94f48f Mon Sep 17 00:00:00 2001 From: cnlohr <lohr85@gmail.com> Date: Sat, 18 Feb 2023 15:16:28 -0800 Subject: [PATCH] Hoorey! Not a full-fledge writer tool. But pretty close. --- barebones/barebones.c | 5 ++++ minichlink/wch_link_base.h | 2 +- minichlink/wch_power.c | 52 ++++++++++++++++++++++++++++++++++ minichlink/wch_query.c | 56 +++++++++++++++++++++++++++++++++++++ minichlink/wch_write_demo.c | 5 +++- 5 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 minichlink/wch_power.c create mode 100644 minichlink/wch_query.c diff --git a/barebones/barebones.c b/barebones/barebones.c index d031670..3beba54 100644 --- a/barebones/barebones.c +++ b/barebones/barebones.c @@ -19,6 +19,8 @@ void SystemInit(void) while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08); // Wait till PLL is used as system clock source } +static const uint8_t array[384] = { 0xff }; + int main() { // Enable GPIOD. @@ -27,6 +29,9 @@ int main() // Push-Pull, 50MHz Output GPIOD->CFGLR = (GPIOD->CFGLR & 0xfffffff0) | 3; + + GPIOD->BSHR = array[GPIOD->BSHR]; + while(1) { GPIOD->BSHR = 1; // Turn on GPIOD0 diff --git a/minichlink/wch_link_base.h b/minichlink/wch_link_base.h index c35cdfb..45c288d 100644 --- a/minichlink/wch_link_base.h +++ b/minichlink/wch_link_base.h @@ -5,7 +5,7 @@ #include "libusb.h" -#define WCHTIMEOUT 1000000 +#define WCHTIMEOUT 1000 #define WCHCHECK(x) if( status = x ) { fprintf( stderr, "Bad USB Operation on line %d (%d)\n", __LINE__, status ); exit( status ); } static inline libusb_device_handle * wch_link_base_setup() diff --git a/minichlink/wch_power.c b/minichlink/wch_power.c new file mode 100644 index 0000000..5cc3d9e --- /dev/null +++ b/minichlink/wch_power.c @@ -0,0 +1,52 @@ +#include <stdio.h> +#include "wch_link_base.h" + +int main() +{ + // Note this is for CH32V003, MCU UID 20-9e-ab-cd-88-b3-bc-84 + +return 0; + + libusb_device_handle * devh = wch_link_base_setup(); + int transferred; + int status; +"\x81\x0d\x01\x01" +"\x81\x0c\x02\x09\x01" + +// Disable 3.3: +"\x81\x0d\x01\x0a" +// Enable 3.3: +"\x81\x0d\x01\x09" +// Disable 5v: +"\x81\x0d\x01\x0c" +// Enable 5v: +"\x81\x0d\x01\x0b" + +// Or so the software says... In reality it doesn't follow those rules. + +// also for disabling read protection: +"\x81\x0c\x02\x09\x01" +"\x81\x0d\x01\x02" +"\x81\x06\x08\x02\xf7\xff\xff\xff\xff\xff\xff" +"\x81\x0b\x01\x01" +"\x81\x0d\x01\xff" +"\x81\x0d\x01\x01" +"\x81\x0c\x02\x09\x01" +"\x81\x0d\x01\x02" +"\x81\x06\x01\x01" +"\x81\x0d\x01\xff" + +// to enable read protection +"\x81\x0d\x01\x01" +"\x81\x0c\x02\x09\x01" +"\x81\x0d\x01\x02" +"\x81\x06\x08\x03\xf7\xff\xff\xff\xff\xff\xff" +"\x81\x0b\x01\x01" +"\x81\x0d\x01\xff" +"\x81\x0d\x01\x01" +"\x81\x0c\x02\x09\x01" +"\x81\x0d\x01\x02" +"\x81\x06\x01\x01" +"\x81\x0d\x01\xff" + +} diff --git a/minichlink/wch_query.c b/minichlink/wch_query.c new file mode 100644 index 0000000..fdb9e53 --- /dev/null +++ b/minichlink/wch_query.c @@ -0,0 +1,56 @@ +#include <stdio.h> +#include "wch_link_base.h" + +// TODO Make me actually query data! + +int main() +{ + + libusb_device_handle * devh = wch_link_base_setup(); + int transferred; + int status; + char rbuff[1024]; + libusb_bulk_transfer( devh, 0x81, rbuff, 1024, &transferred, 1 ); // Clear out any pending transfers. + + WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0d\x01\x01", 4, &transferred, WCHTIMEOUT ) ); // Checkme with BULK_IN + WCHCHECK( libusb_bulk_transfer( devh, 0x81, rbuff, 1024, &transferred, 500 ) ); // Ignore respone. +// "\x1b\x00\x20\xda\x62\x67\x86\xe0\xff\xff\x00\x00\x00\x00\x09\x00" \ +"\x01\x02\x00\x2f\x00\x81\x03\x07\x00\x00\x00\x82\x0d\x04\x02\x08" \ +"\x02\x00" << Back in + + WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0c\x02\x09\x01", 5, &transferred, WCHTIMEOUT ) ); // Checkme with BULK_IN + WCHCHECK( libusb_bulk_transfer( devh, 0x81, rbuff, 1024, &transferred, 500 ) ); // Ignore respone. +//"\x82\x0c\x01\x01" << Back In + + + WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0d\x01\x02", 4, &transferred, WCHTIMEOUT) ); // Checkme with BULK_IN + WCHCHECK( libusb_bulk_transfer( devh, 0x81, rbuff, 1024, &transferred, 500 ) ); // Ignore respone. +//"\x82\x0d\x05\x09\x00\x30\x05\x00" << back in. + + + WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x06\x01\x01", 4, &transferred, WCHTIMEOUT) ); + WCHCHECK( libusb_bulk_transfer( devh, 0x81, rbuff, 1024, &transferred, 500 ) ); // Ignore respone. +//"\x82\x06\x01\x02" << back in + + WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x11\x01\x09", 4, &transferred, WCHTIMEOUT) ); // Checkme with BULK_IN + WCHCHECK( libusb_bulk_transfer( devh, 0x81, rbuff, 1024, &transferred, WCHTIMEOUT) ); // Checkme with BULK_IN + printf( "Query data: %d\n", transferred ); + int i; + for( i = 0; i < transferred; i++ ) + { + printf( "%02x ", (unsigned char)rbuff[i] ); + } + printf( "\n" ); + +// Note this is for CH32V003, MCU UID 20-9e-ab-cd-88-b3-bc-84 +//Respone is: +//"\xff\xff\x00\x10\x20\x9e\xab\xcd\x88\xb3\xbc\x48\xff\xff\xff\xff" \ + +//"\x00\x30\x05\x00" << Back in. <<<< QUERY DATA. + WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0d\x01\x04", 4, &transferred, WCHTIMEOUT) ); // Odd that it did it twice - maybe something took too long on the proc. + WCHCHECK( libusb_bulk_transfer( devh, 0x81, rbuff, 1024, &transferred, 500 ) ); // Ignore respone. +//"\x82\x0d\x01\x03" <<< Streamed back in. + WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0d\x01\xff", 4, &transferred, WCHTIMEOUT) ); // Odd that it did it twice - maybe something took too long on the proc. + WCHCHECK( libusb_bulk_transfer( devh, 0x81, rbuff, 1024, &transferred, 500 ) ); // Ignore respone. +//"\x82\x0d\x01\xff" <<< Streamed back in. +} diff --git a/minichlink/wch_write_demo.c b/minichlink/wch_write_demo.c index 12ee421..e93c266 100644 --- a/minichlink/wch_write_demo.c +++ b/minichlink/wch_write_demo.c @@ -15,10 +15,13 @@ int main() WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x11\x01\x09", 4, &transferred, WCHTIMEOUT) ); // Checkme with BULK_IN WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x06\x01\x01", 4, &transferred, WCHTIMEOUT) ); WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x06\x01\x01", 4, &transferred, WCHTIMEOUT) ); // Odd that it did it twice - maybe something took too long on the proc. + + // This contains the write data quantity, in bytes. (The last 2 octets) + // Then it just rollllls on in. WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x01\x08\x08\x00\x00\x00\x00\x00\x02\x0c", 11, &transferred, WCHTIMEOUT) ); // Still check me. WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x02\x01\x05", 4, &transferred, WCHTIMEOUT) ); // Last checkme til data. - // then just stream this. + // then just stream this. This is some sort of propreitary image. WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x21\x11\x22\xca\x26\xc8\x93\x77\x15\x00\x99\xcf\xb7\x06\x67\x45" \ "\xb7\x27\x02\x40\x93\x86\x36\x12\x37\x97\xef\xcd\xd4\xc3\x13\x07" \ -- GitLab