Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Committer:
IanBenzMaxim
Date:
Tue Mar 22 15:18:00 2016 -0500
Revision:
25:bdb1c5a53b58
Child:
27:d5aaefa252f1
Added support for DS28E15/22/25. Added OneWireSlave class used by DS28E15_22_25 as a starting point for a slave base class.

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 #ifndef DS28E15_22_25_H
IanBenzMaxim 25:bdb1c5a53b58 27 #define DS28E15_22_25_H
IanBenzMaxim 25:bdb1c5a53b58 28
IanBenzMaxim 25:bdb1c5a53b58 29 #include "OneWire_Masters/OneWireMaster.h"
IanBenzMaxim 25:bdb1c5a53b58 30 #include "OneWire_Masters/ISha256MacCoprocessor.hpp"
IanBenzMaxim 25:bdb1c5a53b58 31 #include "OneWireSlave.hpp"
IanBenzMaxim 25:bdb1c5a53b58 32
IanBenzMaxim 25:bdb1c5a53b58 33 class DS28E15_22_25 : public OneWireSlave
IanBenzMaxim 25:bdb1c5a53b58 34 {
IanBenzMaxim 25:bdb1c5a53b58 35 public:
IanBenzMaxim 25:bdb1c5a53b58 36 enum DeviceFamily
IanBenzMaxim 25:bdb1c5a53b58 37 {
IanBenzMaxim 25:bdb1c5a53b58 38 DS28E25_FAMILY = 0x47,
IanBenzMaxim 25:bdb1c5a53b58 39 DS28E22_FAMILY = 0x48,
IanBenzMaxim 25:bdb1c5a53b58 40 DS28E15_FAMILY = 0x17,
IanBenzMaxim 25:bdb1c5a53b58 41 UNKNOWN_FAMILY = 0
IanBenzMaxim 25:bdb1c5a53b58 42 };
IanBenzMaxim 25:bdb1c5a53b58 43
IanBenzMaxim 25:bdb1c5a53b58 44 enum DevicePages
IanBenzMaxim 25:bdb1c5a53b58 45 {
IanBenzMaxim 25:bdb1c5a53b58 46 DS28E25_PAGES = 16,
IanBenzMaxim 25:bdb1c5a53b58 47 DS28E22_PAGES = 8,
IanBenzMaxim 25:bdb1c5a53b58 48 DS28E15_PAGES = 2,
IanBenzMaxim 25:bdb1c5a53b58 49 UNKNOWN_PAGES = 0
IanBenzMaxim 25:bdb1c5a53b58 50 };
IanBenzMaxim 25:bdb1c5a53b58 51
IanBenzMaxim 25:bdb1c5a53b58 52 enum DeviceBlocks
IanBenzMaxim 25:bdb1c5a53b58 53 {
IanBenzMaxim 25:bdb1c5a53b58 54 DS28E25_BLOCKS = 8,
IanBenzMaxim 25:bdb1c5a53b58 55 DS28E22_BLOCKS = 4,
IanBenzMaxim 25:bdb1c5a53b58 56 DS28E15_BLOCKS = 4,
IanBenzMaxim 25:bdb1c5a53b58 57 UNKNOWN_BLOCKS = 0
IanBenzMaxim 25:bdb1c5a53b58 58 };
IanBenzMaxim 25:bdb1c5a53b58 59
IanBenzMaxim 25:bdb1c5a53b58 60 static const std::size_t pageSize = 32;
IanBenzMaxim 25:bdb1c5a53b58 61 static const std::size_t scratchpadSize = 32;
IanBenzMaxim 25:bdb1c5a53b58 62 static const std::size_t macLen = 32;
IanBenzMaxim 25:bdb1c5a53b58 63
IanBenzMaxim 25:bdb1c5a53b58 64 static const std::size_t segmentSize = 4;
IanBenzMaxim 25:bdb1c5a53b58 65 static const std::size_t manIdLen = 2;
IanBenzMaxim 25:bdb1c5a53b58 66
IanBenzMaxim 25:bdb1c5a53b58 67 std::uint8_t manId[manIdLen];
IanBenzMaxim 25:bdb1c5a53b58 68
IanBenzMaxim 25:bdb1c5a53b58 69 static ISha256MacCoprocessor::CmdResult CalculateSegmentWriteMAC256(const ISha256MacCoprocessor & MacCoproc,
IanBenzMaxim 25:bdb1c5a53b58 70 unsigned int pageNum,
IanBenzMaxim 25:bdb1c5a53b58 71 unsigned int segmentNum,
IanBenzMaxim 25:bdb1c5a53b58 72 const std::uint8_t (&newData)[segmentSize],
IanBenzMaxim 25:bdb1c5a53b58 73 const std::uint8_t (&oldData)[segmentSize],
IanBenzMaxim 25:bdb1c5a53b58 74 const RomId & romId,
IanBenzMaxim 25:bdb1c5a53b58 75 const std::uint8_t (&manId)[manIdLen],
IanBenzMaxim 25:bdb1c5a53b58 76 std::uint8_t (&mac)[macLen]);
IanBenzMaxim 25:bdb1c5a53b58 77 static ISha256MacCoprocessor::CmdResult CalculateProtectionWriteMAC256(const ISha256MacCoprocessor & MacCoproc,
IanBenzMaxim 25:bdb1c5a53b58 78 std::uint8_t newProtection,
IanBenzMaxim 25:bdb1c5a53b58 79 std::uint8_t oldProtection,
IanBenzMaxim 25:bdb1c5a53b58 80 const RomId & romId,
IanBenzMaxim 25:bdb1c5a53b58 81 const std::uint8_t (&manId)[manIdLen],
IanBenzMaxim 25:bdb1c5a53b58 82 std::uint8_t (&mac)[macLen]);
IanBenzMaxim 25:bdb1c5a53b58 83 static ISha256MacCoprocessor::CmdResult CalculateNextSecret(ISha256MacCoprocessor & MacCoproc,
IanBenzMaxim 25:bdb1c5a53b58 84 const std::uint8_t (&binding)[pageSize],
IanBenzMaxim 25:bdb1c5a53b58 85 const std::uint8_t (&partial)[scratchpadSize],
IanBenzMaxim 25:bdb1c5a53b58 86 const RomId & romId,
IanBenzMaxim 25:bdb1c5a53b58 87 const std::uint8_t (&manId)[manIdLen],
IanBenzMaxim 25:bdb1c5a53b58 88 unsigned int pageNum);
IanBenzMaxim 25:bdb1c5a53b58 89 static ISha256MacCoprocessor::CmdResult CalculateAuthMAC256(const ISha256MacCoprocessor & MacCoproc,
IanBenzMaxim 25:bdb1c5a53b58 90 unsigned int pageNum,
IanBenzMaxim 25:bdb1c5a53b58 91 const std::uint8_t (&challenge)[scratchpadSize],
IanBenzMaxim 25:bdb1c5a53b58 92 const std::uint8_t (&pageData)[pageSize],
IanBenzMaxim 25:bdb1c5a53b58 93 const RomId & romId,
IanBenzMaxim 25:bdb1c5a53b58 94 const std::uint8_t (&manId)[manIdLen],
IanBenzMaxim 25:bdb1c5a53b58 95 bool anon,
IanBenzMaxim 25:bdb1c5a53b58 96 std::uint8_t (&mac)[macLen]);
IanBenzMaxim 25:bdb1c5a53b58 97 static ISha256MacCoprocessor::CmdResult AuthVerify(const ISha256MacCoprocessor & MacCoproc,
IanBenzMaxim 25:bdb1c5a53b58 98 unsigned int pageNum,
IanBenzMaxim 25:bdb1c5a53b58 99 const std::uint8_t (&challenge)[scratchpadSize],
IanBenzMaxim 25:bdb1c5a53b58 100 const std::uint8_t (&pageData)[pageSize],
IanBenzMaxim 25:bdb1c5a53b58 101 const RomId & romId,
IanBenzMaxim 25:bdb1c5a53b58 102 const std::uint8_t (&manId)[manIdLen],
IanBenzMaxim 25:bdb1c5a53b58 103 bool anon,
IanBenzMaxim 25:bdb1c5a53b58 104 const std::uint8_t (&mac)[macLen]);
IanBenzMaxim 25:bdb1c5a53b58 105
IanBenzMaxim 25:bdb1c5a53b58 106 DS28E15_22_25(OneWireMaster & OW_master);
IanBenzMaxim 25:bdb1c5a53b58 107
IanBenzMaxim 25:bdb1c5a53b58 108 // Const member functions should not affect the state of the memory, block protection, or secret on the DS28Exx.
IanBenzMaxim 25:bdb1c5a53b58 109 // Scratchpad on the DS28Exx is considered mutable.
IanBenzMaxim 25:bdb1c5a53b58 110
IanBenzMaxim 25:bdb1c5a53b58 111 DevicePages devicePages();
IanBenzMaxim 25:bdb1c5a53b58 112 DeviceBlocks deviceBlocks();
IanBenzMaxim 25:bdb1c5a53b58 113
IanBenzMaxim 25:bdb1c5a53b58 114 //DS28Exx Specific Functions (DS28E15, DS28E22 & DS28E25)
IanBenzMaxim 25:bdb1c5a53b58 115 CmdResult LoadSecret(bool lock);
IanBenzMaxim 25:bdb1c5a53b58 116 CmdResult WriteScratchpad(const std::uint8_t (&data)[scratchpadSize]) const;
IanBenzMaxim 25:bdb1c5a53b58 117 CmdResult readSegment(unsigned int pageNum, unsigned int segmentNum, std::uint8_t (&data)[segmentSize]) const;
IanBenzMaxim 25:bdb1c5a53b58 118 CmdResult writeSegment(unsigned int pageNum, unsigned int segmentNum, const std::uint8_t (&data)[segmentSize], bool continuing);
IanBenzMaxim 25:bdb1c5a53b58 119 CmdResult readPage(unsigned int pageNum, std::uint8_t (&rdbuf)[pageSize], bool continuing) const;
IanBenzMaxim 25:bdb1c5a53b58 120 CmdResult ComputeSecret(unsigned int pageNum, bool lock);
IanBenzMaxim 25:bdb1c5a53b58 121 CmdResult ComputeReadPageMAC(unsigned int pageNum, bool anon, std::uint8_t (&mac)[macLen]) const;
IanBenzMaxim 25:bdb1c5a53b58 122 CmdResult WriteBlockProtection(std::uint8_t protection, bool continuing);
IanBenzMaxim 25:bdb1c5a53b58 123 CmdResult WriteAuthBlockProtection(const ISha256MacCoprocessor & MacCoproc,
IanBenzMaxim 25:bdb1c5a53b58 124 std::uint8_t newProtection,
IanBenzMaxim 25:bdb1c5a53b58 125 std::uint8_t oldProtection,
IanBenzMaxim 25:bdb1c5a53b58 126 bool continuing);
IanBenzMaxim 25:bdb1c5a53b58 127 CmdResult writeAuthSegment(const ISha256MacCoprocessor & MacCoproc,
IanBenzMaxim 25:bdb1c5a53b58 128 unsigned int pageNum,
IanBenzMaxim 25:bdb1c5a53b58 129 unsigned int segmentNum,
IanBenzMaxim 25:bdb1c5a53b58 130 const std::uint8_t (&newData)[segmentSize],
IanBenzMaxim 25:bdb1c5a53b58 131 const std::uint8_t (&oldData)[segmentSize],
IanBenzMaxim 25:bdb1c5a53b58 132 bool continuing);
IanBenzMaxim 25:bdb1c5a53b58 133 CmdResult writeAuthSegmentMAC(unsigned int pageNum,
IanBenzMaxim 25:bdb1c5a53b58 134 unsigned int segmentNum,
IanBenzMaxim 25:bdb1c5a53b58 135 const std::uint8_t (&newData)[segmentSize],
IanBenzMaxim 25:bdb1c5a53b58 136 const std::uint8_t (&mac)[macLen],
IanBenzMaxim 25:bdb1c5a53b58 137 bool continuing);
IanBenzMaxim 25:bdb1c5a53b58 138
IanBenzMaxim 25:bdb1c5a53b58 139 CmdResult ReadBlockProtectionStatus(unsigned int blockNum, std::uint8_t & status);
IanBenzMaxim 25:bdb1c5a53b58 140 // bool ReadAllBlockProtectionStatuses(std::uint8_t (&statuses)[numBlocks]);
IanBenzMaxim 25:bdb1c5a53b58 141
IanBenzMaxim 25:bdb1c5a53b58 142 private:
IanBenzMaxim 25:bdb1c5a53b58 143 OneWireMaster & m_OW_master;
IanBenzMaxim 25:bdb1c5a53b58 144
IanBenzMaxim 25:bdb1c5a53b58 145 CmdResult ReadStatus(bool personality, bool allpages, unsigned int pageNum, unsigned char *rdbuf) const;
IanBenzMaxim 25:bdb1c5a53b58 146 };
IanBenzMaxim 25:bdb1c5a53b58 147
IanBenzMaxim 25:bdb1c5a53b58 148 #endif