From bbf348a6abf7a2f9a5348f596508c5137c4f2d3f Mon Sep 17 00:00:00 2001 From: Kyle Schwarz Date: Mon, 24 Apr 2023 22:39:35 +0000 Subject: [PATCH] Device: Add RADMoon2ZL Also adds a base class for both Moon2 device types. --- device/devicefinder.cpp | 6 +- include/icsneo/device/idevicesettings.h | 4 +- .../icsneo/device/tree/radmoon2/radmoon2.h | 74 ++--------------- .../device/tree/radmoon2/radmoon2base.h | 82 +++++++++++++++++++ .../icsneo/device/tree/radmoon2/radmoon2zl.h | 29 +++++++ include/icsneo/icsnVC40.h | 4 +- include/icsneo/platform/posix/devices.h | 1 + include/icsneo/platform/windows/devices.h | 1 + 8 files changed, 132 insertions(+), 69 deletions(-) create mode 100644 include/icsneo/device/tree/radmoon2/radmoon2base.h create mode 100644 include/icsneo/device/tree/radmoon2/radmoon2zl.h diff --git a/device/devicefinder.cpp b/device/devicefinder.cpp index b0fff8f..a94b2b7 100644 --- a/device/devicefinder.cpp +++ b/device/devicefinder.cpp @@ -185,6 +185,10 @@ std::vector> DeviceFinder::FindAll() { makeIfSerialMatches(dev, newFoundDevices); #endif + #ifdef __RADMOON2ZL_H_ + makeIfSerialMatches(dev, newFoundDevices); + #endif + #ifdef __RADMOON3_H_ makeIfSerialMatches(dev, newFoundDevices); #endif @@ -312,7 +316,7 @@ const std::vector& DeviceFinder::GetSupportedDevices() { RADGigastar::DEVICE_TYPE, #endif - #ifdef __RADMOON2_H_ + #if defined __RADMOON2_H_ || defined __RADMOON2ZL_H_ RADMoon2::DEVICE_TYPE, #endif diff --git a/include/icsneo/device/idevicesettings.h b/include/icsneo/device/idevicesettings.h index 7f893da..81e5ce5 100644 --- a/include/icsneo/device/idevicesettings.h +++ b/include/icsneo/device/idevicesettings.h @@ -159,7 +159,9 @@ typedef struct OP_ETH_SETTINGS_t unsigned char mac_addr2[6];// Target Addr for spoofing unsigned short mac_spoofing_en : 1; unsigned short mac_spoofing_isDstOrSrc : 1; - unsigned short reserved : 14; + unsigned short link_spd : 2; + unsigned short q2112_phy_mode : 1; + unsigned short reserved : 11; }; unsigned char reserved0[14]; }; diff --git a/include/icsneo/device/tree/radmoon2/radmoon2.h b/include/icsneo/device/tree/radmoon2/radmoon2.h index a4312c9..7f7919b 100644 --- a/include/icsneo/device/tree/radmoon2/radmoon2.h +++ b/include/icsneo/device/tree/radmoon2/radmoon2.h @@ -3,91 +3,33 @@ #ifdef __cplusplus -#include "icsneo/device/device.h" -#include "icsneo/device/devicetype.h" +#include "icsneo/device/tree/radmoon2/radmoon2base.h" #include "icsneo/device/tree/radmoon2/radmoon2settings.h" namespace icsneo { -class RADMoon2 : public Device { +class RADMoon2 : public RADMoon2Base { public: // Serial numbers start with RM // USB PID is 0x1202, standard driver is FTDI3 ICSNEO_FINDABLE_DEVICE(RADMoon2, DeviceType::RADMoon2, "RM"); - enum class SKU { - Standard, - APM1000E, // Keysight Branding - APM1000E_CLK, // Clock Option and Keysight Branding - }; - - SKU getSKU() const { - switch(getSerial().back()) { - case 'A': - case 'B': - return SKU::APM1000E; - case 'C': - case 'D': - return SKU::APM1000E_CLK; - default: - return SKU::Standard; - } - } - - std::string getProductName() const override { - switch(getSKU()) { - case SKU::Standard: break; - case SKU::APM1000E: - return "Keysight APM1000E"; - case SKU::APM1000E_CLK: - return "Keysight APM1000E-CLK"; - } - return Device::getProductName(); - } - - // RADMoon 2 does not go online, you can only set settings and - // view PHY information (when supported) - bool goOnline() override { - report(APIEvent::Type::OnlineNotSupported, APIEvent::Severity::Error); - return false; - } - - bool goOffline() override { - report(APIEvent::Type::OnlineNotSupported, APIEvent::Severity::Error); - return false; - } - - bool getEthPhyRegControlSupported() const override { return true; } + uint8_t getPhyAddrOrPort() const override { return 6; }; protected: - RADMoon2(neodevice_t neodevice, const driver_factory_t& makeDriver) : Device(neodevice) { + RADMoon2(neodevice_t neodevice, const driver_factory_t& makeDriver) : RADMoon2Base(neodevice) { initialize(makeDriver); } - void setupPacketizer(Packetizer& packetizer) override { - Device::setupPacketizer(packetizer); - packetizer.disableChecksum = true; - packetizer.align16bit = false; - } - - virtual void setupEncoder(Encoder& encoder) override { - Device::setupEncoder(encoder); - encoder.supportEthPhy = true; - } - void setupDecoder(Decoder& decoder) override { Device::setupDecoder(decoder); decoder.timestampResolution = 10; // Timestamps are in 10ns increments instead of the usual 25ns } - bool requiresVehiclePower() const override { return false; } - - std::optional getCoreminiStartAddressFlash() const override { - return 512*4; - } - - std::optional getCoreminiStartAddressSD() const override { - return 0; + void setupPacketizer(Packetizer& packetizer) override { + Device::setupPacketizer(packetizer); + packetizer.disableChecksum = true; + packetizer.align16bit = false; } }; diff --git a/include/icsneo/device/tree/radmoon2/radmoon2base.h b/include/icsneo/device/tree/radmoon2/radmoon2base.h new file mode 100644 index 0000000..30eb928 --- /dev/null +++ b/include/icsneo/device/tree/radmoon2/radmoon2base.h @@ -0,0 +1,82 @@ +#ifndef __RADMOON2BASE_H_ +#define __RADMOON2BASE_H_ + +#ifdef __cplusplus + +#include "icsneo/device/device.h" +#include "icsneo/device/devicetype.h" + +namespace icsneo { + +class RADMoon2Base : public Device { +public: + enum class SKU { + Standard, + APM1000E, // Keysight Branding + APM1000E_CLK, // Clock Option and Keysight Branding + }; + + SKU getSKU() const { + switch(getSerial().back()) { + case 'A': + case 'B': + return SKU::APM1000E; + case 'C': + case 'D': + return SKU::APM1000E_CLK; + default: + return SKU::Standard; + } + } + + std::string getProductName() const override { + switch(getSKU()) { + case SKU::Standard: break; + case SKU::APM1000E: + return "Keysight APM1000E"; + case SKU::APM1000E_CLK: + return "Keysight APM1000E-CLK"; + } + return Device::getProductName(); + } + + // RADMoon 2 does not go online, you can only set settings and + // view PHY information (when supported) + bool goOnline() override { + report(APIEvent::Type::OnlineNotSupported, APIEvent::Severity::Error); + return false; + } + + bool goOffline() override { + report(APIEvent::Type::OnlineNotSupported, APIEvent::Severity::Error); + return false; + } + + bool getEthPhyRegControlSupported() const override { return true; } + + virtual uint8_t getPhyAddrOrPort() const = 0; + +protected: + using Device::Device; + + virtual void setupEncoder(Encoder& encoder) override { + Device::setupEncoder(encoder); + encoder.supportEthPhy = true; + } + + bool requiresVehiclePower() const override { return false; } + + std::optional getCoreminiStartAddressFlash() const override { + return std::nullopt; + } + + std::optional getCoreminiStartAddressSD() const override { + return std::nullopt; + } +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/include/icsneo/device/tree/radmoon2/radmoon2zl.h b/include/icsneo/device/tree/radmoon2/radmoon2zl.h new file mode 100644 index 0000000..8c4ef40 --- /dev/null +++ b/include/icsneo/device/tree/radmoon2/radmoon2zl.h @@ -0,0 +1,29 @@ +#ifndef __RADMOON2ZL_H_ +#define __RADMOON2ZL_H_ + +#ifdef __cplusplus + +#include "icsneo/device/tree/radmoon2/radmoon2base.h" +#include "icsneo/device/tree/radmoon2/radmoon2settings.h" + +namespace icsneo { + +class RADMoon2ZL : public RADMoon2Base { +public: + // Serial numbers start with RN + // USB PID is 0x110C, standard driver is CDCACM + ICSNEO_FINDABLE_DEVICE(RADMoon2ZL, DeviceType::RADMoon2, "RN"); + + uint8_t getPhyAddrOrPort() const override { return 1; } + +protected: + RADMoon2ZL(neodevice_t neodevice, const driver_factory_t& makeDriver) : RADMoon2Base(neodevice) { + initialize(makeDriver); + } +}; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/include/icsneo/icsnVC40.h b/include/icsneo/icsnVC40.h index 331554c..0527753 100644 --- a/include/icsneo/icsnVC40.h +++ b/include/icsneo/icsnVC40.h @@ -944,7 +944,9 @@ typedef struct OP_ETH_SETTINGS_t unsigned char mac_addr2[6];// Target Addr for spoofing unsigned short mac_spoofing_en : 1; unsigned short mac_spoofing_isDstOrSrc : 1; - unsigned short reserved : 14; + unsigned short link_spd : 2; + unsigned short q2112_phy_mode : 1; + unsigned short reserved : 11; }; unsigned char reserved0[14]; }; diff --git a/include/icsneo/platform/posix/devices.h b/include/icsneo/platform/posix/devices.h index ba278a6..21af8dd 100644 --- a/include/icsneo/platform/posix/devices.h +++ b/include/icsneo/platform/posix/devices.h @@ -19,6 +19,7 @@ #include "icsneo/device/tree/radjupiter/radjupiter.h" #include "icsneo/device/tree/radmars/radmars.h" #include "icsneo/device/tree/radmoon2/radmoon2.h" +#include "icsneo/device/tree/radmoon2/radmoon2zl.h" #include "icsneo/device/tree/radmoon3/radmoon3.h" #include "icsneo/device/tree/radmoonduo/radmoonduo.h" #include "icsneo/device/tree/radpluto/radpluto.h" diff --git a/include/icsneo/platform/windows/devices.h b/include/icsneo/platform/windows/devices.h index a6cd5b7..ae88f0c 100644 --- a/include/icsneo/platform/windows/devices.h +++ b/include/icsneo/platform/windows/devices.h @@ -19,6 +19,7 @@ #include "icsneo/device/tree/radjupiter/radjupiter.h" #include "icsneo/device/tree/radmars/radmars.h" #include "icsneo/device/tree/radmoon2/radmoon2.h" +#include "icsneo/device/tree/radmoon2/radmoon2zl.h" #include "icsneo/device/tree/radmoon3/radmoon3.h" #include "icsneo/device/tree/radmoonduo/radmoonduo.h" #include "icsneo/device/tree/radpluto/radpluto.h"