00001 #include <cmath>
00002
00003 #include <stdlib.h>
00004
00005 #include "nxyter/RocNx.h"
00006 #include "nxyter/defines_nxyter.h"
00007 #include "roc/defines_roc.h"
00008
00009
00010
00017
00019
00024 nxyter::RocNx::RocNx(base::Board* board) :
00025 base::Peripheral(board)
00026 {
00027 }
00028
00029
00030
00031 nxyter::RocNx::~RocNx()
00032 {
00033 }
00034
00035
00037
00046 int nxyter::RocNx::setToDefault()
00047 {
00048 unsigned initlist[] = {
00049 ROC_NX_NXACTIVE, 0,
00050 ROC_NX_FEB4NX, 0,
00051 ROC_NX_PARITY_CHECK, 1,
00052 ROC_NX_ADC_PORT_SELECT1, 1,
00053 ROC_NX_ADC_PORT_SELECT2, 0,
00054 ROC_NX_ADC_PORT_SELECT3, 1,
00055 ROC_NX_ADC_PORT_SELECT4, 0,
00056 ROC_NX_SR_INIT, 0xfc03,
00057 ROC_NX_BUFG_SELECT, 0,
00058 ROC_NX_SR_INIT2, 0xfc03,
00059 ROC_NX_BUFG_SELECT2, 0,
00060 ROC_NX_ADC_LATENCY1, 65,
00061 ROC_NX_ADC_LATENCY2, 65,
00062 ROC_NX_ADC_LATENCY3, 65,
00063 ROC_NX_ADC_LATENCY4, 65,
00064 ROC_NX_DELAY_LTS, 512,
00065 ROC_NX_DELAY_NX0, 288,
00066 ROC_NX_DELAY_NX1, 288,
00067 ROC_NX_DELAY_NX2, 288,
00068 ROC_NX_DELAY_NX3, 288,
00069 ROC_NX_DEBUG_MODE, 0,
00070 0xffffffff, 0xffffffff
00071 };
00072
00073 for (unsigned* p=initlist; p[0]!=0xffffffff; p+=2) {
00074 int rc = board().put(p[0], p[1]);
00075 if (rc) return base::Board::operErrBuild(rc, (p-initlist)/2);
00076 }
00077 return 0;
00078 }
00079
00080
00081
00083
00091 int nxyter::RocNx::resetRocNxTs()
00092 {
00093 base::OperList lst;
00094
00095 lst.addPut(ROC_NX_TS_RESET, 1);
00096 lst.addPut(ROC_NX_TS_RESET, 0);
00097
00098 return board().operGen(lst);
00099 }
00100
00101
00102
00104
00135 int nxyter::RocNx::fireTestPulse(uint32_t period, int32_t width,
00136 uint32_t number)
00137 {
00138 uint32_t llow, lhigh;
00139
00140 if (period == 0) {
00141 period = 6;
00142 width = 3;
00143 number = 1;
00144 }
00145
00146 if (width > 0) {
00147 llow = period - width;
00148 lhigh = width;
00149 } else {
00150 llow = -width;
00151 lhigh = period + width;
00152 }
00153
00154 if (number > 0x00008fff || width == 0 || labs(width) >= period ||
00155 llow > 0x00ffffff || lhigh > 0x00ffffff) {
00156 return -1;
00157 }
00158
00159 int rc = board().operPPPP(ROC_NX_TESTPULSE_LENGTH, llow - 1,
00160 ROC_NX_TESTPULSE_LENGTH2, lhigh - 1,
00161 ROC_NX_TESTPULSE_NUMBER, number * 2,
00162 ROC_NX_TESTPULSE_START, 1);
00163 return rc;
00164 }
00165
00166
00168
00199 int nxyter::RocNx::fireTestPulse(uint32_t delay, uint32_t period, int32_t width,
00200 uint32_t number)
00201 {
00202 int rc;
00203
00204 uint32_t llow, lhigh;
00205 if (width > 0) {
00206 llow = period - width;
00207 lhigh = width;
00208 } else {
00209 llow = -width;
00210 lhigh = period + width;
00211 }
00212 if (number > 0x00008fff || width == 0 || labs(width) >= period ||
00213 delay > 0x0000ffff ||
00214 llow > 0x00ffffff || lhigh > 0x00ffffff) {
00215 return -1;
00216 }
00217
00218 rc = board().operPPPP(ROC_NX_TESTPULSE_RESET_DELAY, delay - 1,
00219 ROC_NX_TESTPULSE_LENGTH, llow - 1,
00220 ROC_NX_TESTPULSE_LENGTH2, lhigh - 1,
00221 ROC_NX_TESTPULSE_NUMBER, number * 2);
00222 if (rc) return rc;
00223 rc = resetRocNxTs();
00224 if (rc) return base::Board::operErrBuild(rc, 4);
00225 return 0;
00226 }
00227
00228
00230
00234 int nxyter::RocNx::setNxActive(int nx0, int nx1, int nx2, int nx3)
00235 {
00236 int rc = setNxActive((nx0 ? 1 : 0) | (nx1 ? 2 : 0) |
00237 (nx2 ? 4 : 0) | (nx3 ? 8 : 0));
00238 return rc;
00239 }
00240
00241
00243
00247 int nxyter::RocNx::setNxActive(uint32_t mask)
00248 {
00249 return board().put(ROC_NX_NXACTIVE, mask & 0xf);
00250 }
00251
00252
00254
00258 int nxyter::RocNx::getNxActive(uint32_t& mask)
00259 {
00260 return board().get(ROC_NX_NXACTIVE, mask);
00261 }
00262
00263
00265
00270 int nxyter::RocNx::setLTSDelay(uint32_t val)
00271 {
00272 return board().put(ROC_NX_DELAY_LTS, val);
00273 }
00274
00275
00277
00285 int nxyter::RocNx::setParityCheck(uint32_t val)
00286 {
00287 return board().put(ROC_NX_PARITY_CHECK, val);
00288 }
00289
00290
00292
00297 int nxyter::RocNx::setDebugMode(uint32_t val)
00298 {
00299 return board().put(ROC_NX_DEBUG_MODE, val);
00300 }
00301
00302
00304
00305 int nxyter::RocNx::getFifoFull(uint32_t& val)
00306 {
00307 return board().get(ROC_NX_FIFO_FULL, val);
00308 }
00309
00310
00312
00313 int nxyter::RocNx::getFifoEmpty(uint32_t& val)
00314 {
00315 return board().get(ROC_NX_FIFO_EMPTY, val);
00316 }
00317
00318
00320
00336 int nxyter::RocNx::getDataDebug(std::vector<nxyter::DataDebug>& datvec,
00337 int nmsg)
00338 {
00339 bool isput[5];
00340 uint32_t addr[5];
00341 uint32_t data[5];
00342 int rc;
00343
00344 isput[0] = false; addr[0] = ROC_NX_DEBUG_MODE;
00345 isput[1] = false; addr[1] = ROC_NX_FIFO_EMPTY;
00346
00347 rc = board().operGen(isput, addr, data, 2);
00348
00349 if (rc) return -2;
00350 if (data[0] == 0) return -1;
00351 if (data[1] != 0) return 0;
00352
00353 isput[0] = false; addr[0] = ROC_NX_ADC_DATA;
00354 isput[1] = false; addr[1] = ROC_NX_NX_DATA;
00355 isput[2] = false; addr[2] = ROC_NX_LT_LOW;
00356 isput[3] = false; addr[3] = ROC_NX_LT_HIGH;
00357 isput[4] = false; addr[4] = ROC_NX_FIFO_EMPTY;
00358
00359 int nget = 0;
00360 while(nget < nmsg) {
00361 rc = board().operGen(isput, addr, data, 5);
00362 if (rc) return -2;
00363 datvec.push_back(nxyter::DataDebug(data[0], data[1], data[2], data[3]));
00364 nget += 1;
00365 if (data[4] != 0) break;
00366 }
00367 return nget;
00368 }
00369
00370
00372
00373 void nxyter::RocNx::addAddrMap(base::Board* board, unsigned hw_kind)
00374 {
00375 if ((hw_kind != base::kind_nXYTER) && (hw_kind != base::kind_newNX)) return;
00376
00377 board->addRegAddrMapping("ROC_NX_HWV", ROC_NX_HWV);
00378 board->addRegAddrMapping("ROC_NX_FIFO_RESET", ROC_NX_FIFO_RESET);
00379 board->addRegAddrMapping("ROC_NX_THROTTLE", ROC_NX_THROTTLE);
00380 board->addRegAddrMapping("ROC_NX_INIT", ROC_NX_INIT);
00381 board->addRegAddrMapping("ROC_NX_TS_RESET", ROC_NX_TS_RESET);
00382 board->addRegAddrMapping("ROC_NX_BURST1", ROC_NX_BURST1);
00383 board->addRegAddrMapping("ROC_NX_BURST2", ROC_NX_BURST2);
00384 board->addRegAddrMapping("ROC_NX_BURST3", ROC_NX_BURST3);
00385 board->addRegAddrMapping("ROC_NX_TESTPULSE_RESET_DELAY", ROC_NX_TESTPULSE_RESET_DELAY);
00386 board->addRegAddrMapping("ROC_NX_TESTPULSE_LENGTH", ROC_NX_TESTPULSE_LENGTH);
00387 board->addRegAddrMapping("ROC_NX_TESTPULSE_LENGTH2", ROC_NX_TESTPULSE_LENGTH2);
00388 board->addRegAddrMapping("ROC_NX_TESTPULSE_NUMBER", ROC_NX_TESTPULSE_NUMBER);
00389 board->addRegAddrMapping("ROC_NX_TESTPULSE_START", ROC_NX_TESTPULSE_START);
00390 board->addRegAddrMapping("ROC_NX_TESTPULSE_RUNNING", ROC_NX_TESTPULSE_RUNNING);
00391 board->addRegAddrMapping("ROC_NX_NXACTIVE", ROC_NX_NXACTIVE);
00392 board->addRegAddrMapping("ROC_NX_FEB4NX", ROC_NX_FEB4NX);
00393 board->addRegAddrMapping("ROC_NX_PARITY_CHECK", ROC_NX_PARITY_CHECK);
00394 board->addRegAddrMapping("ROC_NX_I2C_RESET", ROC_NX_I2C_RESET);
00395 board->addRegAddrMapping("ROC_NX_I2C_REGRESET", ROC_NX_I2C_REGRESET);
00396 board->addRegAddrMapping("ROC_NX_DELAY_LTS", ROC_NX_DELAY_LTS);
00397 board->addRegAddrMapping("ROC_NX_DELAY_NX0", ROC_NX_DELAY_NX0);
00398 board->addRegAddrMapping("ROC_NX_DELAY_NX1", ROC_NX_DELAY_NX1);
00399 board->addRegAddrMapping("ROC_NX_DELAY_NX2", ROC_NX_DELAY_NX2);
00400 board->addRegAddrMapping("ROC_NX_DELAY_NX3", ROC_NX_DELAY_NX3);
00401 board->addRegAddrMapping("ROC_NX_DEBUG_MODE", ROC_NX_DEBUG_MODE);
00402 board->addRegAddrMapping("ROC_NX_FIFO_EMPTY", ROC_NX_FIFO_EMPTY);
00403 board->addRegAddrMapping("ROC_NX_FIFO_FULL", ROC_NX_FIFO_FULL);
00404 board->addRegAddrMapping("ROC_NX_LT_LOW", ROC_NX_LT_LOW);
00405 board->addRegAddrMapping("ROC_NX_LT_HIGH", ROC_NX_LT_HIGH);
00406 board->addRegAddrMapping("ROC_NX_ADC_DATA", ROC_NX_ADC_DATA);
00407 board->addRegAddrMapping("ROC_NX_NX_DATA", ROC_NX_NX_DATA);
00408 }
00409
00410