Rev 5 | Details | Compare with Previous | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 5 | f9daq | 1 | #include <stdio.h> | 
        
| 2 | #include <vector> | 
        ||
| 3 | #include "VmUsbStack.h" | 
        ||
| 4 | |||
| 5 | VmUsbStack::VmUsbStack(){  | 
        ||
| 6 | fStack.push_back(0x1);  | 
        ||
| 7 | fStack.push_back(0x0);  | 
        ||
| 8 | } | 
        ||
| 9 | |||
| 10 | VmUsbStack::~VmUsbStack(){  | 
        ||
| 11 | fStack.clear();  | 
        ||
| 12 | } | 
        ||
| 13 | |||
| 14 | int VmUsbStack::Get(int maxn, int *stack){  | 
        ||
| 15 | for (int i=0;i<fStack.size();i++){  | 
        ||
| 16 | if (i<maxn) stack[i]=fStack[i]; else return -1;  | 
        ||
| 17 |   } | 
        ||
| 18 | return fStack[0];  | 
        ||
| 19 | } | 
        ||
| 20 | |||
| 21 | |||
| 22 | void VmUsbStack::Append(int cmd, int addr ){  | 
        ||
| 23 | fStack.push_back(cmd & 0xFFFF);  | 
        ||
| 24 | fStack.push_back(cmd >> 16);  | 
        ||
| 25 | fStack.push_back(addr&0xFFFF);  | 
        ||
| 26 | fStack.push_back((addr >> 16)& 0xFFFF);  | 
        ||
| 27 | fStack[0]=fStack.size()-1;  | 
        ||
| 28 | } | 
        ||
| 29 | |||
| 30 | void VmUsbStack::Append(int cmd, int addr , int data){  | 
        ||
| 31 | Append( cmd, addr );  | 
        ||
| 32 | fStack.push_back(data&0xFFFF);  | 
        ||
| 33 | fStack.push_back((data >> 16)&0xFFFF);  | 
        ||
| 34 | fStack[0] = fStack.size()-1;  | 
        ||
| 35 | } | 
        ||
| 36 | |||
| 37 | void VmUsbStack::ReadA24D16(int addr ){  | 
        ||
| 38 | Append(CMD_READ | CMD_A24 , CMD_D16 | addr);  | 
        ||
| 39 | } | 
        ||
| 40 | |||
| 41 | void VmUsbStack::WriteA24D16(int addr, int data){  | 
        ||
| 42 | return Append(CMD_WRITE | CMD_A24,CMD_D16 | addr, data);  | 
        ||
| 43 | } | 
        ||
| 44 | |||
| 45 | void VmUsbStack::ReadA24D32(int addr ){  | 
        ||
| 46 | Append(CMD_READ | CMD_A24 , CMD_D32 | addr);  | 
        ||
| 47 | } | 
        ||
| 48 | |||
| 49 | void VmUsbStack::WriteA24D32(int addr, int data){  | 
        ||
| 50 | return Append(CMD_WRITE | CMD_A24 , CMD_D32 | addr, data);  | 
        ||
| 51 | } | 
        ||
| 52 | |||
| 53 | void VmUsbStack::ReadA32D16(int addr ){  | 
        ||
| 54 | Append(CMD_READ | CMD_A32 , CMD_D16| addr);  | 
        ||
| 55 | } | 
        ||
| 56 | |||
| 57 | void VmUsbStack::WriteA32D16(int addr, int data){  | 
        ||
| 58 | return Append(CMD_WRITE | CMD_A32 , CMD_D16 | addr, data);  | 
        ||
| 59 | } | 
        ||
| 60 | |||
| 61 | void VmUsbStack::ReadA32D32(int addr ){  | 
        ||
| 62 | Append(CMD_READ | CMD_A32 , CMD_D32 | addr);  | 
        ||
| 63 | } | 
        ||
| 64 | |||
| 65 | void VmUsbStack::WriteA32D32(int addr, int data){  | 
        ||
| 66 | return Append(CMD_WRITE | CMD_A32 , CMD_D32| addr, data);  | 
        ||
| 67 | } | 
        ||
| 68 | |||
| 69 | |||
| 70 | void VmUsbStack::Marker(int marker){  | 
        ||
| 71 | return Append(CMD_MRK, marker);  | 
        ||
| 72 | } | 
        ||
| 73 | |||
| 74 | void VmUsbStack::ConditionalRead(int adr_mod,int d16d32, int addr, int bmask){  | 
        ||
| 75 | Append(CMD_READ| CMD_HD | adr_mod ,addr);  | 
        ||
| 76 | Append(CMD_READ| CMD_HD | CMD_HM |adr_mod, d16d32 |addr,bmask);  | 
        ||
| 77 | } | 
        ||
| 78 | |||
| 79 | void VmUsbStack::RepeatRead(int adr_mod,int d16d32, int baseaddr, int n, int increment){  | 
        ||
| 80 | for (int i=0;i<n;i++) Append( adr_mod | CMD_READ, d16d32 +baseaddr + i*increment);  | 
        ||
| 81 | } | 
        ||
| 82 | void VmUsbStack::RepeatWrite(int adr_mod,int d16d32,int baseaddr, int n, int increment, int data){  | 
        ||
| 83 | for (int i=0;i<n;i++) Append( adr_mod | CMD_WRITE,d16d32 + baseaddr+i*increment, data);  | 
        ||
| 84 | } | 
        ||
| 85 | |||
| 86 | void VmUsbStack::Print(){  | 
        ||
| 87 | for (int i=0; i < fStack.size();i++) printf("0x%04x\n",fStack[i]);  | 
        ||
| 88 | printf("%d %d __________________________________\n",fStack.size(),fStack[0]);  | 
        ||
| 89 | } | 
        ||
| 90 | |||
| 91 | #ifdef MAIN | 
        ||
| 92 | #include "CAENV965_DEF.h" | 
        ||
| 93 | #define CAEN_V965    0x340000 | 
        ||
| 94 | |||
| 95 | int main(){  | 
        ||
| 96 | // INIT stackdata | 
        ||
| 97 | int geo=1,fPedestal=255;  | 
        ||
| 98 | VmUsbStack *init=new VmUsbStack();  | 
        ||
| 99 | init->Write(CAEN_V965 + CAENV965_CRN, 0x0);  | 
        ||
| 100 | init->Write(CAEN_V965 + CAENV965_GEO, geo);  | 
        ||
| 101 | init->RepeatWrite( CAEN_V965 + CAENV965_THM, 32, 0x02,0x0); // threshold/kill for 32 channels, 2*i addr increment  | 
        ||
| 102 | init->Write( CAEN_V965 + CAENV965_BS1, 0x80 ); // soft reset  | 
        ||
| 103 | init->Write( CAEN_V965 + CAENV965_BC1, 0x80 ); // soft reset  | 
        ||
| 104 | init->Write( CAEN_V965 + CAENV965_PED, fPedestal ); // pedestal  | 
        ||
| 105 | init->Write(CAEN_V965 + CAENV965_BS2,0x5000);  | 
        ||
| 106 | init->Write(CAEN_V965 + CAENV965_BS2,0x4); // clear module  | 
        ||
| 107 | init->Write(CAEN_V965 + CAENV965_BC2,0x4);  | 
        ||
| 108 | init->Print();  | 
        ||
| 109 | |||
| 110 | // READOUT stackdata | 
        ||
| 111 | VmUsbStack *stack=new VmUsbStack();  | 
        ||
| 112 | stack->Write(CAEN_V965 + CAENV965_BS2,0x4); // clear module  | 
        ||
| 113 | stack->Write(CAEN_V965 + CAENV965_BC2,0x4);  | 
        ||
| 114 | stack->ConditionalRead(CAEN_V965 + CAENV965_SR1,0x1); // TRG wait : loop until bit 0 is on  | 
        ||
| 115 | stack->ConditionalRead(CAEN_V965 + CAENV965_OB ,0x4000000) ; // loop until bit 26 is on, read data  | 
        ||
| 116 | stack->Marker(0xFAFB);  | 
        ||
| 117 | stack->Print();  | 
        ||
| 118 | |||
| 119 | int st[1000];  | 
        ||
| 120 | int nb= stack->Get(1000,st);  | 
        ||
| 121 | for (int i=0;i<nb;i++) if (st[i]!=stack->fStack[i]) printf("error i=%d 0x%04x 0x%04x \n",i,st[i],stack->fStack[i] );  | 
        ||
| 122 | return 0;  | 
        ||
| 123 | } | 
        ||
| 124 | #endif |