From e47fa0e408d112bed35d31ea8fb63905ec5d0688 Mon Sep 17 00:00:00 2001 From: cnlohr <lohr85@gmail.com> Date: Tue, 14 Mar 2023 22:50:39 -0400 Subject: [PATCH] * Add native ESP printf client support. * Document _write --- ch32v003fun/ch32v003fun.c | 1 - ch32v003fun/ch32v003fun.h | 4 +-- examples/debugprintfdemo/debugprintfdemo.c | 2 ++ minichlink/minichlink.c | 13 ++++--- minichlink/minichlink.h | 3 +- minichlink/pgm-esp32s2-ch32xx.c | 42 +++++++++++++++++++++- 6 files changed, 53 insertions(+), 12 deletions(-) diff --git a/ch32v003fun/ch32v003fun.c b/ch32v003fun/ch32v003fun.c index 8de04b1..66c96cc 100644 --- a/ch32v003fun/ch32v003fun.c +++ b/ch32v003fun/ch32v003fun.c @@ -13,7 +13,6 @@ #include <ch32v003fun.h> int errno; -int _write(int fd, const char *buf, int size); int mini_vsnprintf(char *buffer, unsigned int buffer_len, const char *fmt, va_list va); int mini_vpprintf(int (*puts)(char* s, int len, void* buf), void* buf, const char *fmt, va_list va); diff --git a/ch32v003fun/ch32v003fun.h b/ch32v003fun/ch32v003fun.h index 34ee9b1..9f0e97a 100644 --- a/ch32v003fun/ch32v003fun.h +++ b/ch32v003fun/ch32v003fun.h @@ -4848,11 +4848,11 @@ void SystemInitHSEPLL( int HSEBYP ); // You can write to this with printf(...) or puts(...) // Call with SetupUART( UART_BRR ) void SetupUART( int uartBRR ); - void SetupDebugPrintf(); - void WaitForDebuggerToAttach(); +// Just a definition to the internal _write function. +int _write(int fd, const char *buf, int size); #ifdef __cplusplus }; diff --git a/examples/debugprintfdemo/debugprintfdemo.c b/examples/debugprintfdemo/debugprintfdemo.c index 80ed683..fbb2d1c 100644 --- a/examples/debugprintfdemo/debugprintfdemo.c +++ b/examples/debugprintfdemo/debugprintfdemo.c @@ -35,6 +35,8 @@ int main() GPIOC->BSHR = (1<<16); printf( "-%d\n", count++ ); count++; + +// _write( 0, "xxxxxxx", 7 ); } } diff --git a/minichlink/minichlink.c b/minichlink/minichlink.c index adc53f2..052a162 100644 --- a/minichlink/minichlink.c +++ b/minichlink/minichlink.c @@ -158,8 +158,8 @@ keep_going: goto unimplemented; do { - uint8_t buffer[128]; - int r = MCF.PollTerminal( dev, buffer, sizeof( buffer ) ); + uint8_t buffer[256]; + int r = MCF.PollTerminal( dev, buffer, sizeof( buffer ), 0, 0 ); if( r < 0 ) { fprintf( stderr, "Terminal dead. code %d\n", r ); @@ -1004,7 +1004,7 @@ static int DefaultHaltMode( void * dev, int mode ) // Returns negative if error. // Returns 0 if no text waiting. // maxlen MUST be at least 8 characters. We null terminate. -int DefaultPollTerminal( void * dev, uint8_t * buffer, int maxlen ) +int DefaultPollTerminal( void * dev, uint8_t * buffer, int maxlen, uint32_t leaveflagA, int leaveflagB ) { struct InternalState * iss = (struct InternalState*)(((struct ProgrammerStructBase*)dev)->internal); @@ -1021,13 +1021,11 @@ int DefaultPollTerminal( void * dev, uint8_t * buffer, int maxlen ) if( maxlen < 8 ) return -9; // DMDATA1: - // bits 0..5 = # printf chars. - // bit 6 = host-wants-to-say-something. // bit 7 = host-acknowledge. if( rr & 0x80 ) { int ret = 0; - int num_printf_chars = (rr & 0x3f)-4; // Actaully can't be more than 32. + int num_printf_chars = (rr & 0xf)-4; if( num_printf_chars > 0 && num_printf_chars <= 7) { @@ -1043,7 +1041,8 @@ int DefaultPollTerminal( void * dev, uint8_t * buffer, int maxlen ) buffer[num_printf_chars] = 0; ret = num_printf_chars; } - MCF.WriteReg32( dev, DMDATA0, 0x00 ); // Write that we acknowledge the data. + if( leaveflagA ) MCF.WriteReg32( dev, DMDATA1, leaveflagB ); + MCF.WriteReg32( dev, DMDATA0, leaveflagA ); // Write that we acknowledge the data. return ret; } else diff --git a/minichlink/minichlink.h b/minichlink/minichlink.h index 100e127..934016e 100644 --- a/minichlink/minichlink.h +++ b/minichlink/minichlink.h @@ -50,7 +50,8 @@ struct MiniChlinkFunctions // Returns positive if received text. // Returns negative if error. // Returns 0 if no text waiting. - int (*PollTerminal)( void * dev, uint8_t * buffer, int maxlen ); + // Note: YOU CANNOT make lsb of leaveflagA bit in place 0x80 be high!!! + int (*PollTerminal)( void * dev, uint8_t * buffer, int maxlen, uint32_t leaveflagA, int leaveflagB ); int (*PerformSongAndDance)( void * dev ); diff --git a/minichlink/pgm-esp32s2-ch32xx.c b/minichlink/pgm-esp32s2-ch32xx.c index 77e2f03..212f66f 100644 --- a/minichlink/pgm-esp32s2-ch32xx.c +++ b/minichlink/pgm-esp32s2-ch32xx.c @@ -313,7 +313,7 @@ int ESPVendorCommand( void * dev, const char * cmd ) Write1( dev, 0 ); Write1( dev, 0 ); Write1( dev, 0 ); - ESPFlushLLCommands( dev ); + ESPFlushLLCommands( dev ); } else { @@ -322,6 +322,45 @@ int ESPVendorCommand( void * dev, const char * cmd ) return 0; } +int ESPPollTerminal( void * dev, uint8_t * buffer, int maxlen, uint32_t leaveflagA, int leaveflagB ) +{ + struct ESP32ProgrammerStruct * eps = (struct ESP32ProgrammerStruct *)dev; + ESPFlushLLCommands( dev ); + Write1( dev, 0xfe ); + Write1( dev, 0x0d ); + Write4LE( dev, leaveflagA ); + Write4LE( dev, leaveflagB ); + Write1( dev, 0xff ); + + ESPFlushLLCommands( dev ); + + int rlen = eps->reply[0]; + if( rlen < 1 ) return -8; + +/* + int i; + + printf( "RESP (ML %d): %d\n", maxlen,eps->reply[0] ); + + for( i = 0; i < eps->reply[0]; i++ ) + { + printf( "%02x ", eps->reply[i+1] ); + if( (i % 16) == 15 ) printf( "\n" ); + } + printf( "\n" ); +*/ + int errc = eps->reply[1]; + if( errc > 7 ) return -7; + + if( rlen - 1 >= maxlen ) return -6; + + memcpy( buffer, eps->reply + 2, rlen - 1 ); + + + return rlen - 1; +} + + void * TryInit_ESP32S2CHFUN() { #define VID 0x303a @@ -343,6 +382,7 @@ void * TryInit_ESP32S2CHFUN() MCF.Control3v3 = ESPControl3v3; MCF.Exit = ESPExit; MCF.VoidHighLevelState = ESPVoidHighLevelState; + MCF.PollTerminal = ESPPollTerminal; // These are optional. Disabling these is a good mechanismto make sure the core functions still work. MCF.WriteWord = ESPWriteWord; -- GitLab