DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
I2CMasterNode.hpp
Go to the documentation of this file.
1
21#ifndef TIMING_INCLUDE_TIMING_I2CMASTERNODE_HPP_
22#define TIMING_INCLUDE_TIMING_I2CMASTERNODE_HPP_
23
24#include "timing/TimingNode.hpp"
25
26// uHal Headers
27#include "TimingIssues.hpp"
28#include "ers/Issue.hpp"
29#include "uhal/DerivedNode.hpp"
30
31#include <string>
32#include <unordered_map>
33#include <vector>
34
35namespace dunedaq {
36namespace timing {
37
38class I2CSlave;
39
40class I2CMasterNode : public uhal::Node
41{
42 UHAL_DERIVEDNODE(I2CMasterNode)
43public:
44 explicit I2CMasterNode(const uhal::Node& node);
45 I2CMasterNode(const I2CMasterNode& node);
46 virtual ~I2CMasterNode();
47
49 virtual uint16_t get_i2c_clock_prescale() const { return m_clock_prescale; } // NOLINT(build/unsigned)
50
51 virtual std::vector<std::string> get_slaves() const;
52 virtual uint8_t get_slave_address(const std::string& name) const; // NOLINT(build/unsigned)
53 virtual const I2CSlave& get_slave(const std::string& name) const;
54
55 void reset() const;
56
58 virtual uint8_t read_i2c(uint8_t i2c_device_address, uint32_t i2c_reg_address) const; // NOLINT(build/unsigned)
59 virtual void write_i2c(uint8_t i2c_device_address, // NOLINT(build/unsigned)
60 uint32_t i2c_reg_address, // NOLINT(build/unsigned)
61 uint8_t data, // NOLINT(build/unsigned)
62 bool send_stop = true) const;
63
64 virtual std::vector<uint8_t> read_i2cArray(uint8_t i2c_device_address, // NOLINT(build/unsigned)
65 uint32_t i2c_reg_address, // NOLINT(build/unsigned)
66 uint32_t number_of_words) const; // NOLINT(build/unsigned)
67 virtual void write_i2cArray(uint8_t i2c_device_address, // NOLINT(build/unsigned)
68 uint32_t i2c_reg_address, // NOLINT(build/unsigned)
69 std::vector<uint8_t> data, // NOLINT(build/unsigned)
70 bool send_stop = true) const;
71
72 virtual std::vector<uint8_t> read_i2cPrimitive(uint8_t i2c_device_address, // NOLINT(build/unsigned)
73 uint32_t number_of_bytes) const; // NOLINT(build/unsigned)
74 virtual void write_i2cPrimitive(uint8_t i2c_device_address, // NOLINT(build/unsigned)
75 const std::vector<uint8_t>& data, // NOLINT(build/unsigned)
76 bool send_stop = true) const;
77
78 bool ping(uint8_t i2c_device_address) const; // NOLINT(build/unsigned)
79
80 std::vector<uint8_t> scan() const; // NOLINT(build/unsigned)
81
82protected:
83 // low level i2c functions
84 std::vector<uint8_t> virtual read_block_i2c(uint8_t i2c_device_address, // NOLINT(build/unsigned)
85 uint32_t number_of_bytes) const; // NOLINT(build/unsigned)
86 void virtual write_block_i2c(uint8_t i2c_device_address, // NOLINT(build/unsigned)
87 const std::vector<uint8_t>& data, // NOLINT(build/unsigned)
88 bool send_stop = true) const;
89
90 uint8_t send_i2c_command_and_read_data(uint8_t command) const; // NOLINT(build/unsigned)
91 void send_i2c_command_and_write_data(uint8_t command, uint8_t data) const; // NOLINT(build/unsigned)
92
94 std::unordered_map<std::string, uint8_t> m_i2c_device_addresses; // NOLINT(build/unsigned)
95
96private:
98 void constructor();
99
100 // low level i2c functions
101 void wait_until_finished(bool require_acknowledgement = true, bool require_bus_idle_at_end = false) const;
102
104 static const std::string kPreHiNode;
105 static const std::string kPreLoNode;
106 static const std::string kCtrlNode;
107 static const std::string kTxNode;
108 static const std::string kRxNode;
109 static const std::string kCmdNode;
110 static const std::string kStatusNode;
111
112 static const uint8_t kStartCmd; // 1 << 7 // NOLINT(build/unsigned)
113 static const uint8_t kStopCmd; // 1 << // NOLINT(build/unsigned)
114 static const uint8_t kReadFromSlaveCmd; // 1 << 5 // NOLINT(build/unsigned)
115 static const uint8_t kWriteToSlaveCmd; // 1 << 4 // NOLINT(build/unsigned)
116 static const uint8_t kAckCmd; // 1 << 3 // NOLINT(build/unsigned)
117 static const uint8_t kInterruptAck; // 1 // NOLINT(build/unsigned)
118
119 static const uint8_t kReceivedAckBit; // recvdack = 0x1 << 7 // NOLINT(build/unsigned)
120 static const uint8_t kBusyBit; // busy = 0x1 << 6 // NOLINT(build/unsigned)
121 static const uint8_t kArbitrationLostBit; // arblost = 0x1 << 5 // NOLINT(build/unsigned)
122 static const uint8_t kInProgressBit; // inprogress = 0x1 << 1 // NOLINT(build/unsigned)
123 static const uint8_t kInterruptBit; // interrupt = 0x1 // NOLINT(build/unsigned)
124
126 uint16_t m_clock_prescale; // NOLINT(build/unsigned)
127
129 std::unordered_map<std::string, I2CSlave*>
130 m_i2c_devices; // TODO, Eric Flumerfelt <eflumerf@fnal.gov> May-21-2021: Consider using smart pointers
131
132 friend class I2CSlave;
133};
134
135} // namespace timing
136} // namespace dunedaq
137
138#endif // TIMING_INCLUDE_TIMING_I2CMASTERNODE_HPP_
Class to provide OpenCode I2C interface to a ipbus node.
virtual std::vector< uint8_t > read_block_i2c(uint8_t i2c_device_address, uint32_t number_of_bytes) const
std::unordered_map< std::string, uint8_t > m_i2c_device_addresses
Slaves.
static const std::string kCtrlNode
static const std::string kStatusNode
virtual uint16_t get_i2c_clock_prescale() const
void send_i2c_command_and_write_data(uint8_t command, uint8_t data) const
virtual void write_i2c(uint8_t i2c_device_address, uint32_t i2c_reg_address, uint8_t data, bool send_stop=true) const
std::vector< uint8_t > scan() const
I2CMasterNode(const uhal::Node &node)
virtual void write_i2cPrimitive(uint8_t i2c_device_address, const std::vector< uint8_t > &data, bool send_stop=true) const
static const std::string kCmdNode
static const std::string kPreHiNode
IPBus register names for i2c bus.
virtual std::vector< uint8_t > read_i2cArray(uint8_t i2c_device_address, uint32_t i2c_reg_address, uint32_t number_of_words) const
uint16_t m_clock_prescale
clock prescale factor
static const uint8_t kInProgressBit
static const std::string kPreLoNode
static const uint8_t kArbitrationLostBit
virtual uint8_t get_slave_address(const std::string &name) const
uint8_t send_i2c_command_and_read_data(uint8_t command) const
std::unordered_map< std::string, I2CSlave * > m_i2c_devices
I2C slaves attached to this node.
virtual std::vector< uint8_t > read_i2cPrimitive(uint8_t i2c_device_address, uint32_t number_of_bytes) const
static const uint8_t kWriteToSlaveCmd
virtual uint8_t read_i2c(uint8_t i2c_device_address, uint32_t i2c_reg_address) const
commodity functions
virtual std::vector< std::string > get_slaves() const
static const std::string kTxNode
virtual void write_i2cArray(uint8_t i2c_device_address, uint32_t i2c_reg_address, std::vector< uint8_t > data, bool send_stop=true) const
static const uint8_t kInterruptBit
static const uint8_t kReceivedAckBit
virtual const I2CSlave & get_slave(const std::string &name) const
virtual void write_block_i2c(uint8_t i2c_device_address, const std::vector< uint8_t > &data, bool send_stop=true) const
void wait_until_finished(bool require_acknowledgement=true, bool require_bus_idle_at_end=false) const
static const uint8_t kReadFromSlaveCmd
bool ping(uint8_t i2c_device_address) const
static const std::string kRxNode
static const uint8_t kInterruptAck
Including Qt Headers.