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:
Thu Mar 31 11:56:01 2016 -0500
Revision:
33:a4c015046956
Parent:
32:bce180b544ed
Child:
34:11fffbe98ef9
Created a generic array wrapper class. Updated array types used in ISha256MacCoprocessor and DS28E15_22_25 for clarity.

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