Skip to content
Snippets Groups Projects
Commit d5d5a93c authored by Douglas Araujo's avatar Douglas Araujo
Browse files

Add number of hybrid as config arg, and update methods names to fit the new RMM version

parent 7014c32c
No related branches found
No related tags found
1 merge request!2ICSHWI-18048: Hybrids information
This commit is part of merge request !2. Comments created here will be created in the context of that merge request.
......@@ -15,32 +15,24 @@
"output_queues" : {
"default" : {
"enabled" : false,
"eth_src_mac" : "0e:05:05:00:00:04",
"eth_dst_mac" : "50:6b:4b:c0:b2:50",
"ip_src_addr" : "192.168.10.10",
"ip_dst_addr" : "192.168.10.100",
"udp_src_port" : 8997,
"udp_dst_port" : 9000,
"destination_lut_index" : 0,
"readout_type" : "0x48",
"pkt_gen_enable" : false,
"pkt_gen_idles" : "0x00000f",
"pkt_gen_length" : "0x000000ff"
},
"0": {
"enabled" : true,
"udp_dst_port" : 9000
},
"1": {
"enabled" : false,
"udp_dst_port" : 9001
},
"2": {
"enabled" : false,
"udp_dst_port" : 9002
},
"3": {
"enabled" : false,
"udp_dst_port" : 9003
"enabled" : true
}
},
"udp_core" : {
"src_mac" : "0e:05:05:00:00:04",
"src_ip" : "192.168.10.1",
"src_port" : 9000,
"arp_refresh_timeout" : 1228.7,
"arp_reply_timeout" : 25.5,
"lut" : {
"0": { "dst_ip" : "192.168.10.100", "dst_port" : 51001}
}
}
}
\ No newline at end of file
......@@ -11,15 +11,18 @@ drvAsynIPPortConfigure("L0", "$(IPADDR):$(IPPORT) UDP", 0, 0, 1)
#asynSetTraceIOMask( L0, -1, 0x4)
#asynSetTraceInfoMask ( L0, -1, 0x9)
RMMConfig("RMM", "L0", "/home/iocuser/douglas/fe-vmm-tbl/cmds/config_file/lab_testbed.json" 0)
VMMTblConfig("RMM", 0, 0)
RMMConfig("RMM", "L0", "/home/iocuser/douglas/fe-vmm-tbl/cmds/config_file/lab_testbed.json", 0)
#VMMTblConfig("portName", ring, number_hybrids)
VMMTblConfig("RMM", 0, 2)
dbLoadRecords("${asyn_DIR}/db/asynRecord.db","P=asyn:,R=Test,PORT=L0,ADDR=0,IMAX=0,OMAX=0")
dbLoadRecords($(rmm_DB)/rmm.db, "P=$(P), R=$(R), PORT=RMM, ADDR=0, TIMEOUT=1")
dbLoadRecords($(rmm_DB)/rmm_sensors.db, "P=$(P), R=$(R), PORT=RMM, TIMEOUT=1")
dbLoadRecords($(rmm_DB)/topology.db, "P=$(P), R=$(R), PORT=RMM, TIMEOUT=1")
dbLoadRecords($(rmm_DB)/ring.db, "P=$(P), R=$(R), ADDR=0, PORT=RMM, TIMEOUT=1")
dbLoadRecords("$(rmm_DB)/rmm_packets.template", "P=$(P), R=$(R), PORT=RMM, RING=0, NODE=0, ADDR=0, TIMEOUT=1")
dbLoadRecords("$(rmm_DB)/topology.template", "P=$(P), R=$(R), PORT=RMM, RING=0, NODE=0, ADDR=0, TIMEOUT=1")
dbLoadRecords("$(vmmTbl_DB)/vmm_tbl.db", "P=$(P), R=NDet-VMM-001:, PORT=RMM, RING=0, NODE=0, ADDR=0, TIMEOUT=1")
......@@ -34,4 +37,4 @@ dbpf $(P)$(R)VoltVCC1V2-R.SCAN 2
dbpf $(P)$(R)VoltMGTAVCC-R.SCAN 2
dbpf $(P)$(R)VoltMGTAVTT-R.SCAN 2
dbpf $(P)$(R)VoltVCCINTIOBRAM-R.SCAN 2
#
\ No newline at end of file
#
......@@ -46,10 +46,10 @@ void FENConfigModule::sendAll(bool useConfigCheck) {
}
void FENConfigModule::enableAcquisition(bool enabled) {
pFEN->user_reg_write("app_acq_enable", enabled);
pFEN->user_reg_write("sc_acq_on_off", 0x00000000);
pFEN->user_reg_write("sc_acq_on_off", 0x00000001);
pFEN->user_reg_write("sc_acq_on_off", 0x00000000);
pFEN->userRegWrite("app_acq_enable", enabled);
pFEN->userRegWrite("sc_acq_on_off", 0x00000000);
pFEN->userRegWrite("sc_acq_on_off", 0x00000001);
pFEN->userRegWrite("sc_acq_on_off", 0x00000000);
}
void FENConfigModule::checkLinkStatus(std::string& message, std::vector<std::string>& linkStatus) {
......@@ -71,18 +71,18 @@ void FENConfigModule::checkLinkStatus(std::string& message, std::vector<std::str
}
void FENConfigModule::configFEN() {
pFEN->user_reg_write("app_debug_data_format", 0);
pFEN->user_reg_write("app_latency_reset", 27);
pFEN->user_reg_write("app_latency_data_max", 1024);
pFEN->user_reg_write("app_latency_data_jitter", 0);
pFEN->user_reg_write("app_tp_offset_first", 100);
pFEN->user_reg_write("app_tp_offset", 1000);
pFEN->user_reg_write("app_tp_latency", 46);
pFEN->user_reg_write("app_tp_number", 1);
pFEN->user_reg_write("app_chmask", getChMap());
pFEN->user_reg_write("sc_cfg_app", 0x00000000);
pFEN->user_reg_write("sc_cfg_app", 0x00000001);
pFEN->user_reg_write("sc_cfg_app", 0x00000000);
pFEN->userRegWrite("app_debug_data_format", 0);
pFEN->userRegWrite("app_latency_reset", 27);
pFEN->userRegWrite("app_latency_data_max", 1024);
pFEN->userRegWrite("app_latency_data_jitter", 0);
pFEN->userRegWrite("app_tp_offset_first", 100);
pFEN->userRegWrite("app_tp_offset", 1000);
pFEN->userRegWrite("app_tp_latency", 46);
pFEN->userRegWrite("app_tp_number", 1);
pFEN->userRegWrite("app_chmask", getChMap());
pFEN->userRegWrite("sc_cfg_app", 0x00000000);
pFEN->userRegWrite("sc_cfg_app", 0x00000001);
pFEN->userRegWrite("sc_cfg_app", 0x00000000);
}
uint16_t FENConfigModule::getChMap() {
......@@ -122,13 +122,13 @@ void FENConfigModule::configHybrid(int hybrid_index) {
for (const auto& reg : registers) {
unsigned short result = 0;
hybrids[hybrid_index].getRegister(reg, result);
pFEN->user_reg_write(reg + std::to_string(hybrid_index), result);
pFEN->userRegWrite(reg + std::to_string(hybrid_index), result);
}
uint32_t value = (1 << hybrid_index);
pFEN->user_reg_write("sc_cfg_hyb", 0x0);
pFEN->user_reg_write("sc_cfg_hyb", value);
pFEN->user_reg_write("sc_cfg_hyb", 0x0);
pFEN->userRegWrite("sc_cfg_hyb", 0x0);
pFEN->userRegWrite("sc_cfg_hyb", value);
pFEN->userRegWrite("sc_cfg_hyb", 0x0);
}
bool FENConfigModule::configVMM(int hybrid_index, int vmm_index, bool enableConfigCheck)
......@@ -192,7 +192,7 @@ bool FENConfigModule::configVMM(int hybrid_index, int vmm_index, bool enableConf
for(unsigned int i = firstGlobalRegSPI_2; i <= lastGlobalRegSPI_2; i++) {
std::string param = "vmm_global_bank2_sp" + std::to_string(i - firstGlobalRegSPI_2) + sVmmIndex;
uint32_t value = std::stoul(globalRegisters2[i - firstGlobalRegSPI_2], nullptr, 2);
pFEN->user_reg_write(param, value);
pFEN->userRegWrite(param, value);
}
//channel SPI
......@@ -202,20 +202,20 @@ bool FENConfigModule::configVMM(int hybrid_index, int vmm_index, bool enableConf
std::string param = "vmm_ch" + position_str + sVmmIndex;
uint32_t value = std::stoul(channelRegisters[i], nullptr, 2);
std::cout << "param: " << param << std::endl;
pFEN->user_reg_write(param, value);
pFEN->userRegWrite(param, value);
}
// global SPI / VMM3: global bank 1
for(unsigned int i = firstGlobalRegSPI_1; i <= lastGlobalRegSPI_1; i++) {
std::string param = "vmm_global_bank1_sp" + std::to_string(i - firstGlobalRegSPI_1) + sVmmIndex;
uint32_t value = std::stoul(globalRegisters[i - firstGlobalRegSPI_1], nullptr, 2);
pFEN->user_reg_write(param, value);
pFEN->userRegWrite(param, value);
}
uint32_t value = (1 << idx);
pFEN->user_reg_write("sc_cfg_vmm", 0x00000000);
pFEN->user_reg_write("sc_cfg_vmm", value);
pFEN->user_reg_write("sc_cfg_vmm", 0x00000000);
pFEN->userRegWrite("sc_cfg_vmm", 0x00000000);
pFEN->userRegWrite("sc_cfg_vmm", value);
pFEN->userRegWrite("sc_cfg_vmm", 0x00000000);
return result;
}
......@@ -418,16 +418,16 @@ int FENConfigModule::readADC(int hybrid_index, int vmm_index) {
uint32_t FENConfigModule::readWriteRegs(std::string command_reg, int index, std::string read_reg) {
unsigned int data = 0x00000000;
pFEN->user_reg_write(command_reg, data);
pFEN->userRegWrite(command_reg, data);
data = (1 << index);
pFEN->user_reg_write(command_reg, data);
pFEN->userRegWrite(command_reg, data);
//Do not read registers back too soon, otherwise old ADC value is read
delayMilliseconds(7);
uint32_t value = pFEN->user_reg_read(read_reg);
uint32_t value = pFEN->userRegRead(read_reg);
std::cout << "value: " << value << std::endl;
pFEN->user_reg_write(command_reg, 0x0);
pFEN->userRegWrite(command_reg, 0x0);
return value;
}
......
#include "vmm_tbl.h"
/** Constructor for the VMMTbl class */
VMMTbl::VMMTbl(RMM& rmm, int ring, int node)
VMMTbl::VMMTbl(RMM& rmm, int ring, int node, int hybrids)
: FrontEndBase(rmm.get_rmm_reg_access(), ring, node),
pVMMConfig(*this),
pRMM(&rmm)
{
number_hybrids = hybrids;
addr_list = ring * NUMBER_NODES_PER_RING + node;
fe_addr_map[ring] = vmm_tbl_register_map;
create_epics_params();
set_initial_epics_params();
createEpicsParams();
setInitialEpicsParams();
pRMM->get_rmm_rings().set_topology(ring, node, "vmm-tbl");
pVMMConfig.enableHybrid(0, true);
pRMM->updateTopologyPvs(ring, node, "ac701");
for (int hyb = 0; hyb < number_hybrids; hyb++) {
pVMMConfig.enableHybrid(hyb, true);
}
}
void VMMTbl::config_FE() {
void VMMTbl::configFE() {
puts("config_FE");
}
void VMMTbl::set_initial_epics_params() {
void VMMTbl::setInitialEpicsParams() {
puts("set_initial_epics_params");
}
asynStatus VMMTbl::create_epics_params() {
asynStatus VMMTbl::createEpicsParams() {
pRMM->createParam(addr_list, "SEL_ANALOG_MONITOR_VMM0", asynParamInt32, &vmmSelectMonitorVMM0_);
pRMM->createParam(addr_list, "SEL_ANALOG_MONITOR_VMM1", asynParamInt32, &vmmSelectMonitorVMM1_);
pRMM->createParam(addr_list, "READ_ADC_VMMS", asynParamInt32, &vmmProcessReadMonitorVMMs_);
......@@ -64,7 +68,7 @@ asynStatus VMMTbl::writeInt32(asynUser *pasynUser, epicsInt32 value) {
// enable test_pulse (st) of Hybrid 0, VMM 0, channel 0 to test purpose
// TODO: ADD PVs to enable/disable that
pVMMConfig.getHybrid(0).getVMM(0).setRegister("st", 1, 0);
if (value) pVMMConfig.acquire(true);
else pVMMConfig.acquire(false);
}
......@@ -83,15 +87,16 @@ asynStatus VMMTbl::writeFloat64(asynUser *pasynUser, epicsFloat64 value) {
extern "C" {
static void VMMTblConfig(const char *rmm_port_name, int ring, int node) {
static void VMMTblConfig(const char *rmm_port_name, int ring, int hybrids) {
int node = 0; // VMM use always only the Node 0
RMM *pRMM;
pRMM = (RMM *) findAsynPortDriver(rmm_port_name);
pRMM->frontends[ring][node] = std::make_shared<VMMTbl>(*pRMM, ring, node);
pRMM->frontends[ring][node] = std::make_shared<VMMTbl>(*pRMM, ring, node, hybrids);
}
static const iocshArg configArg0 = { "RMM Port name", iocshArgString};
static const iocshArg configArg1 = { "Ring", iocshArgInt};
static const iocshArg configArg2 = { "Node", iocshArgInt};
static const iocshArg configArg2 = { "Hybrids", iocshArgInt};
static const iocshArg * const configArgs[] = {&configArg0,
......
......@@ -8,12 +8,12 @@
/** Class definition for the VMMTbl class */
class VMMTbl : public FrontEndBase {
public:
VMMTbl(RMM& rmm, int ring, int node);
asynStatus create_epics_params();
VMMTbl(RMM& rmm, int ring, int node, int hybrids);
asynStatus createEpicsParams();
virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value);
virtual asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value);
void set_initial_epics_params();
void config_FE();
void setInitialEpicsParams();
void configFE();
protected:
int vmmSelectMonitorVMM0_;
......@@ -27,4 +27,5 @@ private:
FENConfigModule pVMMConfig;
RMM *pRMM;
int addr_list = 0;
int number_hybrids;
};
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment