From e73f61bfcca8c2ba34eb026016f77676f8403179 Mon Sep 17 00:00:00 2001 From: Bryant Jones Date: Mon, 21 Oct 2024 20:00:29 +0000 Subject: [PATCH] Device: Add RADGigastar2 --- HARDWARE.md | 2 + device/devicefinder.cpp | 8 + include/icsneo/device/devicetype.h | 6 +- .../device/tree/radgigastar2/radgigastar2.h | 139 ++++++++++ .../tree/radgigastar2/radgigastar2settings.h | 243 ++++++++++++++++++ include/icsneo/platform/posix/devices.h | 1 + include/icsneo/platform/windows/devices.h | 1 + 7 files changed, 399 insertions(+), 1 deletion(-) create mode 100644 include/icsneo/device/tree/radgigastar2/radgigastar2.h create mode 100644 include/icsneo/device/tree/radgigastar2/radgigastar2settings.h diff --git a/HARDWARE.md b/HARDWARE.md index ee0d5bf..6948011 100644 --- a/HARDWARE.md +++ b/HARDWARE.md @@ -28,6 +28,7 @@ - CAN works - CAN FD works - Ethernet works + - RADGigastar2 - Connecting over USB - ValueCAN 4 series @@ -60,3 +61,4 @@ - Ethernet works - RADMoonT1S - Ethernet works + - RADGigastar2 diff --git a/device/devicefinder.cpp b/device/devicefinder.cpp index c02dc85..17770ab 100644 --- a/device/devicefinder.cpp +++ b/device/devicefinder.cpp @@ -204,6 +204,10 @@ std::vector> DeviceFinder::FindAll() { #ifdef __RADGIGASTAR_H_ makeIfSerialMatches(dev, newFoundDevices); #endif + + #ifdef __RADGIGASTAR2_H_ + makeIfSerialMatches(dev, newFoundDevices); + #endif #ifdef __RADJUPITER_H_ makeIfSerialMatches(dev, newFoundDevices); @@ -356,6 +360,10 @@ const std::vector& DeviceFinder::GetSupportedDevices() { RADGigastar::DEVICE_TYPE, #endif + #ifdef __RADGIGASTAR2_H_ + RADGigastar2::DEVICE_TYPE, + #endif + #if defined __RADMOON2_H_ || defined __RADMOON2ZL_H_ RADMoon2::DEVICE_TYPE, #endif diff --git a/include/icsneo/device/devicetype.h b/include/icsneo/device/devicetype.h index 3e68df9..c6d377e 100644 --- a/include/icsneo/device/devicetype.h +++ b/include/icsneo/device/devicetype.h @@ -53,6 +53,7 @@ public: Connect = (0x00000026), RADComet3 = (0x00000027), RADMoonT1S = (0x00000028), + RADGigastar2 = (0x00000029), RED = (0x00000040), ECU = (0x00000080), IEVB = (0x00000100), @@ -195,6 +196,8 @@ public: return "RAD-Moon T1S"; case Connect: return "neoVI Connect"; + case RADGigastar2: + return "RAD-Gigastar 2"; case DONT_REUSE0: case DONT_REUSE1: case DONT_REUSE2: @@ -251,6 +254,7 @@ private: #define ICSNEO_DEVICETYPE_CONNECT ((devicetype_t)0x00000026) #define ICSNEO_DEVICETYPE_RADCOMET3 ((devicetype_t)0x00000027) #define ICSNEO_DEVICETYPE_RADMOONT1S ((devicetype_t)0x00000028) +#define ICSNEO_DEVICETYPE_RADGIGASTAR2 ((devicetype_t)0x00000029) #define ICSNEO_DEVICETYPE_RED ((devicetype_t)0x00000040) #define ICSNEO_DEVICETYPE_ECU ((devicetype_t)0x00000080) #define ICSNEO_DEVICETYPE_IEVB ((devicetype_t)0x00000100) @@ -279,4 +283,4 @@ private: #define ICSNEO_DEVICETYPE_OBD2_SIM ((devicetype_t)0x80000000) #endif -#endif \ No newline at end of file +#endif diff --git a/include/icsneo/device/tree/radgigastar2/radgigastar2.h b/include/icsneo/device/tree/radgigastar2/radgigastar2.h new file mode 100644 index 0000000..700e168 --- /dev/null +++ b/include/icsneo/device/tree/radgigastar2/radgigastar2.h @@ -0,0 +1,139 @@ +#ifndef __RADGIGASTAR2_H_ +#define __RADGIGASTAR2_H_ + +#ifdef __cplusplus + +#include "icsneo/device/device.h" +#include "icsneo/device/devicetype.h" +#include "icsneo/disk/extextractordiskreaddriver.h" +#include "icsneo/disk/neomemorydiskdriver.h" +#include "icsneo/device/tree/radgigastar2/radgigastar2settings.h" + +namespace icsneo +{ + + class RADGigastar2 : public Device + { + public: + // Serial numbers start with GT + // USB PID is 0x1210, standard driver is FTDI3 + // Ethernet MAC allocation is 0x22, standard driver is Raw + ICSNEO_FINDABLE_DEVICE(RADGigastar2, DeviceType::RADGigastar2, "GT"); + + static const std::vector &GetSupportedNetworks() + { + static std::vector supportedNetworks = { + Network::NetID::HSCAN, + Network::NetID::HSCAN2, + Network::NetID::HSCAN3, + Network::NetID::HSCAN4, + + Network::NetID::Ethernet, + Network::NetID::Ethernet2, + + Network::NetID::OP_Ethernet1, + Network::NetID::OP_Ethernet2, + Network::NetID::OP_Ethernet3, + Network::NetID::OP_Ethernet4, + Network::NetID::OP_Ethernet5, + Network::NetID::OP_Ethernet6, + Network::NetID::OP_Ethernet7, + Network::NetID::OP_Ethernet8, + Network::NetID::OP_Ethernet9, + Network::NetID::OP_Ethernet10, + + Network::NetID::LIN, + Network::NetID::LIN2, + Network::NetID::LIN3, + Network::NetID::LIN4, + Network::NetID::LIN5, + Network::NetID::LIN6, + Network::NetID::LIN7, + Network::NetID::LIN8, + Network::NetID::LIN9, + Network::NetID::LIN10, + + Network::NetID::I2C, + Network::NetID::I2C2, + + Network::NetID::MDIO1, + Network::NetID::MDIO2, + + Network::NetID::SPI1, + Network::NetID::SPI2, + Network::NetID::SPI3, + Network::NetID::SPI4, + Network::NetID::SPI5, + Network::NetID::SPI6, + Network::NetID::SPI7, + Network::NetID::SPI8, + }; + return supportedNetworks; + } + + size_t getEthernetActivationLineCount() const override { return 1; } + + bool getEthPhyRegControlSupported() const override { return true; } + + bool supportsTC10() const override { return true; } + + protected: + RADGigastar2(neodevice_t neodevice, const driver_factory_t &makeDriver) : Device(neodevice) + { + initialize(makeDriver); + } + + void setupPacketizer(Packetizer &packetizer) override + { + Device::setupPacketizer(packetizer); + packetizer.disableChecksum = true; + packetizer.align16bit = false; + } + + void setupDecoder(Decoder &decoder) override + { + Device::setupDecoder(decoder); + decoder.timestampResolution = 10; // Timestamps are in 10ns increments instead of the usual 25ns + } + + void setupEncoder(Encoder &encoder) override + { + Device::setupEncoder(encoder); + encoder.supportCANFD = true; + encoder.supportEthPhy = true; + } + + void setupSupportedRXNetworks(std::vector &rxNetworks) override + { + for (auto &netid : GetSupportedNetworks()) + rxNetworks.emplace_back(netid); + } + + // The supported TX networks are the same as the supported RX networks for this device + void setupSupportedTXNetworks(std::vector &txNetworks) override { setupSupportedRXNetworks(txNetworks); } + + void handleDeviceStatus(const std::shared_ptr &message) override + { + if (message->data.size() < sizeof(radgigastar2_status_t)) + return; + std::lock_guard lk(ioMutex); + const radgigastar2_status_t *status = reinterpret_cast(message->data.data()); + ethActivationStatus = status->ethernetActivationLineEnabled; + } + + std::optional getCoreminiStartAddressFlash() const override + { + return 512 * 4; + } + + std::optional getCoreminiStartAddressSD() const override + { + return 0; + } + }; + +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/include/icsneo/device/tree/radgigastar2/radgigastar2settings.h b/include/icsneo/device/tree/radgigastar2/radgigastar2settings.h new file mode 100644 index 0000000..db31512 --- /dev/null +++ b/include/icsneo/device/tree/radgigastar2/radgigastar2settings.h @@ -0,0 +1,243 @@ +#ifndef __RADGIGASTAR2SETTINGS_H_ +#define __RADGIGASTAR2SETTINGS_H_ + +#include +#include "icsneo/device/idevicesettings.h" + +#ifdef __cplusplus + +namespace icsneo +{ + +#endif + +#pragma pack(push, 2) + typedef struct + { + uint32_t ecu_id; + uint16_t perf_en; + struct + { + uint16_t hwComLatencyTestEn : 1; + uint16_t disableUsbCheckOnBoot : 1; + uint16_t reserved : 14; + } flags; + uint16_t network_enabled_on_boot; + CAN_SETTINGS can1; + CANFD_SETTINGS canfd1; + CAN_SETTINGS can2; + CANFD_SETTINGS canfd2; + CAN_SETTINGS can3; + CANFD_SETTINGS canfd3; + CAN_SETTINGS can4; + CANFD_SETTINGS canfd4; + + ISO9141_KEYWORD2000_SETTINGS iso9141_kwp_settings_1; + uint16_t iso_parity_1; + uint16_t iso_msg_termination_1; + ISO9141_KEYWORD2000_SETTINGS iso9141_kwp_settings_2; + uint16_t iso_parity_2; + uint16_t iso_msg_termination_2; + ISO9141_KEYWORD2000_SETTINGS iso9141_kwp_settings_3; + uint16_t iso_parity_3; + uint16_t iso_msg_termination_3; + ISO9141_KEYWORD2000_SETTINGS iso9141_kwp_settings_4; + uint16_t iso_parity_4; + uint16_t iso_msg_termination_4; + ISO9141_KEYWORD2000_SETTINGS iso9141_kwp_settings_5; + uint16_t iso_parity_5; + uint16_t iso_msg_termination_5; + ISO9141_KEYWORD2000_SETTINGS iso9141_kwp_settings_6; + uint16_t iso_parity_6; + uint16_t iso_msg_termination_6; + ISO9141_KEYWORD2000_SETTINGS iso9141_kwp_settings_7; + uint16_t iso_parity_7; + uint16_t iso_msg_termination_7; + ISO9141_KEYWORD2000_SETTINGS iso9141_kwp_settings_8; + uint16_t iso_parity_8; + uint16_t iso_msg_termination_8; + ISO9141_KEYWORD2000_SETTINGS iso9141_kwp_settings_9; + uint16_t iso_parity_9; + uint16_t iso_msg_termination_9; + ISO9141_KEYWORD2000_SETTINGS iso9141_kwp_settings_10; + uint16_t iso_parity_10; + uint16_t iso_msg_termination_10; + uint64_t network_enables; + uint64_t network_enables_2; + uint64_t termination_enables; + TIMESYNC_ICSHARDWARE_SETTINGS timeSyncSettings; + RAD_REPORTING_SETTINGS reporting; + int16_t iso15765_separation_time_offset; + uint32_t pwr_man_timeout; + uint16_t pwr_man_enable; + RAD_GPTP_SETTINGS gPTP; + STextAPISettings text_api; + DISK_SETTINGS disk; + LOGGER_SETTINGS logger; + LIN_SETTINGS lin1; + LIN_SETTINGS lin2; + LIN_SETTINGS lin3; + LIN_SETTINGS lin4; + LIN_SETTINGS lin5; + LIN_SETTINGS lin6; + LIN_SETTINGS lin7; + LIN_SETTINGS lin8; + LIN_SETTINGS lin9; + LIN_SETTINGS lin10; + // TODO more LIN + // Ethernet SFP + ETHERNET_SETTINGS2 ethernet1; + ETHERNET_SETTINGS2 ethernet2; + // Ethernet General + OP_ETH_GENERAL_SETTINGS opEthGen; + // 100/1000T1 + ETHERNET_SETTINGS2 ethT1; + OP_ETH_SETTINGS opEth1; + ETHERNET_SETTINGS2 ethT12; + OP_ETH_SETTINGS opEth2; + // 10T1S + ETHERNET_SETTINGS2 ethT1s1; + ETHERNET10T1S_SETTINGS t1s1; + ETHERNET10T1S_SETTINGS_EXT t1s1Ext; + // 10T1S + ETHERNET_SETTINGS2 ethT1s2; + ETHERNET10T1S_SETTINGS t1s2; + ETHERNET10T1S_SETTINGS_EXT t1s2Ext; + // 10T1S + ETHERNET_SETTINGS2 ethT1s3; + ETHERNET10T1S_SETTINGS t1s3; + ETHERNET10T1S_SETTINGS_EXT t1s3Ext; + // 10T1S + ETHERNET_SETTINGS2 ethT1s4; + ETHERNET10T1S_SETTINGS t1s4; + ETHERNET10T1S_SETTINGS_EXT t1s4Ext; + // 10T1S + ETHERNET_SETTINGS2 ethT1s5; + ETHERNET10T1S_SETTINGS t1s5; + ETHERNET10T1S_SETTINGS_EXT t1s5Ext; + // 10T1S + ETHERNET_SETTINGS2 ethT1s6; + ETHERNET10T1S_SETTINGS t1s6; + ETHERNET10T1S_SETTINGS_EXT t1s6Ext; + // 10T1S + ETHERNET_SETTINGS2 ethT1s7; + ETHERNET10T1S_SETTINGS t1s7; + ETHERNET10T1S_SETTINGS_EXT t1s7Ext; + // 10T1S + ETHERNET_SETTINGS2 ethT1s8; + ETHERNET10T1S_SETTINGS t1s8; + ETHERNET10T1S_SETTINGS_EXT t1s8Ext; + } radgigastar2_settings_t; +#pragma pack(pop) + +#ifdef __cplusplus + + static_assert(sizeof(radgigastar2_settings_t) == 2024, "RADGigastar2 settings size mismatch"); + +#include + + class RADGigastar2Settings : public IDeviceSettings + { + public: + RADGigastar2Settings(std::shared_ptr com) : IDeviceSettings(com, sizeof(radgigastar2_settings_t)) {} + const CAN_SETTINGS *getCANSettingsFor(Network net) const override + { + auto cfg = getStructurePointer(); + if (cfg == nullptr) + return nullptr; + switch (net.getNetID()) + { + case Network::NetID::HSCAN: + return &(cfg->can1); + case Network::NetID::HSCAN2: + return &(cfg->can2); + case Network::NetID::HSCAN3: + return &(cfg->can3); + case Network::NetID::HSCAN4: + return &(cfg->can4); + default: + return nullptr; + } + } + const CANFD_SETTINGS *getCANFDSettingsFor(Network net) const override + { + auto cfg = getStructurePointer(); + if (cfg == nullptr) + return nullptr; + switch (net.getNetID()) + { + case Network::NetID::HSCAN: + return &(cfg->canfd1); + case Network::NetID::HSCAN2: + return &(cfg->canfd2); + case Network::NetID::HSCAN3: + return &(cfg->canfd3); + case Network::NetID::HSCAN4: + return &(cfg->canfd4); + default: + return nullptr; + } + } + + virtual std::vector getTerminationGroups() const override + { + return { + {Network(Network::NetID::HSCAN)}, + {Network(Network::NetID::HSCAN2)}, + {Network(Network::NetID::HSCAN3)}, + {Network(Network::NetID::HSCAN4)}}; + } + + const LIN_SETTINGS *getLINSettingsFor(Network net) const override + { + auto cfg = getStructurePointer(); + if (cfg == nullptr) + return nullptr; + switch (net.getNetID()) + { + case Network::NetID::LIN: + return &(cfg->lin1); + case Network::NetID::LIN2: + return &(cfg->lin2); + case Network::NetID::LIN3: + return &(cfg->lin3); + case Network::NetID::LIN4: + return &(cfg->lin4); + case Network::NetID::LIN5: + return &(cfg->lin5); + case Network::NetID::LIN6: + return &(cfg->lin6); + case Network::NetID::LIN7: + return &(cfg->lin7); + case Network::NetID::LIN8: + return &(cfg->lin8); + case Network::NetID::LIN9: + return &(cfg->lin9); + case Network::NetID::LIN10: + return &(cfg->lin10); + default: + return nullptr; + } + } + + protected: + ICSNEO_UNALIGNED(const uint64_t *) + getTerminationEnables() const override + { + auto cfg = getStructurePointer(); + if (cfg == nullptr) + return nullptr; + return &cfg->termination_enables; + } + }; + + typedef struct + { + uint8_t unused[3]; + uint8_t ethernetActivationLineEnabled; + } radgigastar2_status_t; +} + +#endif // __cplusplus + +#endif \ No newline at end of file diff --git a/include/icsneo/platform/posix/devices.h b/include/icsneo/platform/posix/devices.h index 20fae50..a637600 100644 --- a/include/icsneo/platform/posix/devices.h +++ b/include/icsneo/platform/posix/devices.h @@ -20,6 +20,7 @@ #include "icsneo/device/tree/radepsilon/radepsilon.h" #include "icsneo/device/tree/radgalaxy/radgalaxy.h" #include "icsneo/device/tree/radgigastar/radgigastar.h" +#include "icsneo/device/tree/radgigastar2/radgigastar2.h" #include "icsneo/device/tree/radjupiter/radjupiter.h" #include "icsneo/device/tree/radmars/radmars.h" #include "icsneo/device/tree/radmoon2/radmoon2.h" diff --git a/include/icsneo/platform/windows/devices.h b/include/icsneo/platform/windows/devices.h index 2542db2..6c41fb3 100644 --- a/include/icsneo/platform/windows/devices.h +++ b/include/icsneo/platform/windows/devices.h @@ -20,6 +20,7 @@ #include "icsneo/device/tree/radepsilon/radepsilon.h" #include "icsneo/device/tree/radgalaxy/radgalaxy.h" #include "icsneo/device/tree/radgigastar/radgigastar.h" +#include "icsneo/device/tree/radgigastar2/radgigastar2.h" #include "icsneo/device/tree/radjupiter/radjupiter.h" #include "icsneo/device/tree/radmars/radmars.h" #include "icsneo/device/tree/radmoon2/radmoon2.h"