CD(4) FreeBSD カーネルインタフェースマニュアル CD(4)
名称
cd − SCSI CD-ROM ドライバ |
書式
device cd |
device cd1 at scbus0 target 4 lun 0 |
|
"CHANGER_MIN_BUSY_SECONDS=3" |
|||||
|
"CHANGER_MAX_BUSY_SECONDS=11" |
解説 |
cd ドライバは、 SCSI CD-ROM (コンパクトディスク-読み出し専用メモリ) ドラ イブをサポートします。通常ディスクと同じように見せるために、 cd ドライバ は、 CD-ROM 全体をカバーする 1 つのパーティションからなるパーティション テーブルを合成します。このパーティションテーブルを disklabel(8) を用いて 修正することは可能ですが、その修正は CD-ROM をアンマウントするまでの間の み有効です。一般的に、このインタフェースは wd(4) や da(4) で述べられてい るものと同様です。 SCSI アダプタがブート中にプローブされる際、 SCSI バス上のデバイスが走査さ れます。見つかったデバイスのうち、タイプ CDROM (タイプ 5) あるいは WORM ( タイプ 4) と応答したものは cd ドライバにアタッチされます。 FreeBSD 2.1 以 前のバージョンでは、最初に見つかったデバイスは cd0 としてアタッチされ、そ の次が cd1 のようになっていました。 FreeBSD 2.1 からは、デバイスが何番の cd ユニットとなるべきか指定できます。カーネル設定の詳細については scsi(4) を参照して下さい。 システムユーティリティ disklabel(8) を用いて、合成されたディスクラベル構 造体を読み出せます。この構造体には、必要となる CD-ROM のサイズに関する正 しい値が含まれます。 |
カーネル設定
システム設定に関わらず、任意の数の CD-ROM デバイスをシステムにアタッチで きます。全てのリソースは動的にアロケートされます。 |
IOCTL
SCSI CD-ROM ドライブに適用される以下の ioctl(2) 呼び出しが、ヘッダファイ ル 〈sys/cdio.h〉 と 〈sys/disklabel.h〉 で定義されています。 |
DIOCGDINFO
DIOCSDINFO CDIOCCAPABILITY struct ioc_capability { |
u_long |
|||||
play_function; |
|||||
0x00000001 |
|||||
/* tracks/index 指定で再生可能 */ |
|||||
CDDOPLAYMSF |
|||||
0x00000002 |
|||||
/* msf (分秒フレーム) 指定で再生可能 */ |
|||||
CDDOPLAYBLOCKS |
|||||
0x00000004 |
|||||
/* ブロック指定で再生可能 */ |
|||||
CDDOPAUSE |
|||||
0x00000100 |
|||||
/* 出力を一時停止可能 */ |
|||||
CDDORESUME |
|||||
0x00000200 |
|||||
/* 出力を再開可能 */ |
|||||
CDDORESET |
|||||
0x00000400 |
|||||
/* ドライブを完全にリセット可能 */ |
|||||
CDDOSTART |
|||||
0x00000800 |
|||||
/* オーディオ開始可能 */ |
|||||
0x00001000 |
|||||
/* オーディオ停止可能 */ |
|||||
0x00002000 |
|||||
/* オーディオピッチ調整可能 */ |
|||||
u_long |
|||||
routing_function; |
|||||
0x00000001 |
|||||
/* ボリューム設定の読み出し可能 */ |
|||||
0x00000002 |
|||||
/* ボリュームの設定可能 */ |
|||||
CDSETMONO |
|||||
0x00000100 |
|||||
/* 出力をモノラルに設定可能 */ |
|||||
0x00000200 |
|||||
/* 出力をステレオに設定可能 (デフォルト) */ |
|||||
CDSETLEFT |
|||||
0x00000400 |
|||||
/* 出力を左のみに設定可能 */ |
|||||
CDSETRIGHT |
|||||
0x00000800 |
|||||
/* 出力を右のみに設定可能 */ |
|||||
CDSETMUTE |
|||||
0x00001000 |
|||||
/* 出力のミュート可能 */ |
|||||
0x00008000 |
|||||
/* ダイレクトルーティング制御可能 */ |
|||||
u_long |
|||||
special_function; |
|||||
CDDOEJECT |
|||||
0x00000001 |
|||||
/* トレーのオープン可能 */ |
|||||
CDDOCLOSE |
|||||
0x00000002 |
|||||
/* トレーのクローズ可能 */ |
|||||
CDDOLOCK |
|||||
0x00000004 |
|||||
/* トレーのロック可能 */ |
|||||
0x00000100 |
|||||
/* 目次の読み出し可能 */ |
|||||
CDREADENTRIES |
|||||
0x00000200 |
|||||
/* 目次エントリの読み出し可能 */ |
|||||
CDREADSUBQ |
|||||
0x00000200 |
|||||
/* サブチャネル情報の読み出し可能 */ |
|||||
0x00000400 |
|||||
/* サブコード R-W の読み出し可能 */ |
|||||
CDHASDEBUG |
|||||
0x00004000 |
|||||
/* トレーがダイナミックデバッグ機能を持つ */ |
}; |
CDIOCPLAYTRACKS
(struct ioc_play_track) 指定されたトラックアドレスお よび長さに基づいてオーディオの再生を開始します。この 構造体は以下のように定義されます: struct ioc_play_track |
u_char |
|||
start_track; |
|||
u_char |
|||
start_index; |
|||
u_char |
|||
end_track; |
|||
u_char |
|||
end_index; |
}; |
CDIOCPLAYBLOCKS
(struct ioc_play_blocks) 指定されたブロックアドレス および長さに基づいてオーディオの再生を開始します。こ の構造体は以下のように定義されます: struct ioc_play_blocks |
int |
|||
blk; |
|||
int |
|||
len; |
}; |
CDIOCPLAYMSF
(struct ioc_play_msf) 指定された「分-秒-フレーム」と 長さに基づいてオーディオの再生を開始します。この構造 体は以下のように定義されます: struct ioc_play_msf |
u_char |
|||
start_m; |
|||
u_char |
|||
start_s; |
|||
u_char |
|||
start_f; |
|||
u_char |
|||
end_m; |
|||
u_char |
|||
end_s; |
|||
u_char |
|||
end_f; |
}; |
CDIOCREADSUBCHANNEL
(struct ioc_read_subchannel) この構造体で指定された ロケーションのサブチャネルから情報を読み出します。 struct ioc_read_subchannel { |
u_char address_format; |
1 |
|||||
2 |
||||||
u_char data_format; |
||||||
0 |
||||||
1 |
||||||
2 |
||||||
3 |
||||||
u_char track; |
||||||
int |
data_len; |
|||||
struct cd_sub_channel_info *data; |
}; |
CDIOREADTOCHEADER
(struct ioc_toc_header) マウントされた CD-ROM の目次 に関する情報のサマリを返します。この情報は以下の構造 体に格納して返されます。 struct ioc_toc_header { |
u_short len; |
||
u_char starting_track; |
||
u_char ending_track; |
}; |
CDIOREADTOCENTRYS
(struct ioc_read_toc_entry) 指定された目次エントリか らの情報を返します。 (そう、このコマンド名のスペルは 間違っています。) 引数の構造体は以下のようになりま す: struct ioc_read_toc_entry { |
u_char |
|||
address_format; |
|||
u_char |
|||
starting_track; |
|||
u_short |
|||
data_len; |
|||
struct cd_toc_entry *data; |
}; |
CDIOCSETPATCH
(struct ioc_patch) 様々なオーディオチャネルを様々な 出力チャネルに割り当てます。引数の構造体は次のように 定義されます: struct ioc_patch { |
u_char |
|||
patch[4]; |
|||
/* 各チャネルに対し 1 要素が対応 */ |
}; |
CDIOCGETVOL
CDIOCSETVOL struct ioc_vol |
u_char |
|||
vol[4]; |
|||
/* 各チャネルに対し 1 要素が対応 */ |
}; |
CDIOCSETMONO
全ての出力チャネルを全ての入力チャネルに割り当てま す。 CDIOCSETSTEREO CDIOCSETMUTE CDIOCSETLEFT CDIOCSETDEBUG CDIOCPAUSE CDIOCRESET CDIOCSTART CDIOCALLOW CDIOCEJECT CDIOCCLOSE CDIOCPITCH struct ioc_pitch |
short |
|||
speed; |
}; |
注意
cd ドライバで制御されているドライブ中の CD-ROM が入れ換えられた場合、メ ディア交換操作によってカーネル内のディスクラベルと関連情報が無効化されま す。データ破損を避けるため、当該デバイスを参照するオープンファイルデスク リプタがなくなるまで、当該デバイスに対するアクセスは全て破棄されます。こ の間、新たなオープン操作は全て拒否されます。当該デバイスを参照するオープ ンファイルデスクリプタがなくなると、後続の最初のオープン操作により、当該 ドライブに対する新しいパラメータ一式 (ディスクラベルを含む) がロードされ ます。 cd ドライバ中のオーディオコードは SCSI-2 標準のオーディオコマンドのみサ ポートします。多くの CD-ROM 製造業者はこの標準規格に従っていないため、 オーディオが動作しない CD-ROM ドライブが数多く存在します。より一般的な 「ダメな」 CD-ROM ドライブをサポートする作業も計画されていますが、まだ実 行に移されていません。 |
チェンジャ操作
このドライバは LUN ベースの CD チェンジャのサポートを内蔵しています。 LUN ベースの CD チェンジャとは、2 つ以上の CD を保持できるが、 CD 再生機構を 一組しか持たないドライブです。このドライブ内の各 CD は、 SCSI バス上の別 々の論理ユニットとして現れます。この cd ドライバは自動的に LUN ベースの チェンジャを認識し、内部のスケジューラを通してチェンジャに対するコマンド を送り出します。このスケジューラは、チェンジャ中の異なる LUN に同時にコマ ンドを送ることで引き起こされる、チェンジャの「スラッシング」を防ぎます。 スケジューラは、ドライバが特定の LUN で消費するタイムクァンタムの最小値と 最大値を管理します。最小値とは、たとえその LUN に処理中の I/O がない場合 でも、その LUN で費すことが保証されている最小時間量です。最大値とは、他の LUN に処理中の I/O がある場合に、ある LUN でチェンジャが費す最大時間量で す。他の LUN に処理中の I/O がない場合は、ドライバはある LUN に対するアク セスに上限を設けません。 最小および最大タイムクァンタムはカーネルオプションや sysctl 変数を通じて 変更できます。カーネルオプションは以下の通り: |
options CHANGER_MIN_BUSY_SECONDS=3
options CHANGER_MAX_BUSY_SECONDS=11 sysctl 変数は以下の通り: kern.cam.cd.changer.min_busy_seconds ユーザは、sysctl 変数を通じて最小および最大タイムアウトを試し、自分のチェ ンジャに最適な値を見つけるとよいでしょう。一旦、自分のチェンジャに対する 最適タイムアウトが決まれば、それをカーネル設定ファイルに記述できます。 自分のシステムに LUN ベースのチェンジャが存在すれば、ブートプロセスが進む に従って、そのチェンジャの様々な LUN に対するプローブメッセージが表示され ることに気づくでしょう。これは正常であり、チェンジャのスケジューリング コードによって引き起こされます。 関連ファイル |
/dev/cd[0-9][a-h]
ブロックモード CD-ROM デバイス 診断 |
ありません。 |
関連項目
scsi(4), da(4), disklabel(5), disklabel(8), cd(9) |
バグ
ioctl() に対する 3 番目の引数に用いられる構造体の名前は適当ではありませ ん。また、 ioctl() コマンドの中にはスペルミスがいくつも残っています。 現在のところ、異なる CD チェンジャに対して異なる最小および最大タイムアウ ト値を設定する機構はありません。カーネルオプションあるいは sysctl 変数で 設定したタイムアウト値はシステムにある LUN ベースの CD チェンジャ全てに適 用されます。このようなサポートを実装することは可能ですが、少なくとも sysctl による実装はあまりエレガントではありません。というのは、現在の sysctl コードではコンパイル後のノード追加を取り扱うことができないためで す。それゆえ、動的に大きさを決定する sysctl 変数を用意し、ユーザレベルの ユーティリティを用いてタイムアウト値を取得ないし設定することになるでしょ う。カーネル設定ファイル中で、異なる CD デバイスに対して別々のタイムアウ トを指定できるようにするには、 config(8) を修正し、固定的に記述した cd デ バイスに 2 つのタイムアウト値をサポートするようにしなければならないかもし れません。 |
歴史
本 cd ドライバは、Julian Ellischer が記述し 386BSD 0.1 に登場した cd ドラ イバをベースにしています。 cd ドライバの CAM バージョンは Kenneth Merry が記述し、 FreeBSD 3.0 で最初に登場しました。 FreeBSD October 10, 1998 FreeBSD |