Implementation of 1-Wire with added Alarm Search Functionality

Dependents:   Max32630_One_Wire_Interface

Committer:
IanBenzMaxim
Date:
Mon Mar 21 14:12:28 2016 -0500
Revision:
21:00c94aeb533e
Child:
24:8942d8478d68
Added class for DS2465. Added a ReadBytePower operation to OneWireMaster since this is required by the authenticators including the DS28E15. Tweaked member data of OneWireMaster. Added path to header file includes to reduce compiler setup required.

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 "mbed.h"
IanBenzMaxim 21:00c94aeb533e 5 #include "OneWire_Masters/OneWireMaster.h"
IanBenzMaxim 21:00c94aeb533e 6 #include "OneWire_Masters/ISha256MacCoprocessor.hpp"
IanBenzMaxim 21:00c94aeb533e 7
IanBenzMaxim 21:00c94aeb533e 8 class DS2465 : public OneWireMaster, public ISha256MacCoprocessor
IanBenzMaxim 21:00c94aeb533e 9 {
IanBenzMaxim 21:00c94aeb533e 10 public:
IanBenzMaxim 21:00c94aeb533e 11 enum Direction
IanBenzMaxim 21:00c94aeb533e 12 {
IanBenzMaxim 21:00c94aeb533e 13 DIRECTION_WRITE_ZERO = 0,
IanBenzMaxim 21:00c94aeb533e 14 DIRECTION_WRITE_ONE = 1
IanBenzMaxim 21:00c94aeb533e 15 };
IanBenzMaxim 21:00c94aeb533e 16
IanBenzMaxim 21:00c94aeb533e 17 enum PageRegion
IanBenzMaxim 21:00c94aeb533e 18 {
IanBenzMaxim 21:00c94aeb533e 19 REGION_FULL_PAGE = 0x03,
IanBenzMaxim 21:00c94aeb533e 20 REGION_FIRST_HALF = 0x01,
IanBenzMaxim 21:00c94aeb533e 21 REGION_SECOND_HALF = 0x02
IanBenzMaxim 21:00c94aeb533e 22 };
IanBenzMaxim 21:00c94aeb533e 23
IanBenzMaxim 21:00c94aeb533e 24 enum OWConfigAddr
IanBenzMaxim 21:00c94aeb533e 25 {
IanBenzMaxim 21:00c94aeb533e 26 ADDR_TRSTL_REG = 0x68,
IanBenzMaxim 21:00c94aeb533e 27 ADDR_TMSP_REG = 0x69,
IanBenzMaxim 21:00c94aeb533e 28 ADDR_TW0L_REG = 0x6A,
IanBenzMaxim 21:00c94aeb533e 29 ADDR_TREC0_REG = 0x6B,
IanBenzMaxim 21:00c94aeb533e 30 ADDR_RWPU_REG = 0x6C,
IanBenzMaxim 21:00c94aeb533e 31 ADDR_TW1L_REG = 0x6D
IanBenzMaxim 21:00c94aeb533e 32 };
IanBenzMaxim 21:00c94aeb533e 33
IanBenzMaxim 21:00c94aeb533e 34 // DS2465 addresses
IanBenzMaxim 21:00c94aeb533e 35 enum MemoryAddr
IanBenzMaxim 21:00c94aeb533e 36 {
IanBenzMaxim 21:00c94aeb533e 37 ADDR_SPAD = 0x00,
IanBenzMaxim 21:00c94aeb533e 38 ADDR_CMD_REG = 0x60,
IanBenzMaxim 21:00c94aeb533e 39 ADDR_STATUS_REG = 0x61,
IanBenzMaxim 21:00c94aeb533e 40 ADDR_DATA_REG = 0x62,
IanBenzMaxim 21:00c94aeb533e 41 ADDR_MAC_READ = 0x63,
IanBenzMaxim 21:00c94aeb533e 42 ADDR_SHA_SELECT_REG = 0x66,
IanBenzMaxim 21:00c94aeb533e 43 ADDR_WCFG_REG = 0x67,
IanBenzMaxim 21:00c94aeb533e 44 ADDR_USER_MEM_PAGE_0 = 0x80,
IanBenzMaxim 21:00c94aeb533e 45 ADDR_USER_MEM_PAGE_1 = 0xA0
IanBenzMaxim 21:00c94aeb533e 46 };
IanBenzMaxim 21:00c94aeb533e 47
IanBenzMaxim 21:00c94aeb533e 48 DS2465(I2C & I2C_interface, std::uint8_t I2C_address);
IanBenzMaxim 21:00c94aeb533e 49
IanBenzMaxim 21:00c94aeb533e 50 // Const member functions should not change the settings of the DS2465 or affect the state of the 1-Wire bus.
IanBenzMaxim 21:00c94aeb533e 51 // Read pointer, scratchpad, MAC output register, and command register on the DS2465 are considered mutable.
IanBenzMaxim 21:00c94aeb533e 52
IanBenzMaxim 21:00c94aeb533e 53 //Misc. Functions
IanBenzMaxim 21:00c94aeb533e 54 OneWireMaster::CmdResult Detect(void);
IanBenzMaxim 21:00c94aeb533e 55 OneWireMaster::CmdResult Reset(void); // Resets DS2465 (NOTE: This is NOT a 1-Wire Reset)
IanBenzMaxim 21:00c94aeb533e 56
IanBenzMaxim 21:00c94aeb533e 57 // DS2465 Memory Commands
IanBenzMaxim 21:00c94aeb533e 58 OneWireMaster::CmdResult ReadMemory(std::uint8_t addr, std::uint8_t * buf, size_t bufLen, bool skip_set_pointer = false) const;
IanBenzMaxim 21:00c94aeb533e 59 OneWireMaster::CmdResult WriteScratchpad(std::uint8_t addr, const std::uint8_t * buf, size_t bufLen) const;
IanBenzMaxim 21:00c94aeb533e 60 OneWireMaster::CmdResult CopyScratchpad(bool dest_secret, unsigned int pageNum, bool notFull, unsigned int segmentNum);
IanBenzMaxim 21:00c94aeb533e 61
IanBenzMaxim 21:00c94aeb533e 62 // DS2465 Configuration Commands
IanBenzMaxim 21:00c94aeb533e 63 OneWireMaster::CmdResult ReadOneWireConfig(OWConfigAddr addr, std::uint8_t & config) const;
IanBenzMaxim 21:00c94aeb533e 64 OneWireMaster::CmdResult WriteOneWireConfig(OWConfigAddr addr, unsigned int ovr, unsigned int std);
IanBenzMaxim 21:00c94aeb533e 65
IanBenzMaxim 21:00c94aeb533e 66 // 1-Wire Master Commands
IanBenzMaxim 21:00c94aeb533e 67 virtual OneWireMaster::CmdResult OWInitMaster(void);
IanBenzMaxim 21:00c94aeb533e 68 virtual OneWireMaster::CmdResult OWReset(void); // Issues a 1-Wire Reset Pulse
IanBenzMaxim 21:00c94aeb533e 69 virtual OneWireMaster::CmdResult OWWriteByte(uint8_t sendbyte);
IanBenzMaxim 21:00c94aeb533e 70 virtual OneWireMaster::CmdResult OWReadByte(uint8_t & recvbyte);
IanBenzMaxim 21:00c94aeb533e 71 virtual OneWireMaster::CmdResult OWTouchByte(uint8_t & sendrecvbyte);
IanBenzMaxim 21:00c94aeb533e 72 virtual OneWireMaster::CmdResult OWTouchBit(uint8_t & sendrecvbit);
IanBenzMaxim 21:00c94aeb533e 73 virtual OneWireMaster::CmdResult OWWriteBit(uint8_t sendbit);
IanBenzMaxim 21:00c94aeb533e 74 virtual OneWireMaster::CmdResult OWReadBit(uint8_t & recvbit);
IanBenzMaxim 21:00c94aeb533e 75 virtual OneWireMaster::CmdResult OWBlock(uint8_t *tran_buf, uint8_t tran_len);
IanBenzMaxim 21:00c94aeb533e 76 virtual OneWireMaster::CmdResult OWFirst(RomId & romId);
IanBenzMaxim 21:00c94aeb533e 77 virtual OneWireMaster::CmdResult OWNext(RomId & romId);
IanBenzMaxim 21:00c94aeb533e 78 virtual OneWireMaster::CmdResult OWVerify(const RomId & romId);
IanBenzMaxim 21:00c94aeb533e 79 virtual void OWTargetSetup(RomId & romId);
IanBenzMaxim 21:00c94aeb533e 80 virtual void OWFamilySkipSetup(void);
IanBenzMaxim 21:00c94aeb533e 81 virtual OneWireMaster::CmdResult OWSearch(RomId & romId);
IanBenzMaxim 21:00c94aeb533e 82 virtual OneWireMaster::CmdResult OWReadROM(RomId & romId);
IanBenzMaxim 21:00c94aeb533e 83 virtual OneWireMaster::CmdResult OWSkipROM(void);
IanBenzMaxim 21:00c94aeb533e 84 virtual OneWireMaster::CmdResult OWMatchROM(const RomId & romId);
IanBenzMaxim 21:00c94aeb533e 85 virtual OneWireMaster::CmdResult OWOverdriveSkipROM(void);
IanBenzMaxim 21:00c94aeb533e 86 virtual OneWireMaster::CmdResult OWResume(void);
IanBenzMaxim 21:00c94aeb533e 87 virtual OneWireMaster::CmdResult OWOverdriveMatchROM(const RomId & romId);
IanBenzMaxim 21:00c94aeb533e 88
IanBenzMaxim 21:00c94aeb533e 89 // Extended 1-Wire functions
IanBenzMaxim 21:00c94aeb533e 90 virtual OneWireMaster::CmdResult OWSpeed(OW_SPEED new_speed);
IanBenzMaxim 21:00c94aeb533e 91 virtual OneWireMaster::CmdResult OWLevel(OW_LEVEL new_level);
IanBenzMaxim 21:00c94aeb533e 92 virtual OneWireMaster::CmdResult OWWriteBytePower(uint8_t sendbyte);
IanBenzMaxim 21:00c94aeb533e 93 virtual OneWireMaster::CmdResult OWReadBytePower(uint8_t & recvbyte);
IanBenzMaxim 21:00c94aeb533e 94 virtual OneWireMaster::CmdResult OWReadBitPower(uint8_t applyPowerResponse);
IanBenzMaxim 21:00c94aeb533e 95 virtual OneWireMaster::CmdResult OWWriteBlock(const uint8_t *tran_buf, uint8_t tran_len);
IanBenzMaxim 21:00c94aeb533e 96 OneWireMaster::CmdResult OWWriteBlock(bool tx_mac, const uint8_t *tran_buf, uint8_t tran_len);
IanBenzMaxim 21:00c94aeb533e 97 virtual OneWireMaster::CmdResult OWReadBlock(uint8_t *rx_buf, uint8_t rx_len);
IanBenzMaxim 21:00c94aeb533e 98 OneWireMaster::CmdResult OWPowerDown(void);
IanBenzMaxim 21:00c94aeb533e 99 OneWireMaster::CmdResult OWPowerUp(void);
IanBenzMaxim 21:00c94aeb533e 100 OneWireMaster::CmdResult ConfigureAPU(bool apu_enable);
IanBenzMaxim 21:00c94aeb533e 101
IanBenzMaxim 21:00c94aeb533e 102 OneWireMaster::CmdResult Triplet(Direction search_direction, uint8_t & status);
IanBenzMaxim 21:00c94aeb533e 103
IanBenzMaxim 21:00c94aeb533e 104 //DS2465 Coprocessor Commands
IanBenzMaxim 21:00c94aeb533e 105 OneWireMaster::CmdResult Compute_NextMasterSecret(bool swap, unsigned int pageNum, PageRegion region);
IanBenzMaxim 21:00c94aeb533e 106 OneWireMaster::CmdResult Compute_WriteMAC(bool regwrite, bool swap, unsigned int pageNum, unsigned int segmentNum) const;
IanBenzMaxim 21:00c94aeb533e 107 OneWireMaster::CmdResult Compute_SSecret(bool swap, unsigned int pageNum, PageRegion region);
IanBenzMaxim 21:00c94aeb533e 108 OneWireMaster::CmdResult Compute_AuthMAC(bool swap, unsigned int pageNum, PageRegion region) const;
IanBenzMaxim 21:00c94aeb533e 109
IanBenzMaxim 21:00c94aeb533e 110 virtual ISha256MacCoprocessor::CmdResult setMasterSecret(const std::uint8_t (&secret)[ISha256MacCoprocessor::secret_len]);
IanBenzMaxim 21:00c94aeb533e 111 virtual ISha256MacCoprocessor::CmdResult ComputeAndRead_WriteMAC(const std::uint8_t (&WriteMAC_data)[WriteMAC_data_len], std::uint8_t (&mac)[mac_len]) const;
IanBenzMaxim 21:00c94aeb533e 112 virtual ISha256MacCoprocessor::CmdResult ComputeAndRead_AuthMAC(const std::uint8_t (&devicePage)[devicePage_len], const std::uint8_t (&challenge)[deviceScratchpad_len],
IanBenzMaxim 21:00c94aeb533e 113 const std::uint8_t (&AuthMAC_data)[AuthMAC_data_len], std::uint8_t (&mac)[mac_len]) const;
IanBenzMaxim 21:00c94aeb533e 114 virtual ISha256MacCoprocessor::CmdResult Compute_SSecret(const std::uint8_t (&devicePage)[devicePage_len],
IanBenzMaxim 21:00c94aeb533e 115 const std::uint8_t (&deviceScratchpad)[deviceScratchpad_len], const std::uint8_t (&SSecret_data)[SSecret_data_len]);
IanBenzMaxim 21:00c94aeb533e 116
IanBenzMaxim 21:00c94aeb533e 117 private:
IanBenzMaxim 21:00c94aeb533e 118 static const int POLL_LIMIT = 200;
IanBenzMaxim 21:00c94aeb533e 119
IanBenzMaxim 21:00c94aeb533e 120 I2C & m_I2C_interface;
IanBenzMaxim 21:00c94aeb533e 121 std::uint8_t m_I2C_address;
IanBenzMaxim 21:00c94aeb533e 122
IanBenzMaxim 21:00c94aeb533e 123 std::uint8_t c1WS, cSPU, cPDN, cAPU;
IanBenzMaxim 21:00c94aeb533e 124 bool short_detected;
IanBenzMaxim 21:00c94aeb533e 125
IanBenzMaxim 21:00c94aeb533e 126 // Search state
IanBenzMaxim 21:00c94aeb533e 127 std::uint8_t m_lastDiscrepancy;
IanBenzMaxim 21:00c94aeb533e 128 std::uint8_t m_lastFamilyDiscrepancy;
IanBenzMaxim 21:00c94aeb533e 129 std::uint8_t m_lastDeviceFlag;
IanBenzMaxim 21:00c94aeb533e 130
IanBenzMaxim 21:00c94aeb533e 131 //DS2465 Configuration Commands
IanBenzMaxim 21:00c94aeb533e 132 OneWireMaster::CmdResult Write_Config(uint8_t config);
IanBenzMaxim 21:00c94aeb533e 133 OneWireMaster::CmdResult Write_Command_Reg(uint8_t cmd, uint8_t par, bool poll) const;
IanBenzMaxim 21:00c94aeb533e 134 };
IanBenzMaxim 21:00c94aeb533e 135
IanBenzMaxim 21:00c94aeb533e 136 #endif