Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Committer:
IanBenzMaxim
Date:
Wed Mar 30 16:50:29 2016 -0500
Revision:
32:bce180b544ed
Parent:
27:d5aaefa252f1
Child:
33:a4c015046956
1. Move the implementation of OWSearch() into OneWireMaster since it is a fairly complex algorithm that shouldn?t be implemented over and over. It will also match all other ROM function that are implemented there.
2. Create a new member function, OWTriplet(), in OneWireMaster to handle the virtual section of OWSearch(). Create a default implementation of OWTriplet() that uses OWReadByte() and OWWriteByte(). Masters only need to implement this function if they have a search accelerator of some sort.
3. Create type SearchState that will encapsulate all persistent data used by the search ROM functions. This will also make it easy to not have the search state part of the permanent OneWireMaster class data.
4. Rename OWSpeed() to OWSetSpeed() and OWLevel() to OWSetLevel() for naming consistency.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 21:00c94aeb533e 1 #ifndef DS2465_H
IanBenzMaxim 21:00c94aeb533e 2 #define DS2465_H
IanBenzMaxim 21:00c94aeb533e 3
IanBenzMaxim 21:00c94aeb533e 4 #include "OneWire_Masters/OneWireMaster.h"
IanBenzMaxim 21:00c94aeb533e 5 #include "OneWire_Masters/ISha256MacCoprocessor.hpp"
IanBenzMaxim 21:00c94aeb533e 6
IanBenzMaxim 27:d5aaefa252f1 7 namespace mbed
IanBenzMaxim 27:d5aaefa252f1 8 {
IanBenzMaxim 27:d5aaefa252f1 9 class I2C;
IanBenzMaxim 27:d5aaefa252f1 10 }
IanBenzMaxim 27:d5aaefa252f1 11
IanBenzMaxim 21:00c94aeb533e 12 class DS2465 : public OneWireMaster, public ISha256MacCoprocessor
IanBenzMaxim 21:00c94aeb533e 13 {
IanBenzMaxim 32:bce180b544ed 14 public:
IanBenzMaxim 21:00c94aeb533e 15
IanBenzMaxim 21:00c94aeb533e 16 enum PageRegion
IanBenzMaxim 21:00c94aeb533e 17 {
IanBenzMaxim 21:00c94aeb533e 18 REGION_FULL_PAGE = 0x03,
IanBenzMaxim 21:00c94aeb533e 19 REGION_FIRST_HALF = 0x01,
IanBenzMaxim 21:00c94aeb533e 20 REGION_SECOND_HALF = 0x02
IanBenzMaxim 21:00c94aeb533e 21 };
IanBenzMaxim 21:00c94aeb533e 22
IanBenzMaxim 21:00c94aeb533e 23 enum MemoryAddr
IanBenzMaxim 21:00c94aeb533e 24 {
IanBenzMaxim 21:00c94aeb533e 25 ADDR_SPAD = 0x00,
IanBenzMaxim 21:00c94aeb533e 26 ADDR_CMD_REG = 0x60,
IanBenzMaxim 21:00c94aeb533e 27 ADDR_STATUS_REG = 0x61,
IanBenzMaxim 21:00c94aeb533e 28 ADDR_DATA_REG = 0x62,
IanBenzMaxim 21:00c94aeb533e 29 ADDR_MAC_READ = 0x63,
IanBenzMaxim 21:00c94aeb533e 30 ADDR_SHA_SELECT_REG = 0x66,
IanBenzMaxim 21:00c94aeb533e 31 ADDR_WCFG_REG = 0x67,
IanBenzMaxim 24:8942d8478d68 32 ADDR_TRSTL_REG = 0x68,
IanBenzMaxim 24:8942d8478d68 33 ADDR_TMSP_REG = 0x69,
IanBenzMaxim 24:8942d8478d68 34 ADDR_TW0L_REG = 0x6A,
IanBenzMaxim 24:8942d8478d68 35 ADDR_TREC0_REG = 0x6B,
IanBenzMaxim 24:8942d8478d68 36 ADDR_RWPU_REG = 0x6C,
IanBenzMaxim 24:8942d8478d68 37 ADDR_TW1L_REG = 0x6D,
IanBenzMaxim 21:00c94aeb533e 38 ADDR_USER_MEM_PAGE_0 = 0x80,
IanBenzMaxim 21:00c94aeb533e 39 ADDR_USER_MEM_PAGE_1 = 0xA0
IanBenzMaxim 21:00c94aeb533e 40 };
IanBenzMaxim 21:00c94aeb533e 41
IanBenzMaxim 32:bce180b544ed 42 struct Config
IanBenzMaxim 32:bce180b544ed 43 {
IanBenzMaxim 32:bce180b544ed 44 bool c1WS, cSPU, cPDN, cAPU;
IanBenzMaxim 32:bce180b544ed 45
IanBenzMaxim 32:bce180b544ed 46 std::uint8_t readByte() const;
IanBenzMaxim 32:bce180b544ed 47 std::uint8_t writeByte() const;
IanBenzMaxim 32:bce180b544ed 48
IanBenzMaxim 32:bce180b544ed 49 void reset();
IanBenzMaxim 32:bce180b544ed 50 Config() { reset(); }
IanBenzMaxim 32:bce180b544ed 51 };
IanBenzMaxim 32:bce180b544ed 52
IanBenzMaxim 27:d5aaefa252f1 53 DS2465(mbed::I2C & I2C_interface, std::uint8_t I2C_address);
IanBenzMaxim 21:00c94aeb533e 54
IanBenzMaxim 21:00c94aeb533e 55 // Const member functions should not change the settings of the DS2465 or affect the state of the 1-Wire bus.
IanBenzMaxim 21:00c94aeb533e 56 // Read pointer, scratchpad, MAC output register, and command register on the DS2465 are considered mutable.
IanBenzMaxim 21:00c94aeb533e 57
IanBenzMaxim 21:00c94aeb533e 58 //Misc. Functions
IanBenzMaxim 21:00c94aeb533e 59 OneWireMaster::CmdResult Detect(void);
IanBenzMaxim 21:00c94aeb533e 60 OneWireMaster::CmdResult Reset(void); // Resets DS2465 (NOTE: This is NOT a 1-Wire Reset)
IanBenzMaxim 32:bce180b544ed 61 OneWireMaster::CmdResult WriteConfig(const Config & config);
IanBenzMaxim 32:bce180b544ed 62 Config CurrentConfig() const;
IanBenzMaxim 21:00c94aeb533e 63
IanBenzMaxim 21:00c94aeb533e 64 // DS2465 Memory Commands
IanBenzMaxim 27:d5aaefa252f1 65 OneWireMaster::CmdResult ReadMemory(std::uint8_t addr, std::uint8_t * buf, std::size_t bufLen, bool skip_set_pointer = false) const;
IanBenzMaxim 24:8942d8478d68 66 OneWireMaster::CmdResult WriteMemory(std::uint8_t addr, const std::uint8_t * buf, std::size_t bufLen) { return CWriteMemory(addr, buf, bufLen); }
IanBenzMaxim 24:8942d8478d68 67 OneWireMaster::CmdResult WriteScratchpad(const std::uint8_t * buf, std::size_t bufLen) const { return CWriteMemory(ADDR_SPAD, buf, bufLen); }
IanBenzMaxim 21:00c94aeb533e 68 OneWireMaster::CmdResult CopyScratchpad(bool dest_secret, unsigned int pageNum, bool notFull, unsigned int segmentNum);
IanBenzMaxim 21:00c94aeb533e 69
IanBenzMaxim 21:00c94aeb533e 70 // 1-Wire Master Commands
IanBenzMaxim 21:00c94aeb533e 71 virtual OneWireMaster::CmdResult OWInitMaster(void);
IanBenzMaxim 21:00c94aeb533e 72 virtual OneWireMaster::CmdResult OWReset(void); // Issues a 1-Wire Reset Pulse
IanBenzMaxim 32:bce180b544ed 73 virtual OneWireMaster::CmdResult OWTouchBit(std::uint8_t & sendrecvbit, OWLevel after_level);
IanBenzMaxim 32:bce180b544ed 74 virtual OneWireMaster::CmdResult OWReadByte(std::uint8_t & recvbyte, OWLevel after_level);
IanBenzMaxim 32:bce180b544ed 75 virtual OneWireMaster::CmdResult OWWriteByte(std::uint8_t sendbyte, OWLevel after_level);
IanBenzMaxim 27:d5aaefa252f1 76 virtual OneWireMaster::CmdResult OWReadBlock(std::uint8_t *rx_buf, std::uint8_t rx_len);
IanBenzMaxim 27:d5aaefa252f1 77 virtual OneWireMaster::CmdResult OWWriteBlock(const std::uint8_t *tran_buf, std::uint8_t tran_len);
IanBenzMaxim 27:d5aaefa252f1 78 OneWireMaster::CmdResult OWWriteBlock(bool tx_mac, const std::uint8_t *tran_buf, std::uint8_t tran_len);
IanBenzMaxim 32:bce180b544ed 79 virtual OneWireMaster::CmdResult OWSetSpeed(OWSpeed new_speed);
IanBenzMaxim 32:bce180b544ed 80 virtual OneWireMaster::CmdResult OWSetLevel(OWLevel new_level);
IanBenzMaxim 24:8942d8478d68 81
IanBenzMaxim 32:bce180b544ed 82 virtual OneWireMaster::CmdResult OWTriplet(SearchDirection & search_direction, std::uint8_t & sbr, std::uint8_t & tsb);
IanBenzMaxim 21:00c94aeb533e 83
IanBenzMaxim 21:00c94aeb533e 84 //DS2465 Coprocessor Commands
IanBenzMaxim 21:00c94aeb533e 85 OneWireMaster::CmdResult Compute_NextMasterSecret(bool swap, unsigned int pageNum, PageRegion region);
IanBenzMaxim 21:00c94aeb533e 86 OneWireMaster::CmdResult Compute_WriteMAC(bool regwrite, bool swap, unsigned int pageNum, unsigned int segmentNum) const;
IanBenzMaxim 21:00c94aeb533e 87 OneWireMaster::CmdResult Compute_SSecret(bool swap, unsigned int pageNum, PageRegion region);
IanBenzMaxim 21:00c94aeb533e 88 OneWireMaster::CmdResult Compute_AuthMAC(bool swap, unsigned int pageNum, PageRegion region) const;
IanBenzMaxim 21:00c94aeb533e 89
IanBenzMaxim 21:00c94aeb533e 90 virtual ISha256MacCoprocessor::CmdResult setMasterSecret(const std::uint8_t (&secret)[ISha256MacCoprocessor::secret_len]);
IanBenzMaxim 21:00c94aeb533e 91 virtual ISha256MacCoprocessor::CmdResult ComputeAndRead_WriteMAC(const std::uint8_t (&WriteMAC_data)[WriteMAC_data_len], std::uint8_t (&mac)[mac_len]) const;
IanBenzMaxim 21:00c94aeb533e 92 virtual ISha256MacCoprocessor::CmdResult ComputeAndRead_AuthMAC(const std::uint8_t (&devicePage)[devicePage_len], const std::uint8_t (&challenge)[deviceScratchpad_len],
IanBenzMaxim 21:00c94aeb533e 93 const std::uint8_t (&AuthMAC_data)[AuthMAC_data_len], std::uint8_t (&mac)[mac_len]) const;
IanBenzMaxim 21:00c94aeb533e 94 virtual ISha256MacCoprocessor::CmdResult Compute_SSecret(const std::uint8_t (&devicePage)[devicePage_len],
IanBenzMaxim 21:00c94aeb533e 95 const std::uint8_t (&deviceScratchpad)[deviceScratchpad_len], const std::uint8_t (&SSecret_data)[SSecret_data_len]);
IanBenzMaxim 21:00c94aeb533e 96
IanBenzMaxim 21:00c94aeb533e 97 private:
IanBenzMaxim 21:00c94aeb533e 98
IanBenzMaxim 27:d5aaefa252f1 99 mbed::I2C & m_I2C_interface;
IanBenzMaxim 21:00c94aeb533e 100 std::uint8_t m_I2C_address;
IanBenzMaxim 24:8942d8478d68 101 Config m_curConfig;
IanBenzMaxim 21:00c94aeb533e 102
IanBenzMaxim 24:8942d8478d68 103 OneWireMaster::CmdResult CWriteMemory(std::uint8_t addr, const std::uint8_t * buf, std::size_t bufLen) const;
IanBenzMaxim 27:d5aaefa252f1 104 OneWireMaster::CmdResult PollBusy(std::uint8_t * pStatus = NULL);
IanBenzMaxim 32:bce180b544ed 105 OneWireMaster::CmdResult ConfigureLevel(OWLevel level);
IanBenzMaxim 21:00c94aeb533e 106 };
IanBenzMaxim 21:00c94aeb533e 107
IanBenzMaxim 21:00c94aeb533e 108 #endif