Extended MaximInterface

Dependents:   mbed_DS28EC20_GPIO

Committer:
reARMnimator
Date:
Mon Jan 06 15:54:55 2020 +0000
Revision:
10:de4b8812877d
Parent:
6:a8c83a2e6fa4
Fixed inappropriate include path.

Who changed what in which revision?

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