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
Updated to version 2.2.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 12:7eb41621ba22 1 /*******************************************************************************
IanBenzMaxim 12:7eb41621ba22 2 * Copyright (C) Maxim Integrated Products, Inc., All Rights Reserved.
IanBenzMaxim 12:7eb41621ba22 3 *
IanBenzMaxim 12:7eb41621ba22 4 * Permission is hereby granted, free of charge, to any person obtaining a
IanBenzMaxim 12:7eb41621ba22 5 * copy of this software and associated documentation files (the "Software"),
IanBenzMaxim 12:7eb41621ba22 6 * to deal in the Software without restriction, including without limitation
IanBenzMaxim 12:7eb41621ba22 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
IanBenzMaxim 12:7eb41621ba22 8 * and/or sell copies of the Software, and to permit persons to whom the
IanBenzMaxim 12:7eb41621ba22 9 * Software is furnished to do so, subject to the following conditions:
IanBenzMaxim 12:7eb41621ba22 10 *
IanBenzMaxim 12:7eb41621ba22 11 * The above copyright notice and this permission notice shall be included
IanBenzMaxim 12:7eb41621ba22 12 * in all copies or substantial portions of the Software.
IanBenzMaxim 12:7eb41621ba22 13 *
IanBenzMaxim 12:7eb41621ba22 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
IanBenzMaxim 12:7eb41621ba22 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
IanBenzMaxim 12:7eb41621ba22 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IanBenzMaxim 12:7eb41621ba22 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
IanBenzMaxim 12:7eb41621ba22 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
IanBenzMaxim 12:7eb41621ba22 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
IanBenzMaxim 12:7eb41621ba22 20 * OTHER DEALINGS IN THE SOFTWARE.
IanBenzMaxim 12:7eb41621ba22 21 *
IanBenzMaxim 12:7eb41621ba22 22 * Except as contained in this notice, the name of Maxim Integrated
IanBenzMaxim 12:7eb41621ba22 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
IanBenzMaxim 12:7eb41621ba22 24 * Products, Inc. Branding Policy.
IanBenzMaxim 12:7eb41621ba22 25 *
IanBenzMaxim 12:7eb41621ba22 26 * The mere transfer of this software does not imply any licenses
IanBenzMaxim 12:7eb41621ba22 27 * of trade secrets, proprietary technology, copyrights, patents,
IanBenzMaxim 12:7eb41621ba22 28 * trademarks, maskwork rights, or any other form of intellectual
IanBenzMaxim 12:7eb41621ba22 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
IanBenzMaxim 12:7eb41621ba22 30 * ownership rights.
IanBenzMaxim 12:7eb41621ba22 31 *******************************************************************************/
IanBenzMaxim 12:7eb41621ba22 32
IanBenzMaxim 12:7eb41621ba22 33 #include <stddef.h>
IanBenzMaxim 12:7eb41621ba22 34 #include <algorithm>
IanBenzMaxim 12:7eb41621ba22 35 #include <MaximInterfaceCore/Error.hpp>
IanBenzMaxim 12:7eb41621ba22 36 #include "DS28C16.hpp"
IanBenzMaxim 12:7eb41621ba22 37
IanBenzMaxim 12:7eb41621ba22 38 namespace MaximInterfaceDevices {
IanBenzMaxim 12:7eb41621ba22 39
IanBenzMaxim 12:7eb41621ba22 40 using namespace Core;
IanBenzMaxim 12:7eb41621ba22 41 using std::copy;
IanBenzMaxim 12:7eb41621ba22 42 using std::fill;
IanBenzMaxim 12:7eb41621ba22 43
IanBenzMaxim 12:7eb41621ba22 44 static const int readMemoryTimeMs = 5;
IanBenzMaxim 12:7eb41621ba22 45 static const int writeMemoryTimeMs = 60;
IanBenzMaxim 12:7eb41621ba22 46 static const int shortWriteMemoryTimeMs = 15;
IanBenzMaxim 12:7eb41621ba22 47 static const int computationTimeMs = 15;
IanBenzMaxim 12:7eb41621ba22 48
IanBenzMaxim 12:7eb41621ba22 49 const int DS28C16::decrementCounterPage;
IanBenzMaxim 12:7eb41621ba22 50 const int DS28C16::masterSecretPage;
IanBenzMaxim 12:7eb41621ba22 51 const int DS28C16::memoryPages;
IanBenzMaxim 12:7eb41621ba22 52
IanBenzMaxim 12:7eb41621ba22 53 Result<void> DS28C16::writeMemory(int pageNum, Page::const_span page) {
IanBenzMaxim 12:7eb41621ba22 54 if (pageNum < 0 || pageNum >= memoryPages) {
IanBenzMaxim 12:7eb41621ba22 55 return InvalidParameterError;
IanBenzMaxim 12:7eb41621ba22 56 }
IanBenzMaxim 12:7eb41621ba22 57
IanBenzMaxim 12:7eb41621ba22 58 uint_least8_t request[2 + Page::size];
IanBenzMaxim 12:7eb41621ba22 59 request[0] = 0x96;
IanBenzMaxim 12:7eb41621ba22 60 request[1] = pageNum;
IanBenzMaxim 12:7eb41621ba22 61 copy(page.begin(), page.end(), request + 2);
IanBenzMaxim 12:7eb41621ba22 62 return runCommand(request, writeMemoryTimeMs);
IanBenzMaxim 12:7eb41621ba22 63 }
IanBenzMaxim 12:7eb41621ba22 64
IanBenzMaxim 12:7eb41621ba22 65 Result<DS28C16::Page::array> DS28C16::readMemory(int pageNum) const {
IanBenzMaxim 12:7eb41621ba22 66 if (pageNum < 0 || pageNum >= memoryPages) {
IanBenzMaxim 12:7eb41621ba22 67 return InvalidParameterError;
IanBenzMaxim 12:7eb41621ba22 68 }
IanBenzMaxim 12:7eb41621ba22 69
IanBenzMaxim 12:7eb41621ba22 70 uint_least8_t buffer[1 + Page::size * 2];
IanBenzMaxim 12:7eb41621ba22 71 buffer[0] = 0x44;
IanBenzMaxim 12:7eb41621ba22 72 buffer[1] = pageNum;
IanBenzMaxim 12:7eb41621ba22 73 Result<span<uint_least8_t> > response =
IanBenzMaxim 12:7eb41621ba22 74 runCommand(make_span(buffer, 2), readMemoryTimeMs, buffer);
IanBenzMaxim 12:7eb41621ba22 75 if (!response) {
IanBenzMaxim 12:7eb41621ba22 76 return response.error();
IanBenzMaxim 12:7eb41621ba22 77 }
IanBenzMaxim 12:7eb41621ba22 78 Page::array page;
IanBenzMaxim 12:7eb41621ba22 79 response.value() = response.value().first(Page::size);
IanBenzMaxim 12:7eb41621ba22 80 copy(response.value().begin(), response.value().end(), page.begin());
IanBenzMaxim 12:7eb41621ba22 81 return page;
IanBenzMaxim 12:7eb41621ba22 82 }
IanBenzMaxim 12:7eb41621ba22 83
IanBenzMaxim 12:7eb41621ba22 84 Result<DS28C16::Status> DS28C16::readStatus() const {
IanBenzMaxim 12:7eb41621ba22 85 uint_least8_t buffer[1 + Status::PageProtectionList::size + RomId::size + 2];
IanBenzMaxim 12:7eb41621ba22 86 buffer[0] = 0xAA;
IanBenzMaxim 12:7eb41621ba22 87 const Result<span<uint_least8_t> > response =
IanBenzMaxim 12:7eb41621ba22 88 runCommand(make_span(buffer, 1), readMemoryTimeMs, buffer);
IanBenzMaxim 12:7eb41621ba22 89 if (!response) {
IanBenzMaxim 12:7eb41621ba22 90 return response.error();
IanBenzMaxim 12:7eb41621ba22 91 }
IanBenzMaxim 12:7eb41621ba22 92 Status status;
IanBenzMaxim 12:7eb41621ba22 93 span<uint_least8_t>::const_iterator responseIt = response.value().begin();
IanBenzMaxim 12:7eb41621ba22 94 for (Status::PageProtectionList::array::iterator it =
IanBenzMaxim 12:7eb41621ba22 95 status.pageProtection.begin();
IanBenzMaxim 12:7eb41621ba22 96 it != status.pageProtection.end(); ++it) {
IanBenzMaxim 12:7eb41621ba22 97 *it = *responseIt;
IanBenzMaxim 12:7eb41621ba22 98 ++responseIt;
IanBenzMaxim 12:7eb41621ba22 99 }
IanBenzMaxim 12:7eb41621ba22 100 const span<uint_least8_t>::const_iterator responseItEnd =
IanBenzMaxim 12:7eb41621ba22 101 responseIt + status.romId.size();
IanBenzMaxim 12:7eb41621ba22 102 copy(responseIt, responseItEnd, status.romId.begin());
IanBenzMaxim 12:7eb41621ba22 103 responseIt = responseItEnd;
IanBenzMaxim 12:7eb41621ba22 104 status.manId = *responseIt;
IanBenzMaxim 12:7eb41621ba22 105 ++responseIt;
IanBenzMaxim 12:7eb41621ba22 106 status.deviceVersion = *responseIt;
IanBenzMaxim 12:7eb41621ba22 107 return status;
IanBenzMaxim 12:7eb41621ba22 108 }
IanBenzMaxim 12:7eb41621ba22 109
IanBenzMaxim 12:7eb41621ba22 110 Result<void> DS28C16::setPageProtection(int pageNum,
IanBenzMaxim 12:7eb41621ba22 111 const PageProtection & protection) {
IanBenzMaxim 12:7eb41621ba22 112 if (pageNum < 0 || pageNum >= memoryPages) {
IanBenzMaxim 12:7eb41621ba22 113 return InvalidParameterError;
IanBenzMaxim 12:7eb41621ba22 114 }
IanBenzMaxim 12:7eb41621ba22 115
IanBenzMaxim 12:7eb41621ba22 116 const uint_least8_t request[] = {
IanBenzMaxim 12:7eb41621ba22 117 0xC3, static_cast<uint_least8_t>(pageNum),
IanBenzMaxim 12:7eb41621ba22 118 static_cast<uint_least8_t>(protection.to_ulong())};
IanBenzMaxim 12:7eb41621ba22 119 return runCommand(request, shortWriteMemoryTimeMs);
IanBenzMaxim 12:7eb41621ba22 120 }
IanBenzMaxim 12:7eb41621ba22 121
IanBenzMaxim 12:7eb41621ba22 122 Result<DS28C16::DoublePage::array> DS28C16::computeAndReadPageAuthentication(
IanBenzMaxim 12:7eb41621ba22 123 int pageNum, bool anonymous, DoublePage::const_span challenge) const {
IanBenzMaxim 12:7eb41621ba22 124 if (pageNum < 0 || pageNum >= memoryPages) {
IanBenzMaxim 12:7eb41621ba22 125 return InvalidParameterError;
IanBenzMaxim 12:7eb41621ba22 126 }
IanBenzMaxim 12:7eb41621ba22 127
IanBenzMaxim 12:7eb41621ba22 128 const size_t requestSize = 3 + DoublePage::size;
IanBenzMaxim 12:7eb41621ba22 129 const size_t responseSize = 1 + DoublePage::size;
IanBenzMaxim 12:7eb41621ba22 130 uint_least8_t buffer[MaximInterfaceCore_MAX(requestSize, responseSize)];
IanBenzMaxim 12:7eb41621ba22 131 buffer[0] = 0xA5;
IanBenzMaxim 12:7eb41621ba22 132 buffer[1] = pageNum;
IanBenzMaxim 12:7eb41621ba22 133 if (anonymous) {
IanBenzMaxim 12:7eb41621ba22 134 buffer[1] |= 0xE0;
IanBenzMaxim 12:7eb41621ba22 135 }
IanBenzMaxim 12:7eb41621ba22 136 buffer[2] = 0x02;
IanBenzMaxim 12:7eb41621ba22 137 copy(challenge.begin(), challenge.end(), buffer + 3);
IanBenzMaxim 12:7eb41621ba22 138 const Result<span<uint_least8_t> > response =
IanBenzMaxim 12:7eb41621ba22 139 runCommand(make_span(buffer, requestSize), computationTimeMs,
IanBenzMaxim 12:7eb41621ba22 140 make_span(buffer, responseSize));
IanBenzMaxim 12:7eb41621ba22 141 if (!response) {
IanBenzMaxim 12:7eb41621ba22 142 return response.error();
IanBenzMaxim 12:7eb41621ba22 143 }
IanBenzMaxim 12:7eb41621ba22 144 DoublePage::array hmac;
IanBenzMaxim 12:7eb41621ba22 145 copy(response.value().begin(), response.value().end(), hmac.begin());
IanBenzMaxim 12:7eb41621ba22 146 return hmac;
IanBenzMaxim 12:7eb41621ba22 147 }
IanBenzMaxim 12:7eb41621ba22 148
IanBenzMaxim 12:7eb41621ba22 149 Result<void> DS28C16::computeSecret(int bindingDataPageNum,
IanBenzMaxim 12:7eb41621ba22 150 bool constantBindingData, bool anonymous,
IanBenzMaxim 12:7eb41621ba22 151 DoublePage::const_span partialSecret) {
IanBenzMaxim 12:7eb41621ba22 152 if (bindingDataPageNum < 0 || bindingDataPageNum >= memoryPages) {
IanBenzMaxim 12:7eb41621ba22 153 return InvalidParameterError;
IanBenzMaxim 12:7eb41621ba22 154 }
IanBenzMaxim 12:7eb41621ba22 155
IanBenzMaxim 12:7eb41621ba22 156 uint_least8_t request[3 + DoublePage::size];
IanBenzMaxim 12:7eb41621ba22 157 request[0] = 0x3C;
IanBenzMaxim 12:7eb41621ba22 158 request[1] = bindingDataPageNum;
IanBenzMaxim 12:7eb41621ba22 159 if (constantBindingData) {
IanBenzMaxim 12:7eb41621ba22 160 request[1] |= 0x04;
IanBenzMaxim 12:7eb41621ba22 161 }
IanBenzMaxim 12:7eb41621ba22 162 if (anonymous) {
IanBenzMaxim 12:7eb41621ba22 163 request[1] |= 0xE0;
IanBenzMaxim 12:7eb41621ba22 164 }
IanBenzMaxim 12:7eb41621ba22 165 request[2] = 0x08;
IanBenzMaxim 12:7eb41621ba22 166 copy(partialSecret.begin(), partialSecret.end(), request + 3);
IanBenzMaxim 12:7eb41621ba22 167 return runCommand(request, computationTimeMs);
IanBenzMaxim 12:7eb41621ba22 168 }
IanBenzMaxim 12:7eb41621ba22 169
IanBenzMaxim 12:7eb41621ba22 170 Result<void> DS28C16::decrementCounter() {
IanBenzMaxim 12:7eb41621ba22 171 const uint_least8_t request = 0xC9;
IanBenzMaxim 12:7eb41621ba22 172 return runCommand(make_span(&request, 1), writeMemoryTimeMs);
IanBenzMaxim 12:7eb41621ba22 173 }
IanBenzMaxim 12:7eb41621ba22 174
IanBenzMaxim 12:7eb41621ba22 175 Result<void> DS28C16::lockOutDisableDevice() {
IanBenzMaxim 12:7eb41621ba22 176 const DisableDevicePassword::array password = {0};
IanBenzMaxim 12:7eb41621ba22 177 return disableDevice(LockOutDisableDevice, password);
IanBenzMaxim 12:7eb41621ba22 178 }
IanBenzMaxim 12:7eb41621ba22 179
IanBenzMaxim 12:7eb41621ba22 180 Result<void>
IanBenzMaxim 12:7eb41621ba22 181 DS28C16::setDisableDevicePassword(DisableDevicePassword::const_span password) {
IanBenzMaxim 12:7eb41621ba22 182 return disableDevice(SetDisableDevicePassword, password);
IanBenzMaxim 12:7eb41621ba22 183 }
IanBenzMaxim 12:7eb41621ba22 184
IanBenzMaxim 12:7eb41621ba22 185 Result<void>
IanBenzMaxim 12:7eb41621ba22 186 DS28C16::disableDevice(DisableDevicePassword::const_span password) {
IanBenzMaxim 12:7eb41621ba22 187 return disableDevice(DisableDevice, password);
IanBenzMaxim 12:7eb41621ba22 188 }
IanBenzMaxim 12:7eb41621ba22 189
IanBenzMaxim 12:7eb41621ba22 190 Result<void>
IanBenzMaxim 12:7eb41621ba22 191 DS28C16::disableDevice(DisableDeviceOperation operation,
IanBenzMaxim 12:7eb41621ba22 192 DisableDevicePassword::const_span password) {
IanBenzMaxim 12:7eb41621ba22 193 const uint_least8_t request[] = {
IanBenzMaxim 12:7eb41621ba22 194 0x33, static_cast<uint_least8_t>(operation),
IanBenzMaxim 12:7eb41621ba22 195 password[0], password[1],
IanBenzMaxim 12:7eb41621ba22 196 0x71, 0x35,
IanBenzMaxim 12:7eb41621ba22 197 0x0E, 0xAC,
IanBenzMaxim 12:7eb41621ba22 198 0x95, 0xF8};
IanBenzMaxim 12:7eb41621ba22 199 return runCommand(request, shortWriteMemoryTimeMs);
IanBenzMaxim 12:7eb41621ba22 200 }
IanBenzMaxim 12:7eb41621ba22 201
IanBenzMaxim 12:7eb41621ba22 202 Result<span<uint_least8_t> >
IanBenzMaxim 12:7eb41621ba22 203 DS28C16::runCommand(span<const uint_least8_t> request, int delayTime,
IanBenzMaxim 12:7eb41621ba22 204 span<uint_least8_t> response) const {
IanBenzMaxim 12:7eb41621ba22 205 const Result<span<uint_least8_t> > responseOutput =
IanBenzMaxim 12:7eb41621ba22 206 doRunCommand(request, delayTime, response);
IanBenzMaxim 12:7eb41621ba22 207 if (!responseOutput) {
IanBenzMaxim 12:7eb41621ba22 208 return responseOutput;
IanBenzMaxim 12:7eb41621ba22 209 }
IanBenzMaxim 12:7eb41621ba22 210 if (responseOutput.value().empty()) {
IanBenzMaxim 12:7eb41621ba22 211 return InvalidResponseError;
IanBenzMaxim 12:7eb41621ba22 212 }
IanBenzMaxim 12:7eb41621ba22 213 // Parse command result byte.
IanBenzMaxim 12:7eb41621ba22 214 switch (responseOutput.value().front()) {
IanBenzMaxim 12:7eb41621ba22 215 case 0xAA:
IanBenzMaxim 12:7eb41621ba22 216 // Success response.
IanBenzMaxim 12:7eb41621ba22 217 break;
IanBenzMaxim 12:7eb41621ba22 218
IanBenzMaxim 12:7eb41621ba22 219 case 0x00:
IanBenzMaxim 12:7eb41621ba22 220 return AuthenticationError;
IanBenzMaxim 12:7eb41621ba22 221
IanBenzMaxim 12:7eb41621ba22 222 default:
IanBenzMaxim 12:7eb41621ba22 223 return error_code(responseOutput.value().front(), errorCategory());
IanBenzMaxim 12:7eb41621ba22 224 }
IanBenzMaxim 12:7eb41621ba22 225 if (responseOutput.value().size() != response.size()) {
IanBenzMaxim 12:7eb41621ba22 226 return InvalidResponseError;
IanBenzMaxim 12:7eb41621ba22 227 }
IanBenzMaxim 12:7eb41621ba22 228 return responseOutput.value().subspan(1);
IanBenzMaxim 12:7eb41621ba22 229 }
IanBenzMaxim 12:7eb41621ba22 230
IanBenzMaxim 12:7eb41621ba22 231 Result<void> DS28C16::runCommand(span<const uint_least8_t> request,
IanBenzMaxim 12:7eb41621ba22 232 int delayTime) {
IanBenzMaxim 12:7eb41621ba22 233 uint_least8_t buffer;
IanBenzMaxim 12:7eb41621ba22 234 MaximInterfaceCore_TRY(runCommand(request, delayTime, make_span(&buffer, 1)));
IanBenzMaxim 12:7eb41621ba22 235 return none;
IanBenzMaxim 12:7eb41621ba22 236 }
IanBenzMaxim 12:7eb41621ba22 237
IanBenzMaxim 12:7eb41621ba22 238 const error_category & DS28C16::errorCategory() {
IanBenzMaxim 12:7eb41621ba22 239 static class : public error_category {
IanBenzMaxim 12:7eb41621ba22 240 public:
IanBenzMaxim 12:7eb41621ba22 241 virtual const char * name() const {
IanBenzMaxim 12:7eb41621ba22 242 return "MaximInterfaceDevices.DS28C16";
IanBenzMaxim 12:7eb41621ba22 243 }
IanBenzMaxim 12:7eb41621ba22 244
IanBenzMaxim 12:7eb41621ba22 245 virtual std::string message(int condition) const {
IanBenzMaxim 12:7eb41621ba22 246 switch (condition) {
IanBenzMaxim 12:7eb41621ba22 247 case InvalidOperationError:
IanBenzMaxim 12:7eb41621ba22 248 return "Invalid Operation Error";
IanBenzMaxim 12:7eb41621ba22 249
IanBenzMaxim 12:7eb41621ba22 250 case InvalidParameterError:
IanBenzMaxim 12:7eb41621ba22 251 return "Invalid Parameter Error";
IanBenzMaxim 12:7eb41621ba22 252
IanBenzMaxim 12:7eb41621ba22 253 case InvalidSequenceError:
IanBenzMaxim 12:7eb41621ba22 254 return "Invalid Sequence Error";
IanBenzMaxim 12:7eb41621ba22 255
IanBenzMaxim 12:7eb41621ba22 256 case InternalError:
IanBenzMaxim 12:7eb41621ba22 257 return "Internal Error";
IanBenzMaxim 12:7eb41621ba22 258
IanBenzMaxim 12:7eb41621ba22 259 case DeviceDisabledError:
IanBenzMaxim 12:7eb41621ba22 260 return "Device Disabled Error";
IanBenzMaxim 12:7eb41621ba22 261
IanBenzMaxim 12:7eb41621ba22 262 case AuthenticationError:
IanBenzMaxim 12:7eb41621ba22 263 return "Authentication Error";
IanBenzMaxim 12:7eb41621ba22 264
IanBenzMaxim 12:7eb41621ba22 265 case InvalidResponseError:
IanBenzMaxim 12:7eb41621ba22 266 return "Invalid Response Error";
IanBenzMaxim 12:7eb41621ba22 267 }
IanBenzMaxim 12:7eb41621ba22 268 return defaultErrorMessage(condition);
IanBenzMaxim 12:7eb41621ba22 269 }
IanBenzMaxim 12:7eb41621ba22 270 } instance;
IanBenzMaxim 12:7eb41621ba22 271 return instance;
IanBenzMaxim 12:7eb41621ba22 272 }
IanBenzMaxim 12:7eb41621ba22 273
IanBenzMaxim 12:7eb41621ba22 274 DS28C16::PageAuthenticationData &
IanBenzMaxim 12:7eb41621ba22 275 DS28C16::PageAuthenticationData::setAnonymousRomId() {
IanBenzMaxim 12:7eb41621ba22 276 fill(romId().begin(), romId().end(), 0xFF);
IanBenzMaxim 12:7eb41621ba22 277 return *this;
IanBenzMaxim 12:7eb41621ba22 278 }
IanBenzMaxim 12:7eb41621ba22 279
IanBenzMaxim 12:7eb41621ba22 280 DS28C16::ComputeSecretData &
IanBenzMaxim 12:7eb41621ba22 281 DS28C16::ComputeSecretData::setConstantBindingData(bool constantBindingData) {
IanBenzMaxim 12:7eb41621ba22 282 if (constantBindingData) {
IanBenzMaxim 12:7eb41621ba22 283 data.setPageNum(data.pageNum() | constantBindingDataMask);
IanBenzMaxim 12:7eb41621ba22 284 fill(bindingData().begin(), bindingData().end(), 0);
IanBenzMaxim 12:7eb41621ba22 285 } else {
IanBenzMaxim 12:7eb41621ba22 286 data.setPageNum(data.pageNum() & ~constantBindingDataMask);
IanBenzMaxim 12:7eb41621ba22 287 }
IanBenzMaxim 12:7eb41621ba22 288 return *this;
IanBenzMaxim 12:7eb41621ba22 289 }
IanBenzMaxim 12:7eb41621ba22 290
IanBenzMaxim 12:7eb41621ba22 291 } // namespace MaximInterfaceDevices