1-Wire® library for mbed. Complete 1-Wire library that supports our silicon masters along with a bit-bang master on the MAX32600MBED platform with one common interface for mbed. Slave support has also been included and more slaves will be added as time permits.

Dependents:   MAXREFDES131_Qt_Demo MAX32630FTHR_iButton_uSD_Logger MAX32630FTHR_DS18B20_uSD_Logger MAXREFDES130_131_Demo ... more

Superseded by MaximInterface.

Committer:
mfruge
Date:
Tue Aug 13 14:42:37 2019 +0000
Revision:
142:85b71cfd617e
Parent:
139:f0e0a7976846
Added functions to ROMCommands to add Alarm Search functionality

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 75:8b627804927c 1 /******************************************************************//**
IanBenzMaxim 75:8b627804927c 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
IanBenzMaxim 75:8b627804927c 3 *
IanBenzMaxim 75:8b627804927c 4 * Permission is hereby granted, free of charge, to any person obtaining a
IanBenzMaxim 75:8b627804927c 5 * copy of this software and associated documentation files (the "Software"),
IanBenzMaxim 75:8b627804927c 6 * to deal in the Software without restriction, including without limitation
IanBenzMaxim 75:8b627804927c 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
IanBenzMaxim 75:8b627804927c 8 * and/or sell copies of the Software, and to permit persons to whom the
IanBenzMaxim 75:8b627804927c 9 * Software is furnished to do so, subject to the following conditions:
IanBenzMaxim 75:8b627804927c 10 *
IanBenzMaxim 75:8b627804927c 11 * The above copyright notice and this permission notice shall be included
IanBenzMaxim 75:8b627804927c 12 * in all copies or substantial portions of the Software.
IanBenzMaxim 75:8b627804927c 13 *
IanBenzMaxim 75:8b627804927c 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
IanBenzMaxim 75:8b627804927c 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
IanBenzMaxim 75:8b627804927c 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IanBenzMaxim 75:8b627804927c 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
IanBenzMaxim 75:8b627804927c 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
IanBenzMaxim 75:8b627804927c 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
IanBenzMaxim 75:8b627804927c 20 * OTHER DEALINGS IN THE SOFTWARE.
IanBenzMaxim 75:8b627804927c 21 *
IanBenzMaxim 75:8b627804927c 22 * Except as contained in this notice, the name of Maxim Integrated
IanBenzMaxim 75:8b627804927c 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
IanBenzMaxim 75:8b627804927c 24 * Products, Inc. Branding Policy.
IanBenzMaxim 75:8b627804927c 25 *
IanBenzMaxim 75:8b627804927c 26 * The mere transfer of this software does not imply any licenses
IanBenzMaxim 75:8b627804927c 27 * of trade secrets, proprietary technology, copyrights, patents,
IanBenzMaxim 75:8b627804927c 28 * trademarks, maskwork rights, or any other form of intellectual
IanBenzMaxim 75:8b627804927c 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
IanBenzMaxim 75:8b627804927c 30 * ownership rights.
IanBenzMaxim 75:8b627804927c 31 **********************************************************************/
IanBenzMaxim 25:bdb1c5a53b58 32
IanBenzMaxim 113:13e2865603df 33 #include "DS28E15_22_25.h"
j3 139:f0e0a7976846 34 #include "DS28E15.h"
j3 139:f0e0a7976846 35 #include "DS28E22.h"
j3 139:f0e0a7976846 36 #include "DS28E25.h"
IanBenzMaxim 73:2cecc1372acc 37 #include "Masters/OneWireMaster.h"
IanBenzMaxim 86:2ce08ca58b9e 38 #include "Utilities/crc.h"
j3 139:f0e0a7976846 39 #include "Utilities/type_traits.h"
IanBenzMaxim 73:2cecc1372acc 40 #include "wait_api.h"
IanBenzMaxim 73:2cecc1372acc 41
IanBenzMaxim 76:84e6c4994e29 42 using namespace OneWire;
IanBenzMaxim 78:0cbbac7f2016 43 using namespace OneWire::crc;
IanBenzMaxim 25:bdb1c5a53b58 44
IanBenzMaxim 49:36954b62f503 45 /// 1-Wire device commands.
IanBenzMaxim 49:36954b62f503 46 enum Command
IanBenzMaxim 49:36954b62f503 47 {
IanBenzMaxim 75:8b627804927c 48 WriteMemory = 0x55,
IanBenzMaxim 75:8b627804927c 49 ReadMemory = 0xF0,
IanBenzMaxim 75:8b627804927c 50 LoadAndLockSecret = 0x33,
IanBenzMaxim 75:8b627804927c 51 ComputeAndLockSecret = 0x3C,
IanBenzMaxim 75:8b627804927c 52 ReadWriteScratchpad = 0x0F,
IanBenzMaxim 75:8b627804927c 53 ComputePageMac = 0xA5,
IanBenzMaxim 75:8b627804927c 54 ReadStatus = 0xAA,
IanBenzMaxim 75:8b627804927c 55 WriteBlockProtection = 0xC3,
IanBenzMaxim 75:8b627804927c 56 AuthWriteMemory = 0x5A,
IanBenzMaxim 75:8b627804927c 57 AuthWriteBlockProtection = 0xCC,
IanBenzMaxim 49:36954b62f503 58 };
IanBenzMaxim 25:bdb1c5a53b58 59
j3 139:f0e0a7976846 60 DS28E15_22_25::Segment DS28E15_22_25::segmentFromPage(unsigned int segmentNum, const Page & page)
IanBenzMaxim 62:43039aeca2ab 61 {
IanBenzMaxim 74:23be10c32fa3 62 if (segmentNum > (segmentsPerPage - 1))
IanBenzMaxim 74:23be10c32fa3 63 {
IanBenzMaxim 74:23be10c32fa3 64 segmentNum = (segmentsPerPage - 1);
IanBenzMaxim 74:23be10c32fa3 65 }
j3 139:f0e0a7976846 66 Segment segment;
j3 139:f0e0a7976846 67 Page::const_iterator copyBegin = page.begin() + (segmentNum * Segment::size());
j3 139:f0e0a7976846 68 std::copy(copyBegin, copyBegin + Segment::size(), segment.begin());
j3 139:f0e0a7976846 69 return segment;
IanBenzMaxim 62:43039aeca2ab 70 }
IanBenzMaxim 62:43039aeca2ab 71
j3 139:f0e0a7976846 72 void DS28E15_22_25::segmentToPage(unsigned int segmentNum, const Segment & segment, Page & page)
IanBenzMaxim 62:43039aeca2ab 73 {
IanBenzMaxim 74:23be10c32fa3 74 if (segmentNum > (segmentsPerPage - 1))
IanBenzMaxim 74:23be10c32fa3 75 {
IanBenzMaxim 74:23be10c32fa3 76 segmentNum = (segmentsPerPage - 1);
IanBenzMaxim 74:23be10c32fa3 77 }
j3 139:f0e0a7976846 78 std::copy(segment.begin(), segment.end(), page.begin() + (segmentNum * segment.size()));
IanBenzMaxim 62:43039aeca2ab 79 }
IanBenzMaxim 62:43039aeca2ab 80
j3 139:f0e0a7976846 81 DS28E15_22_25::BlockProtection::BlockProtection(bool readProtection, bool writeProtection, bool eepromEmulation, bool authProtection, unsigned int blockNum)
IanBenzMaxim 34:11fffbe98ef9 82 {
IanBenzMaxim 74:23be10c32fa3 83 setReadProtection(readProtection);
IanBenzMaxim 74:23be10c32fa3 84 setWriteProtection(writeProtection);
IanBenzMaxim 74:23be10c32fa3 85 setEepromEmulation(eepromEmulation);
IanBenzMaxim 74:23be10c32fa3 86 setAuthProtection(authProtection);
IanBenzMaxim 74:23be10c32fa3 87 setBlockNum(blockNum);
IanBenzMaxim 34:11fffbe98ef9 88 }
IanBenzMaxim 34:11fffbe98ef9 89
j3 139:f0e0a7976846 90 void DS28E15_22_25::BlockProtection::setBlockNum(unsigned int blockNum)
IanBenzMaxim 34:11fffbe98ef9 91 {
IanBenzMaxim 74:23be10c32fa3 92 m_status &= ~blockNumMask;
IanBenzMaxim 74:23be10c32fa3 93 m_status |= (blockNum & blockNumMask);
IanBenzMaxim 34:11fffbe98ef9 94 }
IanBenzMaxim 34:11fffbe98ef9 95
IanBenzMaxim 34:11fffbe98ef9 96 bool DS28E15_22_25::BlockProtection::noProtection() const
IanBenzMaxim 34:11fffbe98ef9 97 {
IanBenzMaxim 74:23be10c32fa3 98 return !readProtection() && !writeProtection() && !eepromEmulation() && !authProtection();
IanBenzMaxim 34:11fffbe98ef9 99 }
IanBenzMaxim 25:bdb1c5a53b58 100
IanBenzMaxim 34:11fffbe98ef9 101 void DS28E15_22_25::BlockProtection::setReadProtection(bool readProtection)
IanBenzMaxim 34:11fffbe98ef9 102 {
IanBenzMaxim 74:23be10c32fa3 103 if (readProtection)
IanBenzMaxim 74:23be10c32fa3 104 {
IanBenzMaxim 74:23be10c32fa3 105 m_status |= readProtectionMask;
IanBenzMaxim 74:23be10c32fa3 106 }
IanBenzMaxim 74:23be10c32fa3 107 else
IanBenzMaxim 74:23be10c32fa3 108 {
IanBenzMaxim 74:23be10c32fa3 109 m_status &= ~readProtectionMask;
IanBenzMaxim 74:23be10c32fa3 110 }
IanBenzMaxim 34:11fffbe98ef9 111 }
IanBenzMaxim 34:11fffbe98ef9 112
IanBenzMaxim 34:11fffbe98ef9 113 void DS28E15_22_25::BlockProtection::setWriteProtection(bool writeProtection)
IanBenzMaxim 34:11fffbe98ef9 114 {
IanBenzMaxim 74:23be10c32fa3 115 if (writeProtection)
IanBenzMaxim 74:23be10c32fa3 116 {
IanBenzMaxim 74:23be10c32fa3 117 m_status |= writeProtectionMask;
IanBenzMaxim 74:23be10c32fa3 118 }
IanBenzMaxim 74:23be10c32fa3 119 else
IanBenzMaxim 74:23be10c32fa3 120 {
IanBenzMaxim 74:23be10c32fa3 121 m_status &= ~writeProtectionMask;
IanBenzMaxim 74:23be10c32fa3 122 }
IanBenzMaxim 34:11fffbe98ef9 123 }
IanBenzMaxim 25:bdb1c5a53b58 124
IanBenzMaxim 34:11fffbe98ef9 125 void DS28E15_22_25::BlockProtection::setEepromEmulation(bool eepromEmulation)
IanBenzMaxim 34:11fffbe98ef9 126 {
IanBenzMaxim 74:23be10c32fa3 127 if (eepromEmulation)
IanBenzMaxim 74:23be10c32fa3 128 {
IanBenzMaxim 74:23be10c32fa3 129 m_status |= eepromEmulationMask;
IanBenzMaxim 74:23be10c32fa3 130 }
IanBenzMaxim 74:23be10c32fa3 131 else
IanBenzMaxim 74:23be10c32fa3 132 {
IanBenzMaxim 74:23be10c32fa3 133 m_status &= ~eepromEmulationMask;
IanBenzMaxim 74:23be10c32fa3 134 }
IanBenzMaxim 34:11fffbe98ef9 135 }
IanBenzMaxim 34:11fffbe98ef9 136
IanBenzMaxim 34:11fffbe98ef9 137 void DS28E15_22_25::BlockProtection::setAuthProtection(bool authProtection)
IanBenzMaxim 34:11fffbe98ef9 138 {
IanBenzMaxim 74:23be10c32fa3 139 if (authProtection)
IanBenzMaxim 74:23be10c32fa3 140 {
IanBenzMaxim 74:23be10c32fa3 141 m_status |= authProtectionMask;
IanBenzMaxim 74:23be10c32fa3 142 }
IanBenzMaxim 74:23be10c32fa3 143 else
IanBenzMaxim 74:23be10c32fa3 144 {
IanBenzMaxim 74:23be10c32fa3 145 m_status &= ~authProtectionMask;
IanBenzMaxim 74:23be10c32fa3 146 }
IanBenzMaxim 34:11fffbe98ef9 147 }
IanBenzMaxim 34:11fffbe98ef9 148
j3 139:f0e0a7976846 149 DS28E15_22_25::DS28E15_22_25(RandomAccessRomIterator & selector, bool lowVoltage)
j3 139:f0e0a7976846 150 : OneWireSlave(selector), m_manId(), m_lowVoltage(lowVoltage)
IanBenzMaxim 25:bdb1c5a53b58 151 {
j3 139:f0e0a7976846 152
IanBenzMaxim 25:bdb1c5a53b58 153 }
IanBenzMaxim 25:bdb1c5a53b58 154
IanBenzMaxim 74:23be10c32fa3 155 OneWireSlave::CmdResult DS28E15_22_25::writeAuthBlockProtection(const ISha256MacCoproc & MacCoproc, const BlockProtection & newProtection, const BlockProtection & oldProtection)
IanBenzMaxim 25:bdb1c5a53b58 156 {
IanBenzMaxim 74:23be10c32fa3 157 uint8_t buf[256], cs;
IanBenzMaxim 74:23be10c32fa3 158 int cnt = 0;
IanBenzMaxim 74:23be10c32fa3 159 Mac mac;
IanBenzMaxim 77:529edb329ee0 160
IanBenzMaxim 77:529edb329ee0 161 if (selectDevice() != OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 162 {
IanBenzMaxim 77:529edb329ee0 163 return CommunicationError;
IanBenzMaxim 77:529edb329ee0 164 }
IanBenzMaxim 74:23be10c32fa3 165
IanBenzMaxim 75:8b627804927c 166 buf[cnt++] = AuthWriteBlockProtection;
IanBenzMaxim 74:23be10c32fa3 167 buf[cnt++] = newProtection.statusByte();
IanBenzMaxim 25:bdb1c5a53b58 168
IanBenzMaxim 74:23be10c32fa3 169 // Send command
IanBenzMaxim 77:529edb329ee0 170 master().OWWriteBlock(&buf[0], 2);
IanBenzMaxim 25:bdb1c5a53b58 171
IanBenzMaxim 74:23be10c32fa3 172 // read first CRC byte
IanBenzMaxim 77:529edb329ee0 173 master().OWReadByte(buf[cnt++]);
IanBenzMaxim 74:23be10c32fa3 174
IanBenzMaxim 74:23be10c32fa3 175 // read the last CRC and enable
IanBenzMaxim 77:529edb329ee0 176 master().OWReadBytePower(buf[cnt++]);
IanBenzMaxim 25:bdb1c5a53b58 177
IanBenzMaxim 74:23be10c32fa3 178 // now wait for the MAC computation.
IanBenzMaxim 74:23be10c32fa3 179 wait_ms(shaComputationDelayMs);
IanBenzMaxim 25:bdb1c5a53b58 180
IanBenzMaxim 74:23be10c32fa3 181 // disable strong pullup
IanBenzMaxim 77:529edb329ee0 182 master().OWSetLevel(OneWireMaster::NormalLevel);
IanBenzMaxim 25:bdb1c5a53b58 183
IanBenzMaxim 74:23be10c32fa3 184 // check CRC16
j3 139:f0e0a7976846 185 if (calculateCrc16(buf, cnt) != 0xB001)
IanBenzMaxim 74:23be10c32fa3 186 {
IanBenzMaxim 77:529edb329ee0 187 return CrcError;
IanBenzMaxim 74:23be10c32fa3 188 }
IanBenzMaxim 25:bdb1c5a53b58 189
IanBenzMaxim 74:23be10c32fa3 190 ISha256MacCoproc::CmdResult result;
IanBenzMaxim 82:c11090a32471 191 result = computeProtectionWriteMac(MacCoproc, newProtection, oldProtection, romId(), manId(), mac);
IanBenzMaxim 74:23be10c32fa3 192 if (result != ISha256MacCoproc::Success)
IanBenzMaxim 74:23be10c32fa3 193 {
IanBenzMaxim 74:23be10c32fa3 194 return OperationFailure;
IanBenzMaxim 74:23be10c32fa3 195 }
IanBenzMaxim 74:23be10c32fa3 196 cnt = 0;
IanBenzMaxim 25:bdb1c5a53b58 197
IanBenzMaxim 74:23be10c32fa3 198 // send the MAC
j3 139:f0e0a7976846 199 master().OWWriteBlock(mac.data(), mac.size());
IanBenzMaxim 74:23be10c32fa3 200
IanBenzMaxim 74:23be10c32fa3 201 // Read CRC and CS byte
IanBenzMaxim 77:529edb329ee0 202 master().OWReadBlock(&buf[cnt], 3);
IanBenzMaxim 74:23be10c32fa3 203 cnt += 3;
IanBenzMaxim 25:bdb1c5a53b58 204
IanBenzMaxim 74:23be10c32fa3 205 // check CRC16
j3 139:f0e0a7976846 206 if (calculateCrc16(buf, cnt - 1, calculateCrc16(mac.data(), mac.size())) != 0xB001)
IanBenzMaxim 74:23be10c32fa3 207 {
IanBenzMaxim 77:529edb329ee0 208 return CrcError;
IanBenzMaxim 74:23be10c32fa3 209 }
IanBenzMaxim 25:bdb1c5a53b58 210
IanBenzMaxim 74:23be10c32fa3 211 // check CS
IanBenzMaxim 74:23be10c32fa3 212 if (buf[cnt - 1] != 0xAA)
IanBenzMaxim 74:23be10c32fa3 213 {
IanBenzMaxim 74:23be10c32fa3 214 return OperationFailure;
IanBenzMaxim 74:23be10c32fa3 215 }
IanBenzMaxim 25:bdb1c5a53b58 216
IanBenzMaxim 74:23be10c32fa3 217 // send release and strong pull-up
IanBenzMaxim 74:23be10c32fa3 218 // DATASHEET_CORRECTION - last bit in release is a read-zero so don't check echo of write byte
IanBenzMaxim 77:529edb329ee0 219 master().OWWriteBytePower(0xAA);
IanBenzMaxim 25:bdb1c5a53b58 220
IanBenzMaxim 74:23be10c32fa3 221 // now wait for the programming.
IanBenzMaxim 74:23be10c32fa3 222 wait_ms(eepromWriteDelayMs);
IanBenzMaxim 74:23be10c32fa3 223
IanBenzMaxim 74:23be10c32fa3 224 // disable strong pullup
IanBenzMaxim 77:529edb329ee0 225 master().OWSetLevel(OneWireMaster::NormalLevel);
IanBenzMaxim 25:bdb1c5a53b58 226
IanBenzMaxim 74:23be10c32fa3 227 // read the CS byte
IanBenzMaxim 77:529edb329ee0 228 master().OWReadByte(cs);
IanBenzMaxim 25:bdb1c5a53b58 229
IanBenzMaxim 74:23be10c32fa3 230 if (cs == 0xAA)
IanBenzMaxim 74:23be10c32fa3 231 {
IanBenzMaxim 74:23be10c32fa3 232 return Success;
IanBenzMaxim 74:23be10c32fa3 233 }
IanBenzMaxim 74:23be10c32fa3 234 // else
IanBenzMaxim 74:23be10c32fa3 235 return OperationFailure;
IanBenzMaxim 25:bdb1c5a53b58 236 }
IanBenzMaxim 25:bdb1c5a53b58 237
IanBenzMaxim 74:23be10c32fa3 238 OneWireSlave::CmdResult DS28E15_22_25::writeBlockProtection(const BlockProtection & protection)
IanBenzMaxim 25:bdb1c5a53b58 239 {
IanBenzMaxim 74:23be10c32fa3 240 uint8_t buf[256], cs;
IanBenzMaxim 74:23be10c32fa3 241 int cnt = 0;
IanBenzMaxim 77:529edb329ee0 242
IanBenzMaxim 77:529edb329ee0 243 if (selectDevice() != OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 244 {
IanBenzMaxim 77:529edb329ee0 245 return CommunicationError;
IanBenzMaxim 77:529edb329ee0 246 }
IanBenzMaxim 25:bdb1c5a53b58 247
IanBenzMaxim 75:8b627804927c 248 buf[cnt++] = WriteBlockProtection;
IanBenzMaxim 25:bdb1c5a53b58 249
IanBenzMaxim 74:23be10c32fa3 250 // compute parameter byte
IanBenzMaxim 74:23be10c32fa3 251 buf[cnt++] = protection.statusByte();
IanBenzMaxim 25:bdb1c5a53b58 252
IanBenzMaxim 77:529edb329ee0 253 master().OWWriteBlock(&buf[0], cnt);
IanBenzMaxim 25:bdb1c5a53b58 254
IanBenzMaxim 74:23be10c32fa3 255 // Read CRC
IanBenzMaxim 77:529edb329ee0 256 master().OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 74:23be10c32fa3 257 cnt += 2;
IanBenzMaxim 25:bdb1c5a53b58 258
IanBenzMaxim 74:23be10c32fa3 259 // check CRC16
j3 139:f0e0a7976846 260 if (calculateCrc16(buf, cnt) != 0xB001)
IanBenzMaxim 74:23be10c32fa3 261 {
IanBenzMaxim 77:529edb329ee0 262 return CrcError;
IanBenzMaxim 74:23be10c32fa3 263 }
IanBenzMaxim 25:bdb1c5a53b58 264
IanBenzMaxim 74:23be10c32fa3 265 // sent release
IanBenzMaxim 77:529edb329ee0 266 master().OWWriteBytePower(0xAA);
IanBenzMaxim 25:bdb1c5a53b58 267
IanBenzMaxim 74:23be10c32fa3 268 // now wait for the programming.
IanBenzMaxim 74:23be10c32fa3 269 wait_ms(eepromWriteDelayMs);
IanBenzMaxim 25:bdb1c5a53b58 270
IanBenzMaxim 74:23be10c32fa3 271 // disable strong pullup
IanBenzMaxim 77:529edb329ee0 272 master().OWSetLevel(OneWireMaster::NormalLevel);
IanBenzMaxim 74:23be10c32fa3 273
IanBenzMaxim 74:23be10c32fa3 274 // read the CS byte
IanBenzMaxim 77:529edb329ee0 275 master().OWReadByte(cs);
IanBenzMaxim 25:bdb1c5a53b58 276
IanBenzMaxim 74:23be10c32fa3 277 if (cs == 0xAA)
IanBenzMaxim 74:23be10c32fa3 278 {
IanBenzMaxim 74:23be10c32fa3 279 return Success;
IanBenzMaxim 74:23be10c32fa3 280 }
IanBenzMaxim 74:23be10c32fa3 281 // else
IanBenzMaxim 74:23be10c32fa3 282 return OperationFailure;
IanBenzMaxim 25:bdb1c5a53b58 283 }
IanBenzMaxim 25:bdb1c5a53b58 284
j3 139:f0e0a7976846 285 template <class T>
j3 139:f0e0a7976846 286 OneWireSlave::CmdResult DS28E15_22_25::doReadBlockProtection(unsigned int blockNum, BlockProtection & protection) const
IanBenzMaxim 25:bdb1c5a53b58 287 {
IanBenzMaxim 74:23be10c32fa3 288 uint8_t buf;
IanBenzMaxim 77:529edb329ee0 289 CmdResult result;
IanBenzMaxim 77:529edb329ee0 290
j3 139:f0e0a7976846 291 result = readStatus<T>(false, false, blockNum, &buf);
IanBenzMaxim 74:23be10c32fa3 292 if (result == Success)
IanBenzMaxim 74:23be10c32fa3 293 {
IanBenzMaxim 74:23be10c32fa3 294 protection.setStatusByte(buf);
IanBenzMaxim 74:23be10c32fa3 295 }
IanBenzMaxim 74:23be10c32fa3 296 return result;
IanBenzMaxim 25:bdb1c5a53b58 297 }
IanBenzMaxim 25:bdb1c5a53b58 298
j3 139:f0e0a7976846 299 template <class T>
j3 139:f0e0a7976846 300 OneWireSlave::CmdResult DS28E15_22_25::doReadPersonality(Personality & personality) const
IanBenzMaxim 50:e967f9befbd0 301 {
j3 139:f0e0a7976846 302 Personality::Buffer buffer;
j3 139:f0e0a7976846 303 CmdResult result = readStatus<T>(true, false, 0, buffer.data());
j3 139:f0e0a7976846 304 if (result == Success)
j3 139:f0e0a7976846 305 {
j3 139:f0e0a7976846 306 personality = Personality(buffer);
j3 139:f0e0a7976846 307 }
j3 139:f0e0a7976846 308 return result;
IanBenzMaxim 50:e967f9befbd0 309 }
IanBenzMaxim 50:e967f9befbd0 310
j3 139:f0e0a7976846 311 template <class T>
IanBenzMaxim 73:2cecc1372acc 312 OneWireSlave::CmdResult DS28E15_22_25::readStatus(bool personality, bool allpages, unsigned int blockNum, uint8_t * rdbuf) const
IanBenzMaxim 50:e967f9befbd0 313 {
IanBenzMaxim 74:23be10c32fa3 314 const size_t crcLen = 4, ds28e22_25_pagesPerBlock = 2;
IanBenzMaxim 74:23be10c32fa3 315
IanBenzMaxim 74:23be10c32fa3 316 uint8_t buf[256];
IanBenzMaxim 74:23be10c32fa3 317 size_t cnt = 0, offset = 0;
IanBenzMaxim 77:529edb329ee0 318
IanBenzMaxim 77:529edb329ee0 319 if (selectDevice() != OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 320 {
IanBenzMaxim 77:529edb329ee0 321 return CommunicationError;
IanBenzMaxim 77:529edb329ee0 322 }
IanBenzMaxim 25:bdb1c5a53b58 323
IanBenzMaxim 75:8b627804927c 324 buf[cnt++] = ReadStatus;
IanBenzMaxim 74:23be10c32fa3 325 if (personality)
IanBenzMaxim 74:23be10c32fa3 326 {
IanBenzMaxim 74:23be10c32fa3 327 buf[cnt++] = 0xE0;
IanBenzMaxim 74:23be10c32fa3 328 }
IanBenzMaxim 74:23be10c32fa3 329 else if (allpages)
IanBenzMaxim 74:23be10c32fa3 330 {
IanBenzMaxim 74:23be10c32fa3 331 buf[cnt++] = 0;
IanBenzMaxim 74:23be10c32fa3 332 }
IanBenzMaxim 74:23be10c32fa3 333 else
IanBenzMaxim 74:23be10c32fa3 334 {
IanBenzMaxim 74:23be10c32fa3 335 // Convert to page number for DS28E22 and DS28E25
IanBenzMaxim 74:23be10c32fa3 336 buf[cnt] = blockNum;
j3 139:f0e0a7976846 337 if (is_same<T, DS28E22>::value || is_same<T, DS28E25>::value)
IanBenzMaxim 74:23be10c32fa3 338 {
IanBenzMaxim 74:23be10c32fa3 339 buf[cnt] *= ds28e22_25_pagesPerBlock;
IanBenzMaxim 74:23be10c32fa3 340 }
IanBenzMaxim 74:23be10c32fa3 341 cnt++;
IanBenzMaxim 74:23be10c32fa3 342 }
IanBenzMaxim 25:bdb1c5a53b58 343
IanBenzMaxim 74:23be10c32fa3 344 // send the command
IanBenzMaxim 77:529edb329ee0 345 master().OWWriteBlock(&buf[0], 2);
IanBenzMaxim 50:e967f9befbd0 346
IanBenzMaxim 74:23be10c32fa3 347 offset = cnt + 2;
IanBenzMaxim 50:e967f9befbd0 348
IanBenzMaxim 74:23be10c32fa3 349 // Set data length
IanBenzMaxim 74:23be10c32fa3 350 size_t rdnum;
IanBenzMaxim 74:23be10c32fa3 351 if (personality)
IanBenzMaxim 74:23be10c32fa3 352 {
IanBenzMaxim 74:23be10c32fa3 353 rdnum = 4;
IanBenzMaxim 74:23be10c32fa3 354 }
IanBenzMaxim 74:23be10c32fa3 355 else if (!allpages)
IanBenzMaxim 74:23be10c32fa3 356 {
IanBenzMaxim 74:23be10c32fa3 357 rdnum = 1;
IanBenzMaxim 74:23be10c32fa3 358 }
j3 139:f0e0a7976846 359 else if (is_same<T, DS28E22>::value || is_same<T, DS28E25>::value)
IanBenzMaxim 74:23be10c32fa3 360 {
j3 139:f0e0a7976846 361 rdnum = DS28E25::memoryPages; // Need to read extra data on DS28E22 to get CRC16.
IanBenzMaxim 74:23be10c32fa3 362 }
IanBenzMaxim 74:23be10c32fa3 363 else // DS28E15
IanBenzMaxim 74:23be10c32fa3 364 {
j3 139:f0e0a7976846 365 rdnum = DS28E15::protectionBlocks;
IanBenzMaxim 74:23be10c32fa3 366 }
IanBenzMaxim 74:23be10c32fa3 367 rdnum += crcLen; // Add in CRC length
IanBenzMaxim 50:e967f9befbd0 368
IanBenzMaxim 74:23be10c32fa3 369 // Read the bytes
IanBenzMaxim 77:529edb329ee0 370 master().OWReadBlock(&buf[cnt], rdnum);
IanBenzMaxim 74:23be10c32fa3 371 cnt += rdnum;
IanBenzMaxim 50:e967f9befbd0 372
IanBenzMaxim 74:23be10c32fa3 373 // check the first CRC16
j3 139:f0e0a7976846 374 if (calculateCrc16(buf, offset) != 0xB001)
IanBenzMaxim 74:23be10c32fa3 375 {
IanBenzMaxim 77:529edb329ee0 376 return CrcError;
IanBenzMaxim 74:23be10c32fa3 377 }
IanBenzMaxim 25:bdb1c5a53b58 378
IanBenzMaxim 74:23be10c32fa3 379 if (personality || allpages)
IanBenzMaxim 74:23be10c32fa3 380 {
IanBenzMaxim 74:23be10c32fa3 381 // check the second CRC16
j3 139:f0e0a7976846 382 if (calculateCrc16(buf + offset, cnt - offset) != 0xB001)
IanBenzMaxim 74:23be10c32fa3 383 {
IanBenzMaxim 77:529edb329ee0 384 return CrcError;
IanBenzMaxim 74:23be10c32fa3 385 }
IanBenzMaxim 74:23be10c32fa3 386 }
IanBenzMaxim 25:bdb1c5a53b58 387
IanBenzMaxim 74:23be10c32fa3 388 // copy the data to the read buffer
IanBenzMaxim 74:23be10c32fa3 389 rdnum -= crcLen;
j3 139:f0e0a7976846 390 if (allpages && (is_same<T, DS28E22>::value || is_same<T, DS28E25>::value))
IanBenzMaxim 50:e967f9befbd0 391 {
j3 139:f0e0a7976846 392 if (is_same<T, DS28E22>::value)
IanBenzMaxim 74:23be10c32fa3 393 {
j3 139:f0e0a7976846 394 rdnum -= (DS28E25::memoryPages - DS28E22::memoryPages);
IanBenzMaxim 74:23be10c32fa3 395 }
IanBenzMaxim 74:23be10c32fa3 396
IanBenzMaxim 74:23be10c32fa3 397 for (size_t i = 0; i < (rdnum / ds28e22_25_pagesPerBlock); i++)
IanBenzMaxim 74:23be10c32fa3 398 {
IanBenzMaxim 74:23be10c32fa3 399 rdbuf[i] = (buf[offset + (i * ds28e22_25_pagesPerBlock)] & 0xF0); // Upper nibble
IanBenzMaxim 74:23be10c32fa3 400 rdbuf[i] |= ((buf[offset + (i * ds28e22_25_pagesPerBlock)] & 0x0F) / ds28e22_25_pagesPerBlock); // Lower nibble
IanBenzMaxim 74:23be10c32fa3 401 }
IanBenzMaxim 50:e967f9befbd0 402 }
IanBenzMaxim 74:23be10c32fa3 403 else
IanBenzMaxim 74:23be10c32fa3 404 {
IanBenzMaxim 74:23be10c32fa3 405 std::memcpy(rdbuf, &buf[offset], rdnum);
IanBenzMaxim 74:23be10c32fa3 406 }
IanBenzMaxim 25:bdb1c5a53b58 407
IanBenzMaxim 74:23be10c32fa3 408 return Success;
IanBenzMaxim 25:bdb1c5a53b58 409 }
IanBenzMaxim 25:bdb1c5a53b58 410
IanBenzMaxim 73:2cecc1372acc 411 ISha256MacCoproc::CmdResult DS28E15_22_25::computeAuthMac(const ISha256MacCoproc & MacCoproc, const Page & pageData, unsigned int pageNum, const Scratchpad & challenge, const RomId & romId, const ManId & manId, Mac & mac)
IanBenzMaxim 25:bdb1c5a53b58 412 {
IanBenzMaxim 74:23be10c32fa3 413 ISha256MacCoproc::AuthMacData authMacData;
IanBenzMaxim 49:36954b62f503 414
IanBenzMaxim 74:23be10c32fa3 415 // insert ROM number or FF
j3 139:f0e0a7976846 416 std::memcpy(authMacData.data(), romId.buffer.data(), romId.buffer.size());
IanBenzMaxim 49:36954b62f503 417
IanBenzMaxim 74:23be10c32fa3 418 authMacData[10] = pageNum;
IanBenzMaxim 25:bdb1c5a53b58 419
IanBenzMaxim 74:23be10c32fa3 420 authMacData[9] = manId[0];
IanBenzMaxim 74:23be10c32fa3 421 authMacData[8] = manId[1];
IanBenzMaxim 25:bdb1c5a53b58 422
IanBenzMaxim 74:23be10c32fa3 423 authMacData[11] = 0x00;
IanBenzMaxim 25:bdb1c5a53b58 424
IanBenzMaxim 74:23be10c32fa3 425 return MacCoproc.computeAuthMac(ISha256MacCoproc::DevicePage(pageData), challenge, authMacData, mac);
IanBenzMaxim 25:bdb1c5a53b58 426 }
IanBenzMaxim 25:bdb1c5a53b58 427
IanBenzMaxim 73:2cecc1372acc 428 ISha256MacCoproc::CmdResult DS28E15_22_25::computeAuthMacAnon(const ISha256MacCoproc & MacCoproc, const Page & pageData, unsigned int pageNum, const Scratchpad & challenge, const ManId & manId, Mac & mac)
IanBenzMaxim 49:36954b62f503 429 {
IanBenzMaxim 74:23be10c32fa3 430 RomId romId;
j3 139:f0e0a7976846 431 romId.buffer.fill(0xFF);
IanBenzMaxim 74:23be10c32fa3 432 return computeAuthMac(MacCoproc, pageData, pageNum, challenge, romId, manId, mac);
IanBenzMaxim 49:36954b62f503 433 }
IanBenzMaxim 49:36954b62f503 434
IanBenzMaxim 74:23be10c32fa3 435 OneWireSlave::CmdResult DS28E15_22_25::computeReadPageMac(unsigned int page_num, bool anon, Mac & mac) const
IanBenzMaxim 25:bdb1c5a53b58 436 {
IanBenzMaxim 74:23be10c32fa3 437 uint8_t buf[256], cs;
IanBenzMaxim 74:23be10c32fa3 438 int cnt = 0;
IanBenzMaxim 77:529edb329ee0 439
IanBenzMaxim 77:529edb329ee0 440 if (selectDevice() != OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 441 {
IanBenzMaxim 77:529edb329ee0 442 return CommunicationError;
IanBenzMaxim 77:529edb329ee0 443 }
IanBenzMaxim 25:bdb1c5a53b58 444
IanBenzMaxim 75:8b627804927c 445 buf[cnt++] = ComputePageMac;
IanBenzMaxim 74:23be10c32fa3 446 buf[cnt++] = ((anon) ? 0xE0 : 0x00) | page_num;
IanBenzMaxim 74:23be10c32fa3 447
IanBenzMaxim 74:23be10c32fa3 448 // Send command
IanBenzMaxim 77:529edb329ee0 449 master().OWWriteBlock(&buf[0], 2);
IanBenzMaxim 25:bdb1c5a53b58 450
IanBenzMaxim 74:23be10c32fa3 451 // read first CRC byte
IanBenzMaxim 77:529edb329ee0 452 master().OWReadByte(buf[cnt++]);
IanBenzMaxim 25:bdb1c5a53b58 453
IanBenzMaxim 74:23be10c32fa3 454 // read the last CRC and enable
IanBenzMaxim 77:529edb329ee0 455 master().OWReadBytePower(buf[cnt++]);
IanBenzMaxim 25:bdb1c5a53b58 456
IanBenzMaxim 74:23be10c32fa3 457 // now wait for the MAC computation.
IanBenzMaxim 74:23be10c32fa3 458 wait_ms(shaComputationDelayMs * 2);
IanBenzMaxim 25:bdb1c5a53b58 459
IanBenzMaxim 74:23be10c32fa3 460 // disable strong pullup
IanBenzMaxim 77:529edb329ee0 461 master().OWSetLevel(OneWireMaster::NormalLevel);
IanBenzMaxim 25:bdb1c5a53b58 462
IanBenzMaxim 74:23be10c32fa3 463 // check CRC16
j3 139:f0e0a7976846 464 if (calculateCrc16(buf, cnt) != 0xB001)
IanBenzMaxim 74:23be10c32fa3 465 {
IanBenzMaxim 77:529edb329ee0 466 return CrcError;
IanBenzMaxim 74:23be10c32fa3 467 }
IanBenzMaxim 25:bdb1c5a53b58 468
IanBenzMaxim 74:23be10c32fa3 469 // read the CS byte
IanBenzMaxim 77:529edb329ee0 470 master().OWReadByte(cs);
IanBenzMaxim 74:23be10c32fa3 471 if (cs != 0xAA)
IanBenzMaxim 74:23be10c32fa3 472 {
IanBenzMaxim 74:23be10c32fa3 473 return OperationFailure;
IanBenzMaxim 74:23be10c32fa3 474 }
IanBenzMaxim 25:bdb1c5a53b58 475
IanBenzMaxim 74:23be10c32fa3 476 // read the MAC and CRC
j3 139:f0e0a7976846 477 master().OWReadBlock(&buf[0], (Mac::size() + 2));
IanBenzMaxim 25:bdb1c5a53b58 478
IanBenzMaxim 74:23be10c32fa3 479 // check CRC16
j3 139:f0e0a7976846 480 if (calculateCrc16(buf, Mac::size() + 2) != 0xB001)
IanBenzMaxim 74:23be10c32fa3 481 {
IanBenzMaxim 77:529edb329ee0 482 return CrcError;
IanBenzMaxim 74:23be10c32fa3 483 }
IanBenzMaxim 25:bdb1c5a53b58 484
IanBenzMaxim 74:23be10c32fa3 485 // copy MAC to return buffer
j3 139:f0e0a7976846 486 std::memcpy(mac.data(), buf, mac.size());
IanBenzMaxim 25:bdb1c5a53b58 487
IanBenzMaxim 74:23be10c32fa3 488 return Success;
IanBenzMaxim 25:bdb1c5a53b58 489 }
IanBenzMaxim 25:bdb1c5a53b58 490
IanBenzMaxim 74:23be10c32fa3 491 OneWireSlave::CmdResult DS28E15_22_25::computeSecret(unsigned int page_num, bool lock)
IanBenzMaxim 25:bdb1c5a53b58 492 {
IanBenzMaxim 74:23be10c32fa3 493 uint8_t buf[256], cs;
IanBenzMaxim 74:23be10c32fa3 494 int cnt = 0;
IanBenzMaxim 77:529edb329ee0 495
IanBenzMaxim 77:529edb329ee0 496 if (selectDevice() != OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 497 {
IanBenzMaxim 77:529edb329ee0 498 return CommunicationError;
IanBenzMaxim 77:529edb329ee0 499 }
IanBenzMaxim 25:bdb1c5a53b58 500
IanBenzMaxim 75:8b627804927c 501 buf[cnt++] = ComputeAndLockSecret;
IanBenzMaxim 74:23be10c32fa3 502 buf[cnt++] = (lock) ? (0xE0 | page_num) : page_num; // lock flag
IanBenzMaxim 25:bdb1c5a53b58 503
IanBenzMaxim 74:23be10c32fa3 504 // Send command
IanBenzMaxim 77:529edb329ee0 505 master().OWWriteBlock(&buf[0], 2);
IanBenzMaxim 25:bdb1c5a53b58 506
IanBenzMaxim 74:23be10c32fa3 507 // Read CRC
IanBenzMaxim 77:529edb329ee0 508 master().OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 74:23be10c32fa3 509 cnt += 2;
IanBenzMaxim 25:bdb1c5a53b58 510
IanBenzMaxim 74:23be10c32fa3 511 // check CRC16
j3 139:f0e0a7976846 512 if (calculateCrc16(buf, cnt) != 0xB001)
IanBenzMaxim 74:23be10c32fa3 513 {
IanBenzMaxim 77:529edb329ee0 514 return CrcError;
IanBenzMaxim 74:23be10c32fa3 515 }
IanBenzMaxim 25:bdb1c5a53b58 516
IanBenzMaxim 74:23be10c32fa3 517 // send release and strong pull-up
IanBenzMaxim 77:529edb329ee0 518 master().OWWriteBytePower(0xAA);
IanBenzMaxim 25:bdb1c5a53b58 519
IanBenzMaxim 74:23be10c32fa3 520 // now wait for the MAC computations and secret programming.
IanBenzMaxim 74:23be10c32fa3 521 wait_ms(shaComputationDelayMs * 2 + secretEepromWriteDelayMs());
IanBenzMaxim 25:bdb1c5a53b58 522
IanBenzMaxim 74:23be10c32fa3 523 // disable strong pullup
IanBenzMaxim 77:529edb329ee0 524 master().OWSetLevel(OneWireMaster::NormalLevel);
IanBenzMaxim 74:23be10c32fa3 525
IanBenzMaxim 74:23be10c32fa3 526 // read the CS byte
IanBenzMaxim 77:529edb329ee0 527 master().OWReadByte(cs);
IanBenzMaxim 25:bdb1c5a53b58 528
IanBenzMaxim 74:23be10c32fa3 529 if (cs == 0xAA)
IanBenzMaxim 74:23be10c32fa3 530 {
IanBenzMaxim 74:23be10c32fa3 531 return Success;
IanBenzMaxim 74:23be10c32fa3 532 }
IanBenzMaxim 74:23be10c32fa3 533 // else
IanBenzMaxim 74:23be10c32fa3 534 return OperationFailure;
IanBenzMaxim 25:bdb1c5a53b58 535 }
IanBenzMaxim 25:bdb1c5a53b58 536
j3 139:f0e0a7976846 537 template <class T>
j3 139:f0e0a7976846 538 OneWireSlave::CmdResult DS28E15_22_25::doWriteScratchpad(const Scratchpad & data) const
IanBenzMaxim 25:bdb1c5a53b58 539 {
IanBenzMaxim 74:23be10c32fa3 540 uint8_t buf[256];
IanBenzMaxim 74:23be10c32fa3 541 int cnt = 0, offset;
IanBenzMaxim 77:529edb329ee0 542
IanBenzMaxim 77:529edb329ee0 543 if (selectDevice() != OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 544 {
IanBenzMaxim 77:529edb329ee0 545 return CommunicationError;
IanBenzMaxim 77:529edb329ee0 546 }
IanBenzMaxim 25:bdb1c5a53b58 547
IanBenzMaxim 75:8b627804927c 548 buf[cnt++] = ReadWriteScratchpad;
j3 139:f0e0a7976846 549 if (is_same<T, DS28E22>::value || is_same<T, DS28E25>::value)
IanBenzMaxim 74:23be10c32fa3 550 {
IanBenzMaxim 74:23be10c32fa3 551 buf[cnt++] = 0x20;
IanBenzMaxim 74:23be10c32fa3 552 }
IanBenzMaxim 74:23be10c32fa3 553 else
IanBenzMaxim 74:23be10c32fa3 554 {
IanBenzMaxim 74:23be10c32fa3 555 buf[cnt++] = 0x00;
IanBenzMaxim 74:23be10c32fa3 556 }
IanBenzMaxim 25:bdb1c5a53b58 557
IanBenzMaxim 74:23be10c32fa3 558 // Send command
IanBenzMaxim 77:529edb329ee0 559 master().OWWriteBlock(&buf[0], 2);
IanBenzMaxim 25:bdb1c5a53b58 560
IanBenzMaxim 74:23be10c32fa3 561 // Read CRC
IanBenzMaxim 77:529edb329ee0 562 master().OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 74:23be10c32fa3 563 cnt += 2;
IanBenzMaxim 74:23be10c32fa3 564
IanBenzMaxim 74:23be10c32fa3 565 offset = cnt;
IanBenzMaxim 25:bdb1c5a53b58 566
IanBenzMaxim 74:23be10c32fa3 567 // add the data
j3 139:f0e0a7976846 568 std::memcpy(&buf[cnt], data.data(), data.size());
j3 139:f0e0a7976846 569 cnt += data.size();
IanBenzMaxim 25:bdb1c5a53b58 570
IanBenzMaxim 74:23be10c32fa3 571 // Send the data
j3 139:f0e0a7976846 572 master().OWWriteBlock(data.data(), data.size());
IanBenzMaxim 74:23be10c32fa3 573
IanBenzMaxim 74:23be10c32fa3 574 // Read CRC
IanBenzMaxim 77:529edb329ee0 575 master().OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 74:23be10c32fa3 576 cnt += 2;
IanBenzMaxim 25:bdb1c5a53b58 577
IanBenzMaxim 74:23be10c32fa3 578 // check first CRC16
j3 139:f0e0a7976846 579 if (calculateCrc16(buf, offset) != 0xB001)
IanBenzMaxim 74:23be10c32fa3 580 {
IanBenzMaxim 77:529edb329ee0 581 return CrcError;
IanBenzMaxim 74:23be10c32fa3 582 }
IanBenzMaxim 25:bdb1c5a53b58 583
IanBenzMaxim 74:23be10c32fa3 584 // check the second CRC16
j3 139:f0e0a7976846 585 if (calculateCrc16(buf + offset, cnt - offset) != 0xB001)
IanBenzMaxim 74:23be10c32fa3 586 {
IanBenzMaxim 77:529edb329ee0 587 return CrcError;
IanBenzMaxim 74:23be10c32fa3 588 }
IanBenzMaxim 25:bdb1c5a53b58 589
IanBenzMaxim 74:23be10c32fa3 590 return Success;
IanBenzMaxim 25:bdb1c5a53b58 591 }
IanBenzMaxim 25:bdb1c5a53b58 592
j3 139:f0e0a7976846 593 template <class T>
j3 139:f0e0a7976846 594 OneWireSlave::CmdResult DS28E15_22_25::doReadScratchpad(Scratchpad & data) const
IanBenzMaxim 49:36954b62f503 595 {
IanBenzMaxim 74:23be10c32fa3 596 uint8_t buf[256];
IanBenzMaxim 74:23be10c32fa3 597 int cnt = 0, offset;
IanBenzMaxim 77:529edb329ee0 598
IanBenzMaxim 77:529edb329ee0 599 if (selectDevice() != OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 600 {
IanBenzMaxim 77:529edb329ee0 601 return CommunicationError;
IanBenzMaxim 77:529edb329ee0 602 }
IanBenzMaxim 49:36954b62f503 603
IanBenzMaxim 75:8b627804927c 604 buf[cnt++] = ReadWriteScratchpad;
j3 139:f0e0a7976846 605 if (is_same<T, DS28E22>::value || is_same<T, DS28E25>::value)
IanBenzMaxim 74:23be10c32fa3 606 {
IanBenzMaxim 74:23be10c32fa3 607 buf[cnt++] = 0x2F;
IanBenzMaxim 74:23be10c32fa3 608 }
IanBenzMaxim 74:23be10c32fa3 609 else
IanBenzMaxim 74:23be10c32fa3 610 {
IanBenzMaxim 74:23be10c32fa3 611 buf[cnt++] = 0x0F;
IanBenzMaxim 74:23be10c32fa3 612 }
IanBenzMaxim 49:36954b62f503 613
IanBenzMaxim 74:23be10c32fa3 614 // Send command
IanBenzMaxim 77:529edb329ee0 615 master().OWWriteBlock(&buf[0], 2);
IanBenzMaxim 49:36954b62f503 616
IanBenzMaxim 74:23be10c32fa3 617 // Read CRC
IanBenzMaxim 77:529edb329ee0 618 master().OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 74:23be10c32fa3 619 cnt += 2;
IanBenzMaxim 74:23be10c32fa3 620
IanBenzMaxim 74:23be10c32fa3 621 offset = cnt;
IanBenzMaxim 49:36954b62f503 622
IanBenzMaxim 74:23be10c32fa3 623 // Receive the data
j3 139:f0e0a7976846 624 master().OWReadBlock(&buf[cnt], data.size());
j3 139:f0e0a7976846 625 cnt += data.size();
IanBenzMaxim 74:23be10c32fa3 626
IanBenzMaxim 74:23be10c32fa3 627 // Read CRC
IanBenzMaxim 77:529edb329ee0 628 master().OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 74:23be10c32fa3 629 cnt += 2;
IanBenzMaxim 49:36954b62f503 630
IanBenzMaxim 74:23be10c32fa3 631 // check first CRC16
j3 139:f0e0a7976846 632 if (calculateCrc16(buf, offset) != 0xB001)
IanBenzMaxim 74:23be10c32fa3 633 {
IanBenzMaxim 77:529edb329ee0 634 return CrcError;
IanBenzMaxim 74:23be10c32fa3 635 }
IanBenzMaxim 49:36954b62f503 636
IanBenzMaxim 74:23be10c32fa3 637 // check the second CRC16
j3 139:f0e0a7976846 638 if (calculateCrc16(buf + offset, cnt - offset) != 0xB001)
IanBenzMaxim 74:23be10c32fa3 639 {
IanBenzMaxim 77:529edb329ee0 640 return CrcError;
IanBenzMaxim 74:23be10c32fa3 641 }
IanBenzMaxim 49:36954b62f503 642
IanBenzMaxim 74:23be10c32fa3 643 // Copy to output
j3 139:f0e0a7976846 644 std::memcpy(data.data(), &buf[offset], data.size());
IanBenzMaxim 74:23be10c32fa3 645
IanBenzMaxim 74:23be10c32fa3 646 return Success;
IanBenzMaxim 49:36954b62f503 647 }
IanBenzMaxim 49:36954b62f503 648
IanBenzMaxim 34:11fffbe98ef9 649 OneWireSlave::CmdResult DS28E15_22_25::loadSecret(bool lock)
IanBenzMaxim 25:bdb1c5a53b58 650 {
IanBenzMaxim 74:23be10c32fa3 651 uint8_t buf[256], cs;
IanBenzMaxim 74:23be10c32fa3 652 int cnt = 0;
IanBenzMaxim 77:529edb329ee0 653
IanBenzMaxim 77:529edb329ee0 654 if (selectDevice() != OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 655 {
IanBenzMaxim 77:529edb329ee0 656 return CommunicationError;
IanBenzMaxim 77:529edb329ee0 657 }
IanBenzMaxim 25:bdb1c5a53b58 658
IanBenzMaxim 75:8b627804927c 659 buf[cnt++] = LoadAndLockSecret;
IanBenzMaxim 74:23be10c32fa3 660 buf[cnt++] = (lock) ? 0xE0 : 0x00; // lock flag
IanBenzMaxim 74:23be10c32fa3 661
IanBenzMaxim 74:23be10c32fa3 662 // Send command
IanBenzMaxim 77:529edb329ee0 663 master().OWWriteBlock(&buf[0], 2);
IanBenzMaxim 25:bdb1c5a53b58 664
IanBenzMaxim 74:23be10c32fa3 665 // Read CRC
IanBenzMaxim 77:529edb329ee0 666 master().OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 74:23be10c32fa3 667 cnt += 2;
IanBenzMaxim 25:bdb1c5a53b58 668
IanBenzMaxim 74:23be10c32fa3 669 // check CRC16
j3 139:f0e0a7976846 670 if (calculateCrc16(buf, cnt) != 0xB001)
IanBenzMaxim 74:23be10c32fa3 671 {
IanBenzMaxim 77:529edb329ee0 672 return CrcError;
IanBenzMaxim 74:23be10c32fa3 673 }
IanBenzMaxim 25:bdb1c5a53b58 674
IanBenzMaxim 74:23be10c32fa3 675 // send release and strong pull-up
IanBenzMaxim 77:529edb329ee0 676 master().OWWriteBytePower(0xAA);
IanBenzMaxim 25:bdb1c5a53b58 677
IanBenzMaxim 74:23be10c32fa3 678 // now wait for the secret programming.
IanBenzMaxim 74:23be10c32fa3 679 wait_ms(secretEepromWriteDelayMs());
IanBenzMaxim 74:23be10c32fa3 680
IanBenzMaxim 74:23be10c32fa3 681 // disable strong pullup
IanBenzMaxim 77:529edb329ee0 682 master().OWSetLevel(OneWireMaster::NormalLevel);
IanBenzMaxim 25:bdb1c5a53b58 683
IanBenzMaxim 74:23be10c32fa3 684 // read the CS byte
IanBenzMaxim 77:529edb329ee0 685 master().OWReadByte(cs);
IanBenzMaxim 25:bdb1c5a53b58 686
IanBenzMaxim 74:23be10c32fa3 687 if (cs == 0xAA)
IanBenzMaxim 74:23be10c32fa3 688 {
IanBenzMaxim 74:23be10c32fa3 689 return Success;
IanBenzMaxim 74:23be10c32fa3 690 }
IanBenzMaxim 74:23be10c32fa3 691 // else
IanBenzMaxim 74:23be10c32fa3 692 return OperationFailure;
IanBenzMaxim 25:bdb1c5a53b58 693 }
IanBenzMaxim 25:bdb1c5a53b58 694
IanBenzMaxim 74:23be10c32fa3 695 OneWireSlave::CmdResult DS28E15_22_25::readPage(unsigned int page, Page & rdbuf, bool continuing) const
IanBenzMaxim 25:bdb1c5a53b58 696 {
IanBenzMaxim 74:23be10c32fa3 697 uint8_t buf[256];
j3 139:f0e0a7976846 698 int cnt = 0;
j3 139:f0e0a7976846 699 int offset = 0;
IanBenzMaxim 25:bdb1c5a53b58 700
IanBenzMaxim 74:23be10c32fa3 701 // check if not continuing a previous block write
IanBenzMaxim 74:23be10c32fa3 702 if (!continuing)
IanBenzMaxim 74:23be10c32fa3 703 {
IanBenzMaxim 77:529edb329ee0 704 if (selectDevice() != OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 705 {
IanBenzMaxim 77:529edb329ee0 706 return CommunicationError;
IanBenzMaxim 77:529edb329ee0 707 }
IanBenzMaxim 77:529edb329ee0 708
IanBenzMaxim 75:8b627804927c 709 buf[cnt++] = ReadMemory;
IanBenzMaxim 74:23be10c32fa3 710 buf[cnt++] = page; // address
IanBenzMaxim 25:bdb1c5a53b58 711
IanBenzMaxim 74:23be10c32fa3 712 // Send command
IanBenzMaxim 77:529edb329ee0 713 master().OWWriteBlock(&buf[0], 2);
IanBenzMaxim 25:bdb1c5a53b58 714
IanBenzMaxim 74:23be10c32fa3 715 // Read CRC
IanBenzMaxim 77:529edb329ee0 716 master().OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 74:23be10c32fa3 717 cnt += 2;
IanBenzMaxim 74:23be10c32fa3 718
IanBenzMaxim 74:23be10c32fa3 719 offset = cnt;
IanBenzMaxim 74:23be10c32fa3 720 }
IanBenzMaxim 25:bdb1c5a53b58 721
IanBenzMaxim 74:23be10c32fa3 722 // read data and CRC16
j3 139:f0e0a7976846 723 master().OWReadBlock(&buf[cnt], (rdbuf.size() + 2));
IanBenzMaxim 74:23be10c32fa3 724 cnt += 34;
IanBenzMaxim 25:bdb1c5a53b58 725
IanBenzMaxim 74:23be10c32fa3 726 // check the first CRC16
IanBenzMaxim 74:23be10c32fa3 727 if (!continuing)
IanBenzMaxim 74:23be10c32fa3 728 {
j3 139:f0e0a7976846 729 if (calculateCrc16(buf, offset) != 0xB001)
IanBenzMaxim 74:23be10c32fa3 730 {
IanBenzMaxim 77:529edb329ee0 731 return CrcError;
IanBenzMaxim 74:23be10c32fa3 732 }
IanBenzMaxim 74:23be10c32fa3 733 }
IanBenzMaxim 25:bdb1c5a53b58 734
IanBenzMaxim 74:23be10c32fa3 735 // check the second CRC16
j3 139:f0e0a7976846 736 if (calculateCrc16(buf + offset, cnt - offset) != 0xB001)
IanBenzMaxim 74:23be10c32fa3 737 {
IanBenzMaxim 77:529edb329ee0 738 return CrcError;
IanBenzMaxim 74:23be10c32fa3 739 }
IanBenzMaxim 25:bdb1c5a53b58 740
IanBenzMaxim 74:23be10c32fa3 741 // copy the data to the read buffer
j3 139:f0e0a7976846 742 std::memcpy(rdbuf.data(), &buf[offset], rdbuf.size());
IanBenzMaxim 25:bdb1c5a53b58 743
IanBenzMaxim 74:23be10c32fa3 744 return Success;
IanBenzMaxim 25:bdb1c5a53b58 745 }
IanBenzMaxim 25:bdb1c5a53b58 746
j3 139:f0e0a7976846 747 template <class T>
j3 139:f0e0a7976846 748 OneWireSlave::CmdResult DS28E15_22_25::doWriteAuthSegmentMac(unsigned int pageNum, unsigned int segmentNum, const Segment & newData, const Mac & mac, bool continuing)
IanBenzMaxim 25:bdb1c5a53b58 749 {
IanBenzMaxim 74:23be10c32fa3 750 uint8_t buf[256], cs;
IanBenzMaxim 120:200109b73e3c 751 int cnt, offset;
IanBenzMaxim 74:23be10c32fa3 752
IanBenzMaxim 74:23be10c32fa3 753 cnt = 0;
IanBenzMaxim 74:23be10c32fa3 754 offset = 0;
IanBenzMaxim 25:bdb1c5a53b58 755
IanBenzMaxim 74:23be10c32fa3 756 // check if not continuing a previous block write
IanBenzMaxim 74:23be10c32fa3 757 if (!continuing)
IanBenzMaxim 74:23be10c32fa3 758 {
IanBenzMaxim 77:529edb329ee0 759 if (selectDevice() != OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 760 {
IanBenzMaxim 77:529edb329ee0 761 return CommunicationError;
IanBenzMaxim 77:529edb329ee0 762 }
IanBenzMaxim 77:529edb329ee0 763
IanBenzMaxim 75:8b627804927c 764 buf[cnt++] = AuthWriteMemory;
IanBenzMaxim 74:23be10c32fa3 765 buf[cnt++] = (segmentNum << 5) | pageNum; // address
IanBenzMaxim 25:bdb1c5a53b58 766
IanBenzMaxim 74:23be10c32fa3 767 // Send command
IanBenzMaxim 77:529edb329ee0 768 master().OWWriteBlock(&buf[0], 2);
IanBenzMaxim 25:bdb1c5a53b58 769
IanBenzMaxim 74:23be10c32fa3 770 // Read CRC
IanBenzMaxim 77:529edb329ee0 771 master().OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 74:23be10c32fa3 772 cnt += 2;
IanBenzMaxim 25:bdb1c5a53b58 773
IanBenzMaxim 74:23be10c32fa3 774 offset = cnt;
IanBenzMaxim 74:23be10c32fa3 775 }
IanBenzMaxim 25:bdb1c5a53b58 776
IanBenzMaxim 74:23be10c32fa3 777 // add the data
j3 139:f0e0a7976846 778 for (size_t i = 0; i < newData.size(); i++)
IanBenzMaxim 74:23be10c32fa3 779 {
IanBenzMaxim 74:23be10c32fa3 780 buf[cnt++] = newData[i];
IanBenzMaxim 74:23be10c32fa3 781 }
IanBenzMaxim 25:bdb1c5a53b58 782
IanBenzMaxim 74:23be10c32fa3 783 // Send data
j3 139:f0e0a7976846 784 master().OWWriteBlock(newData.data(), newData.size());
IanBenzMaxim 25:bdb1c5a53b58 785
IanBenzMaxim 74:23be10c32fa3 786 // read first CRC byte
IanBenzMaxim 77:529edb329ee0 787 master().OWReadByte(buf[cnt++]);
IanBenzMaxim 25:bdb1c5a53b58 788
IanBenzMaxim 74:23be10c32fa3 789 // read the last CRC and enable power
IanBenzMaxim 77:529edb329ee0 790 master().OWReadBytePower(buf[cnt++]);
IanBenzMaxim 25:bdb1c5a53b58 791
IanBenzMaxim 74:23be10c32fa3 792 // now wait for the MAC computation.
IanBenzMaxim 74:23be10c32fa3 793 wait_ms(shaComputationDelayMs);
IanBenzMaxim 25:bdb1c5a53b58 794
IanBenzMaxim 74:23be10c32fa3 795 // disable strong pullup
IanBenzMaxim 77:529edb329ee0 796 master().OWSetLevel(OneWireMaster::NormalLevel);
IanBenzMaxim 25:bdb1c5a53b58 797
IanBenzMaxim 74:23be10c32fa3 798 // check the first CRC16
IanBenzMaxim 74:23be10c32fa3 799 if (!continuing)
IanBenzMaxim 74:23be10c32fa3 800 {
j3 139:f0e0a7976846 801 if (calculateCrc16(buf, offset) != 0xB001)
IanBenzMaxim 74:23be10c32fa3 802 {
IanBenzMaxim 77:529edb329ee0 803 return CrcError;
IanBenzMaxim 74:23be10c32fa3 804 }
IanBenzMaxim 74:23be10c32fa3 805 }
IanBenzMaxim 74:23be10c32fa3 806
IanBenzMaxim 74:23be10c32fa3 807 // check the second CRC16
IanBenzMaxim 79:7f22823a5a2d 808 uint16_t CRC16 = 0;
IanBenzMaxim 25:bdb1c5a53b58 809
IanBenzMaxim 74:23be10c32fa3 810 // DS28E25/DS28E22, crc gets calculagted with CS byte
j3 139:f0e0a7976846 811 if (is_same<T, DS28E22>::value || is_same<T, DS28E25>::value)
IanBenzMaxim 74:23be10c32fa3 812 {
IanBenzMaxim 74:23be10c32fa3 813 if (continuing)
IanBenzMaxim 74:23be10c32fa3 814 {
IanBenzMaxim 78:0cbbac7f2016 815 CRC16 = calculateCrc16(CRC16, 0xAA);
IanBenzMaxim 74:23be10c32fa3 816 }
IanBenzMaxim 74:23be10c32fa3 817 }
IanBenzMaxim 25:bdb1c5a53b58 818
j3 139:f0e0a7976846 819 CRC16 = calculateCrc16(buf + offset, cnt - offset, CRC16);
IanBenzMaxim 25:bdb1c5a53b58 820
IanBenzMaxim 74:23be10c32fa3 821 if (CRC16 != 0xB001)
IanBenzMaxim 74:23be10c32fa3 822 {
IanBenzMaxim 77:529edb329ee0 823 return CrcError;
IanBenzMaxim 74:23be10c32fa3 824 }
IanBenzMaxim 25:bdb1c5a53b58 825
IanBenzMaxim 74:23be10c32fa3 826 // transmit MAC as a block
j3 139:f0e0a7976846 827 master().OWWriteBlock(mac.data(), mac.size());
IanBenzMaxim 25:bdb1c5a53b58 828
IanBenzMaxim 74:23be10c32fa3 829 // calculate CRC on MAC
j3 139:f0e0a7976846 830 CRC16 = calculateCrc16(mac.data(), mac.size());
IanBenzMaxim 25:bdb1c5a53b58 831
IanBenzMaxim 74:23be10c32fa3 832 // append read of CRC16 and CS byte
IanBenzMaxim 77:529edb329ee0 833 master().OWReadBlock(&buf[0], 3);
IanBenzMaxim 74:23be10c32fa3 834 cnt = 3;
IanBenzMaxim 74:23be10c32fa3 835
IanBenzMaxim 74:23be10c32fa3 836 // ckeck CRC16
j3 139:f0e0a7976846 837 CRC16 = calculateCrc16(buf, cnt - 1, CRC16);
IanBenzMaxim 25:bdb1c5a53b58 838
IanBenzMaxim 74:23be10c32fa3 839 if (CRC16 != 0xB001)
IanBenzMaxim 74:23be10c32fa3 840 {
IanBenzMaxim 77:529edb329ee0 841 return CrcError;
IanBenzMaxim 74:23be10c32fa3 842 }
IanBenzMaxim 25:bdb1c5a53b58 843
IanBenzMaxim 74:23be10c32fa3 844 // check CS
IanBenzMaxim 74:23be10c32fa3 845 if (buf[cnt - 1] != 0xAA)
IanBenzMaxim 74:23be10c32fa3 846 {
IanBenzMaxim 74:23be10c32fa3 847 return OperationFailure;
IanBenzMaxim 74:23be10c32fa3 848 }
IanBenzMaxim 25:bdb1c5a53b58 849
IanBenzMaxim 74:23be10c32fa3 850 // send release and strong pull-up
IanBenzMaxim 77:529edb329ee0 851 master().OWWriteBytePower(0xAA);
IanBenzMaxim 25:bdb1c5a53b58 852
IanBenzMaxim 74:23be10c32fa3 853 // now wait for the programming.
IanBenzMaxim 74:23be10c32fa3 854 wait_ms(eepromWriteDelayMs);
IanBenzMaxim 25:bdb1c5a53b58 855
IanBenzMaxim 74:23be10c32fa3 856 // disable strong pullup
IanBenzMaxim 77:529edb329ee0 857 master().OWSetLevel(OneWireMaster::NormalLevel);
IanBenzMaxim 25:bdb1c5a53b58 858
IanBenzMaxim 74:23be10c32fa3 859 // read the CS byte
IanBenzMaxim 77:529edb329ee0 860 master().OWReadByte(cs);
IanBenzMaxim 25:bdb1c5a53b58 861
IanBenzMaxim 74:23be10c32fa3 862 if (cs == 0xAA)
IanBenzMaxim 74:23be10c32fa3 863 {
IanBenzMaxim 74:23be10c32fa3 864 return Success;
IanBenzMaxim 74:23be10c32fa3 865 }
IanBenzMaxim 74:23be10c32fa3 866 // else
IanBenzMaxim 74:23be10c32fa3 867 return OperationFailure;
IanBenzMaxim 25:bdb1c5a53b58 868 }
IanBenzMaxim 25:bdb1c5a53b58 869
IanBenzMaxim 74:23be10c32fa3 870 ISha256MacCoproc::CmdResult DS28E15_22_25::computeSegmentWriteMac(const ISha256MacCoproc & MacCoproc, unsigned int pageNum, unsigned int segmentNum, const Segment & newData, const Segment & oldData, const RomId & romId, const ManId & manId, Mac & mac)
IanBenzMaxim 25:bdb1c5a53b58 871 {
IanBenzMaxim 74:23be10c32fa3 872 ISha256MacCoproc::WriteMacData MT;
IanBenzMaxim 25:bdb1c5a53b58 873
IanBenzMaxim 74:23be10c32fa3 874 // insert ROM number
j3 139:f0e0a7976846 875 std::memcpy(&MT[0], romId.buffer.data(), romId.buffer.size());
IanBenzMaxim 25:bdb1c5a53b58 876
IanBenzMaxim 74:23be10c32fa3 877 MT[11] = segmentNum;
IanBenzMaxim 74:23be10c32fa3 878 MT[10] = pageNum;
IanBenzMaxim 74:23be10c32fa3 879 MT[9] = manId[0];
IanBenzMaxim 74:23be10c32fa3 880 MT[8] = manId[1];
IanBenzMaxim 25:bdb1c5a53b58 881
IanBenzMaxim 74:23be10c32fa3 882 // insert old data
j3 139:f0e0a7976846 883 std::memcpy(&MT[12], oldData.data(), oldData.size());
IanBenzMaxim 25:bdb1c5a53b58 884
IanBenzMaxim 74:23be10c32fa3 885 // insert new data
j3 139:f0e0a7976846 886 std::memcpy(&MT[16], newData.data(), newData.size());
IanBenzMaxim 74:23be10c32fa3 887
IanBenzMaxim 74:23be10c32fa3 888 return MacCoproc.computeWriteMac(MT, mac);
IanBenzMaxim 25:bdb1c5a53b58 889 }
IanBenzMaxim 25:bdb1c5a53b58 890
IanBenzMaxim 73:2cecc1372acc 891 ISha256MacCoproc::CmdResult DS28E15_22_25::computeProtectionWriteMac(const ISha256MacCoproc & MacCoproc, const BlockProtection & newProtection, const BlockProtection & oldProtection, const RomId & romId, const ManId & manId, Mac & mac)
IanBenzMaxim 25:bdb1c5a53b58 892 {
IanBenzMaxim 74:23be10c32fa3 893 ISha256MacCoproc::WriteMacData MT;
IanBenzMaxim 74:23be10c32fa3 894
IanBenzMaxim 74:23be10c32fa3 895 // insert ROM number
j3 139:f0e0a7976846 896 std::memcpy(MT.data(), romId.buffer.data(), romId.buffer.size());
IanBenzMaxim 25:bdb1c5a53b58 897
IanBenzMaxim 74:23be10c32fa3 898 // instert block and page
IanBenzMaxim 74:23be10c32fa3 899 MT[11] = 0;
IanBenzMaxim 74:23be10c32fa3 900 MT[10] = newProtection.blockNum();
IanBenzMaxim 25:bdb1c5a53b58 901
IanBenzMaxim 74:23be10c32fa3 902 MT[9] = manId[0];
IanBenzMaxim 74:23be10c32fa3 903 MT[8] = manId[1];
IanBenzMaxim 25:bdb1c5a53b58 904
IanBenzMaxim 74:23be10c32fa3 905 // old data
IanBenzMaxim 74:23be10c32fa3 906 MT[12] = oldProtection.authProtection() ? 0x01 : 0x00;
IanBenzMaxim 74:23be10c32fa3 907 MT[13] = oldProtection.eepromEmulation() ? 0x01 : 0x00;
IanBenzMaxim 74:23be10c32fa3 908 MT[14] = oldProtection.writeProtection() ? 0x01 : 0x00;
IanBenzMaxim 74:23be10c32fa3 909 MT[15] = oldProtection.readProtection() ? 0x01 : 0x00;
IanBenzMaxim 74:23be10c32fa3 910 // new data
IanBenzMaxim 74:23be10c32fa3 911 MT[16] = newProtection.authProtection() ? 0x01 : 0x00;
IanBenzMaxim 74:23be10c32fa3 912 MT[17] = newProtection.eepromEmulation() ? 0x01 : 0x00;
IanBenzMaxim 74:23be10c32fa3 913 MT[18] = newProtection.writeProtection() ? 0x01 : 0x00;
IanBenzMaxim 74:23be10c32fa3 914 MT[19] = newProtection.readProtection() ? 0x01 : 0x00;
IanBenzMaxim 25:bdb1c5a53b58 915
IanBenzMaxim 74:23be10c32fa3 916 // compute the mac
IanBenzMaxim 74:23be10c32fa3 917 return MacCoproc.computeWriteMac(MT, mac);
IanBenzMaxim 25:bdb1c5a53b58 918 }
IanBenzMaxim 25:bdb1c5a53b58 919
j3 139:f0e0a7976846 920 template <class T>
j3 139:f0e0a7976846 921 OneWireSlave::CmdResult DS28E15_22_25::doWriteAuthSegment(const ISha256MacCoproc & MacCoproc, unsigned int pageNum, unsigned int segmentNum, const Segment & newData, const Segment & oldData, bool continuing)
IanBenzMaxim 25:bdb1c5a53b58 922 {
IanBenzMaxim 74:23be10c32fa3 923 uint8_t buf[256], cs;
IanBenzMaxim 74:23be10c32fa3 924 int cnt, offset;
IanBenzMaxim 74:23be10c32fa3 925
IanBenzMaxim 74:23be10c32fa3 926 cnt = 0;
IanBenzMaxim 74:23be10c32fa3 927 offset = 0;
IanBenzMaxim 25:bdb1c5a53b58 928
IanBenzMaxim 74:23be10c32fa3 929 // check if not continuing a previous block write
IanBenzMaxim 74:23be10c32fa3 930 if (!continuing)
IanBenzMaxim 74:23be10c32fa3 931 {
IanBenzMaxim 77:529edb329ee0 932 if (selectDevice() != OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 933 {
IanBenzMaxim 77:529edb329ee0 934 return CommunicationError;
IanBenzMaxim 77:529edb329ee0 935 }
IanBenzMaxim 77:529edb329ee0 936
IanBenzMaxim 75:8b627804927c 937 buf[cnt++] = AuthWriteMemory;
IanBenzMaxim 74:23be10c32fa3 938 buf[cnt++] = (segmentNum << 5) | pageNum; // address
IanBenzMaxim 74:23be10c32fa3 939
IanBenzMaxim 74:23be10c32fa3 940 // Send command
IanBenzMaxim 77:529edb329ee0 941 master().OWWriteBlock(&buf[0], 2);
IanBenzMaxim 25:bdb1c5a53b58 942
IanBenzMaxim 74:23be10c32fa3 943 // Read CRC
IanBenzMaxim 77:529edb329ee0 944 master().OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 74:23be10c32fa3 945 cnt += 2;
IanBenzMaxim 25:bdb1c5a53b58 946
IanBenzMaxim 74:23be10c32fa3 947 offset = cnt;
IanBenzMaxim 74:23be10c32fa3 948 }
IanBenzMaxim 25:bdb1c5a53b58 949
IanBenzMaxim 74:23be10c32fa3 950 // add the data
j3 139:f0e0a7976846 951 for (size_t i = 0; i < newData.size(); i++)
IanBenzMaxim 74:23be10c32fa3 952 {
IanBenzMaxim 74:23be10c32fa3 953 buf[cnt++] = newData[i];
IanBenzMaxim 74:23be10c32fa3 954 }
IanBenzMaxim 25:bdb1c5a53b58 955
IanBenzMaxim 74:23be10c32fa3 956 // Send data
j3 139:f0e0a7976846 957 master().OWWriteBlock(newData.data(), newData.size());
IanBenzMaxim 25:bdb1c5a53b58 958
IanBenzMaxim 74:23be10c32fa3 959 // read first CRC byte
IanBenzMaxim 77:529edb329ee0 960 master().OWReadByte(buf[cnt++]);
IanBenzMaxim 25:bdb1c5a53b58 961
IanBenzMaxim 74:23be10c32fa3 962 // read the last CRC and enable power
IanBenzMaxim 77:529edb329ee0 963 master().OWReadBytePower(buf[cnt++]);
IanBenzMaxim 25:bdb1c5a53b58 964
IanBenzMaxim 74:23be10c32fa3 965 // now wait for the MAC computation.
IanBenzMaxim 74:23be10c32fa3 966 wait_ms(shaComputationDelayMs);
IanBenzMaxim 25:bdb1c5a53b58 967
IanBenzMaxim 74:23be10c32fa3 968 // disable strong pullup
IanBenzMaxim 77:529edb329ee0 969 master().OWSetLevel(OneWireMaster::NormalLevel);
IanBenzMaxim 25:bdb1c5a53b58 970
IanBenzMaxim 74:23be10c32fa3 971 // check the first CRC16
IanBenzMaxim 74:23be10c32fa3 972 if (!continuing)
IanBenzMaxim 74:23be10c32fa3 973 {
j3 139:f0e0a7976846 974 if (calculateCrc16(buf, offset) != 0xB001)
IanBenzMaxim 74:23be10c32fa3 975 {
IanBenzMaxim 77:529edb329ee0 976 return CrcError;
IanBenzMaxim 74:23be10c32fa3 977 }
IanBenzMaxim 74:23be10c32fa3 978 }
IanBenzMaxim 25:bdb1c5a53b58 979
IanBenzMaxim 74:23be10c32fa3 980 // check the second CRC16
IanBenzMaxim 79:7f22823a5a2d 981 uint16_t CRC16 = 0;
IanBenzMaxim 25:bdb1c5a53b58 982
j3 139:f0e0a7976846 983 // DS28E25/DS28E22, crc gets calculated with CS byte
j3 139:f0e0a7976846 984 if (is_same<T, DS28E22>::value || is_same<T, DS28E25>::value)
IanBenzMaxim 74:23be10c32fa3 985 {
IanBenzMaxim 74:23be10c32fa3 986 if (continuing)
IanBenzMaxim 78:0cbbac7f2016 987 CRC16 = calculateCrc16(CRC16, 0xAA);
IanBenzMaxim 74:23be10c32fa3 988 }
IanBenzMaxim 25:bdb1c5a53b58 989
j3 139:f0e0a7976846 990 CRC16 = calculateCrc16(buf + offset, cnt - offset, CRC16);
IanBenzMaxim 74:23be10c32fa3 991
IanBenzMaxim 74:23be10c32fa3 992 if (CRC16 != 0xB001)
IanBenzMaxim 74:23be10c32fa3 993 {
IanBenzMaxim 77:529edb329ee0 994 return CrcError;
IanBenzMaxim 74:23be10c32fa3 995 }
IanBenzMaxim 25:bdb1c5a53b58 996
IanBenzMaxim 25:bdb1c5a53b58 997 // compute the mac
IanBenzMaxim 74:23be10c32fa3 998 ISha256MacCoproc::CmdResult result;
IanBenzMaxim 74:23be10c32fa3 999 Mac mac;
IanBenzMaxim 82:c11090a32471 1000 result = computeSegmentWriteMac(MacCoproc, pageNum, segmentNum, newData, oldData, romId(), manId(), mac);
IanBenzMaxim 74:23be10c32fa3 1001 if (result != ISha256MacCoproc::Success)
IanBenzMaxim 74:23be10c32fa3 1002 {
IanBenzMaxim 74:23be10c32fa3 1003 return OperationFailure;
IanBenzMaxim 74:23be10c32fa3 1004 }
IanBenzMaxim 25:bdb1c5a53b58 1005
IanBenzMaxim 74:23be10c32fa3 1006 // transmit MAC as a block
j3 139:f0e0a7976846 1007 master().OWWriteBlock(mac.data(), mac.size());
IanBenzMaxim 74:23be10c32fa3 1008
IanBenzMaxim 74:23be10c32fa3 1009 // calculate CRC on MAC
j3 139:f0e0a7976846 1010 CRC16 = calculateCrc16(mac.data(), mac.size());
IanBenzMaxim 25:bdb1c5a53b58 1011
IanBenzMaxim 74:23be10c32fa3 1012 // append read of CRC16 and CS byte
IanBenzMaxim 77:529edb329ee0 1013 master().OWReadBlock(&buf[0], 3);
IanBenzMaxim 74:23be10c32fa3 1014 cnt = 3;
IanBenzMaxim 25:bdb1c5a53b58 1015
IanBenzMaxim 74:23be10c32fa3 1016 // ckeck CRC16
j3 139:f0e0a7976846 1017 CRC16 = calculateCrc16(buf, cnt - 1, CRC16);
IanBenzMaxim 25:bdb1c5a53b58 1018
IanBenzMaxim 74:23be10c32fa3 1019 if (CRC16 != 0xB001)
IanBenzMaxim 74:23be10c32fa3 1020 {
IanBenzMaxim 77:529edb329ee0 1021 return CrcError;
IanBenzMaxim 74:23be10c32fa3 1022 }
IanBenzMaxim 25:bdb1c5a53b58 1023
IanBenzMaxim 74:23be10c32fa3 1024 // check CS
IanBenzMaxim 74:23be10c32fa3 1025 if (buf[cnt - 1] != 0xAA)
IanBenzMaxim 74:23be10c32fa3 1026 {
IanBenzMaxim 74:23be10c32fa3 1027 return OperationFailure;
IanBenzMaxim 74:23be10c32fa3 1028 }
IanBenzMaxim 25:bdb1c5a53b58 1029
IanBenzMaxim 74:23be10c32fa3 1030 // send release and strong pull-up
IanBenzMaxim 77:529edb329ee0 1031 master().OWWriteBytePower(0xAA);
IanBenzMaxim 25:bdb1c5a53b58 1032
IanBenzMaxim 74:23be10c32fa3 1033 // now wait for the programming.
IanBenzMaxim 74:23be10c32fa3 1034 wait_ms(eepromWriteDelayMs);
IanBenzMaxim 25:bdb1c5a53b58 1035
IanBenzMaxim 74:23be10c32fa3 1036 // disable strong pullup
IanBenzMaxim 77:529edb329ee0 1037 master().OWSetLevel(OneWireMaster::NormalLevel);
IanBenzMaxim 25:bdb1c5a53b58 1038
IanBenzMaxim 74:23be10c32fa3 1039 // read the CS byte
IanBenzMaxim 77:529edb329ee0 1040 master().OWReadByte(cs);
IanBenzMaxim 25:bdb1c5a53b58 1041
IanBenzMaxim 74:23be10c32fa3 1042 if (cs == 0xAA)
IanBenzMaxim 74:23be10c32fa3 1043 {
IanBenzMaxim 74:23be10c32fa3 1044 return Success;
IanBenzMaxim 74:23be10c32fa3 1045 }
IanBenzMaxim 74:23be10c32fa3 1046 // else
IanBenzMaxim 74:23be10c32fa3 1047 return OperationFailure;
IanBenzMaxim 25:bdb1c5a53b58 1048 }
IanBenzMaxim 25:bdb1c5a53b58 1049
IanBenzMaxim 50:e967f9befbd0 1050 OneWireSlave::CmdResult DS28E15_22_25::readSegment(unsigned int page, unsigned int segment, Segment & data, bool continuing) const
IanBenzMaxim 25:bdb1c5a53b58 1051 {
IanBenzMaxim 120:200109b73e3c 1052 OneWireMaster::CmdResult result = OneWireMaster::OperationFailure;
IanBenzMaxim 74:23be10c32fa3 1053 uint8_t buf[2];
IanBenzMaxim 74:23be10c32fa3 1054
IanBenzMaxim 74:23be10c32fa3 1055 if (!continuing)
IanBenzMaxim 74:23be10c32fa3 1056 {
IanBenzMaxim 77:529edb329ee0 1057 if (selectDevice() != OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 1058 {
IanBenzMaxim 77:529edb329ee0 1059 return CommunicationError;
IanBenzMaxim 77:529edb329ee0 1060 }
IanBenzMaxim 77:529edb329ee0 1061
IanBenzMaxim 75:8b627804927c 1062 buf[0] = ReadMemory;
IanBenzMaxim 74:23be10c32fa3 1063 buf[1] = (segment << 5) | page;
IanBenzMaxim 74:23be10c32fa3 1064
IanBenzMaxim 74:23be10c32fa3 1065 // Transmit command
IanBenzMaxim 77:529edb329ee0 1066 master().OWWriteBlock(buf, 2);
IanBenzMaxim 74:23be10c32fa3 1067
IanBenzMaxim 74:23be10c32fa3 1068 // Receive CRC
IanBenzMaxim 77:529edb329ee0 1069 result = master().OWReadBlock(buf, 2);
IanBenzMaxim 74:23be10c32fa3 1070 }
IanBenzMaxim 74:23be10c32fa3 1071 else if (segment == 0)
IanBenzMaxim 74:23be10c32fa3 1072 {
IanBenzMaxim 74:23be10c32fa3 1073 // Receive CRC from previous read
IanBenzMaxim 77:529edb329ee0 1074 result = master().OWReadBlock(buf, 2);
IanBenzMaxim 74:23be10c32fa3 1075 }
IanBenzMaxim 74:23be10c32fa3 1076
IanBenzMaxim 74:23be10c32fa3 1077 // Receive data
IanBenzMaxim 74:23be10c32fa3 1078 if (result == OneWireMaster::Success)
IanBenzMaxim 74:23be10c32fa3 1079 {
j3 139:f0e0a7976846 1080 result = master().OWReadBlock(data.data(), data.size());
IanBenzMaxim 74:23be10c32fa3 1081 }
IanBenzMaxim 74:23be10c32fa3 1082
IanBenzMaxim 74:23be10c32fa3 1083 return (result == OneWireMaster::Success ? OneWireSlave::Success : OneWireSlave::CommunicationError);
IanBenzMaxim 25:bdb1c5a53b58 1084 }
IanBenzMaxim 25:bdb1c5a53b58 1085
IanBenzMaxim 74:23be10c32fa3 1086 OneWireSlave::CmdResult DS28E15_22_25::writeSegment(unsigned int page, unsigned int block, const Segment & data, bool continuing)
IanBenzMaxim 25:bdb1c5a53b58 1087 {
IanBenzMaxim 74:23be10c32fa3 1088 uint8_t buf[256], cs;
IanBenzMaxim 120:200109b73e3c 1089 int cnt = 0;
IanBenzMaxim 120:200109b73e3c 1090 int offset = 0;
IanBenzMaxim 25:bdb1c5a53b58 1091
IanBenzMaxim 74:23be10c32fa3 1092 cnt = 0;
IanBenzMaxim 74:23be10c32fa3 1093 offset = 0;
IanBenzMaxim 74:23be10c32fa3 1094
IanBenzMaxim 74:23be10c32fa3 1095 // check if not continuing a previous block write
IanBenzMaxim 74:23be10c32fa3 1096 if (!continuing)
IanBenzMaxim 74:23be10c32fa3 1097 {
IanBenzMaxim 77:529edb329ee0 1098 if (selectDevice() != OneWireMaster::Success)
IanBenzMaxim 77:529edb329ee0 1099 {
IanBenzMaxim 77:529edb329ee0 1100 return CommunicationError;
IanBenzMaxim 77:529edb329ee0 1101 }
IanBenzMaxim 77:529edb329ee0 1102
IanBenzMaxim 75:8b627804927c 1103 buf[cnt++] = WriteMemory;
IanBenzMaxim 74:23be10c32fa3 1104 buf[cnt++] = (block << 5) | page; // address
IanBenzMaxim 25:bdb1c5a53b58 1105
IanBenzMaxim 74:23be10c32fa3 1106 // Send command
IanBenzMaxim 77:529edb329ee0 1107 master().OWWriteBlock(&buf[0], 2);
IanBenzMaxim 25:bdb1c5a53b58 1108
IanBenzMaxim 74:23be10c32fa3 1109 // Read CRC
IanBenzMaxim 77:529edb329ee0 1110 master().OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 74:23be10c32fa3 1111 cnt += 2;
IanBenzMaxim 25:bdb1c5a53b58 1112
IanBenzMaxim 74:23be10c32fa3 1113 offset = cnt;
IanBenzMaxim 74:23be10c32fa3 1114 }
IanBenzMaxim 25:bdb1c5a53b58 1115
IanBenzMaxim 74:23be10c32fa3 1116 // add the data
j3 139:f0e0a7976846 1117 for (size_t i = 0; i < data.size(); i++)
IanBenzMaxim 74:23be10c32fa3 1118 {
IanBenzMaxim 74:23be10c32fa3 1119 buf[cnt++] = data[i];
IanBenzMaxim 74:23be10c32fa3 1120 }
IanBenzMaxim 25:bdb1c5a53b58 1121
IanBenzMaxim 74:23be10c32fa3 1122 // Send data
j3 139:f0e0a7976846 1123 master().OWWriteBlock(data.data(), data.size());
IanBenzMaxim 25:bdb1c5a53b58 1124
IanBenzMaxim 74:23be10c32fa3 1125 // Read CRC
IanBenzMaxim 77:529edb329ee0 1126 master().OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 74:23be10c32fa3 1127 cnt += 2;
IanBenzMaxim 25:bdb1c5a53b58 1128
IanBenzMaxim 74:23be10c32fa3 1129 // check the first CRC16
IanBenzMaxim 74:23be10c32fa3 1130 if (!continuing)
IanBenzMaxim 74:23be10c32fa3 1131 {
j3 139:f0e0a7976846 1132 if (calculateCrc16(buf, offset) != 0xB001)
IanBenzMaxim 74:23be10c32fa3 1133 {
IanBenzMaxim 77:529edb329ee0 1134 return CrcError;
IanBenzMaxim 74:23be10c32fa3 1135 }
IanBenzMaxim 74:23be10c32fa3 1136 }
IanBenzMaxim 74:23be10c32fa3 1137
IanBenzMaxim 74:23be10c32fa3 1138 // check the second CRC16
j3 139:f0e0a7976846 1139 if (calculateCrc16(buf + offset, cnt - offset) != 0xB001)
IanBenzMaxim 74:23be10c32fa3 1140 {
IanBenzMaxim 77:529edb329ee0 1141 return CrcError;
IanBenzMaxim 74:23be10c32fa3 1142 }
IanBenzMaxim 25:bdb1c5a53b58 1143
IanBenzMaxim 74:23be10c32fa3 1144 // send release and strong pull-up
IanBenzMaxim 77:529edb329ee0 1145 master().OWWriteBytePower(0xAA);
IanBenzMaxim 25:bdb1c5a53b58 1146
IanBenzMaxim 74:23be10c32fa3 1147 // now wait for the programming.
IanBenzMaxim 74:23be10c32fa3 1148 wait_ms(eepromWriteDelayMs);
IanBenzMaxim 74:23be10c32fa3 1149
IanBenzMaxim 74:23be10c32fa3 1150 // disable strong pullup
IanBenzMaxim 77:529edb329ee0 1151 master().OWSetLevel(OneWireMaster::NormalLevel);
IanBenzMaxim 25:bdb1c5a53b58 1152
IanBenzMaxim 74:23be10c32fa3 1153 // read the CS byte
IanBenzMaxim 77:529edb329ee0 1154 master().OWReadByte(cs);
IanBenzMaxim 25:bdb1c5a53b58 1155
IanBenzMaxim 74:23be10c32fa3 1156 if (cs == 0xAA)
IanBenzMaxim 74:23be10c32fa3 1157 {
IanBenzMaxim 74:23be10c32fa3 1158 return Success;
IanBenzMaxim 74:23be10c32fa3 1159 }
IanBenzMaxim 74:23be10c32fa3 1160 // else
IanBenzMaxim 74:23be10c32fa3 1161 return OperationFailure;
IanBenzMaxim 25:bdb1c5a53b58 1162 }
IanBenzMaxim 25:bdb1c5a53b58 1163
IanBenzMaxim 73:2cecc1372acc 1164 ISha256MacCoproc::CmdResult DS28E15_22_25::computeNextSecret(ISha256MacCoproc & MacCoproc, const Page & bindingPage, unsigned int bindingPageNum, const Scratchpad & partialSecret, const RomId & romId, const ManId & manId)
IanBenzMaxim 25:bdb1c5a53b58 1165 {
IanBenzMaxim 74:23be10c32fa3 1166 ISha256MacCoproc::SlaveSecretData slaveSecretData;
IanBenzMaxim 25:bdb1c5a53b58 1167
IanBenzMaxim 74:23be10c32fa3 1168 // insert ROM number
j3 139:f0e0a7976846 1169 std::memcpy(slaveSecretData.data(), romId.buffer.data(), romId.buffer.size());
IanBenzMaxim 25:bdb1c5a53b58 1170
IanBenzMaxim 74:23be10c32fa3 1171 slaveSecretData[11] = 0x00;
IanBenzMaxim 74:23be10c32fa3 1172 slaveSecretData[10] = bindingPageNum;
IanBenzMaxim 74:23be10c32fa3 1173 slaveSecretData[9] = manId[0];
IanBenzMaxim 74:23be10c32fa3 1174 slaveSecretData[8] = manId[1];
IanBenzMaxim 25:bdb1c5a53b58 1175
IanBenzMaxim 74:23be10c32fa3 1176 return MacCoproc.computeSlaveSecret(ISha256MacCoproc::DevicePage(bindingPage), partialSecret, slaveSecretData);
IanBenzMaxim 25:bdb1c5a53b58 1177 }
j3 139:f0e0a7976846 1178
j3 139:f0e0a7976846 1179 template <class T, size_t N>
j3 139:f0e0a7976846 1180 OneWireSlave::CmdResult DS28E15_22_25::doReadAllBlockProtection(array<BlockProtection, N> & protection) const
j3 139:f0e0a7976846 1181 {
j3 139:f0e0a7976846 1182 uint8_t buf[N];
j3 139:f0e0a7976846 1183 CmdResult result = readStatus<T>(false, true, 0, buf);
j3 139:f0e0a7976846 1184 if (result == Success)
j3 139:f0e0a7976846 1185 {
j3 139:f0e0a7976846 1186 for (size_t i = 0; i < N; i++)
j3 139:f0e0a7976846 1187 {
j3 139:f0e0a7976846 1188 protection[i].setStatusByte(buf[i]);
j3 139:f0e0a7976846 1189 }
j3 139:f0e0a7976846 1190 }
j3 139:f0e0a7976846 1191 return result;
j3 139:f0e0a7976846 1192 }
j3 139:f0e0a7976846 1193
j3 139:f0e0a7976846 1194 OneWireSlave::CmdResult DS28E15::writeScratchpad(const Scratchpad & data) const
j3 139:f0e0a7976846 1195 {
j3 139:f0e0a7976846 1196 return doWriteScratchpad<DS28E15>(data);
j3 139:f0e0a7976846 1197 }
j3 139:f0e0a7976846 1198
j3 139:f0e0a7976846 1199 OneWireSlave::CmdResult DS28E15::readScratchpad(Scratchpad & data) const
j3 139:f0e0a7976846 1200 {
j3 139:f0e0a7976846 1201 return doReadScratchpad<DS28E15>(data);
j3 139:f0e0a7976846 1202 }
j3 139:f0e0a7976846 1203
j3 139:f0e0a7976846 1204 OneWireSlave::CmdResult DS28E15::readBlockProtection(unsigned int blockNum, BlockProtection & protection) const
j3 139:f0e0a7976846 1205 {
j3 139:f0e0a7976846 1206 return doReadBlockProtection<DS28E15>(blockNum, protection);
j3 139:f0e0a7976846 1207 }
j3 139:f0e0a7976846 1208
j3 139:f0e0a7976846 1209 OneWireSlave::CmdResult DS28E15::readPersonality(Personality & personality) const
j3 139:f0e0a7976846 1210 {
j3 139:f0e0a7976846 1211 return doReadPersonality<DS28E15>(personality);
j3 139:f0e0a7976846 1212 }
j3 139:f0e0a7976846 1213
j3 139:f0e0a7976846 1214 OneWireSlave::CmdResult DS28E15::writeAuthSegment(const ISha256MacCoproc & MacCoproc, unsigned int pageNum, unsigned int segmentNum, const Segment & newData, const Segment & oldData, bool continuing)
j3 139:f0e0a7976846 1215 {
j3 139:f0e0a7976846 1216 return doWriteAuthSegment<DS28E15>(MacCoproc, pageNum, segmentNum, newData, oldData, continuing);
j3 139:f0e0a7976846 1217 }
j3 139:f0e0a7976846 1218
j3 139:f0e0a7976846 1219 OneWireSlave::CmdResult DS28E15::writeAuthSegmentMac(unsigned int pageNum, unsigned int segmentNum, const Segment & newData, const Mac & mac, bool continuing)
j3 139:f0e0a7976846 1220 {
j3 139:f0e0a7976846 1221 return doWriteAuthSegmentMac<DS28E15>(pageNum, segmentNum, newData, mac, continuing);
j3 139:f0e0a7976846 1222 }
j3 139:f0e0a7976846 1223
j3 139:f0e0a7976846 1224 OneWireSlave::CmdResult DS28E15::readAllBlockProtection(array<BlockProtection, protectionBlocks> & protection) const
j3 139:f0e0a7976846 1225 {
j3 139:f0e0a7976846 1226 return doReadAllBlockProtection<DS28E15>(protection);
j3 139:f0e0a7976846 1227 }
j3 139:f0e0a7976846 1228
j3 139:f0e0a7976846 1229 OneWireSlave::CmdResult DS28E22::writeScratchpad(const Scratchpad & data) const
j3 139:f0e0a7976846 1230 {
j3 139:f0e0a7976846 1231 return doWriteScratchpad<DS28E22>(data);
j3 139:f0e0a7976846 1232 }
j3 139:f0e0a7976846 1233
j3 139:f0e0a7976846 1234 OneWireSlave::CmdResult DS28E22::readScratchpad(Scratchpad & data) const
j3 139:f0e0a7976846 1235 {
j3 139:f0e0a7976846 1236 return doReadScratchpad<DS28E22>(data);
j3 139:f0e0a7976846 1237 }
j3 139:f0e0a7976846 1238
j3 139:f0e0a7976846 1239 OneWireSlave::CmdResult DS28E22::readBlockProtection(unsigned int blockNum, BlockProtection & protection) const
j3 139:f0e0a7976846 1240 {
j3 139:f0e0a7976846 1241 return doReadBlockProtection<DS28E22>(blockNum, protection);
j3 139:f0e0a7976846 1242 }
j3 139:f0e0a7976846 1243
j3 139:f0e0a7976846 1244 OneWireSlave::CmdResult DS28E22::readPersonality(Personality & personality) const
j3 139:f0e0a7976846 1245 {
j3 139:f0e0a7976846 1246 return doReadPersonality<DS28E22>(personality);
j3 139:f0e0a7976846 1247 }
j3 139:f0e0a7976846 1248
j3 139:f0e0a7976846 1249 OneWireSlave::CmdResult DS28E22::writeAuthSegment(const ISha256MacCoproc & MacCoproc, unsigned int pageNum, unsigned int segmentNum, const Segment & newData, const Segment & oldData, bool continuing)
j3 139:f0e0a7976846 1250 {
j3 139:f0e0a7976846 1251 return doWriteAuthSegment<DS28E22>(MacCoproc, pageNum, segmentNum, newData, oldData, continuing);
j3 139:f0e0a7976846 1252 }
j3 139:f0e0a7976846 1253
j3 139:f0e0a7976846 1254 OneWireSlave::CmdResult DS28E22::writeAuthSegmentMac(unsigned int pageNum, unsigned int segmentNum, const Segment & newData, const Mac & mac, bool continuing)
j3 139:f0e0a7976846 1255 {
j3 139:f0e0a7976846 1256 return doWriteAuthSegmentMac<DS28E22>(pageNum, segmentNum, newData, mac, continuing);
j3 139:f0e0a7976846 1257 }
j3 139:f0e0a7976846 1258
j3 139:f0e0a7976846 1259 OneWireSlave::CmdResult DS28E22::readAllBlockProtection(array<BlockProtection, protectionBlocks> & protection) const
j3 139:f0e0a7976846 1260 {
j3 139:f0e0a7976846 1261 return doReadAllBlockProtection<DS28E22>(protection);
j3 139:f0e0a7976846 1262 }
j3 139:f0e0a7976846 1263
j3 139:f0e0a7976846 1264 OneWireSlave::CmdResult DS28E25::writeScratchpad(const Scratchpad & data) const
j3 139:f0e0a7976846 1265 {
j3 139:f0e0a7976846 1266 return doWriteScratchpad<DS28E25>(data);
j3 139:f0e0a7976846 1267 }
j3 139:f0e0a7976846 1268
j3 139:f0e0a7976846 1269 OneWireSlave::CmdResult DS28E25::readScratchpad(Scratchpad & data) const
j3 139:f0e0a7976846 1270 {
j3 139:f0e0a7976846 1271 return doReadScratchpad<DS28E25>(data);
j3 139:f0e0a7976846 1272 }
j3 139:f0e0a7976846 1273
j3 139:f0e0a7976846 1274 OneWireSlave::CmdResult DS28E25::readBlockProtection(unsigned int blockNum, BlockProtection & protection) const
j3 139:f0e0a7976846 1275 {
j3 139:f0e0a7976846 1276 return doReadBlockProtection<DS28E25>(blockNum, protection);
j3 139:f0e0a7976846 1277 }
j3 139:f0e0a7976846 1278
j3 139:f0e0a7976846 1279 OneWireSlave::CmdResult DS28E25::readPersonality(Personality & personality) const
j3 139:f0e0a7976846 1280 {
j3 139:f0e0a7976846 1281 return doReadPersonality<DS28E25>(personality);
j3 139:f0e0a7976846 1282 }
j3 139:f0e0a7976846 1283
j3 139:f0e0a7976846 1284 OneWireSlave::CmdResult DS28E25::writeAuthSegment(const ISha256MacCoproc & MacCoproc, unsigned int pageNum, unsigned int segmentNum, const Segment & newData, const Segment & oldData, bool continuing)
j3 139:f0e0a7976846 1285 {
j3 139:f0e0a7976846 1286 return doWriteAuthSegment<DS28E25>(MacCoproc, pageNum, segmentNum, newData, oldData, continuing);
j3 139:f0e0a7976846 1287 }
j3 139:f0e0a7976846 1288
j3 139:f0e0a7976846 1289 OneWireSlave::CmdResult DS28E25::writeAuthSegmentMac(unsigned int pageNum, unsigned int segmentNum, const Segment & newData, const Mac & mac, bool continuing)
j3 139:f0e0a7976846 1290 {
j3 139:f0e0a7976846 1291 return doWriteAuthSegmentMac<DS28E25>(pageNum, segmentNum, newData, mac, continuing);
j3 139:f0e0a7976846 1292 }
j3 139:f0e0a7976846 1293
j3 139:f0e0a7976846 1294 OneWireSlave::CmdResult DS28E25::readAllBlockProtection(array<BlockProtection, protectionBlocks> & protection) const
j3 139:f0e0a7976846 1295 {
j3 139:f0e0a7976846 1296 return doReadAllBlockProtection<DS28E25>(protection);
j3 139:f0e0a7976846 1297 }