$treeview $search $mathjax $extrastylesheet
otsdaq_components
v2_03_00
$projectbrief
|
$projectbrief
|
$searchbox |
00001 /* 00002 * PSI46DigROCDefinitions.cc 00003 * 00004 * Created on: Jun 12, 2013 00005 * Author: Luigi Vigani 00006 */ 00007 00008 #include "otsdaq-components/DetectorHardware/PSI46DigROCDefinitions.h" 00009 #include "otsdaq-core/BitManipulator/BitManipulator.h" 00010 //#include "otsdaq-core/MessageFacility/MessageFacility.h" 00011 #include <cassert> 00012 #include <cstdlib> 00013 #include <iostream> 00014 #include "otsdaq-core/Macros/CoutMacros.h" 00015 00016 using namespace ots; 00017 00018 //======================================================================================================================== 00019 PSI46DigROCDefinitions::PSI46DigROCDefinitions() {} 00020 00021 //======================================================================================================================== 00022 PSI46DigROCDefinitions::~PSI46DigROCDefinitions(void) {} 00023 00024 //======================================================================================================================== 00025 unsigned int PSI46DigROCDefinitions::getDACRegisterAddress( 00026 const std::string& registerName) 00027 { 00028 if(registerName == "PulserData") 00029 return 1; 00030 else if(registerName == "PulserControl") 00031 return 2; 00032 else if(registerName == "IntegratorVbn") 00033 return 3; 00034 else if(registerName == "ShaperVbp2") 00035 return 4; 00036 else if(registerName == "ShaperVbp1") 00037 return 5; 00038 else if(registerName == "BLRestorer") 00039 return 6; 00040 else if(registerName == "VTn") 00041 return 7; 00042 else if(registerName == "VTp0") 00043 return 8; 00044 else if(registerName == "VTp1") 00045 return 9; 00046 else if(registerName == "VTp2") 00047 return 10; 00048 else if(registerName == "VTp3") 00049 return 11; 00050 else if(registerName == "VTp4") 00051 return 12; 00052 else if(registerName == "VTp5") 00053 return 13; 00054 else if(registerName == "VTp6") 00055 return 14; 00056 else if(registerName == "VTp7") 00057 return 15; 00058 else if(registerName == "ActiveLines") 00059 return 16; 00060 else if(registerName == "SendData") 00061 return 19; 00062 else if(registerName == "RejectHits") 00063 return 20; 00064 else if(registerName == "DigContrReg") 00065 return 27; 00066 else if(registerName == "AqBCO") 00067 return 30; 00068 // Kill and Inject are GENERAL names that will be used for all ROCs 00069 else if(registerName == "Kill") 00070 return 17; 00071 else if(registerName == "Inject") 00072 return 18; 00073 else 00074 { 00075 std::cout << __COUT_HDR_FL__ << " Register Name not recognized!" << std::endl; 00076 assert(0); 00077 } 00078 return 0; 00079 } 00080 00081 //======================================================================================================================== 00082 uint64_t PSI46DigROCDefinitions::makeDACWriteHeader(int chipId, 00083 const std::string& registerName) 00084 { 00085 return makeDACHeader(chipId, registerName, write); 00086 } 00087 00088 //======================================================================================================================== 00089 uint64_t PSI46DigROCDefinitions::makeDACSetHeader(int chipId, 00090 const std::string& registerName) 00091 { 00092 return makeDACHeader(chipId, registerName, set); 00093 } 00094 00095 //======================================================================================================================== 00096 uint64_t PSI46DigROCDefinitions::makeDACResetHeader(int chipId, 00097 const std::string& registerName) 00098 { 00099 return makeDACHeader(chipId, registerName, reset); 00100 } 00101 00102 //======================================================================================================================== 00103 uint64_t PSI46DigROCDefinitions::makeDACReadHeader(int chipId, 00104 const std::string& registerName) 00105 { 00106 return makeDACHeader(chipId, registerName, read); 00107 } 00108 00109 //======================================================================================================================== 00110 uint64_t PSI46DigROCDefinitions::makeDACHeader(int chipId, 00111 const std::string& registerName, 00112 unsigned int instruction) 00113 { 00114 /*Ryan 00115 uint64_t command = 0; 00116 //Insert Chip ID 00117 BitManipulator::insertBits(command,BitManipulator::reverseBits(chipId,0,5),0,5); 00118 //Insert Register Address 00119 BitManipulator::insertBits(command,BitManipulator::reverseBits(getDACRegisterAddress(registerName),0,5),5,5); 00120 //Insert instruction 00121 BitManipulator::insertBits(command,BitManipulator::reverseBits(instruction,0,3),10,3); 00122 */ 00123 uint32_t command = 0x80000000; 00124 uint32_t registerAddress = getDACRegisterAddress(registerName); 00125 // Insert Chip ID 00126 BitManipulator::insertBits(command, chipId, 0, 5); 00127 // Insert Register Address 00128 BitManipulator::insertBits(command, registerAddress, 5, 5); 00129 // Insert instruction 00130 BitManipulator::insertBits(command, instruction, 10, 3); 00131 00132 // Insert mask 00133 // BitManipulator::insertBits(command,0x1,16,8); 00134 unsigned int length = 3; 00135 if(registerAddress < 16 || registerAddress < 27 || registerAddress < 30) 00136 length = 3; 00137 else if(registerAddress == 17 || registerAddress == 18) 00138 length = 4; 00139 else if(registerAddress == 16) 00140 length = 2; 00141 else if(registerAddress == 19 || registerAddress == 20) 00142 length = 1; 00143 // Insert command length 00144 BitManipulator::insertBits(command, length, 24, 7); 00145 00146 return command; 00147 } 00148 00149 //======================================================================================================================== 00150 uint64_t PSI46DigROCDefinitions::makeDACWriteCommand(int chipId, 00151 const std::string& registerName, 00152 unsigned int valueToWrite) 00153 { 00154 std::cout << __COUT_HDR_FL__ << "Working on Register " << registerName 00155 << " Address: " << getDACRegisterAddress(registerName) 00156 << " Value: " << valueToWrite << std::endl; 00157 uint64_t command = 0; 00158 if(registerName != "SendData" && registerName != "RejectHits") 00159 { 00160 command = makeDACWriteHeader(chipId, registerName); 00161 BitManipulator::insertBits( 00162 command, BitManipulator::reverseBits(valueToWrite, 0, 8), 13, 8); 00163 } 00164 else if(valueToWrite == 1) 00165 command = makeDACSetHeader(chipId, registerName); 00166 else 00167 command = makeDACResetHeader(chipId, registerName); 00168 // BitManipulator::insertBits(command,0x0,13,8);It doesn't matter the value you put in 00169 // if is set or reset! 00170 00171 return command; 00172 } 00173 00174 //======================================================================================================================== 00175 uint64_t PSI46DigROCDefinitions::makeDACReadCommand(int chipId, 00176 const std::string& registerName) 00177 { 00178 return makeDACHeader(chipId, registerName, read); 00179 } 00180 00181 //======================================================================================================================== 00182 std::string PSI46DigROCDefinitions::makeMaskWriteCommand(int chipId, 00183 const std::string& registerName, 00184 std::string valueToWrite) 00185 { 00186 std::string command = "0000000000000000000"; 00187 00188 /*Ryan's 00189 //Insert Chip ID 00190 //BitManipulator::insertBits(command,BitManipulator::reverseBits(chipId,0,5),0,5); 00191 BitManipulator::insertBits(command,chipId,0,5); 00192 //Insert Register Address 00193 //BitManipulator::insertBits(command,BitManipulator::reverseBits(getDACRegisterAddress(registerName),0,5),5,5); 00194 BitManipulator::insertBits(command,getDACRegisterAddress(registerName),5,5); 00195 //Insert instruction 00196 //BitManipulator::insertBits(command,writeReversed,10,3); 00197 BitManipulator::insertBits(command,write,10,3); 00198 00199 UInt8 revField = (UInt8)0; 00200 for (unsigned int c=0; c<valueToWrite.length(); c++) 00201 { 00202 if(registerName == "Inject") 00203 revField = !(UInt8)valueToWrite.substr(c,1).data()[0]; 00204 else 00205 revField = (UInt8)valueToWrite.substr(c,1).data()[0]; 00206 //revField = 0x40; 00207 BitManipulator::insertBits(command,(uint64_t)revField,13+c,1); 00208 } 00209 00210 std::cout << __COUT_HDR_FL__ << " std::string made: " << std::endl; 00211 for (int i=0; i<19; i++) 00212 { 00213 std::cout << __COUT_HDR_FL__ << hex << (uint64_t)command.substr(i, 1).data()[0] << 00214 "-" << std::endl; 00215 } 00216 std::cout << __COUT_HDR_FL__ << "\n" << std::endl; 00217 */ 00218 return command; 00219 } 00220 00221 //======================================================================================================================== 00222 uint64_t PSI46DigROCDefinitions::makeMaskReadCommand(int chipId, 00223 const std::string& registerName) 00224 { 00225 return 0; 00226 } 00227 00228 //======================================================================================================================== 00229 uint64_t PSI46DigROCDefinitions::setSendData(int chipId) 00230 { 00231 return makeDACWriteCommand(chipId, "SendData", 1); 00232 } 00233 00234 //======================================================================================================================== 00235 uint64_t PSI46DigROCDefinitions::resetSendData(int chipId) 00236 { 00237 return makeDACWriteCommand(chipId, "SendData", 0); 00238 } 00239 00240 //======================================================================================================================== 00241 uint64_t PSI46DigROCDefinitions::setRejectHits(int chipId) 00242 { 00243 return makeDACWriteCommand(chipId, "RejectHits", 1); 00244 } 00245 00246 //======================================================================================================================== 00247 uint64_t PSI46DigROCDefinitions::resetRejectHits(int chipId) 00248 { 00249 return makeDACWriteCommand(chipId, "RejectHits", 0); 00250 }