From 375b352ea51ca89782cb31d6710fd25394a27709 Mon Sep 17 00:00:00 2001 From: cnlohr <lohr85@gmail.com> Date: Mon, 5 Jun 2023 05:29:48 -0400 Subject: [PATCH] Working on new bootloader --- minichlink/Makefile | 2 +- minichlink/minichlink.c | 4 ++ minichlink/minichlink.h | 5 +- minichlink/pgm-b003fun.c | 147 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 155 insertions(+), 3 deletions(-) create mode 100644 minichlink/pgm-b003fun.c diff --git a/minichlink/Makefile b/minichlink/Makefile index 1aeb8ac..11a95a6 100644 --- a/minichlink/Makefile +++ b/minichlink/Makefile @@ -1,7 +1,7 @@ TOOLS:=minichlink minichlink.so CFLAGS:=-O0 -g3 -Wall -C_S:=minichlink.c pgm-wch-linke.c pgm-esp32s2-ch32xx.c nhc-link042.c minichgdb.c +C_S:=minichlink.c pgm-wch-linke.c pgm-esp32s2-ch32xx.c nhc-link042.c minichgdb.c pgm-b003fun.c # General Note: To use with GDB, gdb-multiarch # gdb-multilib {file} diff --git a/minichlink/minichlink.c b/minichlink/minichlink.c index 4bcae53..7da01cb 100644 --- a/minichlink/minichlink.c +++ b/minichlink/minichlink.c @@ -39,6 +39,10 @@ void * MiniCHLinkInitAsDLL( struct MiniChlinkFunctions ** MCFO ) { fprintf( stderr, "Found NHC-Link042 Programmer\n" ); } + else if ((dev = TryInit_B003Fun())) + { + fprintf( stderr, "Found B003Fun Bootloader\n" ); + } else { fprintf( stderr, "Error: Could not initialize any supported programmers\n" ); diff --git a/minichlink/minichlink.h b/minichlink/minichlink.h index 0462984..cec456b 100644 --- a/minichlink/minichlink.h +++ b/minichlink/minichlink.h @@ -147,9 +147,10 @@ extern struct MiniChlinkFunctions MCF; // Returns 'dev' on success, else 0. -void * TryInit_WCHLinkE(); -void * TryInit_ESP32S2CHFUN(); +void * TryInit_WCHLinkE(void); +void * TryInit_ESP32S2CHFUN(void); void * TryInit_NHCLink042(void); +void * TryInit_B003Fun(void); // Returns 0 if ok, populated, 1 if not populated. int SetupAutomaticHighLevelFunctions( void * dev ); diff --git a/minichlink/pgm-b003fun.c b/minichlink/pgm-b003fun.c new file mode 100644 index 0000000..3854293 --- /dev/null +++ b/minichlink/pgm-b003fun.c @@ -0,0 +1,147 @@ +#include <stdint.h> +#include "hidapi.h" +#include "minichlink.h" + + +struct B003FunProgrammerStruct +{ + void * internal; + hid_device * hd; + uint8_t commandbuffer[128]; + int commandplace; + +/* + uint32_t state; + uint8_t reply[256]; + int replylen; +*/ +}; + + +static int B003FunFlushLLCommands( void * dev ) +{ + return 0; +} + +static int B003FunDelayUS( void * dev, int microseconds ) +{ + usleep( microseconds ); + return 0; +} + +static int B003FunSetupInterface( void * dev ) +{ + return 0; +} + +static int B003FunExit( void * dev ) +{ + return 0; +} + +// MUST be 4-byte-aligned. +static int B003FunWriteWord( void * dev, uint32_t address_to_write, uint32_t data ) +{ + return 0; +} + +static int B003FunReadWord( void * dev, uint32_t address_to_read, uint32_t * data ) +{ + return 0; +} + +static int B003FunWaitForDoneOp( void * dev, int ignore ) +{ + // ... Need this. + return 0; +} + + +static int B003FunBlockWrite64( void * dev, uint32_t address_to_write, uint8_t * data ) +{ + return 0; +} + +static int B003FunWriteHalfWord( void * dev, uint32_t address_to_write, uint16_t data ) +{ +} + +static int B003FunReadHalfWord( void * dev, uint32_t address_to_read, uint16_t * data ) +{ +} + +static int B003FunWriteByte( void * dev, uint32_t address_to_write, uint8_t data ) +{ +} + +static int B003FunReadByte( void * dev, uint32_t address_to_read, uint8_t * data ) +{ +} + + +static void ResetOp( struct B003FunProgrammerStruct * eps ) +{ + memcpy( eps->commandbuffer, "\xaa\x00\x00\x00", 4 ); + eps->commandplace = 4; +} + +static void WriteOp4( struct B003FunProgrammerStruct * eps, uint32_t opsend ) +{ + int place = eps->commandplace; + int newend = place + 4; + if( newend < sizeof( eps->commandbuffer ) ) + { + memcpy( eps->commandbuffer + place, &opsend, 4 ); + } + eps->commandplace = newend; +} + +static void CommitOp( struct B003FunProgrammerStruct * eps ) +{ +} + CommitOp( eps ); + + + +void * TryInit_ESP32S2CHFUN() +{ + #define VID 0x1209 + #define PID 0xb003 + hid_init(); + hid_device * hd = hid_open( VID, PID, 0); // third parameter is "serial" + if( !hd ) return 0; + + struct B003FunProgrammerStruct * eps = malloc( sizeof( struct B003FunProgrammerStruct ) ); + memset( eps, 0, sizeof( *eps ) ); + eps->hd = hd; + eps->commandplace = 1; + + memset( &MCF, 0, sizeof( MCF ) ); + MCF.WriteReg32 = 0; + MCF.ReadReg32 = 0; + MCF.FlushLLCommands = B003FunFlushLLCommands; + MCF.DelayUS = B003FunDelayUS; + MCF.Control3v3 = 0; + MCF.SetupInterface = B003FunSetupInterface; + MCF.Exit = B003FunExit; + MCF.HaltMode = 0; + MCF.VoidHighLevelState = 0; + MCF.PollTerminal = 0; + + // These are optional. Disabling these is a good mechanismto make sure the core functions still work. + MCF.WriteWord = B003FunWriteWord; + MCF.ReadWord = B003FunReadWord; + + MCF.WaitForDoneOp = B003FunWaitForDoneOp; + + MCF.BlockWrite64 = B003FunBlockWrite64; + + // Alert programmer. + ResetOp( eps ) + WriteOp4( eps, 0x00b02023 ); //sw a1, 0 ; stop execution + WriteOp4( eps, 0x00008067 ); //jalr x0, x1, 0 ; ret + CommitOp( eps ); + + return eps; +} + -- GitLab