Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix marker sampling, add RData state and add support for JTAG-to-SWD sequence. #4

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/SWDAnalyzer.cpp
Expand Up @@ -41,6 +41,7 @@ void SWDAnalyzer::WorkerThread()
// on calls to IsOperation or IsLineReset
SWDOperation tran;
SWDLineReset reset;
SWDJtagToSwd jtagToSwd;
SWDBit error_bit;

mSWDParser.Clear();
Expand All @@ -65,6 +66,11 @@ void SWDAnalyzer::WorkerThread()

mResults->CommitResults();
}
else if( mSWDParser.IsJtagToSwd( jtagToSwd ) )
{
jtagToSwd.AddFrames( mResults.get() );
mResults->CommitResults();
}
else
{
// This is neither a valid transaction nor a valid reset,
Expand Down
26 changes: 20 additions & 6 deletions src/SWDAnalyzerResults.cpp
Expand Up @@ -69,6 +69,13 @@ void SWDAnalyzerResults::GetBubbleText( const Frame& f, DisplayBase display_base
results.push_back( "reset" );
results.push_back( "Line Reset" );
}
else if ( f.mType == SWDFT_JtagToSwd )
{
results.push_back( "JTAG to SWD sequence" );
results.push_back( "JtS" );
results.push_back( "JTAGtoSWD" );
results.push_back( "JTAG to SWD" );
}
else if( f.mType == SWDFT_Turnaround )
{
results.push_back( "Turnaround" );
Expand Down Expand Up @@ -102,18 +109,18 @@ void SWDAnalyzerResults::GetBubbleText( const Frame& f, DisplayBase display_base

results.push_back( "ACK" );
}
else if( f.mType == SWDFT_WData )
else if( ( f.mType == SWDFT_WData ) || ( f.mType == SWDFT_RData ) )
{
std::string data_str( int2str_sal( f.mData1, display_base, 32 ) );
SWDRegisters reg( SWDRegisters( f.mData2 ) );
std::string reg_name( GetRegisterName( reg ) );
std::string reg_value( GetRegisterValueDesc( reg, U32( f.mData1 ), display_base ) );

std::string prefix = ( f.mType == SWDFT_WData ) ? "WData" : "RData";
if( !reg_value.empty() )
results.push_back( "WData " + data_str + " reg " + reg_name + " bits " + reg_value );
results.push_back( "WData " + data_str + " reg " + reg_name );
results.push_back( "WData" );
results.push_back( "WData " + data_str );
results.push_back( prefix + " " + data_str + " reg " + reg_name + " bits " + reg_value );
results.push_back( prefix + " " + data_str + " reg " + reg_name );
results.push_back( prefix );
results.push_back( prefix + " " + data_str );
}
else if( f.mType == SWDFT_DataParity )
{
Expand Down Expand Up @@ -214,6 +221,13 @@ void SWDAnalyzerResults::GenerateExportFile( const char* file, DisplayBase displ
record.push_back( "Line reset" );
SaveRecord( record, of );
}
else if( f.mType == SWDFT_JtagToSwd)
{
SaveRecord( record, of );
record.push_back( GetSampleTimeStr( f.mStartingSampleInclusive ) );
record.push_back( "JTAG to SWD Sequence" );
SaveRecord( record, of );
}
else if( f.mType == SWDFT_Request )
{
SaveRecord( record, of );
Expand Down
50 changes: 41 additions & 9 deletions src/SWDTypes.cpp
Expand Up @@ -13,6 +13,7 @@
const int TRAN_REQ_AND_ACK = 8 + 1 + 3; // request/turnaround/ACK
const int TRAN_READ_LENGTH = TRAN_REQ_AND_ACK + 33; // previous + 32bit data + parity
const int TRAN_WRITE_LENGTH = TRAN_READ_LENGTH + 1; // previous + one bit for turnaround
const int TRAN_JTAG_TO_SWD = 16;

S64 SWDBit::GetMinStartEnd() const
{
Expand Down Expand Up @@ -108,7 +109,12 @@ void SWDOperation::AddFrames( SWDAnalyzerResults* pResults )
// data
f = bi->MakeFrame();
f.mEndingSampleInclusive = bi[ 31 ].GetEndSample();
f.mType = SWDFT_WData;
if( IsRead() )
{
f.mType = SWDFT_RData;
} else {
f.mType = SWDFT_WData;
}
f.mData1 = data;
f.mData2 = reg;
pResults->AddFrame( f );
Expand Down Expand Up @@ -147,14 +153,9 @@ void SWDOperation::AddMarkers( SWDAnalyzerResults* pResults )
if( ndx == 8 || ndx == 12 && !IsRead() )
pResults->AddMarker( ( bi->falling + bi->rising ) / 2, AnalyzerResults::X, pResults->GetSettings()->mSWCLK );

// write
else if( ndx < 8 || ndx > 12 && !IsRead() )
pResults->AddMarker( bi->falling, bi->state_falling == BIT_HIGH ? AnalyzerResults::One : AnalyzerResults::Zero,
pResults->GetSettings()->mSWCLK );
// read
else
pResults->AddMarker( bi->rising, bi->state_rising == BIT_HIGH ? AnalyzerResults::One : AnalyzerResults::Zero,
pResults->GetSettings()->mSWCLK );
// Data is always sampled by both ends on the rising edge.
pResults->AddMarker( bi->rising, bi->state_rising == BIT_HIGH ? AnalyzerResults::One : AnalyzerResults::Zero,
pResults->GetSettings()->mSWCLK );
}
}

Expand Down Expand Up @@ -238,6 +239,19 @@ void SWDLineReset::AddFrames( AnalyzerResults* pResults )

// ********************************************************************************

void SWDJtagToSwd::AddFrames( AnalyzerResults* pResults )
{
Frame f;
f.mStartingSampleInclusive = bits.front().GetStartSample();
f.mEndingSampleInclusive = bits.back().GetEndSample();
f.mType = SWDFT_JtagToSwd;
f.mData1 = bits.size();
pResults->AddFrame( f );
}

// ********************************************************************************


SWDParser::SWDParser() : mSWDIO( 0 ), mSWCLK( 0 )
{
}
Expand Down Expand Up @@ -491,3 +505,21 @@ bool SWDParser::IsLineReset( SWDLineReset& reset )

return true;
}

bool SWDParser::IsJtagToSwd( SWDJtagToSwd& jtagToSwd ) {
jtagToSwd.Clear();
uint16_t sequence = 0b0111100111100111;
for( size_t cnt = 0; cnt < 16; cnt++ )
{
if( cnt >= mBitsBuffer.size() )
mBitsBuffer.push_back( ParseBit() );

if( mBitsBuffer[ cnt ].IsHigh() != ( ( sequence >> ( 15 - cnt ) ) & 0b1 ) )
return false;
}

jtagToSwd.bits = mBitsBuffer;
mBitsBuffer.clear();

return true;
}
15 changes: 15 additions & 0 deletions src/SWDTypes.h
Expand Up @@ -12,11 +12,13 @@ enum SWDFrameTypes
SWDFT_Bit,

SWDFT_LineReset,
SWDFT_JtagToSwd,

SWDFT_Request,
SWDFT_Turnaround,
SWDFT_ACK,
SWDFT_WData,
SWDFT_RData,
SWDFT_DataParity,
SWDFT_TrailingBits,
};
Expand Down Expand Up @@ -131,6 +133,18 @@ struct SWDLineReset
void AddFrames( AnalyzerResults* pResults );
};

struct SWDJtagToSwd
{
std::vector<SWDBit> bits;

void Clear()
{
bits.clear();
}

void AddFrames( AnalyzerResults* pResults );
};

struct SWDRequestFrame : public Frame
{
// mData1 contains addr, mData2 contains the register enum
Expand Down Expand Up @@ -207,6 +221,7 @@ class SWDParser

bool IsOperation( SWDOperation& tran );
bool IsLineReset( SWDLineReset& reset );
bool IsJtagToSwd( SWDJtagToSwd& jtagToSwd );

SWDBit PopFrontBit();
};
Expand Down