Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Committer:
IanBenzMaxim
Date:
Mon May 23 18:57:12 2016 -0500
Revision:
79:7f22823a5a2d
Parent:
78:0cbbac7f2016
Child:
82:c11090a32471
Added comments and minor code cleanup.

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