From 918a7859fdd3c0d249b38129e37e6fe468ac3fa6 Mon Sep 17 00:00:00 2001 From: Aleksandr Sakharov Date: Mon, 10 Jun 2024 17:12:03 +0300 Subject: [PATCH 1/3] Added option for ignoring initial CLK state --- src/QSpiAnalyzer.cpp | 2 +- src/QSpiAnalyzerSettings.cpp | 11 +++++++++++ src/QSpiAnalyzerSettings.h | 2 ++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/QSpiAnalyzer.cpp b/src/QSpiAnalyzer.cpp index 62ba35d..cdd8bdd 100644 --- a/src/QSpiAnalyzer.cpp +++ b/src/QSpiAnalyzer.cpp @@ -154,7 +154,7 @@ void QSpiAnalyzer::AdvanceToActiveEnableEdge() bool QSpiAnalyzer::IsInitialClockPolarityCorrect() { - if (mSck->GetBitState() == mSettings->mClockIdle) { + if (mSck->GetBitState() == mSettings->mClockIdle || mSettings->mIgnoreInitialClkState) { return true; } diff --git a/src/QSpiAnalyzerSettings.cpp b/src/QSpiAnalyzerSettings.cpp index b0e1016..999a521 100644 --- a/src/QSpiAnalyzerSettings.cpp +++ b/src/QSpiAnalyzerSettings.cpp @@ -151,6 +151,11 @@ QSpiAnalyzerSettings::QSpiAnalyzerSettings() mDataRateInterface->AddNumber(QSpiTypes::DDR, "DDR", ""); mDataRateInterface->SetNumber(mDataRate); + mIgnoreInitialClkStateInterface.reset(new AnalyzerSettingInterfaceBool()); + mIgnoreInitialClkStateInterface->SetTitleAndTooltip("", "Ignore initial CS/CLK state"); + mIgnoreInitialClkStateInterface->SetCheckBoxText("Ignore initial CLK state"); + mIgnoreInitialClkStateInterface->SetValue(mIgnoreInitialClkState); + mUseShowMarkerInterface.reset(new AnalyzerSettingInterfaceBool()); mUseShowMarkerInterface->SetTitleAndTooltip("", "Show decode marker or not"); mUseShowMarkerInterface->SetCheckBoxText("Show Decode Marker"); @@ -181,6 +186,8 @@ QSpiAnalyzerSettings::QSpiAnalyzerSettings() AddInterface(mCsPreEnabledInterface.get()); AddInterface(mCsPostEnabledInterface.get()); + AddInterface(mIgnoreInitialClkStateInterface.get()); + AddInterface(mUseShowMarkerInterface.get()); AddExportOption(0, "Export as text/csv file"); @@ -259,6 +266,8 @@ bool QSpiAnalyzerSettings::SetSettingsFromInterfaces() mCsPreCycles = mCsPreEnabledInterface->GetNumber(); mCsPostCycles = mCsPostEnabledInterface->GetNumber(); + mIgnoreInitialClkState = mIgnoreInitialClkStateInterface->GetValue(); + mShowMarker = mUseShowMarkerInterface->GetValue(); ClearChannels(); @@ -395,5 +404,7 @@ void QSpiAnalyzerSettings::UpdateInterfacesFromSettings() mCsPreEnabledInterface->SetNumber(mCsPreCycles); mCsPostEnabledInterface->SetNumber(mCsPostCycles); + mIgnoreInitialClkStateInterface->SetValue(mIgnoreInitialClkState); + mUseShowMarkerInterface->SetValue(mShowMarker); } \ No newline at end of file diff --git a/src/QSpiAnalyzerSettings.h b/src/QSpiAnalyzerSettings.h index 90309e4..7ad24d8 100644 --- a/src/QSpiAnalyzerSettings.h +++ b/src/QSpiAnalyzerSettings.h @@ -61,6 +61,7 @@ class QSpiAnalyzerSettings : public AnalyzerSettings U32 mCsPreCycles; U32 mCsPostCycles; + bool mIgnoreInitialClkState; bool mShowMarker; protected: @@ -90,6 +91,7 @@ class QSpiAnalyzerSettings : public AnalyzerSettings std::unique_ptr< AnalyzerSettingInterfaceNumberList > mCsPreEnabledInterface; std::unique_ptr< AnalyzerSettingInterfaceNumberList > mCsPostEnabledInterface; + std::unique_ptr< AnalyzerSettingInterfaceBool > mIgnoreInitialClkStateInterface; std::unique_ptr< AnalyzerSettingInterfaceBool > mUseShowMarkerInterface; }; From bc07eccf372e82ec9a54971a7022b59571776566 Mon Sep 17 00:00:00 2001 From: Aleksandr Sakharov Date: Mon, 10 Jun 2024 17:28:41 +0300 Subject: [PATCH 2/3] Mini fix of losing clock polarity --- src/QSpiAnalyzer.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/QSpiAnalyzer.cpp b/src/QSpiAnalyzer.cpp index cdd8bdd..b10f235 100644 --- a/src/QSpiAnalyzer.cpp +++ b/src/QSpiAnalyzer.cpp @@ -154,7 +154,11 @@ void QSpiAnalyzer::AdvanceToActiveEnableEdge() bool QSpiAnalyzer::IsInitialClockPolarityCorrect() { - if (mSck->GetBitState() == mSettings->mClockIdle || mSettings->mIgnoreInitialClkState) { + if (mSck->GetBitState() == mSettings->mClockIdle) { + return true; + } + else if (mSettings->mIgnoreInitialClkState) { + mSck->AdvanceToNextEdge(); return true; } From df79cadeab3c28bc7de1c7e94bdaf981893d7ed0 Mon Sep 17 00:00:00 2001 From: Aleksandr Sakharov Date: Tue, 11 Jun 2024 15:47:44 +0300 Subject: [PATCH 3/3] Added generating V2 frames for compatibility with HLA analyzers https://support.saleae.com/saleae-api-and-sdk/protocol-analyzer-sdk/framev2-hla-support-analyzer-sdk --- src/QSpiAnalyzer.cpp | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/QSpiAnalyzer.cpp b/src/QSpiAnalyzer.cpp index b10f235..05135c4 100644 --- a/src/QSpiAnalyzer.cpp +++ b/src/QSpiAnalyzer.cpp @@ -15,6 +15,10 @@ QSpiAnalyzer::QSpiAnalyzer() mCs(NULL) { SetAnalyzerSettings(mSettings.get()); + +#if defined(LOGIC2) && (SOFTWARE == SALEAE) + UseFrameV2(); +#endif } QSpiAnalyzer::~QSpiAnalyzer() @@ -346,6 +350,37 @@ void QSpiAnalyzer::GetBlock() result_frame.mType = (U8)mTransactionState; mResults->AddFrame(result_frame); + +#if defined(LOGIC2) && (SOFTWARE == SALEAE) + FrameV2 frame_v2; + const char* state_str; + switch (mTransactionState) + { + case QSpiTypes::SETUP_STATE: + state_str = "SETUP"; + break; + case QSpiTypes::COMMAND_STATE: + state_str = "COMMAND"; + break; + case QSpiTypes::ADDRESS_STATE: + state_str = "ADDRESS"; + break; + case QSpiTypes::DUMMY_STATE: + state_str = "DUMMY"; + break; + case QSpiTypes::DATA_STATE: + state_str = "DATA"; + break; + default: + state_str = "UNDEFINED"; + break; + } + + frame_v2.AddInteger("data", data_word); + frame_v2.AddString("state", state_str); + mResults->AddFrameV2(frame_v2, "data_byte", result_frame.mStartingSampleInclusive, result_frame.mEndingSampleInclusive); +#endif + mResults->CommitResults(); if (advancing){