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 #include <algorithm>
IanBenzMaxim 7:9cd16581b578 34 #include <MaximInterfaceCore/crc.hpp>
IanBenzMaxim 7:9cd16581b578 35 #include <MaximInterfaceCore/Error.hpp>
IanBenzMaxim 7:9cd16581b578 36 #include "DS28E15_22_25.hpp"
IanBenzMaxim 7:9cd16581b578 37
IanBenzMaxim 7:9cd16581b578 38 namespace MaximInterfaceDevices {
IanBenzMaxim 7:9cd16581b578 39
IanBenzMaxim 7:9cd16581b578 40 using namespace Core;
IanBenzMaxim 7:9cd16581b578 41 using std::copy;
IanBenzMaxim 7:9cd16581b578 42
IanBenzMaxim 7:9cd16581b578 43 static const int shaComputationDelayMs = 3;
IanBenzMaxim 7:9cd16581b578 44 static const int eepromWriteDelayMs = 10;
IanBenzMaxim 7:9cd16581b578 45 static inline int secretEepromWriteDelayMs(bool lowPower) {
IanBenzMaxim 7:9cd16581b578 46 return lowPower ? 200 : 100;
IanBenzMaxim 7:9cd16581b578 47 }
IanBenzMaxim 7:9cd16581b578 48
IanBenzMaxim 7:9cd16581b578 49 static const int ds28e22_25_pagesPerBlock = 2;
IanBenzMaxim 7:9cd16581b578 50
IanBenzMaxim 7:9cd16581b578 51 static error_code
IanBenzMaxim 7:9cd16581b578 52 writeDataWithCrc(OneWireMaster & master, span<const uint_least8_t> data,
IanBenzMaxim 7:9cd16581b578 53 OneWireMaster::Level level = OneWireMaster::NormalLevel,
IanBenzMaxim 7:9cd16581b578 54 uint_fast16_t crcStart = 0) {
IanBenzMaxim 7:9cd16581b578 55 error_code result = master.writeBlock(data);
IanBenzMaxim 7:9cd16581b578 56 if (result) {
IanBenzMaxim 7:9cd16581b578 57 return result;
IanBenzMaxim 7:9cd16581b578 58 }
IanBenzMaxim 7:9cd16581b578 59 uint_least8_t response[2];
IanBenzMaxim 7:9cd16581b578 60 result = master.readByte(response[0]);
IanBenzMaxim 7:9cd16581b578 61 if (result) {
IanBenzMaxim 7:9cd16581b578 62 return result;
IanBenzMaxim 7:9cd16581b578 63 }
IanBenzMaxim 7:9cd16581b578 64 result = master.readByteSetLevel(response[1], level);
IanBenzMaxim 7:9cd16581b578 65 if (result) {
IanBenzMaxim 7:9cd16581b578 66 return result;
IanBenzMaxim 7:9cd16581b578 67 }
IanBenzMaxim 7:9cd16581b578 68 if (calculateCrc16(calculateCrc16(crcStart, data), response) != 0xB001) {
IanBenzMaxim 7:9cd16581b578 69 result = make_error_code(DS28E15_22_25::CrcError);
IanBenzMaxim 7:9cd16581b578 70 }
IanBenzMaxim 7:9cd16581b578 71 return result;
IanBenzMaxim 7:9cd16581b578 72 }
IanBenzMaxim 7:9cd16581b578 73
IanBenzMaxim 7:9cd16581b578 74 const int DS28E15_22_25::segmentsPerPage;
IanBenzMaxim 7:9cd16581b578 75
IanBenzMaxim 7:9cd16581b578 76 DS28E15_22_25::AuthenticationData &
IanBenzMaxim 7:9cd16581b578 77 DS28E15_22_25::AuthenticationData::setAnonymousRomId() {
IanBenzMaxim 7:9cd16581b578 78 std::fill(romId().begin(), romId().end(), 0xFF);
IanBenzMaxim 7:9cd16581b578 79 return *this;
IanBenzMaxim 7:9cd16581b578 80 }
IanBenzMaxim 7:9cd16581b578 81
IanBenzMaxim 7:9cd16581b578 82 error_code
IanBenzMaxim 7:9cd16581b578 83 DS28E15_22_25::writeCommandWithCrc(Command command, uint_least8_t parameter,
IanBenzMaxim 7:9cd16581b578 84 OneWireMaster::Level level) const {
IanBenzMaxim 7:9cd16581b578 85 error_code result = selectRom(*master);
IanBenzMaxim 7:9cd16581b578 86 if (!result) {
IanBenzMaxim 7:9cd16581b578 87 const uint_least8_t data[] = {static_cast<uint_least8_t>(command),
IanBenzMaxim 7:9cd16581b578 88 parameter};
IanBenzMaxim 7:9cd16581b578 89 result = writeDataWithCrc(*master, data, level);
IanBenzMaxim 7:9cd16581b578 90 }
IanBenzMaxim 7:9cd16581b578 91 return result;
IanBenzMaxim 7:9cd16581b578 92 }
IanBenzMaxim 7:9cd16581b578 93
IanBenzMaxim 7:9cd16581b578 94 static error_code readDataWithCrc(OneWireMaster & master,
IanBenzMaxim 7:9cd16581b578 95 span<uint_least8_t> data) {
IanBenzMaxim 7:9cd16581b578 96 error_code result = master.readBlock(data);
IanBenzMaxim 7:9cd16581b578 97 if (result) {
IanBenzMaxim 7:9cd16581b578 98 return result;
IanBenzMaxim 7:9cd16581b578 99 }
IanBenzMaxim 7:9cd16581b578 100 uint_least8_t response[2];
IanBenzMaxim 7:9cd16581b578 101 result = master.readBlock(response);
IanBenzMaxim 7:9cd16581b578 102 if (result) {
IanBenzMaxim 7:9cd16581b578 103 return result;
IanBenzMaxim 7:9cd16581b578 104 }
IanBenzMaxim 7:9cd16581b578 105 if (calculateCrc16(calculateCrc16(data), response) != 0xB001) {
IanBenzMaxim 7:9cd16581b578 106 result = make_error_code(DS28E15_22_25::CrcError);
IanBenzMaxim 7:9cd16581b578 107 }
IanBenzMaxim 7:9cd16581b578 108 return result;
IanBenzMaxim 7:9cd16581b578 109 }
IanBenzMaxim 7:9cd16581b578 110
IanBenzMaxim 7:9cd16581b578 111 static error_code readCsByte(OneWireMaster & master) {
IanBenzMaxim 7:9cd16581b578 112 uint_least8_t response;
IanBenzMaxim 7:9cd16581b578 113 error_code result = master.readByte(response);
IanBenzMaxim 7:9cd16581b578 114 if (result) {
IanBenzMaxim 7:9cd16581b578 115 return result;
IanBenzMaxim 7:9cd16581b578 116 }
IanBenzMaxim 7:9cd16581b578 117 if (response != 0xAA) {
IanBenzMaxim 7:9cd16581b578 118 result = make_error_code(DS28E15_22_25::OperationFailure);
IanBenzMaxim 7:9cd16581b578 119 }
IanBenzMaxim 7:9cd16581b578 120 return result;
IanBenzMaxim 7:9cd16581b578 121 }
IanBenzMaxim 7:9cd16581b578 122
IanBenzMaxim 7:9cd16581b578 123 static error_code releaseSequence(OneWireMaster & master, Sleep & sleep,
IanBenzMaxim 7:9cd16581b578 124 int delayTimeMs) {
IanBenzMaxim 7:9cd16581b578 125 error_code result = master.writeBytePower(0xAA);
IanBenzMaxim 7:9cd16581b578 126 if (result) {
IanBenzMaxim 7:9cd16581b578 127 return result;
IanBenzMaxim 7:9cd16581b578 128 }
IanBenzMaxim 7:9cd16581b578 129 sleep(delayTimeMs);
IanBenzMaxim 7:9cd16581b578 130 result = master.setLevel(OneWireMaster::NormalLevel);
IanBenzMaxim 7:9cd16581b578 131 if (result) {
IanBenzMaxim 7:9cd16581b578 132 return result;
IanBenzMaxim 7:9cd16581b578 133 }
IanBenzMaxim 7:9cd16581b578 134 return readCsByte(master);
IanBenzMaxim 7:9cd16581b578 135 }
IanBenzMaxim 7:9cd16581b578 136
IanBenzMaxim 7:9cd16581b578 137 DS28E15_22_25::BlockProtection &
IanBenzMaxim 7:9cd16581b578 138 DS28E15_22_25::BlockProtection::setBlockNum(int blockNum) {
IanBenzMaxim 7:9cd16581b578 139 status &= ~blockNumMask;
IanBenzMaxim 7:9cd16581b578 140 status |= (blockNum & blockNumMask);
IanBenzMaxim 7:9cd16581b578 141 return *this;
IanBenzMaxim 7:9cd16581b578 142 }
IanBenzMaxim 7:9cd16581b578 143
IanBenzMaxim 7:9cd16581b578 144 bool DS28E15_22_25::BlockProtection::noProtection() const {
IanBenzMaxim 7:9cd16581b578 145 return !readProtection() && !writeProtection() && !eepromEmulation() &&
IanBenzMaxim 7:9cd16581b578 146 !authProtection();
IanBenzMaxim 7:9cd16581b578 147 }
IanBenzMaxim 7:9cd16581b578 148
IanBenzMaxim 7:9cd16581b578 149 DS28E15_22_25::BlockProtection &
IanBenzMaxim 7:9cd16581b578 150 DS28E15_22_25::BlockProtection::setReadProtection(bool readProtection) {
IanBenzMaxim 7:9cd16581b578 151 if (readProtection) {
IanBenzMaxim 7:9cd16581b578 152 status |= readProtectionMask;
IanBenzMaxim 7:9cd16581b578 153 } else {
IanBenzMaxim 7:9cd16581b578 154 status &= ~readProtectionMask;
IanBenzMaxim 7:9cd16581b578 155 }
IanBenzMaxim 7:9cd16581b578 156 return *this;
IanBenzMaxim 7:9cd16581b578 157 }
IanBenzMaxim 7:9cd16581b578 158
IanBenzMaxim 7:9cd16581b578 159 DS28E15_22_25::BlockProtection &
IanBenzMaxim 7:9cd16581b578 160 DS28E15_22_25::BlockProtection::setWriteProtection(bool writeProtection) {
IanBenzMaxim 7:9cd16581b578 161 if (writeProtection) {
IanBenzMaxim 7:9cd16581b578 162 status |= writeProtectionMask;
IanBenzMaxim 7:9cd16581b578 163 } else {
IanBenzMaxim 7:9cd16581b578 164 status &= ~writeProtectionMask;
IanBenzMaxim 7:9cd16581b578 165 }
IanBenzMaxim 7:9cd16581b578 166 return *this;
IanBenzMaxim 7:9cd16581b578 167 }
IanBenzMaxim 7:9cd16581b578 168
IanBenzMaxim 7:9cd16581b578 169 DS28E15_22_25::BlockProtection &
IanBenzMaxim 7:9cd16581b578 170 DS28E15_22_25::BlockProtection::setEepromEmulation(bool eepromEmulation) {
IanBenzMaxim 7:9cd16581b578 171 if (eepromEmulation) {
IanBenzMaxim 7:9cd16581b578 172 status |= eepromEmulationMask;
IanBenzMaxim 7:9cd16581b578 173 } else {
IanBenzMaxim 7:9cd16581b578 174 status &= ~eepromEmulationMask;
IanBenzMaxim 7:9cd16581b578 175 }
IanBenzMaxim 7:9cd16581b578 176 return *this;
IanBenzMaxim 7:9cd16581b578 177 }
IanBenzMaxim 7:9cd16581b578 178
IanBenzMaxim 7:9cd16581b578 179 DS28E15_22_25::BlockProtection &
IanBenzMaxim 7:9cd16581b578 180 DS28E15_22_25::BlockProtection::setAuthProtection(bool authProtection) {
IanBenzMaxim 7:9cd16581b578 181 if (authProtection) {
IanBenzMaxim 7:9cd16581b578 182 status |= authProtectionMask;
IanBenzMaxim 7:9cd16581b578 183 } else {
IanBenzMaxim 7:9cd16581b578 184 status &= ~authProtectionMask;
IanBenzMaxim 7:9cd16581b578 185 }
IanBenzMaxim 7:9cd16581b578 186 return *this;
IanBenzMaxim 7:9cd16581b578 187 }
IanBenzMaxim 7:9cd16581b578 188
IanBenzMaxim 7:9cd16581b578 189 DS28E15_22_25::ProtectionWriteMacData::ProtectionWriteMacData()
IanBenzMaxim 7:9cd16581b578 190 : result_(), oldProtection_(), newProtection_() {
IanBenzMaxim 7:9cd16581b578 191 setOldProtection(oldProtection_);
IanBenzMaxim 7:9cd16581b578 192 setNewProtection(newProtection_);
IanBenzMaxim 7:9cd16581b578 193 }
IanBenzMaxim 7:9cd16581b578 194
IanBenzMaxim 7:9cd16581b578 195 DS28E15_22_25::ProtectionWriteMacData &
IanBenzMaxim 7:9cd16581b578 196 DS28E15_22_25::ProtectionWriteMacData::setOldProtection(
IanBenzMaxim 7:9cd16581b578 197 BlockProtection oldProtection) {
IanBenzMaxim 7:9cd16581b578 198 result_[oldProtectionIdx] = oldProtection.authProtection() ? 1 : 0;
IanBenzMaxim 7:9cd16581b578 199 result_[oldProtectionIdx + 1] = oldProtection.eepromEmulation() ? 1 : 0;
IanBenzMaxim 7:9cd16581b578 200 result_[oldProtectionIdx + 2] = oldProtection.writeProtection() ? 1 : 0;
IanBenzMaxim 7:9cd16581b578 201 result_[oldProtectionIdx + 3] = oldProtection.readProtection() ? 1 : 0;
IanBenzMaxim 7:9cd16581b578 202 oldProtection_ = oldProtection;
IanBenzMaxim 7:9cd16581b578 203 return *this;
IanBenzMaxim 7:9cd16581b578 204 }
IanBenzMaxim 7:9cd16581b578 205
IanBenzMaxim 7:9cd16581b578 206 DS28E15_22_25::ProtectionWriteMacData &
IanBenzMaxim 7:9cd16581b578 207 DS28E15_22_25::ProtectionWriteMacData::setNewProtection(
IanBenzMaxim 7:9cd16581b578 208 BlockProtection newProtection) {
IanBenzMaxim 7:9cd16581b578 209 result_[blockNumIdx] = newProtection.blockNum();
IanBenzMaxim 7:9cd16581b578 210 result_[newProtectionIdx] = newProtection.authProtection() ? 1 : 0;
IanBenzMaxim 7:9cd16581b578 211 result_[newProtectionIdx + 1] = newProtection.eepromEmulation() ? 1 : 0;
IanBenzMaxim 7:9cd16581b578 212 result_[newProtectionIdx + 2] = newProtection.writeProtection() ? 1 : 0;
IanBenzMaxim 7:9cd16581b578 213 result_[newProtectionIdx + 3] = newProtection.readProtection() ? 1 : 0;
IanBenzMaxim 7:9cd16581b578 214 newProtection_ = newProtection;
IanBenzMaxim 7:9cd16581b578 215 return *this;
IanBenzMaxim 7:9cd16581b578 216 }
IanBenzMaxim 7:9cd16581b578 217
IanBenzMaxim 7:9cd16581b578 218 error_code
IanBenzMaxim 7:9cd16581b578 219 DS28E15_22_25::writeAuthBlockProtection(BlockProtection newProtection,
IanBenzMaxim 7:9cd16581b578 220 Page::const_span mac) {
IanBenzMaxim 7:9cd16581b578 221 error_code result =
IanBenzMaxim 7:9cd16581b578 222 writeCommandWithCrc(AuthWriteBlockProtection, newProtection.statusByte(),
IanBenzMaxim 7:9cd16581b578 223 OneWireMaster::StrongLevel);
IanBenzMaxim 7:9cd16581b578 224 if (result) {
IanBenzMaxim 7:9cd16581b578 225 return result;
IanBenzMaxim 7:9cd16581b578 226 }
IanBenzMaxim 7:9cd16581b578 227
IanBenzMaxim 7:9cd16581b578 228 sleep->invoke(shaComputationDelayMs);
IanBenzMaxim 7:9cd16581b578 229 result = master->setLevel(OneWireMaster::NormalLevel);
IanBenzMaxim 7:9cd16581b578 230 if (result) {
IanBenzMaxim 7:9cd16581b578 231 return result;
IanBenzMaxim 7:9cd16581b578 232 }
IanBenzMaxim 7:9cd16581b578 233
IanBenzMaxim 7:9cd16581b578 234 result = writeDataWithCrc(*master, mac);
IanBenzMaxim 7:9cd16581b578 235 if (result) {
IanBenzMaxim 7:9cd16581b578 236 return result;
IanBenzMaxim 7:9cd16581b578 237 }
IanBenzMaxim 7:9cd16581b578 238
IanBenzMaxim 7:9cd16581b578 239 result = readCsByte(*master);
IanBenzMaxim 7:9cd16581b578 240 if (result) {
IanBenzMaxim 7:9cd16581b578 241 return result;
IanBenzMaxim 7:9cd16581b578 242 }
IanBenzMaxim 7:9cd16581b578 243
IanBenzMaxim 7:9cd16581b578 244 result = releaseSequence(*master, *sleep, eepromWriteDelayMs);
IanBenzMaxim 7:9cd16581b578 245 return result;
IanBenzMaxim 7:9cd16581b578 246 }
IanBenzMaxim 7:9cd16581b578 247
IanBenzMaxim 7:9cd16581b578 248 error_code DS28E15_22_25::writeBlockProtection(BlockProtection protection) {
IanBenzMaxim 7:9cd16581b578 249 error_code result =
IanBenzMaxim 7:9cd16581b578 250 writeCommandWithCrc(WriteBlockProtection, protection.statusByte());
IanBenzMaxim 7:9cd16581b578 251 if (result) {
IanBenzMaxim 7:9cd16581b578 252 return result;
IanBenzMaxim 7:9cd16581b578 253 }
IanBenzMaxim 7:9cd16581b578 254
IanBenzMaxim 7:9cd16581b578 255 result = releaseSequence(*master, *sleep, eepromWriteDelayMs);
IanBenzMaxim 7:9cd16581b578 256 return result;
IanBenzMaxim 7:9cd16581b578 257 }
IanBenzMaxim 7:9cd16581b578 258
IanBenzMaxim 7:9cd16581b578 259 error_code DS28E15_22_25::doReadBlockProtection(int blockNum,
IanBenzMaxim 7:9cd16581b578 260 BlockProtection & protection,
IanBenzMaxim 7:9cd16581b578 261 Variant variant) const {
IanBenzMaxim 7:9cd16581b578 262 uint_least8_t buffer = blockNum;
IanBenzMaxim 7:9cd16581b578 263 if (variant == DS28E22 || variant == DS28E25) {
IanBenzMaxim 7:9cd16581b578 264 buffer *= ds28e22_25_pagesPerBlock;
IanBenzMaxim 7:9cd16581b578 265 }
IanBenzMaxim 7:9cd16581b578 266 error_code result = writeCommandWithCrc(ReadStatus, buffer);
IanBenzMaxim 7:9cd16581b578 267 if (!result) {
IanBenzMaxim 7:9cd16581b578 268 result = master->readByte(buffer);
IanBenzMaxim 7:9cd16581b578 269 if (!result) {
IanBenzMaxim 7:9cd16581b578 270 protection.setStatusByte(buffer);
IanBenzMaxim 7:9cd16581b578 271 }
IanBenzMaxim 7:9cd16581b578 272 }
IanBenzMaxim 7:9cd16581b578 273 return result;
IanBenzMaxim 7:9cd16581b578 274 }
IanBenzMaxim 7:9cd16581b578 275
IanBenzMaxim 7:9cd16581b578 276 error_code DS28E15_22_25::computeReadPageMac(int page_num, bool anon,
IanBenzMaxim 7:9cd16581b578 277 Page::span mac) const {
IanBenzMaxim 7:9cd16581b578 278 error_code result =
IanBenzMaxim 7:9cd16581b578 279 writeCommandWithCrc(ComputePageMac, (anon ? 0xE0 : 0x00) | page_num,
IanBenzMaxim 7:9cd16581b578 280 OneWireMaster::StrongLevel);
IanBenzMaxim 7:9cd16581b578 281 if (result) {
IanBenzMaxim 7:9cd16581b578 282 return result;
IanBenzMaxim 7:9cd16581b578 283 }
IanBenzMaxim 7:9cd16581b578 284
IanBenzMaxim 7:9cd16581b578 285 sleep->invoke(shaComputationDelayMs * 2);
IanBenzMaxim 7:9cd16581b578 286 result = master->setLevel(OneWireMaster::NormalLevel);
IanBenzMaxim 7:9cd16581b578 287 if (result) {
IanBenzMaxim 7:9cd16581b578 288 return result;
IanBenzMaxim 7:9cd16581b578 289 }
IanBenzMaxim 7:9cd16581b578 290
IanBenzMaxim 7:9cd16581b578 291 result = readCsByte(*master);
IanBenzMaxim 7:9cd16581b578 292 if (result) {
IanBenzMaxim 7:9cd16581b578 293 return result;
IanBenzMaxim 7:9cd16581b578 294 }
IanBenzMaxim 7:9cd16581b578 295
IanBenzMaxim 7:9cd16581b578 296 result = readDataWithCrc(*master, mac);
IanBenzMaxim 7:9cd16581b578 297 return result;
IanBenzMaxim 7:9cd16581b578 298 }
IanBenzMaxim 7:9cd16581b578 299
IanBenzMaxim 7:9cd16581b578 300 error_code DS28E15_22_25::doComputeSecret(int page_num, bool lock,
IanBenzMaxim 7:9cd16581b578 301 bool lowPower) {
IanBenzMaxim 7:9cd16581b578 302 error_code result = writeCommandWithCrc(ComputeAndLockSecret,
IanBenzMaxim 7:9cd16581b578 303 lock ? (0xE0 | page_num) : page_num);
IanBenzMaxim 7:9cd16581b578 304 if (result) {
IanBenzMaxim 7:9cd16581b578 305 return result;
IanBenzMaxim 7:9cd16581b578 306 }
IanBenzMaxim 7:9cd16581b578 307
IanBenzMaxim 7:9cd16581b578 308 result = releaseSequence(*master, *sleep,
IanBenzMaxim 7:9cd16581b578 309 shaComputationDelayMs * 2 +
IanBenzMaxim 7:9cd16581b578 310 secretEepromWriteDelayMs(lowPower));
IanBenzMaxim 7:9cd16581b578 311 return result;
IanBenzMaxim 7:9cd16581b578 312 }
IanBenzMaxim 7:9cd16581b578 313
IanBenzMaxim 7:9cd16581b578 314 error_code DS28E15_22_25::doWriteScratchpad(Page::const_span data,
IanBenzMaxim 7:9cd16581b578 315 Variant variant) {
IanBenzMaxim 7:9cd16581b578 316 const uint_least8_t parameter =
IanBenzMaxim 7:9cd16581b578 317 (variant == DS28E22 || variant == DS28E25) ? 0x20 : 0x00;
IanBenzMaxim 7:9cd16581b578 318 error_code result = writeCommandWithCrc(ReadWriteScratchpad, parameter);
IanBenzMaxim 7:9cd16581b578 319 if (result) {
IanBenzMaxim 7:9cd16581b578 320 return result;
IanBenzMaxim 7:9cd16581b578 321 }
IanBenzMaxim 7:9cd16581b578 322
IanBenzMaxim 7:9cd16581b578 323 result = writeDataWithCrc(*master, data);
IanBenzMaxim 7:9cd16581b578 324 return result;
IanBenzMaxim 7:9cd16581b578 325 }
IanBenzMaxim 7:9cd16581b578 326
IanBenzMaxim 7:9cd16581b578 327 error_code DS28E15_22_25::doReadScratchpad(Page::span data,
IanBenzMaxim 7:9cd16581b578 328 Variant variant) const {
IanBenzMaxim 7:9cd16581b578 329 const uint_least8_t parameter =
IanBenzMaxim 7:9cd16581b578 330 (variant == DS28E22 || variant == DS28E25) ? 0x2F : 0x0F;
IanBenzMaxim 7:9cd16581b578 331 error_code result = writeCommandWithCrc(ReadWriteScratchpad, parameter);
IanBenzMaxim 7:9cd16581b578 332 if (result) {
IanBenzMaxim 7:9cd16581b578 333 return result;
IanBenzMaxim 7:9cd16581b578 334 }
IanBenzMaxim 7:9cd16581b578 335
IanBenzMaxim 7:9cd16581b578 336 result = readDataWithCrc(*master, data);
IanBenzMaxim 7:9cd16581b578 337 return result;
IanBenzMaxim 7:9cd16581b578 338 }
IanBenzMaxim 7:9cd16581b578 339
IanBenzMaxim 7:9cd16581b578 340 error_code DS28E15_22_25::doLoadSecret(bool lock, bool lowPower) {
IanBenzMaxim 7:9cd16581b578 341 error_code result =
IanBenzMaxim 7:9cd16581b578 342 writeCommandWithCrc(LoadAndLockSecret, lock ? 0xE0 : 0x00);
IanBenzMaxim 7:9cd16581b578 343 if (result) {
IanBenzMaxim 7:9cd16581b578 344 return result;
IanBenzMaxim 7:9cd16581b578 345 }
IanBenzMaxim 7:9cd16581b578 346
IanBenzMaxim 7:9cd16581b578 347 result = releaseSequence(*master, *sleep, secretEepromWriteDelayMs(lowPower));
IanBenzMaxim 7:9cd16581b578 348 return result;
IanBenzMaxim 7:9cd16581b578 349 }
IanBenzMaxim 7:9cd16581b578 350
IanBenzMaxim 7:9cd16581b578 351 error_code DS28E15_22_25::readPage(int page, Page::span rdbuf) const {
IanBenzMaxim 7:9cd16581b578 352 error_code result = writeCommandWithCrc(ReadMemory, page);
IanBenzMaxim 7:9cd16581b578 353 if (result) {
IanBenzMaxim 7:9cd16581b578 354 return result;
IanBenzMaxim 7:9cd16581b578 355 }
IanBenzMaxim 7:9cd16581b578 356
IanBenzMaxim 7:9cd16581b578 357 result = continueReadPage(rdbuf);
IanBenzMaxim 7:9cd16581b578 358 return result;
IanBenzMaxim 7:9cd16581b578 359 }
IanBenzMaxim 7:9cd16581b578 360
IanBenzMaxim 7:9cd16581b578 361 error_code DS28E15_22_25::continueReadPage(Page::span rdbuf) const {
IanBenzMaxim 7:9cd16581b578 362 return readDataWithCrc(*master, rdbuf);
IanBenzMaxim 7:9cd16581b578 363 }
IanBenzMaxim 7:9cd16581b578 364
IanBenzMaxim 7:9cd16581b578 365 error_code DS28E15_22_25::doWriteAuthSegment(Segment::const_span newData,
IanBenzMaxim 7:9cd16581b578 366 Page::const_span mac,
IanBenzMaxim 7:9cd16581b578 367 Variant variant, bool continuing) {
IanBenzMaxim 7:9cd16581b578 368 // CRC gets calculated with CS byte when continuing on DS28E22 and DS28E25.
IanBenzMaxim 7:9cd16581b578 369 const uint_fast16_t crcStart =
IanBenzMaxim 7:9cd16581b578 370 ((variant == DS28E22 || variant == DS28E25) && continuing)
IanBenzMaxim 7:9cd16581b578 371 ? calculateCrc16(0xAA)
IanBenzMaxim 7:9cd16581b578 372 : 0;
IanBenzMaxim 7:9cd16581b578 373 error_code result =
IanBenzMaxim 7:9cd16581b578 374 writeDataWithCrc(*master, newData, OneWireMaster::StrongLevel, crcStart);
IanBenzMaxim 7:9cd16581b578 375 if (result) {
IanBenzMaxim 7:9cd16581b578 376 return result;
IanBenzMaxim 7:9cd16581b578 377 }
IanBenzMaxim 7:9cd16581b578 378
IanBenzMaxim 7:9cd16581b578 379 sleep->invoke(shaComputationDelayMs);
IanBenzMaxim 7:9cd16581b578 380 result = master->setLevel(OneWireMaster::NormalLevel);
IanBenzMaxim 7:9cd16581b578 381 if (result) {
IanBenzMaxim 7:9cd16581b578 382 return result;
IanBenzMaxim 7:9cd16581b578 383 }
IanBenzMaxim 7:9cd16581b578 384
IanBenzMaxim 7:9cd16581b578 385 result = writeDataWithCrc(*master, mac);
IanBenzMaxim 7:9cd16581b578 386 if (result) {
IanBenzMaxim 7:9cd16581b578 387 return result;
IanBenzMaxim 7:9cd16581b578 388 }
IanBenzMaxim 7:9cd16581b578 389
IanBenzMaxim 7:9cd16581b578 390 result = readCsByte(*master);
IanBenzMaxim 7:9cd16581b578 391 if (result) {
IanBenzMaxim 7:9cd16581b578 392 return result;
IanBenzMaxim 7:9cd16581b578 393 }
IanBenzMaxim 7:9cd16581b578 394
IanBenzMaxim 7:9cd16581b578 395 result = releaseSequence(*master, *sleep, eepromWriteDelayMs);
IanBenzMaxim 7:9cd16581b578 396 return result;
IanBenzMaxim 7:9cd16581b578 397 }
IanBenzMaxim 7:9cd16581b578 398
IanBenzMaxim 7:9cd16581b578 399 error_code DS28E15_22_25::doWriteAuthSegment(int pageNum, int segmentNum,
IanBenzMaxim 7:9cd16581b578 400 Segment::const_span newData,
IanBenzMaxim 7:9cd16581b578 401 Page::const_span mac,
IanBenzMaxim 7:9cd16581b578 402 Variant variant) {
IanBenzMaxim 7:9cd16581b578 403 error_code result =
IanBenzMaxim 7:9cd16581b578 404 writeCommandWithCrc(AuthWriteMemory, (segmentNum << 5) | pageNum);
IanBenzMaxim 7:9cd16581b578 405 if (result) {
IanBenzMaxim 7:9cd16581b578 406 return result;
IanBenzMaxim 7:9cd16581b578 407 }
IanBenzMaxim 7:9cd16581b578 408
IanBenzMaxim 7:9cd16581b578 409 result = doWriteAuthSegment(newData, mac, variant, false);
IanBenzMaxim 7:9cd16581b578 410 return result;
IanBenzMaxim 7:9cd16581b578 411 }
IanBenzMaxim 7:9cd16581b578 412
IanBenzMaxim 7:9cd16581b578 413 error_code DS28E15_22_25::doContinueWriteAuthSegment(
IanBenzMaxim 7:9cd16581b578 414 Segment::const_span newData, Page::const_span mac, Variant variant) {
IanBenzMaxim 7:9cd16581b578 415 return doWriteAuthSegment(newData, mac, variant, true);
IanBenzMaxim 7:9cd16581b578 416 }
IanBenzMaxim 7:9cd16581b578 417
IanBenzMaxim 7:9cd16581b578 418 error_code DS28E15_22_25::readSegment(int page, int segment,
IanBenzMaxim 7:9cd16581b578 419 Segment::span data) const {
IanBenzMaxim 7:9cd16581b578 420 error_code result = writeCommandWithCrc(ReadMemory, (segment << 5) | page);
IanBenzMaxim 7:9cd16581b578 421 if (result) {
IanBenzMaxim 7:9cd16581b578 422 return result;
IanBenzMaxim 7:9cd16581b578 423 }
IanBenzMaxim 7:9cd16581b578 424
IanBenzMaxim 7:9cd16581b578 425 result = continueReadSegment(data);
IanBenzMaxim 7:9cd16581b578 426 return result;
IanBenzMaxim 7:9cd16581b578 427 }
IanBenzMaxim 7:9cd16581b578 428
IanBenzMaxim 7:9cd16581b578 429 error_code DS28E15_22_25::continueReadSegment(Segment::span data) const {
IanBenzMaxim 7:9cd16581b578 430 return master->readBlock(data);
IanBenzMaxim 7:9cd16581b578 431 }
IanBenzMaxim 7:9cd16581b578 432
IanBenzMaxim 7:9cd16581b578 433 error_code DS28E15_22_25::writeSegment(int page, int block,
IanBenzMaxim 7:9cd16581b578 434 Segment::const_span data) {
IanBenzMaxim 7:9cd16581b578 435 error_code result = writeCommandWithCrc(WriteMemory, (block << 5) | page);
IanBenzMaxim 7:9cd16581b578 436 if (result) {
IanBenzMaxim 7:9cd16581b578 437 return result;
IanBenzMaxim 7:9cd16581b578 438 }
IanBenzMaxim 7:9cd16581b578 439
IanBenzMaxim 7:9cd16581b578 440 result = continueWriteSegment(data);
IanBenzMaxim 7:9cd16581b578 441 return result;
IanBenzMaxim 7:9cd16581b578 442 }
IanBenzMaxim 7:9cd16581b578 443
IanBenzMaxim 7:9cd16581b578 444 error_code DS28E15_22_25::continueWriteSegment(Segment::const_span data) {
IanBenzMaxim 7:9cd16581b578 445 error_code result = writeDataWithCrc(*master, data);
IanBenzMaxim 7:9cd16581b578 446 if (result) {
IanBenzMaxim 7:9cd16581b578 447 return result;
IanBenzMaxim 7:9cd16581b578 448 }
IanBenzMaxim 7:9cd16581b578 449
IanBenzMaxim 7:9cd16581b578 450 result = releaseSequence(*master, *sleep, eepromWriteDelayMs);
IanBenzMaxim 7:9cd16581b578 451 return result;
IanBenzMaxim 7:9cd16581b578 452 }
IanBenzMaxim 7:9cd16581b578 453
IanBenzMaxim 7:9cd16581b578 454 error_code
IanBenzMaxim 7:9cd16581b578 455 DS28E15_22_25::doReadAllBlockProtection(span<BlockProtection> protection,
IanBenzMaxim 7:9cd16581b578 456 Variant variant) const {
IanBenzMaxim 7:9cd16581b578 457 error_code result = writeCommandWithCrc(ReadStatus, 0);
IanBenzMaxim 7:9cd16581b578 458 if (!result) {
IanBenzMaxim 7:9cd16581b578 459 if (variant == DS28E22 || variant == DS28E25) {
IanBenzMaxim 7:9cd16581b578 460 // Need to read extra data on DS28E22 to get CRC16.
IanBenzMaxim 7:9cd16581b578 461 uint_least8_t buf[DS28E25::memoryPages];
IanBenzMaxim 7:9cd16581b578 462 result = readDataWithCrc(*master, buf);
IanBenzMaxim 7:9cd16581b578 463 if (!result) {
IanBenzMaxim 7:9cd16581b578 464 const int blocks = ((variant == DS28E22) ? DS28E22::memoryPages
IanBenzMaxim 7:9cd16581b578 465 : DS28E25::memoryPages) /
IanBenzMaxim 7:9cd16581b578 466 ds28e22_25_pagesPerBlock;
IanBenzMaxim 7:9cd16581b578 467 for (span<BlockProtection>::index_type i = 0;
IanBenzMaxim 7:9cd16581b578 468 i < std::min<span<BlockProtection>::index_type>(protection.size(),
IanBenzMaxim 7:9cd16581b578 469 blocks);
IanBenzMaxim 7:9cd16581b578 470 ++i) {
IanBenzMaxim 7:9cd16581b578 471 protection[i].setStatusByte(
IanBenzMaxim 7:9cd16581b578 472 (buf[i * ds28e22_25_pagesPerBlock] & 0xF0) | // Upper nibble
IanBenzMaxim 7:9cd16581b578 473 ((buf[i * ds28e22_25_pagesPerBlock] & 0x0F) /
IanBenzMaxim 7:9cd16581b578 474 ds28e22_25_pagesPerBlock)); // Lower nibble
IanBenzMaxim 7:9cd16581b578 475 }
IanBenzMaxim 7:9cd16581b578 476 }
IanBenzMaxim 7:9cd16581b578 477 } else { // DS28E15
IanBenzMaxim 7:9cd16581b578 478 uint_least8_t buf[DS28E15::protectionBlocks];
IanBenzMaxim 7:9cd16581b578 479 result = readDataWithCrc(*master, buf);
IanBenzMaxim 7:9cd16581b578 480 if (!result) {
IanBenzMaxim 7:9cd16581b578 481 for (span<BlockProtection>::index_type i = 0;
IanBenzMaxim 7:9cd16581b578 482 i < std::min<span<BlockProtection>::index_type>(
IanBenzMaxim 7:9cd16581b578 483 protection.size(), DS28E15::protectionBlocks);
IanBenzMaxim 7:9cd16581b578 484 ++i) {
IanBenzMaxim 7:9cd16581b578 485 protection[i].setStatusByte(buf[i]);
IanBenzMaxim 7:9cd16581b578 486 }
IanBenzMaxim 7:9cd16581b578 487 }
IanBenzMaxim 7:9cd16581b578 488 }
IanBenzMaxim 7:9cd16581b578 489 }
IanBenzMaxim 7:9cd16581b578 490 return result;
IanBenzMaxim 7:9cd16581b578 491 }
IanBenzMaxim 7:9cd16581b578 492
IanBenzMaxim 7:9cd16581b578 493 const error_category & DS28E15_22_25::errorCategory() {
IanBenzMaxim 7:9cd16581b578 494 static class : public error_category {
IanBenzMaxim 7:9cd16581b578 495 public:
IanBenzMaxim 7:9cd16581b578 496 virtual const char * name() const { return "DS28E15_22_25"; }
IanBenzMaxim 7:9cd16581b578 497
IanBenzMaxim 7:9cd16581b578 498 virtual std::string message(int condition) const {
IanBenzMaxim 7:9cd16581b578 499 switch (condition) {
IanBenzMaxim 7:9cd16581b578 500 case CrcError:
IanBenzMaxim 7:9cd16581b578 501 return "CRC Error";
IanBenzMaxim 7:9cd16581b578 502
IanBenzMaxim 7:9cd16581b578 503 case OperationFailure:
IanBenzMaxim 7:9cd16581b578 504 return "Operation Failure";
IanBenzMaxim 7:9cd16581b578 505
IanBenzMaxim 7:9cd16581b578 506 default:
IanBenzMaxim 7:9cd16581b578 507 return defaultErrorMessage(condition);
IanBenzMaxim 7:9cd16581b578 508 }
IanBenzMaxim 7:9cd16581b578 509 }
IanBenzMaxim 7:9cd16581b578 510 } instance;
IanBenzMaxim 7:9cd16581b578 511 return instance;
IanBenzMaxim 7:9cd16581b578 512 }
IanBenzMaxim 7:9cd16581b578 513
IanBenzMaxim 7:9cd16581b578 514 error_code DS28E15_22_25::loadSecret(bool lock) {
IanBenzMaxim 7:9cd16581b578 515 // Use worst-case low power timing if the device type is not known.
IanBenzMaxim 7:9cd16581b578 516 return doLoadSecret(lock, true);
IanBenzMaxim 7:9cd16581b578 517 }
IanBenzMaxim 7:9cd16581b578 518
IanBenzMaxim 7:9cd16581b578 519 error_code DS28E15_22_25::computeSecret(int pageNum, bool lock) {
IanBenzMaxim 7:9cd16581b578 520 // Use worst-case low power timing if the device type is not known.
IanBenzMaxim 7:9cd16581b578 521 return doComputeSecret(pageNum, lock, true);
IanBenzMaxim 7:9cd16581b578 522 }
IanBenzMaxim 7:9cd16581b578 523
IanBenzMaxim 7:9cd16581b578 524 error_code DS28E15_22_25::readPersonality(Personality & personality) const {
IanBenzMaxim 7:9cd16581b578 525 error_code result = writeCommandWithCrc(ReadStatus, 0xE0);
IanBenzMaxim 7:9cd16581b578 526 if (!result) {
IanBenzMaxim 7:9cd16581b578 527 uint_least8_t data[4];
IanBenzMaxim 7:9cd16581b578 528 result = readDataWithCrc(*master, data);
IanBenzMaxim 7:9cd16581b578 529 if (!result) {
IanBenzMaxim 7:9cd16581b578 530 personality.PB1 = data[0];
IanBenzMaxim 7:9cd16581b578 531 personality.PB2 = data[1];
IanBenzMaxim 7:9cd16581b578 532 personality.manId[0] = data[2];
IanBenzMaxim 7:9cd16581b578 533 personality.manId[1] = data[3];
IanBenzMaxim 7:9cd16581b578 534 }
IanBenzMaxim 7:9cd16581b578 535 }
IanBenzMaxim 7:9cd16581b578 536 return result;
IanBenzMaxim 7:9cd16581b578 537 }
IanBenzMaxim 7:9cd16581b578 538
IanBenzMaxim 7:9cd16581b578 539 const int DS28EL15::memoryPages;
IanBenzMaxim 7:9cd16581b578 540 const int DS28EL15::protectionBlocks;
IanBenzMaxim 7:9cd16581b578 541
IanBenzMaxim 7:9cd16581b578 542 error_code DS28EL15::writeScratchpad(Page::const_span data) {
IanBenzMaxim 7:9cd16581b578 543 return doWriteScratchpad(data, DS28E15);
IanBenzMaxim 7:9cd16581b578 544 }
IanBenzMaxim 7:9cd16581b578 545
IanBenzMaxim 7:9cd16581b578 546 error_code DS28EL15::readScratchpad(Page::span data) const {
IanBenzMaxim 7:9cd16581b578 547 return doReadScratchpad(data, DS28E15);
IanBenzMaxim 7:9cd16581b578 548 }
IanBenzMaxim 7:9cd16581b578 549
IanBenzMaxim 7:9cd16581b578 550 error_code DS28EL15::readBlockProtection(int blockNum,
IanBenzMaxim 7:9cd16581b578 551 BlockProtection & protection) const {
IanBenzMaxim 7:9cd16581b578 552 return doReadBlockProtection(blockNum, protection, DS28E15);
IanBenzMaxim 7:9cd16581b578 553 }
IanBenzMaxim 7:9cd16581b578 554
IanBenzMaxim 7:9cd16581b578 555 error_code DS28EL15::writeAuthSegment(int pageNum, int segmentNum,
IanBenzMaxim 7:9cd16581b578 556 Segment::const_span newData,
IanBenzMaxim 7:9cd16581b578 557 Page::const_span mac) {
IanBenzMaxim 7:9cd16581b578 558 return doWriteAuthSegment(pageNum, segmentNum, newData, mac, DS28E15);
IanBenzMaxim 7:9cd16581b578 559 }
IanBenzMaxim 7:9cd16581b578 560
IanBenzMaxim 7:9cd16581b578 561 error_code DS28EL15::continueWriteAuthSegment(Segment::const_span newData,
IanBenzMaxim 7:9cd16581b578 562 Page::const_span mac) {
IanBenzMaxim 7:9cd16581b578 563 return doContinueWriteAuthSegment(newData, mac, DS28E15);
IanBenzMaxim 7:9cd16581b578 564 }
IanBenzMaxim 7:9cd16581b578 565
IanBenzMaxim 7:9cd16581b578 566 error_code DS28EL15::readAllBlockProtection(
IanBenzMaxim 7:9cd16581b578 567 span<BlockProtection, protectionBlocks> protection) const {
IanBenzMaxim 7:9cd16581b578 568 return doReadAllBlockProtection(protection, DS28E15);
IanBenzMaxim 7:9cd16581b578 569 }
IanBenzMaxim 7:9cd16581b578 570
IanBenzMaxim 7:9cd16581b578 571 error_code DS28E15::loadSecret(bool lock) { return doLoadSecret(lock, false); }
IanBenzMaxim 7:9cd16581b578 572
IanBenzMaxim 7:9cd16581b578 573 error_code DS28E15::computeSecret(int pageNum, bool lock) {
IanBenzMaxim 7:9cd16581b578 574 return doComputeSecret(pageNum, lock, false);
IanBenzMaxim 7:9cd16581b578 575 }
IanBenzMaxim 7:9cd16581b578 576
IanBenzMaxim 7:9cd16581b578 577 const int DS28EL22::memoryPages;
IanBenzMaxim 7:9cd16581b578 578 const int DS28EL22::protectionBlocks;
IanBenzMaxim 7:9cd16581b578 579
IanBenzMaxim 7:9cd16581b578 580 error_code DS28EL22::writeScratchpad(Page::const_span data) {
IanBenzMaxim 7:9cd16581b578 581 return doWriteScratchpad(data, DS28E22);
IanBenzMaxim 7:9cd16581b578 582 }
IanBenzMaxim 7:9cd16581b578 583
IanBenzMaxim 7:9cd16581b578 584 error_code DS28EL22::readScratchpad(Page::span data) const {
IanBenzMaxim 7:9cd16581b578 585 return doReadScratchpad(data, DS28E22);
IanBenzMaxim 7:9cd16581b578 586 }
IanBenzMaxim 7:9cd16581b578 587
IanBenzMaxim 7:9cd16581b578 588 error_code DS28EL22::readBlockProtection(int blockNum,
IanBenzMaxim 7:9cd16581b578 589 BlockProtection & protection) const {
IanBenzMaxim 7:9cd16581b578 590 return doReadBlockProtection(blockNum, protection, DS28E22);
IanBenzMaxim 7:9cd16581b578 591 }
IanBenzMaxim 7:9cd16581b578 592
IanBenzMaxim 7:9cd16581b578 593 error_code DS28EL22::writeAuthSegment(int pageNum, int segmentNum,
IanBenzMaxim 7:9cd16581b578 594 Segment::const_span newData,
IanBenzMaxim 7:9cd16581b578 595 Page::const_span mac) {
IanBenzMaxim 7:9cd16581b578 596 return doWriteAuthSegment(pageNum, segmentNum, newData, mac, DS28E22);
IanBenzMaxim 7:9cd16581b578 597 }
IanBenzMaxim 7:9cd16581b578 598
IanBenzMaxim 7:9cd16581b578 599 error_code DS28EL22::continueWriteAuthSegment(Segment::const_span newData,
IanBenzMaxim 7:9cd16581b578 600 Page::const_span mac) {
IanBenzMaxim 7:9cd16581b578 601 return doContinueWriteAuthSegment(newData, mac, DS28E22);
IanBenzMaxim 7:9cd16581b578 602 }
IanBenzMaxim 7:9cd16581b578 603
IanBenzMaxim 7:9cd16581b578 604 error_code DS28EL22::readAllBlockProtection(
IanBenzMaxim 7:9cd16581b578 605 span<BlockProtection, protectionBlocks> protection) const {
IanBenzMaxim 7:9cd16581b578 606 return doReadAllBlockProtection(protection, DS28E22);
IanBenzMaxim 7:9cd16581b578 607 }
IanBenzMaxim 7:9cd16581b578 608
IanBenzMaxim 7:9cd16581b578 609 error_code DS28E22::loadSecret(bool lock) { return doLoadSecret(lock, false); }
IanBenzMaxim 7:9cd16581b578 610
IanBenzMaxim 7:9cd16581b578 611 error_code DS28E22::computeSecret(int pageNum, bool lock) {
IanBenzMaxim 7:9cd16581b578 612 return doComputeSecret(pageNum, lock, false);
IanBenzMaxim 7:9cd16581b578 613 }
IanBenzMaxim 7:9cd16581b578 614
IanBenzMaxim 7:9cd16581b578 615 const int DS28EL25::memoryPages;
IanBenzMaxim 7:9cd16581b578 616 const int DS28EL25::protectionBlocks;
IanBenzMaxim 7:9cd16581b578 617
IanBenzMaxim 7:9cd16581b578 618 error_code DS28EL25::writeScratchpad(Page::const_span data) {
IanBenzMaxim 7:9cd16581b578 619 return doWriteScratchpad(data, DS28E25);
IanBenzMaxim 7:9cd16581b578 620 }
IanBenzMaxim 7:9cd16581b578 621
IanBenzMaxim 7:9cd16581b578 622 error_code DS28EL25::readScratchpad(Page::span data) const {
IanBenzMaxim 7:9cd16581b578 623 return doReadScratchpad(data, DS28E25);
IanBenzMaxim 7:9cd16581b578 624 }
IanBenzMaxim 7:9cd16581b578 625
IanBenzMaxim 7:9cd16581b578 626 error_code DS28EL25::readBlockProtection(int blockNum,
IanBenzMaxim 7:9cd16581b578 627 BlockProtection & protection) const {
IanBenzMaxim 7:9cd16581b578 628 return doReadBlockProtection(blockNum, protection, DS28E25);
IanBenzMaxim 7:9cd16581b578 629 }
IanBenzMaxim 7:9cd16581b578 630
IanBenzMaxim 7:9cd16581b578 631 error_code DS28EL25::writeAuthSegment(int pageNum, int segmentNum,
IanBenzMaxim 7:9cd16581b578 632 Segment::const_span newData,
IanBenzMaxim 7:9cd16581b578 633 Page::const_span mac) {
IanBenzMaxim 7:9cd16581b578 634 return doWriteAuthSegment(pageNum, segmentNum, newData, mac, DS28E25);
IanBenzMaxim 7:9cd16581b578 635 }
IanBenzMaxim 7:9cd16581b578 636
IanBenzMaxim 7:9cd16581b578 637 error_code DS28EL25::continueWriteAuthSegment(Segment::const_span newData,
IanBenzMaxim 7:9cd16581b578 638 Page::const_span mac) {
IanBenzMaxim 7:9cd16581b578 639 return doContinueWriteAuthSegment(newData, mac, DS28E25);
IanBenzMaxim 7:9cd16581b578 640 }
IanBenzMaxim 7:9cd16581b578 641
IanBenzMaxim 7:9cd16581b578 642 error_code DS28EL25::readAllBlockProtection(
IanBenzMaxim 7:9cd16581b578 643 span<BlockProtection, protectionBlocks> protection) const {
IanBenzMaxim 7:9cd16581b578 644 return doReadAllBlockProtection(protection, DS28E25);
IanBenzMaxim 7:9cd16581b578 645 }
IanBenzMaxim 7:9cd16581b578 646
IanBenzMaxim 7:9cd16581b578 647 error_code DS28E25::loadSecret(bool lock) { return doLoadSecret(lock, false); }
IanBenzMaxim 7:9cd16581b578 648
IanBenzMaxim 7:9cd16581b578 649 error_code DS28E25::computeSecret(int pageNum, bool lock) {
IanBenzMaxim 7:9cd16581b578 650 return doComputeSecret(pageNum, lock, false);
IanBenzMaxim 7:9cd16581b578 651 }
IanBenzMaxim 7:9cd16581b578 652
IanBenzMaxim 7:9cd16581b578 653 } // namespace MaximInterfaceDevices