Technical Description of USB-CAMAC Device Driver


目的

「CAMAC と PC/AT機を USB接続し, ユーザビリティの優れた DAQ システムを 構築すること」

概要

本システム開発の目的は「ユーザビリティ」の追求である. 小規模な原子核・素粒子実験の データ収集(DAQ)システムでは, デスクトップ PC とバスアダプタを使用して CAMAC や VME と データ転送を行なうスタイルが一般的である. 従って DAQ で使用可能な PC はおのずと 限定(専用カードをインストール済み か, もしくは新たにインストールする必要があるという 意味で)されていた. しかし, PC とその周辺機器との接続バスとしてほぼデファクト・ スタンダードとなりつつある USB を利用するこ とで 上述のような専用カードを必要とせず USB ポートを持つ PC から DAQ が可能となる. より具体的なイメージとしては, 本システムの ソフトウエア(USB-CAMAC ドライバおよび CAMAC ライブラリ)を インストールすれば NOTE PC や専用カードがインストールされて いない, いわゆる普通の PC を使って CAMAC DAQ システムが可能となる. ユーザは, 専用 カードのインストール作業から開放される. 本開発のキーワードである USB,CAMAC,Linux DAQ について簡単な説明を行なう. USB は 1994 年に Compaq, Intel, Microsoft, NEC により開発がスタートした. その仕様(version 1)は 1996 年 1 月に最初にリリースされ, 最新のオフィシャル version 1.1 は 1998 年 9 月にリリースされた. ドキュメントはまだ作成中であり, 1999 年に version 2.0 がアナウンスされた. USB機器 は、Windows98 や Mac OS 8.1 以降から利用可能である。USB に 対応したキーボード、マウス、スキャナ等 の機器は,電源を入れた状態で接続 ケーブルの抜き差しが可能で取扱が簡単である. USB1.1 の細大転送速度は,12Mbps であるが USB2.0 では 480Mbps まで引き上げられて いる. USB の特徴は USB ホストを頂点とした階層構造である. すべてのデバイス に関する通信はホストにより開始され, デバイス同士は直接通信することはできない.
CAMAC は 1960年代の規格で素粒子原子核実験の標準電子回路である。現在でも 数多く実験に使用されている。
KEK オンライングループは,Linux による DAQ システムの整備を行なってきた。 Linux をインストールした PC/AT 機から CAMAC や VMEbus にアクセスしデータ収集が 可能となり,現在多くのテストベンチや実験用 DAQ に使用されている. Linux を OS とする高性能/低価格な PC/AT 機によるデータ収集システムは,これからの DAQ の主流になりつつある.
現段階で は既存のハードウエ アを極力利用したいので、SCSI インターフェイス付き CAMAC Crate Controller と USB-SCSI 変換ケーブルを用いて USB-SCSI 経由 で CAMAC へアクセスすることを試 みる。USB2.0 を用いた大規模な DAQ システム の構築が可能かどうかの調査を今回開発す るシステムを使って行う。

ハードウエア概要

現時点では,USB インターフェイス付の CAMACクレートコントローラが commercial available でないので既存の機器の組合せにより CAMAC を USB 経由で制御する 方法をとった.Kinetic 社の Model 3929 は SCSI インターフェイス付の CAMAC クレートコントローラ(CC)であり 10 年前から存在する.ただ CAMAC CC の中では 特殊な存在であり国内では広く普及しているわけではない.10 年前は,SCSI は ワークステーションや一部の PC では標準の I/O インターフェイスであったので 計算機との connectability は他の CC と比べると優れていたし,現在もそうである. この CC に USB-SCSI 変換ケーブルをつけるとハードウエアとしては,USB 装置と なる.

ソフトウエア概要

前述のようにハードウエアとしては,既存のものの組合せであるがソフトウエア の開発は必要である.具体的には USB-SCSI 変換を介して CAMAC と対話する ためのデバイスドライバが必須である.Linux の USB デバイスドライバに 関しては既にそのフレームワークが決められており,それに従いデバイス ドライバーを作成する必要がある.デバイスドライバのイメージとしては, USB 転送により CAMAC コマンドを SCSI のデータとして CC へ送る.CAMAC コマンドがリードの場合は,その後 CC からデータを USB 転送で受け取ると、 いうものである. Linux の USB デバイスドライバのフレームワークおよびドライバの詳細な説明に ついては,後述する.

Kinetic Model 3929-Z1A の機能

SCSI クレートコントローラ 3929-Z1A でのCAMAC動作について説明する. ここでは, SCSI コマンドとCAMAC操作の対応について説明をする. 計算機から SCSI 機器に対する要求は, Command Descriptor Block(CDB) をターゲット へ送ることにより行なわれる。3929 は SCSI のグループ 0(6 バイトコマンド)と グループ 1(10 バイトコマンド)をサポートしている。 以下にそのコマンドを示す。

CODECOMMAND
0x00 TEST UNIT READY
0x03 REQUEST SENSE
0x08 RECIEVE
0x0A SEND
0x12 INQUIRY
0x1D SEND DIAGNOSTIC
0x06 READ LAM PATTERN
0x09 SINGLE
0x0C SETUP
0x0D REGISTER ACCESS
0x0E RESUME LIST
0x20 EXECUTE LIST
0x22 BLOCK
0x23 LOAD LIST

CAMAC シングルアクション

CAMAC シングルアクションを実行させるには,以下のような CDB を 3929 へ送る.

BYTEDATA
0x00 0x09(fix)
0x01 0x00(fix)
0x02 MODE CONTROL
0x03 NAF HIGH BYTE
0x04 NAF LOW BYTE
0x05 CONTROL BYTE

もし NAF がCAMAC制御操作を指定しているなら、データフェイズはなく, CAMACのリード またはライト操作を指定しているなら、コマンドフェイズの後に続いてデータ転送が 行なわれる。データフェイズ中に転送されるバイト数は、CDB のCDB の Mode Control バイト で指定されたデータ長に依存する。8 bit 転送は転送は 1 バイトを要求し 16 bit は 2 バイトを 24 bit は 4 バイトを要求する。3929 によりCAMAC操作の実行が終了した後 ステータスバイトが送られる。CAMAC操作がエラーのため中断された場合は CHECK CONDITION が送られる。このエラーはCAMAC Q応答やX応答等のようなパラメタに依存する。

CAMAC ブロック転送

CAMAC ブロック転送を実行させるには, 以下のような CDB を 3929 へ送る.

BYTEDATA
0x00 0x22(fix)
0x01 0x00(fix)
0x02 MODE CONTROL
0x03 NAF HI BYTE
0x04 NAF LO BYTE
0x05 TRANSFER BYTE COUNT HIGH
0x06 TRANSFER BYTE COUNT MIDDLE
0x07 TRANSFER BYTE COUNT HIGH
0x08 0x00(fix)
0x09 CONTROL BYTE

このコマンドの opcode は 0x22 である。3929 が CDB を受信後、データフェイズに なる。データ転送の方向は CAMAC ファンクションコードに依る。一旦データ転送が 始まると転送量に達するかエラー状態が起こるまで続けられる。3929 によるブロック 転送操作が完了後、ステータスビットが送られる。GOOD または CHECK CONDITION ステータスのいずれかが返される。CHECK CONDITION はCAMAC ブロック転送操作が エラーにより中断されたときに返される。このエラーはCAMAC Q-Response, X-Respose などのパラメータに依存する。

USB-CAMAC デバイスドライバ

USB-CAMAC デバイスドライバの構造を理解するためには,LinuxにおけるUSBデバイス ドライバのフレームワークおよびUSB,SCSI,CAMACについて説明しなければならない。 それぞれについて個別に説明を加えるのではなく,実際のデバイスの動作を通して ドライバ内部でどのような処理が行われているかを説明する。 はじめにUSB装置を接続したときに行われる処理を説明し,次にUSB装置を切り離した ときに行われるドライバの処理を説明し,最後にCAMACに対してリードコマンドを 発行した時のドライバの処理を具体的に説明する。

Linux USB デバイスドライバの構造

Linux USB デバイスドライバは次のような構造をもつ。 USB コアドライバは USBデバイスドライバが使用する関数群を提供する。USB ホスト コントローラドライバはUSB ホストで使用されているコントローラチップ用の ドライバである。現在 Intel 系の UHCI と OHCI の2種類が存在し、従って そのドライバも2つ存在する。USB デバイスドライバは、各種 USB装置に対応する ドライバであり我々はアプリケーションからそのドライバのファイル操作の システムコールを発行して装置を制御する。

USB デバイスドライバ

USB デバイスドライバは通常のキャラクタ型デバイスドライバとほぼ同じである。 特徴的な点はUSBのホットスワップに関連する次の2つの関数である。 probe 関数は USB 装置が接続した(USB デバイスドライバが insmod された)ときに USBコアドライバにより呼び出される 関数である。 disconnect 関数はUSBデバイスが取り外されたときにUSBコアドライバから呼び出されて probe 関数で確保されたシステムリソースの解放を行なう。 上記の2つの関数以外にopen(), read(), write(), ioctl(), close() 等の通常のファイル操作関数 を定義して使用できる。

ドライバのロード

Linux のデバイスドライバはモジュール化できる. これは OS を起動した後に ドライバをカーネルに組み込むことを可能にし, また開発時のデバッグを容易 にする.

K3929 接続時の処理

K3929 切断時の処理

CAMACシングル動作の処理

CAMACブロック転送の処理

性能評価

CAMAC シングルアクションとブロック転送の速度を測定した。 CAMAC シングルアクションは Switch Register のデータを読み その時間を測定して転送速度を求めた。ブロック転送はCAMAC メモリモジュールからデータ長を変えながらデータを読み込み それにかかった時間を測定して速度とオーバヘッドを求めた。

まとめ


前のページ 次のページ 目次