diff --git a/minichlink/microgdbstub.h b/minichlink/microgdbstub.h index 50421314901e7a9c03032673ecdfa398376cfd61..39129034ff09ce4079bbceb90ae8eb05842e64c0 100644 --- a/minichlink/microgdbstub.h +++ b/minichlink/microgdbstub.h @@ -29,6 +29,7 @@ void RVDebugExec( void * dev, int halt_reset_or_resume ); int RVReadMem( void * dev, uint32_t memaddy, uint8_t * payload, int len ); int RVHandleBreakpoint( void * dev, int set, uint32_t address ); int RVWriteRAM(void * dev, uint32_t memaddy, uint32_t length, uint8_t * payload ); +void RVCommandResetPart( void * dev ); void RVHandleDisconnect( void * dev ); void RVHandleGDBBreakRequest( void * dev ); void RVHandleKillRequest( void * dev ); @@ -61,7 +62,7 @@ typedef struct pollfd { SOCKET fd; SHORT events; SHORT revents; }; #define POLLIN 0x0001 #define POLLERR 0x008 #define POLLHUP 0x010 -int WSAAPI WSAPoll(struct pollfd * fdArray, ULONG fds, INT timeout ); +int WSAAPI WSAPoll(struct pollfd * fdArray, ULONG fds, INT timeout ); #endif #define poll WSAPoll #define socklen_t uint32_t @@ -171,22 +172,27 @@ void HandleGDBPacket( void * dev, char * data, int len ) { case 'q': if( StringMatch( data, "Attached" ) ) - SendReplyFull( "1" ); //Attached to an existing process. + SendReplyFull( "1" ); //Attached to an existing process. else if( StringMatch( data, "Supported" ) ) - SendReplyFull( "PacketSize=f000;qXfer:memory-map:read+" ); + SendReplyFull( "PacketSize=f000;qXfer:memory-map:read+" ); else if( StringMatch( data, "C") ) // Get Current Thread ID. (Can't be -1 or 0. Those are special) - SendReplyFull( "QC1" ); + SendReplyFull( "QC1" ); else if( StringMatch( data, "fThreadInfo" ) ) // Query all active thread IDs (Can't be 0 or 1) SendReplyFull( "m1" ); else if( StringMatch( data, "sThreadInfo" ) ) // Query all active thread IDs, continued - SendReplyFull( "l" ); + SendReplyFull( "l" ); + else if( StringMatch( data, "Rcmd,7265736574" ) ) // "monitor reset" + { + RVCommandResetPart( dev ); // Force reset + SendReplyFull( "+" ); + } else if( StringMatch( data, "Xfer:memory-map" ) ) { int mslen = strlen( MICROGDBSTUB_MEMORY_MAP ) + 32; char map[mslen]; struct InternalState * iss = (struct InternalState*)(((struct ProgrammerStructBase*)dev)->internal); snprintf( map, mslen, MICROGDBSTUB_MEMORY_MAP, iss->flash_size, iss->sector_size, iss->ram_size ); - SendReplyFull( map ); + SendReplyFull( map ); } else { @@ -620,16 +626,16 @@ int MicroGDBStubStartup( void * dev ) { #if defined( WIN32 ) || defined( _WIN32 ) { - WORD wVersionRequested; - WSADATA wsaData; - int err; - wVersionRequested = MAKEWORD(2, 2); - - err = WSAStartup(wVersionRequested, &wsaData); - if (err != 0) { - fprintf( stderr, "WSAStartup failed with error: %d\n", err); - return 1; - } + WORD wVersionRequested; + WSADATA wsaData; + int err; + wVersionRequested = MAKEWORD(2, 2); + + err = WSAStartup(wVersionRequested, &wsaData); + if (err != 0) { + fprintf( stderr, "WSAStartup failed with error: %d\n", err); + return 1; + } } #endif diff --git a/minichlink/minichgdb.c b/minichlink/minichgdb.c index 60fc13ca812c7e442691c7efe21bcd7eef21a919..7cce3e21221640c9bad4ae0f04f2239a8a64e23c 100644 --- a/minichlink/minichgdb.c +++ b/minichlink/minichgdb.c @@ -71,6 +71,12 @@ void RVCommandEpilogue( void * dev ) MCF.WriteReg32( dev, DMDATA0, 0 ); } +void RVCommandResetPart( void * dev ) +{ + MCF.HaltMode( dev, HALT_MODE_HALT_AND_RESET ); + RVCommandPrologue( dev ); +} + void RVNetConnect( void * dev ) { // ??? Should we actually halt? diff --git a/minichlink/minichlink.exe b/minichlink/minichlink.exe index 13cd21c366c018e72ce7e745f3f92e9b0f8eb547..d2f7ed592a3b99d1e9577fdabf36a0e83aba03f9 100644 Binary files a/minichlink/minichlink.exe and b/minichlink/minichlink.exe differ