• Main Page
  • Related Pages
  • Namespaces
  • Data Structures
  • Files
  • File List
  • Globals

roclib/src_nxyter/RocNx.cxx (r4864/r4162)

Go to the documentation of this file.
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 //using roc::Board;
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,              // deactivate all nx
00050     ROC_NX_FEB4NX,             0,
00051     ROC_NX_PARITY_CHECK,       1,              // enable nx parity check
00052     ROC_NX_ADC_PORT_SELECT1,   1,              // adc port select for Feb1nx
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,              // adc delay 11
00057     ROC_NX_BUFG_SELECT,        0,
00058     ROC_NX_SR_INIT2,      0xfc03,              // adc delay 11
00059     ROC_NX_BUFG_SELECT2,       0,
00060     ROC_NX_ADC_LATENCY1,      65,              // good for all cables
00061     ROC_NX_ADC_LATENCY2,      65,
00062     ROC_NX_ADC_LATENCY3,      65,
00063     ROC_NX_ADC_LATENCY4,      65,
00064     ROC_NX_DELAY_LTS,        512,              // !! the holy default !!
00065     ROC_NX_DELAY_NX0,        288,              // good for iDUR=15 and all cables
00066     ROC_NX_DELAY_NX1,        288,
00067     ROC_NX_DELAY_NX2,        288,
00068     ROC_NX_DELAY_NX3,        288,
00069     ROC_NX_DEBUG_MODE,         0,              // make sure it's off
00070     0xffffffff,    0xffffffff               // end marker
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) {                       // setup abort sequence
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;                        // io error
00350   if (data[0] == 0) return -1;              // not in debug mode
00351   if (data[1] != 0) return 0;               // fifo empty, quit
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;                      // io error
00363     datvec.push_back(nxyter::DataDebug(data[0], data[1], data[2], data[3]));
00364     nget += 1;
00365     if (data[4] != 0) break;             // fifo empty, quit
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 //----------------------------------------------------------------------------

Generated on Tue Dec 10 2013 04:52:23 for ROCsoft by  doxygen 1.7.1