DAQメモ

NBBQでデータ収集するまでの道のりです。

SBS620

まずはVMEコントローラーで遊ぶ。@東工大。 ジャンパーを確認。 馬場さんのページにある通りsytem Jumper, BGO-BGI,、T-INTを設定。後 はマニュアルの135ページと同じ。 次にNBBQをセッティング。馬場さんのページにnbbq-mar18-2010.tar.gzと新し いバージョンがあったのでこれを入れ直す。 インストールメモにあるようにNBBQのconfig、make, make updateを してNBBQを再起動。 今度はSBS620をつないでおいたので、インストールメモのときのようなエラー はなかった。

vmestat

次にvmestatを試してみる。 何故かvmestatは実行のpermissionがなかったのでchmodで実行可能にしておく。

V792

とりあえずV792についてためす。 base addressをきめるrotary switchは全部0にした(後述を参照)。 test.vstaに
CTRL 0x0000 AMSR A32
V792 0x0000 GEO 12
V792 0x0000 RST
0000はrotary switchで設定したbase address。 ただしCTRLの0x0000は意味ない様子。この行は
/usr/nbbq/bin/cmdcme -am 0x9
が実行されるだけ。後に続く行のアドレスの指定の宣言と思われる? vmestatのREADMEではCAENのmoduleはA32にしておくとある。 これはmoduleのアドレスを32bitで指定するモード。(V792ではA24も可能。) さらにvmestat/ctrl.pmの中を見てみるとA32は0x09という値。これはmanualの p.38では
A32 non privileged(特権) data access
ということらしい。 これで
vmestat test.vsta
とするとV792のDTACKとBUSYのLEDが光る。とりあえず通信はできている様子。 GEOはRSTをかけないと反映されないとある。過去の実験で使っているvstaファ イルではRSTの前に書いてあるので真似する。でもこれって使っていないかも? V792のマニュアルでは
The geographical address is automatically read out at each RESET from
the SN5..SN1 lines of the PAUX connector.
とある。さらにAddressing via GEOgraphical addressのセクションでは
The module works in A24 mode only.
ともある。 今使っているV792はPAUX connectorついていない。しかもA32でつかう のでGEOは意味がない? ただ昔の実験のvstaを見るとGEOが書いてあるので一応 VMEクレートのさしている場所(0からカウント)を入れておくことにする。
※rawデータにはGEOが書かれている。 ANAPAWでデータを解析する時にはこれでmoduleを特定することになるのでregisterに inputしておく必要がある。

V895

rotary switchの配置はV792と違うので注意。 (V792は上から順になっている。これを1234と表現するならV895は2143の順番。) 3301に設定した。(後述のbase addressを参照) module側面のジャンパーでupdaing/non updatingを変更する様子。 non updatingにしておく。
V895用にv895.pmというのが用意されていない。なのでとり あえずcmdvmeコマンドで直接registerをいじる。 (最終的にはv895.pmを作るか?それともどこかにある?->ないとのこと。) 以下cmdvmeの覚書 試しにパルサーを入れてみてorから出力されるかを確認してみる。 試していてわかったのは、 Perttern inhibit registerでchをenableにしておかないと何も outputから出てこない。 電源投入直後はすべてdisableになっている。 とりあえずすべてのchを使う時には2進数で
1111111111111111 (1が16個)
=0xffff
という数をregisterに書き込めば良い。
またthresholdは電源投入後は-1mVとかになっている?ためにenableにすると orのLED光っぱなし。とりあえず適当な低過ぎないthresholdにしておいた方がgood。
最終的には使わないchはdisableにしておいた方が良い。thresholdの設定を さぼるとorからoutputでっぱなしになったりするので。

最終的に こんな スクリプトを作った。

V895用v895.pm

v895.pmをつくった。 CFDのv812を真似した、というかほとんど同じ。 MAJのcheckはしていないけどmanualの記述はV812と全く一緒なので大丈夫でしょう。 v895.vsta中でのTHEに指定するchは0-15。THEやWIDの値は255まで。 manualにはwidthはnon-linear relationとあるのでレジスタにinputした値と 実際の幅の関係を調べておいてた方がいいかもね。

inhibit patternを入力する時に v895.vstaに

V895 0x3301 PAT 0b1111111111111111
と2進数で与えるとわかりやすくて良い。 0bは2進数を示していて、これでどのchを使わないかがすぐにわかる。 ちなみに右端が0ch。

V895のwidth

標準のV895の幅は5-40nsまでしか調整できないが、 NEBULA用のV895はもっと広げられる仕様になっている。 図はregisterに書き込んだ値とORから出力されるパルスの幅をプロットしたも の。300nsくらいまで広げられる。(標準のおよそ8倍)

Base address

rotary switchでbase addressを設定するのだが、そのメモ。 例えばrotary switchで以下のように設定したとする。
base address bit <19..16> -> 1
base address bit <23..20> -> 2
base address bit <27..24> -> 3
base address bit <31..28> -> 4
こう設定した場合、registerにアクセスする場合は
cmdvme -ww 0x4321004a 0xffff
となる。(004aはV895におけるinhibit petternのregister。)

RPV130

昔の実験のDAQのdriver/の中を見ていると、こちらでいろいろ設定している? statfileでも見当たらないのできっとdriverのほうで書くのでしょう。

RPV130のジャンパーの設定

とりあえず以下の用に設定してみる。 とりあえずvmestatを使ってテスト。以下のようなrpv130.vstaを作成。
CTRL 0x1100 AMSR A16
RPV130 0x1100 WRT 0x0001
実行してみると、OUTの1ch目から200ns幅のパルスが出力される。 つまりpulse modeで出力がでている。NIMの信号としては高さが-1Vちょいと大 きめですが、とりあえずアドレスの設定はただしそう。

NBBQ

とりあえず基本的ないじりかた。 ※追記 RPV130を使う時には、コンパイルする時に以下の用に怒られる。
[nebula@nebula01 drivers]$ make
gcc -DMODULE -D__KERNEL__ -I/usr/src/linux/include -Wall -O2 -c
nbbqdrv.c
In file included from nbbqdrv.c:103:
startup.c: In function `startup':
startup.c:7: warning: implicit declaration of function `rpv130_clear'
startup.c:10: warning: implicit declaration of function
`rpv130_output'
どうやらVMIVMEを定義していないとrpv130.cがincludeされない。 これを回避するためにnbbqdrv.c内を以下の用に変更。
#ifdef VME
#ifndef VMIVME
#include "v775.c"
#include "v792.c"
#include "v785.c"
#include "v767.c"
#include "sis3300.c"
#else
// modified by kondo
//#include "babirldrvcaen.c"
//#include "rpv130.c"
//#endif
//#endif
#include "babirldrvcaen.c"
#endif
#include "rpv130.c"
#endif
これで無事コンパイルできました。

とりあえずできた?

結局blkmonitorで何かデータがきているのが確認できたところまでの軌跡。 これでnsstaするとblkmonitorで何かがみえた! RPV130は割り込みに使わず、単にoutput reg.として使えばよいのかな? 試しにRPV130を挿さずに動かしてもblkmonitorではデータを確認できる。 うーん割り込みの部分がいまいちわかっていない。 (例えばSBS-620を2枚挿しとかの場合はどうなるのだろうか?)

blkmonitor

blkmonitorとV792のデータ構造についてまとめてみました。

VMEコントローラー4枚挿し

まとめてばばばっと書いたのでぬけているかもです。 kernel version 2.6, nbbq-aug19-2011で複数のSBS-620を使用する場合のメモ。 bb-sbs620/bb-sbs620.c
//added for ISERIES
EXPORT_SYMBOL(sbs620_set_amsr_i);
EXPORT_SYMBOL(sbs620_vread16_i);
EXPORT_SYMBOL(sbs620_vread32_i);
EXPORT_SYMBOL(sbs620_vwrite16_i);
EXPORT_SYMBOL(sbs620_vwrite32_i);
#endif
を追加。 bb-sbs620/bb-sbs620.h
extern void sbs620_set_amsr_i(unsigned char am, int dn);
extern void sbs620_vread16_i(unsigned long addr,short *data, int dn);
extern void sbs620_vread32_i(unsigned long addr,long *data, int dn);
extern void sbs620_vwrite16_i(unsigned long addr,short *data, int dn);
extern void sbs620_vwrite32_i(unsigned long addr,long *data, int dn);
extern void sbs620_dma_vread32_start_i(unsigned int addr,int size, int dn);
.
.
.
コメントをはずす。 bb-sbs620/Module.symversを消去。 nbbqvio/nbbqvio.c
// added for ISERIES
#ifndef ISERIES
#define ISERIES
#endif
//
を追加と、
#ifdef ISERIES
//  unsigned int dn = 0;
  int dn = 0;
#endif
と修正。他はすべてintだったので。これはいらないかも? 後はcmdvme-i(libnbbqvio-i.cも必要)、vmestat-iを追加。 またkernel 2.6はPCを再起動すると/dev/***がなくなるので、いちいち起動す るたびに
mknod -m 0666 /dev/nbbqvio0 c 126 0
mknod -m 0666 /dev/nbbqvio1 c 126 1
mknod -m 0666 /dev/nbbqvio2 c 126 2
mknod -m 0666 /dev/nbbqvio3 c 126 3
が必要。これはこの書き方でいいのか確認必要。 (Makefileを参考にした) いちいち打つのは面倒なので/etc/init.d/nbbqに追加すれば良い。( ここを参照) これでvmestat-iでv895の刺さっているVMEクレートにアクセスできました! ただしnbbqvio3はdmesgすると
3 : SBS620 found at 0x0000dc00 0x00000000 0xf9f90000 0x00000000 on irq
-101187584.
allocation failed: out of vmalloc space - use vmalloc= to
increase size.
0 14000
1 15000
2 16000
3 17000
と怒られていて、他のnbbqvio0やnbbqvio1と同様に
vmestat-i temp.vsta 3
とやるとPC落ちる。。。解決する必要あり。

解決方法

bb-sbs620/sbs620.cの
vreg[dn].remote = ioremap(sbsconfig[dn].addr[3],SBS620_REMOTE_SIZE);
のところで怒られている。ここでのSBS620_REMOTE_SIZEはsbs620.hで
//#define SBS620_REMOTE_SIZE 0x20000000
#define SBS620_REMOTE_SIZE 0x10000000
と半分にすると大丈夫になった。 馬場さんに聞いてみたところ、アドレス空間の大きさを決めているとのこと。 例えば0x1000にすると0から0x1000までしか使えず、V792のスレッショルドの設定 0x1080は使えなくなる。 V775/V785/V792は使っているのが0x2000まで、Multihit TDCでも0x10000ぐら いらしいので上の変更でも問題ないとのこと。 次にnbbqdrv。def-sbs620.hに
 #ifdef ISERIES
#define set_amsr_i sbs620_set_amsr_i
#define vread16_i  sbs620_vread16_i
#define vread32_i  sbs620_vread32_i
#define vwrite16_i sbs620_vwrite16_i
#define vwrite32_i sbs620_vwrite32_i

#define vme_define_intlevel_i   sbs620_define_intlevel_i
#define vme_enable_interrupt_i  sbs620_enable_interrupt_i
#define vme_disable_interrupt_i sbs620_disable_interrupt_i
#define vme_check_interrupt_i   sbs620_check_interrupt_i
#define vme_read_intvector_i    sbs620_read_intvector_i
#define vme_dma_vread32_start_i sbs620_dma_vread32_start_i
#define vme_dma_vread32_store_i sbs620_dma_vread32_store_i
#endif
。あとbb-vme.hに以下を追加。
extern void vme_enable_interrupt_i(int dn);
extern void vme_disable_interrupt_i(int dn);
extern void vme_define_intlevel_i(int level,int dn);
extern int vme_check_interrupt_i(int dn);
extern int vme_read_intvector_i(int dn);
あとはbbmodules.hに
#define ISERIES
を宣言しておく。 v792.cなどの各moduleのドライバには
int v792_segdata_i(unsigned long maddr,int dn){
.
.
.
などを用意すればOK。 でもまだだめ。これでbbrlcomからnsstaするとCan't open /dev/nbbqdrvとい われる。 これは/usr/nbbq/common.hで
#define NBBQ_MAJOR     124
となっているのに対して
mknod -m 0666 /dev/nbbqdrv c 122 0
としてしまったため。common.hを124から122にしたらOK! このMajor番号は/proc/devicesに一覧がある。被っていない事を確認すべし。 こんなんでようやくペデスタルのようなものがblkmonitorでみれました。

vmestat

vmestatはチャネル数が増えると長くなって確認が大変。コメントを付けたい。 vmestatに以下の行を追加するとよいです。
open(IN,"< $ARGV[0]");
@data = ;
close(IN);

foreach $line (@data){
# added by kondo --->
    if ($line=~ /^\#/){
        print $line;
        next;
    }
# <-----
  @val = '';
これで#で始まる行はコメントになります。