start and addr working

This commit is contained in:
Thomas Roth
2023-10-12 01:32:58 +02:00
parent 665cfdee89
commit f911d69f4b
3 changed files with 133 additions and 21 deletions

View File

@@ -23,59 +23,166 @@ void LPCClocklessAnalyzer::SetupResults()
// mResults->AddChannelBubblesWillAppearOn( mSettings->mInputChannel ); // mResults->AddChannelBubblesWillAppearOn( mSettings->mInputChannel );
} }
uint8_t LPCClocklessAnalyzer::getBits() {
return (mLadd[3]->GetBitState() << 3) |
(mLadd[2]->GetBitState() << 2) |
(mLadd[1]->GetBitState() << 1) |
(mLadd[0]->GetBitState() << 0);
}
void LPCClocklessAnalyzer::advanceAllToFrame() {
for(int i=0; i < 4; i++) {
mLadd[i]->AdvanceToAbsPosition(mFrame->GetSampleNumber());
}
}
void LPCClocklessAnalyzer::addFrameLabel(uint64_t start, uint64_t end, uint64_t label) {
Frame frame;
frame.mData1 = label;
frame.mFlags = 0;
frame.mStartingSampleInclusive = start;
frame.mEndingSampleInclusive = end;
mResults->AddFrame( frame );
mResults->CommitResults();
ReportProgress(end);
}
void LPCClocklessAnalyzer::WorkerThread() void LPCClocklessAnalyzer::WorkerThread()
{ {
mSampleRateHz = GetSampleRate(); mSampleRateHz = GetSampleRate();
mFrame = GetAnalyzerChannelData( mSettings->mFrameChannel ); mFrame = GetAnalyzerChannelData( mSettings->mFrameChannel );
for(int i=0; i < 4; i++) {
mLadd[i] = GetAnalyzerChannelData( mSettings->mLaddChannel[i] );
}
// mSerial = GetAnalyzerChannelData( mSettings->mInputChannel ); // mSerial = GetAnalyzerChannelData( mSettings->mInputChannel );
if( mFrame->GetBitState() == BIT_HIGH )
mFrame->AdvanceToNextEdge();
// - U32 samples_per_bit = mSampleRateHz / mSettings->mBitRate;
U32 samples_per_bit = mSampleRateHz / 33000000; U32 samples_per_bit = mSampleRateHz / (mSettings->mBitRate * 1000);
std::cout << "Samples per bit: " << samples_per_bit << std::endl; std::cout << "Samples per bit: " << samples_per_bit << 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( ; ; )
{ {
bool is_write = false;
U8 data = 0; U8 data = 0;
U8 mask = 1 << 7; U8 mask = 1 << 7;
// std::cout << "Advancing..." << mFrame->GetSampleNumber() << std::endl;
if( mFrame->GetBitState() == BIT_HIGH )
mFrame->AdvanceToNextEdge();
mFrame->Advance(samples_per_bit/2); mFrame->Advance(samples_per_bit/2);
advanceAllToFrame();
// Check pattern
uint8_t bits = getBits();
// printf("Bits: %d\n", bits);
if(getBits() == 0b0101) {
mResults->AddMarker( mFrame->GetSampleNumber(), AnalyzerResults::Start, mSettings->mFrameChannel );
} else {
mResults->AddMarker( mFrame->GetSampleNumber(), AnalyzerResults::ErrorX, mSettings->mFrameChannel );
mFrame->AdvanceToNextEdge();
mResults->CommitResults();
ReportProgress( mFrame->GetSampleNumber() );
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 // mSerial->AdvanceToNextEdge(); //falling edge -- beginning of the start bit
U64 starting_sample = mFrame->GetSampleNumber(); U64 starting_sample = mFrame->GetSampleNumber();
// mSerial->Advance( samples_to_first_center_of_first_data_bit );
for( U32 i=0; i<8; i++ ) // Go to CYCTYPE + DIR
{ // 0000 = read
//let's put a dot exactly where we sample this bit: // 0010 = write
mFrame->Advance( samples_per_bit );
advanceAllToFrame();
uint8_t cyctype_dir = getBits();
if(cyctype_dir == 0x02) {
printf("Is write\n");
is_write = true;
}
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:
mResults->AddMarker( mFrame->GetSampleNumber(), AnalyzerResults::Dot, mSettings->mFrameChannel );
starting_sample = mFrame->GetSampleNumber();
// Iterate over address fields
uint32_t address = 0;
for(int i=0; i < 4; i++) {
mFrame->Advance( samples_per_bit );
advanceAllToFrame();
address |= getBits() << 4 * (3-i);
mResults->AddMarker( mFrame->GetSampleNumber(), AnalyzerResults::Dot, mSettings->mFrameChannel ); mResults->AddMarker( mFrame->GetSampleNumber(), AnalyzerResults::Dot, mSettings->mFrameChannel );
}
addFrameLabel(starting_sample, mFrame->GetSampleNumber(), address);
// frame.mData1 = address;
// frame.mFlags = 0;
// frame.mStartingSampleInclusive = starting_sample;
// frame.mEndingSampleInclusive = mFrame->GetSampleNumber();
// mResults->AddFrame( frame );
// mResults->CommitResults();
// Next bits depend on whether read or write
// if( mSerial->GetBitState() == BIT_HIGH ) // if( mSerial->GetBitState() == BIT_HIGH )
// data |= mask; // data |= mask;
mFrame->Advance( samples_per_bit ); // mFrame->Advance( samples_per_bit );
// mask = mask >> 1; // mask = mask >> 1;
} // }
//we have a byte to save. //we have a byte to save.
Frame frame; // Frame frame;
// frame.mData1 = data; // // frame.mData1 = data;
frame.mFlags = 0; // frame.mFlags = 0;
frame.mStartingSampleInclusive = starting_sample; // frame.mStartingSampleInclusive = starting_sample;
frame.mEndingSampleInclusive = mFrame->GetSampleNumber(); // frame.mEndingSampleInclusive = mFrame->GetSampleNumber();
mResults->AddFrame( frame ); // mResults->AddFrame( frame );
mResults->CommitResults(); // mResults->CommitResults();
ReportProgress( frame.mEndingSampleInclusive ); // ReportProgress( frame.mEndingSampleInclusive );
mFrame->AdvanceToNextEdge();
} }
} }

View File

@@ -35,6 +35,11 @@ protected: //vars
U32 mSampleRateHz; U32 mSampleRateHz;
U32 mStartOfStopBitOffset; U32 mStartOfStopBitOffset;
U32 mEndOfStopBitOffset; U32 mEndOfStopBitOffset;
private:
uint8_t getBits();
void advanceAllToFrame();
void addFrameLabel(uint64_t start, uint64_t end, uint64_t label);
}; };
extern "C" ANALYZER_EXPORT const char* __cdecl GetAnalyzerName(); extern "C" ANALYZER_EXPORT const char* __cdecl GetAnalyzerName();

View File

@@ -5,7 +5,7 @@
LPCClocklessAnalyzerSettings::LPCClocklessAnalyzerSettings() : LPCClocklessAnalyzerSettings::LPCClocklessAnalyzerSettings() :
// : mInputChannel( UNDEFINED_CHANNEL ), // : mInputChannel( UNDEFINED_CHANNEL ),
mFrameChannel( UNDEFINED_CHANNEL ), mFrameChannel( UNDEFINED_CHANNEL ),
mBitRate( 9600 ) mBitRate( 25000000 )
{ {
ClearChannels(); ClearChannels();
for(int i=0; i < 4; i++) { for(int i=0; i < 4; i++) {
@@ -29,7 +29,7 @@ LPCClocklessAnalyzerSettings::LPCClocklessAnalyzerSettings() :
mBitRateInterface.reset( new AnalyzerSettingInterfaceInteger() ); mBitRateInterface.reset( new AnalyzerSettingInterfaceInteger() );
mBitRateInterface->SetTitleAndTooltip( "Bit Rate (Bits/S)", "Specify the bit rate in bits per second." ); mBitRateInterface->SetTitleAndTooltip( "Bit Rate (Bits/S)", "Specify the bit rate in bits per second." );
mBitRateInterface->SetMax( 6000000 ); mBitRateInterface->SetMax( 50000000 );
mBitRateInterface->SetMin( 1 ); mBitRateInterface->SetMin( 1 );
mBitRateInterface->SetInteger( mBitRate ); mBitRateInterface->SetInteger( mBitRate );