Skip to content
Snippets Groups Projects
Commit c2f36566 authored by cnlohr's avatar cnlohr
Browse files

General update - now everything seems to work with libusb. Just not arbitrarily image flashing.

parent 066565cf
No related branches found
No related tags found
No related merge requests found
......@@ -16,5 +16,14 @@ On WSL or Debian based OSes `apt-get install build-essential libnewlib-dev gcc-r
cd barebones
make
```
Use the WCH-LinkUtility to flash the built hex file.
Use the WCH-LinkUtility to flash the built hex file.
\ No newline at end of file
## For using EVT demos, check out the EVT folder.
## WCH-Link
It enumerates as 2 interfaces.
0. the programming interface. I can't get anything except the propreitary interface to work.
1. the usb serial port built in.
If you want to mess with the programming code in Windows, you will have to install WinUSB to the interface 0. Then you can uninstall it in Device Manager under USB Devices.
TARGET:=GPIO_Toggle
TARGET:=barebones
all : flash
......@@ -25,16 +25,16 @@ SYSTEM_C:=$(EVT)/startup_ch32v00x.S
$(TARGET).elf : barebones.c $(SYSTEM_C)
$(PREFIX)-gcc -o $@ $^ $(CFLAGS) $(LDFLAGS)
$(TARGET).hex : GPIO_Toggle.elf
$(TARGET).hex : $(TARGET).elf
$(PREFIX)-size $^
$(PREFIX)-objdump -S $^ > $(TARGET).lst
$(PREFIX)-objdump -t $^ > $(TARGET).map
#$(PREFIX)-objcopy -O binary $< $@
$(PREFIX)-objcopy -O binary $< $(TARGET).bin
$(PREFIX)-objcopy -O ihex $< $@
flash : $(TARGET).hex
clean :
rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map
rm -rf $(TARGET).elf $(TARGET).bin $(TARGET).hex $(TARGET).lst $(TARGET).map $(TARGET).hex
File added
This diff is collapsed.
#include <stdio.h>
#include "wch_link_base.h"
// UNTESTED
int main()
{
libusb_device_handle * devh = wch_link_base_setup();
int transferred;
int status;
WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0d\x01\x01", 4, &transferred, WCHTIMEOUT ) );
WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0c\x02\x09\x01", 5, &transferred, WCHTIMEOUT ) );
WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0d\x01\x02", 4, &transferred, WCHTIMEOUT) );
WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x11\x01\x09", 4, &transferred, WCHTIMEOUT) );
WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x02\x01\x01", 4, &transferred, WCHTIMEOUT) );
WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0d\x01\x02", 4, &transferred, WCHTIMEOUT) );
WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0d\x01\xff", 4, &transferred, WCHTIMEOUT) );
}
// Tricky: You need to use wch link to use WCH-LinkRV.
// you can always uninstall it in device manager. It will be under USB devices or something like that at the bottom.
#ifndef _WCH_LINK_BASE_H
#define _WCH_LINK_BASE_H
#include "libusb.h"
#define WCHTIMEOUT 1000000
#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()
{
libusb_context * ctx = 0;
int status;
status = libusb_init(&ctx);
if (status < 0) {
fprintf( stderr, "Error: libusb_init_context() returned %d\n", status );
exit( status );
}
printf( "OK %d %p\n", status, ctx );
//libusb_set_debug(ctx, 0);
libusb_device **list;
libusb_device *found = NULL;
ssize_t cnt = libusb_get_device_list(ctx, &list);
ssize_t i = 0;
int err = 0;
for (i = 0; i < cnt; i++) {
libusb_device *device = list[i];
struct libusb_device_descriptor desc;
int r = libusb_get_device_descriptor(device,&desc);
if( r == 0 && desc.idVendor == 0x1a86 && desc.idProduct == 0x8010 ) { found = device; }
}
if( !found )
{
fprintf( stderr, "Error: couldn't find wch link device\n" );
exit( -9 );
}
//USB\VID_1A86&PID_8010&MI_00\6&3AA7447&0&0000
//USB\VID_1A86&PID_8010&MI_00
libusb_device_handle * devh;
status = libusb_open( found, &devh );
if( status )
{
fprintf( stderr, "Error: couldn't open wch link device (libusb_open() = %d)\n", status );
exit( -9 );
}
WCHCHECK( libusb_claim_interface(devh, 0) );
//uint8_t setup_magic_1[] = { 0xcc, 0x08, 0x38, 0xff, 0x80, 0x00, 0x0a };
//status = libusb_control_transfer(devh, 0x21 /*bmRequestType*/, 0x09 /*bmRequest*/, 0x3cc, 0, setup_magic_1, sizeof(setup_magic_1), TIMEOUT);
//printf( "Status0: %d\n", status );
//uint8_t setup_magic_2[] = { 0xcc, 0x08, 0x0f, 0xff, 0x80, 0x00, 0x0a };
//status = libusb_control_transfer(devh, 0x21 /*bmRequestType*/, 0x09 /*bmRequest*/, 0x3cc, 0, setup_magic_1, sizeof(setup_magic_1), TIMEOUT);
//printf( "Status1: %d\n", status );
return devh;
}
#endif
#include <stdio.h>
#include "wch_link_base.h"
// TESTED
// Note - should probably do reads between the writes.
int main()
{
libusb_device_handle * devh = wch_link_base_setup();
int transferred;
int status;
WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0d\x01\x01", 4, &transferred, WCHTIMEOUT ) );
WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0c\x02\x09\x01", 5, &transferred, WCHTIMEOUT ) );
WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0d\x01\x02", 4, &transferred, WCHTIMEOUT) );
WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x11\x01\x09", 4, &transferred, WCHTIMEOUT) );
WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0b\x01\x01", 4, &transferred, WCHTIMEOUT) );
WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0d\x01\xff", 4, &transferred, WCHTIMEOUT) );
}
\ No newline at end of file
#include <stdio.h>
#include "wch_link_base.h"
// UNTESTED
// Flashes a "hummer" to pin D0 (not an arbitrary binary).
int main()
{
libusb_device_handle * devh = wch_link_base_setup();
int transferred;
int status;
WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0d\x01\x01", 4, &transferred, WCHTIMEOUT ) ); // Checkme with BULK_IN
WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0c\x02\x09\x01", 5, &transferred, WCHTIMEOUT ) ); // Checkme with BULK_IN
WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0d\x01\x02", 4, &transferred, WCHTIMEOUT) ); // Checkme with BULK_IN
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.
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.
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" \
"\xb7\x9a\xd8\xc3\xd4\xd3\xd8\xd3\x93\x77\x25\x00\x9d\xc7\xb7\x27" \
"\x02\x40\x98\x4b\xad\x66\x37\x33\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\x16\x07\x10\x98\x4b\x6d\x9b\x98\xcb\x93\x77\x45\x00\xa9\xcb" \
"\x93\x07\xf6\x03\x99\x83\x2e\xc0\x2d\x63\x81\x76\x3e\xc4\xb7\x32" \
"\x00\x40\xb7\x27\x02\x40\x13\x03\xa3\xaa\xfd\x16\x98\x4b\xb7\x03", 128, &transferred, WCHTIMEOUT ) );
WCHCHECK( libusb_bulk_transfer( devh, 0x01,
"\x02\x00\x33\x67\x77\x00\x98\xcb\x02\x47\xd8\xcb\x98\x4b\x13\x67" \
"\x07\x04\x98\xcb\xd8\x47\x05\x8b\x69\xe7\x98\x4b\x75\x8f\x98\xcb" \
"\x02\x47\x13\x07\x07\x04\x3a\xc0\x22\x47\x7d\x17\x3a\xc4\x79\xf7" \
"\x93\x77\x85\x00\xf1\xcf\x93\x07\xf6\x03\x2e\xc0\x99\x83\x37\x27" \
"\x02\x40\x3e\xc4\x1c\x4b\xc1\x66\x2d\x63\xd5\x8f\x1c\xcb\x37\x07" \
"\x00\x20\x13\x07\x07\x20\xb7\x27\x02\x40\xb7\x03\x08\x00\xb7\x32" \
"\x00\x40\x13\x03\xa3\xaa\x94\x4b\xb3\xe6\x76\x00\x94\xcb\xd4\x47" \
"\x85\x8a\xf5\xfe\x82\x46\xba\x84\x37\x04\x04\x00\x36\xc2\xc1\x46", 128, &transferred, WCHTIMEOUT ) );
WCHCHECK( libusb_bulk_transfer( devh, 0x01,
"\x36\xc6\x92\x46\x84\x40\x11\x07\x84\xc2\x94\x4b\xc1\x8e\x94\xcb" \
"\xd4\x47\x85\x8a\xb1\xea\x92\x46\xba\x84\x91\x06\x36\xc2\xb2\x46" \
"\xfd\x16\x36\xc6\xf9\xfe\x82\x46\xd4\xcb\x94\x4b\x93\xe6\x06\x04" \
"\x94\xcb\xd4\x47\x85\x8a\x85\xee\xd4\x47\xc1\x8a\x85\xce\xd8\x47" \
"\xb7\x06\xf3\xff\xfd\x16\x13\x67\x07\x01\xd8\xc7\x98\x4b\x21\x45" \
"\x75\x8f\x98\xcb\x52\x44\xc2\x44\x61\x01\x02\x90\x23\x20\xd3\x00" \
"\xf5\xb5\x23\xa0\x62\x00\x3d\xb7\x23\xa0\x62\x00\x55\xb7\x23\xa0" \
"\x62\x00\xc1\xb7\x82\x46\x93\x86\x06\x04\x36\xc0\xa2\x46\xfd\x16", 128, &transferred, WCHTIMEOUT ) );
WCHCHECK( libusb_bulk_transfer( devh, 0x01,
"\x36\xc4\xb5\xf2\x98\x4b\xb7\x06\xf3\xff\xfd\x16\x75\x8f\x98\xcb" \
"\x41\x89\x05\xcd\x2e\xc0\x0d\x06\x02\xc4\x09\x82\xb7\x07\x00\x20" \
"\x32\xc6\x93\x87\x07\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\x61\xb7\x41\x45" \
"\x51\xb7\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", 128, &transferred, WCHTIMEOUT ) );
WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x02\x01\x07", 4, &transferred, WCHTIMEOUT) ); // checkme.
WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x02\x01\x02", 4, &transferred, WCHTIMEOUT) ); // checkme.
WCHCHECK( libusb_bulk_transfer( devh, 0x02,
"\x6f\x00\x80\x18\x00\x00\x00\x00\x52\x01\x00\x00\x54\x01\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
"\x56\x01\x00\x00\x00\x00\x00\x00\x58\x01\x00\x00\x00\x00\x00\x00", 64, &transferred, WCHTIMEOUT ) );
WCHCHECK( libusb_bulk_transfer( devh, 0x02,
"\x5a\x01\x00\x00\x5c\x01\x00\x00\x5e\x01\x00\x00\x60\x01\x00\x00" \
"\x62\x01\x00\x00\x64\x01\x00\x00\x66\x01\x00\x00\x68\x01\x00\x00" \
"\x6a\x01\x00\x00\x6c\x01\x00\x00\x6e\x01\x00\x00\x70\x01\x00\x00" \
"\x72\x01\x00\x00\x74\x01\x00\x00\x76\x01\x00\x00\x78\x01\x00\x00", 64, &transferred, WCHTIMEOUT ) );
WCHCHECK( libusb_bulk_transfer( devh, 0x02,
"\x7a\x01\x00\x00\x7c\x01\x00\x00\x7e\x01\x00\x00\x80\x01\x00\x00" \
"\x82\x01\x00\x00\x84\x01\x00\x00\x86\x01\x00\x00\x00\x00\x00\x00" \
"\x37\x17\x02\x40\x1c\x4f\x85\x46\x93\xe7\x07\x02\x1c\xcf\xb7\x17" \
"\x01\x40\x03\xa7\x07\x40\x93\x87\x07\x40\x41\x9b\x13\x67\x37\x00", 64, &transferred, WCHTIMEOUT ) );
WCHCHECK( libusb_bulk_transfer( devh, 0x02,
"\x98\xc3\x41\x67\x94\xcb\x98\xcb\xf5\xbf\xb7\x17\x02\x40\x98\x43" \
"\xb7\x06\xff\xfc\x37\x26\x02\x40\x13\x67\x17\x00\x98\xc3\xd8\x43" \
"\x75\x8f\xd8\xc3\x98\x43\xb7\x06\xf7\xfe\xfd\x16\x75\x8f\x98\xc3" \
"\x98\x43\xb7\x06\xfc\xff\xfd\x16\x75\x8f\x98\xc3\xd8\x43\xc1\x76", 64, &transferred, WCHTIMEOUT ) );
WCHCHECK( libusb_bulk_transfer( devh, 0x02,
"\xfd\x16\x75\x8f\xd8\xc3\x37\x07\x9f\x00\x98\xc7\x18\x42\x71\x9b" \
"\x13\x67\x17\x00\x18\xc2\xd8\x43\xd8\xc3\xd8\x43\xf9\x8e\xd4\xc3" \
"\x98\x43\xb7\x06\x00\x01\x55\x8f\x98\xc3\x37\x17\x02\x40\x1c\x43" \
"\x93\x96\x67\x00\xe3\xdd\x06\xfe\x5c\x43\xb7\x16\x02\x40\xf1\x9b", 64, &transferred, WCHTIMEOUT ) );
WCHCHECK( libusb_bulk_transfer( devh, 0x02,
"\x93\xe7\x27\x00\x5c\xc3\x21\x47\xdc\x42\xb1\x8b\xe3\x9e\xe7\xfe" \
"\x82\x80\x01\xa0\x01\xa0\x01\xa0\x01\xa0\x01\xa0\x01\xa0\x01\xa0" \
"\x01\xa0\x01\xa0\x01\xa0\x01\xa0\x01\xa0\x01\xa0\x01\xa0\x01\xa0" \
"\x01\xa0\x01\xa0\x01\xa0\x01\xa0\x01\xa0\x01\xa0\x01\xa0\x01\xa0", 64, &transferred, WCHTIMEOUT ) );
WCHCHECK( libusb_bulk_transfer( devh, 0x02,
"\x01\xa0\x01\xa0\x01\xa0\x01\xa0\x97\x01\x00\x20\x93\x81\x81\x67" \
"\x13\x81\x01\x00\x13\x05\xc0\x20\x97\x05\x00\x20\x93\x85\x85\xe6" \
"\x17\x06\x00\x20\x13\x06\x06\xe6\x63\xfa\xc5\x00\x83\x22\x05\x00" \
"\x23\xa0\x55\x00\x11\x05\x91\x05\xe3\xea\xc5\xfe\x17\x05\x00\x20", 64, &transferred, WCHTIMEOUT ) );
WCHCHECK( libusb_bulk_transfer( devh, 0x02,
"\x13\x05\x45\xe4\x97\x05\x00\x20\x93\x85\xc5\xe3\x63\x77\xb5\x00" \
"\x23\x20\x05\x00\x11\x05\xe3\x6d\xb5\xfe\x93\x02\x00\x08\x73\x90" \
"\x02\x30\x8d\x42\x73\x90\x42\x80\x97\x02\x00\x00\x93\x82\x82\xe1" \
"\x93\xe2\x32\x00\x73\x90\x52\x30\xef\xf0\x3f\xed\x97\x02\x00\x00", 64, &transferred, WCHTIMEOUT ) );
WCHCHECK( libusb_bulk_transfer( devh, 0x02,
"\x93\x82\x42\xea\x73\x90\x12\x34\x73\x00\x20\x30\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\xff\xff\xff\xff", 64, &transferred, WCHTIMEOUT ) );
// Waiting or something on 2.46.2???????
WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x0d\x01\xff", 4, &transferred, WCHTIMEOUT) ); // checkme.
//211122ca26c89377150099cfb7066745b7270240938636123797efcdd4c31307b79ad8c3d4d3d8d3937725009dc7b7270240984bad66373300401367470098cb984b9386a6aa1367070498cbd847058b63160710984b6d9b98cb93774500a9cb9307f60399832ec02d6381763ec4b7320040b72702401303a3aafd16984bb703
// WCHCHECK( libusb_bulk_transfer( devh, 0x01, "\x81\x02\x01\x05", 4, &transferred, WCHTIMEOUT) );
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment