From: Ron F. <ro...@us...> - 2004-06-18 12:12:08
|
Update of /cvsroot/nscldaq/clients/DeviceSupport In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12892/DeviceSupport Modified Files: CVMEptr.h Makefile.am VmeModule.cpp sis3300.cpp sis3300.h Added Files: CCAENV1x90.cpp CCAENV1x90.h CCAENV1x90Data.h CCAENV1x90Opcodes.h CCAENV1x90Registers.h Log Message: Merge 7.4 development into 8.0 main line. --- NEW FILE: CCAENV1x90Registers.h --- #ifndef __CCAENV1X90REGISTERS_H #define __CCAENV1X90REGISTERS_H /*! This file contains register definitions for the CAEN V1190, V1290 TDC modules. We will assume that the module will be acessed via VmePtrs: - The module address space is divided into 4 segments: - The Output buffer. - The Control registers. - The Configuration ROM - The compensation SRAM. - We will define the offsets of each of these segments relative to the module base address as byte offsets. - We will Define offsets within each region as byte offsets from the segment base (e.g. the InterruptVector register offset will be 0xc not 0x100c. */ namespace CCAENV1x90Registers { // Can't use typedefs for these since you can't mix typedef with // static, const etc. #define Offset static const int #define Size static const unsigned int #define RegisterBit unsigned short #define LongValue static unsigned int // Segment offsets from the module base address: Offset OutputBuffer (0); //!< Output buffer [where data goes]. Size OutputBufferSize(0x1000); //!< Size of the output buffer space. Offset Registers (0x1000); //!< All the control registers. Size RegisterSize (0x1300); //!< Upper limit on register size. Offset ConfigRom (0x4000); //!< The configuration prom. Size ConfigRomSize (0x0200); //!< Configuration prom size. Offset CompensationSram(0x8000); //!< The compensation sram. Size CompensationSramSize(0x0200); //!< Size of compensation sram. // Offsets within to register page. These are prefixed // W for word sized registers and L for longword sized registers. Offset WControlRegister (0x1000); Offset WStatusRegister (0x1002); Offset WInterruptLevel (0x100a); Offset WInterruptVector (0x100c); Offset WVirtualSlot (0x100e); Offset WMulticastBase (0x1010); Offset WMulticastControl (0x1012); Offset WReset (0x1014); Offset WClear (0x1016); Offset WEventReset (0x1018); Offset WSWTrigger (0x101a); Offset LEventCounter (0x101c); Offset WEventStored (0x1020); Offset WAlmostFullLevel (0x1022); Offset WBLTEventNumber (0x1024); Offset WFirmwareRevision (0x1026); Offset LTestRegister (0x1028); Offset WOutputControl (0x102c); Offset WMicroData (0x102e); Offset WMicroHandshake (0x1030); Offset WSelectFlash (0x1032); Offset WFlashMemory (0x1034); Offset WSramPage (0x1036); Offset LEventFIFO (0x1038); Offset WEventFIFOStored (0x103c); Offset WEventFIFOStatus (0x103e); Offset LDummy32 (0x1200); Offset WDummy16 (0x1204); // Offsets within the configuration prom. Note that while these locations // all accept D16 accesses, usually, only the bottom byte has useful // information. The top byte will usually be indeterminate. Offset WChecksum (0x00); Offset WChecksum_Length2 (0x04); Offset WChecksum_Length1 (0x08); Offset WChecksum_Length0 (0x0c); Offset WConstant2 (0x10); Offset WConstant1 (0x14); Offset WConstant0 (0x18); Offset WC_Code (0x1c); Offset WR_Code (0x20); Offset WOUI2 (0x24); Offset WOUI1 (0x28); Offset WOUI0 (0x2c); Offset WBoardVersion (0x30); // e.g. a,b,n Offset WModelNumber2 (0x34); Offset WModelNumber1 (0x38); Offset WModelNumber0 (0x3c); Offset WRevision3 (0x40); Offset WRevision2 (0x44); Offset WRevision1 (0x48); Offset WRevision0 (0x4c); Offset WSerialNumber1 (0x80); Offset WSerialNumber0 (0x84); // Note that the data buffer bits are defined in CCAENV1x90Data.h // The remainder of this file defines bits for each register for which // it makes sense. The bits themselves are defined in namespaces // that are named after the registers without the size prefix. // Each bit is named exactly as the bit is named in the hardware // manual. namespace ControlRegister { //!< Control register definitions: Masks. RegisterBit BERREN ( 0x1); RegisterBit NBERREN (0); RegisterBit TERM ( 0x2); RegisterBit NTERM (1); RegisterBit TERM_SW ( 0x4); RegisterBit NTERM_SW (2); RegisterBit EMPTY_EVENT ( 0x08); RegisterBit NEMPTY_EVENT (3); RegisterBit ALIGN64 ( 0x010); RegisterBit NALIGN64 (4); RegisterBit COMPENSATION_ENABLE ( 0x20); RegisterBit NCOMPENSATION_ENABLE (5); RegisterBit TEST_FIFO_ENABLE ( 0x40); RegisterBit NTEST_FIFO_ENABLE (6); RegisterBit READ_SRAM_ENABLE ( 0x80); RegisterBit NREAD_SRAM_ENABLE (7); RegisterBit EVENT_FIFO_ENABLE (0x100); RegisterBit NEVENT_FIFO_ENABLE (8); RegisterBit TRIGGER_TAG_ENABLE (0x200); RegisterBit NTRIGGER_TAG_ENABLE (9); } // The N.... are the bit numbers for the corresponding // .... bit mask. namespace StatusRegister { // This is a read only register. RegisterBit DATA_READY (0x0001); RegisterBit NDATA_READY (0); RegisterBit ALM_FULL (0x0002); RegisterBit NALM_FULL (1); RegisterBit FULL (0x0004); RegisterBit NFULL (2); RegisterBit TRG_MATCH (0x0008); RegisterBit NTRG_MATCH (3); RegisterBit HEADER_EN (0x0010); RegisterBit NHEADER_EN (4); RegisterBit TERM_ON (0x0020); RegisterBit NTERM_ON (5); RegisterBit CHIP0_ERROR (0x0040); RegisterBit NCHIP0_ERROR (6); RegisterBit CHIP1_ERROR (0x0080); RegisterBit NCHIP1_ERROR (7); RegisterBit CHIP2_ERROR (0x0100); RegisterBit NCHIP2_ERROR (8); RegisterBit CHIP3_ERROR (0x0200); RegisterBit NCHIP3_ERROR (9); RegisterBit BERR_FLAG (0x0400); RegisterBit NBERR_FLAG (10); RegisterBit PURGE (0x0800); RegisterBit NPURGE (11); RegisterBit RESOLUTIONMASK (0x3000); // \ The resolution mask can RegisterBit RES_800ps (0x0000); // \ be anded with the RegisterBit RES_200ps (0x1000); // / status reg. & compared RegisterBit RES_100ps (0x2000); // / with any of the RES_ RegisterBit RES_25ps (0x3000); // / RegisterBit PAIR (0x4000); // Hit detection is pair mode RegisterBit NPAIR (14); RegisterBit TRIGGERLOST (0x8000); // Triggers were lost. RegisterBit NTRIGGERLOST (15); } // Values in the multicast control register. namespace MulticastControl { RegisterBit MASK (0x0003); // Bits in the register of use. RegisterBit ACTIVE_FIRST (0x0002); // Module is first in chain. RegisterBit ACTIVE_LAST (0x0001); // Module is last in chain. RegisterBit ACTIVE_INTERMEDIATE (0x0003); // Module in the middle of chain. } // The output control register determines which signal is reflected on // the OUT_PROG ECL output of the module. namespace OutputControl { RegisterBit MASK (0x0007); // mask of the bits. RegisterBit DATA_READY (0x0000); // OUT_PROG reflects data ready RegisterBit FULL (0x0001); // OUT_PROG reflects full cond. RegisterBit ALM_FULL (0x0002); // OUT_PROG reflects almost full. RegisterBit ERROR (0x0003); // OUT_PROG reflects TDC error. } // Micro handshake controls interactions with the micro sequencer. namespace MicroHandshake { RegisterBit WRITE_OK (0x000001); // 1 if ok to write sequencer. RegisterBit READ_OK (0x000002); // Nonzero if ok to read. } // The event fifo contains the event count and word count for each // event. namespace EventFIFO { LongValue FIFOCOUNT_MASK (0x7ff); // Mask of bits in FIFO count reg. LongValue WORDCOUNT_MASK (0x0000ffff); // Mask off word count. LongValue WORDCOUNT_RSHIFT (0); // right shift count. LongValue EVENTCOUNT_MASK (0xffff0000); // Event counter mask. LongValue EVENTCOUNT_RSHIFT(16); // Right shift positioning count. } // FIFO status gives the fullness of the FIFO: namespace FIFOStatus { RegisterBit EVFIFODATA_READY(1); // The fifo has data. RegisterBit EVFIFO_FULL(2); // FIFO is full. } // In the configuration rom, the version contains the sub type of the module: namespace ModuleVersion { RegisterBit A(0); // 1x90A RegisterBit B(1); // 1190B RegisterBit N(2); // 1290N } } #endif Index: sis3300.h =================================================================== RCS file: /cvsroot/nscldaq/clients/DeviceSupport/sis3300.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** sis3300.h 1 Dec 2003 17:53:42 -0000 1.1 --- sis3300.h 18 Jun 2004 12:10:57 -0000 1.2 *************** *** 1,190 **** ! #ifndef __SIS3300_H ! #define __SIS3300_H ! ! #ifndef __SPECTRODAQ_H ! #include <spectrodaq.h> ! #define __SPECTRODAQ_H ! #endif ! ! ! #ifndef __STL_STRING ! #include <string> ! #define __STL_STRING ! #endif ! ! /*! ! Preliminary class to setup and read the SIS3300 flash adc. ! Supported functions are to: ! ! Initialize the module to work in external trigger: ! Start or stop mode, single event mode ! with specified Clock source and sample size, and pre/post trigger delays. ! ! This class does not support ADC thresholds, or ! multievent mode but they can be added later. ! ! */ ! class CSIS3300 { ! public: ! typedef enum _ClockSource { ! Internal100Mhz = 0, ! Internal50Mhz = 1, ! Internal25Mhz = 2, ! Internal12_5Mhz= 3, ! Internal6_25Mhz= 4, ! Internal3_125Mhz=5, ! ExternalFp =6, ! ExternalP2 =7 ! } ClockSource; //!< the enum values match the bit field values ! typedef enum _SampleSize { ! Sample128K = 0, ! Sample16K = 1, ! Sample4K = 2, ! Sample2K = 3, ! Sample1K = 4, ! Sample512 = 5, ! Sample256 = 6, ! Sample128 = 7 ! } SampleSize; ! ! private: ! unsigned long m_nBase; //!< Module abs. VME base ! // Register pointers: ! volatile unsigned long* m_pCsrs; //!< CSR bank 0 - 0x3000. ! volatile unsigned long* m_pEi1; //!< Event information for bank1. ! volatile unsigned long* m_pEi2; //!< Event info for bank 2. ! volatile unsigned long* m_pEi3; //!< Event info for bank 3. ! volatile unsigned long* m_pEi4; //!< Event info for bank 4. ! ! volatile unsigned long* m_pModuleId; //!< Module ID register. ! volatile unsigned long* m_pCsr; //!< Control status register. ! volatile unsigned long* m_pAcqReg; //!< Acquisition control register. ! volatile unsigned long* m_pResetKey; //!< Module reset key register. ! volatile unsigned long* m_pStart; //!< Start Key register. ! volatile unsigned long* m_pEventConfig; //!< Global Event config register. ! volatile unsigned long* m_pStartDelay; //!< Start delay register. ! volatile unsigned long* m_pStopDelay; //!< Stop delay register. ! volatile unsigned long* m_pAddressReg; //!< Address register (detect eov) ! volatile unsigned long* m_pEventDirectory; //!< Ptr to the event directory. ! volatile unsigned long* m_pBank1Buffers[4]; //!< Bank data memory. ! volatile unsigned long* m_pThresholds[4]; //!< threshold registers. ! ! // State which determines how the module is set up: ! ! void* m_nFd; //!< Fd open on the vme device driver. ! ClockSource m_eClock; //!< Source of sampling clock. ! bool m_fStartDelayEnabled; //!< true if start delay register is used. ! unsigned int m_nStartDelayClocks; //!< clocks to load into start delay reg. ! bool m_fStopDelayEnabled; //!< true if stop delay register is used. ! unsigned int m_nStopDelayClocks;//!< clocks to load into stop delay register. ! bool m_fGateMode; //! true if module in gate mode. ! bool m_fStopTrigger; //! True if stop is trigger. ! SampleSize m_ePagesize; //!< Size of acquisition page (enum). ! unsigned int m_nPagesize; //!< Size of acquisition page in samples ! bool m_fPageWrap; //!< True if allowing data to wrap the pages ! bool m_fThresholdLt[8]; //!< True if chann threshold is a < threshold ! unsigned int m_nThresholds[8]; //!< ADC channel threshold values. ! public: ! // Constructors and other canonical member functions: ! ! CSIS3300(unsigned long nBaseAddress, ! int nCrate = 0); ! private: ! CSIS3300(const CSIS3300& rhs); ! CSIS3300& operator=(const CSIS3300& rhs); ! int operator==(const CSIS3300& rhs); ! public: ! ~CSIS3300(); ! ! // Selectors: ! public: ! volatile unsigned long* getModuleBase() { ! return m_pCsrs; ! } ! string getModuleId() const; ! volatile unsigned long* getCsr() { ! return m_pCsr; ! } ! volatile unsigned long* getAcquisitionRegister() { ! return m_pAcqReg; ! } ! volatile unsigned long* getResetKeyRegister() { ! return m_pResetKey; ! } ! volatile unsigned long* getStartKeyRegister() { ! return m_pStart; ! } ! volatile unsigned long* getEventConfigRegister() { ! return m_pEventConfig; ! } ! volatile unsigned long* getStartDelayRegister() { ! return m_pStartDelay; ! } ! volatile unsigned long* getStopDelayRegister() { ! return m_pStopDelay; ! } ! volatile unsigned long* getEventDirectory() { ! return m_pEventDirectory; ! } ! volatile unsigned long* getGroup1Pointer() { ! return m_pBank1Buffers[0]; ! } ! volatile unsigned long* getGroup2Pointer() { ! return m_pBank1Buffers[1]; ! } ! volatile unsigned long* getGroup3Pointer() { ! return m_pBank1Buffers[2]; ! } ! volatile unsigned long* getGroup4Pointer() { ! return m_pBank1Buffers[3]; ! } ! ! // Configuration functions: ! ! void SetClock(ClockSource eSource); ! void SetStartDelay(bool Enable = false, unsigned int nClocks = 0); ! void SetStopDelay(bool Enable = false, unsigned int nClocks = 0); ! void GateMode(bool Enable = false); ! void TriggerOnStop(bool Enable=true); ! void SetSampleSize(SampleSize eSamples); ! void EnableWrap(bool Enable=true); ! ! void SetThresholds(bool* pLessThan, ! unsigned int* pValues); ! ! // Configuration inquiry functions. ! ! enum CSIS3300::ClockSource getCurrentClockSource(); ! bool isStartDelayEnabled(); ! unsigned int getStartDelayClocks(); ! bool isStopDelayEnabled(); ! unsigned int getStopDelayClocks(); ! unsigned int getThresholdValue(unsigned int channel) const { ! return m_nThresholds[channel]; ! } ! bool isLtThreshold(unsigned int channel) const { ! return m_fThresholdLt[channel]; ! } ! ! ! // Data taking functions. ! public: ! void InitDaq(); ! void StartSampling(); ! bool WaitUntilDone(int timeout); ! unsigned int ReadGroup1(DAQWordBufferPtr& pBuffer); ! unsigned int ReadGroup2(DAQWordBufferPtr& pBuffer); ! unsigned int ReadGroup3(DAQWordBufferPtr& pBuffer); ! unsigned int ReadGroup4(DAQWordBufferPtr& pBuffer); ! unsigned int ReadAllGroups(DAQWordBufferPtr& pBuffer); ! void ClearDaq(); ! protected: ! unsigned int ReadAGroup(DAQWordBufferPtr& pBuffer, ! volatile unsigned long* pAddressReg, ! unsigned long pBase); ! ! }; ! ! ! ! #endif --- 1,308 ---- ! #ifndef __SIS3300_H ! #define __SIS3300_H ! ! #ifndef __SPECTRODAQ_H ! #include <spectrodaq.h> ! #define __SPECTRODAQ_H ! #endif ! ! ! #ifndef __STL_STRING ! #include <string> ! #define __STL_STRING ! #endif ! ! /*! ! Preliminary class to setup and read the SIS3300 flash adc. ! Supported functions are to: ! ! Initialize the module to work in external trigger: ! Start or stop mode, single event mode ! with specified Clock source and sample size, and pre/post trigger delays. ! ! This class does not support ADC thresholds, or ! multievent mode but they can be added later. ! ! Author: R. Fox ! Modified by: M.A. Famiano for use with HiRA ! Modification History: ! - February 2, 2004: Accurately implemented random clock Mode so ! that internal clock is enabled while not sampling.RF. ! - February 2, 2004: Implemented addressing for independent ADCs. ! - January 31, 2004: Added Arming and disarming function for both memory banks.MAF. ! - January 31, 2004: Implementation for Random Clock Mode.MAF. ! - January 31, 2004: Implementation for HiRA Random Clock Mode.MAF. ! - November 2003: Added Stop Sampling functions and LED Controls for test purposes. ! MAF. ! */ ! class CSIS3300 { ! public: ! typedef enum _ClockSource { ! Internal100Mhz = 0, ! Internal50Mhz = 1, ! Internal25Mhz = 2, ! Internal12_5Mhz= 3, ! Internal6_25Mhz= 4, ! Internal3_125Mhz=5, ! ExternalFp =6, ! ExternalP2 =7 ! } ClockSource; //!< the enum values match the bit field values ! typedef enum _SampleSize { ! Sample128K = 0, ! Sample16K = 1, ! Sample4K = 2, ! Sample2K = 3, ! Sample1K = 4, ! Sample512 = 5, ! Sample256 = 6, ! Sample128 = 7, ! } SampleSize; ! ! private: ! unsigned long m_nBase; //!< Module abs. VME base ! // Register pointers: ! volatile unsigned long* m_pCsrs; //!< CSR bank 0 - 0x3000. ! volatile unsigned long* m_pEi1; //!< Event information for bank1. ! volatile unsigned long* m_pEi2; //!< Event info for bank 2. ! volatile unsigned long* m_pEi3; //!< Event info for bank 3. ! volatile unsigned long* m_pEi4; //!< Event info for bank 4. ! ! volatile unsigned long* m_pModuleId; //!< Module ID register. ! volatile unsigned long* m_pCsr; //!< Control status register. ! volatile unsigned long* m_pAcqReg; //!< Acquisition control register. ! volatile unsigned long* m_pResetKey; //!< Module reset key register. ! volatile unsigned long* m_pStart; //!< Start Key register. ! volatile unsigned long* m_pStop; //!< Stop Key register. ! volatile unsigned long* m_pEventConfig; //!< Global Event config register. ! volatile unsigned long* m_pStartDelay; //!< Start delay register. ! volatile unsigned long* m_pStopDelay; //!< Stop delay register. ! volatile unsigned long* m_pAddressReg1; //!< Address register 1 (detect eov) ! volatile unsigned long* m_pAddressReg2; //!< Address register 2 (detect eov) ! volatile unsigned long* m_pAddressReg3; //!< Address register 3 (detect eov) ! volatile unsigned long* m_pAddressReg4; //!< Address register 4 (detect eov) ! volatile unsigned long* m_pEventDirectory1; //!< Ptr to the event directory. ! volatile unsigned long* m_pEventDirectory2; //!< Ptr to the event directory. ! volatile unsigned long* m_pEventDirectory3; //!< Ptr to the event directory. ! volatile unsigned long* m_pEventDirectory4; //!< Ptr to the event directory. ! volatile unsigned long* m_pBank1Buffers[4]; //!< Bank data memory. ! volatile unsigned long* m_pThresholds[4]; //!< threshold registers. ! ! // State which determines how the module is set up: ! ! void* m_nFd; //!< Fd open on the vme device driver. ! ClockSource m_eClock; //!< Source of sampling clock. ! bool m_fStartDelayEnabled; //!< true if start delay register is used. ! unsigned int m_nStartDelayClocks; //!< clocks to load into start delay reg. ! bool m_fStopDelayEnabled; //!< true if stop delay register is used. ! unsigned int m_nStopDelayClocks;//!< clocks to load into stop delay register. ! bool m_fGateMode; //! true if module in gate mode. ! bool m_fRandomClock; //! True if module is in Random Clock Mode. ! bool m_fHiRA_RCM; //! True if in HiRA Random Clock Mode. ! bool m_fStopTrigger; //! True if stop is trigger. ! SampleSize m_ePagesize; //!< Size of acquisition page (enum). ! unsigned int m_nPagesize; //!< Size of acquisition page in samples ! bool m_fPageWrap; //!< True if allowing data to wrap the pages ! bool m_fThresholdLt[8]; //!< True if chann threshold is a < threshold ! unsigned int m_nThresholds[8]; //!< ADC channel threshold values. ! public: ! // Constructors and other canonical member functions: ! ! CSIS3300(unsigned long nBaseAddress, ! unsigned int nCrate = 0); ! private: ! CSIS3300(const CSIS3300& rhs); ! CSIS3300& operator=(const CSIS3300& rhs); ! int operator==(const CSIS3300& rhs); ! public: ! ~CSIS3300(); ! ! // Selectors: ! public: ! unsigned long getBaseAddress() const { ! return m_nBase; ! } ! unsigned long getPageSize() const { ! return m_nPagesize; ! } ! ! volatile unsigned long* getAddressRegister1() { ! return m_pAddressReg1; ! } ! volatile unsigned long* getAddressRegister2() { ! return m_pAddressReg2; ! } ! volatile unsigned long* getAddressRegister3() { ! return m_pAddressReg3; ! } ! volatile unsigned long* getAddressRegister4() { ! return m_pAddressReg4; ! } ! /*! This function is deprecated in favor ! of getStatusRegiseter() and setControlRegister() ! It exists only for ! compatibility with old code where the ! entire module was mapped: ! */ ! volatile unsigned long* getModuleBase() { ! return m_pCsrs; ! } ! /*! This function is deprecated in favor ! of getStatusRegiseter() and setControlRegister() ! It exists only for ! compatibility with old code where the ! entire module was mapped: ! */ ! volatile unsigned long* getCsr() { ! return m_pCsr; ! } ! //! Get value of status register. ! unsigned long getStatusRegister() const { ! return *m_pCsrs; ! } ! //! Set the control register. ! void setControlRegister(unsigned long value) { ! *m_pCsrs = value; ! } ! /*! ! This function is deprecated in favor of: ! - getModelNumber() - retrieve the model number ! - getFirmwareMajor() - get major rev level. ! - getFirmwareMinor() - get minor rev level. ! */ ! volatile const unsigned long* getModuleId() const{ ! return m_pModuleId; ! } ! //! Get the model number: ! unsigned int getModelNumber() const { ! return (*m_pModuleId >> 16) & 0xffff; ! } ! //! Get the firmware major revlevel: ! unsigned int getFirmwareMajor() const { ! return (*m_pModuleId >> 8) & 0xff; ! } ! //! Get the firmware minor rev level: ! unsigned int getFirmwareMinor() const { ! return (*m_pModuleId) & 0xff; ! } ! ! //! Read ac cess to the Acquisition register. ! volatile const unsigned long* getAcquisitionRegister() const { ! return m_pAcqReg; ! } ! /*! This function is deprecated in favor of the ! Reset function ! */ ! volatile unsigned long* getResetKeyRegister() { ! return m_pResetKey; ! } ! volatile unsigned long* getStartKeyRegister() { ! return m_pStart; ! } ! volatile unsigned long* getEventConfigRegister() { ! return m_pEventConfig; ! } ! volatile unsigned long* getStartDelayRegister() { ! return m_pStartDelay; ! } ! volatile unsigned long* getStopDelayRegister() { ! return m_pStopDelay; ! } ! volatile unsigned long* getEventDirectory1() { ! return m_pEventDirectory1; ! } ! ! volatile unsigned long* getEventDirectory2() { ! return m_pEventDirectory2; ! } ! volatile unsigned long* getEventDirectory3() { ! return m_pEventDirectory3; ! } ! volatile unsigned long* getEventDirectory4() { ! return m_pEventDirectory4; ! } ! void* getFd() { ! return m_nFd; ! } ! // These functions really only make sense inside the class body. ! // they return VME addresses not process virtual addresses. ! private: ! volatile unsigned long getGroup1Address() { ! return getBaseAddress() + 0x400000; ! } ! volatile unsigned long getGroup2Address() { ! return getBaseAddress() + 0x480000; ! } ! volatile unsigned long getGroup3Address() { ! return getBaseAddress() + 0x500000; ! } ! volatile unsigned long getGroup4Address() { ! return getBaseAddress()+0x580000; ! } ! public: ! ! // Configuration functions: ! ! void Reset(); //!< Reset the module. ! void SetClock(ClockSource eSource); ! void SetStartDelay(bool Enable = false, unsigned int nClocks = 0); ! void SetStopDelay(bool Enable = false, unsigned int nClocks = 0); ! void GateMode(bool Enable = false); ! void RandomClock(bool Enable = false); ! void HiRA_RCM(bool Enable = false); ! void TriggerOnStop(bool Enable=true); ! void SetSampleSize(SampleSize eSamples); ! void EnableWrap(bool Enable=true); ! unsigned int GetUserInput(); ! ! void SetThresholds(bool* pLessThan, ! unsigned int* pValues); ! ! // Configuration inquiry functions. ! ! enum CSIS3300::ClockSource getCurrentClockSource(); ! bool isStartDelayEnabled(); ! unsigned int getStartDelayClocks(); ! bool isStopDelayEnabled(); ! unsigned int getStopDelayClocks(); ! unsigned int getThresholdValue(unsigned int channel) const { ! return m_nThresholds[channel]; ! } ! bool isLtThreshold(unsigned int channel) const { ! return m_fThresholdLt[channel]; ! } ! bool haveHiRAFirmware() const; ! ! ! // Data taking functions. ! public: ! void LightOn(); ! void LightOff(); ! void InitDaq(); ! void Arm1(); ! void Arm2(); ! void DisArm1(); ! void DisArm2(); ! void StartSampling(); ! void StopSampling(); ! void EnableUserOut(); ! void DisableUserOut(); ! void StrobeUserOut(int time); ! bool WaitUntilDone(int timeout); ! unsigned long EventNumber(int bank); ! unsigned int ReadGroup1(DAQWordBufferPtr& pBuffer); ! unsigned int ReadGroup2(DAQWordBufferPtr& pBuffer); ! unsigned int ReadGroup3(DAQWordBufferPtr& pBuffer); ! unsigned int ReadGroup4(DAQWordBufferPtr& pBuffer); ! unsigned int ReadAllGroups(DAQWordBufferPtr& pBuffer); ! ! void ClearDaq(); ! protected: ! unsigned int ReadAGroup(DAQWordBufferPtr& pBuffer, ! volatile unsigned long* pAddressReg1, ! unsigned long pBase); ! ! }; ! ! ! ! #endif Index: Makefile.am =================================================================== RCS file: /cvsroot/nscldaq/clients/DeviceSupport/Makefile.am,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** Makefile.am 3 Feb 2004 21:36:04 -0000 1.8 --- Makefile.am 18 Jun 2004 12:10:57 -0000 1.9 *************** *** 9,13 **** CCamacNimout.cpp CCrateController.cpp CScaler.cpp CStatusModule.cpp \ CVMEScalerCAENV830.cpp CVMEScalerLRS1151.cpp \ ! CVMEStatusModule.cpp CVMETrigger.cpp include_HEADERS = VmeModule.h CVME.h CVMEptr.h MmapError.h CSIS3820.h \ --- 9,13 ---- CCamacNimout.cpp CCrateController.cpp CScaler.cpp CStatusModule.cpp \ CVMEScalerCAENV830.cpp CVMEScalerLRS1151.cpp \ ! CVMEStatusModule.cpp CVMETrigger.cpp CCAENV1x90.cpp include_HEADERS = VmeModule.h CVME.h CVMEptr.h MmapError.h CSIS3820.h \ *************** *** 21,28 **** CCamacNimout.h CCrateController.h CScaler.h CStatusModule.h \ CTrigger.h CVMEScalerCAENV830.h CVMEScalerLRS1151.h \ ! CVMEStatusModule.h CVMETrigger.h CBD8210.h ! libDeviceSupport_la_LDFLAGS = -version-info $(SOVERSION):0 -L@top_srcdir@/VMEApi \ ! -lVmeAPI $(SPECTRODAQ_LDFLAGS) -g INCLUDES = $(VMEBUILDHEADERS) \ --- 21,30 ---- CCamacNimout.h CCrateController.h CScaler.h CStatusModule.h \ CTrigger.h CVMEScalerCAENV830.h CVMEScalerLRS1151.h \ ! CVMEStatusModule.h CVMETrigger.h CBD8210.h \ ! CCAENV1x90.h CCAENV1x90Data.h CCAENV1x90Opcodes.h CCAENV1x90Registers.h ! libDeviceSupport_la_LDFLAGS = -version-info $(SOVERSION):0 \ ! -L@top_srcdir@/VMEApi \ ! -lVmeAPI $(SPECTRODAQ_LDFLAGS) -g -Wl,"-rpath-link=$(libdir)" INCLUDES = $(VMEBUILDHEADERS) \ --- NEW FILE: CCAENV1x90Opcodes.h --- #ifndef __CCAENV1X90OPCODES_H #define __CCAENV1X90OPCODES_H /*! This file defines the microsequencer opcodes understood by the CAEN V1x90 family of TDC boards. The Opcode names are taken right from the manual so I cannot be held responsible for their cryptic naming coventions */ namespace CCAENV1x90Opcodes { // Can't use static or const in typedef. #define Opcode static const unsigned short // Acquisition mode: Opcode TRG_MATCH (0x0000); Opcode CONT_STOR (0x0100); Opcode READ_ACQ_MOD (0x0200); Opcode SET_KEEP_TOKEN (0x0300); Opcode CLEAR_KEEP_TOKEN (0x0400); Opcode LOAD_DEF_CONFIG (0x0500); Opcode SAVE_USER_CONFIG (0x0600); Opcode LOAD_USER_CONFIG (0x0700); Opcode AUTOLOAD_USER_CONFIG (0x0800); Opcode AUTOLOAD_DEF_CONFIG (0x0900); // Trigger setup: Opcode SET_WIN_WIDTH (0x1000); Opcode SET_WIN_OFFS (0x1100); Opcode SET_SW_MARGIN (0x1200); Opcode SET_REJ_MARGIN (0x1300); Opcode EN_SUB_TRG (0x1400); Opcode DIS_SUB_TRG (0x1500); Opcode READ_TRG_CONF (0x1600); // TDC Edge detection & resolution. Opcode SET_DETECTION (0x2200); Opcode READ_DETECTION (0x2300); Opcode SET_TR_LEAD_LSB (0x2400); Opcode SET_PAIR_RES (0x2500); Opcode READ_RES (0x2600); Opcode SET_DEAD_TIME (0x2800); Opcode READ_DEAD_TIME (0x2900); // TDC Readout-data structure: Opcode EN_HEADER_TRAILER (0x3000); Opcode DIS_HEADER_TRAILER (0x3100); Opcode READ_HEADER_TRAILER (0x3200); Opcode SET_EVENT_SIZE (0x3300); Opcode READ_EVENT_SIZE (0x3400); Opcode EN_ERROR_MARK (0x3500); Opcode DIS_ERROR_MARK (0x3600); Opcode EN_ERROR_BYPASS (0x3700); Opcode DIS_ERROR_BYPASS (0x3800); Opcode SET_ERROR_TYPES (0x3900); Opcode READ_ERROR_TYPES (0x3a00); Opcode SET_FIFO_SIZE (0x3b00); Opcode READ_FIFO_SIZE (0x3c00); // Channel enable/disable control: Opcode EN_CHANNEL (0x4000); Opcode DIS_CHANNEL (0x4100); Opcode EN_ALL_CH (0x4200); Opcode DIS_ALL_CH (0x4300); Opcode WRITE_EN_PATTERN (0x4400); Opcode READ_EN_PATTERN (0x4500); Opcode WRITE_EN_PATTERN32 (0x4600); Opcode READ_EN_PATTERN32 (0x4700); // Adjustment opcodes. Opcode SET_GLOB_OFFS (0x5000); Opcode READ_GLOB_OFFS (0x5100); Opcode SET_ADJUST_CH (0x5200); Opcode READ_ADJUST_CH (0x5300); Opcode SET_RC_ADJ (0x5400); Opcode READ_RC_ADJ (0x5500); Opcode SAVE_RC_ADJ (0x5600); // Miscellaneous Opcode READ_TDC_ID (0x6000); Opcode READ_MICRO_REV (0x6100); Opcode RESET_DLL_PLL (0x6200); // Advanced. Opcode WRITE_SETUP_REG (0x7000); Opcode READ_SETUP_REG (0x7100); Opcode UPDATE_SETUP_REG (0x7200); Opcode DEFAULT_SETUP_REG (0x7300); Opcode READ_ERROR_STATUS (0x7400); Opcode READ_DLL_LOCK (0x7500); Opcode READ_STATUS_STREAM (0x7600); // Debug and test (don't use these unless you know what you are // doing. Opcode WRITE_EEPROM (0xc000); Opcode READ_EEPROM (0xc100); Opcode REV_DATE_MICRO_FW (0xc200); Opcode WRITE_SPARE (0xc300); Opcode READ_SPARE (0xc400); Opcode ENABLE_TEST_MODE (0xc500); Opcode DISABLE_TEST_MODE (0xc600); Opcode SET_TDC_TEST_OUTPUT (0xc700); Opcode SET_DLL_CLOCK (0xc800); Opcode READ_SETUP_SCANPATH (0xc900); }; #endif --- NEW FILE: CCAENV1x90Data.h --- #ifndef __CCAENV1X90DATA_H #define __CCAENV1X90DATA_H /*! This file contains a namespace that has several static inline functions for peeling bits and pieces of the data buffer and making sense of what we get. */ #ifndef __STL_STRING #include <string> #endif namespace CCAENV1x90Data { // Definitions of bits that appear in all data words: static const unsigned long TYPE_MASK (0xf8000000); // Data type field static const unsigned long GLOBAL_HEADER(0x40000000); // GBL header type fld static const unsigned long TDC_HEADER (0x08000000); // TDC header static const unsigned long TDC_TRAILER (0x18000000); // TDC Trailer static const unsigned long MEASUREMENT (0x00000000); // TDC Measurement static const unsigned long TDC_ERROR (0x20000000); // TDC Error flag. static const unsigned long TRIGGER_TIME (0x88000000); // Trigger time tag. static const unsigned long GLOBAL_TRAILER(0x80000000);// Global trailer. static const unsigned long FILLER_LONG (0xc0000000); // Filler longs. // Definitions in the global header only: static const unsigned long EVENTCOUNT_MASK (0x07ffffe0); static const unsigned int EVENT_RSHIFT (0x5); static const unsigned int GEO_MASK (0x1f); // Definitions in the TDC header longword: static const unsigned long TDC_MASK (0x03000000); static const unsigned int TDC_RSHIFT (24); static const unsigned long EVENTID_MASK (0x007ff800); static const unsigned int EVENTID_RSHIFT (12); static const unsigned int BUNCHID_MASK (0x000007ff); static const unsigned int TDCWORDCOUNT_MASK (0x000007ff); // Definitions in the TDC measurement word: static const unsigned int TRAILING_BIT (0x04000000); static const unsigned long V1190CHANNEL_MASK(0x03f80000); static const unsigned long V1290CHANNEL_MASK(0x03e00000); static const unsigned int V1190CHANNEL_RSHIFT(19); static const unsigned int V1290CHANNEL_RSHIFT(20); static const unsigned long V1190DATA_MASK (0x0007ffff); static const unsigned long V1290DATA_MASK (0x001fffff); /*! Mask bits in the TDC Error word. There are no functions to check individual errors. Call TDCErrorbits to extract the bits and then and against the masks below. */ static const unsigned long HITLOST_0_FIFO (0x0001); // hits lost group 0 FIFO overflow static const unsigned long HITLOST_0_L1 (0x0002); // hits lost group 0 L1 overflow static const unsigned long HITERROR_0 (0x0004); // hit error in group 0.' static const unsigned long HITLOST_1_FIFO (0x0008); // hits lost group 1 FIFO overflow static const unsigned long HITLOST_1_L1 (0x0010); // hits lost group 1 L1 overflow static const unsigned long HITERROR_1 (0x0020); // hit error in group 1. static const unsigned long HITLOST_2_FIFO (0x0040); // hits lost group 2 FIFO overflow static const unsigned long HITLOST_2_L1 (0x0080); // hits lost group 2 L1 overflow static const unsigned long HITERROR_2 (0x0100); // hit error in group 2. static const unsigned long HITLOST_3_FIFO (0x0200); // hits lost group 3 FIFO overflow static const unsigned long HITLOST_3_L1 (0x0400); // hits lost group 3 L1 overflow static const unsigned long HITERROR_3 (0x0800); // hit error in group 3. static const unsigned long HITS_EXCEEDED (0x1000); // Hits lost, size limit exceeded. static const unsigned long EVENTLOST_FIFO (0x2000); // Event lost due to trigger fifo overflow. static const unsigned long FATALCHIP_ERROR(0x4000); // fatal chip error detected. static const unsigned long ERROR_MASK (0x7fff); // All bits. // Extended trigger time: static const unsigned long TRIGGERTIME_MASK (0x07ffffff); // Global trailer: static const unsigned long TRIGGERLOST_MASK (0x04000000); static const unsigned long TDCERROR_MASK (0x02000000); static const unsigned long OVERFLOW_MASK (0x01000000); static const unsigned long WORDCOUNT_MASK (0x001fffe0); static const unsigned int WORDCOUNT_RSHIFT (5); /*! Determines if the parameter is a global event header. \param Data (unsigned long In) The data word to test. \return bool \retval true - if word is a global event header \retval false - if word is not a global event header. */ static inline bool isGlobalHeader(unsigned long Data) { return ((Data & TYPE_MASK) == GLOBAL_HEADER); } /*! Returns true if the longword passed in is a global trailer. Global trailers mark the end of an event taken when the TDC is in trigger matching mode. \param Datum (Unsigned long In) The datum to analyze. \return Bool \retval true if datum is a global trailer longword. \retval False if datum is not a global trailer longword. */ static inline bool isGlobalTrailer(unsigned long datum) { return ((datum & TYPE_MASK) == GLOBAL_TRAILER); } /*! Extracts the trigger number from a global header word. The trigger number is the same as the event number. \param Header (unsigned long In) Global header from which to extract the trigger number. \return Unsigned The value of the global header's trigger number. \throw string - If the longword passed in is not a global header word a string indicating this fact is thrown. */ static inline int TriggerNumber(unsigned long Header) throw (string) { if(!isGlobalHeader(Header)) { throw string("CCAENV1x90Data::TriggerNumber - given non global header"); } else { return ((Header & EVENTCOUNT_MASK) >> EVENT_RSHIFT); } } /*! Extract the board number from a global header or trailer word. The board number is also known as the GEO field. \param Header (unsigned long In) Global header or trailer from which to extract the GEO field. \return unsigned The GEO field of header \throw string - if the longword passed in is not a global header word, a string indicating this fact is thrown. */ static inline unsigned int BoardNumber(unsigned long Header) throw (string) { if((!isGlobalHeader(Header)) && (!isGlobalTrailer(Header))) { throw string("CCAENV1x90Data::BoardNumber - given non global header"); } else { return (Header & GEO_MASK); } } /*! Determines if the longword passed in is a TDC header. The TDC header words must be explicitly enabled in the TDC, otherwise they will not appear in the event stream. \param Header (unsigned long In) The longword to check. \return bool \retval true If the longword Header is a TDC Chip header word. \retval False If the longword Header is not a TDC Chip header word. */ static inline bool isTDCHeader(unsigned long Header) { return ((Header & TYPE_MASK) == TDC_HEADER); } /*! Determines if the longword passed in is a TDC header. The TDC header words must be explicitly enabled in the TDC, otherwise they will not appear in the event stream. \param Header (unsigned long In) The longword to check. \return bool \retval true If the longword Header is a TDC Chip header word. \retval False If the longword Header is not a TDC Chip header word. */ static inline bool isTDCTrailer(unsigned long header) { return ((header & TYPE_MASK) == TDC_TRAILER); } /*! Determine if a longword is a TDC error reporting word. Note that you must explicitly enable the insertion of TDC error reporting longwords in the data stream at setup time. \param Datum (Unsigned long In) The data longword to analyze \return Bool \retval True if datum is a TDC error flag word. \retval False if dataum is not a TDC error flag word. */ static inline bool isTDCError(unsigned long Datum) { return ((Datum & TYPE_MASK) == TDC_ERROR); } /*! Returns the chip number of a TDC within the module from a word that is a TDC header or trailer word. \param Header (unsigned long In) The header longword from which the chip number will be extracted. \return unsigned - the chip number within the board of the TDCchip from a TDC header or trailer word. \throw string - Message is thrown if the input Header is not a TDC chip header or trailer longword. */ static inline unsigned int TDCChip(unsigned long Header) throw (string) { if(! isTDCHeader(Header) && !isTDCTrailer(Header) && !isTDCError(Header)) { throw string("CCAENV1x90Data::TDCChip - not data with chip no."); } else { return ((Header & TDC_MASK) >> TDC_RSHIFT); } } /*! Returns the Event id from a TDC header or trailer. I'm not sure if this value will be the same as the event id in the global header. \param Header (unsigned long In) The header longword to extract the event id from. \return unsigned - the event id \throw String - a message is thrown in the event that this header does not represent a TDC Header or trailer. */ static inline unsigned int EventId(unsigned long Header) throw (string) { if (!isTDCHeader(Header) && !isTDCTrailer(Header)) { throw string("CAENV1x90Data::EventId - not a tdc header"); } else { return ((Header & EVENTID_MASK) >> EVENTID_RSHIFT); } } /*! Returns the bunch count field from a TDC header or trailer. The bunch id is a counter that is incremented for each hit I think it is reset via the front panel reset or software resets. Perhaps it represents the event counter within a bunch on an accelerator system that is not CW. \param Header (Unsigned long In) The TDC header longword. \return The bunch count extracted from the TDC Header. \throw string - if the Header longword does not represent a TDC header */ static inline unsigned int BunchId(unsigned long Header) throw (string) { if(!isTDCHeader(Header)) { throw string("CCAENV1x90Data::Bundhid - not a tdc header"); } else { return (Header & BUNCHID_MASK); // Assumes right justified. } } /*! Returns the word count from a TDC trailer longword. \param Header (unsigned long In) The TDC trailer to analyze. \return unsigned short The word count extracted from the bunch count word. \throws string if the header is not a TDC Trailer. */ static inline short TDCWordCount(unsigned long Header) throw (string) { if(!isTDCTrailer(Header)) { throw string("CCAENV1x90Data::TDCWordCount not a tdc trailer"); } else { return (Header & TDCWORDCOUNT_MASK); } } /*! Returns true if the input longword represents a TDC measurement. \param data (unsigned long In) The data word to analyze. \return Bool \retval True Data is a TDC Measurement datum. \retval False Data is not a TDC Measurement datum. \throw None */ static inline bool isMeasurement(unsigned long data) { return ((data & TYPE_MASK) == MEASUREMENT); } /*! Determine if a measurement is a trailing edge time. \param Datum (Unsigned long In) The data word to analyze. \return Bool \retval True - datum represents a trailing edge signal timing. \retval False - datum represents a non trailing edge signal (trailing edge or width). \throw string if the datum does not represent a TDC measurement. */ static inline bool isTrailing(unsigned long datum) throw (string) { if(!isMeasurement(datum)) { throw string("CCAENV1x90Data::isTrailing not a measurement word"); } else { return ((datum & TRAILING_BIT) != 0); } } /*! Extracts the channel number from a tdc data word. \param Datum (Unsigned long In) The datum to analyze. \param is1190 (bool in) - True if the data comes from an 1190. -false otherwise. The channel number is positioned slightly differently in the 1190 vs. the 1290. Defaults to true (NSCL needs). \return Unsigned the value of the contents of the dataum word. \throw string if datum is not a TDC measurement. */ static inline int ChannelNumber(unsigned long Datum, bool is1190 = true) throw (string) { if(!isMeasurement(Datum)) { throw string("CCAENV1x90Data::ChannelNumber is not a measurement"); } else { unsigned long mask = V1190CHANNEL_MASK; unsigned long shift= V1190CHANNEL_RSHIFT; // If the module is actually a 1290, correct the // assumptions above. if(!is1190) { mask = V1290CHANNEL_MASK; shift= V1290CHANNEL_RSHIFT; } return ((Datum & mask) >> shift); } } /*! Returns the digitized value of a channel. \param Datum (Unsigned long In) The data longword to analyze. \param is1190 (bool in) - True if the data comes from an 1190. - false otherwise. The data value is positioned slightly differently in the 1190 vs. the 1290. Defaults to true (NSCL needs). \return The unsigned long value of the conversion represented by this data word. \throw String if datum is not a measuremenet. */ static inline long ChannelValue(unsigned long datum, bool is1190=true) throw (string) { if (!isMeasurement(datum)) { throw string("CCAENV1sx90Data::ChannelValue - is not a measurement"); } else { unsigned long mask = is1190 ? V1190DATA_MASK : V1290DATA_MASK; return (datum & mask); } } /*! Extract the error bits from a TDC error reporting longword. \param Datum (Unsigned long In) The data longword to analyze. \return Returns the error flag bit fields from TDCErrorBits. Note that there are definitions in this class that describe each of the bits in this bitfield. \throw string if datum is not a TDC error reporting longword. */ static inline unsigned long TDCErrorBits(unsigned long datum) throw (string) { if(!isTDCError(datum)) { throw string("CCAENV1x90DATA:: not an error flag word"); } else { return datum & ERROR_MASK; } } /*! Determine if the input longword is a trigger time tag word. Trigger time tag words can be put in to denote the time at which a trigger occurred (relative to reset?) They must be explicitly enabled and only have a meaning when the TDC is in Trigger Matching mode. \param Datum (Unsigned long In) The data word to analyze. \return Boolean \retval true if the input longword is a trigger time tag word. \retval False if the input longword is not a trigger time tagword. */ static inline bool isTriggerTimeTag(unsigned long datum) { return ((datum & TYPE_MASK) == TRIGGER_TIME); } /*! Return the extended trigger time field from a trigger tag longword. \param Datum (Unsigned long In) The datum to anlyze. \return unsigned long \retval The extended timestamp of the trigger tag longword. \throw String - if datum is not a trigger tag longword. */ static inline unsigned long ExtendedTriggerTime(unsigned long datum) throw (string) { if(!isTriggerTimeTag(datum)) { throw string("CCAENV1x90DATA::ExtendedTriggerTime not a trigger time word"); } else { return (datum & TRIGGERTIME_MASK); } } /*! Determines if a global trailer longword has the overflow bit set. \param Datum (Unsigned long In) A global trailer longword. \return Bool \retval true if the global trailer longword has the overflow bit set. \retval False if not. \throw String if datum is not a global trailer. */ static inline bool Overflow(unsigned long datum) throw (string) { if(!isGlobalTrailer(datum)) { throw string("CCAENV1x90DATA::Overflow - not a global trailer"); } else { return ((datum & OVERFLOW_MASK) == OVERFLOW_MASK); } } /*! Determines if a global trailer longword has the error bit set. This would indicate a global error in one of the TDC chips that must be further diagnosed. My guess is that if insertion of error flag longs is enabled, this bit is only set when there is at least one of these in the event. \param dataum (unsigned long In) The global trailer longword. \return Bool \retval true if there was an error this last event \retval false if there were no errors this last event. \throw String if the datum parameter is not a global trailer longword. */ static inline bool Error(unsigned long datum) throw (string) { if(!isGlobalTrailer(datum)) { throw string("CCAENV1x90DATA::Error - not a global trailer"); } else { return ((datum & TDCERROR_MASK) == TDCERROR_MASK); } } /*! Determines if there were triggers that did not get digitized due to pileup. \param Datum (Unsigned long In) The Global trailer longword to analyze. \return Bool \retval true if the TriggersLost bit was set in datum \retval false if the Triggerslost bit is not set in datum. \throw String - if datum is not a global trailer longword. */ static inline bool Lost(unsigned long datum) throw (string) { if(!isGlobalTrailer(datum)) { throw string("CAENV1x90DATA::Lost - not a trailer long"); } else { return ((datum & TRIGGERLOST_MASK) & TRIGGERLOST_MASK); } } /*! Extracts the size of an event from a global trailer longword \param Datum (Unsigned long In) A global trailer longword being analyzed \return Unsigned long \retval The number of words in the events for which this is a trailer. \throw String if datum is not a global trailer longword. */ static inline unsigned long EventSize(unsigned long datum) { if(!isGlobalTrailer(datum)) { throw string("CAENV1x90DATA::EventSize - not a trailer long"); } else { return ((datum & WORDCOUNT_MASK) >> WORDCOUNT_RSHIFT); } } /*! Determines if a longword is a filler word. Filler words are returned if the device is read when it has no data and bus errors are disabled. This is how the device should be run as the bus interfaces don't do a good job of reporting bus errors to the code in a synchronous manner. \param Datum (Unsigned long In) The longword to analyze. \return Bool \retval true if datum is a filler. \retval False if datum is not a filler. */ static inline bool isFiller(unsigned long datum) { return ((datum & TYPE_MASK) == FILLER_LONG); } /*! */ } #endif --- NEW FILE: CCAENV1x90.cpp --- /* Implementation of the CCAENV1x90 class. For more information about this class, see the associated header: CCAENV1x90.h */ // Headers etc. #include "CCAENV1x90.h" #include "CCAENV1x90Registers.h" #include "CCAENV1x90Data.h" #include "CCAENV1x90Opcodes.h" #include <stdio.h> #include <string.h> #include <unistd.h> #include <string> #include <vector> [...3135 lines suppressed...] pWords. This performs a full operation with the microcontroller that requests and transfers data from the micro controller. \param opcode (unsigned short IN) The operation code to write to the micro \param pWords (unsigned short OUT) Pointer to the buffer to hold the words retreived from the micro \param nWords (unsigned int in) Number of words to read from the micro */ void CCAENV1x90::MicroTransaction(unsigned short opcode, void* pWords, unsigned int nWords) { WriteMicro(opcode); ReadMicroBlock(pWords, nWords); } --- NEW FILE: CCAENV1x90.h --- /*! \class CCAENV1x90 The CCAENV1x90 class provides a C++ class based interface to the CAEN V1190 and V1290 TDC module. These are TDC modules that are based on the CERN TDC chip. For each module of this sort you have in your system, you must create an instance of this class. Note that since CAEN is gravitating away from geographical addressing, this initial version will only support base address access. This module is a very complex module. Be sure you understand it completely (read the hardware manual) before you attempt to make of it. Did we remember to advise you to read the hardware manual? From the software point of view, there are two major modes of operation: - Continuous storage mode: In this mode hits are accepted relative to a t=0 time. The hit times are recorded relative to that time. - Trigger matching mode: This mode is more like what NSCL users are used to seeing. The module has a gate, and all hits that come in within some "matching window" of the gate are accepted. The TDC chips are built to run in common stop mode, however there's a 1usec delay on the gate that allows a limited common start range. Trigger matching mode is further characterized by the matching parameters: - Window offset- the time relative to the trigger at which the matching begins. This can be positive or negative. - Window Width - Thesize, in time, of the matching window. - Reject margin- A usually small window on to the left of the actual matching window that allows for the fact that events may not have made it into the L1 buffer at the time the window opens. - Extra search margin - an extra time on the end of the match window to ensure that all hits that occured during the search window have been written to the L1 buffer from which the match is done. The 1290 module has an additional mode: High resolution mode. In that mode, sets of TDC channels are ganged together with phase shifted clocks and recombined to get a time resolution of 25ps. In this mode, the pair trigger mode is not allowed. Wherever possible, we attempt to enforce all restrictions via software. Change Log: $Log: CCAENV1x90.h,v $ Revision 1.2 2004/06/18 12:10:57 ron-fox Merge 7.4 development into 8.0 main line. Revision 1.1.2.1 2004/06/18 11:17:41 ron-fox Add support for CAEN v1190/1290 TDC's. */ #ifndef __CCAENV1x90_H #define __CCAENV1x90_h #ifndef __STL_STRING #include <string> #ifndef __STL_STRING #define __STL_STRING #endif #endif #ifndef __STL_VECTOR #include <vector> #ifndef __STL_VECTOR #define __STL_VECTOR #endif #endif #ifndef __DESIGNBYCONTRACT_H #include "DesignByContract.h" #ifndef __DESIGNBYCONTRACT_H #define __DESIGNBYCONTRACT_H #endif #endif #ifndef VMEMODULE_H #include <VmeModule.h> #endif // Class definitions. class CCAENV1x90 { // Exported data types: public: /*! This enum defines the possible signals that the PROG_OUT ECL signal can represent. */ typedef enum _ECLOutputSelect { DATA_READY, FULL, ALMOST_FULL, ERROR } ECLOutputSelect; struct TriggerConfiguration { unsigned short s_MatchWidth; short s_MatchOffset; unsigned short s_MatchExtra; unsigned short s_RejectMargin; unsigned short s_Subtracting; }; typedef enum _EdgeMode { EdgeMode_Pair = 0 , EdgeMode_Trailing = 1, EdgeMode_Leading = 2, EdgeMode_Both = 3 } EdgeMode; typedef enum _Resolution { Res_25ps = 3, // 1290 only. Res_100ps = 2, Res_200ps = 1, Res_800ps = 0 } Resolution; typedef enum _LEResolution { LE_100ps = 0, LE_200ps = 1, LE_400ps = 2, LE_800ps = 3, LE_1600ps = 4, LE_3120ps = 5, LE_6250ps = 6, LE_12500ps = 7 } LEResolution; typedef enum _PWResolution { PW_100ps = 0, PW_200ps = 1, PW_400ps = 2, PW_800ps = 3, PW_1600ps = 4, PW_3200ps = 5, PW_6250ps = 6, PW_12500ps = 7, PW_25ns = 8, PW_50ns = 9, PW_100ns = 10, PW_200ns = 11, PW_400ns = 12, PW_800ns = 13 } PWResolution; typedef enum _DeadTime { DT_5ns = 0, DT_10ns = 1, DT_30ns = 2, DT_100ns = 3 } DeadTime; // Instance data. typedef enum _HitMax { HITS_0 = 0, // No hits. HITS_1 = 1, HITS_2 = 2, HITS_4 = 3, HITS_8 = 4, HITS_16 = 5, HITS_32 = 6, HITS_64 = 7, HITS_128 = 8, HITS_UNLIMITED = 9 // No limit on hits. } HitMax; typedef enum _L1Size { L1_2wds, L1_4wds, L1_8wds, L1_16wds, L1_32wds, L1_64wds, L1_128wds, L1_256wds } L1Size; // public data public: // Error masks for Get/Set ErrorEnables: static const unsigned short ERR_VERNIER; static const unsigned short ERR_COARSE; static const unsigned short ERR_SELECT; static const unsigned short ERR_L1PARITY; static const unsigned short ERR_TFIFOPARITY; static const unsigned short ERR_MATCHERROR; static const unsigned short ERR_RFIFOPARITY; static const unsigned short ERR_RDOSTATE; static const unsigned short ERR_SUPPARITY; static const unsigned short ERR_CTLPARITY; static const unsigned short ERR_JTAGPARITY; // Tap masks for calibrate delayline. static const unsigned short TAP_CONTACT1; static const unsigned short TAP_CONTACT2; static const unsigned short TAP_CONTACT3; private: unsigned long m_nBase; //!< VME base address of the module. unsigned int m_nCrate; //!< VME crate stuffed in. unsigned int m_nSlot; //!< Geo value. CVmeModule m_pRegisters; //!< Device register pseudo pointer. unsigned int m_nModel; //!< Model, e.g. 1190 or 1290. unsigned char m_cVersion; //!< Sub-model e.g. A,B or N. unsigned int m_nSerialNumber; //!< Module serial number. unsigned int m_nChipCount; //!< Number of chips in the board unsigned int m_nChannels; //!< Number of channels on the board. unsigned int m_nBoardRevision; //!< Board hardware revision level. bool m_fCanHiRes; //!< True if high resolution capable. bool m_fIsHiResMode; //!< True if module is in hi res. bool m_fTriggerMatching; //!< true if module has got //!< trigger match mode on. // Constructors and canonical operations. public: CCAENV1x90(unsigned int nSlot, unsigned int nCrate, unsigned long nBase); //!< geo not supported for these. ~CCAENV1x90(); private: // Copy etc. not allowed. CCAENV1x90(const CCAENV1x90& rhs); CCAENV1x90& operator= (const CCAENV1x90& rhs); int operator==(const CCAENV1x90& rhs) const; int operator!=(const CCAENV1x90& rhs) const; public: // Selectors: public: unsigned int getModel() const { //!< Return model number. return m_nModel; } unsigned char getVersion() const { //!< Return type (e.g. 'N'). return m_cVersion; } unsigned int getSerialNumber() const { //!< Module serial # return m_nSerialNumber; } unsigned int getChipCount() const { //!< # TDC Chips on board. return m_nChipCount; } unsigned int getChannelCount() const { //!< # Channels. return m_nChannels; } // Class operations: public: unsigned short SR(); //!< Return the value of the board //!< status register. bool isSetSR(unsigned short bitnum); //!< true if sr has 1 << bitnum set. unsigned short ReadCR(); //!< Return the value of the ctl reg. bool isSetCR(unsigned short bitnum); //!< true if sr has 1<< bitnum set. // Functionality exposed by the control register: void Terminate(); //!< Software terminate module. void Unterminate(); //!< Software unterminate module. void TerminateWithSwitch(); //!< Set termination to be via hardware switch void EnableTriggerTagTime(); //!< Put time tag in event. void DisableTriggerTagTime(); //!< don't put time tag in event. // Status register functionality: bool DataReady(); //!< True if there's data. bool AlmostFull(); //!< True if the buffer's almost full. bool isFull(); //!< True if the buffer is full. bool isTriggerMatching(); //!< True if module says it's trigger matching. bool isHeaderEnabled(); //!< True if TDC Header enabled. bool isTerminated(); //!< True if terminated regardless of how. bool HadError... [truncated message content] |