19UHAL_REGISTER_DERIVED_NODE(FIBIONode)
23 SFPMuxIONode(aNode, "i2c", "i2c", "SI5345", {
"PLL",
"BKP DATA"}, {
"i2c_sfp0",
"i2c_sfp1",
"i2c_sfp2",
"i2c_sfp3",
"i2c_sfp4",
"i2c_sfp5",
"i2c_sfp6",
"i2c_sfp7"}) {
44 std::stringstream status;
50 std::vector<std::pair<std::string, std::string>> sfps_summary;
51 sfps_summary.push_back(std::make_pair(
"SFP LOS flags",
format_reg_value(sfp_los_flags, 16)));
52 sfps_summary.push_back(std::make_pair(
"SFP fault flags",
format_reg_value(sfp_fault_flags, 16)));
58 TLOG() << status.str();
75 getNode(
"csr.ctrl.rstb_i2c").write(0x1);
76 getNode(
"csr.ctrl.rstb_i2c").write(0x0);
78 getNode(
"csr.ctrl.rst").write(0x1);
79 getNode(
"csr.ctrl.rst").write(0x0);
81 getClient().dispatch();
85 if (carrier_type == kCarrierEnclustraA35) {
88 getNode<I2CMasterNode>(
m_uid_i2c_bus).get_slave(
"AX3_Switch").write_i2c(0x01, 0x7f);
89 }
catch (
const std::exception& e) {
99 ic_10->set_inversion(0, 0x00);
102 ic_10->set_io(0, 0x00);
104 ic_10->set_outputs(0, 0x00);
107 ic_10->set_inversion(1, 0x00);
109 ic_10->set_io(1, 0xff);
112 ic_23->set_inversion(0, 0x00);
114 ic_23->set_io(0, 0xfe);
115 ic_23->set_outputs(0, 0x01);
118 ic_23->set_inversion(1, 0x00);
120 ic_23->set_io(1, 0xff);
136 TLOG() <<
"Reset done";
144 getNode(
"csr.ctrl.inmux").write(mux_channel);
145 getClient().dispatch();
154 auto active_sfp_mux_channel = getNode(
"csr.ctrl.inmux").read();
155 getClient().dispatch();
156 return active_sfp_mux_channel.value();
164 std::stringstream status;
168 std::string sfp_i2c_bus =
"i2c_sfp" + std::to_string(sfp_id);
170 status <<
"Fanout SFP " << sfp_id <<
":" << std::endl;
171 status << sfp->get_status();
174 TLOG() << status.str();
187 std::string sfp_i2c_bus =
"i2c_sfp" + std::to_string(sfp_id);
189 sfp->switch_soft_tx_control_bit(turn_on);
198 ic_23->set_outputs(0, 0x00);
199 ic_23->set_outputs(0, 0x01);
208 uint8_t sfp_los_flags = ic_23->read_inputs(0x01);
209 return sfp_los_flags;
219 uint8_t sfp_fault_flags = ic_10->read_inputs(0x01);
220 return sfp_fault_flags;
246 uint8_t current_sfp_tx_control_flags = ic_10->read_outputs_config(0);
248 uint8_t new_sfp_tx_control_flags;
251 new_sfp_tx_control_flags = current_sfp_tx_control_flags & ~(1UL << sfp_id);
255 new_sfp_tx_control_flags = current_sfp_tx_control_flags | (1UL << sfp_id);
258 ic_10->set_outputs(0, new_sfp_tx_control_flags);
266 std::stringstream status;
269 bool pll_ok = states.find(
"pll_ok")->second.value();
270 bool mmcm_ok = states.find(
"mmcm_ok")->second.value();
272 TLOG_DEBUG(5) <<
"pll ok: " << pll_ok <<
", mmcm ok: " << mmcm_ok;
274 return pll_ok && mmcm_ok;
uint8_t read_sfp_fault_flag(uint32_t sfp_id) const
reset on-board SFP flags using I2C IO expanders
void switch_sfp_soft_tx_control_bit(uint32_t sfp_id, bool turn_on) const override
control tx laser of on-board SFP softly (I2C command)
void validate_sfp_id(uint32_t sfp_id) const
Fill hardware monitoring structure.
uint8_t read_sfp_los_flags() const
reset on-board SFP flags using I2C IO expanders
uint8_t read_sfp_fault_flags() const
reset on-board SFP flags using I2C IO expanders
void reset(const std::string &clock_config_file) const override
Reset FIB node.
std::string get_sfp_status(uint32_t sfp_id, bool print_out=false) const override
Print status of on-board SFP.
void switch_sfp_tx(uint32_t sfp_id, bool turn_on) const override
reset on-board SFP flags using I2C IO expanders
uint32_t read_active_sfp_mux_channel() const override
Read the active SFP mux channel.
void reset_pll() const
reset on-board PLL using I2C IO expanders
void switch_sfp_mux_channel(uint32_t mux_channel) const override
Switch the SFP mux channel.
uint8_t read_sfp_los_flag(uint32_t sfp_id) const
reset on-board SFP flags using I2C IO expanders
std::string get_uid_address_parameter_name() const override
Get the UID address parameter name.
bool clocks_ok() const override
Clocks ready?
std::string get_status(bool print_out=false) const override
Get status string, optionally print.
virtual void write_soft_reset_register() const
Write soft reset register.
virtual uint32_t read_carrier_type() const
Read the word identifying the FPFA carrier board.
const std::string m_uid_i2c_bus
virtual void configure_pll(const std::string &clock_config_file="") const
Configure clock chip.
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.
Base class for boards which have a physical SFP mux.
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,...)
CarrierType convert_value_to_carrier_type(uint32_t darrier_type)
std::string format_reg_table(T data, std::string title, std::vector< std::string > headers)
Format reg-value table.
std::string format_reg_value(T reg_value, uint32_t base)
void millisleep(const double &time_in_milliseconds)
void warning(const Issue &issue)