CC/NETで。

本当にどうでもいいことで、まったくもって個人的な覚書になりますが、一応Linuxということで。CC/NETの使い方というかCAMAC使い方講座を企画中。CC/NETはかなりお手軽な選択肢のひとつであるので、使ってみる。(その他の解ではCCをコントロールするホストが必要。それはそれで面倒。)

CC/NETで提供されているライブラリは2種類。2種類といっても、CC/NET用のデバイスドライバを叩くための関数群と、一般的なCAMACライブラリとの整合性をとるためのいわゆるラッパー。

今回のメモはラッパー側の話。正直関数名を置き換えるタイプのものであれば、そのように書いておけばいいものを、なんだか中途半端なコーディングになっている。問題はLAMを有効化するルーチン。LAMを有効にするには


int CENLAM( int crate, int mask );

という関数を使う(関数の名前はもしかしたら違うか?)。これは

int cam_enable_lam( int fd, int mask );

という関数のラッパーだとしよう、それなら

int CENLAM( int crate, int mask ){
return( cc_enable_lam( ccfd, mask ) );
}

と、しておきたいところ。そうなっていれば話が早いのに、なぜか提供されているソースはcam_enable_lamの中身を中途半端にコピーしたもの。その中ではCC/NETにLAMを有効化させるように書き込みを行い、その後「PCIバスのインタラプトを有効」にしている。なのにラッパー側ではCC/NETにLAMを有効化させるが、PCIバスのインタラプト有効化が抜け落ちてしまっている。

ラッパーを利用して、モジュールからのLAMによるインタラプトのサンプルを作ってみたものの、動く気配全くなし。CC/NETのステータス用LEDではLAMが有効になっているし、どうやらLAM自体はモジュールから出ている様子。なのにCC/NET側でインタラプトを受ける用意が出来ていないのだからしょうがない。

モジュールが壊れているのかしら?LAMが立たない設定になっているのかしら?とモヤモヤしたまま数日を過ごしてしまった。もったいない。

同時につかっていた別のモジュールのクリアボタンが壊れていたものだから、なんとなくLAMをだそうとしていたモジュールも疑ってしまっていたのが敗因ともいえるのだが、、、

とりあえずは解決だからよいのではある。