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

Class for the TLU board. More...

#include <TLUIONode.hpp>

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

Public Member Functions

 TLUIONode (const uhal::Node &node)
 
virtual ~TLUIONode ()
 
std::string get_uid_address_parameter_name () const override
 Get the UID address parameter name.
 
std::string get_status (bool print_out=false) const
 Print the status of the timing node.
 
void reset (const std::string &clock_config_file) const override
 Reset IO node.
 
void configure_dac (uint32_t dac_id, uint32_t dac_value, bool internal_ref=false) const
 Configure on-board DAC.
 
std::string get_sfp_status (uint32_t sfp_id, bool print_out=false) const override
 Print status of on-board SFP.
 
bool clocks_ok () const override
 Clocks ready?
 
void switch_sfp_soft_tx_control_bit (uint32_t, bool) const override
 Control tx laser of on-board SFP softly (I2C command)
 
void switch_sfp_tx (uint32_t, bool) const override
 Control tx laser of on-board SFP softly (I2C command)
 
virtual void reset (const ClockSource &clock_source) const
 Reset IO, with clock file look up.
 
- Public Member Functions inherited from 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)
 
virtual ~IONode ()
 
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 void soft_reset () const
 Reset timing node.
 
virtual void get_info (timinghardwareinfo::TimingPLLMonitorData &mon_data) const
 
- Public Member Functions inherited from dunedaq::timing::TimingNode
 TimingNode (const uhal::Node &node)
 
virtual ~TimingNode ()
 
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.
 

Protected Attributes

const std::vector< std::string > m_dac_devices
 Fill hardware monitoring structure.
 
- Protected Attributes inherited from dunedaq::timing::IONode
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
 

Private Member Functions

void validate_sfp_id (uint32_t sfp_id) const
 

Additional Inherited Members

- Static Public Member Functions inherited from dunedaq::timing::IONode
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 inherited from dunedaq::timing::IONode
virtual void write_soft_reset_register () const
 Write soft reset register.
 
- Static Protected Member Functions inherited from dunedaq::timing::IONode
static std::string clock_source_to_string (const ClockSource &source)
 
- Static Protected Attributes inherited from dunedaq::timing::IONode
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

Class for the TLU board.

Definition at line 33 of file TLUIONode.hpp.

Constructor & Destructor Documentation

◆ TLUIONode()

dunedaq::timing::TLUIONode::TLUIONode ( const uhal::Node & node)
explicit

Definition at line 19 of file TLUIONode.cpp.

20 : IONode(node, "i2c", "i2c", "SI5345", { "PLL" }, {})
21 , m_dac_devices({ "DAC1", "DAC2" })
22{}
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 IONode.cpp:25
const std::vector< std::string > m_dac_devices
Fill hardware monitoring structure.
Definition TLUIONode.hpp:99

◆ ~TLUIONode()

dunedaq::timing::TLUIONode::~TLUIONode ( )
virtual

Definition at line 26 of file TLUIONode.cpp.

26{}

Member Function Documentation

◆ clocks_ok()

bool dunedaq::timing::TLUIONode::clocks_ok ( ) const
overridevirtual

Clocks ready?

Implements dunedaq::timing::IONode.

Definition at line 151 of file TLUIONode.cpp.

152{
153 std::stringstream status;
154
155 auto states = read_sub_nodes(getNode("csr.stat"));
156 //bool pll_ok = states.find("pll_ok")->second.value();
157 bool mmcm_ok = states.find("mmcm_ok")->second.value();
158
159 TLOG_DEBUG(5) << ", mmcm ok: " << mmcm_ok;
160
161 return mmcm_ok; // TODO for check pll lock when appropiate
162}
std::map< std::string, uhal::ValWord< uint32_t > > read_sub_nodes(const uhal::Node &node, bool dispatch=true) const
Read subnodes.
#define TLOG_DEBUG(lvl,...)
Definition Logging.hpp:112

◆ configure_dac()

void dunedaq::timing::TLUIONode::configure_dac ( uint32_t dac_id,
uint32_t dac_value,
bool internal_ref = false ) const

Configure on-board DAC.

Definition at line 126 of file TLUIONode.cpp.

127{
128 std::string dac_device;
129 try {
130 dac_device = m_dac_devices.at(dac_id);
131 } catch (const std::out_of_range& e) {
132 throw InvalidDACId(ERS_HERE, format_reg_value(dac_id));
133 }
134 auto dac = get_i2c_device<DACSlave>(m_uid_i2c_bus, dac_device);
135 dac->set_interal_ref(internal_ref);
136 dac->set_dac(7, dac_value);
137}
#define ERS_HERE
const std::string m_uid_i2c_bus
Definition IONode.hpp:200
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
std::string format_reg_value(T reg_value, uint32_t base)
Definition toolbox.hxx:117

◆ get_sfp_status()

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

Print status of on-board SFP.

Reimplemented from dunedaq::timing::IONode.

Definition at line 142 of file TLUIONode.cpp.

143{
144 TLOG() << "TLU does not support SFP I2C";
145 return "";
146}
#define TLOG(...)
Definition macro.hpp:22

◆ get_status()

std::string dunedaq::timing::TLUIONode::get_status ( bool print_out = false) const
virtual

Print the status of the timing node.

Implements dunedaq::timing::TimingNode.

Definition at line 39 of file TLUIONode.cpp.

40{
41 auto subnodes = read_sub_nodes(getNode("csr.stat"));
42 std::stringstream status;
43 status << format_reg_table(subnodes, "TLU IO state");
44
45 if (print_out)
46 TLOG() << status.str();
47 return status.str();
48}
std::string format_reg_table(T data, std::string title, std::vector< std::string > headers)
Format reg-value table.
Definition toolbox.hxx:166

◆ get_uid_address_parameter_name()

std::string dunedaq::timing::TLUIONode::get_uid_address_parameter_name ( ) const
overridevirtual

Get the UID address parameter name.

Returns
{ description_of_the_return_value }

Implements dunedaq::timing::IONode.

Definition at line 31 of file TLUIONode.cpp.

32{
33 return "UID_PROM";
34}

◆ reset() [1/2]

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

Reset IO, with clock file look up.

Reimplemented from dunedaq::timing::IONode.

Definition at line 179 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 std::string get_full_clock_config_file_path(const ClockSource &clock_source) const
Get the full config path.
Definition IONode.cpp:167
void reset(const std::string &clock_config_file) const override
Reset IO node.
Definition TLUIONode.cpp:53

◆ reset() [2/2]

void dunedaq::timing::TLUIONode::reset ( const std::string & clock_config_file) const
overridevirtual

Reset IO node.

Implements dunedaq::timing::IONode.

Definition at line 53 of file TLUIONode.cpp.

54{
55 // Soft reset
57
58 millisleep(1000);
59
60 // Reset PLL and I2C
61 getNode("csr.ctrl.pll_rst").write(0x1);
62 getNode("csr.ctrl.pll_rst").write(0x0);
63
64 getNode("csr.ctrl.rst_i2c").write(0x1);
65 getNode("csr.ctrl.rst_i2c").write(0x0);
66
67 getClient().dispatch();
68
69 // enclustra i2c switch stuff
70 try {
71 getNode<I2CMasterNode>(m_uid_i2c_bus).get_slave("AX3_Switch").write_i2c(0x01, 0x7f);
72 } catch (const std::exception& e) {
73 ers::warning(EnclustraSwitchFailure(ERS_HERE, e));
74 }
75
76 // Upload config file to PLL
77 configure_pll(clock_config_file);
78
79 // Tweak the PLL swing
80 auto si_chip = get_pll();
81 si_chip->write_i2cArray(0x113, { 0x9, 0x33 });
82
83 // Reset mmcm
84 getNode("csr.ctrl.rst").write(0x1);
85 getNode("csr.ctrl.rst").write(0x0);
86 getClient().dispatch();
87
88 // configure tlu io expanders
89 auto ic_6 = get_i2c_device<I2CExpanderSlave>(m_uid_i2c_bus, "Expander1");
90 auto ic_7 = get_i2c_device<I2CExpanderSlave>(m_uid_i2c_bus, "Expander2");
91
92 // Bank 0
93 ic_6->set_inversion(0, 0x00);
94 ic_6->set_io(0, 0x00);
95 ic_6->set_outputs(0, 0x00);
96
97 // Bank 1
98 ic_6->set_inversion(1, 0x00);
99 ic_6->set_io(1, 0x00);
100 ic_6->set_outputs(1, 0x88);
101
102 // Bank 0
103 ic_7->set_inversion(0, 0x00);
104 ic_7->set_io(0, 0x00);
105 ic_7->set_outputs(0, 0xf0);
106
107 // Bank 1
108 ic_7->set_inversion(1, 0x00);
109 ic_7->set_io(1, 0x00);
110 ic_7->set_outputs(1, 0xf0);
111
112 // BI signals are NIM
113 uint32_t bi_signal_threshold = 0x589D; // NOLINT(build/unsigned)
114
115 configure_dac(0, bi_signal_threshold);
116 configure_dac(1, bi_signal_threshold);
117
118 TLOG_DEBUG(0) << "DAC1 and DAC2 set to " << std::hex << bi_signal_threshold;
119
120 TLOG() << "Reset done";
121}
virtual void write_soft_reset_register() const
Write soft reset register.
Definition IONode.cpp:296
virtual std::unique_ptr< const SI534xSlave > get_pll() const
Get the PLL chip.
Definition IONode.cpp:239
virtual void configure_pll(const std::string &clock_config_file="") const
Configure clock chip.
Definition IONode.cpp:247
void configure_dac(uint32_t dac_id, uint32_t dac_value, bool internal_ref=false) const
Configure on-board DAC.
void millisleep(const double &time_in_milliseconds)
Definition toolbox.cpp:83
void warning(const Issue &issue)
Definition ers.hpp:115

◆ switch_sfp_soft_tx_control_bit()

void dunedaq::timing::TLUIONode::switch_sfp_soft_tx_control_bit ( uint32_t ,
bool  ) const
overridevirtual

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

Reimplemented from dunedaq::timing::IONode.

Definition at line 167 of file TLUIONode.cpp.

168{
169 TLOG() << "TLU does not support SFP I2C";
170}

◆ switch_sfp_tx()

void dunedaq::timing::TLUIONode::switch_sfp_tx ( uint32_t sfp_id,
bool turn_on ) const
overridevirtual

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

Implements dunedaq::timing::IONode.

Definition at line 175 of file TLUIONode.cpp.

176{
177 validate_sfp_id(sfp_id);
178
179 getNode("csr.ctrl.sfp_tx_dis").write(turn_on);
180 getClient().dispatch();
181}
void validate_sfp_id(uint32_t sfp_id) const

◆ validate_sfp_id()

void dunedaq::timing::TLUIONode::validate_sfp_id ( uint32_t sfp_id) const
private

Definition at line 186 of file TLUIONode.cpp.

187{ // NOLINT(build/unsigned)
188 // on this board we have 3 upstream SFPs
189 if (sfp_id != 0)
190 {
191 throw InvalidSFPId(ERS_HERE, format_reg_value(sfp_id));
192 }
193}

Member Data Documentation

◆ m_dac_devices

const std::vector<std::string> dunedaq::timing::TLUIONode::m_dac_devices
protected

Fill hardware monitoring structure.

Give info to collector.

Definition at line 99 of file TLUIONode.hpp.


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