DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
dunedaq::timing::IONode Class Referenceabstract

Base class for timing IO nodes. More...

#include <IONode.hpp>

Inheritance diagram for dunedaq::timing::IONode:
[legend]
Collaboration diagram for dunedaq::timing::IONode:
[legend]

Public Member Functions

 IONode (const uhal::Node &node, std::string uid_i2c_bus, std::string pll_i2c_bus, std::string pll_i2c_device, std::vector< std::string > clock_names, std::vector< std::string > sfp_i2c_buses)
 
virtual ~IONode ()
 
virtual std::string get_uid_address_parameter_name () const =0
 Get the UID address parameter name.
 
virtual uint32_t read_board_type () const
 Read the word identifying the timing board.
 
virtual uint32_t read_carrier_type () const
 Read the word identifying the FPFA carrier board.
 
virtual uint32_t read_design_type () const
 Read the word identifying the firmware design in the FPGA.
 
virtual uint32_t read_firmware_frequency () const
 Read the word identifying the frequency [units of Hz] of the firmware in the FPGA.
 
virtual uint64_t read_board_uid () const
 Read the word containing the timing board UID.
 
virtual BoardRevision get_board_revision () const
 Read the word identifying the timing board.
 
virtual std::string get_hardware_info (bool print_out=false) const
 Print hardware information.
 
virtual std::string get_full_clock_config_file_path (const ClockSource &clock_source) const
 Get the full config path.
 
template<class T >
std::unique_ptr< const T > get_i2c_device (const std::string &i2c_bus_name, const std::string &i2c_device_name) const
 Get the an I2C chip.
 
virtual std::unique_ptr< const SI534xSlave > get_pll () const
 Get the PLL chip.
 
virtual void configure_pll (const std::string &clock_config_file="") const
 Configure clock chip.
 
virtual std::vector< double > read_clock_frequencies () const
 Read frequencies of on-board clocks.
 
virtual std::string get_clock_frequencies_table (bool print_out=false) const
 Print frequencies of on-board clocks.
 
virtual std::string get_pll_status (bool print_out=false) const
 Print status of on-board PLL.
 
virtual std::string get_sfp_status (uint32_t sfp_id, bool print_out=false) const
 Print status of on-board SFP.
 
virtual void switch_sfp_soft_tx_control_bit (uint32_t sfp_id, bool turn_on) const
 control tx laser of on-board SFP softly (I2C command)
 
virtual void switch_sfp_tx (uint32_t sfp_id, bool turn_on) const =0
 control tx laser of on-board SFP
 
virtual void soft_reset () const
 Reset timing node.
 
virtual void reset (const std::string &clock_config_file) const =0
 Reset timing node.
 
virtual void reset (const ClockSource &clock_source) const
 Reset timing node with clock file lookup.
 
virtual bool clocks_ok () const =0
 Clocks ready?
 
virtual void get_info (timinghardwareinfo::TimingPLLMonitorData &mon_data) const
 
- Public Member Functions inherited from dunedaq::timing::TimingNode
 TimingNode (const uhal::Node &node)
 
virtual ~TimingNode ()
 
virtual std::string get_status (bool print_out=false) const =0
 Get the status string of the timing node. Optionally print it.
 
std::map< std::string, uhal::ValWord< uint32_t > > read_sub_nodes (const uhal::Node &node, bool dispatch=true) const
 Read subnodes.
 
void reset_sub_nodes (const uhal::Node &node, uint32_t aValue=0x0, bool dispatch=true) const
 Reset subnodes.
 

Static Public Member Functions

static const std::map< BoardType, std::string > & get_board_type_map ()
 
static const std::map< CarrierType, std::string > & get_carrier_type_map ()
 
static const std::map< BoardRevision, std::string > & get_board_revision_map ()
 
static const std::map< uint64_t, BoardRevision > & get_board_uid_revision_map ()
 
static const std::map< DesignType, std::string > & get_design_type_map ()
 
static const std::map< std::string, std::string > & get_clock_config_map ()
 
static const std::vector< BoardType > & get_library_supported_boards ()
 
static const std::vector< DesignType > & get_library_supported_designs ()
 

Protected Member Functions

virtual void write_soft_reset_register () const
 Write soft reset register.
 

Static Protected Member Functions

static std::string clock_source_to_string (const ClockSource &source)
 

Protected Attributes

const std::string m_uid_i2c_bus
 
const std::string m_pll_i2c_bus
 
const std::string m_pll_i2c_device
 
const std::vector< std::string > m_clock_names
 
const std::vector< std::string > m_sfp_i2c_buses
 

Static Protected Attributes

static const std::map< BoardType, std::string > board_type_map
 
static const std::map< CarrierType, std::string > carrier_type_map
 
static const std::map< BoardRevision, std::string > board_revision_map
 
static const std::map< DesignType, std::string > design_type_map
 
static const std::map< uint64_t, BoardRevisionboard_uid_revision_map
 
static const std::map< ClockSource, std::string > clock_source_map
 
static const std::map< std::string, std::string > clock_config_map
 
static const std::vector< BoardTypelibrary_supported_boards
 
static const std::vector< DesignTypelibrary_supported_designs
 

Detailed Description

Base class for timing IO nodes.

Definition at line 43 of file IONode.hpp.

Constructor & Destructor Documentation

◆ IONode()

dunedaq::timing::IONode::IONode ( const uhal::Node & node,
std::string uid_i2c_bus,
std::string pll_i2c_bus,
std::string pll_i2c_device,
std::vector< std::string > clock_names,
std::vector< std::string > sfp_i2c_buses )

Definition at line 25 of file IONode.cpp.

31 : TimingNode(node)
32 , m_uid_i2c_bus(uid_i2c_bus)
33 , m_pll_i2c_bus(pll_i2c_bus)
34 , m_pll_i2c_device(pll_i2c_device)
35 , m_clock_names(clock_names)
36 , m_sfp_i2c_buses(sfp_i2c_buses)
37// mPLL (new SI534xSlave( getNode<I2CMasterNode>(m_pll_i2c_bus)& ,
38// getNode<I2CMasterNode>(m_pll_i2c_bus).get_slave_address(pll_i2c_device) ))
39{}
const std::string m_pll_i2c_bus
Definition IONode.hpp:201
const std::string m_pll_i2c_device
Definition IONode.hpp:202
const std::string m_uid_i2c_bus
Definition IONode.hpp:200
const std::vector< std::string > m_clock_names
Definition IONode.hpp:203
const std::vector< std::string > m_sfp_i2c_buses
Definition IONode.hpp:204
TimingNode(const uhal::Node &node)

◆ ~IONode()

dunedaq::timing::IONode::~IONode ( )
virtual

Definition at line 43 of file IONode.cpp.

43{}

Member Function Documentation

◆ clock_source_to_string()

static std::string dunedaq::timing::IONode::clock_source_to_string ( const ClockSource & source)
inlinestaticprotected

Definition at line 428 of file IONode.hpp.

429 {
430 if (auto source_it = clock_source_map.find(source); source_it != clock_source_map.end())
431 {
432 return source_it->second;
433 }
434 else
435 {
436 throw MissingClockSourceMapEntry(ERS_HERE, format_reg_value(source));
437 }
438 }
#define ERS_HERE
static const std::map< ClockSource, std::string > clock_source_map
Definition IONode.hpp:347
std::string format_reg_value(T reg_value, uint32_t base)
Definition toolbox.hxx:117

◆ clocks_ok()

◆ configure_pll()

void dunedaq::timing::IONode::configure_pll ( const std::string & clock_config_file = "") const
virtual

Configure clock chip.

Reimplemented in dunedaq::timing::FIBV2IONode, dunedaq::timing::MIBIONode, and dunedaq::timing::SIMIONode.

Definition at line 247 of file IONode.cpp.

248{
249 auto pll = get_pll();
250
251 TLOG() << "PLL configuration file : " << clock_config_file;
252
253 uint32_t si_pll_version = pll->read_device_version(); // NOLINT(build/unsigned)
254 TLOG_DEBUG(0) << "Configuring PLL : SI" << format_reg_value(si_pll_version);
255
256 pll->configure(clock_config_file);
257
258 TLOG_DEBUG(0) << "PLL configuration id : " << pll->read_config_id();
259}
virtual std::unique_ptr< const SI534xSlave > get_pll() const
Get the PLL chip.
Definition IONode.cpp:239
#define TLOG_DEBUG(lvl,...)
Definition Logging.hpp:112
#define TLOG(...)
Definition macro.hpp:22

◆ get_board_revision()

BoardRevision dunedaq::timing::IONode::get_board_revision ( ) const
virtual

Read the word identifying the timing board.

Returns
{ description_of_the_return_value }

Reimplemented in dunedaq::timing::SIMIONode.

Definition at line 104 of file IONode.cpp.

105{
106 auto uid = read_board_uid();
107 try {
108 return get_board_uid_revision_map().at(uid);
109 } catch (const std::out_of_range& e) {
110 ers::warning(UnknownBoardUID(ERS_HERE, format_reg_value(uid), e));
112 }
113}
static const std::map< uint64_t, BoardRevision > & get_board_uid_revision_map()
Definition IONode.hpp:193
virtual uint64_t read_board_uid() const
Read the word containing the timing board UID.
Definition IONode.cpp:88
void warning(const Issue &issue)
Definition ers.hpp:115

◆ get_board_revision_map()

static const std::map< BoardRevision, std::string > & dunedaq::timing::IONode::get_board_revision_map ( )
inlinestatic

Definition at line 192 of file IONode.hpp.

192{ return board_revision_map; }
static const std::map< BoardRevision, std::string > board_revision_map
Definition IONode.hpp:232

◆ get_board_type_map()

static const std::map< BoardType, std::string > & dunedaq::timing::IONode::get_board_type_map ( )
inlinestatic

Definition at line 188 of file IONode.hpp.

188{ return board_type_map; }
static const std::map< BoardType, std::string > board_type_map
Definition IONode.hpp:211

◆ get_board_uid_revision_map()

static const std::map< uint64_t, BoardRevision > & dunedaq::timing::IONode::get_board_uid_revision_map ( )
inlinestatic

Definition at line 193 of file IONode.hpp.

193{ return board_uid_revision_map; }
static const std::map< uint64_t, BoardRevision > board_uid_revision_map
Definition IONode.hpp:259

◆ get_carrier_type_map()

static const std::map< CarrierType, std::string > & dunedaq::timing::IONode::get_carrier_type_map ( )
inlinestatic

Definition at line 190 of file IONode.hpp.

190{ return carrier_type_map; }
static const std::map< CarrierType, std::string > carrier_type_map
Definition IONode.hpp:223

◆ get_clock_config_map()

static const std::map< std::string, std::string > & dunedaq::timing::IONode::get_clock_config_map ( )
inlinestatic

Definition at line 195 of file IONode.hpp.

195{ return clock_config_map; }
static const std::map< std::string, std::string > clock_config_map
Definition IONode.hpp:355

◆ get_clock_frequencies_table()

std::string dunedaq::timing::IONode::get_clock_frequencies_table ( bool print_out = false) const
virtual

Print frequencies of on-board clocks.

Reimplemented in dunedaq::timing::FMCIONode, and dunedaq::timing::SIMIONode.

Definition at line 272 of file IONode.cpp.

273{
274 std::stringstream table;
275 std::vector<double> frequencies = read_clock_frequencies();
276 for (uint8_t i = 0; i < frequencies.size(); ++i) { // NOLINT(build/unsigned)
277 table << m_clock_names.at(i) << " freq: " << std::setprecision(12) << frequencies.at(i) << std::endl;
278 }
279 // TODO add freq validation Stoyan Trilov stoyan.trilov@cern.ch
280 if (print_out)
281 TLOG() << table.str();
282 return table.str();
283}
virtual std::vector< double > read_clock_frequencies() const
Read frequencies of on-board clocks.
Definition IONode.cpp:264

◆ get_design_type_map()

static const std::map< DesignType, std::string > & dunedaq::timing::IONode::get_design_type_map ( )
inlinestatic

Definition at line 194 of file IONode.hpp.

194{ return design_type_map; }
static const std::map< DesignType, std::string > design_type_map
Definition IONode.hpp:240

◆ get_full_clock_config_file_path()

std::string dunedaq::timing::IONode::get_full_clock_config_file_path ( const ClockSource & clock_source) const
virtual

Get the full config path.

Returns
{ description_of_the_return_value }

Definition at line 167 of file IONode.cpp.

168{
169 std::string config_file;
170 std::stringstream clock_config_key;
171
173// const BoardRevision board_revision = get_board_revision();
176 //const uint32_t firmware_frequency = read_firmware_frequency(); // NOLINT(build/unsigned)
177
178 try {
179 clock_config_key << get_board_type_map().at(board_type) << "_";
180 } catch (const std::out_of_range& e) {
181 throw MissingBoardTypeMapEntry(ERS_HERE, format_reg_value(board_type), e);
182 }
183
184 // enclustra i2c switch stuff
185 if (carrier_type == kCarrierEnclustraA35) {
186 try {
187 getNode<I2CMasterNode>(m_uid_i2c_bus).get_slave("AX3_Switch").write_i2c(0x01, 0x7f);
188 } catch (const std::exception& e) {
189 ers::warning(EnclustraSwitchFailure(ERS_HERE, e));
190 }
191 }
192
193 auto pll = get_pll();
194 auto pll_model = pll->read_device_version();
195 clock_config_key << std::hex << pll_model;
196
197// try {
198// clock_config_key = clock_config_key + get_carrier_type_map().at(carrier_type) + "_";
199// } catch (const std::out_of_range& e) {
200// throw MissingCarrierTypeMapEntry(ERS_HERE, format_reg_value(carrier_type), e);
201// }
202
203 try {
204 clock_config_key << "_" << get_design_type_map().at(design_type);
205 } catch (const std::out_of_range& e) {
206 throw MissingDesignTypeMapEntry(ERS_HERE, format_reg_value(design_type), e);
207 }
208
209 clock_config_key << "_" << clock_source_to_string(clock_source);
210
211 TLOG_DEBUG(0) << "Using pll config key: " << clock_config_key.str();
212
213 try {
214 config_file = get_clock_config_map().at(clock_config_key.str());
215 } catch (const std::out_of_range& e) {
216 throw ClockConfigNotFound(ERS_HERE, clock_config_key.str(), e);
217 }
218
219 TLOG_DEBUG(0) << "PLL config file: " << config_file << " from key: " << clock_config_key.str();
220
221 const char* env_var_char = std::getenv("TIMING_SHARE");
222
223 if (env_var_char == nullptr) {
224 throw EnvironmentVariableNotSet(ERS_HERE, "TIMING_SHARE");
225 }
226
227 std::string env_var(env_var_char);
228
229 std::string full_pll_config_file_path = env_var + "/config/etc/clock/" + config_file;
230
231 TLOG_DEBUG(0) << "Full PLL config file path: " << full_pll_config_file_path;
232
233 return full_pll_config_file_path;
234}
virtual uint32_t read_board_type() const
Read the word identifying the timing board.
Definition IONode.cpp:48
virtual uint32_t read_carrier_type() const
Read the word identifying the FPFA carrier board.
Definition IONode.cpp:58
static const std::map< std::string, std::string > & get_clock_config_map()
Definition IONode.hpp:195
virtual uint32_t read_design_type() const
Read the word identifying the firmware design in the FPGA.
Definition IONode.cpp:68
static const std::map< DesignType, std::string > & get_design_type_map()
Definition IONode.hpp:194
static const std::map< BoardType, std::string > & get_board_type_map()
Definition IONode.hpp:188
static std::string clock_source_to_string(const ClockSource &source)
Definition IONode.hpp:428
CarrierType convert_value_to_carrier_type(uint32_t darrier_type)
Definition toolbox.cpp:287
BoardType convert_value_to_board_type(uint32_t Board_type)
Definition toolbox.cpp:274
DesignType convert_value_to_design_type(uint32_t design_type)
Definition toolbox.cpp:300

◆ get_hardware_info()

std::string dunedaq::timing::IONode::get_hardware_info ( bool print_out = false) const
virtual

Print hardware information.

Reimplemented in dunedaq::timing::GIBIONode, and dunedaq::timing::SIMIONode.

Definition at line 118 of file IONode.cpp.

119{
120 std::stringstream info;
122 const BoardRevision board_revision = get_board_revision();
125 const double firmware_frequency = read_firmware_frequency()/1e6;
126
127 std::vector<std::pair<std::string, std::string>> hardware_info;
128
129 try {
130 hardware_info.push_back(std::make_pair("Board type", get_board_type_map().at(board_type)));
131 } catch (const std::out_of_range& e) {
132 ers::error(MissingBoardTypeMapEntry(ERS_HERE, format_reg_value(board_type), e));
133 }
134
135 try {
136 hardware_info.push_back(std::make_pair("Board revision", get_board_revision_map().at(board_revision)));
137 } catch (const std::out_of_range& e) {
138 ers::error(MissingBoardRevisionMapEntry(ERS_HERE, format_reg_value(board_revision), e));
139 }
140
141 hardware_info.push_back(std::make_pair("Board UID", format_reg_value(read_board_uid())));
142
143 try {
144 hardware_info.push_back(std::make_pair("Carrier type", get_carrier_type_map().at(carrier_type)));
145 } catch (const std::out_of_range& e) {
146 ers::error(MissingCarrierTypeMapEntry(ERS_HERE, format_reg_value(carrier_type), e));
147 }
148
149 try {
150 hardware_info.push_back(std::make_pair("Design type", get_design_type_map().at(design_type)));
151 } catch (const std::out_of_range& e) {
152 ers::error(MissingDesignTypeMapEntry(ERS_HERE, format_reg_value(design_type), e));
153 }
154
155 hardware_info.push_back(std::make_pair("Firmware frequency [MHz]", std::to_string(firmware_frequency)));
156
157 info << format_reg_table(hardware_info, "Hardware info", { "", "" });
158
159 if (print_out)
160 TLOG() << info.str();
161 return info.str();
162}
virtual BoardRevision get_board_revision() const
Read the word identifying the timing board.
Definition IONode.cpp:104
virtual uint32_t read_firmware_frequency() const
Read the word identifying the frequency [units of Hz] of the firmware in the FPGA.
Definition IONode.cpp:78
static const std::map< BoardRevision, std::string > & get_board_revision_map()
Definition IONode.hpp:192
static const std::map< CarrierType, std::string > & get_carrier_type_map()
Definition IONode.hpp:190
std::string format_reg_table(T data, std::string title, std::vector< std::string > headers)
Format reg-value table.
Definition toolbox.hxx:166
void error(const Issue &issue)
Definition ers.hpp:81

◆ get_i2c_device()

template<class T >
std::unique_ptr< const T > dunedaq::timing::IONode::get_i2c_device ( const std::string & i2c_bus_name,
const std::string & i2c_device_name ) const

Get the an I2C chip.

Returns
{ description_of_the_return_value }

Definition at line 6 of file IONode.hxx.

7{
8 return std::unique_ptr<T>(new T(&getNode<I2CMasterNode>(i2c_bus_name),
9 getNode<I2CMasterNode>(i2c_bus_name).get_slave_address(i2c_device_name)));
10}

◆ get_info()

virtual void dunedaq::timing::IONode::get_info ( timinghardwareinfo::TimingPLLMonitorData & mon_data) const
inlinevirtual

Reimplemented in dunedaq::timing::FIBV2IONode.

Definition at line 186 of file IONode.hpp.

186{get_pll()->get_info(mon_data);}

◆ get_library_supported_boards()

static const std::vector< BoardType > & dunedaq::timing::IONode::get_library_supported_boards ( )
inlinestatic

Definition at line 196 of file IONode.hpp.

196{ return library_supported_boards; }
static const std::vector< BoardType > library_supported_boards
Definition IONode.hpp:420

◆ get_library_supported_designs()

static const std::vector< DesignType > & dunedaq::timing::IONode::get_library_supported_designs ( )
inlinestatic

Definition at line 197 of file IONode.hpp.

static const std::vector< DesignType > library_supported_designs
Definition IONode.hpp:424

◆ get_pll()

std::unique_ptr< const SI534xSlave > dunedaq::timing::IONode::get_pll ( ) const
virtual

Get the PLL chip.

Returns
{ description_of_the_return_value }

Reimplemented in dunedaq::timing::FIBV2IONode, and dunedaq::timing::GIBIONode.

Definition at line 239 of file IONode.cpp.

240{
242}
std::unique_ptr< const T > get_i2c_device(const std::string &i2c_bus_name, const std::string &i2c_device_name) const
Get the an I2C chip.
Definition IONode.hxx:6

◆ get_pll_status()

std::string dunedaq::timing::IONode::get_pll_status ( bool print_out = false) const
virtual

Print status of on-board PLL.

Reimplemented in dunedaq::timing::FIBV2IONode, dunedaq::timing::MIBIONode, and dunedaq::timing::SIMIONode.

Definition at line 288 of file IONode.cpp.

289{
290 return get_pll()->get_status(print_out);
291}

◆ get_sfp_status()

std::string dunedaq::timing::IONode::get_sfp_status ( uint32_t sfp_id,
bool print_out = false ) const
virtual

Print status of on-board SFP.

Reimplemented in dunedaq::timing::FIBIONode, dunedaq::timing::FIBV2IONode, dunedaq::timing::GIBIONode, dunedaq::timing::MIBIONode, dunedaq::timing::MIBV2IONode, dunedaq::timing::PC059IONode, dunedaq::timing::SIMIONode, and dunedaq::timing::TLUIONode.

Definition at line 324 of file IONode.cpp.

325{
326 std::stringstream status;
327 std::string sfp_i2c_bus;
328 try {
329 sfp_i2c_bus = m_sfp_i2c_buses.at(sfp_id);
330 } catch (const std::out_of_range& e) {
331 throw InvalidSFPId(ERS_HERE, format_reg_value(sfp_id), e);
332 }
333 auto sfp = get_i2c_device<I2CSFPSlave>(sfp_i2c_bus, "SFP_EEProm");
334 status << sfp->get_status();
335 if (print_out)
336 TLOG() << status.str();
337 return status.str();
338}

◆ get_uid_address_parameter_name()

virtual std::string dunedaq::timing::IONode::get_uid_address_parameter_name ( ) const
pure virtual

◆ read_board_type()

uint32_t dunedaq::timing::IONode::read_board_type ( ) const
virtual

Read the word identifying the timing board.

Returns
{ description_of_the_return_value }

Definition at line 48 of file IONode.cpp.

49{
50 uhal::ValWord<uint32_t> board_type = getNode("config.board_type").read(); // NOLINT(build/unsigned)
51 getClient().dispatch();
52 return board_type.value();
53}

◆ read_board_uid()

uint64_t dunedaq::timing::IONode::read_board_uid ( ) const
virtual

Read the word containing the timing board UID.

Returns
{ description_of_the_return_value }

Reimplemented in dunedaq::timing::SIMIONode.

Definition at line 88 of file IONode.cpp.

89{
90
91 uint64_t uid = 0; // NOLINT(build/unsigned)
92 std::vector<uint8_t> uid_values = // NOLINT(build/unsigned)
93 getNode<I2CMasterNode>(m_uid_i2c_bus).get_slave(get_uid_address_parameter_name()).read_i2cArray(0xfa, 6);
94
95 for (uint8_t i = 0; i < uid_values.size(); ++i) { // NOLINT(build/unsigned)
96 uid = (uid << 8) | uid_values.at(i);
97 }
98 return uid;
99}
virtual std::string get_uid_address_parameter_name() const =0
Get the UID address parameter name.

◆ read_carrier_type()

uint32_t dunedaq::timing::IONode::read_carrier_type ( ) const
virtual

Read the word identifying the FPFA carrier board.

Returns
{ description_of_the_return_value }

Definition at line 58 of file IONode.cpp.

59{
60 uhal::ValWord<uint32_t> carrier_type = getNode("config.carrier_type").read(); // NOLINT(build/unsigned)
61 getClient().dispatch();
62 return carrier_type.value();
63}

◆ read_clock_frequencies()

std::vector< double > dunedaq::timing::IONode::read_clock_frequencies ( ) const
virtual

Read frequencies of on-board clocks.

Reimplemented in dunedaq::timing::FMCIONode, and dunedaq::timing::SIMIONode.

Definition at line 264 of file IONode.cpp.

265{
266 return getNode<FrequencyCounterNode>("freq").measure_frequencies(m_clock_names.size());
267}

◆ read_design_type()

uint32_t dunedaq::timing::IONode::read_design_type ( ) const
virtual

Read the word identifying the firmware design in the FPGA.

Returns
{ description_of_the_return_value }

Definition at line 68 of file IONode.cpp.

69{
70 uhal::ValWord<uint32_t> design_type = getNode("config.design_type").read(); // NOLINT(build/unsigned)
71 getClient().dispatch();
72 return design_type.value();
73}

◆ read_firmware_frequency()

uint32_t dunedaq::timing::IONode::read_firmware_frequency ( ) const
virtual

Read the word identifying the frequency [units of Hz] of the firmware in the FPGA.

Returns
{ description_of_the_return_value }

Definition at line 78 of file IONode.cpp.

79{
80 uhal::ValWord<uint32_t> firmware_frequency = getNode("config.clock_frequency").read(); // NOLINT(build/unsigned)
81 getClient().dispatch();
82 return firmware_frequency.value();
83}

◆ reset() [1/2]

void dunedaq::timing::IONode::reset ( const ClockSource & clock_source) const
virtual

Reset timing node with clock file lookup.

Reimplemented in dunedaq::timing::FIBIONode, dunedaq::timing::FIBV2IONode, dunedaq::timing::FMCIONode, dunedaq::timing::GIBIONode, dunedaq::timing::MIBIONode, dunedaq::timing::MIBV2IONode, dunedaq::timing::PC059IONode, dunedaq::timing::SIMIONode, and dunedaq::timing::TLUIONode.

Definition at line 314 of file IONode.cpp.

315{
316 // Find the right pll config file
317 std::string clock_config = get_full_clock_config_file_path(clock_source);
318 reset(clock_config);
319}
virtual void reset(const std::string &clock_config_file) const =0
Reset timing node.
virtual std::string get_full_clock_config_file_path(const ClockSource &clock_source) const
Get the full config path.
Definition IONode.cpp:167

◆ reset() [2/2]

virtual void dunedaq::timing::IONode::reset ( const std::string & clock_config_file) const
pure virtual

◆ soft_reset()

void dunedaq::timing::IONode::soft_reset ( ) const
virtual

Reset timing node.

Definition at line 305 of file IONode.cpp.

306{
308 TLOG_DEBUG(0) << "Soft reset done";
309}
virtual void write_soft_reset_register() const
Write soft reset register.
Definition IONode.cpp:296

◆ switch_sfp_soft_tx_control_bit()

void dunedaq::timing::IONode::switch_sfp_soft_tx_control_bit ( uint32_t sfp_id,
bool turn_on ) const
virtual

control tx laser of on-board SFP softly (I2C command)

Reimplemented in dunedaq::timing::FIBIONode, dunedaq::timing::FIBV2IONode, dunedaq::timing::GIBIONode, dunedaq::timing::MIBIONode, dunedaq::timing::MIBV2IONode, dunedaq::timing::PC059IONode, dunedaq::timing::SIMIONode, and dunedaq::timing::TLUIONode.

Definition at line 343 of file IONode.cpp.

344{
345 std::string sfp_i2c_bus;
346 try {
347 sfp_i2c_bus = m_sfp_i2c_buses.at(sfp_id);
348 } catch (const std::out_of_range& e) {
349 throw InvalidSFPId(ERS_HERE, format_reg_value(sfp_id), e);
350 }
351 auto sfp = get_i2c_device<I2CSFPSlave>(sfp_i2c_bus, "SFP_EEProm");
352 sfp->switch_soft_tx_control_bit(turn_on);
353}

◆ switch_sfp_tx()

virtual void dunedaq::timing::IONode::switch_sfp_tx ( uint32_t sfp_id,
bool turn_on ) const
pure virtual

◆ write_soft_reset_register()

void dunedaq::timing::IONode::write_soft_reset_register ( ) const
protectedvirtual

Write soft reset register.

Definition at line 296 of file IONode.cpp.

297{
298 getNode("csr.ctrl.soft_rst").write(0x1);
299 getClient().dispatch();
300}

Member Data Documentation

◆ board_revision_map

const std::map<BoardRevision, std::string> dunedaq::timing::IONode::board_revision_map
inlinestaticprotected
Initial value:
= {
{ kFMCRev1, "kFMCRev1" }, { kFMCRev2, "kFMCRev2" }, { kFMCRev3, "kFMCRev3" },
{ kPC059Rev1, "kPC059Rev1" }, { kTLURev1, "kTLURev1" }, { kSIMRev1, "kSIMRev1" },
{ kFIBRev1, "kFIBRev1" }, { kFMCRev4, "kFMCRev4" }, { kMIBRev1, "kMIBRev1" },
{ kPC069a, "pc069a" }, { kPC069b, "pc069b" }, { kPC069c, "pc069c" }, { kMIBRev2, "kMIBRev2" }, { kGIBRev1, "kGIBRev1" },
{ kFIBRev2, "kFIBRev2" }, { kBoardRevisionUnknown, "unknown" }
}

Definition at line 232 of file IONode.hpp.

232 {
233 { kFMCRev1, "kFMCRev1" }, { kFMCRev2, "kFMCRev2" }, { kFMCRev3, "kFMCRev3" },
234 { kPC059Rev1, "kPC059Rev1" }, { kTLURev1, "kTLURev1" }, { kSIMRev1, "kSIMRev1" },
235 { kFIBRev1, "kFIBRev1" }, { kFMCRev4, "kFMCRev4" }, { kMIBRev1, "kMIBRev1" },
236 { kPC069a, "pc069a" }, { kPC069b, "pc069b" }, { kPC069c, "pc069c" }, { kMIBRev2, "kMIBRev2" }, { kGIBRev1, "kGIBRev1" },
237 { kFIBRev2, "kFIBRev2" }, { kBoardRevisionUnknown, "unknown" }
238 };

◆ board_type_map

const std::map<BoardType, std::string> dunedaq::timing::IONode::board_type_map
inlinestaticprotected
Initial value:
= { { kBoardFMC, "fmc" },
{ kBoardSim, "sim" },
{ kBoardPC059, "pc059" },
{ kBoardMicrozed, "microzed" },
{ kBoardTLU, "tlu" },
{ kBoardFIB, "fib" },
{ kBoardMIB, "mib" },
{ kBoardPC069, "pc069" },
{ kBoardGIB, "gib" },
{ kBoardUnknown, "unknown" }
}

Definition at line 211 of file IONode.hpp.

211 { { kBoardFMC, "fmc" },
212 { kBoardSim, "sim" },
213 { kBoardPC059, "pc059" },
214 { kBoardMicrozed, "microzed" },
215 { kBoardTLU, "tlu" },
216 { kBoardFIB, "fib" },
217 { kBoardMIB, "mib" },
218 { kBoardPC069, "pc069" },
219 { kBoardGIB, "gib" },
220 { kBoardUnknown, "unknown" }
221 };

◆ board_uid_revision_map

const std::map<uint64_t, BoardRevision> dunedaq::timing::IONode::board_uid_revision_map
inlinestaticprotected

Definition at line 259 of file IONode.hpp.

259 {
260 { 0xd880395e720b, kFMCRev1 },
261 { 0xd880395e501a, kFMCRev1 },
262 { 0xd880395e50b8, kFMCRev1 },
263 { 0xd880395e501b, kFMCRev1 },
264 { 0xd880395e7201, kFMCRev1 },
265 { 0xd880395e4fcc, kFMCRev1 },
266 { 0xd880395e5069, kFMCRev1 },
267 { 0xd880395e7206, kFMCRev1 },
268 { 0xd880395e1c86, kFMCRev2 },
269 { 0xd880395e2630, kFMCRev2 },
270 { 0xd880395e262b, kFMCRev2 },
271 { 0xd880395e2b38, kFMCRev2 },
272 { 0xd880395e1a6a, kFMCRev2 },
273 { 0xd880395e36ae, kFMCRev2 },
274 { 0xd880395e2b2e, kFMCRev2 },
275 { 0xd880395e2b33, kFMCRev2 },
276 { 0xd880395e1c81, kFMCRev2 },
277 { 0x049162b67ce6, kFMCRev3 },
278 { 0x049162b62947, kFMCRev3 },
279 { 0x049162b67cdf, kFMCRev3 },
280 { 0x49162b62050, kFMCRev3 },
281 { 0x49162b62951, kFMCRev3 },
282 { 0x49162b675e3, kFMCRev3 },
283 { 0xd88039d980cf, kPC059Rev1 },
284 { 0xd88039d98adf, kPC059Rev1 },
285 { 0xd88039d92491, kPC059Rev1 },
286 { 0xd88039d9248e, kPC059Rev1 },
287 { 0xd88039d98ae9, kPC059Rev1 },
288 { 0xd88039d92498, kPC059Rev1 },
289 { 0x5410ecbba408, kTLURev1 },
290 { 0x5410ecbb9426, kTLURev1 },
291 { 0x801f12f5ce48, kFIBRev1 },
292 { 0x801f12f5e9ae, kFIBRev1 },
293 { 0x49162b65025, kFMCRev3 },
294 { 0x49162b62948, kFMCRev3 },
295 { 0x49162b675ea, kFMCRev3 },
296 { 0x49162b645cd, kFMCRev3 },
297 { 0xd880395dab52, kFMCRev4 },
298 { 0xd880395d99b3, kFMCRev4 },
299 { 0xd880395df010, kFMCRev4 },
300 { 0xd880395df00f, kFMCRev4 },
301 { 0xd880395de4a4, kFMCRev4 },
302 { 0xd880395d99a9, kFMCRev4 },
303 { 0xd880395d99b0, kFMCRev4 },
304 { 0xd880395de452, kFMCRev4 },
305 { 0xd880395da48e, kFMCRev4 },
306 { 0xd880395dbcee, kFMCRev4 },
307 { 0x803428749c04, kPC069a },
308 { 0x5410ecbb6845, kTLURev1 },
309 { 0x801f12ee6739, kMIBRev1 },
310 { 0x801f12f5e183, kFIBRev1 },
311 { 0x49162b1d910, kMIBRev2 },
312 { 0x801f12ee56f3, kGIBRev1 },
313 { 0x80342874c33d, kPC069a },
314 { 0x803428748902, kPC069a },
315 { 0x8034287498ea, kPC069a },
316 { 0xfc0fe700bece, kPC069b },
317 { 0xfc0fe700c286, kPC069b },
318 { 0xfc0fe700d293, kPC069b },
319 { 0xfc0fe700bec4, kPC069b },
320 { 0xfc0fe700c281, kPC069b },
321 { 0xfc0fe700bec9, kPC069b },
322 { 0xfc0fe700d28e, kPC069b },
323 { 0xfc0fe700d289, kPC069b },
324 { 0xfc0fe700d298, kPC069b },
325 { 0xfc0fe700c28b, kPC069b },
326 { 0xfc0fe7ea5d1e, kPC069b },
327 { 0x049162b1d4bf, kMIBRev2 },
328 { 0xfc0fe7ea5d1e, kPC069c },
329 { 0xfc0fe7ea9113, kPC069c },
330 { 0xfc0fe7ea5d28, kPC069c },
331 { 0xfc0fe7eaa20c, kPC069c },
332 { 0xfc0fe7ea51e4, kPC069c },
333 { 0xfc0fe7ea6251, kPC069c },
334 { 0xfc0fe7ea51da, kPC069c },
335 { 0xfc0fe7ea5d2d, kPC069c },
336 { 0xfc0fe7ea9112, kPC069c },
337 { 0xfc0fe7ea51df, kPC069c },
338 { 0xfc0fe7eaa202, kPC069c },
339 { 0xfc0fe7ea5d23, kPC069c },
340 { 0xfc0fe7eaa203, kPC069c },
341 { 0xfc0fe7eaa20d, kPC069c },
342 { 0xfc0fe7ea6256, kPC069c },
343 { 0xd8478fa99d2d, kPC069b },
344 { 0xd8478fa99b57, kPC069b },
345 };

◆ carrier_type_map

const std::map<CarrierType, std::string> dunedaq::timing::IONode::carrier_type_map
inlinestaticprotected
Initial value:
= { { kCarrierEnclustraA35, "enclustra-a35" },
{ kCarrierKC705, "kc705" },
{ kCarrierMicrozed, "microzed" },
{ kCarrierATFC, "atfc" },
{ kCarrierAFC, "afc" },
{ kCarrierNexusVideo, "nexus-video" },
{ kCarrierTrenzTE0712, "trenz-te0712" },
{ kCarrierUnknown, "unknown" }
}

Definition at line 223 of file IONode.hpp.

223 { { kCarrierEnclustraA35, "enclustra-a35" },
224 { kCarrierKC705, "kc705" },
225 { kCarrierMicrozed, "microzed" },
226 { kCarrierATFC, "atfc" },
227 { kCarrierAFC, "afc" },
228 { kCarrierNexusVideo, "nexus-video" },
229 { kCarrierTrenzTE0712, "trenz-te0712" },
230 { kCarrierUnknown, "unknown" }
231 };

◆ clock_config_map

const std::map<std::string, std::string> dunedaq::timing::IONode::clock_config_map
inlinestaticprotected

Definition at line 355 of file IONode.hpp.

355 {
356
357 // 62.5 MHz mappings (no cdr)
358 { "fmc_5344_ouroboros_free_run", "SI5344/PDTS0003.txt" },
359 { "fmc_5394_ouroboros_free_run", "SI5344/PDTS0003.txt" },
360
361 { "fmc_5344_master_free_run", "SI5344/PDTS0003.txt" },
362 { "fmc_5394_master_free_run", "SI5344/PDTS0003.txt" },
363
364 { "fmc_5344_overlord_free_run", "SI5344/PDTS0003.txt" },
365 { "fmc_5394_overlord_free_run", "SI5344/PDTS0003.txt" },
366
367 { "fmc_5344_boreas_free_run", "SI5344/PDTS0003.txt" },
368 { "fmc_5394_boreas_free_run", "SI5344/PDTS0003.txt" },
369
370 { "fmc_5344_endpoint_input_1", "devel/ENDPOINT-Si5344-50MHzRef.txt" },
371 { "fmc_5394_endpoint_input_1", "devel/ENDPOINT-Si5344-50MHzRef.txt" },
372
373 { "fmc_5344_chronos_input_1", "devel/ENDPOINT-Si5344-50MHzRef.txt" },
374 { "fmc_5394_chronos_input_1", "devel/ENDPOINT-Si5344-50MHzRef.txt" },
375
376 { "fmc_5344_charon_input_1", "devel/ENDPOINT-Si5344-50MHzRef.txt" },
377 { "fmc_5394_charon_input_1", "devel/ENDPOINT-Si5344-50MHzRef.txt" },
378
379 { "fmc_5344_hades_input_1", "devel/ENDPOINT-Si5344-50MHzRef.txt" },
380 { "fmc_5394_hades_input_1", "devel/ENDPOINT-Si5344-50MHzRef.txt" },
381
382 { "tlu_5345_boreas_free_run", "nocdr/DUNE_TLU-4_45_M-Registers.txt" },
383
384 { "pc059_5345_master_free_run", "devel/PDTS_PC059_FANOUT.txt" },
385 { "pc059_5345_fanout_input_1", "devel/PDTS_PC059_FANOUT_SFP_IN.txt" },
386
387 { "pc069_5395_master_free_run", "nocdr/Si5395-RevA-069a_mst-Registers.txt" },
388 { "pc069_5395_boreas_free_run", "nocdr/Si5395-RevA-069a_mst-Registers.txt" },
389
390 { "pc069_5395_endpoint_input_1", "nocdr/Si5395-RevA-069a_ep-Registers.txt" },
391 { "pc069_5395_chronos_input_1", "nocdr/Si5395-RevA-069a_ep-Registers.txt" },
392 { "pc069_5395_charon_input_1", "nocdr/Si5395-RevA-069a_ep-Registers.txt" },
393 { "pc069_5395_hades_input_1", "nocdr/Si5395-RevA-069a_ep-Registers.txt" },
394
395 { "pc069_5345_master_free_run", "nocdr/Si5345-RevD-pc69bmst-Registers.txt" },
396 { "pc069_5345_boreas_free_run", "nocdr/Si5345-RevD-pc69bmst-Registers.txt" },
397
398 { "pc069_5345_chronos_input_1", "nocdr/Si5345-RevD-pc69bept-Registers.txt" },
399 { "pc069_5345_charon_input_1", "nocdr/Si5345-RevD-pc69bept-Registers.txt" },
400 { "pc069_5345_endpoint_input_1", "nocdr/Si5345-RevD-pc69bept-Registers.txt" },
401 { "pc069_5345_hades_input_1", "nocdr/Si5345-RevD-pc69bept-Registers.txt" },
402
403 { "gib_5395_gaia_free_run", "nocdr/GIB_Debug_01.txt" },
404
405 { "gib_5395_gaia_input_0", "nocdr/Si5395-RevA-GIB10MHZ-Registers.txt" },
406
407 { "mib_5395_kerberos_free_run",
408 "nocdr/Si5395-RevA-MIB_FREE-Registers.txt" },
409 { "mib_5395_kerberos_input_0",
410 "nocdr/Si5395-RevA-MIB_INSW-Registers.txt" },
411 { "mib_5395_kerberos_input_1",
412 "nocdr/Si5395-RevA-MIB_INSW-Registers.txt" },
413 { "mib_5395_kerberos_input_2",
414 "nocdr/Si5395-RevA-MIB_INSW-Registers.txt" },
415
416 { "fib_5395_fanout_input_1",
417 "nocdr/Si5395-RevA-FIB_FAN_AFCv4-FIBBP250-Registers.txt" }, // fanout design, data and clock from backplane
418 };

◆ clock_source_map

const std::map<ClockSource, std::string> dunedaq::timing::IONode::clock_source_map
inlinestaticprotected
Initial value:
= {
{ kFreeRun, "free_run" },
{ kInput0, "input_0" },
{ kInput1, "input_1" },
{ kInput2, "input_2" },
{ kInput3, "input_3" },
}

Definition at line 347 of file IONode.hpp.

347 {
348 { kFreeRun, "free_run" },
349 { kInput0, "input_0" },
350 { kInput1, "input_1" },
351 { kInput2, "input_2" },
352 { kInput3, "input_3" },
353 };

◆ design_type_map

const std::map<DesignType, std::string> dunedaq::timing::IONode::design_type_map
inlinestaticprotected
Initial value:
= {
{ kDesignMaster, "master" },
{ kDesignOuroboros, "ouroboros" },
{ kDesignOuroborosSim, "ouroboros-sim" },
{ kDesignTest, "test-design" },
{ kDesignEndpoint, "endpoint" },
{ kDesignFanout, "fanout" },
{ kDesignOverlord, "overlord" },
{ kDesignEndpoBICRT, "endpoint-bi-crt" },
{ kDesignChronos, "chronos" },
{ kDesignBoreas, "boreas" },
{ kDesignKerberos, "kerberos" },
{ kDesignGaia, "gaia" },
{ kDesignCharon, "charon" },
{ kDesignHades, "hades" },
{ kDesignUnknown, "unknown" },
}

Definition at line 240 of file IONode.hpp.

240 {
241 { kDesignMaster, "master" },
242 { kDesignOuroboros, "ouroboros" },
243 { kDesignOuroborosSim, "ouroboros-sim" },
244 { kDesignTest, "test-design" },
245 { kDesignEndpoint, "endpoint" },
246 { kDesignFanout, "fanout" },
247 { kDesignOverlord, "overlord" },
248 { kDesignEndpoBICRT, "endpoint-bi-crt" },
249 { kDesignChronos, "chronos" },
250 { kDesignBoreas, "boreas" },
251 { kDesignKerberos, "kerberos" },
252 { kDesignGaia, "gaia" },
253 { kDesignCharon, "charon" },
254 { kDesignHades, "hades" },
255 { kDesignUnknown, "unknown" },
256 };

◆ library_supported_boards

const std::vector<BoardType> dunedaq::timing::IONode::library_supported_boards
inlinestaticprotected
Initial value:

Definition at line 420 of file IONode.hpp.

◆ library_supported_designs

const std::vector<DesignType> dunedaq::timing::IONode::library_supported_designs
inlinestaticprotected

◆ m_clock_names

const std::vector<std::string> dunedaq::timing::IONode::m_clock_names
protected

Definition at line 203 of file IONode.hpp.

◆ m_pll_i2c_bus

const std::string dunedaq::timing::IONode::m_pll_i2c_bus
protected

Definition at line 201 of file IONode.hpp.

◆ m_pll_i2c_device

const std::string dunedaq::timing::IONode::m_pll_i2c_device
protected

Definition at line 202 of file IONode.hpp.

◆ m_sfp_i2c_buses

const std::vector<std::string> dunedaq::timing::IONode::m_sfp_i2c_buses
protected

Definition at line 204 of file IONode.hpp.

◆ m_uid_i2c_bus

const std::string dunedaq::timing::IONode::m_uid_i2c_bus
protected

Definition at line 200 of file IONode.hpp.


The documentation for this class was generated from the following files: