Skip to content

Commit 28516df

Browse files
committed
[config] Initial support for CRORC
1 parent d050342 commit 28516df

File tree

10 files changed

+175
-37
lines changed

10 files changed

+175
-37
lines changed

include/ReadoutCard/CardConfigurator.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#ifndef ALICEO2_INCLUDE_READOUTCARD_CARDCONFIGURATOR_H_
1717
#define ALICEO2_INCLUDE_READOUTCARD_CARDCONFIGURATOR_H_
1818

19+
#include "ReadoutCard/CardType.h"
1920
#include "ReadoutCard/Parameters.h"
2021

2122
namespace AliceO2
@@ -30,7 +31,9 @@ class CardConfigurator
3031
CardConfigurator(Parameters& parameters, bool forceConfigure = false);
3132

3233
private:
33-
void parseConfigUri(std::string configUri, Parameters& parameters);
34+
void parseConfigUri(CardType::type cardType, std::string configUri, Parameters& parameters);
35+
void parseConfigUriCru(std::string configUri, Parameters& parameters);
36+
void parseConfigUriCrorc(std::string configUri, Parameters& parameters);
3437
};
3538

3639
} // namespace roc

include/ReadoutCard/Parameters.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ class Parameters
8989
/// Type for the clock parameter
9090
using ClockType = Clock::type;
9191

92+
/// Type for the CRORC ID
93+
using CrorcIdType = Hex::type;
94+
9295
/// Type for the CRU ID
9396
using CruIdType = Hex::type;
9497

@@ -258,6 +261,12 @@ class Parameters
258261
/// \return Reference to this object for chaining calls
259262
auto setClock(ClockType value) -> Parameters&;
260263

264+
/// Sets the CrorcId parameter
265+
///
266+
/// \param value The value to set
267+
/// \return Reference to this object for chaining calls
268+
auto setCrorcId(CrorcIdType value) -> Parameters&;
269+
261270
/// Sets the CruId parameter
262271
///
263272
/// \param value The value to set
@@ -332,6 +341,10 @@ class Parameters
332341
/// \return The value wrapped in an optional if it is present, or an empty optional if it was not
333342
auto getCardId() const -> boost::optional<CardIdType>;
334343

344+
/// Gets the CrorcId parameter
345+
/// \return The value wrapped in an optional if it is present, or an empty optional if it was not
346+
auto getCrorcId() const -> boost::optional<CrorcIdType>;
347+
335348
/// Gets the CruId parameter
336349
/// \return The value wrapped in an optional if it is present, or an empty optional if it was not
337350
auto getCruId() const -> boost::optional<CruIdType>;
@@ -465,6 +478,11 @@ class Parameters
465478
/// \return The value
466479
auto getClockRequired() const -> ClockType;
467480

481+
/// Gets the CrorcId parameter
482+
/// \exception ParameterException The parameter was not present
483+
/// \return The value
484+
auto getCrorcIdRequired() const -> CrorcIdType;
485+
468486
/// Gets the CruId parameter
469487
/// \exception ParameterException The parameter was not present
470488
/// \return The value

src/CardConfigurator.cxx

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,26 @@
88
#include "Cru/CruBar.h"
99
#include "ReadoutCard/CardConfigurator.h"
1010
#include "ReadoutCard/ChannelFactory.h"
11+
#include "RocPciDevice.h"
1112

1213
namespace AliceO2
1314
{
1415
namespace roc
1516
{
1617

17-
CardConfigurator::CardConfigurator(Parameters::CardIdType cardId, std::string configUri, bool forceConfigure)
18+
CardConfigurator::CardConfigurator(Parameters::CardIdType cardId, std::string configUri, bool forceConfigure) //TODO: Currently only supports the CRU
1819
{
19-
auto parameters = Parameters::makeParameters(cardId, 2); //have to make parameters for this case, bar2
20+
auto cardType = RocPciDevice(cardId).getCardDescriptor().cardType;
21+
Parameters parameters;
22+
if (cardType == CardType::Cru) {
23+
parameters = Parameters::makeParameters(cardId, 2); //have to make parameters for this case, bar2
24+
} else if (cardType == CardType::Crorc) {
25+
parameters = Parameters::makeParameters(cardId, 0); //have to make parameters for this case, bar0
26+
} else {
27+
BOOST_THROW_EXCEPTION(Exception() << ErrorInfo::Message("Unknown card type"));
28+
}
2029
try {
21-
parseConfigUri(configUri, parameters);
30+
parseConfigUri(cardType, configUri, parameters);
2231
} catch (...) {
2332
throw;
2433
}
@@ -33,16 +42,39 @@ CardConfigurator::CardConfigurator(Parameters::CardIdType cardId, std::string co
3342

3443
CardConfigurator::CardConfigurator(Parameters& parameters, bool forceConfigure)
3544
{
36-
auto bar2 = ChannelFactory().getBar(parameters);
45+
auto cardType = RocPciDevice(parameters.getCardId().get()).getCardDescriptor().cardType;
3746
try {
38-
bar2->configure(forceConfigure);
47+
if (cardType == CardType::Cru) {
48+
auto bar2 = ChannelFactory().getBar(parameters);
49+
bar2->configure(forceConfigure);
50+
} else if (cardType == CardType::Crorc) {
51+
parameters.setChannelNumber(0); // we need to change bar 0
52+
auto bar0 = ChannelFactory().getBar(parameters);
53+
bar0->configure(forceConfigure);
54+
}
3955
} catch (const Exception& e) {
4056
BOOST_THROW_EXCEPTION(e);
4157
}
4258
}
4359

60+
void CardConfigurator::parseConfigUri(CardType::type cardType, std::string configUri, Parameters& parameters)
61+
{
62+
if (cardType == CardType::Cru) {
63+
parseConfigUriCru(configUri, parameters);
64+
} else if (cardType == CardType::Crorc) {
65+
parseConfigUriCrorc(configUri, parameters);
66+
} else {
67+
BOOST_THROW_EXCEPTION(Exception() << ErrorInfo::Message("Unknown card type"));
68+
}
69+
}
70+
71+
void CardConfigurator::parseConfigUriCrorc(std::string /*configUri*/, Parameters& /*parameters*/) //TODO: Fill me
72+
{
73+
std::cout << "Non-parameter configuration not supported for the CRORC yet" << std::endl;
74+
BOOST_THROW_EXCEPTION(Exception());
75+
}
4476
/// configUri has to start with "ini://", "json://" or "consul://"
45-
void CardConfigurator::parseConfigUri(std::string configUri, Parameters& parameters)
77+
void CardConfigurator::parseConfigUriCru(std::string configUri, Parameters& parameters)
4678
{
4779
std::set<uint32_t> linkMask;
4880
std::map<uint32_t, GbtMux::type> gbtMuxMap;

src/CommandLineUtilities/ProgramConfig.cxx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,10 @@ class ProgramConfig : public Program
3434
public:
3535
virtual Description getDescription()
3636
{
37-
return { "Config", "Configure the CRU(s)",
37+
return { "Config", "Configure the ReadoutCard(s)",
3838
"roc-config --config-uri ini:///home/flp/roc.cfg\n"
39-
"roc-config --id 42:00.0 --links 0-23 --clock local --datapathmode packet --loopback --gbtmux ttc\n" };
39+
"roc-config --id 42:00.0 --links 0-23 --clock local --datapathmode packet --loopback --gbtmux ttc #CRU\n"
40+
"roc-config --id #0 --crorc-id 0x42 --dyn-offset #CRORC\n" };
4041
}
4142

4243
virtual void addOptions(boost::program_options::options_description& options)
@@ -47,6 +48,9 @@ class ProgramConfig : public Program
4748
options.add_options()("clock",
4849
po::value<std::string>(&mOptions.clock)->default_value("LOCAL"),
4950
"Clock [LOCAL, TTC]");
51+
options.add_options()("crorc-id",
52+
po::value<std::string>(&mOptions.crorcId)->default_value("0x0"),
53+
"12-bit CRORC ID");
5054
options.add_options()("cru-id",
5155
po::value<std::string>(&mOptions.cruId)->default_value("0x0"),
5256
"12-bit CRU ID");
@@ -127,7 +131,7 @@ class ProgramConfig : public Program
127131
}
128132

129133
// Configure specific card
130-
auto cardId = Options::getOptionCardId(map);
134+
auto cardId = Options::getOptionCardId(map); //TODO: Parameters not planned for the CRORC should throw an exception when used
131135
if (!mOptions.bypassFirmwareCheck) {
132136
try {
133137
FirmwareChecker().checkFirmwareCompatibility(cardId);
@@ -142,6 +146,7 @@ class ProgramConfig : public Program
142146
params.setLinkMask(Parameters::linkMaskFromString(mOptions.links));
143147
params.setAllowRejection(mOptions.allowRejection);
144148
params.setClock(Clock::fromString(mOptions.clock));
149+
params.setCrorcId(strtoul(mOptions.crorcId.c_str(), NULL, 16)); //TODO: Clean up common / per type parameters
145150
params.setCruId(strtoul(mOptions.cruId.c_str(), NULL, 16));
146151
params.setDatapathMode(DatapathMode::fromString(mOptions.datapathMode));
147152
params.setDownstreamData(DownstreamData::fromString(mOptions.downstreamData));
@@ -154,7 +159,7 @@ class ProgramConfig : public Program
154159
params.setTriggerWindowSize(mOptions.triggerWindowSize);
155160

156161
// Generate a configuration file base on the parameters provided
157-
if (mOptions.genConfigFile != "") {
162+
if (mOptions.genConfigFile != "") { //TODO: To be updated for the CRORC
158163
std::cout << "Generating a configuration file at: " << mOptions.genConfigFile << std::endl;
159164
std::ofstream cfgFile;
160165
cfgFile.open(mOptions.genConfigFile);
@@ -221,6 +226,7 @@ class ProgramConfig : public Program
221226
bool dynamicOffsetEnabled = false;
222227
uint32_t onuAddress = 0;
223228
std::string cruId = "0x0";
229+
std::string crorcId = "0x0";
224230
uint32_t triggerWindowSize = 1000;
225231
} mOptions;
226232

src/CommandLineUtilities/ProgramListCards.cxx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ class ProgramListCards : public Program
9292

9393
if (!mOptions.jsonOut) {
9494
auto format = boost::format(formatRow) % i % CardType::toString(card.cardType) % card.pciAddress.toString() % serial %
95-
endpoint % card.numaNode % firmware;
95+
endpoint % card.numaNode % firmware;
9696

9797
table << format;
9898
std::cout << table.str();

src/Crorc/Constants.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@
1212
/// \brief Definitions of RORC related constants
1313
/// Based on ddl_def.h and rorc.h
1414
/// \author Pascal Boeschoten ([email protected])
15+
/// \author Kostas Alexopoulos ([email protected])
1516

1617
#ifndef ALICEO2_SRC_READOUTCARD_CRORC_CONSTANTS_H_
1718
#define ALICEO2_SRC_READOUTCARD_CRORC_CONSTANTS_H_
1819

20+
#include "ReadoutCard/Register.h"
21+
1922
namespace AliceO2
2023
{
2124
namespace roc
@@ -343,6 +346,29 @@ constexpr int OFFL = 0x00001000; ///< SIU in Offline state
343346
constexpr int POR = 0x00000000; ///< SIU in Power On Reset state
344347
} // namespace PortState
345348
} // namespace Siu
349+
350+
namespace Crorc
351+
{
352+
namespace Registers
353+
{
354+
///*** bar0 ***///
355+
356+
// Register to check the status of the link
357+
static constexpr Register LINK_STATUS(0x000000A0);
358+
359+
// Register to send an I2C command
360+
static constexpr Register I2C_CMD(0x000000D0);
361+
362+
// Register to control CRORC configuration
363+
// [15-4] -> CRORC ID
364+
// [0] -> FIXED/DYNAMIC OFFSET
365+
static constexpr Register CFG_CONTROL(0x000001f0);
366+
367+
// Register that contains the firmware hash
368+
static constexpr Register FIRMWARE_HASH(0x0000019C);
369+
} // namespace Registers
370+
} //namespace Crorc
371+
346372
} // namespace roc
347373
} // namespace AliceO2
348374

src/Crorc/CrorcBar.cxx

Lines changed: 59 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,57 +14,94 @@
1414
/// \author Pascal Boeschoten ([email protected])
1515
/// \author Kostas Alexopoulos ([email protected])
1616

17+
#include "Crorc/Constants.h"
1718
#include "Crorc/CrorcBar.h"
1819

20+
#include "boost/format.hpp"
21+
1922
namespace AliceO2
2023
{
2124
namespace roc
2225
{
2326

2427
CrorcBar::CrorcBar(const Parameters& parameters, std::unique_ptr<RocPciDevice> rocPciDevice)
25-
: BarInterfaceBase(parameters, std::move(rocPciDevice))
28+
: BarInterfaceBase(parameters, std::move(rocPciDevice)),
29+
mCrorcId(parameters.getCrorcId().get_value_or(0x0)),
30+
mDynamicOffset(parameters.getDynamicOffsetEnabled().get_value_or(false))
2631
{
2732
}
2833

2934
CrorcBar::~CrorcBar()
3035
{
3136
}
3237

38+
boost::optional<std::string> CrorcBar::getFirmwareInfo()
39+
{
40+
uint32_t fwHash = readRegister(Crorc::Registers::FIRMWARE_HASH.index);
41+
return (boost::format("%x") % fwHash).str();
42+
}
43+
3344
boost::optional<int32_t> CrorcBar::getSerial()
3445
{
3546
return Crorc::getSerial(*(mPdaBar.get()));
3647
}
3748

38-
boost::optional<std::string> CrorcBar::getFirmwareInfo()
49+
void CrorcBar::setSerial(int serial)
3950
{
40-
uint32_t version = mPdaBar->readRegister(Rorc::RFID);
41-
auto bits = [&](int lsb, int msb) { return Utilities::getBits(version, lsb, msb); };
42-
43-
uint32_t reserved = bits(24, 31);
44-
uint32_t major = bits(20, 23);
45-
uint32_t minor = bits(13, 19);
46-
uint32_t year = bits(9, 12) + 2000;
47-
uint32_t month = bits(5, 8);
48-
uint32_t day = bits(0, 4);
49-
50-
if (reserved != 0x2) {
51-
BOOST_THROW_EXCEPTION(CrorcException()
52-
<< ErrorInfo::Message("Static field of version register did not equal 0x2"));
53-
}
54-
55-
std::ostringstream stream;
56-
stream << major << '.' << minor << ':' << year << '-' << month << '-' << day;
57-
return stream.str();
51+
Crorc::setSerial(*(mPdaBar.get()), serial);
5852
}
5953

6054
int CrorcBar::getEndpointNumber()
6155
{
6256
return 0;
6357
}
6458

65-
void CrorcBar::setSerial(int serial)
59+
void CrorcBar::configure(bool /*force*/)
6660
{
67-
Crorc::setSerial(*(mPdaBar.get()), serial);
61+
// enable laser
62+
log("Enabling the laser");
63+
setQsfpEnabled();
64+
65+
log("Configuring fixed/dynamic offset");
66+
// choose between fixed and dynamic offset
67+
setDynamicOffsetEnabled(mDynamicOffset);
68+
69+
// set crorc id
70+
log("Setting the CRORC ID");
71+
setCrorcId(mCrorcId);
72+
}
73+
74+
void CrorcBar::setQsfpEnabled()
75+
{
76+
uint32_t qsfpStatus = (readRegister(Crorc::Registers::LINK_STATUS.index) >> 31) & 0x1;
77+
if (qsfpStatus == 0) {
78+
writeRegister(Crorc::Registers::I2C_CMD.index, 0x80);
79+
}
80+
}
81+
82+
bool CrorcBar::getQsfpEnabled()
83+
{
84+
return (readRegister(Crorc::Registers::LINK_STATUS.index) >> 31) & 0x1;
85+
}
86+
87+
void CrorcBar::setCrorcId(uint16_t crorcId)
88+
{
89+
modifyRegister(Crorc::Registers::CFG_CONTROL.index, 4, 12, crorcId);
90+
}
91+
92+
uint16_t CrorcBar::getCrorcId()
93+
{
94+
return (readRegister(Crorc::Registers::CFG_CONTROL.index) >> 4) & 0x0fff;
95+
}
96+
97+
void CrorcBar::setDynamicOffsetEnabled(bool enabled)
98+
{
99+
modifyRegister(Crorc::Registers::CFG_CONTROL.index, 0, 1, enabled ? 0x1 : 0x0);
100+
}
101+
102+
bool CrorcBar::getDynamicOffsetEnabled()
103+
{
104+
return (readRegister(Crorc::Registers::CFG_CONTROL.index) & 0x1);
68105
}
69106

70107
} // namespace roc

src/Crorc/CrorcBar.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,19 @@ class CrorcBar final : public BarInterfaceBase
4545
virtual int getEndpointNumber() override;
4646

4747
void setSerial(int serial);
48+
49+
void configure(bool force = false) override;
50+
51+
private:
52+
void setQsfpEnabled();
53+
bool getQsfpEnabled();
54+
void setDynamicOffsetEnabled(bool enabled);
55+
bool getDynamicOffsetEnabled();
56+
void setCrorcId(uint16_t cruId);
57+
uint16_t getCrorcId();
58+
59+
uint16_t mCrorcId;
60+
bool mDynamicOffset;
4861
};
4962

5063
} // namespace roc

src/Cru/CruBar.cxx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ boost::optional<float> CruBar::getTemperature()
102102

103103
boost::optional<std::string> CruBar::getFirmwareInfo()
104104
{
105-
return (boost::format("%x-%x-%x") % getFirmwareDate() % getFirmwareTime() % getFirmwareGitHash()).str();
105+
//return (boost::format("%x-%x-%x") % getFirmwareDate() % getFirmwareTime() % getFirmwareGitHash()).str();
106+
return (boost::format("%x") % getFirmwareGitHash()).str();
106107
}
107108

108109
boost::optional<std::string> CruBar::getCardId()

0 commit comments

Comments
 (0)