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