Implementation of 1-Wire with added Alarm Search Functionality
Dependents: Max32630_One_Wire_Interface
OneWire_Masters/DS2465/DS2465.hpp@32:bce180b544ed, 2016-03-30 (annotated)
- 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?
User | Revision | Line number | New 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 |