Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   Related Pages  

/var/pcce/usera/hill/rcc_1.2/RodDaq/RodCrate/BocCard.cxx

Go to the documentation of this file.
00001 // File: BocModule.cxx
00002 
00003 
00004 #include "BocCard.h"
00005 
00006 //! Namespace for the common routines for SCT and PIXEL ROD software.
00007 namespace SctPixelRod {
00008 
00009 
00010 //****************************class BocCard**************************
00011 //
00012 // Description:
00013 //  This class provides the software interface to the BOC module.
00014 //
00015 // Author(s):
00016 //  John Hill (hill@hep.phy.cam.ac.uk) - originator
00017 //
00018 //-------------------------------Constructor-------------------------
00019 
00020 /*
00021 This is the only constructor to use.
00022 */
00023 
00024 
00025 BocCard::BocCard(RodModule & rod) {
00026   m_myrod = &rod;
00027   m_serialNumber = 0xFFFFFFFF;  //initialize overwrites this
00028 }
00029 
00030 
00031 //-------------------------------Destructor--------------------------
00032 
00033 /*
00034 Just remove reference to ROD. The RodModule class is not deleted, as
00035 BocCard did not create it.
00036 */
00037 
00038 
00039 BocCard::~BocCard() {
00040   m_myrod = 0;
00041 }
00042 
00043 
00044 //  Member methods
00045 
00046 
00047 //------------------------initialize--------------------------------
00048 /*! Initialize (sic!) the BOC - set to a well-defined state. A lot
00049  * of the settings in this method will be power-on defaults, but it
00050  * is helpful to do this explicitly.
00051  */
00052 
00053 void BocCard::initialize() {
00054 
00055 
00056 // Reset the BOC
00057 
00058   resetBoc();
00059 
00060 // Get all the readonly identification information into the private
00061 // variables
00062 
00063   m_serialNumber = singleRead(BOC_SERIAL_NUMBER);
00064   m_manufacturer = singleRead(BOC_MANUFACTURER);
00065   m_moduleType = singleRead(BOC_MODULE_TYPE);
00066   m_hardwareRevision = singleRead(BOC_HW_REV);
00067   m_firmwareRevision = singleRead(BOC_FW_REV);
00068 
00069 // Initialise the two I2C streams (Rx data delays), by writing to the first
00070 // channel in each stream (data written is not relevant)
00071 
00072   setRxDataDelay(0,0);          //I2C0
00073   setRxDataDelay(0x40,0);               //I2C1
00074 
00075 //Set the clocks
00076 
00077   setClockControl(0);           //Clock Control register
00078   setVernierClockPhase0(0);
00079   setVernierClockPhase1(0);             //Two vernier clocks...
00080   setVernierFinePhase(0);       //...and the vernier fine phase
00081   setBpmClockPhase(0);          //BPM Clock Phase
00082   setBregClockPhase(0xC);       //Breg Clock Phase (note non-zero).
00083 
00084 //Clear the RX and TX DACs
00085 
00086   clearRxDac();
00087   clearTxDac();
00088 
00089 // Set all the receiver thresholds to 0xFF (ie. off!) and the data delays
00090 // to zero.
00091 
00092   for(unsigned int i=0;i<BOC_RECEIVE_CHANNELS;i++) {
00093     setRxThreshold(i,0xFF);
00094     setRxDataDelay(i,0);
00095 
00096   }
00097 
00098 // Set all the laser currents to 0
00099 
00100   for(unsigned int i=0;i<BOC_TRANSMIT_CHANNELS;i++) {
00101     setLaserCurrent(i,0);
00102   }
00103 
00104 // Set all the strobe delays to 0. These are no longer used, so
00105 // this is probably unnecessary, but for completeness...
00106 
00107   for(unsigned int i=0;i<BOC_STROBE_CHANNELS;i++) {
00108     setStrobeDelay(i,0);
00109   }
00110   
00111 // Make sure the BPMs are reset before trying to set them.
00112  
00113   resetBpm();
00114 
00115 // Now set the BPMs for all channels. The first 12 channels
00116 // of a BPM are used by the "real" control fibres. Channels
00117 // 12 and 13 of a BPM are used for test structures, and these
00118 // also have to be set correctly.
00119 
00120   for(unsigned int i=0;i<BOC_TRANSMIT_CHANNELS;i++) {
00121     setBpmStreamInhibit(i,0);   //Enable all channels
00122     setBpmMarkSpace(i,0x13);            //Approved starting value
00123     setBpmCoarseDelay(i,0);
00124     setBpmFineDelay(i,0);
00125   }
00126 
00127 //Use the private bpmWrite method for writing to BPM channels 12 and 13
00128 
00129   for(unsigned int i=0;i<(BOC_TRANSMIT_CHANNELS/12);i++) {
00130     bpmWrite(i,12,0,0x20);              //0x20 into channel 12
00131     bpmWrite(i,13,0,0x40);              //0x40 into channel 13
00132   }
00133 
00134 //Now set the Rx Data Mode, and we should be done.
00135 
00136   setRxDataMode(0);
00137 
00138 }
00139   
00140 //------------------------reset-------------------------------------
00141 /*! Reset the BOC. For now, this just issues BOC and BPM resets, until
00142  * it is clear what is needed to achieve a true reset.
00143  */
00144 
00145 void BocCard::reset() {
00146 
00147   resetBoc();
00148   resetBpm();
00149 
00150 }
00151 
00152 //------------------------status------------------------------------
00153 
00154 /*! This method reports the status of the BOC.
00155  *  For now, it simply prints to standard output.
00156  */
00157 
00158 void BocCard::status() {
00159 
00160   std::cout << "status" << endl;
00161 
00162   std::cout << dec << " Module Type: " << m_moduleType;
00163   std::cout << " Serial Number: " << m_serialNumber;
00164   std::cout << endl;
00165   std::cout << " Hardware Version: " << m_hardwareRevision;
00166   std::cout << " Firmware Version: " << m_firmwareRevision;
00167   std::cout << endl;
00168   std::cout << hex << " Manufacturer: "   << m_manufacturer; 
00169   std::cout << " Status Register: " << getBocStatusRegister();
00170   std::cout << dec << endl;
00171 }
00172 
00173 //------------------------getLaserCurrent---------------------------
00174 
00175 /*! Read one or more TX laser current settings from the BOC
00176  */
00177 
00178 void BocCard::getLaserCurrent(const UINT32 channel, UINT32 buffer[],
00179         const UINT32 numChannels) {
00180 //
00181   UINT32 address;
00182 //
00183 // Get the start address (relative to start of BOC window)
00184 //
00185   address = BOC_LASER_DAC + (channel<<2);
00186 
00187   if(numChannels <= 1) {
00188 // Use the single read method
00189     buffer[0] = singleRead(address);
00190   }
00191   else {
00192 // Use the block read method
00193     blockRead(address, buffer, numChannels);
00194   }
00195 
00196 }
00197 
00198 UINT32 BocCard::getLaserCurrent(const UINT32 channel) {
00199 //
00200   UINT32 address;
00201 //
00202 // Get the start address (relative to start of BOC window)
00203 //
00204   address = BOC_LASER_DAC + (channel<<2);
00205 
00206 // Use the single read method
00207   return singleRead(address);
00208 
00209 }
00210 
00211 //------------------------setLaserCurrent---------------------------
00212 
00213 /*! Write one or more TX laser current settings to the BOC
00214  */
00215 
00216 void BocCard::setLaserCurrent(const UINT32 channel, const UINT32 buffer[],
00217         const UINT32 numChannels) {
00218 //
00219   UINT32 address;
00220 //
00221 // Get the start address (relative to start of BOC window)
00222 //
00223   address = BOC_LASER_DAC + (channel<<2);
00224 
00225   if(numChannels <= 1) {
00226 // Use the single write method
00227     singleWrite(address,buffer[0]);
00228   }
00229   else {
00230 // Use the block write method
00231     blockWrite(address, buffer, numChannels);
00232   }
00233 
00234 }
00235 
00236 void BocCard::setLaserCurrent(const UINT32 channel, const UINT32 value) {
00237 //
00238   UINT32 address;
00239 //
00240 // Get the start address (relative to start of BOC window)
00241 //
00242   address = BOC_LASER_DAC + (channel<<2);
00243 
00244 // Use the single write method
00245   singleWrite(address,value);
00246 
00247 }
00248 
00249 //------------------------getThreshold---------------------------
00250 
00251 /*! Read one or more RX threshold settings from the BOC
00252  */
00253 
00254 void BocCard::getRxThreshold(const UINT32 channel, UINT32 buffer[],
00255         const UINT32 numChannels) {
00256 //
00257   UINT32 address;
00258 //
00259 // Get the start address (relative to start of BOC window)
00260 //
00261   address = BOC_THRESHOLD_DAC + (channel<<2);
00262 
00263   if(numChannels <= 1) {
00264 // Use the single read method
00265     buffer[0] = singleRead(address);
00266   }
00267   else {
00268 // Use the block read method
00269     blockRead(address, buffer, numChannels);
00270   }
00271 
00272 }
00273 
00274 UINT32 BocCard::getRxThreshold(const UINT32 channel) {
00275 //
00276   UINT32 address;
00277 //
00278 // Get the start address (relative to start of BOC window)
00279 //
00280   address = BOC_THRESHOLD_DAC + (channel<<2);
00281 
00282 // Use the single read method
00283   return singleRead(address);
00284 
00285 }
00286 
00287 //------------------------setThreshold---------------------------
00288 
00289 /*! Write one or more RX threshold settings to the BOC
00290  */
00291 
00292 void BocCard::setRxThreshold(const UINT32 channel, const UINT32 buffer[],
00293         const UINT32 numChannels) {
00294 //
00295   UINT32 address;
00296 //
00297 // Get the start address (relative to start of BOC window)
00298 //
00299   address = BOC_THRESHOLD_DAC + (channel<<2);
00300 
00301   if(numChannels <= 1) {
00302 // Use the single write method
00303     singleWrite(address,buffer[0]);
00304   }
00305   else {
00306 // Use the block write method
00307     blockWrite(address, buffer, numChannels);
00308   }
00309 
00310 }
00311 
00312 void BocCard::setRxThreshold(const UINT32 channel, const UINT32 value) {
00313 //
00314   UINT32 address;
00315 //
00316 // Get the start address (relative to start of BOC window)
00317 //
00318   address = BOC_THRESHOLD_DAC + (channel<<2);
00319 
00320 // Use the single write method
00321   singleWrite(address,value);
00322 
00323 }
00324 
00325 //------------------------getRxDataDelay---------------------------
00326 
00327 /*! Read one or more RX data delay settings from the BOC
00328  */
00329 
00330 void BocCard::getRxDataDelay(const UINT32 channel, UINT32 buffer[],
00331         const UINT32 numChannels) {
00332 //
00333   UINT32 address;
00334 //
00335 // Get the start address (relative to start of BOC window)
00336 //
00337   address = BOC_DATA_DELAY + (channel<<2);
00338 
00339   if(numChannels <= 1) {
00340 // Use the single read method
00341     buffer[0] = singleRead(address);
00342   }
00343   else {
00344 // Use the block read method
00345     blockRead(address, buffer, numChannels);
00346   }
00347 
00348 }
00349 
00350 UINT32 BocCard::getRxDataDelay(const UINT32 channel) {
00351 //
00352   UINT32 address;
00353 //
00354 // Get the start address (relative to start of BOC window)
00355 //
00356   address = BOC_DATA_DELAY + (channel<<2);
00357 
00358   return singleRead(address);
00359 
00360 }
00361 
00362 //------------------------setRxDataDelay---------------------------
00363 
00364 /*! Write one or more RX data delay settings to the BOC
00365  */
00366 
00367 void BocCard::setRxDataDelay(const UINT32 channel, const UINT32 buffer[],
00368         const UINT32 numChannels) {
00369 //
00370   UINT32 address;
00371 //
00372 // Get the start address (relative to start of BOC window)
00373 //
00374   address = BOC_DATA_DELAY + (channel<<2);
00375 
00376   if(numChannels <= 1) {
00377 // Use the single write method
00378     singleWrite(address,buffer[0]);
00379   }
00380   else {
00381 // Use the block write method
00382     blockWrite(address, buffer, numChannels);
00383   }
00384 
00385 }
00386 
00387 void BocCard::setRxDataDelay(const UINT32 channel, const UINT32 value) {
00388 //
00389   UINT32 address;
00390 //
00391 // Get the start address (relative to start of BOC window)
00392 //
00393   address = BOC_DATA_DELAY + (channel<<2);
00394 
00395 // Use the single write method
00396   singleWrite(address,value);
00397 
00398 }
00399 
00400 //------------------------getStrobeDelay---------------------------
00401 
00402 /*! Read one or more strobe delay settings from the BOC. These delays
00403  * are probably not used in BOC1, but the registers exist...
00404  */
00405 
00406 void BocCard::getStrobeDelay(const UINT32 channel, UINT32 buffer[],
00407         const UINT32 numChannels) {
00408 //
00409   UINT32 address;
00410 //
00411 // Get the start address (relative to start of BOC window)
00412 //
00413   address = BOC_STROBE_DELAY + (channel<<2);
00414 
00415   if(numChannels <= 1) {
00416 // Use the single read method
00417     buffer[0] = singleRead(address);
00418   }
00419   else {
00420 // Use the block read method
00421     blockRead(address, buffer, numChannels);
00422   }
00423 
00424 }
00425 
00426 UINT32 BocCard::getStrobeDelay(const UINT32 channel) {
00427 //
00428   UINT32 address;
00429 //
00430 // Get the start address (relative to start of BOC window)
00431 //
00432   address = BOC_STROBE_DELAY + (channel<<2);
00433 
00434 // Use the single read method
00435   return singleRead(address);
00436 
00437 }
00438 
00439 //------------------------setStrobeDelay---------------------------
00440 
00441 /*! Write one or more strobe delay settings to the BOC. These delays
00442  * are probably not used in BOC1, but the registers exist...
00443  */
00444 
00445 void BocCard::setStrobeDelay(const UINT32 channel, const UINT32 buffer[],
00446         const UINT32 numChannels) {
00447 //
00448   UINT32 address;
00449 //
00450 // Get the start address (relative to start of BOC window)
00451 //
00452   address = BOC_STROBE_DELAY + (channel<<2);
00453 
00454   if(numChannels <= 1) {
00455 // Use the single write method
00456     singleWrite(address,buffer[0]);
00457   }
00458   else {
00459 // Use the block write method
00460     blockWrite(address, buffer, numChannels);
00461   }
00462 
00463 }
00464 
00465 void BocCard::setStrobeDelay(const UINT32 channel, const UINT32 value) {
00466 //
00467   UINT32 address;
00468 //
00469 // Get the start address (relative to start of BOC window)
00470 //
00471   address = BOC_STROBE_DELAY + (channel<<2);
00472 
00473 // Use the single write method
00474     singleWrite(address,value);
00475 
00476 }
00477 
00478 //BPM public methods. Private methods are provided to access channel n on
00479 //BPM m. The following methods hide the details of BPM channel number -
00480 //the BPM functionality is accessed via Tx stream number. 
00481 
00482 //------------------------getBpmStreamInhibit----------------------
00483 
00484 /*! Read one or more BPM stream inhibits from the BOC. 
00485  */
00486 
00487 void BocCard::getBpmStreamInhibit(const UINT32 channel, UINT32 buffer[],
00488         const UINT32 numChannels) {
00489 //
00490 // Use bpmRead to access the registers. Streams 0-11 on the BPM are used
00491 // for "real" channels.
00492 //
00493   for(unsigned int i=0;i<numChannels;i++) {
00494     buffer[i] = bpmRead((channel+i)/12,(channel+i)%12,BOC_BPM_INHIBIT);
00495   }
00496 
00497 }
00498 
00499 UINT32 BocCard::getBpmStreamInhibit(const UINT32 channel) {
00500 //
00501 // Use bpmRead to access the registers. Streams 0-11 on the BPM are used
00502 // for "real" channels.
00503 //
00504     return bpmRead(channel/12,channel%12,BOC_BPM_INHIBIT);
00505 
00506 }
00507 
00508 //------------------------setBpmStreamInhibit----------------------
00509 
00510 /*! Write one or more BPM stream inhibits to the BOC.
00511  */
00512 
00513 void BocCard::setBpmStreamInhibit(const UINT32 channel, const UINT32 buffer[],
00514         const UINT32 numChannels) {
00515 //
00516 // Use bpmWrite to access the registers. Streams 0-11 on the BPM are used
00517 // for "real" channels.
00518 //
00519   for(unsigned int i=0;i<numChannels;i++) {
00520     bpmWrite((channel+i)/12,(channel+i)%12,BOC_BPM_INHIBIT,buffer[i]);
00521   }
00522 
00523 }
00524 
00525 void BocCard::setBpmStreamInhibit(const UINT32 channel, const UINT32 value) {
00526 //
00527 // Use bpmWrite to access the registers. Streams 0-11 on the BPM are used
00528 // for "real" channels.
00529 //
00530   bpmWrite(channel/12,channel%12,BOC_BPM_INHIBIT,value);
00531 
00532 }
00533 
00534 //------------------------getBpmMarkSpace--------------------------
00535 
00536 /*! Read one or more BPM mark/space settings from the BOC.
00537  */
00538 
00539 void BocCard::getBpmMarkSpace(const UINT32 channel, UINT32 buffer[],
00540         const UINT32 numChannels) {
00541 //
00542 // Use bpmRead to access the registers. Streams 0-11 on the BPM are used
00543 // for "real" channels.
00544 //
00545   for(unsigned int i=0;i<numChannels;i++) {
00546     buffer[i] = bpmRead((channel+i)/12,(channel+i)%12,BOC_BPM_MARK_SPACE);
00547   }
00548 
00549 }
00550 
00551 UINT32 BocCard::getBpmMarkSpace(const UINT32 channel) {
00552 //
00553 // Use bpmRead to access the registers. Streams 0-11 on the BPM are used
00554 // for "real" channels.
00555 //
00556   return bpmRead(channel/12,channel%12,BOC_BPM_MARK_SPACE);
00557 
00558 }
00559 
00560 //------------------------setBpmMarkSpace--------------------------
00561 
00562 /*! Write one or more BPM mark/space settings to the BOC.
00563  */
00564 
00565 void BocCard::setBpmMarkSpace(const UINT32 channel, const UINT32 buffer[],
00566         const UINT32 numChannels) {
00567 //
00568 // Use bpmWrite to access the registers. Streams 0-11 on the BPM are used
00569 // for "real" channels.
00570 //
00571   for(unsigned int i=0;i<numChannels;i++) {
00572     bpmWrite((channel+i)/12,(channel+i)%12,BOC_BPM_MARK_SPACE,buffer[i]);
00573   }
00574 
00575 }
00576 
00577 void BocCard::setBpmMarkSpace(const UINT32 channel, const UINT32 value) {
00578 //
00579 // Use bpmWrite to access the registers. Streams 0-11 on the BPM are used
00580 // for "real" channels.
00581 //
00582   bpmWrite(channel/12,channel%12,BOC_BPM_MARK_SPACE,value);
00583 
00584 }
00585 
00586 //------------------------getBpmCoarseDelay------------------------
00587 
00588 /*! Read one or more BPM coarse delay settings from the BOC.
00589  */
00590 
00591 void BocCard::getBpmCoarseDelay(const UINT32 channel, UINT32 buffer[],
00592         const UINT32 numChannels) {
00593 //
00594 // Use bpmRead to access the registers. Streams 0-11 on the BPM are used
00595 // for "real" channels.
00596 //
00597   for(unsigned int i=0;i<numChannels;i++) {
00598     buffer[i] = bpmRead((channel+i)/12,(channel+i)%12,BOC_BPM_COARSE);
00599   }
00600 
00601 }
00602 
00603 UINT32 BocCard::getBpmCoarseDelay(const UINT32 channel) {
00604 //
00605 // Use bpmRead to access the registers. Streams 0-11 on the BPM are used
00606 // for "real" channels.
00607 //
00608   return bpmRead(channel/12,channel%12,BOC_BPM_COARSE);
00609 
00610 }
00611 
00612 //------------------------setBpmCoarseDelay----------------------
00613 
00614 /*! Write one or more BPM coarse delay settings to the BOC.
00615  */
00616 
00617 void BocCard::setBpmCoarseDelay(const UINT32 channel, const UINT32 buffer[],
00618         const UINT32 numChannels) {
00619 //
00620 // Use bpmWrite to access the registers. Streams 0-11 on the BPM are used
00621 // for "real" channels.
00622 //
00623   for(unsigned int i=0;i<numChannels;i++) {
00624     bpmWrite((channel+i)/12,(channel+i)%12,BOC_BPM_COARSE,buffer[i]);
00625   }
00626 
00627 }
00628 
00629 void BocCard::setBpmCoarseDelay(const UINT32 channel, const UINT32 value) {
00630 //
00631 // Use bpmWrite to access the registers. Streams 0-11 on the BPM are used
00632 // for "real" channels.
00633 //
00634   bpmWrite(channel/12,channel%12,BOC_BPM_COARSE,value);
00635 
00636 }
00637 
00638 //------------------------getBpmFineDelay--------------------------
00639 
00640 /*! Read one or more BPM fine delay settings from the BOC.
00641  */
00642 
00643 void BocCard::getBpmFineDelay(const UINT32 channel, UINT32 buffer[],
00644         const UINT32 numChannels) {
00645 //
00646 // Use bpmRead to access the registers. Streams 0-11 on the BPM are used
00647 // for "real" channels.
00648 //
00649   for(unsigned int i=0;i<numChannels;i++) {
00650     buffer[i] = bpmRead((channel+i)/12,(channel+i)%12,BOC_BPM_FINE);
00651   }
00652 
00653 }
00654 
00655 UINT32 BocCard::getBpmFineDelay(const UINT32 channel) {
00656 //
00657 // Use bpmRead to access the registers. Streams 0-11 on the BPM are used
00658 // for "real" channels.
00659 //
00660   return bpmRead(channel/12,channel%12,BOC_BPM_FINE);
00661 
00662 }
00663 
00664 //------------------------setBpmFineDelay--------------------------
00665 
00666 /*! Write one or more BPM fine delay settings to the BOC.
00667  */
00668 
00669 void BocCard::setBpmFineDelay(const UINT32 channel, const UINT32 buffer[],
00670         const UINT32 numChannels) {
00671 //
00672 // Use bpmWrite to access the registers. Streams 0-11 on the BPM are used
00673 // for "real" channels.
00674 //
00675   for(unsigned int i=0;i<numChannels;i++) {
00676     bpmWrite((channel+i)/12,(channel+i)%12,BOC_BPM_FINE,buffer[i]);
00677   }
00678 
00679 }
00680 
00681 void BocCard::setBpmFineDelay(const UINT32 channel, const UINT32 value) {
00682 //
00683 // Use bpmWrite to access the registers. Streams 0-11 on the BPM are used
00684 // for "real" channels.
00685 //
00686   bpmWrite(channel/12,channel%12,BOC_BPM_FINE,value);
00687 
00688 }
00689 
00690 // Methods to access individual registers. Whether it is the best solution
00691 // to have a series of trivial methods is open to debate...
00692 
00693 //------------------------getClockControl------------------------
00694 
00695 /*! Read the Clock Control register
00696  */
00697 
00698 UINT32 BocCard::getClockControl() {
00699 //
00700 
00701   return singleRead(BOC_CLK_CONTROL);
00702 
00703 }
00704 
00705 //------------------------setClockControl------------------------
00706 
00707 /*! Write to the Clock Control register
00708  */
00709 
00710 void BocCard::setClockControl(const UINT32 value) {
00711 //
00712 
00713   singleWrite(BOC_CLK_CONTROL,value);
00714 
00715 }
00716 
00717 //------------------------getRxDataMode--------------------------
00718 
00719 /*! Read the Rx Data Mode register
00720  */
00721 
00722 UINT32 BocCard::getRxDataMode() {
00723 //
00724 
00725   return singleRead(BOC_RX_DATA_MODE);
00726 
00727 }
00728 
00729 //------------------------setRxDataMode--------------------------
00730 
00731 /*! Write to the Rx Data Mode register
00732  */
00733 
00734 void BocCard::setRxDataMode(const UINT32 value) {
00735 //
00736 
00737   singleWrite(BOC_RX_DATA_MODE,value);
00738 
00739 }
00740 
00741 //------------------------getRxDacClear--------------------------
00742 
00743 /*! Read the Rx DAC Clear register
00744  */
00745 
00746 UINT32 BocCard::getRxDacClear() {
00747 //
00748 
00749   return singleRead(BOC_RXDAC_CLEAR);
00750 
00751 }
00752 
00753 //------------------------clearRxDac-----------------------------
00754 
00755 /*! Clear the Rx DAC. This involves writing 1 followed by 0 to
00756  *  the RXDAC register. A method to do a single write does not seem
00757  *  to be necessary, and so is not provided. 
00758  */
00759 
00760 void BocCard::clearRxDac() {
00761 //
00762 
00763   singleWrite(BOC_RXDAC_CLEAR,1);
00764   singleWrite(BOC_RXDAC_CLEAR,0);
00765 
00766 }
00767 
00768 //------------------------getTxDacClear--------------------------
00769 
00770 /*! Read the Tx DAC Clear register
00771  */
00772 
00773 UINT32 BocCard::getTxDacClear() {
00774 //
00775 
00776   return singleRead(BOC_TXDAC_CLEAR);
00777 
00778 }
00779 
00780 //------------------------clearTxDac-----------------------------
00781 
00782 /*! Clear the Tx DAC. This involves writing 1 followed by 0 to
00783  *  the TXDAC register. A method to do a single write does not seem
00784  *  to be necessary, and so is not provided.
00785  */
00786 
00787 void BocCard::clearTxDac() {
00788 //
00789 
00790   singleWrite(BOC_TXDAC_CLEAR,1);
00791   singleWrite(BOC_TXDAC_CLEAR,0);
00792 
00793 }
00794 
00795 //------------------------getVernierFinePhase--------------------
00796 
00797 /*! Read the Vernier Fine Phase register
00798  */
00799 
00800 UINT32 BocCard::getVernierFinePhase() {
00801 //
00802 
00803   return singleRead(BOC_VERNIER_FINE_PHASE);
00804 
00805 }
00806 
00807 //------------------------setVernierFinePhase--------------------
00808 
00809 /*! Write to the VernierFinePhase register
00810  */
00811 
00812 void BocCard::setVernierFinePhase(const UINT32 value) {
00813 //
00814 
00815   singleWrite(BOC_VERNIER_FINE_PHASE,value);
00816 
00817 }
00818 
00819 //------------------------getVernierClockPhase0-------------------
00820 
00821 /*! Read the Vernier Clock Phase register 0. There are two registers
00822  * (0 and 1) which act in series to give a clock range of 50nsec in
00823  * 1 nsec steps.  
00824  */
00825 
00826 UINT32 BocCard::getVernierClockPhase0() {
00827 //
00828 
00829   return singleRead(BOC_VERNIER_CLK0_PHASE);
00830 
00831 }
00832 
00833 //------------------------setVernierClockPhase0-------------------
00834 
00835 /*! Write to the Vernier Clock Phase register 0. There are two registers
00836  * (0 and 1) which act in series to give a clock range of 50nsec in
00837  * 1 nsec steps.
00838  */
00839 
00840 void BocCard::setVernierClockPhase0(const UINT32 value) {
00841 //
00842 
00843   singleWrite(BOC_VERNIER_CLK0_PHASE,value);
00844 
00845 }
00846 
00847 //------------------------getVernierClockPhase1-------------------
00848 
00849 /*! Read the Vernier Clock Phase register 1. There are two registers
00850  * (0 and 1) which act in series to give a clock range of 50nsec in
00851  * 1 nsec steps.
00852  */
00853 
00854 UINT32 BocCard::getVernierClockPhase1() {
00855 //
00856 
00857   return singleRead(BOC_VERNIER_CLK1_PHASE);
00858 
00859 }
00860 
00861 //------------------------setVernierClockPhase1-------------------
00862 
00863 /*! Write to the Vernier Clock Phase register 1. There are two registers
00864  * (0 and 1) which act in series to give a clock range of 50nsec in
00865  * 1 nsec steps.
00866  */
00867 
00868 void BocCard::setVernierClockPhase1(const UINT32 value) {
00869 //
00870 
00871   singleWrite(BOC_VERNIER_CLK1_PHASE,value);
00872 
00873 }
00874 
00875 //------------------------getBpmClockPhase-------------------
00876 
00877 /*! Read the BPM Clock Phase register.
00878  */
00879 
00880 UINT32 BocCard::getBpmClockPhase() {
00881 //
00882 
00883   return singleRead(BOC_BPM_CLK_PHASE);
00884 
00885 }
00886 
00887 //------------------------setBpmClockPhase-------------------
00888 
00889 /*! Write to the BPM Clock Phase register.
00890  */
00891 
00892 void BocCard::setBpmClockPhase(const UINT32 value) {
00893 //
00894 
00895   singleWrite(BOC_BPM_CLK_PHASE,value);
00896 
00897 }
00898 
00899 //------------------------getBregClockPhase-------------------
00900 
00901 /*! Read the Breg Clock Phase register.
00902  */
00903 
00904 UINT32 BocCard::getBregClockPhase() {
00905 //
00906 
00907   return singleRead(BOC_BREG_CLK_PHASE);
00908 
00909 }
00910 
00911 //------------------------setBregClockPhase-------------------
00912 
00913 /*! Write to the Breg Clock Phase register.
00914  */
00915 
00916 void BocCard::setBregClockPhase(const UINT32 value) {
00917 //
00918 
00919   singleWrite(BOC_BREG_CLK_PHASE,value);
00920 
00921 }
00922 
00923 //------------------------getBocReset-------------------------
00924 
00925 /*! Read the BOC Reset register.
00926  */
00927 
00928 UINT32 BocCard::getBocReset() {
00929 //
00930 
00931   return singleRead(BOC_RESET);
00932 
00933 }
00934 
00935 //------------------------resetBoc-----------------------------
00936 
00937 /*! Reset the BOC by writing 1 followed by 0 to the BOC Reset 
00938  * register. A method to write a specific value to this register
00939  * is not provided, as it doesn't seem to be necessary.
00940  */
00941 
00942 void BocCard::resetBoc() {
00943 //
00944 
00945   singleWrite(BOC_RESET,1);
00946   singleWrite(BOC_RESET,0);
00947 
00948 }
00949 
00950 //------------------------getBpmReset-------------------------
00951 
00952 /*! Read the BPM Reset register.
00953  */
00954 
00955 UINT32 BocCard::getBpmReset() {
00956 //
00957 
00958   return singleRead(BOC_BPM_RESET);
00959 
00960 }
00961 
00962 //------------------------resetBpm-----------------------------
00963 
00964 /*! Reset the BPMs by writing 1 followed by 0 to the BPM Reset
00965  * register. A method to write a specific value to this register
00966  * is not provided, as it doesn't seem to be necessary.
00967  */
00968 
00969 void BocCard::resetBpm() {
00970 //
00971 
00972   singleWrite(BOC_BPM_RESET,1);
00973   singleWrite(BOC_BPM_RESET,0);
00974 
00975 }
00976 
00977 //------------------------getBocStatusRegister----------------
00978 
00979 /*! Read the BOC Status Register (readonly).
00980  */
00981 
00982 UINT32 BocCard::getBocStatusRegister() {
00983 //
00984 
00985   return singleRead(BOC_STATUS);
00986 
00987 }
00988 
00989 
00990 //Private methods follow
00991 
00992 //Read/write access methods. Block read and write methods are provided,
00993 // though in fact they use the single read and write methods. I have made
00994 // these methods private, as the user shouldn't need to see them.
00995 //
00996 //------------------------singleRead-----------------------------
00997 
00998 /*! This method reads a single 32-bit word from a BOC address
00999  */
01000 
01001 UINT32 BocCard::singleRead(const UINT32 address) {
01002 //
01003   UINT32 bocAddress;
01004   UINT32 value;
01005 //
01006   bocAddress = address + BOC_ADDRESS_BASE;
01007   value = m_myrod->mdspSingleRead(bocAddress);
01008 //
01009 //Check if the BOC is busy and wait until it isn't.
01010 //
01011     while(m_myrod->mdspSingleRead(RRIF_STATUS_1)&BOC_BUSY_0) {}
01012 
01013 //
01014   return value;
01015 }
01016 
01017 //------------------------singleWrite-----------------------------
01018 
01019 /*! This method writes a single 32-bit word to a BOC address.
01020  */
01021 
01022 void BocCard::singleWrite(const UINT32 address, const UINT32 value) {
01023 //
01024   UINT32 bocAddress;
01025 //
01026   bocAddress = address + BOC_ADDRESS_BASE;
01027   m_myrod->mdspSingleWrite(bocAddress, value);
01028 //
01029 //Check if the BOC is busy and wait until it isn't.
01030 //
01031     while(m_myrod->mdspSingleRead(RRIF_STATUS_1)&BOC_BUSY_0) {}
01032 
01033 //
01034 
01035 }
01036 
01037 //------------------------blockRead-----------------------------
01038 
01039 /*! This method reads a block of 32-bit words from a BOC. Because
01040  *  the setup bus is slow, we have to wait after each read until
01041  *  the BOC_BUSY_0 bit is cleared. Hence we use the singleRead
01042  *  method in a loop. 
01043  */
01044 
01045 void BocCard::blockRead(const UINT32 address, UINT32 buffer[],
01046          const INT32 wordCount) {
01047 //
01048 //
01049   for(int i=0;i<wordCount;i++) {
01050     buffer[i] = singleRead(address+4*i);
01051   }
01052 //
01053 
01054 }
01055 
01056 //------------------------blockWrite-----------------------------
01057 
01058 /*! This method writes a block of 32-bit words to a BOC. Because
01059  *  the setup bus is slow, we have to wait after each read until
01060  *  the BOC_BUSY_0 bit is cleared. Hence we use the singleWrite
01061  *  method in a loop. 
01062  */
01063 
01064 void BocCard::blockWrite(const UINT32 address, const UINT32 buffer[],
01065          const INT32 wordCount) {
01066 //
01067 //
01068   for(int i=0;i<wordCount;i++) {
01069     singleWrite(address+4*i,buffer[i]);
01070   }
01071 //
01072 
01073 }
01074 
01075 //Read and write routines for BPM. These methods access a BPM via its
01076 //internal channel numbers, and shouldn't be needed by users. They are
01077 //useful mainly for access to the channels not used for "normal" BPM
01078 //operations (channels 12-15 have special uses and are not mapped to
01079 //by the Tx streams).
01080 
01081 //------------------------bpmRead---------------------------------
01082 
01083 /*! This method reads from a BPM location, identified by BPM #, stream #
01084  *  and offset.
01085  */
01086 
01087 UINT32 BocCard::bpmRead(const UINT32 bpm, const UINT32 stream, 
01088         const UINT32 offset) {
01089 //
01090   UINT32 address;
01091   UINT32 value;
01092 //
01093 // Get the address (relative to start of BOC window)
01094 //
01095   address = BOC_BPM_BASE + (bpm<<8) + (stream<<4) + offset;
01096 
01097   value = singleRead(address);
01098 
01099   return value;
01100 
01101 }
01102 
01103 //------------------------bpmWrite--------------------------------
01104 
01105 /*! This method writes to a BPM location, identified by BPM #, stream #
01106  *  and offset.
01107  */
01108 
01109 void BocCard::bpmWrite(const UINT32 bpm, const UINT32 stream,
01110         const UINT32 offset, const UINT32 value) {
01111 //
01112   UINT32 address;
01113 //
01114 // Get the address (relative to start of BOC window)
01115 //
01116   address = BOC_BPM_BASE + (bpm<<8) + (stream<<4) + offset;
01117 
01118   singleWrite(address, value);
01119 
01120 }
01121 
01122 } // End namespace SctPixelRod

Generated on Mon Mar 3 11:16:16 2003 for SCTPixelDAQ by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001