AMT TDC (AMT-VME)
アドレスの設定
HPC用のTDCは64chのAMSCの64chのTDC。
ホームページはこちら。
アドレスは以下のようになっている。
- RPV-130(crate0):0x0000000
- SIS3820(crate0):0x3800000
- v792(crate0):0x0500000 - 0x0509000
- v775(crate1):0x0400000 - 0x0409000
- V895(crate2):0x0000000 - 0x0009000
- V895(crate3):0x0100000 - 0x0109000
もともとは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:(reserved)[0]
- Bit1:start measurement [0]
- Bit2:common start/stop (=0 start, =1 stop)[1]
- Bit3-4:=0 rising, =1 rising and falling, =2 falling, =3 rising
and width[0]
- ...
などなど。なので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現在の状態
- NEBULA316UをテンポラリーにTDCに入れている。
- トリガーはTcal, 320ns, 2.56usで3.2usのTDCのレンジに収まっている
課題
- どうせ16chしか使わないので他のchをdisableに。
- ANAPAWのDecoder
- ANAPAWのenc
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に突っ込めは良いはず。