next up previous contents
Next: データ転送関連関数 Up: ファイル操作関連関数 Previous: open()close() 関数

ioctl() 関数

本ドライバでは 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 コマンド を示す.

 

実際のドライバーのコードは次のような構造になっている. 上述のように コマンドに対応したブロックへ飛び, そこで処理が行なわれるようになっている.




Kazuo Nakayoshi
Wed Jun 27 22:15:09 JST 2001