スポンサーリンク

CD(4) FreeBSD カーネルインタフェースマニュアル CD(4)

名称

cd − SCSI CD-ROM ドライバ

書式

device cd

device cd1 at scbus0 target 4 lun 0

options

"CHANGER_MIN_BUSY_SECONDS=3"

options

"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
(struct disklabel) 当該ドライブに対するディスクラベ ルのカーネル内コピーを読み書きします。ディスクラベル は scsi inquiry コマンドから読み取った情報で初期化さ れます。その値はブート時に表示されたものと同一のはず です。この構造体は disklabel(5) で定義されています。

CDIOCCAPABILITY
(struct ioc_capability) 当該ドライブがサポートしてい る機能に関する情報を取り出します。情報は以下の構造体 で返されます。

struct ioc_capability {

u_long

play_function;
#define CDDOPLAYTRK

0x00000001

/* tracks/index 指定で再生可能 */
#define

CDDOPLAYMSF

0x00000002

/* msf (分秒フレーム) 指定で再生可能 */
#define

CDDOPLAYBLOCKS

0x00000004

/* ブロック指定で再生可能 */
#define

CDDOPAUSE

0x00000100

/* 出力を一時停止可能 */
#define

CDDORESUME

0x00000200

/* 出力を再開可能 */
#define

CDDORESET

0x00000400

/* ドライブを完全にリセット可能 */
#define

CDDOSTART

0x00000800

/* オーディオ開始可能 */
#define CDDOSTOP

0x00001000

/* オーディオ停止可能 */
#define CDDOPITCH

0x00002000

/* オーディオピッチ調整可能 */

u_long

routing_function;
#define CDREADVOLUME

0x00000001

/* ボリューム設定の読み出し可能 */
#define CDSETVOLUME

0x00000002

/* ボリュームの設定可能 */
#define

CDSETMONO

0x00000100

/* 出力をモノラルに設定可能 */
#define CDSETSTEREO

0x00000200

/* 出力をステレオに設定可能 (デフォルト) */
#define

CDSETLEFT

0x00000400

/* 出力を左のみに設定可能 */
#define

CDSETRIGHT

0x00000800

/* 出力を右のみに設定可能 */
#define

CDSETMUTE

0x00001000

/* 出力のミュート可能 */
#define CDSETPATCH

0x00008000

/* ダイレクトルーティング制御可能 */

u_long

special_function;
#define

CDDOEJECT

0x00000001

/* トレーのオープン可能 */
#define

CDDOCLOSE

0x00000002

/* トレーのクローズ可能 */
#define

CDDOLOCK

0x00000004

/* トレーのロック可能 */
#define CDREADHEADER

0x00000100

/* 目次の読み出し可能 */
#define

CDREADENTRIES

0x00000200

/* 目次エントリの読み出し可能 */
#define

CDREADSUBQ

0x00000200

/* サブチャネル情報の読み出し可能 */
#define CDREADRW

0x00000400

/* サブコード R-W の読み出し可能 */
#define

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;
#define CD_LBA_FORMAT

1
#define CD_MSF_FORMAT

2

u_char data_format;
#define CD_SUBQ_DATA

0
#define CD_CURRENT_POSITION

1
#define CD_MEDIA_CATALOG

2
#define CD_TRACK_INFO

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;

};
要求データは、 data が指す大きさ data_len の領域に格 納されます。

       CDIOCSETPATCH

(struct ioc_patch) 様々なオーディオチャネルを様々な 出力チャネルに割り当てます。引数の構造体は次のように 定義されます:

struct ioc_patch {

u_char

patch[4];

/* 各チャネルに対し 1 要素が対応 */

};

       CDIOCGETVOL

CDIOCSETVOL
(struct ioc_vol) 出力チャネルのボリューム設定に関す る情報を取得 (あるいは設定) します。引数の構造体は次 のとおりです:

struct ioc_vol
{

u_char

vol[4];

/* 各チャネルに対し 1 要素が対応 */

};

       CDIOCSETMONO

全ての出力チャネルを全ての入力チャネルに割り当てま す。

CDIOCSETSTEREO
左入力チャネルを左出力チャネルに、右入力チャネルを右 出力チャネルに、それぞれ割り当てます。

CDIOCSETMUTE
ボリューム設定を変更せずに出力をミュートします。

CDIOCSETLEFT
CDIOCSETRIGHT
両方の出力チャネルを左 (または右) 入力チャネルに割り 当てます。

CDIOCSETDEBUG
CDIOCCLRDEBUG
対応するデバイスに対するデバッグ機能をオン (またはオ フ) にします。

CDIOCPAUSE
CDIOCRESUME
オーディオ再生を一時停止 (または再開) します。読み出 しヘッドの位置はリセットしません。

CDIOCRESET
ドライブをリセットします。

CDIOCSTART
CDIOCSTOP
ドライブに対し、 CD-ROM の回転開始 (または停止) を指 示します。

CDIOCALLOW
CDIOCPREVENT
ドライブに対し、 CD-ROM ディスクの手動による取り出し を許可 (または禁止) します。この機能をサポートしない ドライブがあります。

CDIOCEJECT
CD-ROM を取り出します。

CDIOCCLOSE
ドライブに対し、ドアを閉じメディアをロードするよう指 示します。この機能をサポートしないドライブがありま す。

CDIOCPITCH
(struct ioc_pitch) この機能をサポートするドライブに 対し、オーディオを通常より早い速度ないし遅い速度で再 生するよう指示します。 speed の値が -32767 から -1 までの間なら遅い速度で再生します。値が 0 なら通常速 度です。値が 1 から 32767 の場合は早い速度で再生しま す。分解能が 16 ビット未満のドライブの場合、エラーを 出さず、単に下位ビットが無視されます。この構造体は次 のように定義されます:

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
kern.cam.cd.changer.max_busy_seconds

ユーザは、sysctl 変数を通じて最小および最大タイムアウトを試し、自分のチェ ンジャに最適な値を見つけるとよいでしょう。一旦、自分のチェンジャに対する 最適タイムアウトが決まれば、それをカーネル設定ファイルに記述できます。

自分のシステムに LUN ベースのチェンジャが存在すれば、ブートプロセスが進む に従って、そのチェンジャの様々な LUN に対するプローブメッセージが表示され ることに気づくでしょう。これは正常であり、チェンジャのスケジューリング コードによって引き起こされます。

関連ファイル

       /dev/cd[0-9][a-h]

ブロックモード CD-ROM デバイス
/dev/rcd[0-9][a-h]
raw モード 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

スポンサーリンク