@@ -164,6 +164,28 @@ void Gbt::txcal()
164164 }
165165}
166166
167+ uint32_t Gbt::getStatusAddress (Link link)
168+ {
169+ uint32_t address = Cru::getWrapperBaseAddress (link.wrapper ) +
170+ Cru::Registers::GBT_WRAPPER_BANK_OFFSET.address * (link.bank + 1 ) +
171+ Cru::Registers::GBT_BANK_LINK_OFFSET.address * (link.id + 1 ) +
172+ Cru::Registers::GBT_LINK_REGS_OFFSET.address +
173+ Cru::Registers::GBT_LINK_STATUS.address ;
174+
175+ return address;
176+ }
177+
178+ uint32_t Gbt::getClearErrorAddress (Link link)
179+ {
180+ uint32_t address = Cru::getWrapperBaseAddress (link.wrapper ) +
181+ Cru::Registers::GBT_WRAPPER_BANK_OFFSET.address * (link.bank + 1 ) +
182+ Cru::Registers::GBT_BANK_LINK_OFFSET.address * (link.id + 1 ) +
183+ Cru::Registers::GBT_LINK_REGS_OFFSET.address +
184+ Cru::Registers::GBT_LINK_CLEAR_ERRORS.address ;
185+
186+ return address;
187+ }
188+
167189uint32_t Gbt::getSourceSelectAddress (Link link)
168190{
169191 uint32_t address = Cru::getWrapperBaseAddress (link.wrapper ) +
@@ -203,5 +225,44 @@ uint32_t Gbt::getAtxPllRegisterAddress(int wrapper, uint32_t reg)
203225 Cru::Registers::GBT_WRAPPER_ATX_PLL.address + 4 * reg;
204226}
205227
228+ bool Gbt::getStickyBit (Link link)
229+ {
230+ uint32_t addr = getStatusAddress (link);
231+ uint32_t data = mPdaBar ->readRegister (addr/4 );
232+ uint32_t lockedData = Utilities::getBit (~data, 14 ); // phy up 1 = locked, 0 = down
233+ uint32_t ready = Utilities::getBit (~data, 15 ); // data layer up 1 = locked, 0 = down
234+ if ((lockedData == 0x0 ) || (ready == 0x0 )) {
235+ resetStickyBit (link);
236+ }
237+
238+ return (lockedData == 0x1 && ready == 0x1 ) ? true : false ;
239+ }
240+
241+ void Gbt::resetStickyBit (Link link) {
242+ uint32_t addr = getClearErrorAddress (link);
243+
244+ mPdaBar ->writeRegister (addr/4 , 0x0 );
245+ }
246+
247+ uint32_t Gbt::getRxClockFrequency (Link link) { // In Hz
248+ uint32_t address = Cru::getWrapperBaseAddress (link.wrapper ) +
249+ Cru::Registers::GBT_WRAPPER_BANK_OFFSET.address * (link.bank + 1 ) +
250+ Cru::Registers::GBT_BANK_LINK_OFFSET.address * (link.id + 1 ) +
251+ Cru::Registers::GBT_LINK_REGS_OFFSET.address +
252+ Cru::Registers::GBT_LINK_RX_CLOCK.address ;
253+
254+ return mPdaBar ->readRegister (address/4 );
255+ }
256+
257+ uint32_t Gbt::getTxClockFrequency (Link link) { // In Hz
258+ uint32_t address = Cru::getWrapperBaseAddress (link.wrapper ) +
259+ Cru::Registers::GBT_WRAPPER_BANK_OFFSET.address * (link.bank + 1 ) +
260+ Cru::Registers::GBT_BANK_LINK_OFFSET.address * (link.id + 1 ) +
261+ Cru::Registers::GBT_LINK_REGS_OFFSET.address +
262+ Cru::Registers::GBT_LINK_TX_CLOCK.address ;
263+
264+ return mPdaBar ->readRegister (address/4 );
265+ }
266+
206267} // namespace roc
207268} // namespace AliceO2
0 commit comments