Device interface library for multiple platforms including Mbed.

Dependents:   DeepCover Embedded Security in IoT MaximInterface MAXREFDES155#

Maxim Interface is a library framework focused on providing flexible and expressive hardware interfaces. Both communication interfaces such as I2C and 1-Wire and device interfaces such as DS18B20 are supported. Modern C++ concepts are used extensively while keeping compatibility with C++98/C++03 and requiring no external dependencies. The embedded-friendly design does not depend on exceptions or RTTI.

The full version of the project is hosted on GitLab: https://gitlab.com/iabenz/MaximInterface

Committer:
IanBenzMaxim
Date:
Mon Jul 22 11:44:07 2019 -0500
Revision:
7:9cd16581b578
Child:
8:5ea891c7d1a1
Updated to version 1.9.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 7:9cd16581b578 1 /*******************************************************************************
IanBenzMaxim 7:9cd16581b578 2 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
IanBenzMaxim 7:9cd16581b578 3 *
IanBenzMaxim 7:9cd16581b578 4 * Permission is hereby granted, free of charge, to any person obtaining a
IanBenzMaxim 7:9cd16581b578 5 * copy of this software and associated documentation files (the "Software"),
IanBenzMaxim 7:9cd16581b578 6 * to deal in the Software without restriction, including without limitation
IanBenzMaxim 7:9cd16581b578 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
IanBenzMaxim 7:9cd16581b578 8 * and/or sell copies of the Software, and to permit persons to whom the
IanBenzMaxim 7:9cd16581b578 9 * Software is furnished to do so, subject to the following conditions:
IanBenzMaxim 7:9cd16581b578 10 *
IanBenzMaxim 7:9cd16581b578 11 * The above copyright notice and this permission notice shall be included
IanBenzMaxim 7:9cd16581b578 12 * in all copies or substantial portions of the Software.
IanBenzMaxim 7:9cd16581b578 13 *
IanBenzMaxim 7:9cd16581b578 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
IanBenzMaxim 7:9cd16581b578 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
IanBenzMaxim 7:9cd16581b578 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IanBenzMaxim 7:9cd16581b578 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
IanBenzMaxim 7:9cd16581b578 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
IanBenzMaxim 7:9cd16581b578 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
IanBenzMaxim 7:9cd16581b578 20 * OTHER DEALINGS IN THE SOFTWARE.
IanBenzMaxim 7:9cd16581b578 21 *
IanBenzMaxim 7:9cd16581b578 22 * Except as contained in this notice, the name of Maxim Integrated
IanBenzMaxim 7:9cd16581b578 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
IanBenzMaxim 7:9cd16581b578 24 * Products, Inc. Branding Policy.
IanBenzMaxim 7:9cd16581b578 25 *
IanBenzMaxim 7:9cd16581b578 26 * The mere transfer of this software does not imply any licenses
IanBenzMaxim 7:9cd16581b578 27 * of trade secrets, proprietary technology, copyrights, patents,
IanBenzMaxim 7:9cd16581b578 28 * trademarks, maskwork rights, or any other form of intellectual
IanBenzMaxim 7:9cd16581b578 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
IanBenzMaxim 7:9cd16581b578 30 * ownership rights.
IanBenzMaxim 7:9cd16581b578 31 *******************************************************************************/
IanBenzMaxim 7:9cd16581b578 32
IanBenzMaxim 7:9cd16581b578 33 #ifndef MaximInterfaceDevices_DS28E15_22_25
IanBenzMaxim 7:9cd16581b578 34 #define MaximInterfaceDevices_DS28E15_22_25
IanBenzMaxim 7:9cd16581b578 35
IanBenzMaxim 7:9cd16581b578 36 #include <stdint.h>
IanBenzMaxim 7:9cd16581b578 37 #include <MaximInterfaceCore/Algorithm.hpp>
IanBenzMaxim 7:9cd16581b578 38 #include <MaximInterfaceCore/array_span.hpp>
IanBenzMaxim 7:9cd16581b578 39 #include <MaximInterfaceCore/ManId.hpp>
IanBenzMaxim 7:9cd16581b578 40 #include <MaximInterfaceCore/OneWireMaster.hpp>
IanBenzMaxim 7:9cd16581b578 41 #include <MaximInterfaceCore/RomId.hpp>
IanBenzMaxim 7:9cd16581b578 42 #include <MaximInterfaceCore/SelectRom.hpp>
IanBenzMaxim 7:9cd16581b578 43 #include <MaximInterfaceCore/Sleep.hpp>
IanBenzMaxim 7:9cd16581b578 44 #include "Config.hpp"
IanBenzMaxim 7:9cd16581b578 45
IanBenzMaxim 7:9cd16581b578 46 namespace MaximInterfaceDevices {
IanBenzMaxim 7:9cd16581b578 47
IanBenzMaxim 7:9cd16581b578 48 /// @brief
IanBenzMaxim 7:9cd16581b578 49 /// Interface to the DS28E15/22/25 series of authenticators
IanBenzMaxim 7:9cd16581b578 50 /// including low power variants.
IanBenzMaxim 7:9cd16581b578 51 class DS28E15_22_25 {
IanBenzMaxim 7:9cd16581b578 52 public:
IanBenzMaxim 7:9cd16581b578 53 enum ErrorValue { CrcError = 1, OperationFailure };
IanBenzMaxim 7:9cd16581b578 54
IanBenzMaxim 7:9cd16581b578 55 /// Holds the contents of a device memory segment.
IanBenzMaxim 7:9cd16581b578 56 typedef Core::array_span<uint_least8_t, 4> Segment;
IanBenzMaxim 7:9cd16581b578 57
IanBenzMaxim 7:9cd16581b578 58 /// Holds the contents of a device memory page.
IanBenzMaxim 7:9cd16581b578 59 typedef Core::array_span<uint_least8_t, 32> Page;
IanBenzMaxim 7:9cd16581b578 60
IanBenzMaxim 7:9cd16581b578 61 /// Number of segments per page.
IanBenzMaxim 7:9cd16581b578 62 static const int segmentsPerPage = Page::size / Segment::size;
IanBenzMaxim 7:9cd16581b578 63
IanBenzMaxim 7:9cd16581b578 64 /// Container for the device personality.
IanBenzMaxim 7:9cd16581b578 65 struct Personality {
IanBenzMaxim 7:9cd16581b578 66 uint_least8_t PB1;
IanBenzMaxim 7:9cd16581b578 67 uint_least8_t PB2;
IanBenzMaxim 7:9cd16581b578 68 Core::ManId::array manId;
IanBenzMaxim 7:9cd16581b578 69
IanBenzMaxim 7:9cd16581b578 70 bool secretLocked() const { return PB2 & 0x01; }
IanBenzMaxim 7:9cd16581b578 71 };
IanBenzMaxim 7:9cd16581b578 72
IanBenzMaxim 7:9cd16581b578 73 // Represents the status of a memory protection block.
IanBenzMaxim 7:9cd16581b578 74 class BlockProtection;
IanBenzMaxim 7:9cd16581b578 75
IanBenzMaxim 7:9cd16581b578 76 // Format data to hash for an Authenticated Write to a memory segment.
IanBenzMaxim 7:9cd16581b578 77 class SegmentWriteMacData;
IanBenzMaxim 7:9cd16581b578 78
IanBenzMaxim 7:9cd16581b578 79 // Format data to hash for an Authenticated Write to a memory protection block.
IanBenzMaxim 7:9cd16581b578 80 class ProtectionWriteMacData;
IanBenzMaxim 7:9cd16581b578 81
IanBenzMaxim 7:9cd16581b578 82 // Format data to hash for device authentication or computing the next secret
IanBenzMaxim 7:9cd16581b578 83 // from the existing secret.
IanBenzMaxim 7:9cd16581b578 84 class AuthenticationData;
IanBenzMaxim 7:9cd16581b578 85
IanBenzMaxim 7:9cd16581b578 86 void setSleep(Core::Sleep & sleep) { this->sleep = &sleep; }
IanBenzMaxim 7:9cd16581b578 87
IanBenzMaxim 7:9cd16581b578 88 void setMaster(Core::OneWireMaster & master) { this->master = &master; }
IanBenzMaxim 7:9cd16581b578 89
IanBenzMaxim 7:9cd16581b578 90 void setSelectRom(const Core::SelectRom & selectRom) {
IanBenzMaxim 7:9cd16581b578 91 this->selectRom = selectRom;
IanBenzMaxim 7:9cd16581b578 92 }
IanBenzMaxim 7:9cd16581b578 93
IanBenzMaxim 7:9cd16581b578 94 // Const member functions should not affect the state of the memory,
IanBenzMaxim 7:9cd16581b578 95 // block protection, or secret on the device.
IanBenzMaxim 7:9cd16581b578 96
IanBenzMaxim 7:9cd16581b578 97 /// @brief Read memory segment using the Read Memory command on the device.
IanBenzMaxim 7:9cd16581b578 98 /// @param pageNum Page number for read operation.
IanBenzMaxim 7:9cd16581b578 99 /// @param segmentNum Segment number within page for read operation.
IanBenzMaxim 7:9cd16581b578 100 /// @param[out] data Buffer to read data from the segment into.
IanBenzMaxim 7:9cd16581b578 101 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 102 readSegment(int pageNum, int segmentNum, Segment::span data) const;
IanBenzMaxim 7:9cd16581b578 103
IanBenzMaxim 7:9cd16581b578 104 /// @brief Continue an in-progress readSegment operation.
IanBenzMaxim 7:9cd16581b578 105 /// @note A CRC16 will encountered after reading the last segment of a page.
IanBenzMaxim 7:9cd16581b578 106 /// @param[out] data Buffer to read data from the segment into.
IanBenzMaxim 7:9cd16581b578 107 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 108 continueReadSegment(Segment::span data) const;
IanBenzMaxim 7:9cd16581b578 109
IanBenzMaxim 7:9cd16581b578 110 /// @brief Write memory segment using the Write Memory command.
IanBenzMaxim 7:9cd16581b578 111 /// @note 1-Wire ROM selection should have already occurred.
IanBenzMaxim 7:9cd16581b578 112 /// @param pageNum Page number for write operation.
IanBenzMaxim 7:9cd16581b578 113 /// @param segmentNum Segment number within page for write operation.
IanBenzMaxim 7:9cd16581b578 114 /// @param[in] data Data to write to the memory segment.
IanBenzMaxim 7:9cd16581b578 115 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 116 writeSegment(int pageNum, int segmentNum, Segment::const_span data);
IanBenzMaxim 7:9cd16581b578 117
IanBenzMaxim 7:9cd16581b578 118 /// @brief Continue an in-progress Write Memory command.
IanBenzMaxim 7:9cd16581b578 119 /// @param[in] data Data to write to the memory segment.
IanBenzMaxim 7:9cd16581b578 120 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 121 continueWriteSegment(Segment::const_span data);
IanBenzMaxim 7:9cd16581b578 122
IanBenzMaxim 7:9cd16581b578 123 /// @brief Read memory page using the Read Memory command on the device.
IanBenzMaxim 7:9cd16581b578 124 /// @param pageNum Page number for write operation.
IanBenzMaxim 7:9cd16581b578 125 /// @param[out] rdbuf Buffer to read data from the page into.
IanBenzMaxim 7:9cd16581b578 126 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 127 readPage(int pageNum, Page::span rdbuf) const;
IanBenzMaxim 7:9cd16581b578 128
IanBenzMaxim 7:9cd16581b578 129 /// @brief Continue an in-progress readPageOperation.
IanBenzMaxim 7:9cd16581b578 130 /// @param[out] rdbuf Buffer to read data from the page into.
IanBenzMaxim 7:9cd16581b578 131 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 132 continueReadPage(Page::span rdbuf) const;
IanBenzMaxim 7:9cd16581b578 133
IanBenzMaxim 7:9cd16581b578 134 /// @brief
IanBenzMaxim 7:9cd16581b578 135 /// Perform a Compute Page MAC command on the device.
IanBenzMaxim 7:9cd16581b578 136 /// Read back the MAC and verify the CRC16.
IanBenzMaxim 7:9cd16581b578 137 /// @param pageNum Page number to use for the computation.
IanBenzMaxim 7:9cd16581b578 138 /// @param anon True to compute in anonymous mode where ROM ID is not used.
IanBenzMaxim 7:9cd16581b578 139 /// @param[out] mac The device computed MAC.
IanBenzMaxim 7:9cd16581b578 140 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 141 computeReadPageMac(int pageNum, bool anon, Page::span mac) const;
IanBenzMaxim 7:9cd16581b578 142
IanBenzMaxim 7:9cd16581b578 143 /// @brief
IanBenzMaxim 7:9cd16581b578 144 /// Update the status of a memory protection block using the
IanBenzMaxim 7:9cd16581b578 145 /// Write Page Protection command.
IanBenzMaxim 7:9cd16581b578 146 /// @param protection
IanBenzMaxim 7:9cd16581b578 147 /// Desired protection status for the block.
IanBenzMaxim 7:9cd16581b578 148 /// It is not possible to disable existing protections.
IanBenzMaxim 7:9cd16581b578 149 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 150 writeBlockProtection(BlockProtection protection);
IanBenzMaxim 7:9cd16581b578 151
IanBenzMaxim 7:9cd16581b578 152 /// @brief
IanBenzMaxim 7:9cd16581b578 153 /// Update the status of a memory protection block using the
IanBenzMaxim 7:9cd16581b578 154 /// Authenticated Write Page Protection command.
IanBenzMaxim 7:9cd16581b578 155 /// @param newProtection New protection status to write.
IanBenzMaxim 7:9cd16581b578 156 /// @param[in] mac Write MAC computed for this operation.
IanBenzMaxim 7:9cd16581b578 157 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 158 writeAuthBlockProtection(BlockProtection newProtection, Page::const_span mac);
IanBenzMaxim 7:9cd16581b578 159
IanBenzMaxim 7:9cd16581b578 160 /// @brief Perform Load and Lock Secret command on the device.
IanBenzMaxim 7:9cd16581b578 161 /// @note The secret should already be stored in the scratchpad on the device.
IanBenzMaxim 7:9cd16581b578 162 /// @param lock
IanBenzMaxim 7:9cd16581b578 163 /// Prevent further changes to the secret on the device after loading.
IanBenzMaxim 7:9cd16581b578 164 MaximInterfaceDevices_EXPORT Core::error_code loadSecret(bool lock);
IanBenzMaxim 7:9cd16581b578 165
IanBenzMaxim 7:9cd16581b578 166 /// @brief Perform a Compute and Lock Secret command on the device.
IanBenzMaxim 7:9cd16581b578 167 /// @param pageNum Page number to use as the binding data.
IanBenzMaxim 7:9cd16581b578 168 /// @param lock
IanBenzMaxim 7:9cd16581b578 169 /// Prevent further changes to the secret on the device after computing.
IanBenzMaxim 7:9cd16581b578 170 MaximInterfaceDevices_EXPORT Core::error_code computeSecret(int pageNum,
IanBenzMaxim 7:9cd16581b578 171 bool lock);
IanBenzMaxim 7:9cd16581b578 172
IanBenzMaxim 7:9cd16581b578 173 /// @brief Read the personality bytes using the Read Status command.
IanBenzMaxim 7:9cd16581b578 174 /// @param[out] personality Receives personality read from device.
IanBenzMaxim 7:9cd16581b578 175 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 176 readPersonality(Personality & personality) const;
IanBenzMaxim 7:9cd16581b578 177
IanBenzMaxim 7:9cd16581b578 178 MaximInterfaceDevices_EXPORT static const Core::error_category &
IanBenzMaxim 7:9cd16581b578 179 errorCategory();
IanBenzMaxim 7:9cd16581b578 180
IanBenzMaxim 7:9cd16581b578 181 protected:
IanBenzMaxim 7:9cd16581b578 182 enum Variant { DS28E15, DS28E22, DS28E25 };
IanBenzMaxim 7:9cd16581b578 183
IanBenzMaxim 7:9cd16581b578 184 DS28E15_22_25(Core::Sleep & sleep, Core::OneWireMaster & master,
IanBenzMaxim 7:9cd16581b578 185 const Core::SelectRom & selectRom)
IanBenzMaxim 7:9cd16581b578 186 : selectRom(selectRom), master(&master), sleep(&sleep) {}
IanBenzMaxim 7:9cd16581b578 187
IanBenzMaxim 7:9cd16581b578 188 ~DS28E15_22_25() {}
IanBenzMaxim 7:9cd16581b578 189
IanBenzMaxim 7:9cd16581b578 190 Core::error_code doWriteScratchpad(Page::const_span data, Variant variant);
IanBenzMaxim 7:9cd16581b578 191
IanBenzMaxim 7:9cd16581b578 192 Core::error_code doReadScratchpad(Page::span data, Variant variant) const;
IanBenzMaxim 7:9cd16581b578 193
IanBenzMaxim 7:9cd16581b578 194 Core::error_code doReadBlockProtection(int blockNum,
IanBenzMaxim 7:9cd16581b578 195 BlockProtection & protection,
IanBenzMaxim 7:9cd16581b578 196 Variant variant) const;
IanBenzMaxim 7:9cd16581b578 197
IanBenzMaxim 7:9cd16581b578 198 Core::error_code doWriteAuthSegment(int pageNum, int segmentNum,
IanBenzMaxim 7:9cd16581b578 199 Segment::const_span newData,
IanBenzMaxim 7:9cd16581b578 200 Page::const_span mac, Variant variant);
IanBenzMaxim 7:9cd16581b578 201
IanBenzMaxim 7:9cd16581b578 202 Core::error_code doContinueWriteAuthSegment(Segment::const_span newData,
IanBenzMaxim 7:9cd16581b578 203 Page::const_span mac,
IanBenzMaxim 7:9cd16581b578 204 Variant variant);
IanBenzMaxim 7:9cd16581b578 205
IanBenzMaxim 7:9cd16581b578 206 Core::error_code
IanBenzMaxim 7:9cd16581b578 207 doReadAllBlockProtection(Core::span<BlockProtection> protection,
IanBenzMaxim 7:9cd16581b578 208 Variant variant) const;
IanBenzMaxim 7:9cd16581b578 209
IanBenzMaxim 7:9cd16581b578 210 Core::error_code doLoadSecret(bool lock, bool lowPower);
IanBenzMaxim 7:9cd16581b578 211
IanBenzMaxim 7:9cd16581b578 212 Core::error_code doComputeSecret(int pageNum, bool lock, bool lowPower);
IanBenzMaxim 7:9cd16581b578 213
IanBenzMaxim 7:9cd16581b578 214 private:
IanBenzMaxim 7:9cd16581b578 215 enum Command {
IanBenzMaxim 7:9cd16581b578 216 WriteMemory = 0x55,
IanBenzMaxim 7:9cd16581b578 217 ReadMemory = 0xF0,
IanBenzMaxim 7:9cd16581b578 218 LoadAndLockSecret = 0x33,
IanBenzMaxim 7:9cd16581b578 219 ComputeAndLockSecret = 0x3C,
IanBenzMaxim 7:9cd16581b578 220 ReadWriteScratchpad = 0x0F,
IanBenzMaxim 7:9cd16581b578 221 ComputePageMac = 0xA5,
IanBenzMaxim 7:9cd16581b578 222 ReadStatus = 0xAA,
IanBenzMaxim 7:9cd16581b578 223 WriteBlockProtection = 0xC3,
IanBenzMaxim 7:9cd16581b578 224 AuthWriteMemory = 0x5A,
IanBenzMaxim 7:9cd16581b578 225 AuthWriteBlockProtection = 0xCC,
IanBenzMaxim 7:9cd16581b578 226 };
IanBenzMaxim 7:9cd16581b578 227
IanBenzMaxim 7:9cd16581b578 228 Core::error_code doWriteAuthSegment(Segment::const_span newData,
IanBenzMaxim 7:9cd16581b578 229 Page::const_span mac, Variant variant,
IanBenzMaxim 7:9cd16581b578 230 bool continuing);
IanBenzMaxim 7:9cd16581b578 231
IanBenzMaxim 7:9cd16581b578 232 Core::error_code
IanBenzMaxim 7:9cd16581b578 233 writeCommandWithCrc(Command command, uint_least8_t parameter,
IanBenzMaxim 7:9cd16581b578 234 Core::OneWireMaster::Level level =
IanBenzMaxim 7:9cd16581b578 235 Core::OneWireMaster::NormalLevel) const;
IanBenzMaxim 7:9cd16581b578 236
IanBenzMaxim 7:9cd16581b578 237 Core::SelectRom selectRom;
IanBenzMaxim 7:9cd16581b578 238 Core::OneWireMaster * master;
IanBenzMaxim 7:9cd16581b578 239 Core::Sleep * sleep;
IanBenzMaxim 7:9cd16581b578 240 };
IanBenzMaxim 7:9cd16581b578 241
IanBenzMaxim 7:9cd16581b578 242 inline Core::error_code make_error_code(DS28E15_22_25::ErrorValue e) {
IanBenzMaxim 7:9cd16581b578 243 return Core::error_code(e, DS28E15_22_25::errorCategory());
IanBenzMaxim 7:9cd16581b578 244 }
IanBenzMaxim 7:9cd16581b578 245
IanBenzMaxim 7:9cd16581b578 246 /// Interface to the DS28EL15 (low power) authenticator.
IanBenzMaxim 7:9cd16581b578 247 class DS28EL15 : public DS28E15_22_25 {
IanBenzMaxim 7:9cd16581b578 248 public:
IanBenzMaxim 7:9cd16581b578 249 // DS28E15_22_25 traits
IanBenzMaxim 7:9cd16581b578 250 static const int memoryPages = 2;
IanBenzMaxim 7:9cd16581b578 251 static const int protectionBlocks = 4;
IanBenzMaxim 7:9cd16581b578 252
IanBenzMaxim 7:9cd16581b578 253 DS28EL15(Core::Sleep & sleep, Core::OneWireMaster & master,
IanBenzMaxim 7:9cd16581b578 254 const Core::SelectRom & selectRom)
IanBenzMaxim 7:9cd16581b578 255 : DS28E15_22_25(sleep, master, selectRom) {}
IanBenzMaxim 7:9cd16581b578 256
IanBenzMaxim 7:9cd16581b578 257 /// @brief Perform Write Scratchpad operation on the device.
IanBenzMaxim 7:9cd16581b578 258 /// @param[in] data Data to write to the scratchpad.
IanBenzMaxim 7:9cd16581b578 259 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 260 writeScratchpad(Page::const_span data);
IanBenzMaxim 7:9cd16581b578 261
IanBenzMaxim 7:9cd16581b578 262 /// @brief Perform a Read Scratchpad operation on the device.
IanBenzMaxim 7:9cd16581b578 263 /// @param[out] data Buffer to read data from the scratchpad into.
IanBenzMaxim 7:9cd16581b578 264 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 265 readScratchpad(Page::span data) const;
IanBenzMaxim 7:9cd16581b578 266
IanBenzMaxim 7:9cd16581b578 267 /// @brief
IanBenzMaxim 7:9cd16581b578 268 /// Read the status of a memory protection block using the Read Status command.
IanBenzMaxim 7:9cd16581b578 269 /// @param blockNum Block number to to read status of.
IanBenzMaxim 7:9cd16581b578 270 /// @param[out] protection Receives protection status read from device.
IanBenzMaxim 7:9cd16581b578 271 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 272 readBlockProtection(int blockNum, BlockProtection & protection) const;
IanBenzMaxim 7:9cd16581b578 273
IanBenzMaxim 7:9cd16581b578 274 /// @brief Write memory segment using the Authenticated Write Memory command.
IanBenzMaxim 7:9cd16581b578 275 /// @param pageNum Page number for write operation.
IanBenzMaxim 7:9cd16581b578 276 /// @param segmentNum Segment number within page for write operation.
IanBenzMaxim 7:9cd16581b578 277 /// @param[in] newData New data to write to the segment.
IanBenzMaxim 7:9cd16581b578 278 /// @param[in] mac Write MAC computed for this operation.
IanBenzMaxim 7:9cd16581b578 279 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 280 writeAuthSegment(int pageNum, int segmentNum, Segment::const_span newData,
IanBenzMaxim 7:9cd16581b578 281 Page::const_span mac);
IanBenzMaxim 7:9cd16581b578 282
IanBenzMaxim 7:9cd16581b578 283 /// @brief Continue an in-progress Authenticated Write Memory command.
IanBenzMaxim 7:9cd16581b578 284 /// @param[in] newData New data to write to the segment.
IanBenzMaxim 7:9cd16581b578 285 /// @param[in] mac Write MAC computed for this operation.
IanBenzMaxim 7:9cd16581b578 286 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 287 continueWriteAuthSegment(Segment::const_span newData, Page::const_span mac);
IanBenzMaxim 7:9cd16581b578 288
IanBenzMaxim 7:9cd16581b578 289 /// @brief
IanBenzMaxim 7:9cd16581b578 290 /// Read the status of all memory protection blocks using the Read Status command.
IanBenzMaxim 7:9cd16581b578 291 /// @param[out] protection Receives protection statuses read from device.
IanBenzMaxim 7:9cd16581b578 292 MaximInterfaceDevices_EXPORT Core::error_code readAllBlockProtection(
IanBenzMaxim 7:9cd16581b578 293 Core::span<BlockProtection, protectionBlocks> protection) const;
IanBenzMaxim 7:9cd16581b578 294 };
IanBenzMaxim 7:9cd16581b578 295
IanBenzMaxim 7:9cd16581b578 296 /// Interface to the DS28E15 authenticator.
IanBenzMaxim 7:9cd16581b578 297 class DS28E15 : public DS28EL15 {
IanBenzMaxim 7:9cd16581b578 298 public:
IanBenzMaxim 7:9cd16581b578 299 DS28E15(Core::Sleep & sleep, Core::OneWireMaster & master,
IanBenzMaxim 7:9cd16581b578 300 const Core::SelectRom & selectRom)
IanBenzMaxim 7:9cd16581b578 301 : DS28EL15(sleep, master, selectRom) {}
IanBenzMaxim 7:9cd16581b578 302
IanBenzMaxim 7:9cd16581b578 303 /// @brief Perform Load and Lock Secret command on the device.
IanBenzMaxim 7:9cd16581b578 304 /// @note The secret should already be stored in the scratchpad on the device.
IanBenzMaxim 7:9cd16581b578 305 /// @param lock
IanBenzMaxim 7:9cd16581b578 306 /// Prevent further changes to the secret on the device after loading.
IanBenzMaxim 7:9cd16581b578 307 MaximInterfaceDevices_EXPORT Core::error_code loadSecret(bool lock);
IanBenzMaxim 7:9cd16581b578 308
IanBenzMaxim 7:9cd16581b578 309 /// @brief Perform a Compute and Lock Secret command on the device.
IanBenzMaxim 7:9cd16581b578 310 /// @param pageNum Page number to use as the binding data.
IanBenzMaxim 7:9cd16581b578 311 /// @param lock
IanBenzMaxim 7:9cd16581b578 312 /// Prevent further changes to the secret on the device after computing.
IanBenzMaxim 7:9cd16581b578 313 MaximInterfaceDevices_EXPORT Core::error_code computeSecret(int pageNum,
IanBenzMaxim 7:9cd16581b578 314 bool lock);
IanBenzMaxim 7:9cd16581b578 315 };
IanBenzMaxim 7:9cd16581b578 316
IanBenzMaxim 7:9cd16581b578 317 /// Interface to the DS28EL22 (low power) authenticator.
IanBenzMaxim 7:9cd16581b578 318 class DS28EL22 : public DS28E15_22_25 {
IanBenzMaxim 7:9cd16581b578 319 public:
IanBenzMaxim 7:9cd16581b578 320 // DS28E15_22_25 traits
IanBenzMaxim 7:9cd16581b578 321 static const int memoryPages = 8;
IanBenzMaxim 7:9cd16581b578 322 static const int protectionBlocks = 4;
IanBenzMaxim 7:9cd16581b578 323
IanBenzMaxim 7:9cd16581b578 324 DS28EL22(Core::Sleep & sleep, Core::OneWireMaster & master,
IanBenzMaxim 7:9cd16581b578 325 const Core::SelectRom & selectRom)
IanBenzMaxim 7:9cd16581b578 326 : DS28E15_22_25(sleep, master, selectRom) {}
IanBenzMaxim 7:9cd16581b578 327
IanBenzMaxim 7:9cd16581b578 328 /// @brief Perform Write Scratchpad operation on the device.
IanBenzMaxim 7:9cd16581b578 329 /// @param[in] data Data to write to the scratchpad.
IanBenzMaxim 7:9cd16581b578 330 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 331 writeScratchpad(Page::const_span data);
IanBenzMaxim 7:9cd16581b578 332
IanBenzMaxim 7:9cd16581b578 333 /// @brief Perform a Read Scratchpad operation on the device.
IanBenzMaxim 7:9cd16581b578 334 /// @param[out] data Buffer to read data from the scratchpad into.
IanBenzMaxim 7:9cd16581b578 335 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 336 readScratchpad(Page::span data) const;
IanBenzMaxim 7:9cd16581b578 337
IanBenzMaxim 7:9cd16581b578 338 /// @brief
IanBenzMaxim 7:9cd16581b578 339 /// Read the status of a memory protection block using the Read Status command.
IanBenzMaxim 7:9cd16581b578 340 /// @param blockNum Block number to to read status of.
IanBenzMaxim 7:9cd16581b578 341 /// @param[out] protection Receives protection status read from device.
IanBenzMaxim 7:9cd16581b578 342 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 343 readBlockProtection(int blockNum, BlockProtection & protection) const;
IanBenzMaxim 7:9cd16581b578 344
IanBenzMaxim 7:9cd16581b578 345 /// @brief Write memory segment using the Authenticated Write Memory command.
IanBenzMaxim 7:9cd16581b578 346 /// @param pageNum Page number for write operation.
IanBenzMaxim 7:9cd16581b578 347 /// @param segmentNum Segment number within page for write operation.
IanBenzMaxim 7:9cd16581b578 348 /// @param[in] newData New data to write to the segment.
IanBenzMaxim 7:9cd16581b578 349 /// @param[in] mac Write MAC computed for this operation.
IanBenzMaxim 7:9cd16581b578 350 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 351 writeAuthSegment(int pageNum, int segmentNum, Segment::const_span newData,
IanBenzMaxim 7:9cd16581b578 352 Page::const_span mac);
IanBenzMaxim 7:9cd16581b578 353
IanBenzMaxim 7:9cd16581b578 354 /// @brief Continue an in-progress Authenticated Write Memory command.
IanBenzMaxim 7:9cd16581b578 355 /// @param[in] newData New data to write to the segment.
IanBenzMaxim 7:9cd16581b578 356 /// @param[in] mac Write MAC computed for this operation.
IanBenzMaxim 7:9cd16581b578 357 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 358 continueWriteAuthSegment(Segment::const_span newData, Page::const_span mac);
IanBenzMaxim 7:9cd16581b578 359
IanBenzMaxim 7:9cd16581b578 360 /// @brief
IanBenzMaxim 7:9cd16581b578 361 /// Read the status of all memory protection blocks using the Read Status command.
IanBenzMaxim 7:9cd16581b578 362 /// @param[out] protection Receives protection statuses read from device.
IanBenzMaxim 7:9cd16581b578 363 MaximInterfaceDevices_EXPORT Core::error_code readAllBlockProtection(
IanBenzMaxim 7:9cd16581b578 364 Core::span<BlockProtection, protectionBlocks> protection) const;
IanBenzMaxim 7:9cd16581b578 365 };
IanBenzMaxim 7:9cd16581b578 366
IanBenzMaxim 7:9cd16581b578 367 /// Interface to the DS28E22 authenticator.
IanBenzMaxim 7:9cd16581b578 368 class DS28E22 : public DS28EL22 {
IanBenzMaxim 7:9cd16581b578 369 public:
IanBenzMaxim 7:9cd16581b578 370 DS28E22(Core::Sleep & sleep, Core::OneWireMaster & master,
IanBenzMaxim 7:9cd16581b578 371 const Core::SelectRom & selectRom)
IanBenzMaxim 7:9cd16581b578 372 : DS28EL22(sleep, master, selectRom) {}
IanBenzMaxim 7:9cd16581b578 373
IanBenzMaxim 7:9cd16581b578 374 /// @brief Perform Load and Lock Secret command on the device.
IanBenzMaxim 7:9cd16581b578 375 /// @note The secret should already be stored in the scratchpad on the device.
IanBenzMaxim 7:9cd16581b578 376 /// @param lock
IanBenzMaxim 7:9cd16581b578 377 /// Prevent further changes to the secret on the device after loading.
IanBenzMaxim 7:9cd16581b578 378 MaximInterfaceDevices_EXPORT Core::error_code loadSecret(bool lock);
IanBenzMaxim 7:9cd16581b578 379
IanBenzMaxim 7:9cd16581b578 380 /// @brief Perform a Compute and Lock Secret command on the device.
IanBenzMaxim 7:9cd16581b578 381 /// @param pageNum Page number to use as the binding data.
IanBenzMaxim 7:9cd16581b578 382 /// @param lock
IanBenzMaxim 7:9cd16581b578 383 /// Prevent further changes to the secret on the device after computing.
IanBenzMaxim 7:9cd16581b578 384 MaximInterfaceDevices_EXPORT Core::error_code computeSecret(int pageNum,
IanBenzMaxim 7:9cd16581b578 385 bool lock);
IanBenzMaxim 7:9cd16581b578 386 };
IanBenzMaxim 7:9cd16581b578 387
IanBenzMaxim 7:9cd16581b578 388 /// Interface to the DS28EL25 (low power) authenticator.
IanBenzMaxim 7:9cd16581b578 389 class DS28EL25 : public DS28E15_22_25 {
IanBenzMaxim 7:9cd16581b578 390 public:
IanBenzMaxim 7:9cd16581b578 391 // DS28E15_22_25 traits
IanBenzMaxim 7:9cd16581b578 392 static const int memoryPages = 16;
IanBenzMaxim 7:9cd16581b578 393 static const int protectionBlocks = 8;
IanBenzMaxim 7:9cd16581b578 394
IanBenzMaxim 7:9cd16581b578 395 DS28EL25(Core::Sleep & sleep, Core::OneWireMaster & master,
IanBenzMaxim 7:9cd16581b578 396 const Core::SelectRom & selectRom)
IanBenzMaxim 7:9cd16581b578 397 : DS28E15_22_25(sleep, master, selectRom) {}
IanBenzMaxim 7:9cd16581b578 398
IanBenzMaxim 7:9cd16581b578 399 /// @brief Perform Write Scratchpad operation on the device.
IanBenzMaxim 7:9cd16581b578 400 /// @param[in] data Data to write to the scratchpad.
IanBenzMaxim 7:9cd16581b578 401 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 402 writeScratchpad(Page::const_span data);
IanBenzMaxim 7:9cd16581b578 403
IanBenzMaxim 7:9cd16581b578 404 /// @brief Perform a Read Scratchpad operation on the device.
IanBenzMaxim 7:9cd16581b578 405 /// @param[out] data Buffer to read data from the scratchpad into.
IanBenzMaxim 7:9cd16581b578 406 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 407 readScratchpad(Page::span data) const;
IanBenzMaxim 7:9cd16581b578 408
IanBenzMaxim 7:9cd16581b578 409 /// @brief
IanBenzMaxim 7:9cd16581b578 410 /// Read the status of a memory protection block using the Read Status command.
IanBenzMaxim 7:9cd16581b578 411 /// @param blockNum Block number to to read status of.
IanBenzMaxim 7:9cd16581b578 412 /// @param[out] protection Receives protection status read from device.
IanBenzMaxim 7:9cd16581b578 413 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 414 readBlockProtection(int blockNum, BlockProtection & protection) const;
IanBenzMaxim 7:9cd16581b578 415
IanBenzMaxim 7:9cd16581b578 416 /// Write memory segment using the Authenticated Write Memory command.
IanBenzMaxim 7:9cd16581b578 417 /// @param pageNum Page number for write operation.
IanBenzMaxim 7:9cd16581b578 418 /// @param segmentNum Segment number within page for write operation.
IanBenzMaxim 7:9cd16581b578 419 /// @param[in] newData New data to write to the segment.
IanBenzMaxim 7:9cd16581b578 420 /// @param[in] mac Write MAC computed for this operation.
IanBenzMaxim 7:9cd16581b578 421 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 422 writeAuthSegment(int pageNum, int segmentNum, Segment::const_span newData,
IanBenzMaxim 7:9cd16581b578 423 Page::const_span mac);
IanBenzMaxim 7:9cd16581b578 424
IanBenzMaxim 7:9cd16581b578 425 /// @brief Continue an in-progress Authenticated Write Memory command.
IanBenzMaxim 7:9cd16581b578 426 /// @param[in] newData New data to write to the segment.
IanBenzMaxim 7:9cd16581b578 427 /// @param[in] mac Write MAC computed for this operation.
IanBenzMaxim 7:9cd16581b578 428 MaximInterfaceDevices_EXPORT Core::error_code
IanBenzMaxim 7:9cd16581b578 429 continueWriteAuthSegment(Segment::const_span newData, Page::const_span mac);
IanBenzMaxim 7:9cd16581b578 430
IanBenzMaxim 7:9cd16581b578 431 /// @brief
IanBenzMaxim 7:9cd16581b578 432 /// Read the status of all memory protection blocks using the Read Status command.
IanBenzMaxim 7:9cd16581b578 433 /// @param[out] protection Receives protection statuses read from device.
IanBenzMaxim 7:9cd16581b578 434 MaximInterfaceDevices_EXPORT Core::error_code readAllBlockProtection(
IanBenzMaxim 7:9cd16581b578 435 Core::span<BlockProtection, protectionBlocks> protection) const;
IanBenzMaxim 7:9cd16581b578 436 };
IanBenzMaxim 7:9cd16581b578 437
IanBenzMaxim 7:9cd16581b578 438 /// Interface to the DS28E25 authenticator.
IanBenzMaxim 7:9cd16581b578 439 class DS28E25 : public DS28EL25 {
IanBenzMaxim 7:9cd16581b578 440 public:
IanBenzMaxim 7:9cd16581b578 441 DS28E25(Core::Sleep & sleep, Core::OneWireMaster & master,
IanBenzMaxim 7:9cd16581b578 442 const Core::SelectRom & selectRom)
IanBenzMaxim 7:9cd16581b578 443 : DS28EL25(sleep, master, selectRom) {}
IanBenzMaxim 7:9cd16581b578 444
IanBenzMaxim 7:9cd16581b578 445 /// @brief Perform Load and Lock Secret command on the device.
IanBenzMaxim 7:9cd16581b578 446 /// @note The secret should already be stored in the scratchpad on the device.
IanBenzMaxim 7:9cd16581b578 447 /// @param lock Prevent further changes to the secret on the device after loading.
IanBenzMaxim 7:9cd16581b578 448 MaximInterfaceDevices_EXPORT Core::error_code loadSecret(bool lock);
IanBenzMaxim 7:9cd16581b578 449
IanBenzMaxim 7:9cd16581b578 450 /// @brief Perform a Compute and Lock Secret command on the device.
IanBenzMaxim 7:9cd16581b578 451 /// @param pageNum Page number to use as the binding data.
IanBenzMaxim 7:9cd16581b578 452 /// @param lock
IanBenzMaxim 7:9cd16581b578 453 /// Prevent further changes to the secret on the device after computing.
IanBenzMaxim 7:9cd16581b578 454 MaximInterfaceDevices_EXPORT Core::error_code computeSecret(int pageNum,
IanBenzMaxim 7:9cd16581b578 455 bool lock);
IanBenzMaxim 7:9cd16581b578 456 };
IanBenzMaxim 7:9cd16581b578 457
IanBenzMaxim 7:9cd16581b578 458 /// Represents the status of a memory protection block.
IanBenzMaxim 7:9cd16581b578 459 class DS28E15_22_25::BlockProtection {
IanBenzMaxim 7:9cd16581b578 460 public:
IanBenzMaxim 7:9cd16581b578 461 explicit BlockProtection(uint_least8_t status = 0x00) : status(status) {}
IanBenzMaxim 7:9cd16581b578 462
IanBenzMaxim 7:9cd16581b578 463 /// Get the byte representation used by the device.
IanBenzMaxim 7:9cd16581b578 464 uint_least8_t statusByte() const { return status; }
IanBenzMaxim 7:9cd16581b578 465
IanBenzMaxim 7:9cd16581b578 466 /// Set the byte representation used by the device.
IanBenzMaxim 7:9cd16581b578 467 BlockProtection & setStatusByte(uint_least8_t status) {
IanBenzMaxim 7:9cd16581b578 468 this->status = status;
IanBenzMaxim 7:9cd16581b578 469 return *this;
IanBenzMaxim 7:9cd16581b578 470 }
IanBenzMaxim 7:9cd16581b578 471
IanBenzMaxim 7:9cd16581b578 472 /// Get the Block Number which is indexed from zero.
IanBenzMaxim 7:9cd16581b578 473 int blockNum() const { return (status & blockNumMask); }
IanBenzMaxim 7:9cd16581b578 474
IanBenzMaxim 7:9cd16581b578 475 /// Set the Block Number which is indexed from zero.
IanBenzMaxim 7:9cd16581b578 476 MaximInterfaceDevices_EXPORT BlockProtection & setBlockNum(int blockNum);
IanBenzMaxim 7:9cd16581b578 477
IanBenzMaxim 7:9cd16581b578 478 /// @brief Get the Read Protection status.
IanBenzMaxim 7:9cd16581b578 479 /// @returns True if Read Protection is enabled.
IanBenzMaxim 7:9cd16581b578 480 bool readProtection() const {
IanBenzMaxim 7:9cd16581b578 481 return ((status & readProtectionMask) == readProtectionMask);
IanBenzMaxim 7:9cd16581b578 482 }
IanBenzMaxim 7:9cd16581b578 483
IanBenzMaxim 7:9cd16581b578 484 /// Set the Read Protection status.
IanBenzMaxim 7:9cd16581b578 485 MaximInterfaceDevices_EXPORT BlockProtection &
IanBenzMaxim 7:9cd16581b578 486 setReadProtection(bool readProtection);
IanBenzMaxim 7:9cd16581b578 487
IanBenzMaxim 7:9cd16581b578 488 /// @brief Get the Write Protection status.
IanBenzMaxim 7:9cd16581b578 489 /// @returns True if Write Protection is enabled.
IanBenzMaxim 7:9cd16581b578 490 bool writeProtection() const {
IanBenzMaxim 7:9cd16581b578 491 return ((status & writeProtectionMask) == writeProtectionMask);
IanBenzMaxim 7:9cd16581b578 492 }
IanBenzMaxim 7:9cd16581b578 493
IanBenzMaxim 7:9cd16581b578 494 /// Set the Write Protection status.
IanBenzMaxim 7:9cd16581b578 495 MaximInterfaceDevices_EXPORT BlockProtection &
IanBenzMaxim 7:9cd16581b578 496 setWriteProtection(bool writeProtection);
IanBenzMaxim 7:9cd16581b578 497
IanBenzMaxim 7:9cd16581b578 498 /// @brief Get the EEPROM Emulation Mode status.
IanBenzMaxim 7:9cd16581b578 499 /// @returns True if EEPROM Emulation Mode is enabled.
IanBenzMaxim 7:9cd16581b578 500 bool eepromEmulation() const {
IanBenzMaxim 7:9cd16581b578 501 return ((status & eepromEmulationMask) == eepromEmulationMask);
IanBenzMaxim 7:9cd16581b578 502 }
IanBenzMaxim 7:9cd16581b578 503
IanBenzMaxim 7:9cd16581b578 504 /// Set the EEPROM Emulation Mode status.
IanBenzMaxim 7:9cd16581b578 505 MaximInterfaceDevices_EXPORT BlockProtection &
IanBenzMaxim 7:9cd16581b578 506 setEepromEmulation(bool eepromEmulation);
IanBenzMaxim 7:9cd16581b578 507
IanBenzMaxim 7:9cd16581b578 508 /// @brief Get the Authentication Protection status.
IanBenzMaxim 7:9cd16581b578 509 /// @returns True if Authentication Protection is enabled.
IanBenzMaxim 7:9cd16581b578 510 bool authProtection() const {
IanBenzMaxim 7:9cd16581b578 511 return ((status & authProtectionMask) == authProtectionMask);
IanBenzMaxim 7:9cd16581b578 512 }
IanBenzMaxim 7:9cd16581b578 513
IanBenzMaxim 7:9cd16581b578 514 /// Set the Authentication Protection status.
IanBenzMaxim 7:9cd16581b578 515 MaximInterfaceDevices_EXPORT BlockProtection &
IanBenzMaxim 7:9cd16581b578 516 setAuthProtection(bool authProtection);
IanBenzMaxim 7:9cd16581b578 517
IanBenzMaxim 7:9cd16581b578 518 /// @brief Check if no protection options are enabled.
IanBenzMaxim 7:9cd16581b578 519 /// @returns True if no protection options are enabled.
IanBenzMaxim 7:9cd16581b578 520 MaximInterfaceDevices_EXPORT bool noProtection() const;
IanBenzMaxim 7:9cd16581b578 521
IanBenzMaxim 7:9cd16581b578 522 private:
IanBenzMaxim 7:9cd16581b578 523 static const unsigned int readProtectionMask = 0x80,
IanBenzMaxim 7:9cd16581b578 524 writeProtectionMask = 0x40,
IanBenzMaxim 7:9cd16581b578 525 eepromEmulationMask = 0x20,
IanBenzMaxim 7:9cd16581b578 526 authProtectionMask = 0x10, blockNumMask = 0x0F;
IanBenzMaxim 7:9cd16581b578 527 uint_least8_t status;
IanBenzMaxim 7:9cd16581b578 528 };
IanBenzMaxim 7:9cd16581b578 529
IanBenzMaxim 7:9cd16581b578 530 inline bool operator==(DS28E15_22_25::BlockProtection lhs,
IanBenzMaxim 7:9cd16581b578 531 DS28E15_22_25::BlockProtection rhs) {
IanBenzMaxim 7:9cd16581b578 532 return lhs.statusByte() == rhs.statusByte();
IanBenzMaxim 7:9cd16581b578 533 }
IanBenzMaxim 7:9cd16581b578 534
IanBenzMaxim 7:9cd16581b578 535 inline bool operator!=(DS28E15_22_25::BlockProtection lhs,
IanBenzMaxim 7:9cd16581b578 536 DS28E15_22_25::BlockProtection rhs) {
IanBenzMaxim 7:9cd16581b578 537 return !operator==(lhs, rhs);
IanBenzMaxim 7:9cd16581b578 538 }
IanBenzMaxim 7:9cd16581b578 539
IanBenzMaxim 7:9cd16581b578 540 /// Format data to hash for an Authenticated Write to a memory segment.
IanBenzMaxim 7:9cd16581b578 541 class DS28E15_22_25::SegmentWriteMacData {
IanBenzMaxim 7:9cd16581b578 542 public:
IanBenzMaxim 7:9cd16581b578 543 typedef Core::array_span<uint_least8_t, 20> Result;
IanBenzMaxim 7:9cd16581b578 544
IanBenzMaxim 7:9cd16581b578 545 SegmentWriteMacData() : result_() {}
IanBenzMaxim 7:9cd16581b578 546
IanBenzMaxim 7:9cd16581b578 547 /// Formatted data result.
IanBenzMaxim 7:9cd16581b578 548 Result::const_span result() const { return result_; }
IanBenzMaxim 7:9cd16581b578 549
IanBenzMaxim 7:9cd16581b578 550 /// @name ROM ID
IanBenzMaxim 7:9cd16581b578 551 /// @brief 1-Wire ROM ID of the device.
IanBenzMaxim 7:9cd16581b578 552 /// @{
IanBenzMaxim 7:9cd16581b578 553
IanBenzMaxim 7:9cd16581b578 554 /// Get mutable ROM ID.
IanBenzMaxim 7:9cd16581b578 555 Core::RomId::span romId() {
IanBenzMaxim 7:9cd16581b578 556 return make_span(result_).subspan<romIdIdx, Core::RomId::size>();
IanBenzMaxim 7:9cd16581b578 557 }
IanBenzMaxim 7:9cd16581b578 558
IanBenzMaxim 7:9cd16581b578 559 /// Get immutable ROM ID.
IanBenzMaxim 7:9cd16581b578 560 Core::RomId::const_span romId() const {
IanBenzMaxim 7:9cd16581b578 561 return const_cast<SegmentWriteMacData &>(*this).romId();
IanBenzMaxim 7:9cd16581b578 562 }
IanBenzMaxim 7:9cd16581b578 563
IanBenzMaxim 7:9cd16581b578 564 /// Set ROM ID.
IanBenzMaxim 7:9cd16581b578 565 SegmentWriteMacData & setRomId(Core::RomId::const_span romId) {
IanBenzMaxim 7:9cd16581b578 566 copy(romId, this->romId());
IanBenzMaxim 7:9cd16581b578 567 return *this;
IanBenzMaxim 7:9cd16581b578 568 }
IanBenzMaxim 7:9cd16581b578 569
IanBenzMaxim 7:9cd16581b578 570 /// @}
IanBenzMaxim 7:9cd16581b578 571
IanBenzMaxim 7:9cd16581b578 572 /// @name MAN ID
IanBenzMaxim 7:9cd16581b578 573 /// @brief Manufacturer ID of the device.
IanBenzMaxim 7:9cd16581b578 574 /// @{
IanBenzMaxim 7:9cd16581b578 575
IanBenzMaxim 7:9cd16581b578 576 /// Get mutable MAN ID.
IanBenzMaxim 7:9cd16581b578 577 Core::ManId::span manId() {
IanBenzMaxim 7:9cd16581b578 578 return make_span(result_).subspan<manIdIdx, Core::ManId::size>();
IanBenzMaxim 7:9cd16581b578 579 }
IanBenzMaxim 7:9cd16581b578 580
IanBenzMaxim 7:9cd16581b578 581 /// Get immutable MAN ID.
IanBenzMaxim 7:9cd16581b578 582 Core::ManId::const_span manId() const {
IanBenzMaxim 7:9cd16581b578 583 return const_cast<SegmentWriteMacData &>(*this).manId();
IanBenzMaxim 7:9cd16581b578 584 }
IanBenzMaxim 7:9cd16581b578 585
IanBenzMaxim 7:9cd16581b578 586 /// Set MAN ID.
IanBenzMaxim 7:9cd16581b578 587 SegmentWriteMacData & setManId(Core::ManId::const_span manId) {
IanBenzMaxim 7:9cd16581b578 588 copy(manId, this->manId());
IanBenzMaxim 7:9cd16581b578 589 return *this;
IanBenzMaxim 7:9cd16581b578 590 }
IanBenzMaxim 7:9cd16581b578 591
IanBenzMaxim 7:9cd16581b578 592 /// @}
IanBenzMaxim 7:9cd16581b578 593
IanBenzMaxim 7:9cd16581b578 594 /// @name Page number
IanBenzMaxim 7:9cd16581b578 595 /// @brief Page number for write operation.
IanBenzMaxim 7:9cd16581b578 596 /// @{
IanBenzMaxim 7:9cd16581b578 597
IanBenzMaxim 7:9cd16581b578 598 /// Get page number.
IanBenzMaxim 7:9cd16581b578 599 int pageNum() const { return result_[pageNumIdx]; }
IanBenzMaxim 7:9cd16581b578 600
IanBenzMaxim 7:9cd16581b578 601 /// Set page number.
IanBenzMaxim 7:9cd16581b578 602 SegmentWriteMacData & setPageNum(int pageNum) {
IanBenzMaxim 7:9cd16581b578 603 result_[pageNumIdx] = pageNum;
IanBenzMaxim 7:9cd16581b578 604 return *this;
IanBenzMaxim 7:9cd16581b578 605 }
IanBenzMaxim 7:9cd16581b578 606
IanBenzMaxim 7:9cd16581b578 607 /// @}
IanBenzMaxim 7:9cd16581b578 608
IanBenzMaxim 7:9cd16581b578 609 /// @name Segment number
IanBenzMaxim 7:9cd16581b578 610 /// @brief Segment number within page for write operation.
IanBenzMaxim 7:9cd16581b578 611 /// @{
IanBenzMaxim 7:9cd16581b578 612
IanBenzMaxim 7:9cd16581b578 613 /// Get segment number.
IanBenzMaxim 7:9cd16581b578 614 int segmentNum() const { return result_[segmentNumIdx]; }
IanBenzMaxim 7:9cd16581b578 615
IanBenzMaxim 7:9cd16581b578 616 /// Set segment number.
IanBenzMaxim 7:9cd16581b578 617 SegmentWriteMacData & setSegmentNum(int segmentNum) {
IanBenzMaxim 7:9cd16581b578 618 result_[segmentNumIdx] = segmentNum;
IanBenzMaxim 7:9cd16581b578 619 return *this;
IanBenzMaxim 7:9cd16581b578 620 }
IanBenzMaxim 7:9cd16581b578 621
IanBenzMaxim 7:9cd16581b578 622 /// @}
IanBenzMaxim 7:9cd16581b578 623
IanBenzMaxim 7:9cd16581b578 624 /// @name Old data
IanBenzMaxim 7:9cd16581b578 625 /// @brief Existing data contained in the segment.
IanBenzMaxim 7:9cd16581b578 626 /// @{
IanBenzMaxim 7:9cd16581b578 627
IanBenzMaxim 7:9cd16581b578 628 /// Get mutable old data.
IanBenzMaxim 7:9cd16581b578 629 Segment::span oldData() {
IanBenzMaxim 7:9cd16581b578 630 return make_span(result_).subspan<oldDataIdx, Segment::size>();
IanBenzMaxim 7:9cd16581b578 631 }
IanBenzMaxim 7:9cd16581b578 632
IanBenzMaxim 7:9cd16581b578 633 /// Get immutable old data.
IanBenzMaxim 7:9cd16581b578 634 Segment::const_span oldData() const {
IanBenzMaxim 7:9cd16581b578 635 return const_cast<SegmentWriteMacData &>(*this).oldData();
IanBenzMaxim 7:9cd16581b578 636 }
IanBenzMaxim 7:9cd16581b578 637
IanBenzMaxim 7:9cd16581b578 638 /// Set old data.
IanBenzMaxim 7:9cd16581b578 639 SegmentWriteMacData & setOldData(Segment::const_span oldData) {
IanBenzMaxim 7:9cd16581b578 640 copy(oldData, this->oldData());
IanBenzMaxim 7:9cd16581b578 641 return *this;
IanBenzMaxim 7:9cd16581b578 642 }
IanBenzMaxim 7:9cd16581b578 643
IanBenzMaxim 7:9cd16581b578 644 /// @}
IanBenzMaxim 7:9cd16581b578 645
IanBenzMaxim 7:9cd16581b578 646 /// @name New data
IanBenzMaxim 7:9cd16581b578 647 /// @brief New data to write to the segment.
IanBenzMaxim 7:9cd16581b578 648 /// @{
IanBenzMaxim 7:9cd16581b578 649
IanBenzMaxim 7:9cd16581b578 650 /// Get mutable new data.
IanBenzMaxim 7:9cd16581b578 651 Segment::span newData() {
IanBenzMaxim 7:9cd16581b578 652 return make_span(result_).subspan<newDataIdx, Segment::size>();
IanBenzMaxim 7:9cd16581b578 653 }
IanBenzMaxim 7:9cd16581b578 654
IanBenzMaxim 7:9cd16581b578 655 /// Get immutable new data.
IanBenzMaxim 7:9cd16581b578 656 Segment::const_span newData() const {
IanBenzMaxim 7:9cd16581b578 657 return const_cast<SegmentWriteMacData &>(*this).newData();
IanBenzMaxim 7:9cd16581b578 658 }
IanBenzMaxim 7:9cd16581b578 659
IanBenzMaxim 7:9cd16581b578 660 /// Set new data.
IanBenzMaxim 7:9cd16581b578 661 SegmentWriteMacData & setNewData(Segment::const_span newData) {
IanBenzMaxim 7:9cd16581b578 662 copy(newData, this->newData());
IanBenzMaxim 7:9cd16581b578 663 return *this;
IanBenzMaxim 7:9cd16581b578 664 }
IanBenzMaxim 7:9cd16581b578 665
IanBenzMaxim 7:9cd16581b578 666 /// @}
IanBenzMaxim 7:9cd16581b578 667
IanBenzMaxim 7:9cd16581b578 668 private:
IanBenzMaxim 7:9cd16581b578 669 typedef Result::span::index_type index;
IanBenzMaxim 7:9cd16581b578 670
IanBenzMaxim 7:9cd16581b578 671 static const index romIdIdx = 0;
IanBenzMaxim 7:9cd16581b578 672 static const index manIdIdx = romIdIdx + Core::RomId::size;
IanBenzMaxim 7:9cd16581b578 673 static const index pageNumIdx = manIdIdx + Core::ManId::size;
IanBenzMaxim 7:9cd16581b578 674 static const index segmentNumIdx = pageNumIdx + 1;
IanBenzMaxim 7:9cd16581b578 675 static const index oldDataIdx = segmentNumIdx + 1;
IanBenzMaxim 7:9cd16581b578 676 static const index newDataIdx = oldDataIdx + Segment::size;
IanBenzMaxim 7:9cd16581b578 677
IanBenzMaxim 7:9cd16581b578 678 Result::array result_;
IanBenzMaxim 7:9cd16581b578 679 };
IanBenzMaxim 7:9cd16581b578 680
IanBenzMaxim 7:9cd16581b578 681 /// Format data to hash for an Authenticated Write to a memory protection block.
IanBenzMaxim 7:9cd16581b578 682 class DS28E15_22_25::ProtectionWriteMacData {
IanBenzMaxim 7:9cd16581b578 683 public:
IanBenzMaxim 7:9cd16581b578 684 typedef Core::array_span<uint_least8_t, 20> Result;
IanBenzMaxim 7:9cd16581b578 685
IanBenzMaxim 7:9cd16581b578 686 MaximInterfaceDevices_EXPORT ProtectionWriteMacData();
IanBenzMaxim 7:9cd16581b578 687
IanBenzMaxim 7:9cd16581b578 688 /// Formatted data result.
IanBenzMaxim 7:9cd16581b578 689 Result::const_span result() const { return result_; }
IanBenzMaxim 7:9cd16581b578 690
IanBenzMaxim 7:9cd16581b578 691 /// @name ROM ID
IanBenzMaxim 7:9cd16581b578 692 /// @brief 1-Wire ROM ID of the device.
IanBenzMaxim 7:9cd16581b578 693 /// @{
IanBenzMaxim 7:9cd16581b578 694
IanBenzMaxim 7:9cd16581b578 695 /// Get mutable ROM ID.
IanBenzMaxim 7:9cd16581b578 696 Core::RomId::span romId() {
IanBenzMaxim 7:9cd16581b578 697 return make_span(result_).subspan<romIdIdx, Core::RomId::size>();
IanBenzMaxim 7:9cd16581b578 698 }
IanBenzMaxim 7:9cd16581b578 699
IanBenzMaxim 7:9cd16581b578 700 /// Get immutable ROM ID.
IanBenzMaxim 7:9cd16581b578 701 Core::RomId::const_span romId() const {
IanBenzMaxim 7:9cd16581b578 702 return const_cast<ProtectionWriteMacData &>(*this).romId();
IanBenzMaxim 7:9cd16581b578 703 }
IanBenzMaxim 7:9cd16581b578 704
IanBenzMaxim 7:9cd16581b578 705 /// Set ROM ID.
IanBenzMaxim 7:9cd16581b578 706 ProtectionWriteMacData & setRomId(Core::RomId::const_span romId) {
IanBenzMaxim 7:9cd16581b578 707 copy(romId, this->romId());
IanBenzMaxim 7:9cd16581b578 708 return *this;
IanBenzMaxim 7:9cd16581b578 709 }
IanBenzMaxim 7:9cd16581b578 710
IanBenzMaxim 7:9cd16581b578 711 /// @}
IanBenzMaxim 7:9cd16581b578 712
IanBenzMaxim 7:9cd16581b578 713 /// @name MAN ID
IanBenzMaxim 7:9cd16581b578 714 /// @brief Manufacturer ID of the device.
IanBenzMaxim 7:9cd16581b578 715 /// @{
IanBenzMaxim 7:9cd16581b578 716
IanBenzMaxim 7:9cd16581b578 717 /// Get mutable MAN ID.
IanBenzMaxim 7:9cd16581b578 718 Core::ManId::span manId() {
IanBenzMaxim 7:9cd16581b578 719 return make_span(result_).subspan<manIdIdx, Core::ManId::size>();
IanBenzMaxim 7:9cd16581b578 720 }
IanBenzMaxim 7:9cd16581b578 721
IanBenzMaxim 7:9cd16581b578 722 /// Get immutable MAN ID.
IanBenzMaxim 7:9cd16581b578 723 Core::ManId::const_span manId() const {
IanBenzMaxim 7:9cd16581b578 724 return const_cast<ProtectionWriteMacData &>(*this).manId();
IanBenzMaxim 7:9cd16581b578 725 }
IanBenzMaxim 7:9cd16581b578 726
IanBenzMaxim 7:9cd16581b578 727 /// Set MAN ID.
IanBenzMaxim 7:9cd16581b578 728 ProtectionWriteMacData & setManId(Core::ManId::const_span manId) {
IanBenzMaxim 7:9cd16581b578 729 copy(manId, this->manId());
IanBenzMaxim 7:9cd16581b578 730 return *this;
IanBenzMaxim 7:9cd16581b578 731 }
IanBenzMaxim 7:9cd16581b578 732
IanBenzMaxim 7:9cd16581b578 733 /// @}
IanBenzMaxim 7:9cd16581b578 734
IanBenzMaxim 7:9cd16581b578 735 /// @name Old protection
IanBenzMaxim 7:9cd16581b578 736 /// @brief Existing protection status in device.
IanBenzMaxim 7:9cd16581b578 737 /// @{
IanBenzMaxim 7:9cd16581b578 738
IanBenzMaxim 7:9cd16581b578 739 /// Get old protection.
IanBenzMaxim 7:9cd16581b578 740 BlockProtection oldProtection() const { return oldProtection_; }
IanBenzMaxim 7:9cd16581b578 741
IanBenzMaxim 7:9cd16581b578 742 /// Set old protection.
IanBenzMaxim 7:9cd16581b578 743 MaximInterfaceDevices_EXPORT ProtectionWriteMacData &
IanBenzMaxim 7:9cd16581b578 744 setOldProtection(BlockProtection oldProtection);
IanBenzMaxim 7:9cd16581b578 745
IanBenzMaxim 7:9cd16581b578 746 /// @}
IanBenzMaxim 7:9cd16581b578 747
IanBenzMaxim 7:9cd16581b578 748 /// @name New protection
IanBenzMaxim 7:9cd16581b578 749 /// @brief New protection status to write.
IanBenzMaxim 7:9cd16581b578 750 /// @{
IanBenzMaxim 7:9cd16581b578 751
IanBenzMaxim 7:9cd16581b578 752 /// Get new protection.
IanBenzMaxim 7:9cd16581b578 753 BlockProtection newProtection() const { return newProtection_; }
IanBenzMaxim 7:9cd16581b578 754
IanBenzMaxim 7:9cd16581b578 755 /// Set new protection.
IanBenzMaxim 7:9cd16581b578 756 MaximInterfaceDevices_EXPORT ProtectionWriteMacData &
IanBenzMaxim 7:9cd16581b578 757 setNewProtection(BlockProtection newProtection);
IanBenzMaxim 7:9cd16581b578 758
IanBenzMaxim 7:9cd16581b578 759 /// @}
IanBenzMaxim 7:9cd16581b578 760
IanBenzMaxim 7:9cd16581b578 761 private:
IanBenzMaxim 7:9cd16581b578 762 typedef Result::span::index_type index;
IanBenzMaxim 7:9cd16581b578 763
IanBenzMaxim 7:9cd16581b578 764 static const index romIdIdx = 0;
IanBenzMaxim 7:9cd16581b578 765 static const index manIdIdx = romIdIdx + Core::RomId::size;
IanBenzMaxim 7:9cd16581b578 766 static const index blockNumIdx = manIdIdx + Core::ManId::size;
IanBenzMaxim 7:9cd16581b578 767 static const index oldProtectionIdx = blockNumIdx + 2;
IanBenzMaxim 7:9cd16581b578 768 static const index newProtectionIdx = oldProtectionIdx + 4;
IanBenzMaxim 7:9cd16581b578 769
IanBenzMaxim 7:9cd16581b578 770 Result::array result_;
IanBenzMaxim 7:9cd16581b578 771 BlockProtection oldProtection_;
IanBenzMaxim 7:9cd16581b578 772 BlockProtection newProtection_;
IanBenzMaxim 7:9cd16581b578 773 };
IanBenzMaxim 7:9cd16581b578 774
IanBenzMaxim 7:9cd16581b578 775 /// @brief
IanBenzMaxim 7:9cd16581b578 776 /// Format data to hash for device authentication or computing the next secret
IanBenzMaxim 7:9cd16581b578 777 /// from the existing secret.
IanBenzMaxim 7:9cd16581b578 778 class DS28E15_22_25::AuthenticationData {
IanBenzMaxim 7:9cd16581b578 779 public:
IanBenzMaxim 7:9cd16581b578 780 typedef Core::array_span<uint_least8_t, 76> Result;
IanBenzMaxim 7:9cd16581b578 781
IanBenzMaxim 7:9cd16581b578 782 AuthenticationData() : result_() {}
IanBenzMaxim 7:9cd16581b578 783
IanBenzMaxim 7:9cd16581b578 784 /// Formatted data result.
IanBenzMaxim 7:9cd16581b578 785 Result::const_span result() const { return result_; }
IanBenzMaxim 7:9cd16581b578 786
IanBenzMaxim 7:9cd16581b578 787 /// @name Page
IanBenzMaxim 7:9cd16581b578 788 /// @brief Data from a device memory page.
IanBenzMaxim 7:9cd16581b578 789 /// @{
IanBenzMaxim 7:9cd16581b578 790
IanBenzMaxim 7:9cd16581b578 791 /// Get mutable page.
IanBenzMaxim 7:9cd16581b578 792 Page::span page() {
IanBenzMaxim 7:9cd16581b578 793 return make_span(result_).subspan<pageIdx, Page::size>();
IanBenzMaxim 7:9cd16581b578 794 }
IanBenzMaxim 7:9cd16581b578 795
IanBenzMaxim 7:9cd16581b578 796 /// Get immutable page.
IanBenzMaxim 7:9cd16581b578 797 Page::const_span page() const {
IanBenzMaxim 7:9cd16581b578 798 return const_cast<AuthenticationData &>(*this).page();
IanBenzMaxim 7:9cd16581b578 799 }
IanBenzMaxim 7:9cd16581b578 800
IanBenzMaxim 7:9cd16581b578 801 /// Set page.
IanBenzMaxim 7:9cd16581b578 802 AuthenticationData & setPage(Page::const_span page) {
IanBenzMaxim 7:9cd16581b578 803 copy(page, this->page());
IanBenzMaxim 7:9cd16581b578 804 return *this;
IanBenzMaxim 7:9cd16581b578 805 }
IanBenzMaxim 7:9cd16581b578 806
IanBenzMaxim 7:9cd16581b578 807 /// @}
IanBenzMaxim 7:9cd16581b578 808
IanBenzMaxim 7:9cd16581b578 809 /// @name Scratchpad
IanBenzMaxim 7:9cd16581b578 810 /// @brief
IanBenzMaxim 7:9cd16581b578 811 /// Data from device scratchpad used as a random challenge in device
IanBenzMaxim 7:9cd16581b578 812 /// authentication and a partial secret in secret computation.
IanBenzMaxim 7:9cd16581b578 813 /// @{
IanBenzMaxim 7:9cd16581b578 814
IanBenzMaxim 7:9cd16581b578 815 /// Get mutable scratchpad.
IanBenzMaxim 7:9cd16581b578 816 Page::span scratchpad() {
IanBenzMaxim 7:9cd16581b578 817 return make_span(result_).subspan<scratchpadIdx, Page::size>();
IanBenzMaxim 7:9cd16581b578 818 }
IanBenzMaxim 7:9cd16581b578 819
IanBenzMaxim 7:9cd16581b578 820 /// Get immutable scratchpad.
IanBenzMaxim 7:9cd16581b578 821 Page::const_span scratchpad() const {
IanBenzMaxim 7:9cd16581b578 822 return const_cast<AuthenticationData &>(*this).scratchpad();
IanBenzMaxim 7:9cd16581b578 823 }
IanBenzMaxim 7:9cd16581b578 824
IanBenzMaxim 7:9cd16581b578 825 /// Set scratchpad.
IanBenzMaxim 7:9cd16581b578 826 AuthenticationData & setScratchpad(Page::const_span scratchpad) {
IanBenzMaxim 7:9cd16581b578 827 copy(scratchpad, this->scratchpad());
IanBenzMaxim 7:9cd16581b578 828 return *this;
IanBenzMaxim 7:9cd16581b578 829 }
IanBenzMaxim 7:9cd16581b578 830
IanBenzMaxim 7:9cd16581b578 831 /// @}
IanBenzMaxim 7:9cd16581b578 832
IanBenzMaxim 7:9cd16581b578 833 /// @name ROM ID
IanBenzMaxim 7:9cd16581b578 834 /// @brief 1-Wire ROM ID of the device.
IanBenzMaxim 7:9cd16581b578 835 /// @{
IanBenzMaxim 7:9cd16581b578 836
IanBenzMaxim 7:9cd16581b578 837 /// Get mutable ROM ID.
IanBenzMaxim 7:9cd16581b578 838 Core::RomId::span romId() {
IanBenzMaxim 7:9cd16581b578 839 return make_span(result_).subspan<romIdIdx, Core::RomId::size>();
IanBenzMaxim 7:9cd16581b578 840 }
IanBenzMaxim 7:9cd16581b578 841
IanBenzMaxim 7:9cd16581b578 842 /// Get immutable ROM ID.
IanBenzMaxim 7:9cd16581b578 843 Core::RomId::const_span romId() const {
IanBenzMaxim 7:9cd16581b578 844 return const_cast<AuthenticationData &>(*this).romId();
IanBenzMaxim 7:9cd16581b578 845 }
IanBenzMaxim 7:9cd16581b578 846
IanBenzMaxim 7:9cd16581b578 847 /// Set ROM ID.
IanBenzMaxim 7:9cd16581b578 848 AuthenticationData & setRomId(Core::RomId::const_span romId) {
IanBenzMaxim 7:9cd16581b578 849 copy(romId, this->romId());
IanBenzMaxim 7:9cd16581b578 850 return *this;
IanBenzMaxim 7:9cd16581b578 851 }
IanBenzMaxim 7:9cd16581b578 852
IanBenzMaxim 7:9cd16581b578 853 /// Set ROM ID for use in anonymous mode.
IanBenzMaxim 7:9cd16581b578 854 MaximInterfaceDevices_EXPORT AuthenticationData & setAnonymousRomId();
IanBenzMaxim 7:9cd16581b578 855
IanBenzMaxim 7:9cd16581b578 856 /// @}
IanBenzMaxim 7:9cd16581b578 857
IanBenzMaxim 7:9cd16581b578 858 /// @name MAN ID
IanBenzMaxim 7:9cd16581b578 859 /// @brief Manufacturer ID of the device.
IanBenzMaxim 7:9cd16581b578 860 /// @{
IanBenzMaxim 7:9cd16581b578 861
IanBenzMaxim 7:9cd16581b578 862 /// Get mutable MAN ID.
IanBenzMaxim 7:9cd16581b578 863 Core::ManId::span manId() {
IanBenzMaxim 7:9cd16581b578 864 return make_span(result_).subspan<manIdIdx, Core::ManId::size>();
IanBenzMaxim 7:9cd16581b578 865 }
IanBenzMaxim 7:9cd16581b578 866
IanBenzMaxim 7:9cd16581b578 867 /// Get immutable MAN ID.
IanBenzMaxim 7:9cd16581b578 868 Core::ManId::const_span manId() const {
IanBenzMaxim 7:9cd16581b578 869 return const_cast<AuthenticationData &>(*this).manId();
IanBenzMaxim 7:9cd16581b578 870 }
IanBenzMaxim 7:9cd16581b578 871
IanBenzMaxim 7:9cd16581b578 872 /// Set MAN ID.
IanBenzMaxim 7:9cd16581b578 873 AuthenticationData & setManId(Core::ManId::const_span manId) {
IanBenzMaxim 7:9cd16581b578 874 copy(manId, this->manId());
IanBenzMaxim 7:9cd16581b578 875 return *this;
IanBenzMaxim 7:9cd16581b578 876 }
IanBenzMaxim 7:9cd16581b578 877
IanBenzMaxim 7:9cd16581b578 878 /// @}
IanBenzMaxim 7:9cd16581b578 879
IanBenzMaxim 7:9cd16581b578 880 /// @name Page number
IanBenzMaxim 7:9cd16581b578 881 /// @brief Number of the page to use data from.
IanBenzMaxim 7:9cd16581b578 882 /// @{
IanBenzMaxim 7:9cd16581b578 883
IanBenzMaxim 7:9cd16581b578 884 /// Get page number.
IanBenzMaxim 7:9cd16581b578 885 int pageNum() const { return result_[pageNumIdx]; }
IanBenzMaxim 7:9cd16581b578 886
IanBenzMaxim 7:9cd16581b578 887 /// Set page number.
IanBenzMaxim 7:9cd16581b578 888 AuthenticationData & setPageNum(int pageNum) {
IanBenzMaxim 7:9cd16581b578 889 result_[pageNumIdx] = pageNum;
IanBenzMaxim 7:9cd16581b578 890 return *this;
IanBenzMaxim 7:9cd16581b578 891 }
IanBenzMaxim 7:9cd16581b578 892
IanBenzMaxim 7:9cd16581b578 893 /// @}
IanBenzMaxim 7:9cd16581b578 894
IanBenzMaxim 7:9cd16581b578 895 private:
IanBenzMaxim 7:9cd16581b578 896 typedef Result::span::index_type index;
IanBenzMaxim 7:9cd16581b578 897
IanBenzMaxim 7:9cd16581b578 898 static const index pageIdx = 0;
IanBenzMaxim 7:9cd16581b578 899 static const index scratchpadIdx = pageIdx + Page::size;
IanBenzMaxim 7:9cd16581b578 900 static const index romIdIdx = scratchpadIdx + Page::size;
IanBenzMaxim 7:9cd16581b578 901 static const index manIdIdx = romIdIdx + Core::RomId::size;
IanBenzMaxim 7:9cd16581b578 902 static const index pageNumIdx = manIdIdx + Core::ManId::size;
IanBenzMaxim 7:9cd16581b578 903
IanBenzMaxim 7:9cd16581b578 904 Result::array result_;
IanBenzMaxim 7:9cd16581b578 905 };
IanBenzMaxim 7:9cd16581b578 906
IanBenzMaxim 7:9cd16581b578 907 } // namespace MaximInterfaceDevices
IanBenzMaxim 7:9cd16581b578 908
IanBenzMaxim 7:9cd16581b578 909 #endif