diff --git a/minichlink/microgdbstub.h b/minichlink/microgdbstub.h index 7b6647b333d40ac8bb1b0e53f4af1ba9b348c8af..3d802f55bdfb690121ef300dcf0b0d0b2a465a66 100644 --- a/minichlink/microgdbstub.h +++ b/minichlink/microgdbstub.h @@ -69,6 +69,7 @@ int WSAAPI WSAPoll(struct pollfd * fdArray, ULONG fds, INT timeout #define MSG_NOSIGNAL 0 #else #define closesocket close +#include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <linux/in.h> @@ -525,7 +526,7 @@ int MicroGDBPollServer( void * dev ) struct sockaddr_in tin; socklen_t addrlen = sizeof(tin); memset( &tin, 0, addrlen ); - int tsocket = accept( serverSocket, (struct sockaddr *)&tin, (int*)&addrlen ); + int tsocket = accept( serverSocket, (struct sockaddr *)&tin, (void*)&addrlen ); closesocket( serverSocket ); serverSocket = tsocket; listenMode = 2; diff --git a/minichlink/minichlink.c b/minichlink/minichlink.c index c4d2dd8f08fbc28ca0b80c86f436163b9675aa9d..76b2b6c10305ceaa84af58cb4c4fb7b18442c9bc 100644 --- a/minichlink/minichlink.c +++ b/minichlink/minichlink.c @@ -619,7 +619,24 @@ static int DefaultWaitForDoneOp( void * dev, int ignore ) while( rrv & (1<<12) ); if( (rrv >> 8 ) & 7 ) { - if( !ignore ) fprintf( stderr, "Fault writing memory (DMABSTRACTS = %08x)\n", rrv ); + if( !ignore ) + { + const char * errortext = 0; + switch( (rrv>>8)&7 ) + { + case 1: errortext = "Command in execution"; break; + case 2: errortext = "Abstract Command Unsupported"; break; + case 3: errortext = "Execption executing Abstract Command"; break; + case 4: errortext = "Processor not halted."; break; + case 5: errortext = "Bus Error"; break; + case 6: errortext = "Parity Bit"; break; + default: errortext = "Other Error"; break; + } + + uint32_t temp; + MCF.ReadReg32( dev, DMSTATUS, &temp ); + fprintf( stderr, "Fault writing memory (DMABSTRACTS = %08x) (%s) DMSTATUS: %08x\n", rrv, errortext, temp ); + } MCF.WriteReg32( dev, DMABSTRACTCS, 0x00000700 ); return -9; } @@ -1126,6 +1143,7 @@ static int DefaultReadWord( void * dev, uint32_t address_to_read, uint32_t * dat iss->currentstateval += 4; r |= MCF.ReadReg32( dev, DMDATA0, data ); + if( iss->currentstateval == iss->ram_base + iss->ram_size ) MCF.WaitForDoneOp( dev, 1 ); // Ignore any post-errors. return r; @@ -1364,9 +1382,14 @@ static int DefaultHaltMode( void * dev, int mode ) switch ( mode ) { case 0: + MCF.WriteReg32( dev, DMSHDWCFGR, 0x5aa50000 | (1<<10) ); // Shadow Config Reg + MCF.WriteReg32( dev, DMCFGR, 0x5aa50000 | (1<<10) ); // CFGR (1<<10 == Allow output from slave) + MCF.WriteReg32( dev, DMCFGR, 0x5aa50000 | (1<<10) ); // Bug in silicon? If coming out of cold boot, and we don't do our little "song and dance" this has to be called. + MCF.WriteReg32( dev, DMCONTROL, 0x80000001 ); // Make the debug module work properly. MCF.WriteReg32( dev, DMCONTROL, 0x80000001 ); // Initiate a halt request. - MCF.WriteReg32( dev, DMCONTROL, 0x00000001 ); // Clear Halt Request. +// MCF.WriteReg32( dev, DMCONTROL, 0x00000001 ); // Clear Halt Request. This is recommended, but not doing it seems more stable. + // Sometimes, even if the processor is halted but the MSB is clear, it will spuriously start? MCF.FlushLLCommands( dev ); break; case 1: @@ -1377,6 +1400,10 @@ static int DefaultHaltMode( void * dev, int mode ) MCF.FlushLLCommands( dev ); break; case 2: + MCF.WriteReg32( dev, DMSHDWCFGR, 0x5aa50000 | (1<<10) ); // Shadow Config Reg + MCF.WriteReg32( dev, DMCFGR, 0x5aa50000 | (1<<10) ); // CFGR (1<<10 == Allow output from slave) + MCF.WriteReg32( dev, DMCFGR, 0x5aa50000 | (1<<10) ); // Bug in silicon? If coming out of cold boot, and we don't do our little "song and dance" this has to be called. + MCF.WriteReg32( dev, DMCONTROL, 0x40000001 ); // resumereq MCF.FlushLLCommands( dev ); break; @@ -1396,6 +1423,17 @@ static int DefaultHaltMode( void * dev, int mode ) MCF.FlushLLCommands( dev ); break; } +#if 0 + int i; + for( i = 0; i < 100; i++ ) + { + uint32_t temp = 0; + MCF.ReadReg32( dev, DMSTATUS, &temp ); + fprintf( stderr, "DMSTATUS: %08x\n", temp ); + usleep( 20000); + } +#endif + iss->processor_in_mode = mode; return 0; } diff --git a/minichlink/pgm-esp32s2-ch32xx.c b/minichlink/pgm-esp32s2-ch32xx.c index bfb6ea1d87f2856b5e1ab9f96e7700852b278f26..6781ffb71588cb1b667fa2d08811d055499a5b06 100644 --- a/minichlink/pgm-esp32s2-ch32xx.c +++ b/minichlink/pgm-esp32s2-ch32xx.c @@ -159,7 +159,7 @@ int ESPReadWord( void * dev, uint32_t address_to_read, uint32_t * data ) Write4LE( eps, address_to_read ); ESPFlushLLCommands( eps ); -// printf( "Got: %d\n", eps->replylen ); +// printf( "Got: %d\n", eps->replylen ); if( eps->replylen < 5 ) { return -9;