CD−ROMドライブのトレイの自動オープン,クローズ


 ところが,CD−ROMディスクをトレイに納める前にmountコマンドを投入して失敗することが良くあります。

 kernelバージョン2.0.32までのide−cdドライバは,配布された状態のままコンパイルした場合には,次のような動作をします。

 もし,ドライブにCD−ROMディスクが入っていない場合,自動的にトレイをオープンしてからmountコマンドを終了してくれたり,umountコマンドを実行した時には,トレイをオープンしてくれるとより便利になるような気がします。

 実は,umountコマンド実行時のトレイの自動オープンについては,ide−cdドライバに組み込まれています。ドライバ作者のコメントでは,「多くの人がこの機能を嫌がるので,デフォルトでは動作しないようにしている」とあります。デスクトップマシンなどでは,CD−ROMドライブの前に物が置いてあったりするケースが多々あり,自動オープンするとトレイが物にぶつかり問題があると言うことなのでしょう。


 ide−cdドライバに,ちょっと手を加えるだけで,トレイの自動オープンやクローズが可能になります。以下に変更点を示しておきます。


  1. ドライバソースファイル
      /usr/src/linux-2.0.32/drivers/block/ide-cd.c

  2. ソースの変更
     (1) CD−ROMディスクが入っていない時のmount実行時のトレイ自動オープン
       
      2613:
      2614: 	/* If things worked ok, lock the door and read the
      2615:		   TOC information. */
      2616:		if (stat == 0 || my_reqbuf.sense_key == UNIT_ATTENTION) {
      2617:			(void) cdrom_lockdoor (drive, 1, &my_reqbuf);
      2618:			(void) cdrom_read_toc (drive, &my_reqbuf);
      2619:		}
      2620:	}
      2621:
      
      2619行から2620行の間に下記のように追加します。
      
      2613:
      2614: 	/* If things worked ok, lock the door and read the
      2615:		   TOC information. */
      2616:		if (stat == 0 || my_reqbuf.sense_key == UNIT_ATTENTION) {
      2617:			(void) cdrom_lockdoor (drive, 1, &my_reqbuf);
      2618:			(void) cdrom_read_toc (drive, &my_reqbuf);
      2619:		}
                       else {
                              cdrom_eject(drive, 0, &my_reqbuf); 
                              --drive->usage;
                              return -ENXIO;
                      }
      2620:	}
      2621:
      
     (2) umount実行時のトレイ自動オープン
      2663:  /* Turn this off by default, since many people don't like it. */
      2664:  CDROM_STATE_FLAGS (drive)->eject_on_close= 0;
      
      2664行のフラグの設定を0から1に変更します。
      
      2664:  CDROM_STATE_FLAGS (drive)->eject_on_close= 1;
      

     *kernelバージョン2.0.32以外の場合には,該当する箇所を見つけて変更してください。


  3. コンパイル
     カーネルの再構築が一度されている場合には,単に make zImage あるいは make zlilo を実行するだけです。ide-cd.c のみリコンパイルされます。
     カーネルを一度も再構築していない場合には,通常のカーネル再構築手順に従ってください。

 ide−cdドライバは,ドライブのマウントだけに使われる訳ではありません。workman のようなCDプレーヤーで音楽CDを演奏する場合にも使われます。CDプレーヤのプログラムによっては注意が必要です。

 例えば,音楽CDディスクを入れないまま workman を起動するとトレイが自動的にオープンしますが,暫くするとトレイが自動的にクローズします。そして,またすぐにオープンし,この後クローズ,オープンをえんえんと繰り返します。タイミングを見計らって音楽CDディスクを放り込むか,workman を終了しない限り続きます。

 これは,workman が /dev/cdrom デバイスのオープンに失敗したら,暫く待って再度 /dev/cdrom デバイスをオープンする動作を繰り返すからです。

 CDプレーヤのプログラム全てがこのような動作をするわけではありません。音楽CDが入っていなければ(/dev/cdrom のデバイスオープンに失敗),プログラムを起動した時点で終了してしまうものもあります。

 ともかく,トレイの自動オープン,クローズが可能なように変更した場合には,CDプレーヤプログラムの実行については気をつける必要があります。



戻る