本ドライバでは ioctl() 関数は, CAMAC の制御およびデータの読み込み/書き込
みを行なうために用いる.
CAMAC のデータ読み込み, データ書き込みに対応して read() /
write() 関数を使うことも考えたがCAMACのデータ読み込み, データ書き込みの
いずれの操作においても, まず SCSI CDB を 3929 に送らなければ
ならない. read() 関数を実装する際, この CDB の書き込み操作の実装を
するためのアイディアが思い浮かばなかったので, より柔軟な実装が可能な
ioctl()関数を用いることにした.
すなわち ioctl() の引数 cmd でシングルアクションやブロック転送等の
CAMAC 動作を指定することにした.
また ioctl() の引数 arg として CAMAC情報を記述した次の構造体(ブロック転
送とシングルアクションで異なる)を指定することにより
カーネル関数 copy_from_user() を使ってユーザ空間からカーネル空間(ドラ
イバ)へデータを渡したり copy_to_user()を使ってカーネル空間(ドライバ)か
らユーザ空間へデータを渡すことができるようにした.
一般に ioctl()関数は switch 文から成っており, 引数 cmd に対応したブロッ クに飛び, そこで処理を行なう. 表 7 に本ドライバで サポートしている ioctl()関数 のコマンドと対応する CAMAC/SCSI コマンド を示す.
実際のドライバーのコードは次のような構造になっている. 上述のように コマンドに対応したブロックへ飛び, そこで処理が行なわれるようになっている.