last-modified: 2019-04-28 (日) 18:36:58 (1834d)[変更箇所]
Scientific linux をネットワークインストール。 Desktopを選択。
再起動ごDHCPがうまく動かなかったが、/etc/sysconfig/network-scripts/ifcfg-eth0で
NM_CONTROLLED="no" GATEWAY=xxx.xxx.xxx.xxx NETMASK=xxx.xxx.xxx.xxx
でつながった。
yumのリポジトリを編集。http://d.hatena.ne.jp/leetmikeal/20130409/1365477385を参考にした。
とりあえずemacsをインストール
yum install emacs
あとupdate
yum update
その後
をインストール。 ROOTのために以下もインストール
ROOTを/usr/local/src/root/root_v5.34.36にインストール
./configure --prefix=/usr/local/src/root/root_v5.34.36
とした。 rootを立ち上げるとiostreamがないとか言われたりする。どうもprefixの場所はtarを展開したところではいけないという記事を見つけたので、prefix=/usr/local/lib/root_v5.34.36/として再コンパイル。~/.bashrcは結局以下のようにした。
#ROOT source /usr/local/lib/root_v5.34.36/bin/thisroot.sh alias root="root -l"
https://ribf.riken.jp/RIBFDAQ/index.php?DAQ%2FManual%2FInstallation#r75f84d8にしたがって行う。
system-config-firewall-tui
で有効のチェックを外す。 /etc/sysconfig/selinuxで
#SELINUX=enforcing SELINUX=disabled
とする。
yumで以下をインストール
su cd /usr tar zxvf babirl160802.tar.gz ln -s babirl160802 babirl cd babirl make
webutilも一応やっておく。 Install of Web Utilitiesをそのままやった。 /home/daq/public_htmlにwebutilをおいた。ブラウザで開くとForbiddenと言われるので、chmod 755 $HOMEとした。
あとはドライバかな?https://ribf.riken.jp/RIBFDAQ/index.php?DAQ%2FDownload#w25313faをみると、
[daq@daq01 A2818Drv-1.20]$ make make -C /lib/modules/2.6.32-642.el6.i686/build M=/home/daq/daq_drivers/aliap_ge/A2818Drv-1.20 LDDINCDIR=/home/daq/daq_drivers/aliap_ge/A2818Drv-1.20/../include modules make: *** /lib/modules/2.6.32-642.el6.i686/build: そのようなファイルやディレクトリはありません. 中止. make: *** [default] エラー 2と言われるググるとkernel-develを入れればよいみたい。いれる。
yum install kernel-devel再びA2818Drv-1.20でmake。でも同じ。どうも
#KERNELDIR ?= /lib/modules/$(shell uname -r)/build KERNELDIR ?= /lib/modules/2.6.32-642.11.1.el6.i686/buildこれでトライ。makeできた。あとはa2818_loadというスクリプトを走らせればドライバがロードされるみたい。rootアカウントでスクリプト走らせると、
[root@daq01 A2818Drv-1.20]# ./a2818_load insmod: error inserting 'a2818.ko': -1 No such deviceとなってしまう。PCIカードささないとダメですかね?とりあえず今日はここまで。
A2818を取り付ける。ジャンパーはPCIが5Vのようなので3.3Vになっていたのを5Vにする。 2つあるPCIのうち、上側につけると上と同じメッセージ。。。下側のPCIスロットにつけるとerrorがなくなった!どういうこと?とりあえず下側のスロットに挿して使うことにする。a2818_loadのスクリプトはDAQを動かすときに自動的にやりたいが。。。後で考える。
babirlにはoriginal driver + librariesとある。libraryはCAENVMELibか?とりあえずこれをダウンロードして展開。とりあえず/home/daq/daq_drivers/ailap_ge/CAENVMELib-2.50にある。Readmeにしたがって、lib/installを実行する。
次にV2718のドライバを https://ribf.riken.jp/RIBFDAQ/index.php?plugin=attach&refer=DAQ%2FDownload&openfile=bbcaenvme150709.tar.gzからダウンロード。コピーして、/home/daq/daq_drivers/ailap_ge/bbcaenvmeにおく。これを改造してDAQドライバを作ることにする。とりあえずcmdvmeをコンパイルして、
[daq@daq01 cmdvme]$ ./cmdvme -wr -bd V2718 ffff / 65535
とすると、モジュールのLEDが光る!アクセスできているみたい。とりあえず今日はここまでとする。
DAQのPCを実験室のローカルネットワークにおく。ルーターにLANケーブルを挿す。/etc/sysconfig/network-scripts/ifcfg-eth0を編集して/etc/init.d/network restartした。詳細はlogbookで。
webutilがうまくいかないので、とりあえず以下のようなスクリプトを用意した。
#!/bin/sh if [ ! -e /dev/a2818_0 ];then echo /home/daq/daq_drivers/ailap_ge/A2818Drv-1.20/a2818_load source /home/daq/daq_drivers/ailap_ge/A2818Drv-1.20/a2818_load fi if [ -e /var/run/babinfo ]; then kill `cat /var/run/babinfo` rm -f /var/run/babinfo fi if [ -e /var/run/babild ]; then kill `cat /var/run/babild` rm -f /var/run/babild fi if [ -e /var/run/babies ]; then kill `cat /var/run/babies` rm -f /var/run/babies fi /usr/babirl/bin/babinfo sleep 1 /usr/babirl/bin/babild -l 1 /usr/babirl/bin/babies -l 21
sleepを入れないとbabiconが立ち上がらない。
アドレスを設定するスイッチSW1-3はそれぞれ1,2,3にした。 ロジック信号の論理レベル設定J1は開放でNIM。 これでMIR(Module Identification Register)を読んでみる。
[daq@daq01 cmdvme]$ ./cmdvme -lr 0x123ffff4 00003400 / 13312
読めた!0x123がアドレスに対応している。ちなみにFPGAやCPUのversionを読むと、
[daq@daq01 cmdvme]$ ./cmdvme -lr 0x123fffec 00000100 / 256 [daq@daq01 cmdvme]$ ./cmdvme -lr 0x123ffff0 00000100 / 256
両方とも0x0100を返すが、これはver1.00に対応しているらしい。初めは正しく読めてるかどうかよくわからなかった。。。
同も16ビットしか使っていないからといって、vwrite16を使うと正しく書き込みできないみたい。全部vwrite32で統一すれば良さそう。
1/13。馬場さんからA3400のドライバをもらった。/home/daq/daq_drivers/ailap_ge/testdrv_A3400においてある。これを少し改造する。libbabies.c仕様にするために、A3400_segdata_libbabiesを作り、
// vread32(maddr+A3400_LISTBUFF+dataaddr, (int *)(data+mp)); vread32(maddr+A3400_LISTBUFF+dataaddr, (int *)(babies_segpt32())); // mp += 2; // segmentsize += 2;
とした。またもらったドライバはインタラプトをLUPOで書けていたので、これをA3400でかけるようにした。とりあえず1イベントでインタラプトをかけることにした。(Geだけなら、ある程度イベントたまったらでもいいけれど。。。)
babies/babiesのリンク先はcaenvmebabiesになっている。これの中身を見ると、startup,evt,stop,clearなどが含まれている。A3400ように改造して走らせる。これが走っている状態でbabiconでnsstaすると何か動いているっぽい!RawDataMonitor?でも一応何か見える。次はデータ解析コードですかね。
v4.5.31をインストール。autogen.sh --prefix=$PWDをやると、
libtoolize: コマンドが見つかりません
とか言われて途中で止まるので、libtoolをyumでインストール。 autogenを通るけど、今度はxmlでmakeが以下のメッセージで止まる。
include/TArtBigRIPSParameters.hh:10: error: forward declaration of ‘struct TXMLNode’ src/TArtBigRIPSParameters.cc:886: error: invalid use of incomplete type ‘struct TXMLNode’
yumでlibxml2-develをインストール。でもダメ。ANAROOT Wikiでこんなのがあったのを思い出す。https://root.cern.ch/build-prerequisitesに必要なものが一覧になっている。とりあえず入っていなかった以下のものをyumで入れる。
これらを何も考えずに入れた後、ROOTをmake clean後configure, makeとした。 これでanarootもmakeできました。
RIBF2DataId?.Cでデータを確認するとそれっぽい!とりあえず動くものはできたと思う。
RawData?モニターで見ると以下のようになっている。
Segment ly=2 cid=4 size=14 21 0x 2100000e 00000015 0000001f 05c9 4084 0000 d088 bb81 f79a d8a4 60d7 SegmentID=0x0000001f BIGRIPS (Dev=0) FP0 (FP=0) PPACQ (Det=0) A3100 (Mod=31)
05c9からがデータ。これは多分
と読むのだと思う。Gated ListモードだとADC1、ADC2、…、TS_HI、TS_LO、ECという順番になっているらしい。(1)、(2)、(3)、(4)の上位ビット3つは010、110、111、011なので、ADC、TS_HI、TS_LO、ECとなっている。これはマニュアルのデータ構造と同じ。ADCだけ読むなら上位3ビットが010で見つければよい。ANAROOTのTArtDecorderA3100::Decodeでは
igeo = 0; for (i=0; i<evtsize; i++) { //TArtCore::Info("TArtDecoderA3100","decode %x",evtdata[i]); //if(kHeaderMask == evtdata[i]&kHeaderMask){ if((evtdata[i]&kHeaderMask) == kHeaderMask){ igeo ++; continue; } else{ ich = (evtdata[i]&0x0003c000) >> 14; TArtRawDataObject *rdata = new TArtRawDataObject(igeo,ich,evtdata[i]&0x1fff); rawseg->PutData(rdata); } }
となっている。kHeaderMask?は0x60000000なので、上位3ビットが011。これはEventCount?を示している。(A3200のマニュアルでも同様。A3100は見つけられず。)これ以外に対して、0-12ビット(0x1fff)を取り出してrdataを作っている。ただしTSのデータをはじいているわけではないので、そのまま使ってはいけないみたい。
TArtDecorderA3400を作らないといけない。TArtDecorderFactory?でRegister(TArtDecoderA3100::Instance());としているので、ANAROOT本体をいじらないといけない。これは来週かな?
V2718はClock generatorとしても使用できる。以下のような関数をlibbbcaenvme.cに作った。
void vme_setoutput_v2718(){ unsigned short val; unsigned int width; unsigned int period; // assignment // ch0: BUSY CLR // ch1: START // ch2: STOP // ch3: Clock (Pulser B) // ch4: SCL CLR CAENVME_SetOutputConf(BHandle,cvOutput0,cvDirect,cvActiveHigh,cvManualSW); CAENVME_SetOutputConf(BHandle,cvOutput1,cvDirect,cvActiveHigh,cvManualSW); CAENVME_SetOutputConf(BHandle,cvOutput2,cvDirect,cvActiveHigh,cvManualSW); CAENVME_SetOutputConf(BHandle,cvOutput3,cvDirect,cvActiveHigh,cvMiscSignals); CAENVME_SetOutputConf(BHandle,cvOutput4,cvDirect,cvActiveHigh,cvManualSW); // set ch3 for clock generator width=4;// 100ns width period=40;// 0.1us period -> 10MHz CAENVME_SetPulserConf(BHandle,cvPulserB,period,width,cvUnit25ns, 0,cvManualSW,cvManualSW); val = 0x0004; CAENVME_WriteRegister(BHandle,cvOutRegSet,val);// PulserB start }
SetPulserConf?の0はずっと出しつづけるinfinite。これをstart()の中で呼び出すと、Clock generatorとして動かすことができる。今は10MHzという使いづらい周波数になっているがどうにもできない。。。用意されている単位が25ns, 1.6us, 410us, 104msの4通り。この単位で8bit=0-255で指定するので、1kHzとかは作れない。。。とりあえず10Mhzとし、Visual scalerのCarry outを別のchに入れることによって時間測定をすることにする。(もったいないけど) これがどこまで正確なのかはよくわからないが、まあとりあえずよいことにする。