From b9e3542bcf1142e72c36cabad6249f6c7d42659b Mon Sep 17 00:00:00 2001 From: Max Brombach Date: Fri, 31 Oct 2025 16:02:02 +0000 Subject: [PATCH] Device: Use variant Core chip and fix ZChip flash for FIRE2 --- .../device/tree/neovifire2/neovifire2.h | 67 +++++++++++++++++-- 1 file changed, 60 insertions(+), 7 deletions(-) diff --git a/include/icsneo/device/tree/neovifire2/neovifire2.h b/include/icsneo/device/tree/neovifire2/neovifire2.h index e44d712..6603d43 100644 --- a/include/icsneo/device/tree/neovifire2/neovifire2.h +++ b/include/icsneo/device/tree/neovifire2/neovifire2.h @@ -11,6 +11,12 @@ namespace icsneo { class NeoVIFIRE2 : public Device { public: + enum class CoreChipVariant { + Core = 0, + Core_SG4 = 1, + Invalid = 2 + }; + // Serial numbers start with CY // USB PID is 0x1000, standard driver is DXX // Ethernet MAC allocation is 0x04, standard driver is Raw @@ -91,22 +97,65 @@ public: return ProductID::neoVIFIRE2; } + CoreChipVariant getCoreChipVariant() { + const auto& hardwareInfo = getHardwareInfo(std::chrono::milliseconds(1000)); + if(!hardwareInfo) { + chipVariant = CoreChipVariant::Invalid; + return chipVariant; + } + const auto& bootloaderVersion = hardwareInfo->bootloaderVersion; + if(bootloaderVersion.major >= CORE_SG4_BL_MAJOR_VERSION_CUTOFF) { + chipVariant = CoreChipVariant::Core_SG4; + } else { + chipVariant = CoreChipVariant::Core; + } + return chipVariant; + } + const std::vector& getChipInfo() const override { static std::vector chips = { {ChipID::neoVIFIRE2_MCHIP, true, "MCHIP", "fire2_mchip_ief", 0, FirmwareType::IEF}, {ChipID::neoVIFIRE2_ZYNQ, true, "ZCHIP", "fire2_zchip_ief", 1, FirmwareType::IEF}, {ChipID::neoVIFIRE2_Core, true, "Core", "fire2_core", 2, FirmwareType::IEF}, }; - return chips; + + static std::vector chipsSG4 = { + {ChipID::neoVIFIRE2_MCHIP, true, "MCHIP", "fire2_mchip_ief", 0, FirmwareType::IEF}, + {ChipID::neoVIFIRE2_ZYNQ, true, "ZCHIP", "fire2_zchip_ief", 1, FirmwareType::IEF}, + {ChipID::neoVIFIRE2_CORE_SG4, true, "Core", "fire2_core_sg4", 2, FirmwareType::IEF} + }; + + if(chipVariant == CoreChipVariant::Core_SG4) { + return chipsSG4; + } + + return chips; // Return the base chips even if the mode is invalid } BootloaderPipeline getBootloader() override { - return BootloaderPipeline() - .add() - .add(ChipID::neoVIFIRE2_MCHIP, BootloaderCommunication::RED) - .add(ChipID::neoVIFIRE2_ZYNQ, BootloaderCommunication::RED, false, true) - .add(ChipID::neoVIFIRE2_Core, BootloaderCommunication::REDCore, false, false) - .add(); + BootloaderPipeline pipeline; + pipeline.add() + .add(ChipID::neoVIFIRE2_MCHIP, BootloaderCommunication::RED); + if(chipVariant == CoreChipVariant::Core_SG4) { + pipeline.add(ChipID::neoVIFIRE2_CORE_SG4, BootloaderCommunication::REDCore, false, false); + } else { + pipeline.add(ChipID::neoVIFIRE2_Core, BootloaderCommunication::REDCore, false, false); + } + pipeline.add(ChipID::neoVIFIRE2_ZYNQ, BootloaderCommunication::RED, false, false) + .add(ChipID::neoVIFIRE2_MCHIP) + .add(); + return pipeline; + } + + std::vector getChipVersions(bool refreshComponents = true) override { + if(chipVariant == CoreChipVariant::Invalid) { + getCoreChipVariant(); + } + + if(refreshComponents) { + refreshComponentVersions(); + } + return Device::getChipVersions(); } protected: @@ -167,6 +216,10 @@ protected: size_t getDiskCount() const override { return 1; } + +private: + CoreChipVariant chipVariant = CoreChipVariant::Invalid; + constexpr static uint8_t CORE_SG4_BL_MAJOR_VERSION_CUTOFF = 5; }; }