26#include "cmem_rcc/cmem_rcc.h"
27#include "flxcard/flx_common.h"
28#include "regmap/regmap.h"
29#include "flxcard/LinkConfig.h"
32#define WAIT_TIME_600 600
33#define WAIT_TIME_200 200
34#define NUM_INTERRUPTS 8
35#define FLX_GBT_FILE_NOT_FOUND -1
36#define FLX_GBT_VERSION_NOT_FOUND -2
37#define FLX_GBT_TMODE_FEC 0
38#define FLX_GBT_ALIGNMENT_CONTINUOUS 0
39#define FLX_DMA_WRAPAROUND 1
40#define FLX_GBT_ALIGNMENT_ONE 1
41#define FLX_GBT_CHANNEL_AUTO 1
42#define FLX_GBT_TMODE_WideBus 1
51#define FIRMW_FELIG_GBT 6
56#define FIRMW_INTERLAKEN 10
57#define FIRMW_FELIG_LPGBT 11
58#define FIRMW_HGTD_LUMI 12
59#define FIRMW_BCM_PRIME 13
60#define FIRMW_FELIG_PIXEL 14
61#define FIRMW_FELIG_STRIP 15
62#define FIRMW_WUPPER 16
64const std::vector<std::string> FIRMW_STR{
"GBT",
"FULL",
"LTDB",
"FEI4",
"PIXEL",
65 "STRIP",
"FELIG",
"FM-EMU",
"MROD",
"LPGBT",
66 "INTERLAKEN",
"FELIG-LPGBT",
"HGTD-LUMI",
67 "BCM-PRIME",
"FELIG-PIXEL",
"FELIG-STRIP",
71#define ALL_IRQS 0xFFFFFFFF
74#define FPGA_MONITOR 0x001
75#define POD_MONITOR_ALL 0x002
76#define POWER_MONITOR 0x004
77#define FIREFLY_MONITOR 0x008
78#define POD_MONITOR_LOS 0x100
79#define POD_MONITOR_TEMP_VOLT 0x200
80#define POD_MONITOR_POWER 0x400
81#define POD_MONITOR_POWER_RX 0x800
83#define POD_MONITOR POD_MONITOR_ALL
86#define LOCK_NONE 0x0000
87#define LOCK_DMA0 0x0001
88#define LOCK_DMA1 0x0002
89#define LOCK_I2C 0x0004
90#define LOCK_FLASH 0x0008
91#define LOCK_ELINK 0x0010
92#define LOCK_READ_CONFIG 0x0020
93#define LOCK_ALL 0xFFFFFFFF
94#define LOCK_DMA(n) (1<<(16+n))
97#define ALL_BITS 0xFFFFFFFFFFFFFFFF
102 volatile u_long start_address;
103 volatile u_long end_address;
104 volatile u_long tlp :11;
105 volatile u_long fromhost : 1;
106 volatile u_long wrap_around : 1;
107 volatile u_long reserved :51;
108 volatile u_long sw_pointer;
113 volatile u_long fw_pointer;
114 volatile u_long descriptor_done : 1;
115 volatile u_long even_addr_dma : 1;
116 volatile u_long even_addr_pc : 1;
121 volatile u_int control;
123 volatile u_long address;
128 volatile u_long date_time : 40;
129 volatile u_long reserved : 24;
130 volatile u_long revision : 16;
139 volatile u_int BAR0_VALUE;
141 volatile u_int BAR1_VALUE;
143 volatile u_int BAR2_VALUE;
145 volatile u_int DMA_DESC_ENABLE;
147 volatile u_int DMA_RESET;
149 volatile u_int SOFT_RESET;
151 volatile u_int REGISTERS_RESET;
158 volatile u_int INT_TAB_ENABLE;
164 u_int cdmap[MAXCARDS][2];
168typedef struct i2c_device i2c_device_t;
196 int optical_power_uw[12];
202 float vccint_current;
203 float vccint_voltage;
204 float mgtavcc_current;
205 float mgtavcc_voltage;
206 float fpga_internal_diode_temperature;
207 float mgtavtt_current;
208 float mgtavtt_voltage;
209 float mgtavttc_voltage;
210 float mgtvccaux_voltage;
211 float internal_temperature;
218 float pex0p9v_current;
219 float pex0p9v_voltage;
225 float pex8732_internal_diode_temperature;
226 float internal_temperature;
235 uint32_t t_remote_hi;
236 uint32_t t_remote_lo;
239 uint32_t manufacturer_id;
246 uint32_t shunt_volt_reg;
247 uint32_t bus_volt_reg;
249 uint32_t current_reg;
251 uint32_t manufacturer_id;
258 uint32_t mfr_special_id;
266 uint32_t temp_ext[2];
273 uint32_t manufacturer_id;
274 uint32_t silicon_rev;
275 uint8_t input_cfg[10][8];
276 uint32_t fault_stat[6];
278 float adc_fullscale[12];
279 std::string adc_name[12];
286 uint32_t ic_device_id;
287 uint64_t ic_device_rev;
289 uint32_t vout_mode[17];
290 uint32_t status_vout[17];
291 std::string vout_name[17];
292 uint32_t vout_uv_warn[17];
293 uint32_t vout_uv_fault[17];
294 uint32_t vout_ov_warn[17];
295 uint32_t vout_ov_fault[17];
305 uint32_t status_summ;
306 uint32_t latched_alarms_tx_los;
307 uint32_t latched_alarms_tx_fault;
308 uint32_t latched_alarms_temp;
309 uint32_t latched_alarms_vcc33;
310 uint32_t latched_alarms_cdr_lol;
313 uint32_t elapsed_optime;
314 uint32_t chan_disable;
315 uint32_t squelch_disable;
316 uint32_t polarity_invert;
317 uint64_t input_equalization;
319 uint32_t mask_tx_los_alarms;
320 uint32_t mask_fault_flags;
321 uint32_t mask_temp_alarms;
322 uint32_t mask_vcc33_alarms;
323 uint32_t mask_cdr_lol_alarms;
324 uint32_t firmware_version;
327 std::string vendor_part;
328 std::string vendor_serial;
338 uint32_t status_summ;
339 uint32_t latched_alarms_rx_los;
340 uint32_t latched_alarms_rx_power;
341 uint32_t latched_alarms_temp;
342 uint32_t latched_alarms_vcc33;
343 uint32_t latched_alarms_cdr_lol;
346 uint32_t elapsed_optime;
347 uint32_t chan_disable;
348 uint32_t output_disable;
349 uint32_t polarity_invert;
350 uint64_t output_swing;
351 uint64_t output_preemphasis;
354 uint32_t firmware_version;
357 std::string vendor_part;
358 std::string vendor_serial;
368 uint32_t latched_alarms_tx_los;
369 uint32_t latched_alarms_tx_fault;
370 uint32_t latched_alarms_cdr_lol;
371 uint32_t latched_alarms_temp;
372 uint32_t latched_alarms_vcc;
373 uint32_t latched_alarms_rx_power;
374 uint32_t elapsed_optime;
378 uint32_t rx_optical_power[4];
379 uint32_t firmware_revision;
380 uint32_t tx_chan_disable;
382 uint32_t cdr_rate_select;
383 uint32_t mask_los_alarms;
384 uint32_t mask_tx_fault_flags;
385 uint32_t mask_cdr_lol_alarms;
386 uint32_t mask_temp_alarms;
387 uint32_t mask_vcc_alarms;
390 std::string vendor_part;
391 std::string vendor_serial;
447#define TOHEX(n) std::hex << "0x" << ((uint64_t)n) << std::dec
509 bool read_config =
false,
510 bool ignore_version =
false );
593 u_int get_lock_mask(
int device_nr ) {
return lock_mask( device_nr ); }
646 void dma_to_host( u_int dma_id, u_long dst,
size_t size, u_int flags );
734 u_long dma_get_read_ptr( u_int dma_id ) {
return dma_get_ptr( dma_id ); }
752 u_long dma_get_current_address( u_int dma_id ) {
return dma_get_fw_ptr( dma_id ); }
795 void i2c_read(
const char *device_str, u_char reg_addr, u_char *value,
int nbytes = 1 );
800 void i2c_write(
const char *device_str, u_char reg_addr, u_char data );
801 void i2c_write(
const char *device_str, u_char reg_addr, u_char *data,
int nbytes );
843 int nbytes, uint8_t *bytes );
844 void i2c_read_bytes ( uint8_t dev_addr, uint8_t reg_addr,
845 int nbytes, uint8_t *bytes );
1127 {
return( m_firmwareType<FIRMW_STR.size() ? FIRMW_STR[m_firmwareType] : std::string(
"????") ); }
1196 firefly_monitoring_t firefly_monitoring(
int *tx_count = 0,
int *rx_count = 0,
int *tr_count = 0 );
1253 std::string &vendor_part,
1254 std::string &vendor_sn );
1272 void configure( std::string filename,
bool do_links =
true,
bool do_registers =
true );
1311 std::vector<flxcard::elink_descr_t> elinks_fromhost() {
return elinks_toflx(); }
1313 std::vector<flxcard::elink_descr_t> elinks_toflx_broadcast();
1314 std::vector<flxcard::elink_descr_t> elinks_fromhost_broadcast() {
return elinks_toflx_broadcast(); }
1327 void set_hdlc_instant_timeout(
bool b ) { m_hdlcInstantTimeout = b; }
1328 bool hdlc_instant_timeout( ) {
return m_hdlcInstantTimeout; }
1374 static int m_cardsOpen;
1379 u_int m_firmwareType;
1384 bool m_fullmodeType;
1385 bool m_useDmaIndexMask;
1386 bool m_hdlcInstantTimeout;
1387 u_int m_numberOfChans;
1388 u_int m_numberOfDma;
1389 u_int m_fromHostDataFormat;
1390 std::string m_firmwareString;
1398 flxcard::LinkConfig m_linkConfig[flxcard::FLX_LINKS + 1];
1401 std::vector<flxcard::regsetting_t> m_regSettings;
1411 volatile flxcard_bar2_regs_t *m_bar2;
1414 i2c_device_t
const *m_i2cDevices;
1421 u_long map_memory_bar( u_long pci_addr,
size_t size );
1422 void unmap_memory_bar( u_long vaddr,
size_t size );
1424 void i2c_wait_not_full( );
1425 void i2c_wait_not_empty( );
1426 int i2c_parse_address_string(
const char *str,
1427 u_char *port1, u_char *port2, u_char *port3,
1429 void i2c_set_switches( u_char switch1_val, u_char switch2_val, u_char switch3_val );
1431 void gbt_tx_configuration(
int channel_tx_mode,
int alignment );
1432 int gbt_rx_configuration(
int channel_rx_mode );
1433 int gbt_software_alignment(
int number_channels );
1434 bool gbt_channel_alignment( u_int channel );
1435 void gbt_topbot_oddeven_set( u_int channel, u_int topbot, u_int oddeven );
1436 bool gbt_topbot_alignment( u_int channel, u_int topbot,
1437 u_long *phase_found, u_int *oddeven );
1438 u_long gbt_shift_phase( u_int channel );
1440 int check_digic_value2(
const char *str, u_long *version, u_long *delay );
1442 std::string lockbits2string( u_int locks );
1444 void configureLinks( flxcard::LinkConfig *link_config,
1445 int *dma_index_invalid_count,
1446 int *unsupported_tohost_elinks_count,
1447 int *unsupported_fromhost_elinks_count );
1449 void lockForConfiguration(
FlxCard &flx );
FlxCard()
The constructor of an FlxCard object only initializes a few class variables. It does not interact wit...
bool uses_dma_index_mask()
Definition FlxCard.h:1325
std::vector< flxcard::elink_descr_t > elinks_toflx()
void configure(std::string filename, bool do_links=true, bool do_registers=true)
unsigned int tohost_elink_dmaid(u_int channel, u_int egroup, u_int epath)
bool has_tohost_elink_streams(u_int channel, u_int egroup, u_int epath)
u_int number_of_elinks_toflx()
void readConfiguration(std::string filename)
bool is_elink_enabled(u_int channel, u_int egroup, u_int epath, bool is_to_flx)
u_int number_of_dma_tohost()
Definition FlxCard.h:1319
u_int number_of_elinks_tohost(int dma_index=-1)
uint16_t connector_id(uint16_t channel)
std::vector< flxcard::elink_descr_t > elinks_tohost(int dma_index=-1)
unsigned int tohost_elink_dmaid(uint16_t elinknr)
void dma_advance_ptr(u_int dma_id, u_long dst, size_t size, size_t bytes)
void dma_to_host(u_int dma_id, u_long dst, size_t size, u_int flags)
void dma_stop(u_int dma_id)
bool dma_enabled(u_int dma_id)
u_long dma_get_fw_ptr(u_int dma_id)
int dma_max_tlp_bytes()
Definition FlxCard.h:626
void dma_set_ptr(u_int dma_id, u_long dst)
void dma_wait(u_int dma_id)
u_long dma_get_ptr(u_int dma_id)
void dma_from_host(u_int dma_id, u_long src, size_t size, u_int flags)
bool dma_cmp_even_bits(u_int dma_id)
static device_list_t device_list()
u_long openBackDoor(int bar)
u_long bar1Address()
Definition FlxCard.h:608
static u_int number_of_devices()
u_long bar2Address()
Definition FlxCard.h:612
void card_open(int device_nr, u_int lock_mask, bool read_config=false, bool ignore_version=false)
static u_int number_of_cards()
static int card_to_device_number(int card_number)
u_int lock_mask(int device_nr)
u_long bar0Address()
Definition FlxCard.h:604
long int gbt_version_delay(u_long svn_version, char *filename)
void gth_rx_reset(int quad=-1)
u_long rxusrclk_freq(u_int channel)
u_int gbt_setup(int alignment, int channel_mode)
bool i2c_flush(u_int *count=0)
void i2c_write(const char *device_str, u_char reg_addr, u_char data)
u_char i2c_read_byte(u_char dev_addr, u_char reg_addr)
void i2c_write_byte(u_char dev_addr, u_char byte)
void i2c_read(const char *device_str, u_char reg_addr, u_char *value, int nbytes=1)
void i2c_write_byte(u_char dev_addr, u_char reg_addr, u_char byte)
void i2c_write_bytes(uint8_t dev_addr, uint8_t reg_addr, int nbytes, uint8_t *bytes)
void irq_enable(u_int interrupt=ALL_IRQS)
void irq_disable(u_int interrupt=ALL_IRQS)
void irq_wait(u_int interrupt)
void irq_cancel(u_int interrupt=ALL_IRQS)
void irq_clear(u_int interrupt=ALL_IRQS)
void irq_reset_counters(u_int interrupt=ALL_IRQS)
bool firefly_detect(const std::string &device_name, std::string &vendor_part, std::string &vendor_sn)
std::vector< int > minipods_optical_power()
std::vector< int > minipods_temperature()
monitoring_data_t get_monitoring_data(u_int mon_mask)
static regmap_bitfield_t * cfg_bitfield(const char *name)
void cfg_set_reg(const char *key, u_long value)
u_long cfg_get_option(const char *key, bool show_options=false)
void cfg_set_option(const char *key, u_long value, bool show_options=false)
u_long cfg_get_reg(const char *key)
static regmap_register_t * cfg_register(const char *name)
static std::string cfg_bitfield_options(const char *name, bool include_all_substr=true)