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

Dependents:   MAXREFDES131_Qt_Demo MAX32630FTHR_iButton_uSD_Logger MAX32630FTHR_DS18B20_uSD_Logger MAXREFDES130_131_Demo ... more

Superseded by MaximInterface.

Committer:
IanBenzMaxim
Date:
Fri Apr 01 09:29:55 2016 -0500
Revision:
34:11fffbe98ef9
Parent:
33:a4c015046956
Child:
49:36954b62f503
Continue code cleanup of DS2465 and DS28E15_22_25.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 25:bdb1c5a53b58 1 //------------Copyright (C) 2013 Maxim Integrated Products --------------
IanBenzMaxim 25:bdb1c5a53b58 2 //
IanBenzMaxim 25:bdb1c5a53b58 3 // Permission is hereby granted, free of charge, to any person obtaining a
IanBenzMaxim 25:bdb1c5a53b58 4 // copy of this software and associated documentation files (the "Software"),
IanBenzMaxim 25:bdb1c5a53b58 5 // to deal in the Software without restriction, including without limitation
IanBenzMaxim 25:bdb1c5a53b58 6 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
IanBenzMaxim 25:bdb1c5a53b58 7 // and/or sell copies of the Software, and to permit persons to whom the
IanBenzMaxim 25:bdb1c5a53b58 8 // Software is furnished to do so, subject to the following conditions:
IanBenzMaxim 25:bdb1c5a53b58 9 //
IanBenzMaxim 25:bdb1c5a53b58 10 // The above copyright notice and this permission notice shall be included
IanBenzMaxim 25:bdb1c5a53b58 11 // in all copies or substantial portions of the Software.
IanBenzMaxim 25:bdb1c5a53b58 12 //
IanBenzMaxim 25:bdb1c5a53b58 13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
IanBenzMaxim 25:bdb1c5a53b58 14 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
IanBenzMaxim 25:bdb1c5a53b58 15 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IanBenzMaxim 25:bdb1c5a53b58 16 // IN NO EVENT SHALL MAXIM INTEGRATED PRODCUTS BE LIABLE FOR ANY CLAIM, DAMAGES
IanBenzMaxim 25:bdb1c5a53b58 17 // OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
IanBenzMaxim 25:bdb1c5a53b58 18 // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
IanBenzMaxim 25:bdb1c5a53b58 19 // OTHER DEALINGS IN THE SOFTWARE.
IanBenzMaxim 25:bdb1c5a53b58 20 //
IanBenzMaxim 25:bdb1c5a53b58 21 // Except as contained in this notice, the name of Maxim Integrated Products
IanBenzMaxim 25:bdb1c5a53b58 22 // shall not be used except as stated in the Maxim Integrated Products
IanBenzMaxim 25:bdb1c5a53b58 23 // Branding Policy.
IanBenzMaxim 25:bdb1c5a53b58 24 // ---------------------------------------------------------------------------
IanBenzMaxim 25:bdb1c5a53b58 25
IanBenzMaxim 25:bdb1c5a53b58 26 #include "DS28E15_22_25.hpp"
IanBenzMaxim 27:d5aaefa252f1 27 #include "OneWire_Masters/OneWireMaster.h"
IanBenzMaxim 25:bdb1c5a53b58 28 #include "mbed.h"
IanBenzMaxim 25:bdb1c5a53b58 29
IanBenzMaxim 25:bdb1c5a53b58 30 // 1-Wire commands
IanBenzMaxim 25:bdb1c5a53b58 31 #define CMD_WRITE_MEMORY 0x55
IanBenzMaxim 25:bdb1c5a53b58 32 #define CMD_READ_MEMORY 0xF0
IanBenzMaxim 25:bdb1c5a53b58 33 #define CMD_LOAD_LOCK_SECRET 0x33
IanBenzMaxim 25:bdb1c5a53b58 34 #define CMD_COMPUTE_LOCK_SECRET 0x3C
IanBenzMaxim 25:bdb1c5a53b58 35 #define CMD_SELECT_SECRET 0x0F
IanBenzMaxim 25:bdb1c5a53b58 36 #define CMD_COMPUTE_PAGEMAC 0xA5
IanBenzMaxim 25:bdb1c5a53b58 37 #define CMD_READ_STATUS 0xAA
IanBenzMaxim 25:bdb1c5a53b58 38 #define CMD_WRITE_BLOCK_PROTECT 0xC3
IanBenzMaxim 25:bdb1c5a53b58 39 #define CMD_WRITE_AUTH_MEMORY 0x5A
IanBenzMaxim 25:bdb1c5a53b58 40 #define CMD_WRITE_AUTH_PROTECT 0xCC
IanBenzMaxim 25:bdb1c5a53b58 41 #define CMD_PIO_READ 0xDD
IanBenzMaxim 25:bdb1c5a53b58 42 #define CMD_PIO_WRITE 0x96
IanBenzMaxim 25:bdb1c5a53b58 43
IanBenzMaxim 34:11fffbe98ef9 44 DS28E15_22_25::BlockProtection::BlockProtection(bool readProtection, bool writeProtection, bool eepromEmulation, bool authProtection, std::uint8_t blockNum)
IanBenzMaxim 34:11fffbe98ef9 45 {
IanBenzMaxim 34:11fffbe98ef9 46 setReadProtection(readProtection);
IanBenzMaxim 34:11fffbe98ef9 47 setWriteProtection(writeProtection);
IanBenzMaxim 34:11fffbe98ef9 48 setEepromEmulation(eepromEmulation);
IanBenzMaxim 34:11fffbe98ef9 49 setAuthProtection(authProtection);
IanBenzMaxim 34:11fffbe98ef9 50 setBlockNum(blockNum);
IanBenzMaxim 34:11fffbe98ef9 51 }
IanBenzMaxim 34:11fffbe98ef9 52
IanBenzMaxim 34:11fffbe98ef9 53 void DS28E15_22_25::BlockProtection::setBlockNum(std::uint8_t blockNum)
IanBenzMaxim 34:11fffbe98ef9 54 {
IanBenzMaxim 34:11fffbe98ef9 55 m_status &= ~blockNumMask;
IanBenzMaxim 34:11fffbe98ef9 56 m_status |= (blockNum & blockNumMask);
IanBenzMaxim 34:11fffbe98ef9 57 }
IanBenzMaxim 34:11fffbe98ef9 58
IanBenzMaxim 34:11fffbe98ef9 59 bool DS28E15_22_25::BlockProtection::noProtection() const
IanBenzMaxim 34:11fffbe98ef9 60 {
IanBenzMaxim 34:11fffbe98ef9 61 return !readProtection() && !writeProtection() && !eepromEmulation() && !authProtection();
IanBenzMaxim 34:11fffbe98ef9 62 }
IanBenzMaxim 25:bdb1c5a53b58 63
IanBenzMaxim 34:11fffbe98ef9 64 void DS28E15_22_25::BlockProtection::setReadProtection(bool readProtection)
IanBenzMaxim 34:11fffbe98ef9 65 {
IanBenzMaxim 34:11fffbe98ef9 66 if (readProtection)
IanBenzMaxim 34:11fffbe98ef9 67 m_status |= readProtectionMask;
IanBenzMaxim 34:11fffbe98ef9 68 else
IanBenzMaxim 34:11fffbe98ef9 69 m_status &= ~readProtectionMask;
IanBenzMaxim 34:11fffbe98ef9 70 }
IanBenzMaxim 34:11fffbe98ef9 71
IanBenzMaxim 34:11fffbe98ef9 72 void DS28E15_22_25::BlockProtection::setWriteProtection(bool writeProtection)
IanBenzMaxim 34:11fffbe98ef9 73 {
IanBenzMaxim 34:11fffbe98ef9 74 if (writeProtection)
IanBenzMaxim 34:11fffbe98ef9 75 m_status |= writeProtectionMask;
IanBenzMaxim 34:11fffbe98ef9 76 else
IanBenzMaxim 34:11fffbe98ef9 77 m_status &= ~writeProtectionMask;
IanBenzMaxim 34:11fffbe98ef9 78 }
IanBenzMaxim 25:bdb1c5a53b58 79
IanBenzMaxim 34:11fffbe98ef9 80 void DS28E15_22_25::BlockProtection::setEepromEmulation(bool eepromEmulation)
IanBenzMaxim 34:11fffbe98ef9 81 {
IanBenzMaxim 34:11fffbe98ef9 82 if (eepromEmulation)
IanBenzMaxim 34:11fffbe98ef9 83 m_status |= eepromEmulationMask;
IanBenzMaxim 34:11fffbe98ef9 84 else
IanBenzMaxim 34:11fffbe98ef9 85 m_status &= ~eepromEmulationMask;
IanBenzMaxim 34:11fffbe98ef9 86 }
IanBenzMaxim 34:11fffbe98ef9 87
IanBenzMaxim 34:11fffbe98ef9 88 void DS28E15_22_25::BlockProtection::setAuthProtection(bool authProtection)
IanBenzMaxim 34:11fffbe98ef9 89 {
IanBenzMaxim 34:11fffbe98ef9 90 if (authProtection)
IanBenzMaxim 34:11fffbe98ef9 91 m_status |= authProtectionMask;
IanBenzMaxim 34:11fffbe98ef9 92 else
IanBenzMaxim 34:11fffbe98ef9 93 m_status &= ~authProtectionMask;
IanBenzMaxim 34:11fffbe98ef9 94 }
IanBenzMaxim 34:11fffbe98ef9 95
IanBenzMaxim 34:11fffbe98ef9 96 DS28E15_22_25::DS28E15_22_25(OneWireMaster& OW_master, bool lowVoltage)
IanBenzMaxim 34:11fffbe98ef9 97 : lowVoltage(lowVoltage), m_OW_master(OW_master)
IanBenzMaxim 25:bdb1c5a53b58 98 {
IanBenzMaxim 33:a4c015046956 99 std::memset(manId, 0x00, manId.length);
IanBenzMaxim 25:bdb1c5a53b58 100 }
IanBenzMaxim 25:bdb1c5a53b58 101
IanBenzMaxim 34:11fffbe98ef9 102 DS28E15_22_25::MemoryPages DS28E15_22_25::memoryPages()
IanBenzMaxim 25:bdb1c5a53b58 103 {
IanBenzMaxim 34:11fffbe98ef9 104 MemoryPages pages;
IanBenzMaxim 25:bdb1c5a53b58 105
IanBenzMaxim 25:bdb1c5a53b58 106 switch (romId.familyCode())
IanBenzMaxim 25:bdb1c5a53b58 107 {
IanBenzMaxim 25:bdb1c5a53b58 108 case DS28E25_FAMILY:
IanBenzMaxim 25:bdb1c5a53b58 109 pages = DS28E25_PAGES;
IanBenzMaxim 25:bdb1c5a53b58 110 break;
IanBenzMaxim 25:bdb1c5a53b58 111
IanBenzMaxim 25:bdb1c5a53b58 112 case DS28E22_FAMILY:
IanBenzMaxim 25:bdb1c5a53b58 113 pages = DS28E22_PAGES;
IanBenzMaxim 25:bdb1c5a53b58 114 break;
IanBenzMaxim 25:bdb1c5a53b58 115
IanBenzMaxim 25:bdb1c5a53b58 116 case DS28E15_FAMILY:
IanBenzMaxim 25:bdb1c5a53b58 117 pages = DS28E15_PAGES;
IanBenzMaxim 25:bdb1c5a53b58 118 break;
IanBenzMaxim 25:bdb1c5a53b58 119
IanBenzMaxim 25:bdb1c5a53b58 120 default:
IanBenzMaxim 25:bdb1c5a53b58 121 pages = UNKNOWN_PAGES;
IanBenzMaxim 25:bdb1c5a53b58 122 break;
IanBenzMaxim 25:bdb1c5a53b58 123 }
IanBenzMaxim 25:bdb1c5a53b58 124
IanBenzMaxim 25:bdb1c5a53b58 125 return pages;
IanBenzMaxim 25:bdb1c5a53b58 126 }
IanBenzMaxim 25:bdb1c5a53b58 127
IanBenzMaxim 34:11fffbe98ef9 128 DS28E15_22_25::ProtectionBlocks DS28E15_22_25::protectionBlocks()
IanBenzMaxim 25:bdb1c5a53b58 129 {
IanBenzMaxim 34:11fffbe98ef9 130 ProtectionBlocks blocks;
IanBenzMaxim 25:bdb1c5a53b58 131
IanBenzMaxim 25:bdb1c5a53b58 132 switch (romId.familyCode())
IanBenzMaxim 25:bdb1c5a53b58 133 {
IanBenzMaxim 25:bdb1c5a53b58 134 case DS28E25_FAMILY:
IanBenzMaxim 25:bdb1c5a53b58 135 blocks = DS28E25_BLOCKS;
IanBenzMaxim 25:bdb1c5a53b58 136 break;
IanBenzMaxim 25:bdb1c5a53b58 137
IanBenzMaxim 25:bdb1c5a53b58 138 case DS28E22_FAMILY:
IanBenzMaxim 25:bdb1c5a53b58 139 blocks = DS28E22_BLOCKS;
IanBenzMaxim 25:bdb1c5a53b58 140 break;
IanBenzMaxim 25:bdb1c5a53b58 141
IanBenzMaxim 25:bdb1c5a53b58 142 case DS28E15_FAMILY:
IanBenzMaxim 25:bdb1c5a53b58 143 blocks = DS28E15_BLOCKS;
IanBenzMaxim 25:bdb1c5a53b58 144 break;
IanBenzMaxim 25:bdb1c5a53b58 145
IanBenzMaxim 25:bdb1c5a53b58 146 default:
IanBenzMaxim 25:bdb1c5a53b58 147 blocks = UNKNOWN_BLOCKS;
IanBenzMaxim 25:bdb1c5a53b58 148 break;
IanBenzMaxim 25:bdb1c5a53b58 149 }
IanBenzMaxim 25:bdb1c5a53b58 150
IanBenzMaxim 25:bdb1c5a53b58 151 return blocks;
IanBenzMaxim 25:bdb1c5a53b58 152 }
IanBenzMaxim 25:bdb1c5a53b58 153
IanBenzMaxim 25:bdb1c5a53b58 154 //--------------------------------------------------------------------------
IanBenzMaxim 25:bdb1c5a53b58 155 // Write page protection byte.
IanBenzMaxim 25:bdb1c5a53b58 156 //
IanBenzMaxim 25:bdb1c5a53b58 157 // Parameters
IanBenzMaxim 25:bdb1c5a53b58 158 // block - block number (0 to 7) which covers two pages each
IanBenzMaxim 25:bdb1c5a53b58 159 // new_value - new protection byte
IanBenzMaxim 25:bdb1c5a53b58 160 // old_value - old protection byte
IanBenzMaxim 25:bdb1c5a53b58 161 // manid - manufacturer ID
IanBenzMaxim 25:bdb1c5a53b58 162 // contflag - Flag to indicate the write is continued from the last
IanBenzMaxim 25:bdb1c5a53b58 163 //
IanBenzMaxim 25:bdb1c5a53b58 164 // Returns: true - protection written
IanBenzMaxim 25:bdb1c5a53b58 165 // false - Failed to set protection
IanBenzMaxim 25:bdb1c5a53b58 166 //
IanBenzMaxim 34:11fffbe98ef9 167 OneWireSlave::CmdResult DS28E15_22_25::writeAuthBlockProtection(const ISha256MacCoprocessor & MacCoproc, const BlockProtection & newProtection, const BlockProtection & oldProtection, bool contflag)
IanBenzMaxim 25:bdb1c5a53b58 168 {
IanBenzMaxim 25:bdb1c5a53b58 169 std::uint8_t buf[256], cs;
IanBenzMaxim 25:bdb1c5a53b58 170 int cnt = 0;
IanBenzMaxim 33:a4c015046956 171 Mac mac;
IanBenzMaxim 25:bdb1c5a53b58 172
IanBenzMaxim 25:bdb1c5a53b58 173 buf[cnt++] = CMD_WRITE_AUTH_PROTECT;
IanBenzMaxim 34:11fffbe98ef9 174 buf[cnt++] = newProtection.status();
IanBenzMaxim 25:bdb1c5a53b58 175
IanBenzMaxim 25:bdb1c5a53b58 176 // Send command
IanBenzMaxim 25:bdb1c5a53b58 177 m_OW_master.OWWriteBlock(&buf[0], 2);
IanBenzMaxim 25:bdb1c5a53b58 178
IanBenzMaxim 25:bdb1c5a53b58 179 // read first CRC byte
IanBenzMaxim 25:bdb1c5a53b58 180 m_OW_master.OWReadByte(buf[cnt++]);
IanBenzMaxim 25:bdb1c5a53b58 181
IanBenzMaxim 25:bdb1c5a53b58 182 // read the last CRC and enable
IanBenzMaxim 25:bdb1c5a53b58 183 m_OW_master.OWReadBytePower(buf[cnt++]);
IanBenzMaxim 25:bdb1c5a53b58 184
IanBenzMaxim 25:bdb1c5a53b58 185 // now wait for the MAC computation.
IanBenzMaxim 34:11fffbe98ef9 186 wait_ms(shaComputationDelayMs);
IanBenzMaxim 25:bdb1c5a53b58 187
IanBenzMaxim 25:bdb1c5a53b58 188 // disable strong pullup
IanBenzMaxim 32:bce180b544ed 189 m_OW_master.OWSetLevel(OneWireMaster::LEVEL_NORMAL);
IanBenzMaxim 25:bdb1c5a53b58 190
IanBenzMaxim 25:bdb1c5a53b58 191 // check CRC16
IanBenzMaxim 25:bdb1c5a53b58 192 if (OneWireMaster::calculateCRC16(buf, 0, cnt) != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 193 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 194
IanBenzMaxim 25:bdb1c5a53b58 195 ISha256MacCoprocessor::CmdResult result;
IanBenzMaxim 34:11fffbe98ef9 196 result = calculateProtectionWriteMac(MacCoproc, newProtection, oldProtection, romId, manId, mac);
IanBenzMaxim 25:bdb1c5a53b58 197 if (result != ISha256MacCoprocessor::Success)
IanBenzMaxim 25:bdb1c5a53b58 198 return OperationFailure;
IanBenzMaxim 33:a4c015046956 199 cnt = 0;
IanBenzMaxim 25:bdb1c5a53b58 200
IanBenzMaxim 25:bdb1c5a53b58 201 // send the MAC
IanBenzMaxim 33:a4c015046956 202 m_OW_master.OWWriteBlock(mac, mac.length);
IanBenzMaxim 25:bdb1c5a53b58 203
IanBenzMaxim 25:bdb1c5a53b58 204 // Read CRC and CS byte
IanBenzMaxim 25:bdb1c5a53b58 205 m_OW_master.OWReadBlock(&buf[cnt], 3);
IanBenzMaxim 25:bdb1c5a53b58 206 cnt += 3;
IanBenzMaxim 25:bdb1c5a53b58 207
IanBenzMaxim 25:bdb1c5a53b58 208 // ckeck CRC16
IanBenzMaxim 25:bdb1c5a53b58 209 if (OneWireMaster::calculateCRC16(buf, 0, (cnt - 1)) != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 210 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 211
IanBenzMaxim 25:bdb1c5a53b58 212 // check CS
IanBenzMaxim 25:bdb1c5a53b58 213 if (buf[cnt-1] != 0xAA)
IanBenzMaxim 25:bdb1c5a53b58 214 return OperationFailure;
IanBenzMaxim 25:bdb1c5a53b58 215
IanBenzMaxim 25:bdb1c5a53b58 216 // send release and strong pull-up
IanBenzMaxim 25:bdb1c5a53b58 217 // DATASHEET_CORRECTION - last bit in release is a read-zero so don't check echo of write byte
IanBenzMaxim 25:bdb1c5a53b58 218 m_OW_master.OWWriteBytePower(0xAA);
IanBenzMaxim 25:bdb1c5a53b58 219
IanBenzMaxim 34:11fffbe98ef9 220 // now wait for the programming.
IanBenzMaxim 34:11fffbe98ef9 221 wait_ms(eepromWriteDelayMs);
IanBenzMaxim 25:bdb1c5a53b58 222
IanBenzMaxim 25:bdb1c5a53b58 223 // disable strong pullup
IanBenzMaxim 32:bce180b544ed 224 m_OW_master.OWSetLevel(OneWireMaster::LEVEL_NORMAL);
IanBenzMaxim 25:bdb1c5a53b58 225
IanBenzMaxim 25:bdb1c5a53b58 226 // read the CS byte
IanBenzMaxim 25:bdb1c5a53b58 227 m_OW_master.OWReadByte(cs);
IanBenzMaxim 25:bdb1c5a53b58 228
IanBenzMaxim 25:bdb1c5a53b58 229 if (cs == 0xAA)
IanBenzMaxim 25:bdb1c5a53b58 230 return Success;
IanBenzMaxim 25:bdb1c5a53b58 231 // else
IanBenzMaxim 25:bdb1c5a53b58 232 return OperationFailure;
IanBenzMaxim 25:bdb1c5a53b58 233 }
IanBenzMaxim 25:bdb1c5a53b58 234
IanBenzMaxim 25:bdb1c5a53b58 235 //--------------------------------------------------------------------------
IanBenzMaxim 25:bdb1c5a53b58 236 // Write page protection byte.
IanBenzMaxim 25:bdb1c5a53b58 237 //
IanBenzMaxim 25:bdb1c5a53b58 238 // Parameters
IanBenzMaxim 25:bdb1c5a53b58 239 // block - block number (0 to 7) which covers two pages each
IanBenzMaxim 25:bdb1c5a53b58 240 // prot - protection byte
IanBenzMaxim 25:bdb1c5a53b58 241 // contflag - Flag to indicate the write is continued from the last
IanBenzMaxim 25:bdb1c5a53b58 242 //
IanBenzMaxim 25:bdb1c5a53b58 243 // Returns: true - protection written
IanBenzMaxim 25:bdb1c5a53b58 244 // false - Failed to set protection
IanBenzMaxim 25:bdb1c5a53b58 245 //
IanBenzMaxim 34:11fffbe98ef9 246 OneWireSlave::CmdResult DS28E15_22_25::writeBlockProtection(const BlockProtection & protection, bool continuing)
IanBenzMaxim 25:bdb1c5a53b58 247 {
IanBenzMaxim 25:bdb1c5a53b58 248 std::uint8_t buf[256], cs;
IanBenzMaxim 25:bdb1c5a53b58 249 int cnt = 0;
IanBenzMaxim 25:bdb1c5a53b58 250
IanBenzMaxim 25:bdb1c5a53b58 251 // check if not continuing a previous block write
IanBenzMaxim 25:bdb1c5a53b58 252 if (!continuing)
IanBenzMaxim 25:bdb1c5a53b58 253 {
IanBenzMaxim 25:bdb1c5a53b58 254 buf[cnt++] = CMD_WRITE_BLOCK_PROTECT;
IanBenzMaxim 25:bdb1c5a53b58 255 }
IanBenzMaxim 25:bdb1c5a53b58 256
IanBenzMaxim 25:bdb1c5a53b58 257 // compute parameter byte
IanBenzMaxim 34:11fffbe98ef9 258 buf[cnt++] = protection.status();
IanBenzMaxim 25:bdb1c5a53b58 259
IanBenzMaxim 25:bdb1c5a53b58 260 m_OW_master.OWWriteBlock(&buf[0], cnt);
IanBenzMaxim 25:bdb1c5a53b58 261
IanBenzMaxim 25:bdb1c5a53b58 262 // Read CRC
IanBenzMaxim 25:bdb1c5a53b58 263 m_OW_master.OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 25:bdb1c5a53b58 264 cnt += 2;
IanBenzMaxim 25:bdb1c5a53b58 265
IanBenzMaxim 25:bdb1c5a53b58 266 // check CRC16
IanBenzMaxim 25:bdb1c5a53b58 267 if (OneWireMaster::calculateCRC16(buf, 0, cnt) != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 268 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 269
IanBenzMaxim 25:bdb1c5a53b58 270 // DATASHEET_CORRECTION, on continue need second release byte
IanBenzMaxim 25:bdb1c5a53b58 271 if (continuing)
IanBenzMaxim 25:bdb1c5a53b58 272 m_OW_master.OWWriteByte(0xAA);
IanBenzMaxim 25:bdb1c5a53b58 273
IanBenzMaxim 25:bdb1c5a53b58 274 // sent release
IanBenzMaxim 25:bdb1c5a53b58 275 m_OW_master.OWWriteBytePower(0xAA);
IanBenzMaxim 25:bdb1c5a53b58 276
IanBenzMaxim 34:11fffbe98ef9 277 // now wait for the programming.
IanBenzMaxim 34:11fffbe98ef9 278 wait_ms(eepromWriteDelayMs);
IanBenzMaxim 25:bdb1c5a53b58 279
IanBenzMaxim 25:bdb1c5a53b58 280 // disable strong pullup
IanBenzMaxim 32:bce180b544ed 281 m_OW_master.OWSetLevel(OneWireMaster::LEVEL_NORMAL);
IanBenzMaxim 25:bdb1c5a53b58 282
IanBenzMaxim 25:bdb1c5a53b58 283 // read the CS byte
IanBenzMaxim 25:bdb1c5a53b58 284 m_OW_master.OWReadByte(cs);
IanBenzMaxim 25:bdb1c5a53b58 285
IanBenzMaxim 25:bdb1c5a53b58 286 if (cs == 0xAA)
IanBenzMaxim 25:bdb1c5a53b58 287 return Success;
IanBenzMaxim 25:bdb1c5a53b58 288 // else
IanBenzMaxim 25:bdb1c5a53b58 289 return OperationFailure;
IanBenzMaxim 25:bdb1c5a53b58 290 }
IanBenzMaxim 25:bdb1c5a53b58 291
IanBenzMaxim 25:bdb1c5a53b58 292
IanBenzMaxim 25:bdb1c5a53b58 293
IanBenzMaxim 25:bdb1c5a53b58 294
IanBenzMaxim 34:11fffbe98ef9 295 OneWireSlave::CmdResult DS28E15_22_25::readBlockProtection(unsigned int blockNum, BlockProtection & protection)
IanBenzMaxim 25:bdb1c5a53b58 296 {
IanBenzMaxim 34:11fffbe98ef9 297 std::uint8_t buf;
IanBenzMaxim 34:11fffbe98ef9 298 CmdResult result = readStatus(false, false, blockNum, &buf);
IanBenzMaxim 25:bdb1c5a53b58 299 if (result == Success)
IanBenzMaxim 34:11fffbe98ef9 300 protection.setStatus(buf);
IanBenzMaxim 25:bdb1c5a53b58 301 return result;
IanBenzMaxim 25:bdb1c5a53b58 302 }
IanBenzMaxim 25:bdb1c5a53b58 303
IanBenzMaxim 25:bdb1c5a53b58 304 //--------------------------------------------------------------------------
IanBenzMaxim 25:bdb1c5a53b58 305 // Read status bytes, either personality or page protection.
IanBenzMaxim 25:bdb1c5a53b58 306 //
IanBenzMaxim 25:bdb1c5a53b58 307 // Parameters
IanBenzMaxim 25:bdb1c5a53b58 308 // personality - flag to indicate the read is the 4 personality bytes (true)
IanBenzMaxim 25:bdb1c5a53b58 309 // or page page protection (false)
IanBenzMaxim 25:bdb1c5a53b58 310 // allpages - flag to indicate if just one page (false) or all (true) page protection
IanBenzMaxim 25:bdb1c5a53b58 311 // bytes.
IanBenzMaxim 25:bdb1c5a53b58 312 // page_num - page number if reading protection 0 to 1
IanBenzMaxim 25:bdb1c5a53b58 313 // rdbuf - 16 byte buffer personality bytes (length 4) or page protection
IanBenzMaxim 25:bdb1c5a53b58 314 // (length 1 or 16)
IanBenzMaxim 25:bdb1c5a53b58 315 //
IanBenzMaxim 25:bdb1c5a53b58 316 // Returns: true - status read
IanBenzMaxim 25:bdb1c5a53b58 317 // false - Failed to read status
IanBenzMaxim 25:bdb1c5a53b58 318 //
IanBenzMaxim 34:11fffbe98ef9 319 OneWireSlave::CmdResult DS28E15_22_25::readStatus(bool personality, bool allpages, unsigned int pageNum, std::uint8_t * rdbuf) const
IanBenzMaxim 25:bdb1c5a53b58 320 {
IanBenzMaxim 34:11fffbe98ef9 321 std::uint8_t buf[256];
IanBenzMaxim 25:bdb1c5a53b58 322 int cnt, offset, rdnum;
IanBenzMaxim 25:bdb1c5a53b58 323
IanBenzMaxim 25:bdb1c5a53b58 324 cnt = 0;
IanBenzMaxim 25:bdb1c5a53b58 325 offset = 0;
IanBenzMaxim 25:bdb1c5a53b58 326
IanBenzMaxim 25:bdb1c5a53b58 327 buf[cnt++] = CMD_READ_STATUS;
IanBenzMaxim 25:bdb1c5a53b58 328 if (personality)
IanBenzMaxim 25:bdb1c5a53b58 329 buf[cnt++] = 0xE0;
IanBenzMaxim 25:bdb1c5a53b58 330 else if (!allpages)
IanBenzMaxim 25:bdb1c5a53b58 331 buf[cnt++] = pageNum;
IanBenzMaxim 25:bdb1c5a53b58 332 else
IanBenzMaxim 25:bdb1c5a53b58 333 buf[cnt++] = 0;
IanBenzMaxim 25:bdb1c5a53b58 334
IanBenzMaxim 25:bdb1c5a53b58 335 // send the command
IanBenzMaxim 25:bdb1c5a53b58 336 m_OW_master.OWWriteBlock(&buf[0], 2);
IanBenzMaxim 25:bdb1c5a53b58 337
IanBenzMaxim 25:bdb1c5a53b58 338 offset = cnt + 2;
IanBenzMaxim 25:bdb1c5a53b58 339
IanBenzMaxim 25:bdb1c5a53b58 340 // adjust data length
IanBenzMaxim 25:bdb1c5a53b58 341 if ((romId.familyCode() == DS28E25_FAMILY) || (romId.familyCode() == DS28E22_FAMILY))
IanBenzMaxim 25:bdb1c5a53b58 342 {
IanBenzMaxim 25:bdb1c5a53b58 343 if (personality)
IanBenzMaxim 25:bdb1c5a53b58 344 rdnum = 8;
IanBenzMaxim 25:bdb1c5a53b58 345 else if (allpages)
IanBenzMaxim 25:bdb1c5a53b58 346 rdnum = 20;
IanBenzMaxim 25:bdb1c5a53b58 347 else
IanBenzMaxim 25:bdb1c5a53b58 348 rdnum = 5;
IanBenzMaxim 25:bdb1c5a53b58 349 }
IanBenzMaxim 25:bdb1c5a53b58 350 else
IanBenzMaxim 25:bdb1c5a53b58 351 {
IanBenzMaxim 25:bdb1c5a53b58 352 if ((personality) || (allpages))
IanBenzMaxim 25:bdb1c5a53b58 353 rdnum = 8;
IanBenzMaxim 25:bdb1c5a53b58 354 else
IanBenzMaxim 25:bdb1c5a53b58 355 rdnum = 5;
IanBenzMaxim 25:bdb1c5a53b58 356 }
IanBenzMaxim 25:bdb1c5a53b58 357
IanBenzMaxim 25:bdb1c5a53b58 358 // Read the bytes
IanBenzMaxim 25:bdb1c5a53b58 359 m_OW_master.OWReadBlock(&buf[cnt],rdnum);
IanBenzMaxim 25:bdb1c5a53b58 360 cnt += rdnum;
IanBenzMaxim 25:bdb1c5a53b58 361
IanBenzMaxim 25:bdb1c5a53b58 362 // check the first CRC16
IanBenzMaxim 25:bdb1c5a53b58 363 if (OneWireMaster::calculateCRC16(buf, 0, offset) != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 364 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 365
IanBenzMaxim 25:bdb1c5a53b58 366 if ((((romId.familyCode() == DS28E25_FAMILY) || (romId.familyCode() == DS28E22_FAMILY))
IanBenzMaxim 25:bdb1c5a53b58 367 && (allpages || (pageNum == 15))) ||
IanBenzMaxim 25:bdb1c5a53b58 368 (personality || allpages || (pageNum == 1)))
IanBenzMaxim 25:bdb1c5a53b58 369 {
IanBenzMaxim 25:bdb1c5a53b58 370 // check the second CRC16
IanBenzMaxim 25:bdb1c5a53b58 371 if (OneWireMaster::calculateCRC16(buf, offset, (cnt - offset)) != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 372 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 373 }
IanBenzMaxim 25:bdb1c5a53b58 374
IanBenzMaxim 25:bdb1c5a53b58 375 // copy the data to the read buffer
IanBenzMaxim 25:bdb1c5a53b58 376 memcpy(rdbuf, &buf[offset], rdnum - 4);
IanBenzMaxim 25:bdb1c5a53b58 377
IanBenzMaxim 25:bdb1c5a53b58 378 return Success;
IanBenzMaxim 25:bdb1c5a53b58 379 }
IanBenzMaxim 25:bdb1c5a53b58 380
IanBenzMaxim 25:bdb1c5a53b58 381
IanBenzMaxim 25:bdb1c5a53b58 382
IanBenzMaxim 25:bdb1c5a53b58 383
IanBenzMaxim 34:11fffbe98ef9 384 ISha256MacCoprocessor::CmdResult DS28E15_22_25::calculateAuthMac(const ISha256MacCoprocessor & MacCoproc, unsigned int pageNum, const Scratchpad & challenge, const Page & pageData, const RomId & romId, const ManId & manId, bool anon, Mac & mac)
IanBenzMaxim 25:bdb1c5a53b58 385 {
IanBenzMaxim 33:a4c015046956 386 ISha256MacCoprocessor::AuthMacData authMacData;
IanBenzMaxim 25:bdb1c5a53b58 387
IanBenzMaxim 25:bdb1c5a53b58 388 // insert ROM number or FF
IanBenzMaxim 25:bdb1c5a53b58 389 if (anon)
IanBenzMaxim 33:a4c015046956 390 std::memset(authMacData, 0xFF, RomId::byteLen);
IanBenzMaxim 25:bdb1c5a53b58 391 else
IanBenzMaxim 33:a4c015046956 392 std::memcpy(authMacData, romId, RomId::byteLen);
IanBenzMaxim 25:bdb1c5a53b58 393
IanBenzMaxim 33:a4c015046956 394 authMacData[10] = pageNum;
IanBenzMaxim 25:bdb1c5a53b58 395
IanBenzMaxim 33:a4c015046956 396 authMacData[9] = manId[0];
IanBenzMaxim 33:a4c015046956 397 authMacData[8] = manId[1];
IanBenzMaxim 25:bdb1c5a53b58 398
IanBenzMaxim 33:a4c015046956 399 authMacData[11] = 0x00;
IanBenzMaxim 25:bdb1c5a53b58 400
IanBenzMaxim 33:a4c015046956 401 return MacCoproc.computeAuthMac(pageData, challenge, authMacData, mac);
IanBenzMaxim 25:bdb1c5a53b58 402 }
IanBenzMaxim 25:bdb1c5a53b58 403
IanBenzMaxim 25:bdb1c5a53b58 404 //--------------------------------------------------------------------------
IanBenzMaxim 25:bdb1c5a53b58 405 // Do Compute Page MAC command and return MAC. Optionally do
IanBenzMaxim 25:bdb1c5a53b58 406 // annonymous mode (anon != 0).
IanBenzMaxim 25:bdb1c5a53b58 407 //
IanBenzMaxim 25:bdb1c5a53b58 408 // Parameters
IanBenzMaxim 25:bdb1c5a53b58 409 // sn - secret number 0 or 1
IanBenzMaxim 25:bdb1c5a53b58 410 // page_num - page number to read 0 - 16
IanBenzMaxim 25:bdb1c5a53b58 411 // challange - 32 byte buffer containing the challenge
IanBenzMaxim 25:bdb1c5a53b58 412 // mac - 32 byte buffer for page data read
IanBenzMaxim 25:bdb1c5a53b58 413 // anon - Flag to indicate Annonymous mode
IanBenzMaxim 25:bdb1c5a53b58 414 //
IanBenzMaxim 25:bdb1c5a53b58 415 // Returns: true - page read has correct MAC
IanBenzMaxim 25:bdb1c5a53b58 416 // false - Failed to read page or incorrect MAC
IanBenzMaxim 25:bdb1c5a53b58 417 //
IanBenzMaxim 34:11fffbe98ef9 418 OneWireSlave::CmdResult DS28E15_22_25::computeReadPageMAC(unsigned int page_num, bool anon, Mac & mac) const
IanBenzMaxim 25:bdb1c5a53b58 419 {
IanBenzMaxim 25:bdb1c5a53b58 420 std::uint8_t buf[256],cs;
IanBenzMaxim 25:bdb1c5a53b58 421 int cnt = 0;
IanBenzMaxim 25:bdb1c5a53b58 422
IanBenzMaxim 25:bdb1c5a53b58 423 buf[cnt++] = CMD_COMPUTE_PAGEMAC;
IanBenzMaxim 25:bdb1c5a53b58 424 buf[cnt++] = ((anon) ? 0xE0 : 0x00) | page_num;
IanBenzMaxim 25:bdb1c5a53b58 425
IanBenzMaxim 25:bdb1c5a53b58 426 // Send command
IanBenzMaxim 25:bdb1c5a53b58 427 m_OW_master.OWWriteBlock(&buf[0], 2);
IanBenzMaxim 25:bdb1c5a53b58 428
IanBenzMaxim 25:bdb1c5a53b58 429 // read first CRC byte
IanBenzMaxim 25:bdb1c5a53b58 430 m_OW_master.OWReadByte(buf[cnt++]);
IanBenzMaxim 25:bdb1c5a53b58 431
IanBenzMaxim 25:bdb1c5a53b58 432 // read the last CRC and enable
IanBenzMaxim 25:bdb1c5a53b58 433 m_OW_master.OWReadBytePower(buf[cnt++]);
IanBenzMaxim 25:bdb1c5a53b58 434
IanBenzMaxim 25:bdb1c5a53b58 435 // now wait for the MAC computation.
IanBenzMaxim 34:11fffbe98ef9 436 wait_ms(shaComputationDelayMs * 2);
IanBenzMaxim 25:bdb1c5a53b58 437
IanBenzMaxim 25:bdb1c5a53b58 438 // disable strong pullup
IanBenzMaxim 32:bce180b544ed 439 m_OW_master.OWSetLevel(OneWireMaster::LEVEL_NORMAL);
IanBenzMaxim 25:bdb1c5a53b58 440
IanBenzMaxim 25:bdb1c5a53b58 441 // check CRC16
IanBenzMaxim 25:bdb1c5a53b58 442 if (OneWireMaster::calculateCRC16(buf, 0, cnt) != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 443 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 444
IanBenzMaxim 25:bdb1c5a53b58 445 // read the CS byte
IanBenzMaxim 25:bdb1c5a53b58 446 m_OW_master.OWReadByte(cs);
IanBenzMaxim 25:bdb1c5a53b58 447 if (cs != 0xAA)
IanBenzMaxim 25:bdb1c5a53b58 448 return OperationFailure;
IanBenzMaxim 25:bdb1c5a53b58 449
IanBenzMaxim 25:bdb1c5a53b58 450 // read the MAC and CRC
IanBenzMaxim 33:a4c015046956 451 m_OW_master.OWReadBlock(&buf[0], (Mac::length + 2));
IanBenzMaxim 25:bdb1c5a53b58 452
IanBenzMaxim 25:bdb1c5a53b58 453 // check CRC16
IanBenzMaxim 33:a4c015046956 454 if (OneWireMaster::calculateCRC16(buf, 0, (Mac::length + 2)) != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 455 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 456
IanBenzMaxim 25:bdb1c5a53b58 457 // copy MAC to return buffer
IanBenzMaxim 33:a4c015046956 458 memcpy(mac, buf, Mac::length);
IanBenzMaxim 25:bdb1c5a53b58 459
IanBenzMaxim 25:bdb1c5a53b58 460 return Success;
IanBenzMaxim 25:bdb1c5a53b58 461 }
IanBenzMaxim 25:bdb1c5a53b58 462
IanBenzMaxim 25:bdb1c5a53b58 463 //----------------------------------------------------------------------
IanBenzMaxim 25:bdb1c5a53b58 464 // Compute secret operation on the DS28E25/DS28E22/DS28E15.
IanBenzMaxim 25:bdb1c5a53b58 465 //
IanBenzMaxim 25:bdb1c5a53b58 466 // 'sn' - secret number 0 or 1
IanBenzMaxim 25:bdb1c5a53b58 467 // 'partial' - partial secret to load (32 bytes)
IanBenzMaxim 25:bdb1c5a53b58 468 // 'pagedata' - page data to compute (32 bytes)
IanBenzMaxim 25:bdb1c5a53b58 469 // 'lock' - option to lock the secret after the load (lock = true)
IanBenzMaxim 25:bdb1c5a53b58 470 //
IanBenzMaxim 25:bdb1c5a53b58 471 // Return: true - load complete
IanBenzMaxim 25:bdb1c5a53b58 472 // false - error during load, device not present
IanBenzMaxim 25:bdb1c5a53b58 473 //
IanBenzMaxim 34:11fffbe98ef9 474 OneWireSlave::CmdResult DS28E15_22_25::computeSecret(unsigned int page_num, bool lock)
IanBenzMaxim 25:bdb1c5a53b58 475 {
IanBenzMaxim 25:bdb1c5a53b58 476 std::uint8_t buf[256], cs;
IanBenzMaxim 25:bdb1c5a53b58 477 int cnt = 0;
IanBenzMaxim 25:bdb1c5a53b58 478
IanBenzMaxim 25:bdb1c5a53b58 479 buf[cnt++] = CMD_COMPUTE_LOCK_SECRET;
IanBenzMaxim 25:bdb1c5a53b58 480 buf[cnt++] = (lock) ? (0xE0 | page_num) : page_num; // lock flag
IanBenzMaxim 25:bdb1c5a53b58 481
IanBenzMaxim 25:bdb1c5a53b58 482 // Send command
IanBenzMaxim 25:bdb1c5a53b58 483 m_OW_master.OWWriteBlock(&buf[0], 2);
IanBenzMaxim 25:bdb1c5a53b58 484
IanBenzMaxim 25:bdb1c5a53b58 485 // Read CRC
IanBenzMaxim 25:bdb1c5a53b58 486 m_OW_master.OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 25:bdb1c5a53b58 487 cnt += 2;
IanBenzMaxim 25:bdb1c5a53b58 488
IanBenzMaxim 25:bdb1c5a53b58 489 // check CRC16
IanBenzMaxim 25:bdb1c5a53b58 490 if (OneWireMaster::calculateCRC16(buf, 0, cnt) != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 491 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 492
IanBenzMaxim 25:bdb1c5a53b58 493 // send release and strong pull-up
IanBenzMaxim 25:bdb1c5a53b58 494 m_OW_master.OWWriteBytePower(0xAA);
IanBenzMaxim 25:bdb1c5a53b58 495
IanBenzMaxim 34:11fffbe98ef9 496 // now wait for the MAC computations and secret programming.
IanBenzMaxim 34:11fffbe98ef9 497 wait_ms(shaComputationDelayMs * 2 + secretEepromWriteDelayMs());
IanBenzMaxim 25:bdb1c5a53b58 498
IanBenzMaxim 25:bdb1c5a53b58 499 // disable strong pullup
IanBenzMaxim 32:bce180b544ed 500 m_OW_master.OWSetLevel(OneWireMaster::LEVEL_NORMAL);
IanBenzMaxim 25:bdb1c5a53b58 501
IanBenzMaxim 25:bdb1c5a53b58 502 // read the CS byte
IanBenzMaxim 25:bdb1c5a53b58 503 m_OW_master.OWReadByte(cs);
IanBenzMaxim 25:bdb1c5a53b58 504
IanBenzMaxim 25:bdb1c5a53b58 505 if (cs == 0xAA)
IanBenzMaxim 25:bdb1c5a53b58 506 return Success;
IanBenzMaxim 25:bdb1c5a53b58 507 // else
IanBenzMaxim 25:bdb1c5a53b58 508 return OperationFailure;
IanBenzMaxim 25:bdb1c5a53b58 509 }
IanBenzMaxim 25:bdb1c5a53b58 510
IanBenzMaxim 25:bdb1c5a53b58 511 //----------------------------------------------------------------------
IanBenzMaxim 25:bdb1c5a53b58 512 // Write the scratchpad (challenge or secret)
IanBenzMaxim 25:bdb1c5a53b58 513 //
IanBenzMaxim 25:bdb1c5a53b58 514 // 'sn' - secret number 0 or 1
IanBenzMaxim 25:bdb1c5a53b58 515 // 'data' - data to write to the scratchpad (32 bytes)
IanBenzMaxim 25:bdb1c5a53b58 516 //
IanBenzMaxim 25:bdb1c5a53b58 517 // Return: true - select complete
IanBenzMaxim 25:bdb1c5a53b58 518 // false - error during select, device not present
IanBenzMaxim 25:bdb1c5a53b58 519 //
IanBenzMaxim 34:11fffbe98ef9 520 OneWireSlave::CmdResult DS28E15_22_25::writeScratchpad(const Scratchpad & data) const
IanBenzMaxim 25:bdb1c5a53b58 521 {
IanBenzMaxim 25:bdb1c5a53b58 522 std::uint8_t buf[256];
IanBenzMaxim 25:bdb1c5a53b58 523 int cnt = 0, offset;
IanBenzMaxim 25:bdb1c5a53b58 524
IanBenzMaxim 25:bdb1c5a53b58 525 buf[cnt++] = CMD_SELECT_SECRET;
IanBenzMaxim 25:bdb1c5a53b58 526 if ((romId.familyCode() == DS28E25_FAMILY) || (romId.familyCode() == DS28E22_FAMILY))
IanBenzMaxim 25:bdb1c5a53b58 527 buf[cnt++] = 0x20;
IanBenzMaxim 25:bdb1c5a53b58 528 else
IanBenzMaxim 25:bdb1c5a53b58 529 buf[cnt++] = 0x00;
IanBenzMaxim 25:bdb1c5a53b58 530
IanBenzMaxim 25:bdb1c5a53b58 531 // Send command
IanBenzMaxim 25:bdb1c5a53b58 532 m_OW_master.OWWriteBlock(&buf[0], 2);
IanBenzMaxim 25:bdb1c5a53b58 533
IanBenzMaxim 25:bdb1c5a53b58 534 // Read CRC
IanBenzMaxim 25:bdb1c5a53b58 535 m_OW_master.OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 25:bdb1c5a53b58 536 cnt += 2;
IanBenzMaxim 25:bdb1c5a53b58 537
IanBenzMaxim 25:bdb1c5a53b58 538 offset = cnt;
IanBenzMaxim 25:bdb1c5a53b58 539
IanBenzMaxim 25:bdb1c5a53b58 540 // add the data
IanBenzMaxim 33:a4c015046956 541 memcpy(&buf[cnt], data, data.length);
IanBenzMaxim 33:a4c015046956 542 cnt += data.length;
IanBenzMaxim 25:bdb1c5a53b58 543
IanBenzMaxim 25:bdb1c5a53b58 544 // Send the data
IanBenzMaxim 33:a4c015046956 545 m_OW_master.OWWriteBlock(data, data.length);
IanBenzMaxim 25:bdb1c5a53b58 546
IanBenzMaxim 25:bdb1c5a53b58 547 // Read CRC
IanBenzMaxim 25:bdb1c5a53b58 548 m_OW_master.OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 25:bdb1c5a53b58 549 cnt += 2;
IanBenzMaxim 25:bdb1c5a53b58 550
IanBenzMaxim 25:bdb1c5a53b58 551 // check first CRC16
IanBenzMaxim 25:bdb1c5a53b58 552 if (OneWireMaster::calculateCRC16(buf, 0, offset) != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 553 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 554
IanBenzMaxim 25:bdb1c5a53b58 555 // check the second CRC16
IanBenzMaxim 25:bdb1c5a53b58 556 if (OneWireMaster::calculateCRC16(buf, offset, (cnt - offset)) != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 557 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 558
IanBenzMaxim 25:bdb1c5a53b58 559 return Success;
IanBenzMaxim 25:bdb1c5a53b58 560 }
IanBenzMaxim 25:bdb1c5a53b58 561
IanBenzMaxim 25:bdb1c5a53b58 562 //----------------------------------------------------------------------
IanBenzMaxim 25:bdb1c5a53b58 563 // Load first secret operation on the DS28E25/DS28E22/DS28E15.
IanBenzMaxim 25:bdb1c5a53b58 564 //
IanBenzMaxim 25:bdb1c5a53b58 565 // 'sn' - secret number 0 or 1
IanBenzMaxim 25:bdb1c5a53b58 566 // 'secret' - secret to load (32 bytes)
IanBenzMaxim 25:bdb1c5a53b58 567 // 'lock' - option to lock the secret after the load (lock = true)
IanBenzMaxim 25:bdb1c5a53b58 568 //
IanBenzMaxim 25:bdb1c5a53b58 569 // Return: true - load complete
IanBenzMaxim 25:bdb1c5a53b58 570 // false - error during load, device not present
IanBenzMaxim 25:bdb1c5a53b58 571 //
IanBenzMaxim 34:11fffbe98ef9 572 OneWireSlave::CmdResult DS28E15_22_25::loadSecret(bool lock)
IanBenzMaxim 25:bdb1c5a53b58 573 {
IanBenzMaxim 25:bdb1c5a53b58 574 std::uint8_t buf[256], cs;
IanBenzMaxim 25:bdb1c5a53b58 575 int cnt = 0;
IanBenzMaxim 25:bdb1c5a53b58 576
IanBenzMaxim 25:bdb1c5a53b58 577 buf[cnt++] = CMD_LOAD_LOCK_SECRET;
IanBenzMaxim 25:bdb1c5a53b58 578 buf[cnt++] = (lock) ? 0xE0 : 0x00; // lock flag
IanBenzMaxim 25:bdb1c5a53b58 579
IanBenzMaxim 25:bdb1c5a53b58 580 // Send command
IanBenzMaxim 25:bdb1c5a53b58 581 m_OW_master.OWWriteBlock(&buf[0], 2);
IanBenzMaxim 25:bdb1c5a53b58 582
IanBenzMaxim 25:bdb1c5a53b58 583 // Read CRC
IanBenzMaxim 25:bdb1c5a53b58 584 m_OW_master.OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 25:bdb1c5a53b58 585 cnt += 2;
IanBenzMaxim 25:bdb1c5a53b58 586
IanBenzMaxim 25:bdb1c5a53b58 587 // check CRC16
IanBenzMaxim 25:bdb1c5a53b58 588 if (OneWireMaster::calculateCRC16(buf, 0, cnt) != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 589 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 590
IanBenzMaxim 25:bdb1c5a53b58 591 // send release and strong pull-up
IanBenzMaxim 25:bdb1c5a53b58 592 m_OW_master.OWWriteBytePower(0xAA);
IanBenzMaxim 25:bdb1c5a53b58 593
IanBenzMaxim 34:11fffbe98ef9 594 // now wait for the secret programming.
IanBenzMaxim 34:11fffbe98ef9 595 wait_ms(secretEepromWriteDelayMs());
IanBenzMaxim 25:bdb1c5a53b58 596
IanBenzMaxim 25:bdb1c5a53b58 597 // disable strong pullup
IanBenzMaxim 32:bce180b544ed 598 m_OW_master.OWSetLevel(OneWireMaster::LEVEL_NORMAL);
IanBenzMaxim 25:bdb1c5a53b58 599
IanBenzMaxim 25:bdb1c5a53b58 600 // read the CS byte
IanBenzMaxim 25:bdb1c5a53b58 601 m_OW_master.OWReadByte(cs);
IanBenzMaxim 25:bdb1c5a53b58 602
IanBenzMaxim 25:bdb1c5a53b58 603 if (cs == 0xAA)
IanBenzMaxim 25:bdb1c5a53b58 604 return Success;
IanBenzMaxim 25:bdb1c5a53b58 605 // else
IanBenzMaxim 25:bdb1c5a53b58 606 return OperationFailure;
IanBenzMaxim 25:bdb1c5a53b58 607 }
IanBenzMaxim 25:bdb1c5a53b58 608
IanBenzMaxim 25:bdb1c5a53b58 609 //--------------------------------------------------------------------------
IanBenzMaxim 25:bdb1c5a53b58 610 // Read page and verify CRC. Multiple pages can
IanBenzMaxim 25:bdb1c5a53b58 611 // be read without re-selecting the device using the continue flag.
IanBenzMaxim 25:bdb1c5a53b58 612 //
IanBenzMaxim 25:bdb1c5a53b58 613 // Parameters
IanBenzMaxim 25:bdb1c5a53b58 614 // page - page number where the block to write is located (0 to 15)
IanBenzMaxim 25:bdb1c5a53b58 615 // rdbuf - 32 byte buffer to contain the data to read
IanBenzMaxim 25:bdb1c5a53b58 616 // contflag - Flag to indicate the write is continued from the last
IanBenzMaxim 25:bdb1c5a53b58 617 //
IanBenzMaxim 25:bdb1c5a53b58 618 // Returns: true - block read and verified CRC
IanBenzMaxim 25:bdb1c5a53b58 619 // false - Failed to write block (no presence or invalid CRC16)
IanBenzMaxim 25:bdb1c5a53b58 620 //
IanBenzMaxim 33:a4c015046956 621 OneWireSlave::CmdResult DS28E15_22_25::readPage(unsigned int page, Page & rdbuf, bool continuing) const
IanBenzMaxim 25:bdb1c5a53b58 622 {
IanBenzMaxim 25:bdb1c5a53b58 623 std::uint8_t buf[256];
IanBenzMaxim 25:bdb1c5a53b58 624 int cnt, offset;
IanBenzMaxim 25:bdb1c5a53b58 625
IanBenzMaxim 25:bdb1c5a53b58 626 cnt = 0;
IanBenzMaxim 25:bdb1c5a53b58 627 offset = 0;
IanBenzMaxim 25:bdb1c5a53b58 628
IanBenzMaxim 25:bdb1c5a53b58 629 // check if not continuing a previous block write
IanBenzMaxim 25:bdb1c5a53b58 630 if (!continuing)
IanBenzMaxim 25:bdb1c5a53b58 631 {
IanBenzMaxim 25:bdb1c5a53b58 632 buf[cnt++] = CMD_READ_MEMORY;
IanBenzMaxim 25:bdb1c5a53b58 633 buf[cnt++] = page; // address
IanBenzMaxim 25:bdb1c5a53b58 634
IanBenzMaxim 25:bdb1c5a53b58 635 // Send command
IanBenzMaxim 25:bdb1c5a53b58 636 m_OW_master.OWWriteBlock(&buf[0], 2);
IanBenzMaxim 25:bdb1c5a53b58 637
IanBenzMaxim 25:bdb1c5a53b58 638 // Read CRC
IanBenzMaxim 25:bdb1c5a53b58 639 m_OW_master.OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 25:bdb1c5a53b58 640 cnt += 2;
IanBenzMaxim 25:bdb1c5a53b58 641
IanBenzMaxim 25:bdb1c5a53b58 642 offset = cnt;
IanBenzMaxim 25:bdb1c5a53b58 643 }
IanBenzMaxim 25:bdb1c5a53b58 644
IanBenzMaxim 25:bdb1c5a53b58 645 // read data and CRC16
IanBenzMaxim 33:a4c015046956 646 m_OW_master.OWReadBlock(&buf[cnt], (rdbuf.length + 2));
IanBenzMaxim 33:a4c015046956 647 cnt += 34;
IanBenzMaxim 25:bdb1c5a53b58 648
IanBenzMaxim 25:bdb1c5a53b58 649 // check the first CRC16
IanBenzMaxim 25:bdb1c5a53b58 650 if (!continuing)
IanBenzMaxim 25:bdb1c5a53b58 651 {
IanBenzMaxim 25:bdb1c5a53b58 652 if (OneWireMaster::calculateCRC16(buf, 0, offset) != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 653 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 654 }
IanBenzMaxim 25:bdb1c5a53b58 655
IanBenzMaxim 25:bdb1c5a53b58 656 // check the second CRC16
IanBenzMaxim 25:bdb1c5a53b58 657 if (OneWireMaster::calculateCRC16(buf, offset, (cnt - offset)) != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 658 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 659
IanBenzMaxim 25:bdb1c5a53b58 660 // copy the data to the read buffer
IanBenzMaxim 33:a4c015046956 661 memcpy(rdbuf, &buf[offset], rdbuf.length);
IanBenzMaxim 25:bdb1c5a53b58 662
IanBenzMaxim 25:bdb1c5a53b58 663 return Success;
IanBenzMaxim 25:bdb1c5a53b58 664 }
IanBenzMaxim 25:bdb1c5a53b58 665
IanBenzMaxim 25:bdb1c5a53b58 666 //--------------------------------------------------------------------------
IanBenzMaxim 25:bdb1c5a53b58 667 // Write a 4 byte memory block using an authenticated write (with MAC).
IanBenzMaxim 25:bdb1c5a53b58 668 // The MAC must be pre-calculated.
IanBenzMaxim 25:bdb1c5a53b58 669 //
IanBenzMaxim 25:bdb1c5a53b58 670 // Parameters
IanBenzMaxim 25:bdb1c5a53b58 671 // page - page number where the block to write is located (0 to 15)
IanBenzMaxim 25:bdb1c5a53b58 672 // block - block number in page (0 to 7)
IanBenzMaxim 25:bdb1c5a53b58 673 // new_data - 4 byte buffer containing the data to write
IanBenzMaxim 25:bdb1c5a53b58 674 // mac - mac to use for the write
IanBenzMaxim 25:bdb1c5a53b58 675 // contflag - Flag to indicate the write is continued from the last
IanBenzMaxim 25:bdb1c5a53b58 676 //
IanBenzMaxim 25:bdb1c5a53b58 677 // Returns: true - block written
IanBenzMaxim 25:bdb1c5a53b58 678 // false - Failed to write block (no presence or invalid CRC16)
IanBenzMaxim 25:bdb1c5a53b58 679 //
IanBenzMaxim 34:11fffbe98ef9 680 OneWireSlave::CmdResult DS28E15_22_25::writeAuthSegmentMac(unsigned int pageNum, unsigned int segmentNum, const Segment & newData, const Mac & mac, bool continuing)
IanBenzMaxim 25:bdb1c5a53b58 681 {
IanBenzMaxim 25:bdb1c5a53b58 682 std::uint8_t buf[256], cs;
IanBenzMaxim 25:bdb1c5a53b58 683 int cnt, i, offset;
IanBenzMaxim 25:bdb1c5a53b58 684
IanBenzMaxim 25:bdb1c5a53b58 685 cnt = 0;
IanBenzMaxim 25:bdb1c5a53b58 686 offset = 0;
IanBenzMaxim 25:bdb1c5a53b58 687
IanBenzMaxim 25:bdb1c5a53b58 688 // check if not continuing a previous block write
IanBenzMaxim 25:bdb1c5a53b58 689 if (!continuing)
IanBenzMaxim 25:bdb1c5a53b58 690 {
IanBenzMaxim 25:bdb1c5a53b58 691 buf[cnt++] = CMD_WRITE_AUTH_MEMORY;
IanBenzMaxim 25:bdb1c5a53b58 692 buf[cnt++] = (segmentNum << 5) | pageNum; // address
IanBenzMaxim 25:bdb1c5a53b58 693
IanBenzMaxim 25:bdb1c5a53b58 694 // Send command
IanBenzMaxim 25:bdb1c5a53b58 695 m_OW_master.OWWriteBlock(&buf[0], 2);
IanBenzMaxim 25:bdb1c5a53b58 696
IanBenzMaxim 25:bdb1c5a53b58 697 // Read CRC
IanBenzMaxim 25:bdb1c5a53b58 698 m_OW_master.OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 25:bdb1c5a53b58 699 cnt += 2;
IanBenzMaxim 25:bdb1c5a53b58 700
IanBenzMaxim 25:bdb1c5a53b58 701 offset = cnt;
IanBenzMaxim 25:bdb1c5a53b58 702 }
IanBenzMaxim 25:bdb1c5a53b58 703
IanBenzMaxim 25:bdb1c5a53b58 704 // add the data
IanBenzMaxim 33:a4c015046956 705 for (i = 0; i < newData.length; i++)
IanBenzMaxim 25:bdb1c5a53b58 706 buf[cnt++] = newData[i];
IanBenzMaxim 25:bdb1c5a53b58 707
IanBenzMaxim 25:bdb1c5a53b58 708 // Send data
IanBenzMaxim 33:a4c015046956 709 m_OW_master.OWWriteBlock(newData, newData.length);
IanBenzMaxim 25:bdb1c5a53b58 710
IanBenzMaxim 25:bdb1c5a53b58 711 // read first CRC byte
IanBenzMaxim 25:bdb1c5a53b58 712 m_OW_master.OWReadByte(buf[cnt++]);
IanBenzMaxim 25:bdb1c5a53b58 713
IanBenzMaxim 25:bdb1c5a53b58 714 // read the last CRC and enable power
IanBenzMaxim 25:bdb1c5a53b58 715 m_OW_master.OWReadBytePower(buf[cnt++]);
IanBenzMaxim 25:bdb1c5a53b58 716
IanBenzMaxim 34:11fffbe98ef9 717 // now wait for the MAC computation.
IanBenzMaxim 34:11fffbe98ef9 718 wait_ms(shaComputationDelayMs);
IanBenzMaxim 25:bdb1c5a53b58 719
IanBenzMaxim 25:bdb1c5a53b58 720 // disable strong pullup
IanBenzMaxim 32:bce180b544ed 721 m_OW_master.OWSetLevel(OneWireMaster::LEVEL_NORMAL);
IanBenzMaxim 25:bdb1c5a53b58 722
IanBenzMaxim 25:bdb1c5a53b58 723 // check the first CRC16
IanBenzMaxim 25:bdb1c5a53b58 724 if (!continuing)
IanBenzMaxim 25:bdb1c5a53b58 725 {
IanBenzMaxim 25:bdb1c5a53b58 726 if (OneWireMaster::calculateCRC16(buf, 0, offset) != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 727 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 728 }
IanBenzMaxim 25:bdb1c5a53b58 729
IanBenzMaxim 25:bdb1c5a53b58 730 // check the second CRC16
IanBenzMaxim 25:bdb1c5a53b58 731 unsigned short CRC16 = 0;
IanBenzMaxim 25:bdb1c5a53b58 732
IanBenzMaxim 25:bdb1c5a53b58 733 // DS28E25/DS28E22, crc gets calculagted with CS byte
IanBenzMaxim 25:bdb1c5a53b58 734 if ((romId.familyCode() == DS28E25_FAMILY) || (romId.familyCode() == DS28E22_FAMILY))
IanBenzMaxim 25:bdb1c5a53b58 735 {
IanBenzMaxim 25:bdb1c5a53b58 736 if (continuing)
IanBenzMaxim 25:bdb1c5a53b58 737 CRC16 = OneWireMaster::calculateCRC16(CRC16, 0xAA);
IanBenzMaxim 25:bdb1c5a53b58 738 }
IanBenzMaxim 25:bdb1c5a53b58 739
IanBenzMaxim 25:bdb1c5a53b58 740 CRC16 = OneWireMaster::calculateCRC16(buf, offset, (cnt - offset), CRC16);
IanBenzMaxim 25:bdb1c5a53b58 741
IanBenzMaxim 25:bdb1c5a53b58 742 if (CRC16 != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 743 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 744
IanBenzMaxim 25:bdb1c5a53b58 745 // transmit MAC as a block
IanBenzMaxim 33:a4c015046956 746 m_OW_master.OWWriteBlock(mac, mac.length);
IanBenzMaxim 25:bdb1c5a53b58 747
IanBenzMaxim 25:bdb1c5a53b58 748 // calculate CRC on MAC
IanBenzMaxim 33:a4c015046956 749 CRC16 = OneWireMaster::calculateCRC16(mac, 0, mac.length);
IanBenzMaxim 25:bdb1c5a53b58 750
IanBenzMaxim 25:bdb1c5a53b58 751 // append read of CRC16 and CS byte
IanBenzMaxim 25:bdb1c5a53b58 752 m_OW_master.OWReadBlock(&buf[0], 3);
IanBenzMaxim 25:bdb1c5a53b58 753 cnt = 3;
IanBenzMaxim 25:bdb1c5a53b58 754
IanBenzMaxim 25:bdb1c5a53b58 755 // ckeck CRC16
IanBenzMaxim 25:bdb1c5a53b58 756 CRC16 = OneWireMaster::calculateCRC16(buf, 0, (cnt - 1), CRC16);
IanBenzMaxim 25:bdb1c5a53b58 757
IanBenzMaxim 25:bdb1c5a53b58 758 if (CRC16 != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 759 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 760
IanBenzMaxim 25:bdb1c5a53b58 761 // check CS
IanBenzMaxim 25:bdb1c5a53b58 762 if (buf[cnt-1] != 0xAA)
IanBenzMaxim 25:bdb1c5a53b58 763 return OperationFailure;
IanBenzMaxim 25:bdb1c5a53b58 764
IanBenzMaxim 25:bdb1c5a53b58 765 // send release and strong pull-up
IanBenzMaxim 25:bdb1c5a53b58 766 m_OW_master.OWWriteBytePower(0xAA);
IanBenzMaxim 25:bdb1c5a53b58 767
IanBenzMaxim 34:11fffbe98ef9 768 // now wait for the programming.
IanBenzMaxim 34:11fffbe98ef9 769 wait_ms(eepromWriteDelayMs);
IanBenzMaxim 25:bdb1c5a53b58 770
IanBenzMaxim 25:bdb1c5a53b58 771 // disable strong pullup
IanBenzMaxim 32:bce180b544ed 772 m_OW_master.OWSetLevel(OneWireMaster::LEVEL_NORMAL);
IanBenzMaxim 25:bdb1c5a53b58 773
IanBenzMaxim 25:bdb1c5a53b58 774 // read the CS byte
IanBenzMaxim 25:bdb1c5a53b58 775 m_OW_master.OWReadByte(cs);
IanBenzMaxim 25:bdb1c5a53b58 776
IanBenzMaxim 25:bdb1c5a53b58 777 if (cs == 0xAA)
IanBenzMaxim 25:bdb1c5a53b58 778 return Success;
IanBenzMaxim 25:bdb1c5a53b58 779 // else
IanBenzMaxim 25:bdb1c5a53b58 780 return OperationFailure;
IanBenzMaxim 25:bdb1c5a53b58 781 }
IanBenzMaxim 25:bdb1c5a53b58 782
IanBenzMaxim 25:bdb1c5a53b58 783 //--------------------------------------------------------------------------
IanBenzMaxim 25:bdb1c5a53b58 784 // Compute MAC to write a 4 byte memory block using an authenticated
IanBenzMaxim 25:bdb1c5a53b58 785 // write.
IanBenzMaxim 25:bdb1c5a53b58 786 //
IanBenzMaxim 25:bdb1c5a53b58 787 // Parameters
IanBenzMaxim 25:bdb1c5a53b58 788 // page - page number where the block to write is located (0 to 15)
IanBenzMaxim 25:bdb1c5a53b58 789 // block - block number in page (0 to 7)
IanBenzMaxim 25:bdb1c5a53b58 790 // new_data - 4 byte buffer containing the data to write
IanBenzMaxim 25:bdb1c5a53b58 791 // old_data - 4 byte buffer containing the data to write
IanBenzMaxim 25:bdb1c5a53b58 792 // manid - 2 byte buffer containing the manufacturer ID (general device: 00h,00h)
IanBenzMaxim 25:bdb1c5a53b58 793 // mac - buffer to put the calculated mac into
IanBenzMaxim 25:bdb1c5a53b58 794 //
IanBenzMaxim 25:bdb1c5a53b58 795 // Returns: true - mac calculated
IanBenzMaxim 25:bdb1c5a53b58 796 // false - Failed to calculate
IanBenzMaxim 25:bdb1c5a53b58 797 //
IanBenzMaxim 34:11fffbe98ef9 798 ISha256MacCoprocessor::CmdResult DS28E15_22_25::calculateSegmentWriteMac(const ISha256MacCoprocessor & MacCoproc, unsigned int pageNum, unsigned int segmentNum, const Segment & newData, const Segment & oldData, const RomId & romId, const ManId & manId, Mac & mac)
IanBenzMaxim 25:bdb1c5a53b58 799 {
IanBenzMaxim 33:a4c015046956 800 ISha256MacCoprocessor::WriteMacData MT;
IanBenzMaxim 25:bdb1c5a53b58 801
IanBenzMaxim 25:bdb1c5a53b58 802 // insert ROM number
IanBenzMaxim 25:bdb1c5a53b58 803 memcpy(&MT[0], romId, RomId::byteLen);
IanBenzMaxim 25:bdb1c5a53b58 804
IanBenzMaxim 25:bdb1c5a53b58 805 MT[11] = segmentNum;
IanBenzMaxim 25:bdb1c5a53b58 806 MT[10] = pageNum;
IanBenzMaxim 25:bdb1c5a53b58 807 MT[9] = manId[0];
IanBenzMaxim 25:bdb1c5a53b58 808 MT[8] = manId[1];
IanBenzMaxim 25:bdb1c5a53b58 809
IanBenzMaxim 25:bdb1c5a53b58 810 // insert old data
IanBenzMaxim 33:a4c015046956 811 memcpy(&MT[12], oldData, Segment::length);
IanBenzMaxim 25:bdb1c5a53b58 812
IanBenzMaxim 25:bdb1c5a53b58 813 // insert new data
IanBenzMaxim 33:a4c015046956 814 memcpy(&MT[16], newData, Segment::length);
IanBenzMaxim 25:bdb1c5a53b58 815
IanBenzMaxim 33:a4c015046956 816 return MacCoproc.computeWriteMac(MT, mac);
IanBenzMaxim 25:bdb1c5a53b58 817 }
IanBenzMaxim 25:bdb1c5a53b58 818
IanBenzMaxim 25:bdb1c5a53b58 819
IanBenzMaxim 25:bdb1c5a53b58 820
IanBenzMaxim 25:bdb1c5a53b58 821
IanBenzMaxim 34:11fffbe98ef9 822 ISha256MacCoprocessor::CmdResult DS28E15_22_25::calculateProtectionWriteMac(const ISha256MacCoprocessor & MacCoproc, const BlockProtection & newProtection, const BlockProtection & oldProtection, const RomId & romId, const ManId & manId, Mac & mac)
IanBenzMaxim 25:bdb1c5a53b58 823 {
IanBenzMaxim 33:a4c015046956 824 ISha256MacCoprocessor::WriteMacData MT;
IanBenzMaxim 25:bdb1c5a53b58 825
IanBenzMaxim 25:bdb1c5a53b58 826 // insert ROM number
IanBenzMaxim 25:bdb1c5a53b58 827 std::memcpy(MT, romId, RomId::byteLen);
IanBenzMaxim 25:bdb1c5a53b58 828
IanBenzMaxim 25:bdb1c5a53b58 829 // instert block and page
IanBenzMaxim 25:bdb1c5a53b58 830 MT[11] = 0;
IanBenzMaxim 34:11fffbe98ef9 831 MT[10] = newProtection.blockNum();
IanBenzMaxim 25:bdb1c5a53b58 832
IanBenzMaxim 25:bdb1c5a53b58 833 MT[9] = manId[0];
IanBenzMaxim 25:bdb1c5a53b58 834 MT[8] = manId[1];
IanBenzMaxim 25:bdb1c5a53b58 835
IanBenzMaxim 25:bdb1c5a53b58 836 // old data
IanBenzMaxim 34:11fffbe98ef9 837 MT[12] = oldProtection.authProtection() ? 0x01 : 0x00;
IanBenzMaxim 34:11fffbe98ef9 838 MT[13] = oldProtection.eepromEmulation() ? 0x01 : 0x00;
IanBenzMaxim 34:11fffbe98ef9 839 MT[14] = oldProtection.writeProtection() ? 0x01 : 0x00;
IanBenzMaxim 34:11fffbe98ef9 840 MT[15] = oldProtection.readProtection() ? 0x01 : 0x00;
IanBenzMaxim 25:bdb1c5a53b58 841 // new data
IanBenzMaxim 34:11fffbe98ef9 842 MT[16] = newProtection.authProtection() ? 0x01 : 0x00;
IanBenzMaxim 34:11fffbe98ef9 843 MT[17] = newProtection.eepromEmulation() ? 0x01 : 0x00;
IanBenzMaxim 34:11fffbe98ef9 844 MT[18] = newProtection.writeProtection() ? 0x01 : 0x00;
IanBenzMaxim 34:11fffbe98ef9 845 MT[19] = newProtection.readProtection() ? 0x01 : 0x00;
IanBenzMaxim 25:bdb1c5a53b58 846
IanBenzMaxim 25:bdb1c5a53b58 847 // compute the mac
IanBenzMaxim 33:a4c015046956 848 return MacCoproc.computeWriteMac(MT, mac);
IanBenzMaxim 25:bdb1c5a53b58 849 }
IanBenzMaxim 25:bdb1c5a53b58 850
IanBenzMaxim 25:bdb1c5a53b58 851 //--------------------------------------------------------------------------
IanBenzMaxim 25:bdb1c5a53b58 852 // Write a 4 byte memory block using an authenticated write (with MAC).
IanBenzMaxim 25:bdb1c5a53b58 853 // The block location is selected by the
IanBenzMaxim 25:bdb1c5a53b58 854 // page number and offset block within the page. Multiple blocks can
IanBenzMaxim 25:bdb1c5a53b58 855 // be programmed without re-selecting the device using the continue flag.
IanBenzMaxim 25:bdb1c5a53b58 856 // This function does not use the Authenticated Write operation.
IanBenzMaxim 25:bdb1c5a53b58 857 //
IanBenzMaxim 25:bdb1c5a53b58 858 // Parameters
IanBenzMaxim 25:bdb1c5a53b58 859 // page - page number where the block to write is located (0 to 15)
IanBenzMaxim 25:bdb1c5a53b58 860 // block - block number in page (0 to 7)
IanBenzMaxim 25:bdb1c5a53b58 861 // new_data - 4 byte buffer containing the data to write
IanBenzMaxim 25:bdb1c5a53b58 862 // old_data - 4 byte buffer containing the data to write
IanBenzMaxim 25:bdb1c5a53b58 863 // manid - 2 byte buffer containing the manufacturer ID (general device: 00h,00h)
IanBenzMaxim 25:bdb1c5a53b58 864 // contflag - Flag to indicate the write is continued from the last
IanBenzMaxim 25:bdb1c5a53b58 865 //
IanBenzMaxim 25:bdb1c5a53b58 866 // Returns: true - block written
IanBenzMaxim 25:bdb1c5a53b58 867 // false - Failed to write block (no presence or invalid CRC16)
IanBenzMaxim 25:bdb1c5a53b58 868 //
IanBenzMaxim 33:a4c015046956 869 OneWireSlave::CmdResult DS28E15_22_25::writeAuthSegment(const ISha256MacCoprocessor & MacCoproc, unsigned int pageNum, unsigned int segmentNum, const Segment & newData, const Segment & oldData, bool continuing)
IanBenzMaxim 25:bdb1c5a53b58 870 {
IanBenzMaxim 25:bdb1c5a53b58 871 std::uint8_t buf[256], cs;
IanBenzMaxim 25:bdb1c5a53b58 872 int cnt, offset;
IanBenzMaxim 25:bdb1c5a53b58 873
IanBenzMaxim 25:bdb1c5a53b58 874 cnt = 0;
IanBenzMaxim 25:bdb1c5a53b58 875 offset = 0;
IanBenzMaxim 25:bdb1c5a53b58 876
IanBenzMaxim 25:bdb1c5a53b58 877 // check if not continuing a previous block write
IanBenzMaxim 25:bdb1c5a53b58 878 if (!continuing)
IanBenzMaxim 25:bdb1c5a53b58 879 {
IanBenzMaxim 25:bdb1c5a53b58 880 buf[cnt++] = CMD_WRITE_AUTH_MEMORY;
IanBenzMaxim 25:bdb1c5a53b58 881 buf[cnt++] = (segmentNum << 5) | pageNum; // address
IanBenzMaxim 25:bdb1c5a53b58 882
IanBenzMaxim 25:bdb1c5a53b58 883 // Send command
IanBenzMaxim 25:bdb1c5a53b58 884 m_OW_master.OWWriteBlock(&buf[0], 2);
IanBenzMaxim 25:bdb1c5a53b58 885
IanBenzMaxim 25:bdb1c5a53b58 886 // Read CRC
IanBenzMaxim 25:bdb1c5a53b58 887 m_OW_master.OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 25:bdb1c5a53b58 888 cnt += 2;
IanBenzMaxim 25:bdb1c5a53b58 889
IanBenzMaxim 25:bdb1c5a53b58 890 offset = cnt;
IanBenzMaxim 25:bdb1c5a53b58 891 }
IanBenzMaxim 25:bdb1c5a53b58 892
IanBenzMaxim 25:bdb1c5a53b58 893 // add the data
IanBenzMaxim 33:a4c015046956 894 for (size_t i = 0; i < newData.length; i++)
IanBenzMaxim 25:bdb1c5a53b58 895 buf[cnt++] = newData[i];
IanBenzMaxim 25:bdb1c5a53b58 896
IanBenzMaxim 25:bdb1c5a53b58 897 // Send data
IanBenzMaxim 33:a4c015046956 898 m_OW_master.OWWriteBlock(newData, newData.length);
IanBenzMaxim 25:bdb1c5a53b58 899
IanBenzMaxim 25:bdb1c5a53b58 900 // read first CRC byte
IanBenzMaxim 25:bdb1c5a53b58 901 m_OW_master.OWReadByte(buf[cnt++]);
IanBenzMaxim 25:bdb1c5a53b58 902
IanBenzMaxim 25:bdb1c5a53b58 903 // read the last CRC and enable power
IanBenzMaxim 25:bdb1c5a53b58 904 m_OW_master.OWReadBytePower(buf[cnt++]);
IanBenzMaxim 25:bdb1c5a53b58 905
IanBenzMaxim 25:bdb1c5a53b58 906 // now wait for the MAC computation.
IanBenzMaxim 34:11fffbe98ef9 907 wait_ms(shaComputationDelayMs);
IanBenzMaxim 25:bdb1c5a53b58 908
IanBenzMaxim 25:bdb1c5a53b58 909 // disable strong pullup
IanBenzMaxim 32:bce180b544ed 910 m_OW_master.OWSetLevel(OneWireMaster::LEVEL_NORMAL);
IanBenzMaxim 25:bdb1c5a53b58 911
IanBenzMaxim 25:bdb1c5a53b58 912 // check the first CRC16
IanBenzMaxim 25:bdb1c5a53b58 913 if (!continuing)
IanBenzMaxim 25:bdb1c5a53b58 914 {
IanBenzMaxim 25:bdb1c5a53b58 915 if (OneWireMaster::calculateCRC16(buf, 0, offset) != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 916 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 917 }
IanBenzMaxim 25:bdb1c5a53b58 918
IanBenzMaxim 25:bdb1c5a53b58 919 // check the second CRC16
IanBenzMaxim 25:bdb1c5a53b58 920 unsigned short CRC16 = 0;
IanBenzMaxim 25:bdb1c5a53b58 921
IanBenzMaxim 25:bdb1c5a53b58 922 // DS28E25/DS28E22, crc gets calculagted with CS byte
IanBenzMaxim 25:bdb1c5a53b58 923 if ((romId.familyCode() == DS28E25_FAMILY) || (romId.familyCode() == DS28E22_FAMILY))
IanBenzMaxim 25:bdb1c5a53b58 924 {
IanBenzMaxim 25:bdb1c5a53b58 925 if (continuing)
IanBenzMaxim 25:bdb1c5a53b58 926 CRC16 = OneWireMaster::calculateCRC16(CRC16, 0xAA);
IanBenzMaxim 25:bdb1c5a53b58 927 }
IanBenzMaxim 25:bdb1c5a53b58 928
IanBenzMaxim 25:bdb1c5a53b58 929 CRC16 = OneWireMaster::calculateCRC16(buf, offset, (cnt - offset), CRC16);
IanBenzMaxim 25:bdb1c5a53b58 930
IanBenzMaxim 25:bdb1c5a53b58 931 if (CRC16 != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 932 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 933
IanBenzMaxim 25:bdb1c5a53b58 934 // compute the mac
IanBenzMaxim 25:bdb1c5a53b58 935 ISha256MacCoprocessor::CmdResult result;
IanBenzMaxim 33:a4c015046956 936 Mac mac;
IanBenzMaxim 34:11fffbe98ef9 937 result = calculateSegmentWriteMac(MacCoproc, pageNum, segmentNum, newData, oldData, romId, manId, mac);
IanBenzMaxim 25:bdb1c5a53b58 938 if (result != ISha256MacCoprocessor::Success)
IanBenzMaxim 25:bdb1c5a53b58 939 return OperationFailure;
IanBenzMaxim 25:bdb1c5a53b58 940
IanBenzMaxim 25:bdb1c5a53b58 941 // transmit MAC as a block
IanBenzMaxim 33:a4c015046956 942 m_OW_master.OWWriteBlock(mac, mac.length);
IanBenzMaxim 25:bdb1c5a53b58 943
IanBenzMaxim 25:bdb1c5a53b58 944 // calculate CRC on MAC
IanBenzMaxim 33:a4c015046956 945 CRC16 = OneWireMaster::calculateCRC16(mac, 0, mac.length);
IanBenzMaxim 25:bdb1c5a53b58 946
IanBenzMaxim 25:bdb1c5a53b58 947 // append read of CRC16 and CS byte
IanBenzMaxim 25:bdb1c5a53b58 948 m_OW_master.OWReadBlock(&buf[0], 3);
IanBenzMaxim 25:bdb1c5a53b58 949 cnt = 3;
IanBenzMaxim 25:bdb1c5a53b58 950
IanBenzMaxim 25:bdb1c5a53b58 951 // ckeck CRC16
IanBenzMaxim 25:bdb1c5a53b58 952 CRC16 = OneWireMaster::calculateCRC16(buf, 0, (cnt - 1), CRC16);
IanBenzMaxim 25:bdb1c5a53b58 953
IanBenzMaxim 25:bdb1c5a53b58 954 if (CRC16 != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 955 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 956
IanBenzMaxim 25:bdb1c5a53b58 957 // check CS
IanBenzMaxim 25:bdb1c5a53b58 958 if (buf[cnt-1] != 0xAA)
IanBenzMaxim 25:bdb1c5a53b58 959 return OperationFailure;
IanBenzMaxim 25:bdb1c5a53b58 960
IanBenzMaxim 25:bdb1c5a53b58 961 // send release and strong pull-up
IanBenzMaxim 25:bdb1c5a53b58 962 m_OW_master.OWWriteBytePower(0xAA);
IanBenzMaxim 25:bdb1c5a53b58 963
IanBenzMaxim 34:11fffbe98ef9 964 // now wait for the programming.
IanBenzMaxim 34:11fffbe98ef9 965 wait_ms(eepromWriteDelayMs);
IanBenzMaxim 25:bdb1c5a53b58 966
IanBenzMaxim 25:bdb1c5a53b58 967 // disable strong pullup
IanBenzMaxim 32:bce180b544ed 968 m_OW_master.OWSetLevel(OneWireMaster::LEVEL_NORMAL);
IanBenzMaxim 25:bdb1c5a53b58 969
IanBenzMaxim 25:bdb1c5a53b58 970 // read the CS byte
IanBenzMaxim 25:bdb1c5a53b58 971 m_OW_master.OWReadByte(cs);
IanBenzMaxim 25:bdb1c5a53b58 972
IanBenzMaxim 25:bdb1c5a53b58 973 if (cs == 0xAA)
IanBenzMaxim 25:bdb1c5a53b58 974 return Success;
IanBenzMaxim 25:bdb1c5a53b58 975 // else
IanBenzMaxim 25:bdb1c5a53b58 976 return OperationFailure;
IanBenzMaxim 25:bdb1c5a53b58 977 }
IanBenzMaxim 25:bdb1c5a53b58 978
IanBenzMaxim 25:bdb1c5a53b58 979
IanBenzMaxim 25:bdb1c5a53b58 980
IanBenzMaxim 25:bdb1c5a53b58 981
IanBenzMaxim 33:a4c015046956 982 OneWireSlave::CmdResult DS28E15_22_25::readSegment(unsigned int page, unsigned int segment, Segment & data) const
IanBenzMaxim 25:bdb1c5a53b58 983 {
IanBenzMaxim 25:bdb1c5a53b58 984 OneWireMaster::CmdResult result;
IanBenzMaxim 25:bdb1c5a53b58 985 std::uint8_t buf[2];
IanBenzMaxim 25:bdb1c5a53b58 986
IanBenzMaxim 25:bdb1c5a53b58 987 buf[0] = CMD_READ_MEMORY;
IanBenzMaxim 25:bdb1c5a53b58 988 buf[1] = (segment << 5) | page;
IanBenzMaxim 25:bdb1c5a53b58 989
IanBenzMaxim 25:bdb1c5a53b58 990 // Transmit command
IanBenzMaxim 25:bdb1c5a53b58 991 m_OW_master.OWWriteBlock(buf, 2);
IanBenzMaxim 25:bdb1c5a53b58 992
IanBenzMaxim 25:bdb1c5a53b58 993 // Receive CRC
IanBenzMaxim 25:bdb1c5a53b58 994 result = m_OW_master.OWReadBlock(buf, 2);
IanBenzMaxim 25:bdb1c5a53b58 995
IanBenzMaxim 25:bdb1c5a53b58 996 // Receive data
IanBenzMaxim 25:bdb1c5a53b58 997 if (result == OneWireMaster::Success)
IanBenzMaxim 33:a4c015046956 998 result = m_OW_master.OWReadBlock(data, data.length);
IanBenzMaxim 25:bdb1c5a53b58 999
IanBenzMaxim 25:bdb1c5a53b58 1000 return (result == OneWireMaster::Success ? OneWireSlave::Success : OneWireSlave::CommunicationError);
IanBenzMaxim 25:bdb1c5a53b58 1001 }
IanBenzMaxim 25:bdb1c5a53b58 1002
IanBenzMaxim 25:bdb1c5a53b58 1003 //--------------------------------------------------------------------------
IanBenzMaxim 25:bdb1c5a53b58 1004 // Write a 4 byte memory block. The block location is selected by the
IanBenzMaxim 25:bdb1c5a53b58 1005 // page number and offset blcok within the page. Multiple blocks can
IanBenzMaxim 25:bdb1c5a53b58 1006 // be programmed without re-selecting the device using the continue flag.
IanBenzMaxim 25:bdb1c5a53b58 1007 // This function does not use the Authenticated Write operation.
IanBenzMaxim 25:bdb1c5a53b58 1008 //
IanBenzMaxim 25:bdb1c5a53b58 1009 // Parameters
IanBenzMaxim 25:bdb1c5a53b58 1010 // page - page number where the block to write is located (0 to 15)
IanBenzMaxim 25:bdb1c5a53b58 1011 // block - block number in page (0 to 7)
IanBenzMaxim 25:bdb1c5a53b58 1012 // data - 4 byte buffer containing the data to write
IanBenzMaxim 25:bdb1c5a53b58 1013 // contflag - Flag to indicate the write is continued from the last
IanBenzMaxim 25:bdb1c5a53b58 1014 //
IanBenzMaxim 25:bdb1c5a53b58 1015 // Returns: true - block written
IanBenzMaxim 25:bdb1c5a53b58 1016 // false - Failed to write block (no presence or invalid CRC16)
IanBenzMaxim 25:bdb1c5a53b58 1017 //
IanBenzMaxim 33:a4c015046956 1018 OneWireSlave::CmdResult DS28E15_22_25::writeSegment(unsigned int page, unsigned int block, const Segment & data, bool continuing)
IanBenzMaxim 25:bdb1c5a53b58 1019 {
IanBenzMaxim 25:bdb1c5a53b58 1020 std::uint8_t buf[256], cs;
IanBenzMaxim 25:bdb1c5a53b58 1021 int cnt, offset;
IanBenzMaxim 25:bdb1c5a53b58 1022
IanBenzMaxim 25:bdb1c5a53b58 1023 cnt = 0;
IanBenzMaxim 25:bdb1c5a53b58 1024 offset = 0;
IanBenzMaxim 25:bdb1c5a53b58 1025
IanBenzMaxim 25:bdb1c5a53b58 1026 // check if not continuing a previous block write
IanBenzMaxim 25:bdb1c5a53b58 1027 if (!continuing)
IanBenzMaxim 25:bdb1c5a53b58 1028 {
IanBenzMaxim 25:bdb1c5a53b58 1029 buf[cnt++] = CMD_WRITE_MEMORY;
IanBenzMaxim 25:bdb1c5a53b58 1030 buf[cnt++] = (block << 5) | page; // address
IanBenzMaxim 25:bdb1c5a53b58 1031
IanBenzMaxim 25:bdb1c5a53b58 1032 // Send command
IanBenzMaxim 25:bdb1c5a53b58 1033 m_OW_master.OWWriteBlock(&buf[0], 2);
IanBenzMaxim 25:bdb1c5a53b58 1034
IanBenzMaxim 25:bdb1c5a53b58 1035 // Read CRC
IanBenzMaxim 25:bdb1c5a53b58 1036 m_OW_master.OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 25:bdb1c5a53b58 1037 cnt += 2;
IanBenzMaxim 25:bdb1c5a53b58 1038
IanBenzMaxim 25:bdb1c5a53b58 1039 offset = cnt;
IanBenzMaxim 25:bdb1c5a53b58 1040 }
IanBenzMaxim 25:bdb1c5a53b58 1041
IanBenzMaxim 25:bdb1c5a53b58 1042 // add the data
IanBenzMaxim 33:a4c015046956 1043 for (size_t i = 0; i < data.length; i++)
IanBenzMaxim 25:bdb1c5a53b58 1044 buf[cnt++] = data[i];
IanBenzMaxim 25:bdb1c5a53b58 1045
IanBenzMaxim 25:bdb1c5a53b58 1046 // Send data
IanBenzMaxim 33:a4c015046956 1047 m_OW_master.OWWriteBlock(data, data.length);
IanBenzMaxim 25:bdb1c5a53b58 1048
IanBenzMaxim 25:bdb1c5a53b58 1049 // Read CRC
IanBenzMaxim 25:bdb1c5a53b58 1050 m_OW_master.OWReadBlock(&buf[cnt], 2);
IanBenzMaxim 25:bdb1c5a53b58 1051 cnt += 2;
IanBenzMaxim 25:bdb1c5a53b58 1052
IanBenzMaxim 25:bdb1c5a53b58 1053 // check the first CRC16
IanBenzMaxim 25:bdb1c5a53b58 1054 if (!continuing)
IanBenzMaxim 25:bdb1c5a53b58 1055 {
IanBenzMaxim 25:bdb1c5a53b58 1056 if (OneWireMaster::calculateCRC16(buf, 0, offset) != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 1057 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 1058 }
IanBenzMaxim 25:bdb1c5a53b58 1059
IanBenzMaxim 25:bdb1c5a53b58 1060 // check the second CRC16
IanBenzMaxim 25:bdb1c5a53b58 1061 if (OneWireMaster::calculateCRC16(buf, offset, (cnt - offset)) != 0xB001)
IanBenzMaxim 25:bdb1c5a53b58 1062 return CommunicationError;
IanBenzMaxim 25:bdb1c5a53b58 1063
IanBenzMaxim 25:bdb1c5a53b58 1064 // send release and strong pull-up
IanBenzMaxim 25:bdb1c5a53b58 1065 m_OW_master.OWWriteBytePower(0xAA);
IanBenzMaxim 25:bdb1c5a53b58 1066
IanBenzMaxim 34:11fffbe98ef9 1067 // now wait for the programming.
IanBenzMaxim 34:11fffbe98ef9 1068 wait_ms(eepromWriteDelayMs);
IanBenzMaxim 25:bdb1c5a53b58 1069
IanBenzMaxim 25:bdb1c5a53b58 1070 // disable strong pullup
IanBenzMaxim 32:bce180b544ed 1071 m_OW_master.OWSetLevel(OneWireMaster::LEVEL_NORMAL);
IanBenzMaxim 25:bdb1c5a53b58 1072
IanBenzMaxim 25:bdb1c5a53b58 1073 // read the CS byte
IanBenzMaxim 25:bdb1c5a53b58 1074 m_OW_master.OWReadByte(cs);
IanBenzMaxim 25:bdb1c5a53b58 1075
IanBenzMaxim 25:bdb1c5a53b58 1076 if (cs == 0xAA)
IanBenzMaxim 25:bdb1c5a53b58 1077 return Success;
IanBenzMaxim 25:bdb1c5a53b58 1078 // else
IanBenzMaxim 25:bdb1c5a53b58 1079 return OperationFailure;
IanBenzMaxim 25:bdb1c5a53b58 1080 }
IanBenzMaxim 25:bdb1c5a53b58 1081
IanBenzMaxim 25:bdb1c5a53b58 1082 //----------------------------------------------------------------------
IanBenzMaxim 25:bdb1c5a53b58 1083 // Performs a Compute Next SHA-256 calculation given the provided 32-bytes
IanBenzMaxim 25:bdb1c5a53b58 1084 // of binding data and 8 byte partial secret. The first 8 bytes of the
IanBenzMaxim 25:bdb1c5a53b58 1085 // resulting MAC is set as the new secret.
IanBenzMaxim 25:bdb1c5a53b58 1086 //
IanBenzMaxim 25:bdb1c5a53b58 1087 // 'binding' - 32 byte buffer containing the binding data
IanBenzMaxim 25:bdb1c5a53b58 1088 // 'partial' - 8 byte buffer with new partial secret
IanBenzMaxim 25:bdb1c5a53b58 1089 // 'page_num' - page number that the compute is calculated on
IanBenzMaxim 25:bdb1c5a53b58 1090 // 'manid' - manufacturer ID
IanBenzMaxim 25:bdb1c5a53b58 1091 //
IanBenzMaxim 25:bdb1c5a53b58 1092 // Globals used : SECRET used in calculation and set to new secret
IanBenzMaxim 25:bdb1c5a53b58 1093 //
IanBenzMaxim 25:bdb1c5a53b58 1094 // Returns: true if compute successful
IanBenzMaxim 25:bdb1c5a53b58 1095 // false failed to do compute
IanBenzMaxim 25:bdb1c5a53b58 1096 //
IanBenzMaxim 34:11fffbe98ef9 1097 ISha256MacCoprocessor::CmdResult DS28E15_22_25::calculateNextSecret(ISha256MacCoprocessor & MacCoproc, const Page & binding, const Scratchpad & partial, const RomId & romId, const ManId & manId, unsigned int pageNum)
IanBenzMaxim 25:bdb1c5a53b58 1098 {
IanBenzMaxim 33:a4c015046956 1099 ISha256MacCoprocessor::SlaveSecretData slaveSecretData;
IanBenzMaxim 25:bdb1c5a53b58 1100
IanBenzMaxim 33:a4c015046956 1101 // insert ROM number
IanBenzMaxim 33:a4c015046956 1102 std::memcpy(slaveSecretData, romId, RomId::byteLen);
IanBenzMaxim 25:bdb1c5a53b58 1103
IanBenzMaxim 33:a4c015046956 1104 slaveSecretData[11] = 0x00;
IanBenzMaxim 33:a4c015046956 1105 slaveSecretData[10] = pageNum;
IanBenzMaxim 33:a4c015046956 1106 slaveSecretData[9] = manId[0];
IanBenzMaxim 33:a4c015046956 1107 slaveSecretData[8] = manId[1];
IanBenzMaxim 25:bdb1c5a53b58 1108
IanBenzMaxim 33:a4c015046956 1109 return MacCoproc.computeSlaveSecret(binding, partial, slaveSecretData);
IanBenzMaxim 25:bdb1c5a53b58 1110 }