mirror of
https://github.com/stacksmashing/LPCClocklessAnalyzer.git
synced 2026-01-30 19:08:38 +03:00
Working
This commit is contained in:
@@ -48,9 +48,44 @@ void LPCClocklessAnalyzer::addFrameLabel(uint64_t start, uint64_t end, uint64_t
|
|||||||
ReportProgress(end);
|
ReportProgress(end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t LPCClocklessAnalyzer::readAddress() {
|
||||||
|
uint32_t address = 0;
|
||||||
|
for(int i=0; i < 4; i++) {
|
||||||
|
mFrame->Advance( mSamplesPerBit );
|
||||||
|
advanceAllToFrame();
|
||||||
|
|
||||||
|
address |= getBits() << 4 * (3-i);
|
||||||
|
mResults->AddMarker( mFrame->GetSampleNumber(), AnalyzerResults::Dot, mSettings->mFrameChannel );
|
||||||
|
}
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LPCClocklessAnalyzer::skipTar() {
|
||||||
|
mFrame->Advance( mSamplesPerBit );
|
||||||
|
mFrame->Advance( mSamplesPerBit );
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t LPCClocklessAnalyzer::readData() {
|
||||||
|
uint8_t data = 0;
|
||||||
|
mFrame->Advance( mSamplesPerBit );
|
||||||
|
advanceAllToFrame();
|
||||||
|
data = getBits();
|
||||||
|
mFrame->Advance( mSamplesPerBit );
|
||||||
|
advanceAllToFrame();
|
||||||
|
data |= getBits() << 4;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t LPCClocklessAnalyzer::readSync() {
|
||||||
|
mFrame->Advance( mSamplesPerBit );
|
||||||
|
advanceAllToFrame();
|
||||||
|
return getBits();
|
||||||
|
}
|
||||||
|
|
||||||
void LPCClocklessAnalyzer::WorkerThread()
|
void LPCClocklessAnalyzer::WorkerThread()
|
||||||
{
|
{
|
||||||
mSampleRateHz = GetSampleRate();
|
mSampleRateHz = GetSampleRate();
|
||||||
|
mSamplesPerBit = mSampleRateHz / (mSettings->mBitRate * 1000);
|
||||||
mFrame = GetAnalyzerChannelData( mSettings->mFrameChannel );
|
mFrame = GetAnalyzerChannelData( mSettings->mFrameChannel );
|
||||||
for(int i=0; i < 4; i++) {
|
for(int i=0; i < 4; i++) {
|
||||||
mLadd[i] = GetAnalyzerChannelData( mSettings->mLaddChannel[i] );
|
mLadd[i] = GetAnalyzerChannelData( mSettings->mLaddChannel[i] );
|
||||||
@@ -60,14 +95,19 @@ void LPCClocklessAnalyzer::WorkerThread()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
// - U32 samples_per_bit = mSampleRateHz / mSettings->mBitRate;
|
// - U32 mSamplesPerBit = mSampleRateHz / mSettings->mBitRate;
|
||||||
|
|
||||||
U32 samples_per_bit = mSampleRateHz / (mSettings->mBitRate * 1000);
|
// mSamplesPerBit = mSampleRateHz / (mSettings->mBitRate * 1000);
|
||||||
std::cout << "Samples per bit: " << samples_per_bit << std::endl;
|
std::cout << "Samples per bit: " << mSamplesPerBit << std::endl;
|
||||||
// U32 samples_to_first_center_of_first_data_bit = U32( 1.5 * double( mSampleRateHz ) / double( mSettings->mBitRate ) );
|
// U32 samples_to_first_center_of_first_data_bit = U32( 1.5 * double( mSampleRateHz ) / double( mSettings->mBitRate ) );
|
||||||
|
|
||||||
for( ; ; )
|
for( ; ; )
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// Frame f;
|
||||||
|
// f.mType = 0x99;
|
||||||
|
|
||||||
|
|
||||||
bool is_write = false;
|
bool is_write = false;
|
||||||
|
|
||||||
U8 data = 0;
|
U8 data = 0;
|
||||||
@@ -77,7 +117,11 @@ void LPCClocklessAnalyzer::WorkerThread()
|
|||||||
if( mFrame->GetBitState() == BIT_HIGH )
|
if( mFrame->GetBitState() == BIT_HIGH )
|
||||||
mFrame->AdvanceToNextEdge();
|
mFrame->AdvanceToNextEdge();
|
||||||
|
|
||||||
mFrame->Advance(samples_per_bit/2);
|
|
||||||
|
|
||||||
|
uint64_t total_starting_sample = mFrame->GetSampleNumber();
|
||||||
|
|
||||||
|
mFrame->Advance(mSamplesPerBit/2);
|
||||||
advanceAllToFrame();
|
advanceAllToFrame();
|
||||||
// Check pattern
|
// Check pattern
|
||||||
uint8_t bits = getBits();
|
uint8_t bits = getBits();
|
||||||
@@ -92,96 +136,78 @@ void LPCClocklessAnalyzer::WorkerThread()
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// mLadd[0]->AdvanceToAbsPosition(mFrame->GetSampleNumber());
|
|
||||||
// // Often the ladd lines are delayed to the actual clock transition in my testing.
|
|
||||||
// if( mLadd[0]->GetBitState() == BIT_HIGH ) {
|
|
||||||
// mLadd[0]->AdvanceToNextEdge();
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
// mFrame->AdvanceToAbsPosition(mLadd[0]->GetSampleNumber());
|
|
||||||
// for(int i=1; i < 4; i++) {
|
|
||||||
// mLadd[i]->AdvanceToAbsPosition(mLadd[0]->GetSampleNumber());
|
|
||||||
// }
|
|
||||||
|
|
||||||
// std::cout << "Advancing..." << mFrame->GetSampleNumber() << std::endl;
|
|
||||||
|
|
||||||
// mFrame->Advance(samples_per_bit/2);
|
|
||||||
|
|
||||||
// mSerial->AdvanceToNextEdge(); //falling edge -- beginning of the start bit
|
|
||||||
|
|
||||||
U64 starting_sample = mFrame->GetSampleNumber();
|
U64 starting_sample = mFrame->GetSampleNumber();
|
||||||
|
|
||||||
|
|
||||||
// Go to CYCTYPE + DIR
|
// Go to CYCTYPE + DIR
|
||||||
// 0000 = read
|
// 0000 = read
|
||||||
// 0010 = write
|
// 0010 = write
|
||||||
|
mFrame->Advance( mSamplesPerBit );
|
||||||
mFrame->Advance( samples_per_bit );
|
|
||||||
advanceAllToFrame();
|
advanceAllToFrame();
|
||||||
|
|
||||||
uint8_t cyctype_dir = getBits();
|
uint8_t cyctype_dir = getBits();
|
||||||
if(cyctype_dir == 0x02) {
|
if(cyctype_dir == 0x02) {
|
||||||
printf("Is write\n");
|
// printf("Is write\n");
|
||||||
is_write = true;
|
is_write = true;
|
||||||
|
// f.is_write = true;
|
||||||
|
} else {
|
||||||
|
// f.is_write = false;
|
||||||
}
|
}
|
||||||
addFrameLabel(starting_sample, mFrame->GetSampleNumber(), cyctype_dir);
|
// addFrameLabel(starting_sample, mFrame->GetSampleNumber(), cyctype_dir);
|
||||||
// Frame frame;
|
|
||||||
// frame.mData1 = cyctype_dir;
|
|
||||||
// frame.mFlags = 0;
|
|
||||||
// frame.mStartingSampleInclusive = starting_sample;
|
|
||||||
// frame.mEndingSampleInclusive = mFrame->GetSampleNumber();
|
|
||||||
|
|
||||||
// mResults->AddFrame( frame );
|
|
||||||
// mResults->CommitResults();
|
|
||||||
//let's put a dot exactly where we sample this bit:
|
//let's put a dot exactly where we sample this bit:
|
||||||
mResults->AddMarker( mFrame->GetSampleNumber(), AnalyzerResults::Dot, mSettings->mFrameChannel );
|
mResults->AddMarker( mFrame->GetSampleNumber(), AnalyzerResults::Dot, mSettings->mFrameChannel );
|
||||||
|
|
||||||
starting_sample = mFrame->GetSampleNumber();
|
starting_sample = mFrame->GetSampleNumber();
|
||||||
// Iterate over address fields
|
// Iterate over address fields
|
||||||
uint32_t address = 0;
|
uint32_t address = readAddress();
|
||||||
for(int i=0; i < 4; i++) {
|
// f.address = address;
|
||||||
mFrame->Advance( samples_per_bit );
|
// addFrameLabel(starting_sample, mFrame->GetSampleNumber(), address);
|
||||||
advanceAllToFrame();
|
|
||||||
|
|
||||||
|
|
||||||
|
// Read data/TAR
|
||||||
|
if(is_write) {
|
||||||
|
starting_sample = mFrame->GetSampleNumber();
|
||||||
|
data = readData();
|
||||||
|
// f.data = data;
|
||||||
|
// addFrameLabel(starting_sample, mFrame->GetSampleNumber(), data);
|
||||||
|
skipTar();
|
||||||
|
starting_sample = mFrame->GetSampleNumber();
|
||||||
|
uint8_t sync = readSync();
|
||||||
|
// addFrameLabel(starting_sample, mFrame->GetSampleNumber(), sync);
|
||||||
|
skipTar();
|
||||||
|
} else {
|
||||||
|
skipTar();
|
||||||
|
// sync field
|
||||||
|
starting_sample = mFrame->GetSampleNumber();
|
||||||
|
while(readSync() != 0) {
|
||||||
|
|
||||||
address |= getBits() << 4 * (3-i);
|
|
||||||
mResults->AddMarker( mFrame->GetSampleNumber(), AnalyzerResults::Dot, mSettings->mFrameChannel );
|
|
||||||
}
|
}
|
||||||
addFrameLabel(starting_sample, mFrame->GetSampleNumber(), address);
|
// uint8_t sync = readSync();
|
||||||
// frame.mData1 = address;
|
// addFrameLabel(starting_sample, mFrame->GetSampleNumber(), sync);
|
||||||
// frame.mFlags = 0;
|
|
||||||
// frame.mStartingSampleInclusive = starting_sample;
|
|
||||||
// frame.mEndingSampleInclusive = mFrame->GetSampleNumber();
|
|
||||||
|
|
||||||
// mResults->AddFrame( frame );
|
// data field
|
||||||
// mResults->CommitResults();
|
starting_sample = mFrame->GetSampleNumber();
|
||||||
|
data = readData();
|
||||||
|
// f.data = data;
|
||||||
|
// addFrameLabel(starting_sample, mFrame->GetSampleNumber(), data);
|
||||||
|
|
||||||
|
skipTar();
|
||||||
|
}
|
||||||
|
|
||||||
// Next bits depend on whether read or write
|
uint64_t transfer =
|
||||||
|
((uint64_t)cyctype_dir << 40) |
|
||||||
|
((uint64_t)address << 8) |
|
||||||
|
(data);
|
||||||
|
|
||||||
|
addFrameLabel(total_starting_sample, mFrame->GetSampleNumber(), transfer);
|
||||||
|
// f.mFlags = 0;
|
||||||
|
// f.mStartingSampleInclusive = total_starting_sample;
|
||||||
|
// f.mEndingSampleInclusive = mFrame->GetSampleNumber();
|
||||||
|
// mResults->AddFrame( f );
|
||||||
|
|
||||||
|
mResults->CommitResults();
|
||||||
// if( mSerial->GetBitState() == BIT_HIGH )
|
ReportProgress(mFrame->GetSampleNumber());
|
||||||
// data |= mask;
|
|
||||||
|
|
||||||
// mFrame->Advance( samples_per_bit );
|
|
||||||
|
|
||||||
// mask = mask >> 1;
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
//we have a byte to save.
|
|
||||||
// Frame frame;
|
|
||||||
// // frame.mData1 = data;
|
|
||||||
// frame.mFlags = 0;
|
|
||||||
// frame.mStartingSampleInclusive = starting_sample;
|
|
||||||
// frame.mEndingSampleInclusive = mFrame->GetSampleNumber();
|
|
||||||
|
|
||||||
// mResults->AddFrame( frame );
|
|
||||||
// mResults->CommitResults();
|
|
||||||
// ReportProgress( frame.mEndingSampleInclusive );
|
|
||||||
|
|
||||||
mFrame->AdvanceToNextEdge();
|
mFrame->AdvanceToNextEdge();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ protected: //vars
|
|||||||
|
|
||||||
//Serial analysis vars:
|
//Serial analysis vars:
|
||||||
U32 mSampleRateHz;
|
U32 mSampleRateHz;
|
||||||
|
U32 mSamplesPerBit;
|
||||||
U32 mStartOfStopBitOffset;
|
U32 mStartOfStopBitOffset;
|
||||||
U32 mEndOfStopBitOffset;
|
U32 mEndOfStopBitOffset;
|
||||||
|
|
||||||
@@ -40,6 +41,10 @@ private:
|
|||||||
uint8_t getBits();
|
uint8_t getBits();
|
||||||
void advanceAllToFrame();
|
void advanceAllToFrame();
|
||||||
void addFrameLabel(uint64_t start, uint64_t end, uint64_t label);
|
void addFrameLabel(uint64_t start, uint64_t end, uint64_t label);
|
||||||
|
uint32_t readAddress();
|
||||||
|
void skipTar();
|
||||||
|
uint8_t readData();
|
||||||
|
uint8_t readSync();
|
||||||
};
|
};
|
||||||
|
|
||||||
extern "C" ANALYZER_EXPORT const char* __cdecl GetAnalyzerName();
|
extern "C" ANALYZER_EXPORT const char* __cdecl GetAnalyzerName();
|
||||||
|
|||||||
@@ -5,6 +5,8 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
LPCClocklessAnalyzerResults::LPCClocklessAnalyzerResults( LPCClocklessAnalyzer* analyzer, LPCClocklessAnalyzerSettings* settings )
|
LPCClocklessAnalyzerResults::LPCClocklessAnalyzerResults( LPCClocklessAnalyzer* analyzer, LPCClocklessAnalyzerSettings* settings )
|
||||||
: AnalyzerResults(),
|
: AnalyzerResults(),
|
||||||
mSettings( settings ),
|
mSettings( settings ),
|
||||||
@@ -22,8 +24,26 @@ void LPCClocklessAnalyzerResults::GenerateBubbleText( U64 frame_index, Channel&
|
|||||||
Frame frame = GetFrame( frame_index );
|
Frame frame = GetFrame( frame_index );
|
||||||
|
|
||||||
char number_str[128];
|
char number_str[128];
|
||||||
AnalyzerHelpers::GetNumberString( frame.mData1, display_base, 8, number_str, 128 );
|
AnalyzerHelpers::GetNumberString( frame.mData1, display_base, 48, number_str, 128 );
|
||||||
AddResultString( number_str );
|
AddResultString( stringForFrame(display_base, &frame).c_str() );
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string LPCClocklessAnalyzerResults::stringForFrame(DisplayBase display_base, Frame *f) {
|
||||||
|
uint64_t data = f->mData1;
|
||||||
|
std::string ret = "";
|
||||||
|
if((data & 0xff0000000000) == 0x020000000000) {
|
||||||
|
ret += "WRITE ";
|
||||||
|
} else {
|
||||||
|
ret += "READ ";
|
||||||
|
}
|
||||||
|
char address[128];
|
||||||
|
AnalyzerHelpers::GetNumberString((f->mData1 >> 8) & 0xFFFFFFFF, display_base, 32, address, 128);
|
||||||
|
ret += address;
|
||||||
|
ret += " DATA ";
|
||||||
|
char data_str[8];
|
||||||
|
AnalyzerHelpers::GetNumberString(f->mData1 & 0xFF, display_base, 8, data_str, 8);
|
||||||
|
ret += data_str;
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LPCClocklessAnalyzerResults::GenerateExportFile( const char* file, DisplayBase display_base, U32 export_type_user_id )
|
void LPCClocklessAnalyzerResults::GenerateExportFile( const char* file, DisplayBase display_base, U32 export_type_user_id )
|
||||||
@@ -61,12 +81,37 @@ void LPCClocklessAnalyzerResults::GenerateExportFile( const char* file, DisplayB
|
|||||||
void LPCClocklessAnalyzerResults::GenerateFrameTabularText( U64 frame_index, DisplayBase display_base )
|
void LPCClocklessAnalyzerResults::GenerateFrameTabularText( U64 frame_index, DisplayBase display_base )
|
||||||
{
|
{
|
||||||
#ifdef SUPPORTS_PROTOCOL_SEARCH
|
#ifdef SUPPORTS_PROTOCOL_SEARCH
|
||||||
|
|
||||||
Frame frame = GetFrame( frame_index );
|
Frame frame = GetFrame( frame_index );
|
||||||
|
// if(frame.mType == 0x99) {
|
||||||
|
// LPCFrame& req( ( LPCFrame& )frame);
|
||||||
|
// if(req.is_write) {
|
||||||
|
// AddTabularText("WRTE");
|
||||||
|
// } else {
|
||||||
|
// AddTabularText("READ");
|
||||||
|
// }
|
||||||
|
|
||||||
|
// char number_str[128];
|
||||||
|
// AnalyzerHelpers::GetNumberString( req.address, display_base, 8, number_str, 128 );
|
||||||
|
// AddTabularText( number_str );
|
||||||
|
|
||||||
|
// char number_str2[128];
|
||||||
|
// AnalyzerHelpers::GetNumberString( req.data, display_base, 8, number_str2, 128 );
|
||||||
|
// AddTabularText( number_str2 );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// } else {
|
||||||
ClearTabularText();
|
ClearTabularText();
|
||||||
|
|
||||||
char number_str[128];
|
char number_str[128];
|
||||||
AnalyzerHelpers::GetNumberString( frame.mData1, display_base, 8, number_str, 128 );
|
// AnalyzerHelpers::GetNumberString()
|
||||||
|
AnalyzerHelpers::GetNumberString( frame.mData1, display_base, 48, number_str, 128 );
|
||||||
AddTabularText( number_str );
|
AddTabularText( number_str );
|
||||||
|
AddResultString( stringForFrame(display_base, &frame).c_str() );
|
||||||
|
// AddTabularText("TEST");
|
||||||
|
// }
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,14 @@
|
|||||||
class LPCClocklessAnalyzer;
|
class LPCClocklessAnalyzer;
|
||||||
class LPCClocklessAnalyzerSettings;
|
class LPCClocklessAnalyzerSettings;
|
||||||
|
|
||||||
|
// struct LPCFrame : public Frame
|
||||||
|
// {
|
||||||
|
// bool is_write;
|
||||||
|
// uint32_t address;
|
||||||
|
// uint8_t sync;
|
||||||
|
// uint8_t data;
|
||||||
|
// };
|
||||||
|
|
||||||
class LPCClocklessAnalyzerResults : public AnalyzerResults
|
class LPCClocklessAnalyzerResults : public AnalyzerResults
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -18,6 +26,7 @@ public:
|
|||||||
virtual void GenerateFrameTabularText(U64 frame_index, DisplayBase display_base );
|
virtual void GenerateFrameTabularText(U64 frame_index, DisplayBase display_base );
|
||||||
virtual void GeneratePacketTabularText( U64 packet_id, DisplayBase display_base );
|
virtual void GeneratePacketTabularText( U64 packet_id, DisplayBase display_base );
|
||||||
virtual void GenerateTransactionTabularText( U64 transaction_id, DisplayBase display_base );
|
virtual void GenerateTransactionTabularText( U64 transaction_id, DisplayBase display_base );
|
||||||
|
std::string stringForFrame(DisplayBase display_base, Frame *f);
|
||||||
|
|
||||||
protected: //functions
|
protected: //functions
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user