18#include "flxcard/FlxException.h"
41m_device_id(device_id),
43m_flx_senders(flx_senders)
47 <<
"CardControllerWrapper constructor called. Open card " <<
m_device_id;
61 <<
"CardControllerWrapper destructor called. First stop check, then closing card.";
73 m_flx_card->cfg_set_option( BF_MMCM_MAIN_LCLK_SEL, 1 );
77 m_flx_card->cfg_set_option(BF_GBT_SOFT_RESET, 0xFFFFFFFFFFFF);
78 m_flx_card->cfg_set_option(BF_GBT_SOFT_RESET, 0);
80 int bad_channels =
m_flx_card->gbt_setup( FLX_GBT_ALIGNMENT_ONE, FLX_GBT_TMODE_FEC );
82 TLOG()<< bad_channels <<
" not aligned.";
92 for(
size_t i=0 ; i<12; ++i) {
95 set_bitfield(fmt::format(
"DECODING_LINK{:02}_EGROUP0_CTRL_EPATH_ENA", i), 0);
124 set_bitfield(fmt::format(
"SUPER_CHUNK_FACTOR_LINK_{:02}",s->get_link()), super_chunk_size);
125 set_bitfield(fmt::format(
"DECODING_LINK{:02}_EGROUP0_CTRL_EPATH_ENA",s->get_link()), 1);
136 }
catch (FlxException& ex) {
149 }
catch (FlxException& ex) {
158 TLOG_DEBUG(TLVL_WORK_STEPS) <<
"Reading value of register " << key;
160 auto reg_val =
m_flx_card->cfg_get_reg(key.c_str());
167 TLOG_DEBUG(TLVL_WORK_STEPS) <<
"Setting value of register " << key <<
" to " << value;
175 TLOG_DEBUG(TLVL_WORK_STEPS) <<
"Reading value of bitfield " << key;
177 auto bf_val =
m_flx_card->cfg_get_option(key.c_str(),
false);
184 TLOG_DEBUG(TLVL_WORK_STEPS) <<
"Setting value of bitfield " << key <<
" to " << value;;
186 m_flx_card->cfg_set_option(key.c_str(), value,
false);
192 TLOG_DEBUG(TLVL_WORK_STEPS) <<
"Resetting GTH";
194 for (
auto i=0 ; i< 6; ++i) {
204 bool emu_fanout =
get_bitfield(
"FE_EMU_ENA_EMU_TOHOST");
209#warning FIXME: Horrible remapping workaround. Temporary fix only!
211 bool is_aligned = aligned & (1<<id_to_check);
218 if(!emu_fanout && !is_aligned) {
229 uint64_t aligned =
get_register(REG_GBT_ALIGNMENT_DONE);
235#warning FIXME: Horrible remapping workaround. Temporary fix only!
237 bool is_aligned = aligned & (1<<id_to_check);
241 {
"link", fmt::format(
"{}", s->get_link()) } });
@ TLVL_ENTER_EXIT_METHODS
uint16_t get_slr() const
Get "slr" attribute value. Super logic region of a FLX card.
void check_alignment(uint64_t aligned)
uint64_t get_register(std::string key)
void configure(uint16_t super_chunk_size, bool emu_fanout)
const std::vector< const appmodel::FelixDataSender * > m_flx_senders
CardControllerWrapper(uint32_t device_id, const appmodel::FelixInterface *flx_cfg, const std::vector< const appmodel::FelixDataSender * > &flx_senders)
CardControllerWrapper Constructor.
const appmodel::FelixInterface * m_flx_cfg
void set_register(std::string key, uint64_t value)
void set_bitfield(std::string key, uint64_t value)
uint64_t get_bitfield(std::string key)
void generate_opmon_data() override
void set_aligned(bool value)
void set_enabled(bool value)
void publish(google::protobuf::Message &&, CustomOrigin &&co={}, OpMonLevel l=to_level(EntryOpMonLevel::kDefault)) const noexcept
#define TLVL_ENTER_EXIT_METHODS
#define TLOG_DEBUG(lvl,...)
void fatal(const Issue &issue)
void error(const Issue &issue)