From 1dda9f5412b1d89e1626a2ea214d7fa9164266e0 Mon Sep 17 00:00:00 2001 From: Max Brombach Date: Tue, 4 Aug 2026 19:42:21 +0000 Subject: [PATCH] Device: Add sendSPIPortKeyOperation() --- CMakeLists.txt | 1 + communication/decoder.cpp | 4 ++ communication/message/spiportkeymessage.cpp | 27 ++++++++++++ device/device.cpp | 12 ++++++ include/icsneo/communication/command.h | 1 + .../icsneo/communication/message/message.h | 1 + .../communication/message/spiportkeymessage.h | 43 +++++++++++++++++++ include/icsneo/device/device.h | 3 ++ 8 files changed, 92 insertions(+) create mode 100644 communication/message/spiportkeymessage.cpp create mode 100644 include/icsneo/communication/message/spiportkeymessage.h diff --git a/CMakeLists.txt b/CMakeLists.txt index cace15f..8728103 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -235,6 +235,7 @@ set(SRC_FILES communication/message/networkmutexmessage.cpp communication/message/clientidmessage.cpp communication/message/transmitmessage.cpp + communication/message/spiportkeymessage.cpp communication/packet/flexraypacket.cpp communication/packet/canpacket.cpp communication/packet/a2bpacket.cpp diff --git a/communication/decoder.cpp b/communication/decoder.cpp index 4e3b602..ab30c7f 100644 --- a/communication/decoder.cpp +++ b/communication/decoder.cpp @@ -26,6 +26,7 @@ #include "icsneo/communication/message/ethernetstatusmessage.h" #include "icsneo/communication/message/networkmutexmessage.h" #include "icsneo/communication/message/clientidmessage.h" +#include "icsneo/communication/message/spiportkeymessage.h" #include "icsneo/communication/command.h" #include "icsneo/device/device.h" #include "icsneo/communication/packet/canpacket.h" @@ -341,6 +342,9 @@ bool Decoder::decode(std::shared_ptr& result, const std::shared_ptrdata, report); return true; + case ExtendedCommand::ExecuteSPIPortKeyOperation: + result = SPIPortKeyMessage::DecodeToMessage(packet->data); + return true; case ExtendedCommand::GetTC10Status: result = TC10StatusMessage::DecodeToMessage(packet->data); return true; diff --git a/communication/message/spiportkeymessage.cpp b/communication/message/spiportkeymessage.cpp new file mode 100644 index 0000000..d5b9b22 --- /dev/null +++ b/communication/message/spiportkeymessage.cpp @@ -0,0 +1,27 @@ +#include "icsneo/communication/message/spiportkeymessage.h" +#include "icsneo/communication/message/extendedresponsemessage.h" +#include "icsneo/communication/command.h" +#include "icsneo/communication/network.h" + +using namespace icsneo; + +std::shared_ptr SPIPortKeyMessage::DecodeToMessage(const std::vector& bytestream) { + if(bytestream.size() < sizeof(ExtendedResponseMessage::ResponseHeader)) + return nullptr; + + const auto* hdr = reinterpret_cast(bytestream.data()); + + if(hdr->command != ExtendedCommand::ExecuteSPIPortKeyOperation) + return nullptr; + + const size_t required = sizeof(ExtendedResponseMessage::ResponseHeader) + sizeof(SPIPortKeyPacket); + if(bytestream.size() < required) + return nullptr; + + auto msg = std::make_shared(); + + const auto* packet = reinterpret_cast(bytestream.data() + sizeof(ExtendedResponseMessage::ResponseHeader)); + msg->isKeyLoaded = packet->isKeyLoaded; + + return msg; +} diff --git a/device/device.cpp b/device/device.cpp index 709bc4e..f300263 100644 --- a/device/device.cpp +++ b/device/device.cpp @@ -2132,6 +2132,18 @@ std::optional Device::sendEthPhyMsg(const EthPhyMessage& message, return std::make_optional(*retMsg); } +bool Device::sendSPIPortKeyOperation(uint8_t portIndex, SPIPortKeyMessage::Operation op, std::array key) { + std::vector args(sizeof(SPIPortKeyMessage::SPIPortKeyPacket)); + auto& params = *reinterpret_cast(args.data()); + params.op = op; + params.portIndex = portIndex; + std::copy(key.begin(), key.end(), params.key); + if(!com->sendCommand(ExtendedCommand::ExecuteSPIPortKeyOperation, args)) { + return false; + } + return true; +} + std::optional Device::SetRootDirectoryEntryFlags(uint8_t mask, uint8_t values, uint32_t collectionEntryByteAddress) { if(!supportsWiVI()) diff --git a/include/icsneo/communication/command.h b/include/icsneo/communication/command.h index 6274b02..a3e3fa5 100644 --- a/include/icsneo/communication/command.h +++ b/include/icsneo/communication/command.h @@ -77,6 +77,7 @@ enum class ExtendedCommand : uint16_t { TransmitCoreminiMessage = 0x0028, GenericBinaryInfo = 0x0030, LiveData = 0x0035, + ExecuteSPIPortKeyOperation = 0x003C, RequestTC10Wake = 0x003D, RequestTC10Sleep = 0x003E, GetTC10Status = 0x003F, diff --git a/include/icsneo/communication/message/message.h b/include/icsneo/communication/message/message.h index a1ecd6a..08e6d07 100644 --- a/include/icsneo/communication/message/message.h +++ b/include/icsneo/communication/message/message.h @@ -48,6 +48,7 @@ public: NetworkMutex = 0x8016, ClientId = 0x8017, AllMACAddresses = 0x8018, + SPIPortKeyOperation = 0x8019, }; Message(Type t) : type(t) {} diff --git a/include/icsneo/communication/message/spiportkeymessage.h b/include/icsneo/communication/message/spiportkeymessage.h new file mode 100644 index 0000000..a869c72 --- /dev/null +++ b/include/icsneo/communication/message/spiportkeymessage.h @@ -0,0 +1,43 @@ +#ifndef __SPIPORTKEYMESSAGE_H_ +#define __SPIPORTKEYMESSAGE_H_ + +#ifdef __cplusplus + +#include "icsneo/communication/message/message.h" + +#include +#include + +namespace icsneo { + +class SPIPortKeyMessage : public Message { +public: + enum class Operation : uint8_t { + WriteKey = 0, + IsKeySet = 1, + ClearKey = 2 + }; + +#pragma pack(push, 2) + struct SPIPortKeyPacket + { + Operation op; + uint8_t portIndex; + bool isKeyLoaded; + uint8_t rsvd; + uint8_t key[16]; + }; +#pragma pack(pop) + + static std::shared_ptr DecodeToMessage(const std::vector& bytestream); + + SPIPortKeyMessage() : Message(Type::SPIPortKeyOperation) {} + + bool isKeyLoaded; +}; + +} // namespace icsneo + +#endif // __cplusplus + +#endif // __SPIPORTKEYMESSAGE_H_ diff --git a/include/icsneo/device/device.h b/include/icsneo/device/device.h index dd75377..df8ef4f 100644 --- a/include/icsneo/device/device.h +++ b/include/icsneo/device/device.h @@ -46,6 +46,7 @@ #include "icsneo/communication/message/extendeddatamessage.h" #include "icsneo/communication/message/livedatamessage.h" #include "icsneo/communication/message/tc10statusmessage.h" +#include "icsneo/communication/message/spiportkeymessage.h" #include "icsneo/core/macseccfg.h" #include "icsneo/communication/packet/genericbinarystatuspacket.h" #include "icsneo/communication/packet/livedatapacket.h" @@ -726,6 +727,8 @@ public: std::optional sendEthPhyMsg(const EthPhyMessage& message, std::chrono::milliseconds timeout = std::chrono::milliseconds(50)); + + bool sendSPIPortKeyOperation(uint8_t portIndex, SPIPortKeyMessage::Operation op, std::array key = {}); /** * Set the flags of the root directory entry specified at given address