SCSI チェンジャをシステムに組み込む前に、SCSI アダプタを別途組み込んで おく必要があります。
ブート時に SCSI アダプタをプローブしているときに、 SCSI バスを走査しデバイスを探します。`Changer' タイプであると応答するデバイスが 見つかると、それらは ドライバに「アタッチ」されます。 2.1 より前のリリースの FreeBSD では、最初に見つかったデバイスが ch0 にアタッチされ、以後見つかったデバイスは順次、 ch1 などにアタッチされます。 2.1 から、あるデバイスがどの ch ユニットとして接続すべきかを指定 できるようになりました。このためのカーネル設定については、 scsi(4) を参照して下さい。
次に示す ioctl(2) 呼び出しがチェンジャに適用されます。これらはヘッダファイル Aq Pa sys/chio.h で定義されます。
cm_flags フィールドの CM_INVERT が設定されている場合、 メディアチェンジャは移動中にメディアを反転させるように指示されます。u_int cm_fromtype; /* 移動元エレメントのタイプ */ u_int cm_fromunit; /* 移動元エレメントの論理ユニット */ u_int cm_totype; /* 移動先エレメントのタイプ */ u_int cm_tounit; /* 移動先エレメントの論理ユニット */ u_int cm_flags; /* その他フラグ */
ce_flags の中で、CM_INVERT1 と CM_INVERT2 を設定 でき、これらはそれぞれ、最初のメディアと 2 番目のメディアを移動中に 反転させます。u_int ce_srctype; /* 移動元エレメントのタイプ */ u_int ce_srcunit; /* 移動元の論理ユニット */ u_int ce_fdsttype; /* 最初の移動先エレメントのタイプ */ u_int ce_fdstunit; /* 最初の移動先の論理ユニット */ u_int ce_sdsttype; /* 2番目の移動先エレメントのタイプ */ u_int ce_sdstunit; /* 2番目の移動先の論理ユニット */ u_int ce_flags; /* その他フラグ */
この機能はテストしていません。
cp_flags フィールドで CP_INVERT を設定でき、これは 移動中にピッカを反転させます。u_int cp_type; /* エレメントのタイプ */ u_int cp_unit; /* エレメントの論理ユニット */ u_int cp_flags; /* その他フラグ */
アプリケーションが CHIGSTATUS ioctl を用いてジュークボックスの 状態を調べるに先だって、ジュークボックスの諸元を問い合わせる際に、この 呼び出しを使用できます。u_int cp_npickers; /* ピッカの数 */ u_int cp_nslots; /* スロットの数 */ u_int cp_nportals; /* 持ち込み/持ち出しポータルの数 */ u_int cp_ndrives; /* ドライブの数 */
CHIOGSTATUS の呼び出しごとに、あるタイプの 1 つ以上のエレメントの状態が 問い合わされます。
アプリケーションは changer_element_status_request 構造体を ドライバに渡します。この構造体は次に示すフィールドを持ちます。
ドライバはこの構造体を読み込み、タイプ、論理ベースアドレス、エレメント数 を決定し、cesr_element_status フィールドが指す changer_element_status 構造体の配列にどの情報を返すかを知ります。アプリケーションは、 cesr_element_count 個の状態構造体 (次を見て下さい) を保持するのに 十分な大きさのメモリを割り当てる必要があります。cesr_flags にオプションで CESR_VOLTAGS を設定し、ボリュームタグ (バーコード) 情報をジュークボックスから 読み込んで返す必要があることを通知できます。u_int cesr_element_type; u_int cesr_element_base; u_int cesr_element_count; u_int cesr_flags; struct changer_element_status *cesr_element_status;
cesr_element_base フィールドと cesr_element_count フィールドは、 チェンジャの物理的構成に照らして正当な値でなければなりません。もし 正当な値でない場合、 CHIOGSTATUS ioctl は Er EINVAL エラーコードを返します。
エレメントについての情報は、changer_element_status 構造体の配列の中に 返されます。この構造体は少なくとも次に示すフィールドを持ちます。
ces_addr フィールドは、メディアチェンジャの座標系で表した エレメントのアドレスを保持します。ドライバはこれを使用しません。 診断目的のみで使用して下さい。u_int ces_addr; /* メディアチェンジャのエレメントアドレス */ u_char ces_flags; /* 以下の CESTATUS の定義を参照 */ u_char ces_sensecode; /* エレメントの追加センスコード */ u_char ces_sensequal; /* 追加センスコード修飾子 */ u_char ces_invert; /* 反転ビット */ u_char ces_svalid; /* 移動元アドレス (ces_source) が有効 */ u_short ces_source; /* メディアの移動元アドレス */ changer_voltag_t ces_pvoltag; /* プライマリボリュームタグ */ changer_voltag_t ces_avoltag; /* 代替ボリュームタグ */ u_char ces_idvalid; /* ces_scsi_id が有効 */ u_char ces_scsi_id; /* エレメントの SCSI id (ces_idvalid が非 0 の場合) */ u_char ces_lunvalid; /* ces_scsi_lun が有効 */ u_char ces_scsi_lun; /* エレメントの SCSI lun (ces_lunvalid が非 0 の場合) */
ces_flags フィールドに対し、次に示すフラグが定義されます。
すべてのエレメントタイプに対しすべてのフラグが有効とは限らないことに 注意して下さい。
テストに利用できたデバイスが必要なコマンドをサポートしていないという 事実により、 ドライバがサポートする機能の多くは、完全にテストできていません。これは、 代替ボリュームタグ、メディア反転、エレメントの持ち込み/持ち出し操作、 複数ピッカ操作、その他の機能があります。