diff --git a/ch32v003fun/ch32v003fun.c b/ch32v003fun/ch32v003fun.c index 8de04b1bf72562abd0c32bb4b526d47456ccf556..66c96cce690b99c2e8beaa531b9259081bb14711 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 34ee9b1d174a26e3361b21a9f5ff701fd564b271..9f0e97aa83bbf2d550ad5bb1735be074a081b745 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 80ed6830718e8c677691c5e3db2d9e5dd65e2d58..fbb2d1c6935be824f05a89c9021afe870c834965 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 adc53f2080029abb2ca988d2f39b653de6a679da..052a162b9f257a9120c7d6195d0ae172e83e12b0 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 100e1270d11d652b69505a4514271dd1a7cc578b..934016e7a926260303532b0398125a79f1ed266f 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 77e2f03a3e65b272ed42590f1660054522d5efc7..212f66f51f83e92089231caefc96deb8b7ce335d 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;