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:
Fri May 29 16:19:22 2020 -0500
Revision:
12:7eb41621ba22
Parent:
8:5ea891c7d1a1
Updated to version 2.2.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 7:9cd16581b578 1 /*******************************************************************************
IanBenzMaxim 8:5ea891c7d1a1 2 * Copyright (C) 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 8:5ea891c7d1a1 33 #ifndef MaximInterfaceDevices_DS28E15_22_25_hpp
IanBenzMaxim 8:5ea891c7d1a1 34 #define MaximInterfaceDevices_DS28E15_22_25_hpp
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 8:5ea891c7d1a1 51 /// @details
IanBenzMaxim 8:5ea891c7d1a1 52 /// Const member functions should not affect the state of the memory,
IanBenzMaxim 8:5ea891c7d1a1 53 /// block protection, or secret on the device.
IanBenzMaxim 7:9cd16581b578 54 class DS28E15_22_25 {
IanBenzMaxim 7:9cd16581b578 55 public:
IanBenzMaxim 7:9cd16581b578 56 enum ErrorValue { CrcError = 1, OperationFailure };
IanBenzMaxim 7:9cd16581b578 57
IanBenzMaxim 7:9cd16581b578 58 /// Holds the contents of a device memory segment.
IanBenzMaxim 7:9cd16581b578 59 typedef Core::array_span<uint_least8_t, 4> Segment;
IanBenzMaxim 7:9cd16581b578 60
IanBenzMaxim 7:9cd16581b578 61 /// Holds the contents of a device memory page.
IanBenzMaxim 7:9cd16581b578 62 typedef Core::array_span<uint_least8_t, 32> Page;
IanBenzMaxim 7:9cd16581b578 63
IanBenzMaxim 7:9cd16581b578 64 /// Number of segments per page.
IanBenzMaxim 7:9cd16581b578 65 static const int segmentsPerPage = Page::size / Segment::size;
IanBenzMaxim 7:9cd16581b578 66
IanBenzMaxim 7:9cd16581b578 67 /// Container for the device personality.
IanBenzMaxim 7:9cd16581b578 68 struct Personality {
IanBenzMaxim 7:9cd16581b578 69 uint_least8_t PB1;
IanBenzMaxim 7:9cd16581b578 70 uint_least8_t PB2;
IanBenzMaxim 7:9cd16581b578 71 Core::ManId::array manId;
IanBenzMaxim 7:9cd16581b578 72
IanBenzMaxim 7:9cd16581b578 73 bool secretLocked() const { return PB2 & 0x01; }
IanBenzMaxim 7:9cd16581b578 74 };
IanBenzMaxim 7:9cd16581b578 75
IanBenzMaxim 7:9cd16581b578 76 // Represents the status of a memory protection block.
IanBenzMaxim 7:9cd16581b578 77 class BlockProtection;
IanBenzMaxim 7:9cd16581b578 78
IanBenzMaxim 7:9cd16581b578 79 // Format data to hash for an Authenticated Write to a memory segment.
IanBenzMaxim 7:9cd16581b578 80 class SegmentWriteMacData;
IanBenzMaxim 7:9cd16581b578 81
IanBenzMaxim 7:9cd16581b578 82 // Format data to hash for an Authenticated Write to a memory protection block.
IanBenzMaxim 7:9cd16581b578 83 class ProtectionWriteMacData;
IanBenzMaxim 7:9cd16581b578 84
IanBenzMaxim 7:9cd16581b578 85 // Format data to hash for device authentication or computing the next secret
IanBenzMaxim 7:9cd16581b578 86 // from the existing secret.
IanBenzMaxim 7:9cd16581b578 87 class AuthenticationData;
IanBenzMaxim 7:9cd16581b578 88
IanBenzMaxim 7:9cd16581b578 89 void setSleep(Core::Sleep & sleep) { this->sleep = &sleep; }
IanBenzMaxim 7:9cd16581b578 90
IanBenzMaxim 7:9cd16581b578 91 void setMaster(Core::OneWireMaster & master) { this->master = &master; }
IanBenzMaxim 7:9cd16581b578 92
IanBenzMaxim 7:9cd16581b578 93 void setSelectRom(const Core::SelectRom & selectRom) {
IanBenzMaxim 7:9cd16581b578 94 this->selectRom = selectRom;
IanBenzMaxim 7:9cd16581b578 95 }
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 8:5ea891c7d1a1 100 /// @returns Buffer to read data from the segment into.
IanBenzMaxim 8:5ea891c7d1a1 101 MaximInterfaceDevices_EXPORT Core::Result<Segment::array>
IanBenzMaxim 8:5ea891c7d1a1 102 readSegment(int pageNum, int segmentNum) 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 8:5ea891c7d1a1 106 /// @returns Buffer to read data from the segment into.
IanBenzMaxim 8:5ea891c7d1a1 107 MaximInterfaceDevices_EXPORT Core::Result<Segment::array>
IanBenzMaxim 8:5ea891c7d1a1 108 continueReadSegment() 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 8:5ea891c7d1a1 115 MaximInterfaceDevices_EXPORT Core::Result<void>
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 8:5ea891c7d1a1 120 MaximInterfaceDevices_EXPORT Core::Result<void>
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 8:5ea891c7d1a1 125 /// @returns Buffer to read data from the page into.
IanBenzMaxim 8:5ea891c7d1a1 126 MaximInterfaceDevices_EXPORT Core::Result<Page::array>
IanBenzMaxim 8:5ea891c7d1a1 127 readPage(int pageNum) const;
IanBenzMaxim 7:9cd16581b578 128
IanBenzMaxim 7:9cd16581b578 129 /// @brief Continue an in-progress readPageOperation.
IanBenzMaxim 8:5ea891c7d1a1 130 /// @returns Buffer to read data from the page into.
IanBenzMaxim 8:5ea891c7d1a1 131 MaximInterfaceDevices_EXPORT Core::Result<Page::array>
IanBenzMaxim 8:5ea891c7d1a1 132 continueReadPage() 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 8:5ea891c7d1a1 139 /// @returns The device computed MAC.
IanBenzMaxim 8:5ea891c7d1a1 140 MaximInterfaceDevices_EXPORT Core::Result<Page::array>
IanBenzMaxim 8:5ea891c7d1a1 141 computeReadPageMac(int pageNum, bool anon) 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 8:5ea891c7d1a1 149 MaximInterfaceDevices_EXPORT Core::Result<void>
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 8:5ea891c7d1a1 157 MaximInterfaceDevices_EXPORT Core::Result<void>
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 8:5ea891c7d1a1 164 MaximInterfaceDevices_EXPORT Core::Result<void> 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 8:5ea891c7d1a1 170 MaximInterfaceDevices_EXPORT Core::Result<void> computeSecret(int pageNum,
IanBenzMaxim 8:5ea891c7d1a1 171 bool lock);
IanBenzMaxim 7:9cd16581b578 172
IanBenzMaxim 7:9cd16581b578 173 /// @brief Read the personality bytes using the Read Status command.
IanBenzMaxim 8:5ea891c7d1a1 174 /// @returns Receives personality read from device.
IanBenzMaxim 8:5ea891c7d1a1 175 MaximInterfaceDevices_EXPORT Core::Result<Personality>
IanBenzMaxim 8:5ea891c7d1a1 176 readPersonality() 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 8:5ea891c7d1a1 190 Core::Result<void> doWriteScratchpad(Page::const_span data, Variant variant);
IanBenzMaxim 7:9cd16581b578 191
IanBenzMaxim 8:5ea891c7d1a1 192 Core::Result<Page::array> doReadScratchpad(Variant variant) const;
IanBenzMaxim 8:5ea891c7d1a1 193
IanBenzMaxim 8:5ea891c7d1a1 194 Core::Result<BlockProtection> doReadBlockProtection(int blockNum,
IanBenzMaxim 8:5ea891c7d1a1 195 Variant variant) const;
IanBenzMaxim 7:9cd16581b578 196
IanBenzMaxim 8:5ea891c7d1a1 197 Core::Result<void> doWriteAuthSegment(int pageNum, int segmentNum,
IanBenzMaxim 8:5ea891c7d1a1 198 Segment::const_span newData,
IanBenzMaxim 8:5ea891c7d1a1 199 Page::const_span mac, Variant variant);
IanBenzMaxim 7:9cd16581b578 200
IanBenzMaxim 8:5ea891c7d1a1 201 Core::Result<void> doContinueWriteAuthSegment(Segment::const_span newData,
IanBenzMaxim 8:5ea891c7d1a1 202 Page::const_span mac,
IanBenzMaxim 8:5ea891c7d1a1 203 Variant variant);
IanBenzMaxim 7:9cd16581b578 204
IanBenzMaxim 8:5ea891c7d1a1 205 Core::Result<void>
IanBenzMaxim 7:9cd16581b578 206 doReadAllBlockProtection(Core::span<BlockProtection> protection,
IanBenzMaxim 7:9cd16581b578 207 Variant variant) const;
IanBenzMaxim 7:9cd16581b578 208
IanBenzMaxim 8:5ea891c7d1a1 209 Core::Result<void> doLoadSecret(bool lock, bool lowPower);
IanBenzMaxim 7:9cd16581b578 210
IanBenzMaxim 8:5ea891c7d1a1 211 Core::Result<void> doComputeSecret(int pageNum, bool lock, bool lowPower);
IanBenzMaxim 7:9cd16581b578 212
IanBenzMaxim 7:9cd16581b578 213 private:
IanBenzMaxim 7:9cd16581b578 214 enum Command {
IanBenzMaxim 7:9cd16581b578 215 WriteMemory = 0x55,
IanBenzMaxim 7:9cd16581b578 216 ReadMemory = 0xF0,
IanBenzMaxim 7:9cd16581b578 217 LoadAndLockSecret = 0x33,
IanBenzMaxim 7:9cd16581b578 218 ComputeAndLockSecret = 0x3C,
IanBenzMaxim 7:9cd16581b578 219 ReadWriteScratchpad = 0x0F,
IanBenzMaxim 7:9cd16581b578 220 ComputePageMac = 0xA5,
IanBenzMaxim 7:9cd16581b578 221 ReadStatus = 0xAA,
IanBenzMaxim 7:9cd16581b578 222 WriteBlockProtection = 0xC3,
IanBenzMaxim 7:9cd16581b578 223 AuthWriteMemory = 0x5A,
IanBenzMaxim 7:9cd16581b578 224 AuthWriteBlockProtection = 0xCC,
IanBenzMaxim 7:9cd16581b578 225 };
IanBenzMaxim 7:9cd16581b578 226
IanBenzMaxim 8:5ea891c7d1a1 227 Core::Result<void> doWriteAuthSegment(Segment::const_span newData,
IanBenzMaxim 8:5ea891c7d1a1 228 Page::const_span mac, Variant variant,
IanBenzMaxim 8:5ea891c7d1a1 229 bool continuing);
IanBenzMaxim 7:9cd16581b578 230
IanBenzMaxim 8:5ea891c7d1a1 231 Core::Result<void>
IanBenzMaxim 7:9cd16581b578 232 writeCommandWithCrc(Command command, uint_least8_t parameter,
IanBenzMaxim 7:9cd16581b578 233 Core::OneWireMaster::Level level =
IanBenzMaxim 7:9cd16581b578 234 Core::OneWireMaster::NormalLevel) const;
IanBenzMaxim 7:9cd16581b578 235
IanBenzMaxim 7:9cd16581b578 236 Core::SelectRom selectRom;
IanBenzMaxim 7:9cd16581b578 237 Core::OneWireMaster * master;
IanBenzMaxim 7:9cd16581b578 238 Core::Sleep * sleep;
IanBenzMaxim 7:9cd16581b578 239 };
IanBenzMaxim 7:9cd16581b578 240
IanBenzMaxim 8:5ea891c7d1a1 241 } // namespace MaximInterfaceDevices
IanBenzMaxim 8:5ea891c7d1a1 242 namespace MaximInterfaceCore {
IanBenzMaxim 8:5ea891c7d1a1 243
IanBenzMaxim 8:5ea891c7d1a1 244 template <>
IanBenzMaxim 8:5ea891c7d1a1 245 struct is_error_code_enum<MaximInterfaceDevices::DS28E15_22_25::ErrorValue>
IanBenzMaxim 8:5ea891c7d1a1 246 : true_type {};
IanBenzMaxim 8:5ea891c7d1a1 247
IanBenzMaxim 8:5ea891c7d1a1 248 } // namespace MaximInterfaceCore
IanBenzMaxim 8:5ea891c7d1a1 249 namespace MaximInterfaceDevices {
IanBenzMaxim 8:5ea891c7d1a1 250
IanBenzMaxim 7:9cd16581b578 251 inline Core::error_code make_error_code(DS28E15_22_25::ErrorValue e) {
IanBenzMaxim 7:9cd16581b578 252 return Core::error_code(e, DS28E15_22_25::errorCategory());
IanBenzMaxim 7:9cd16581b578 253 }
IanBenzMaxim 7:9cd16581b578 254
IanBenzMaxim 7:9cd16581b578 255 /// Interface to the DS28EL15 (low power) authenticator.
IanBenzMaxim 7:9cd16581b578 256 class DS28EL15 : public DS28E15_22_25 {
IanBenzMaxim 7:9cd16581b578 257 public:
IanBenzMaxim 7:9cd16581b578 258 // DS28E15_22_25 traits
IanBenzMaxim 7:9cd16581b578 259 static const int memoryPages = 2;
IanBenzMaxim 7:9cd16581b578 260 static const int protectionBlocks = 4;
IanBenzMaxim 7:9cd16581b578 261
IanBenzMaxim 7:9cd16581b578 262 DS28EL15(Core::Sleep & sleep, Core::OneWireMaster & master,
IanBenzMaxim 7:9cd16581b578 263 const Core::SelectRom & selectRom)
IanBenzMaxim 7:9cd16581b578 264 : DS28E15_22_25(sleep, master, selectRom) {}
IanBenzMaxim 7:9cd16581b578 265
IanBenzMaxim 7:9cd16581b578 266 /// @brief Perform Write Scratchpad operation on the device.
IanBenzMaxim 7:9cd16581b578 267 /// @param[in] data Data to write to the scratchpad.
IanBenzMaxim 8:5ea891c7d1a1 268 MaximInterfaceDevices_EXPORT Core::Result<void>
IanBenzMaxim 7:9cd16581b578 269 writeScratchpad(Page::const_span data);
IanBenzMaxim 7:9cd16581b578 270
IanBenzMaxim 7:9cd16581b578 271 /// @brief Perform a Read Scratchpad operation on the device.
IanBenzMaxim 8:5ea891c7d1a1 272 /// @returns Buffer to read data from the scratchpad into.
IanBenzMaxim 8:5ea891c7d1a1 273 MaximInterfaceDevices_EXPORT Core::Result<Page::array> readScratchpad() const;
IanBenzMaxim 7:9cd16581b578 274
IanBenzMaxim 7:9cd16581b578 275 /// @brief
IanBenzMaxim 7:9cd16581b578 276 /// Read the status of a memory protection block using the Read Status command.
IanBenzMaxim 7:9cd16581b578 277 /// @param blockNum Block number to to read status of.
IanBenzMaxim 8:5ea891c7d1a1 278 /// @returns Receives protection status read from device.
IanBenzMaxim 8:5ea891c7d1a1 279 MaximInterfaceDevices_EXPORT Core::Result<BlockProtection>
IanBenzMaxim 8:5ea891c7d1a1 280 readBlockProtection(int blockNum) const;
IanBenzMaxim 7:9cd16581b578 281
IanBenzMaxim 7:9cd16581b578 282 /// @brief Write memory segment using the Authenticated Write Memory command.
IanBenzMaxim 7:9cd16581b578 283 /// @param pageNum Page number for write operation.
IanBenzMaxim 7:9cd16581b578 284 /// @param segmentNum Segment number within page for write operation.
IanBenzMaxim 7:9cd16581b578 285 /// @param[in] newData New data to write to the segment.
IanBenzMaxim 7:9cd16581b578 286 /// @param[in] mac Write MAC computed for this operation.
IanBenzMaxim 8:5ea891c7d1a1 287 MaximInterfaceDevices_EXPORT Core::Result<void>
IanBenzMaxim 7:9cd16581b578 288 writeAuthSegment(int pageNum, int segmentNum, Segment::const_span newData,
IanBenzMaxim 7:9cd16581b578 289 Page::const_span mac);
IanBenzMaxim 7:9cd16581b578 290
IanBenzMaxim 7:9cd16581b578 291 /// @brief Continue an in-progress Authenticated Write Memory command.
IanBenzMaxim 7:9cd16581b578 292 /// @param[in] newData New data to write to the segment.
IanBenzMaxim 7:9cd16581b578 293 /// @param[in] mac Write MAC computed for this operation.
IanBenzMaxim 8:5ea891c7d1a1 294 MaximInterfaceDevices_EXPORT Core::Result<void>
IanBenzMaxim 7:9cd16581b578 295 continueWriteAuthSegment(Segment::const_span newData, Page::const_span mac);
IanBenzMaxim 7:9cd16581b578 296
IanBenzMaxim 7:9cd16581b578 297 /// @brief
IanBenzMaxim 7:9cd16581b578 298 /// Read the status of all memory protection blocks using the Read Status command.
IanBenzMaxim 8:5ea891c7d1a1 299 /// @returns Receives protection statuses read from device.
IanBenzMaxim 8:5ea891c7d1a1 300 MaximInterfaceDevices_EXPORT
IanBenzMaxim 8:5ea891c7d1a1 301 Core::Result<Core::array<BlockProtection, protectionBlocks> >
IanBenzMaxim 8:5ea891c7d1a1 302 readAllBlockProtection() const;
IanBenzMaxim 7:9cd16581b578 303 };
IanBenzMaxim 7:9cd16581b578 304
IanBenzMaxim 7:9cd16581b578 305 /// Interface to the DS28E15 authenticator.
IanBenzMaxim 7:9cd16581b578 306 class DS28E15 : public DS28EL15 {
IanBenzMaxim 7:9cd16581b578 307 public:
IanBenzMaxim 7:9cd16581b578 308 DS28E15(Core::Sleep & sleep, Core::OneWireMaster & master,
IanBenzMaxim 7:9cd16581b578 309 const Core::SelectRom & selectRom)
IanBenzMaxim 7:9cd16581b578 310 : DS28EL15(sleep, master, selectRom) {}
IanBenzMaxim 7:9cd16581b578 311
IanBenzMaxim 7:9cd16581b578 312 /// @brief Perform Load and Lock Secret command on the device.
IanBenzMaxim 7:9cd16581b578 313 /// @note The secret should already be stored in the scratchpad on the device.
IanBenzMaxim 7:9cd16581b578 314 /// @param lock
IanBenzMaxim 7:9cd16581b578 315 /// Prevent further changes to the secret on the device after loading.
IanBenzMaxim 8:5ea891c7d1a1 316 MaximInterfaceDevices_EXPORT Core::Result<void> loadSecret(bool lock);
IanBenzMaxim 7:9cd16581b578 317
IanBenzMaxim 7:9cd16581b578 318 /// @brief Perform a Compute and Lock Secret command on the device.
IanBenzMaxim 7:9cd16581b578 319 /// @param pageNum Page number to use as the binding data.
IanBenzMaxim 7:9cd16581b578 320 /// @param lock
IanBenzMaxim 7:9cd16581b578 321 /// Prevent further changes to the secret on the device after computing.
IanBenzMaxim 8:5ea891c7d1a1 322 MaximInterfaceDevices_EXPORT Core::Result<void> computeSecret(int pageNum,
IanBenzMaxim 8:5ea891c7d1a1 323 bool lock);
IanBenzMaxim 7:9cd16581b578 324 };
IanBenzMaxim 7:9cd16581b578 325
IanBenzMaxim 7:9cd16581b578 326 /// Interface to the DS28EL22 (low power) authenticator.
IanBenzMaxim 7:9cd16581b578 327 class DS28EL22 : public DS28E15_22_25 {
IanBenzMaxim 7:9cd16581b578 328 public:
IanBenzMaxim 7:9cd16581b578 329 // DS28E15_22_25 traits
IanBenzMaxim 7:9cd16581b578 330 static const int memoryPages = 8;
IanBenzMaxim 7:9cd16581b578 331 static const int protectionBlocks = 4;
IanBenzMaxim 7:9cd16581b578 332
IanBenzMaxim 7:9cd16581b578 333 DS28EL22(Core::Sleep & sleep, Core::OneWireMaster & master,
IanBenzMaxim 7:9cd16581b578 334 const Core::SelectRom & selectRom)
IanBenzMaxim 7:9cd16581b578 335 : DS28E15_22_25(sleep, master, selectRom) {}
IanBenzMaxim 7:9cd16581b578 336
IanBenzMaxim 7:9cd16581b578 337 /// @brief Perform Write Scratchpad operation on the device.
IanBenzMaxim 7:9cd16581b578 338 /// @param[in] data Data to write to the scratchpad.
IanBenzMaxim 8:5ea891c7d1a1 339 MaximInterfaceDevices_EXPORT Core::Result<void>
IanBenzMaxim 7:9cd16581b578 340 writeScratchpad(Page::const_span data);
IanBenzMaxim 7:9cd16581b578 341
IanBenzMaxim 7:9cd16581b578 342 /// @brief Perform a Read Scratchpad operation on the device.
IanBenzMaxim 8:5ea891c7d1a1 343 /// @returns Buffer to read data from the scratchpad into.
IanBenzMaxim 8:5ea891c7d1a1 344 MaximInterfaceDevices_EXPORT Core::Result<Page::array> readScratchpad() const;
IanBenzMaxim 7:9cd16581b578 345
IanBenzMaxim 7:9cd16581b578 346 /// @brief
IanBenzMaxim 7:9cd16581b578 347 /// Read the status of a memory protection block using the Read Status command.
IanBenzMaxim 7:9cd16581b578 348 /// @param blockNum Block number to to read status of.
IanBenzMaxim 8:5ea891c7d1a1 349 /// @returns Receives protection status read from device.
IanBenzMaxim 8:5ea891c7d1a1 350 MaximInterfaceDevices_EXPORT Core::Result<BlockProtection>
IanBenzMaxim 8:5ea891c7d1a1 351 readBlockProtection(int blockNum) const;
IanBenzMaxim 7:9cd16581b578 352
IanBenzMaxim 7:9cd16581b578 353 /// @brief Write memory segment using the Authenticated Write Memory command.
IanBenzMaxim 7:9cd16581b578 354 /// @param pageNum Page number for write operation.
IanBenzMaxim 7:9cd16581b578 355 /// @param segmentNum Segment number within page for write operation.
IanBenzMaxim 7:9cd16581b578 356 /// @param[in] newData New data to write to the segment.
IanBenzMaxim 7:9cd16581b578 357 /// @param[in] mac Write MAC computed for this operation.
IanBenzMaxim 8:5ea891c7d1a1 358 MaximInterfaceDevices_EXPORT Core::Result<void>
IanBenzMaxim 7:9cd16581b578 359 writeAuthSegment(int pageNum, int segmentNum, Segment::const_span newData,
IanBenzMaxim 7:9cd16581b578 360 Page::const_span mac);
IanBenzMaxim 7:9cd16581b578 361
IanBenzMaxim 7:9cd16581b578 362 /// @brief Continue an in-progress Authenticated Write Memory command.
IanBenzMaxim 7:9cd16581b578 363 /// @param[in] newData New data to write to the segment.
IanBenzMaxim 7:9cd16581b578 364 /// @param[in] mac Write MAC computed for this operation.
IanBenzMaxim 8:5ea891c7d1a1 365 MaximInterfaceDevices_EXPORT Core::Result<void>
IanBenzMaxim 7:9cd16581b578 366 continueWriteAuthSegment(Segment::const_span newData, Page::const_span mac);
IanBenzMaxim 7:9cd16581b578 367
IanBenzMaxim 7:9cd16581b578 368 /// @brief
IanBenzMaxim 7:9cd16581b578 369 /// Read the status of all memory protection blocks using the Read Status command.
IanBenzMaxim 8:5ea891c7d1a1 370 /// @returns Receives protection statuses read from device.
IanBenzMaxim 8:5ea891c7d1a1 371 MaximInterfaceDevices_EXPORT
IanBenzMaxim 8:5ea891c7d1a1 372 Core::Result<Core::array<BlockProtection, protectionBlocks> >
IanBenzMaxim 8:5ea891c7d1a1 373 readAllBlockProtection() const;
IanBenzMaxim 7:9cd16581b578 374 };
IanBenzMaxim 7:9cd16581b578 375
IanBenzMaxim 7:9cd16581b578 376 /// Interface to the DS28E22 authenticator.
IanBenzMaxim 7:9cd16581b578 377 class DS28E22 : public DS28EL22 {
IanBenzMaxim 7:9cd16581b578 378 public:
IanBenzMaxim 7:9cd16581b578 379 DS28E22(Core::Sleep & sleep, Core::OneWireMaster & master,
IanBenzMaxim 7:9cd16581b578 380 const Core::SelectRom & selectRom)
IanBenzMaxim 7:9cd16581b578 381 : DS28EL22(sleep, master, selectRom) {}
IanBenzMaxim 7:9cd16581b578 382
IanBenzMaxim 7:9cd16581b578 383 /// @brief Perform Load and Lock Secret command on the device.
IanBenzMaxim 7:9cd16581b578 384 /// @note The secret should already be stored in the scratchpad on the device.
IanBenzMaxim 7:9cd16581b578 385 /// @param lock
IanBenzMaxim 7:9cd16581b578 386 /// Prevent further changes to the secret on the device after loading.
IanBenzMaxim 8:5ea891c7d1a1 387 MaximInterfaceDevices_EXPORT Core::Result<void> loadSecret(bool lock);
IanBenzMaxim 7:9cd16581b578 388
IanBenzMaxim 7:9cd16581b578 389 /// @brief Perform a Compute and Lock Secret command on the device.
IanBenzMaxim 7:9cd16581b578 390 /// @param pageNum Page number to use as the binding data.
IanBenzMaxim 7:9cd16581b578 391 /// @param lock
IanBenzMaxim 7:9cd16581b578 392 /// Prevent further changes to the secret on the device after computing.
IanBenzMaxim 8:5ea891c7d1a1 393 MaximInterfaceDevices_EXPORT Core::Result<void> computeSecret(int pageNum,
IanBenzMaxim 8:5ea891c7d1a1 394 bool lock);
IanBenzMaxim 7:9cd16581b578 395 };
IanBenzMaxim 7:9cd16581b578 396
IanBenzMaxim 7:9cd16581b578 397 /// Interface to the DS28EL25 (low power) authenticator.
IanBenzMaxim 7:9cd16581b578 398 class DS28EL25 : public DS28E15_22_25 {
IanBenzMaxim 7:9cd16581b578 399 public:
IanBenzMaxim 7:9cd16581b578 400 // DS28E15_22_25 traits
IanBenzMaxim 7:9cd16581b578 401 static const int memoryPages = 16;
IanBenzMaxim 7:9cd16581b578 402 static const int protectionBlocks = 8;
IanBenzMaxim 7:9cd16581b578 403
IanBenzMaxim 7:9cd16581b578 404 DS28EL25(Core::Sleep & sleep, Core::OneWireMaster & master,
IanBenzMaxim 7:9cd16581b578 405 const Core::SelectRom & selectRom)
IanBenzMaxim 7:9cd16581b578 406 : DS28E15_22_25(sleep, master, selectRom) {}
IanBenzMaxim 7:9cd16581b578 407
IanBenzMaxim 7:9cd16581b578 408 /// @brief Perform Write Scratchpad operation on the device.
IanBenzMaxim 7:9cd16581b578 409 /// @param[in] data Data to write to the scratchpad.
IanBenzMaxim 8:5ea891c7d1a1 410 MaximInterfaceDevices_EXPORT Core::Result<void>
IanBenzMaxim 7:9cd16581b578 411 writeScratchpad(Page::const_span data);
IanBenzMaxim 7:9cd16581b578 412
IanBenzMaxim 7:9cd16581b578 413 /// @brief Perform a Read Scratchpad operation on the device.
IanBenzMaxim 8:5ea891c7d1a1 414 /// @returns Buffer to read data from the scratchpad into.
IanBenzMaxim 8:5ea891c7d1a1 415 MaximInterfaceDevices_EXPORT Core::Result<Page::array> readScratchpad() const;
IanBenzMaxim 7:9cd16581b578 416
IanBenzMaxim 7:9cd16581b578 417 /// @brief
IanBenzMaxim 7:9cd16581b578 418 /// Read the status of a memory protection block using the Read Status command.
IanBenzMaxim 7:9cd16581b578 419 /// @param blockNum Block number to to read status of.
IanBenzMaxim 8:5ea891c7d1a1 420 /// @returns Receives protection status read from device.
IanBenzMaxim 8:5ea891c7d1a1 421 MaximInterfaceDevices_EXPORT Core::Result<BlockProtection>
IanBenzMaxim 8:5ea891c7d1a1 422 readBlockProtection(int blockNum) const;
IanBenzMaxim 7:9cd16581b578 423
IanBenzMaxim 7:9cd16581b578 424 /// Write memory segment using the Authenticated Write Memory command.
IanBenzMaxim 7:9cd16581b578 425 /// @param pageNum Page number for write operation.
IanBenzMaxim 7:9cd16581b578 426 /// @param segmentNum Segment number within page for write operation.
IanBenzMaxim 7:9cd16581b578 427 /// @param[in] newData New data to write to the segment.
IanBenzMaxim 7:9cd16581b578 428 /// @param[in] mac Write MAC computed for this operation.
IanBenzMaxim 8:5ea891c7d1a1 429 MaximInterfaceDevices_EXPORT Core::Result<void>
IanBenzMaxim 7:9cd16581b578 430 writeAuthSegment(int pageNum, int segmentNum, Segment::const_span newData,
IanBenzMaxim 7:9cd16581b578 431 Page::const_span mac);
IanBenzMaxim 7:9cd16581b578 432
IanBenzMaxim 7:9cd16581b578 433 /// @brief Continue an in-progress Authenticated Write Memory command.
IanBenzMaxim 7:9cd16581b578 434 /// @param[in] newData New data to write to the segment.
IanBenzMaxim 7:9cd16581b578 435 /// @param[in] mac Write MAC computed for this operation.
IanBenzMaxim 8:5ea891c7d1a1 436 MaximInterfaceDevices_EXPORT Core::Result<void>
IanBenzMaxim 7:9cd16581b578 437 continueWriteAuthSegment(Segment::const_span newData, Page::const_span mac);
IanBenzMaxim 7:9cd16581b578 438
IanBenzMaxim 7:9cd16581b578 439 /// @brief
IanBenzMaxim 7:9cd16581b578 440 /// Read the status of all memory protection blocks using the Read Status command.
IanBenzMaxim 8:5ea891c7d1a1 441 /// @returns Receives protection statuses read from device.
IanBenzMaxim 8:5ea891c7d1a1 442 MaximInterfaceDevices_EXPORT
IanBenzMaxim 8:5ea891c7d1a1 443 Core::Result<Core::array<BlockProtection, protectionBlocks> >
IanBenzMaxim 8:5ea891c7d1a1 444 readAllBlockProtection() const;
IanBenzMaxim 7:9cd16581b578 445 };
IanBenzMaxim 7:9cd16581b578 446
IanBenzMaxim 7:9cd16581b578 447 /// Interface to the DS28E25 authenticator.
IanBenzMaxim 7:9cd16581b578 448 class DS28E25 : public DS28EL25 {
IanBenzMaxim 7:9cd16581b578 449 public:
IanBenzMaxim 7:9cd16581b578 450 DS28E25(Core::Sleep & sleep, Core::OneWireMaster & master,
IanBenzMaxim 7:9cd16581b578 451 const Core::SelectRom & selectRom)
IanBenzMaxim 7:9cd16581b578 452 : DS28EL25(sleep, master, selectRom) {}
IanBenzMaxim 7:9cd16581b578 453
IanBenzMaxim 7:9cd16581b578 454 /// @brief Perform Load and Lock Secret command on the device.
IanBenzMaxim 7:9cd16581b578 455 /// @note The secret should already be stored in the scratchpad on the device.
IanBenzMaxim 7:9cd16581b578 456 /// @param lock Prevent further changes to the secret on the device after loading.
IanBenzMaxim 8:5ea891c7d1a1 457 MaximInterfaceDevices_EXPORT Core::Result<void> loadSecret(bool lock);
IanBenzMaxim 7:9cd16581b578 458
IanBenzMaxim 7:9cd16581b578 459 /// @brief Perform a Compute and Lock Secret command on the device.
IanBenzMaxim 7:9cd16581b578 460 /// @param pageNum Page number to use as the binding data.
IanBenzMaxim 7:9cd16581b578 461 /// @param lock
IanBenzMaxim 7:9cd16581b578 462 /// Prevent further changes to the secret on the device after computing.
IanBenzMaxim 8:5ea891c7d1a1 463 MaximInterfaceDevices_EXPORT Core::Result<void> computeSecret(int pageNum,
IanBenzMaxim 8:5ea891c7d1a1 464 bool lock);
IanBenzMaxim 7:9cd16581b578 465 };
IanBenzMaxim 7:9cd16581b578 466
IanBenzMaxim 7:9cd16581b578 467 /// Represents the status of a memory protection block.
IanBenzMaxim 7:9cd16581b578 468 class DS28E15_22_25::BlockProtection {
IanBenzMaxim 7:9cd16581b578 469 public:
IanBenzMaxim 7:9cd16581b578 470 explicit BlockProtection(uint_least8_t status = 0x00) : status(status) {}
IanBenzMaxim 7:9cd16581b578 471
IanBenzMaxim 7:9cd16581b578 472 /// Get the byte representation used by the device.
IanBenzMaxim 7:9cd16581b578 473 uint_least8_t statusByte() const { return status; }
IanBenzMaxim 7:9cd16581b578 474
IanBenzMaxim 7:9cd16581b578 475 /// Set the byte representation used by the device.
IanBenzMaxim 7:9cd16581b578 476 BlockProtection & setStatusByte(uint_least8_t status) {
IanBenzMaxim 7:9cd16581b578 477 this->status = status;
IanBenzMaxim 7:9cd16581b578 478 return *this;
IanBenzMaxim 7:9cd16581b578 479 }
IanBenzMaxim 7:9cd16581b578 480
IanBenzMaxim 7:9cd16581b578 481 /// Get the Block Number which is indexed from zero.
IanBenzMaxim 7:9cd16581b578 482 int blockNum() const { return (status & blockNumMask); }
IanBenzMaxim 7:9cd16581b578 483
IanBenzMaxim 7:9cd16581b578 484 /// Set the Block Number which is indexed from zero.
IanBenzMaxim 7:9cd16581b578 485 MaximInterfaceDevices_EXPORT BlockProtection & setBlockNum(int blockNum);
IanBenzMaxim 7:9cd16581b578 486
IanBenzMaxim 7:9cd16581b578 487 /// @brief Get the Read Protection status.
IanBenzMaxim 7:9cd16581b578 488 /// @returns True if Read Protection is enabled.
IanBenzMaxim 7:9cd16581b578 489 bool readProtection() const {
IanBenzMaxim 7:9cd16581b578 490 return ((status & readProtectionMask) == readProtectionMask);
IanBenzMaxim 7:9cd16581b578 491 }
IanBenzMaxim 7:9cd16581b578 492
IanBenzMaxim 7:9cd16581b578 493 /// Set the Read Protection status.
IanBenzMaxim 7:9cd16581b578 494 MaximInterfaceDevices_EXPORT BlockProtection &
IanBenzMaxim 7:9cd16581b578 495 setReadProtection(bool readProtection);
IanBenzMaxim 7:9cd16581b578 496
IanBenzMaxim 7:9cd16581b578 497 /// @brief Get the Write Protection status.
IanBenzMaxim 7:9cd16581b578 498 /// @returns True if Write Protection is enabled.
IanBenzMaxim 7:9cd16581b578 499 bool writeProtection() const {
IanBenzMaxim 7:9cd16581b578 500 return ((status & writeProtectionMask) == writeProtectionMask);
IanBenzMaxim 7:9cd16581b578 501 }
IanBenzMaxim 7:9cd16581b578 502
IanBenzMaxim 7:9cd16581b578 503 /// Set the Write Protection status.
IanBenzMaxim 7:9cd16581b578 504 MaximInterfaceDevices_EXPORT BlockProtection &
IanBenzMaxim 7:9cd16581b578 505 setWriteProtection(bool writeProtection);
IanBenzMaxim 7:9cd16581b578 506
IanBenzMaxim 7:9cd16581b578 507 /// @brief Get the EEPROM Emulation Mode status.
IanBenzMaxim 7:9cd16581b578 508 /// @returns True if EEPROM Emulation Mode is enabled.
IanBenzMaxim 7:9cd16581b578 509 bool eepromEmulation() const {
IanBenzMaxim 7:9cd16581b578 510 return ((status & eepromEmulationMask) == eepromEmulationMask);
IanBenzMaxim 7:9cd16581b578 511 }
IanBenzMaxim 7:9cd16581b578 512
IanBenzMaxim 7:9cd16581b578 513 /// Set the EEPROM Emulation Mode status.
IanBenzMaxim 7:9cd16581b578 514 MaximInterfaceDevices_EXPORT BlockProtection &
IanBenzMaxim 7:9cd16581b578 515 setEepromEmulation(bool eepromEmulation);
IanBenzMaxim 7:9cd16581b578 516
IanBenzMaxim 7:9cd16581b578 517 /// @brief Get the Authentication Protection status.
IanBenzMaxim 7:9cd16581b578 518 /// @returns True if Authentication Protection is enabled.
IanBenzMaxim 7:9cd16581b578 519 bool authProtection() const {
IanBenzMaxim 7:9cd16581b578 520 return ((status & authProtectionMask) == authProtectionMask);
IanBenzMaxim 7:9cd16581b578 521 }
IanBenzMaxim 7:9cd16581b578 522
IanBenzMaxim 7:9cd16581b578 523 /// Set the Authentication Protection status.
IanBenzMaxim 7:9cd16581b578 524 MaximInterfaceDevices_EXPORT BlockProtection &
IanBenzMaxim 7:9cd16581b578 525 setAuthProtection(bool authProtection);
IanBenzMaxim 7:9cd16581b578 526
IanBenzMaxim 7:9cd16581b578 527 /// @brief Check if no protection options are enabled.
IanBenzMaxim 7:9cd16581b578 528 /// @returns True if no protection options are enabled.
IanBenzMaxim 7:9cd16581b578 529 MaximInterfaceDevices_EXPORT bool noProtection() const;
IanBenzMaxim 7:9cd16581b578 530
IanBenzMaxim 7:9cd16581b578 531 private:
IanBenzMaxim 7:9cd16581b578 532 static const unsigned int readProtectionMask = 0x80,
IanBenzMaxim 7:9cd16581b578 533 writeProtectionMask = 0x40,
IanBenzMaxim 7:9cd16581b578 534 eepromEmulationMask = 0x20,
IanBenzMaxim 8:5ea891c7d1a1 535 authProtectionMask = 0x10,
IanBenzMaxim 8:5ea891c7d1a1 536 blockNumMask = 0x0F;
IanBenzMaxim 7:9cd16581b578 537 uint_least8_t status;
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 8:5ea891c7d1a1 669 static const size_t romIdIdx = 0;
IanBenzMaxim 8:5ea891c7d1a1 670 static const size_t manIdIdx = romIdIdx + Core::RomId::size;
IanBenzMaxim 8:5ea891c7d1a1 671 static const size_t pageNumIdx = manIdIdx + Core::ManId::size;
IanBenzMaxim 8:5ea891c7d1a1 672 static const size_t segmentNumIdx = pageNumIdx + 1;
IanBenzMaxim 8:5ea891c7d1a1 673 static const size_t oldDataIdx = segmentNumIdx + 1;
IanBenzMaxim 8:5ea891c7d1a1 674 static const size_t newDataIdx = oldDataIdx + Segment::size;
IanBenzMaxim 7:9cd16581b578 675
IanBenzMaxim 7:9cd16581b578 676 Result::array result_;
IanBenzMaxim 7:9cd16581b578 677 };
IanBenzMaxim 7:9cd16581b578 678
IanBenzMaxim 7:9cd16581b578 679 /// Format data to hash for an Authenticated Write to a memory protection block.
IanBenzMaxim 7:9cd16581b578 680 class DS28E15_22_25::ProtectionWriteMacData {
IanBenzMaxim 7:9cd16581b578 681 public:
IanBenzMaxim 7:9cd16581b578 682 typedef Core::array_span<uint_least8_t, 20> Result;
IanBenzMaxim 7:9cd16581b578 683
IanBenzMaxim 7:9cd16581b578 684 MaximInterfaceDevices_EXPORT ProtectionWriteMacData();
IanBenzMaxim 7:9cd16581b578 685
IanBenzMaxim 7:9cd16581b578 686 /// Formatted data result.
IanBenzMaxim 7:9cd16581b578 687 Result::const_span result() const { return result_; }
IanBenzMaxim 7:9cd16581b578 688
IanBenzMaxim 7:9cd16581b578 689 /// @name ROM ID
IanBenzMaxim 7:9cd16581b578 690 /// @brief 1-Wire ROM ID of the device.
IanBenzMaxim 7:9cd16581b578 691 /// @{
IanBenzMaxim 7:9cd16581b578 692
IanBenzMaxim 7:9cd16581b578 693 /// Get mutable ROM ID.
IanBenzMaxim 7:9cd16581b578 694 Core::RomId::span romId() {
IanBenzMaxim 7:9cd16581b578 695 return make_span(result_).subspan<romIdIdx, Core::RomId::size>();
IanBenzMaxim 7:9cd16581b578 696 }
IanBenzMaxim 7:9cd16581b578 697
IanBenzMaxim 7:9cd16581b578 698 /// Get immutable ROM ID.
IanBenzMaxim 7:9cd16581b578 699 Core::RomId::const_span romId() const {
IanBenzMaxim 7:9cd16581b578 700 return const_cast<ProtectionWriteMacData &>(*this).romId();
IanBenzMaxim 7:9cd16581b578 701 }
IanBenzMaxim 7:9cd16581b578 702
IanBenzMaxim 7:9cd16581b578 703 /// Set ROM ID.
IanBenzMaxim 7:9cd16581b578 704 ProtectionWriteMacData & setRomId(Core::RomId::const_span romId) {
IanBenzMaxim 7:9cd16581b578 705 copy(romId, this->romId());
IanBenzMaxim 7:9cd16581b578 706 return *this;
IanBenzMaxim 7:9cd16581b578 707 }
IanBenzMaxim 7:9cd16581b578 708
IanBenzMaxim 7:9cd16581b578 709 /// @}
IanBenzMaxim 7:9cd16581b578 710
IanBenzMaxim 7:9cd16581b578 711 /// @name MAN ID
IanBenzMaxim 7:9cd16581b578 712 /// @brief Manufacturer ID of the device.
IanBenzMaxim 7:9cd16581b578 713 /// @{
IanBenzMaxim 7:9cd16581b578 714
IanBenzMaxim 7:9cd16581b578 715 /// Get mutable MAN ID.
IanBenzMaxim 7:9cd16581b578 716 Core::ManId::span manId() {
IanBenzMaxim 7:9cd16581b578 717 return make_span(result_).subspan<manIdIdx, Core::ManId::size>();
IanBenzMaxim 7:9cd16581b578 718 }
IanBenzMaxim 7:9cd16581b578 719
IanBenzMaxim 7:9cd16581b578 720 /// Get immutable MAN ID.
IanBenzMaxim 7:9cd16581b578 721 Core::ManId::const_span manId() const {
IanBenzMaxim 7:9cd16581b578 722 return const_cast<ProtectionWriteMacData &>(*this).manId();
IanBenzMaxim 7:9cd16581b578 723 }
IanBenzMaxim 7:9cd16581b578 724
IanBenzMaxim 7:9cd16581b578 725 /// Set MAN ID.
IanBenzMaxim 7:9cd16581b578 726 ProtectionWriteMacData & setManId(Core::ManId::const_span manId) {
IanBenzMaxim 7:9cd16581b578 727 copy(manId, this->manId());
IanBenzMaxim 7:9cd16581b578 728 return *this;
IanBenzMaxim 7:9cd16581b578 729 }
IanBenzMaxim 7:9cd16581b578 730
IanBenzMaxim 7:9cd16581b578 731 /// @}
IanBenzMaxim 7:9cd16581b578 732
IanBenzMaxim 7:9cd16581b578 733 /// @name Old protection
IanBenzMaxim 7:9cd16581b578 734 /// @brief Existing protection status in device.
IanBenzMaxim 7:9cd16581b578 735 /// @{
IanBenzMaxim 7:9cd16581b578 736
IanBenzMaxim 7:9cd16581b578 737 /// Get old protection.
IanBenzMaxim 7:9cd16581b578 738 BlockProtection oldProtection() const { return oldProtection_; }
IanBenzMaxim 7:9cd16581b578 739
IanBenzMaxim 7:9cd16581b578 740 /// Set old protection.
IanBenzMaxim 7:9cd16581b578 741 MaximInterfaceDevices_EXPORT ProtectionWriteMacData &
IanBenzMaxim 7:9cd16581b578 742 setOldProtection(BlockProtection oldProtection);
IanBenzMaxim 7:9cd16581b578 743
IanBenzMaxim 7:9cd16581b578 744 /// @}
IanBenzMaxim 7:9cd16581b578 745
IanBenzMaxim 7:9cd16581b578 746 /// @name New protection
IanBenzMaxim 7:9cd16581b578 747 /// @brief New protection status to write.
IanBenzMaxim 7:9cd16581b578 748 /// @{
IanBenzMaxim 7:9cd16581b578 749
IanBenzMaxim 7:9cd16581b578 750 /// Get new protection.
IanBenzMaxim 7:9cd16581b578 751 BlockProtection newProtection() const { return newProtection_; }
IanBenzMaxim 7:9cd16581b578 752
IanBenzMaxim 7:9cd16581b578 753 /// Set new protection.
IanBenzMaxim 7:9cd16581b578 754 MaximInterfaceDevices_EXPORT ProtectionWriteMacData &
IanBenzMaxim 7:9cd16581b578 755 setNewProtection(BlockProtection newProtection);
IanBenzMaxim 7:9cd16581b578 756
IanBenzMaxim 7:9cd16581b578 757 /// @}
IanBenzMaxim 7:9cd16581b578 758
IanBenzMaxim 7:9cd16581b578 759 private:
IanBenzMaxim 8:5ea891c7d1a1 760 static const size_t romIdIdx = 0;
IanBenzMaxim 8:5ea891c7d1a1 761 static const size_t manIdIdx = romIdIdx + Core::RomId::size;
IanBenzMaxim 8:5ea891c7d1a1 762 static const size_t blockNumIdx = manIdIdx + Core::ManId::size;
IanBenzMaxim 8:5ea891c7d1a1 763 static const size_t oldProtectionIdx = blockNumIdx + 2;
IanBenzMaxim 8:5ea891c7d1a1 764 static const size_t newProtectionIdx = oldProtectionIdx + 4;
IanBenzMaxim 7:9cd16581b578 765
IanBenzMaxim 7:9cd16581b578 766 Result::array result_;
IanBenzMaxim 7:9cd16581b578 767 BlockProtection oldProtection_;
IanBenzMaxim 7:9cd16581b578 768 BlockProtection newProtection_;
IanBenzMaxim 7:9cd16581b578 769 };
IanBenzMaxim 7:9cd16581b578 770
IanBenzMaxim 7:9cd16581b578 771 /// @brief
IanBenzMaxim 7:9cd16581b578 772 /// Format data to hash for device authentication or computing the next secret
IanBenzMaxim 7:9cd16581b578 773 /// from the existing secret.
IanBenzMaxim 7:9cd16581b578 774 class DS28E15_22_25::AuthenticationData {
IanBenzMaxim 7:9cd16581b578 775 public:
IanBenzMaxim 7:9cd16581b578 776 typedef Core::array_span<uint_least8_t, 76> Result;
IanBenzMaxim 7:9cd16581b578 777
IanBenzMaxim 7:9cd16581b578 778 AuthenticationData() : result_() {}
IanBenzMaxim 7:9cd16581b578 779
IanBenzMaxim 7:9cd16581b578 780 /// Formatted data result.
IanBenzMaxim 7:9cd16581b578 781 Result::const_span result() const { return result_; }
IanBenzMaxim 7:9cd16581b578 782
IanBenzMaxim 7:9cd16581b578 783 /// @name Page
IanBenzMaxim 7:9cd16581b578 784 /// @brief Data from a device memory page.
IanBenzMaxim 7:9cd16581b578 785 /// @{
IanBenzMaxim 7:9cd16581b578 786
IanBenzMaxim 7:9cd16581b578 787 /// Get mutable page.
IanBenzMaxim 7:9cd16581b578 788 Page::span page() {
IanBenzMaxim 7:9cd16581b578 789 return make_span(result_).subspan<pageIdx, Page::size>();
IanBenzMaxim 7:9cd16581b578 790 }
IanBenzMaxim 7:9cd16581b578 791
IanBenzMaxim 7:9cd16581b578 792 /// Get immutable page.
IanBenzMaxim 7:9cd16581b578 793 Page::const_span page() const {
IanBenzMaxim 7:9cd16581b578 794 return const_cast<AuthenticationData &>(*this).page();
IanBenzMaxim 7:9cd16581b578 795 }
IanBenzMaxim 7:9cd16581b578 796
IanBenzMaxim 7:9cd16581b578 797 /// Set page.
IanBenzMaxim 7:9cd16581b578 798 AuthenticationData & setPage(Page::const_span page) {
IanBenzMaxim 7:9cd16581b578 799 copy(page, this->page());
IanBenzMaxim 7:9cd16581b578 800 return *this;
IanBenzMaxim 7:9cd16581b578 801 }
IanBenzMaxim 7:9cd16581b578 802
IanBenzMaxim 7:9cd16581b578 803 /// @}
IanBenzMaxim 7:9cd16581b578 804
IanBenzMaxim 7:9cd16581b578 805 /// @name Scratchpad
IanBenzMaxim 7:9cd16581b578 806 /// @brief
IanBenzMaxim 7:9cd16581b578 807 /// Data from device scratchpad used as a random challenge in device
IanBenzMaxim 7:9cd16581b578 808 /// authentication and a partial secret in secret computation.
IanBenzMaxim 7:9cd16581b578 809 /// @{
IanBenzMaxim 7:9cd16581b578 810
IanBenzMaxim 7:9cd16581b578 811 /// Get mutable scratchpad.
IanBenzMaxim 7:9cd16581b578 812 Page::span scratchpad() {
IanBenzMaxim 7:9cd16581b578 813 return make_span(result_).subspan<scratchpadIdx, Page::size>();
IanBenzMaxim 7:9cd16581b578 814 }
IanBenzMaxim 7:9cd16581b578 815
IanBenzMaxim 7:9cd16581b578 816 /// Get immutable scratchpad.
IanBenzMaxim 7:9cd16581b578 817 Page::const_span scratchpad() const {
IanBenzMaxim 7:9cd16581b578 818 return const_cast<AuthenticationData &>(*this).scratchpad();
IanBenzMaxim 7:9cd16581b578 819 }
IanBenzMaxim 7:9cd16581b578 820
IanBenzMaxim 7:9cd16581b578 821 /// Set scratchpad.
IanBenzMaxim 7:9cd16581b578 822 AuthenticationData & setScratchpad(Page::const_span scratchpad) {
IanBenzMaxim 7:9cd16581b578 823 copy(scratchpad, this->scratchpad());
IanBenzMaxim 7:9cd16581b578 824 return *this;
IanBenzMaxim 7:9cd16581b578 825 }
IanBenzMaxim 7:9cd16581b578 826
IanBenzMaxim 7:9cd16581b578 827 /// @}
IanBenzMaxim 7:9cd16581b578 828
IanBenzMaxim 7:9cd16581b578 829 /// @name ROM ID
IanBenzMaxim 7:9cd16581b578 830 /// @brief 1-Wire ROM ID of the device.
IanBenzMaxim 7:9cd16581b578 831 /// @{
IanBenzMaxim 7:9cd16581b578 832
IanBenzMaxim 7:9cd16581b578 833 /// Get mutable ROM ID.
IanBenzMaxim 7:9cd16581b578 834 Core::RomId::span romId() {
IanBenzMaxim 7:9cd16581b578 835 return make_span(result_).subspan<romIdIdx, Core::RomId::size>();
IanBenzMaxim 7:9cd16581b578 836 }
IanBenzMaxim 7:9cd16581b578 837
IanBenzMaxim 7:9cd16581b578 838 /// Get immutable ROM ID.
IanBenzMaxim 7:9cd16581b578 839 Core::RomId::const_span romId() const {
IanBenzMaxim 7:9cd16581b578 840 return const_cast<AuthenticationData &>(*this).romId();
IanBenzMaxim 7:9cd16581b578 841 }
IanBenzMaxim 7:9cd16581b578 842
IanBenzMaxim 7:9cd16581b578 843 /// Set ROM ID.
IanBenzMaxim 7:9cd16581b578 844 AuthenticationData & setRomId(Core::RomId::const_span romId) {
IanBenzMaxim 7:9cd16581b578 845 copy(romId, this->romId());
IanBenzMaxim 7:9cd16581b578 846 return *this;
IanBenzMaxim 7:9cd16581b578 847 }
IanBenzMaxim 7:9cd16581b578 848
IanBenzMaxim 7:9cd16581b578 849 /// Set ROM ID for use in anonymous mode.
IanBenzMaxim 7:9cd16581b578 850 MaximInterfaceDevices_EXPORT AuthenticationData & setAnonymousRomId();
IanBenzMaxim 7:9cd16581b578 851
IanBenzMaxim 7:9cd16581b578 852 /// @}
IanBenzMaxim 7:9cd16581b578 853
IanBenzMaxim 7:9cd16581b578 854 /// @name MAN ID
IanBenzMaxim 7:9cd16581b578 855 /// @brief Manufacturer ID of the device.
IanBenzMaxim 7:9cd16581b578 856 /// @{
IanBenzMaxim 7:9cd16581b578 857
IanBenzMaxim 7:9cd16581b578 858 /// Get mutable MAN ID.
IanBenzMaxim 7:9cd16581b578 859 Core::ManId::span manId() {
IanBenzMaxim 7:9cd16581b578 860 return make_span(result_).subspan<manIdIdx, Core::ManId::size>();
IanBenzMaxim 7:9cd16581b578 861 }
IanBenzMaxim 7:9cd16581b578 862
IanBenzMaxim 7:9cd16581b578 863 /// Get immutable MAN ID.
IanBenzMaxim 7:9cd16581b578 864 Core::ManId::const_span manId() const {
IanBenzMaxim 7:9cd16581b578 865 return const_cast<AuthenticationData &>(*this).manId();
IanBenzMaxim 7:9cd16581b578 866 }
IanBenzMaxim 7:9cd16581b578 867
IanBenzMaxim 7:9cd16581b578 868 /// Set MAN ID.
IanBenzMaxim 7:9cd16581b578 869 AuthenticationData & setManId(Core::ManId::const_span manId) {
IanBenzMaxim 7:9cd16581b578 870 copy(manId, this->manId());
IanBenzMaxim 7:9cd16581b578 871 return *this;
IanBenzMaxim 7:9cd16581b578 872 }
IanBenzMaxim 7:9cd16581b578 873
IanBenzMaxim 7:9cd16581b578 874 /// @}
IanBenzMaxim 7:9cd16581b578 875
IanBenzMaxim 7:9cd16581b578 876 /// @name Page number
IanBenzMaxim 7:9cd16581b578 877 /// @brief Number of the page to use data from.
IanBenzMaxim 7:9cd16581b578 878 /// @{
IanBenzMaxim 7:9cd16581b578 879
IanBenzMaxim 7:9cd16581b578 880 /// Get page number.
IanBenzMaxim 7:9cd16581b578 881 int pageNum() const { return result_[pageNumIdx]; }
IanBenzMaxim 7:9cd16581b578 882
IanBenzMaxim 7:9cd16581b578 883 /// Set page number.
IanBenzMaxim 7:9cd16581b578 884 AuthenticationData & setPageNum(int pageNum) {
IanBenzMaxim 7:9cd16581b578 885 result_[pageNumIdx] = pageNum;
IanBenzMaxim 7:9cd16581b578 886 return *this;
IanBenzMaxim 7:9cd16581b578 887 }
IanBenzMaxim 7:9cd16581b578 888
IanBenzMaxim 7:9cd16581b578 889 /// @}
IanBenzMaxim 7:9cd16581b578 890
IanBenzMaxim 7:9cd16581b578 891 private:
IanBenzMaxim 8:5ea891c7d1a1 892 static const size_t pageIdx = 0;
IanBenzMaxim 8:5ea891c7d1a1 893 static const size_t scratchpadIdx = pageIdx + Page::size;
IanBenzMaxim 8:5ea891c7d1a1 894 static const size_t romIdIdx = scratchpadIdx + Page::size;
IanBenzMaxim 8:5ea891c7d1a1 895 static const size_t manIdIdx = romIdIdx + Core::RomId::size;
IanBenzMaxim 8:5ea891c7d1a1 896 static const size_t pageNumIdx = manIdIdx + Core::ManId::size;
IanBenzMaxim 7:9cd16581b578 897
IanBenzMaxim 7:9cd16581b578 898 Result::array result_;
IanBenzMaxim 7:9cd16581b578 899 };
IanBenzMaxim 7:9cd16581b578 900
IanBenzMaxim 7:9cd16581b578 901 } // namespace MaximInterfaceDevices
IanBenzMaxim 7:9cd16581b578 902
IanBenzMaxim 7:9cd16581b578 903 #endif