Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Committer:
IanBenzMaxim
Date:
Mon May 16 10:36:30 2016 -0500
Revision:
77:529edb329ee0
Parent:
76:84e6c4994e29
Child:
78:0cbbac7f2016
Added iterators for selecting 1-Wire devices on the bus and added support iterator support to OneWireSlave class.

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