/* ===================================================================== * Container for the Rcu data block to configure one Rcu and the FECs * connected. The structure is: * * 1) FEE_CONFIGURE for RCU block, parameter = number of words * 2) HW_Address * 3) Checksum * * 4) Payload: Data for 1 RCU and for the corresponding Fecs and Altros * * 5) FEE_VERIFICATION (Rcu Block) (optional) * 6) CE_CMD_TAILER - End of FEE_VERIFICATION (optional) * * 7) FEE_CONFIGURE_END - End of FEE_CONFIGURE * 8) HW_Address, same as above * 9) CE_CMD_TAILER - End of FEE_CONFIGURE_END * * 10) CE_CMD_TAILER - End of FEE_CONFIGURE * * ===================================================================== */ /* * Author: C. Lippmann, Christian.Lippmann@cern.ch */ #ifndef RCUCONTAINER_H #define RCUCONTAINER_H #define AFL_REG_ADD 0x5100 #define ALTROIF_REG_ADD 0x5101 #define TRGCONF_REG_ADD 0x5102 #define RDOMOD_REG_ADD 0x5103 #define ALTROCFG1_REG_ADD 0x5104 #define ALTROCFG2_REG_ADD 0x5105 #define RCUID_REG_ADD 0x5108 #define EN_INT_BA_REG_ADD 0x510b #define TTC_CONTROL_REG_ADD 0x4000 #define TTC_L1_LATENCY_REG_ADD 0x4006 #define TTC_L2_LATENCY_REG_ADD 0x4007 #define TTC_L1_MSG_LATENCY_REG_ADD 0x400a #include "FecContainer.h" using namespace std; class RcuContainer { public: RcuContainer(); RcuContainer(uint32_t hardwareAddress); ~RcuContainer() { }; void setHardwareAddress(uint32_t hwAdd) { fHardwareAddress = hwAdd; }; void setExternalConfiguration(bool ExtConf) { fExternalConfiguration = ExtConf; }; void setVerification(bool verif) { fVerif = verif; }; void setDcsImemFileName(string fname) { fDcsImemFileName = fname; }; void setDcsRcuCfgFileName(string fname) { fDcsRcuCfgFileName = fname; }; void setConfigurePhysics2(); void setConfigurePhysics1(); void setConfigureCalibration(); void setConfigureOldStyle(); void setDoFastSOR1(); void setDoFastSOR2(); uint32_t getCheckSum() { return fCheckSum; }; uint32_t getHardwareAddress() { return fHardwareAddress; }; bool getExternalConfiguration() { return fExternalConfiguration; }; bool getVerification() { return fVerif; }; bool getReadResult() { return fRead; }; bool getOldStyle() { return fOldStyle; }; bool getImemReadFile2Mem() { return fReadFile2MemImem; }; bool getImemClearMem() { return fClearMemImem; }; bool getImemStoreMem() { return fStoreMemImem; }; bool getImemWriteMem2File() { return fWriteMem2FileImem; }; bool getImemExecuteMem() { return fExecuteMemImem; }; bool getRcuReadFile2Mem() { return fReadFile2MemRcu; }; bool getRcuClearMem() { return fClearMemRcu; }; bool getRcuStoreMem() { return fStoreMemRcu; }; bool getRcuWriteMem2File() { return fWriteMem2FileRcu; }; bool getRcuExecuteMem() { return fExecuteMemRcu; }; uint32_t size() { return fPayload.size(); }; vector::iterator begin() { return fPayload.begin(); }; vector::iterator end() { return fPayload.end(); }; string getDcsImemFileName() { return fDcsImemFileName; }; string getDcsRcuCfgFileName() { return fDcsRcuCfgFileName; }; uint32_t *getDataBlock(); void setReadResult(uint32_t size); void finalize(); void reset(); // Fill Altro registers void fillAltro(uint32_t branch, uint32_t fec, uint32_t altro, uint32_t data); void fillAltro(uint32_t branch, uint32_t fec, uint32_t altro, uint64_t data); // Fill Fec container void fillBc(uint32_t branch, uint32_t fec, uint32_t data); void fillBc(uint32_t branch, uint32_t fec, uint32_t data, bool addTailer); void fillBc(uint32_t branch, uint32_t fec, uint64_t data); void fillBc(uint32_t branch, uint32_t fec, uint64_t data, bool addTailer); // Fill Rcu registers (directly write to the registers, the feeserver will not store the data) void fillRcu(uint32_t data); void fillRcu(uint32_t data, bool addTailer); void fillRcu(uint64_t data); void fillRcu(uint64_t data, bool addTailer); void fillAtStartRcu(uint32_t data); void fillAtStartRcu(uint32_t data, bool addTailer); void fillAtStartRcu(uint64_t data); void fillAtStartRcu(uint64_t data, bool addTailer); void appendRcu(uint32_t data); void appendRcu(uint32_t data, bool addTailer); void appendRcu(uint64_t data); void appendRcu(uint64_t data, bool addTailer); // Fill Rcu registers (the feeserver will store the addresses and data) void fillRcuBuffer(uint32_t address, uint32_t data); void fillRcuBuffer(uint64_t data); void fillRcuBufferAFL(uint32_t data); void fillRcuBufferALTROIF(uint32_t data); void fillRcuBufferTRGCONF(uint32_t data); void fillRcuBufferRDOMOD(uint32_t data); void fillRcuBufferALTROCFG1(uint32_t data); void fillRcuBufferALTROCFG2(uint32_t data); void fillRcuBufferRCUID(uint32_t data); void fillRcuBufferEN_INT_BA(uint32_t data); void fillRcuBufferTTC_CONTROL(uint32_t data); void fillRcuBufferTTC_L1_LATENCY(uint32_t data); void fillRcuBufferTTC_L2_LATENCY(uint32_t data); void fillRcuBufferTTC_L1_MSG_LATENCY(uint32_t data); vector getRcuBuffer() { return fRcuPayload; }; private: //void newBlock(); void calculateCheckSum(); FecContainer fFec[25]; // i = [0..12] -> branch A; i = [13..24] -> branch B RCUControlEngine fRCUce; // RCU Control Engine vector fPayload; // the data vector fAppendPayload; // some more data (to be appended after the Altro and FEC blocks) vector fRcuPayload; // RCU configuration registers to be stored by feeserver uint32_t fHardwareAddress; // Hardware Adress of the device. uint32_t fCheckSum; // Checksum uint32_t fReadSize; // Used for Readback uint32_t fMaxSize; // maximum size of data (payload) bool fVerif; // flag: verify configuration using checksum? bool fRead; // flag: read back configuration bool fExternalConfiguration; // flag: continue configuration from ddl after finished in dcs bool fOldStyle; // flag: if true, none of the flags below are possible bool fClearMemImem; // flag: clear memory (ALTRO and FEC data) bool fClearMemRcu; // flag: clear memory (RCU registers) bool fStoreMemImem; // flag: store data in memory (ALTRO and FEC data) bool fStoreMemRcu; // flag: store data in memory (RCU registers) bool fWriteMem2FileImem; // flag: write data stored in memory to file (ALTRO and FEC data) bool fWriteMem2FileRcu; // flag: write data stored in memory to file (RCU registers) bool fReadFile2MemImem; // flag: read data from file into memory (ALTRO and FEC data) bool fReadFile2MemRcu; // flag: read data from file into memory (Rcu registers) bool fExecuteMemImem; // flag: execute data in memory (ALTRO and FEC data) bool fExecuteMemRcu; // flag: execute data in memory (RCU registers) bool fSetFilenameImem; // flag: filename to be set (ALTRO and FEC data) bool fSetFilenameRcu; // flag: filename to be set (RCU data) string fDcsImemFileName; // File name incl. path on DCS board for binary IMEM data string fDcsRcuCfgFileName; // File name incl. path on DCS board for binary RCU CFG data }; #endif // RCUCONTAINERFWV2_H