AMT TDC (AMT-VME)

アドレスの設定

HPC用のTDCは64chのAMSCの64chのTDC。 ホームページはこちら。 アドレスは以下のようになっている。 もともとは0xabcdのbをcrateの番号というつもりだったがもはや破綻。 HPCのTDCはQDCと同じクレートに挿す事にしてアドレスは0x040aにする。 switch2をOFFでA32 address mode。 switch3でA32でのアドレスを設定するが、A31-A24まで(0xabcdのabの部分)し か設定できない?とりあえずわかりやすいように0x0000に設定す る。つまりsw3全部ONで0。 sw4はA24用?効かないかもだけど一応全部OFFで0にしておく。 で、Run statusを読んでみる。
[nebula@nebula01 ~]$ cmdvme-i 0 -lr 0x00071f04
ffffffff
となる。 71f00はQuickOperationに書いているが、Dptopの位置。statusは更に+04。で もこのDptopはmanualでは7df00となっている。どういうこと? などなど。なのでBit0やBit3-4は0でないと変!。そもそもLED光らない。 うーむ。 amttdc.cのamt_regset_iの中にアドレスをサーチするような以下のルーチンを 書いて探してみる。 -->messegeがうっとうしくなるので標準出力に出すものを作った。 (これ
  //-->
  // teporary for checking the VME addressing
  unsigned long i;
  unsigned long maxaddr,addr,offset,vmeaddr;

  maxaddr = 0xfff8;//bit 31-19
  offset  = 0x0007df00; // DPtop
  for (i=0;i< maxaddr;i++){
    addr=i<<16;
    vmeaddr = addr+offset+0x04;
    vread32_i(vmeaddr,(long *)®dat_w,dn);
    if (regdat_w!=0xffffffff) printk("addr=0x%lx, val=0x%lx\n",
                                     vmeaddr,regdat_w);
  }
  //<--
[nebula@nebula01 babidrv]$ dmesg|less
addr=0x7df04, val=0xf2000004
addr=0x10fedf04, val=0x21006c08
addr=0x10ffdf04, val=0x0
addr=0x1100df04, val=0x0
addr=0x3881df04, val=0x0
addr=0x3882df04, val=0x0
addr=0x3883df04, val=0x0
アドレスの設定はsw2-1がOFF、sw3-4(A28)だけビットON(jumperでoff)、 sw4は2-6をOFF(1はつながっていない)。つまり0x1000のつもり。 TDCのクレートにさした。これに刺さっているのは RPV-130(0x0000)、TDC(0x040*)、SIS3820(0x3800)なのでどうやら10fedf04が それっぽい。プログラムのoffsetの値を0x00071f00にしてみると以下のように なる。
addr=0x71f04, val=0xf2000004
addr=0x10f91f04, val=0x0
addr=0x10fa1f04, val=0x0
addr=0x10fb1f04, val=0x0
addr=0x10fc1f04, val=0x0
addr=0x10fd1f04, val=0x0
addr=0x10fe1f04, val=0xa100a4e
addr=0x10ff1f04, val=0x4
addr=0x11001f04, val=0x4
addr=0x38811f04, val=0x0
addr=0x38821f04, val=0x0
あれ?0x1000に設定しているつもりだけど0x10f8に設定されている?
  0x10f80000
+ 0x0007df04
------------
  0x10fedf04
どうやらそうみたい。sw4をすべてONにしてみる。 offset=0x71f00のときには
addr=0x71f04, val=0xf2000004
addr=0x10061f04, val=0xa100a4e
addr=0x10071f04, val=0x4
addr=0x10081f04, val=0x4
addr=0x38811f04, val=0x0
addr=0x38821f04, val=0x0
offset=0x7df00のときには
addr=0x7df04, val=0xf7c50004
addr=0x1001df04, val=0xc
addr=0x1002df04, val=0xc
addr=0x1003df04, val=0xc
addr=0x1004df04, val=0xc
addr=0x1005df04, val=0xc
addr=0x1006df04, val=0x21006c08
addr=0x1007df04, val=0x0
addr=0x1008df04, val=0x0
addr=0x3881df04, val=0x0
addr=0x3882df04, val=0x0
offsetはどっち?
[nebula@nebula01 babidrv]$ cmdvme-i 1 -lr 0x10071f04
0000000c
でLED光った!manualの
A31-A19:ON=0,OFF=1
という記述はSW2-1をOFFにするとsw3,sw4をOFFにするとbitが立つということ なのか? とりあえずアドレスの問題は解決。
Run Status
offsetは0x71f04が正しそう。0x4=0b100。つまりbit2だけON。defaultの common stop。 どうやらこれでデータとれているっぽい。
2012/1/22現在の状態
課題
ANAPAW Decoder
AnapawのDecoderは他のを真似して作った。
int TArtDecoderAMTTDC::Decode(unsigned char* &buf, const unsigned int&
size,
                               TArtMapConfig::TArtMapModules &modules,
                               TArtMapConfig *config)
{
   unsigned int *evtdata = (unsigned int*) buf;
   unsigned int evtsize = size/sizeof(unsigned int);//32bit size
   int i, imod, ich,edge;
   unsigned int data;
   int evtflag = 0;
   const unsigned int MS3B_MASK                = 0xe0000000;
   const unsigned int MS3B_RecordingDataStatus = 0x5;
   const unsigned int MS3B_CommonStartStop     = 0x6;
   const unsigned int MS3B_HitData             = 0x0;
   const unsigned int MS3B_ErrorReport         = 0x3;
   const unsigned int MS3B_EndOfData           = 0x2;

   unsigned int ms3b;// most significant 3 bits

//   printf("TArtDecoderAMTTDC: Decode start\n");

   for (int i=0; i< evtsize; i++) {
     ms3b=(evtdata[i]&MS3B_MASK) >>29;
//     printf("ms3b=%lx\n",evtdata[i]&MS3B_MASK);
//     printf("ms3b=%lx\n",ms3b);
     //-----------------------------------------
     if        (ms3b==MS3B_RecordingDataStatus){
       evtflag=1;
     //-----------------------------------------
     } else if (ms3b==MS3B_CommonStartStop    ){
       imod=(evtdata[i]&0x1f000000)>>24;//Module ID
       //       printf("imod=%lx\n",evtdata[i]&0x1f000000);
     //-----------------------------------------
     } else if (ms3b==MS3B_HitData            ){
       ich=(evtdata[i]&0x03f00000)>>20;//Channel number
       edge=(evtdata[i]&0x10000000)>>28;//falling=1, rising=0
       data=0;
       if (modules[imod][ich]) {
         data = evtdata[i]&0x000fffff;// HIT time data
         config->GetRawDataRef(modules[imod][ich])
           = data;
//       printf("imod=%d, ich=%d, edge=%d,data=%d\n",imod,ich,edge,data);
       }
     //-----------------------------------------
     } else if (ms3b==MS3B_ErrorReport        ){
       printf("TArtDecoderAMTTDC: Error in AMTTDC data\n");
     //-----------------------------------------
     } else if        (ms3b==MS3B_EndOfData){
       evtflag=0;
    //-----------------------------------------
     } else{
       printf("TArtDecoderAMTTDC: Unknown Data\n");
     }
     //-----------------------------------------
   }//for

   //   printf("TArtDecoderAMTTDC: Decode end\n");
   return 0;
}

これを作った後にDecoderFactoryでRegisterすればよい。 TArtDecoderAMTTDC.hの中にsegid.hで定義したModule IDを書いておく。 あとはanapawのencを書いて、usersrc.Fに追加すれば出来上がり。(だと思 う。)これでデータ見えているっぽい。ただ15/16chにインプットしているは ずだけど14chまでしか見えていない?なぜ?-->34pinのアサインの問題!

34pinのアサイン

34pinのアサインは1,2pinがGNDとなっている。 NEBULAで使っている他のECLケーブルは 33,34pinがGNDで1,2pinがch0。 なのでケーブルそのまま使うとchがずれる! LVDSのケーブルはAMTTDCと同じピンアサイン。なのでとりあえずはLVDSの信号 をTDCに突っ込めは良いはず。