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 Mar 25 11:11:59 2016 -0500
Revision:
27:d5aaefa252f1
Parent:
25:bdb1c5a53b58
Child:
33:a4c015046956
Do not reconfigure DS2465 if requested speed or level is already set. Use forward declarations to speed up compilation.

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