次のページ 前のページ 目次へ

2. コンパイルとインストール

2.1 前提条件とカーネルのセットアップ

ドライバのバージョンは2つあります。ひとつは 2.4.0-test3 よりも前のカーネルに 含まれるバージョンです。以下、no-AML-interpreter バージョンと 呼ぶことにします。これは 2.4.0-test3 および、それ以降のカーネルのバージョンで CONFIG_ACPI_INTERPRETER に N と応答し実行したバージョンと同じです (以下の コンフィグレーションオプションズを参照のこと)。もうひとつは 2.4.0-test3 および、それ以降のカーネルで CONFIG_ACPI_INTERPRETER に Y と応答し実行した バージョンです。以下、includes-AML-interpreter バージョンと 呼ぶことにします。このドキュメントを読むに当たって、あなたが使用される ドライバがどのバージョンかを知っておく必要があるでしょう。

一番新しいカーネル (2.4.0-xxx) を手に入れることから始めるべきです。初期の カーネルのバージョンに含まれる初期のドライバのバージョンは、一番新しい acpid や pmtools との動作が保証されていません。しかも acpid や pmtools の パッケージで入手できるバージョンは、最新のものしかありません。

カーネルをビルドするのに必要なすべてのパッケージの更新を必ず行って ください (そのための情報がカーネルソースツリーの中の "Documentation/Changes" というファイルにありますので、参照して ください)。 Linux カーネルのビルドについてのもっと一般的情報は "Kernel-HOWTO" を参照してください。Linux HOWTO は Linux Documentation Project を含むたくさん のサイトで維持されています。Linux Documentation Project の URL は、 http://www.ldp.org/ です。

ACPI サポートのためには、カーネルのリビルドが必要です。 CONFIG_ACPI オプションに Y と答えてください。(今のところ)実験的な サポートですが、スリープモードを組み込みたい場合、 CONFIG_ACPI_S1_SLEEP オプションにも Y と答えればいいです。 APM サポートを無効にする必要はありません――ACPI サポートは実行時に APM サポートを見つけると、実行しているカーネルが自動的にオフにします。 2.4.0-test3 かそれ以降のドライバの新しいインターフェースを試したいのなら、 CONFIG_ACPI_INTERPRETER に Y と答えればいいです。これにより、 "AML interpreter" が正しく組み込まれ、 /proc/sys/acpi インターフェース内にもいくつかの変更が行われます。

コンフィグレーションの後に、いつものようにカーネルをビルドしインストールして ください。

/proc/sys/acpi の試験をすることによって、ドライバのテストができます―― /proc/sys/acpi が存在しないなら、たぶんカーネルが正しく構成されていません。 存在しているなら、以下のように見えなければなりません。

includes-AML-interpreter ドライバを使っている場合

/proc/sys/acpi/c2_exit_latency
/proc/sys/acpi/c2_enter_latency
/proc/sys/acpi/c3_exit_latency
/proc/sys/acpi/c3_enter_latency
/proc/sys/acpi/event

no-AML-interpreter ドライバを使っている場合

/proc/sys/acpi/facp
/proc/sys/acpi/dsdt
/proc/sys/acpi/pm1_enable
/proc/sys/acpi/gpe_enable
/proc/sys/acpi/gpe_level
/proc/sys/acpi/event
/proc/sys/acpi/p_blk
/proc/sys/acpi/p_lvl2_lat
/proc/sys/acpi/p_lvl3_lat
/proc/sys/acpi/enter_lvl2_lat
/proc/sys/acpi/enter_lvl3_lat
/proc/sys/acpi/s0_slp_typ
/proc/sys/acpi/s1_slp_typ
/proc/sys/acpi/s5_slp_typ.

どちらのドライバを使っていても、スリープオプションでコンパイルしたなら、

/proc/sys/acpi/sleep

も見えなければなりません。

no-AML-interpreter ドライバを使っているなら

次のコマンドを試すことができます。

cat -v /proc/sys/acpi/facp | more 
文字が 'FACP' で始まり、数バイトの文字化けの後に OEM 名が表示されます。もし、 これが見えたならドライバはBIOSから適正なテーブルを見つけたと言うことなので、 うまくいくかもしれません。 見えないなら、ブートオプション (またはモジュールオプション) のひとつを設定する 必要があるかもしれません。これについてはドライバオプションのセクションで 記述しています。

includes-AML-interpreter ドライバを使っているなら

/proc に見るべきものはあまりありません。/var/log/messages 内の 'ACPI: ACPI support found' の行をチェックできます――この行が見えたなら、 FACP を含むすべてのテーブルはロードされ、AML namespace のロードも同様に 成功しています。 しかしながら、この行の後の方に 'ACPI: enable failed' という行があったなら、 イベントか SCI ハンドラの設定か、ACPI モードへのシステム移行で問題があった ことを意味します。なので、システムは ACPI イベントを処理できません。 ログエントリのもっと詳細な議論はセクション XXX にあります。

2.2 acpid と acpictl のビルドとインストール

ACPI サポートしたカーネルをビルドしたら、すぐに適切な acpid のバージョンを ダウンロードしてください。includes-AML-interpreter ドライバを使っているなら acpid-071100.tar.gz を、違うなら acpid-052200.tar.gz をダウンロードしなければ なりません。

パッケージをビルドしたいディレクトリを作成します。cd でディレクトリの中に入り、 アーカイブを unpack するコマンドを与えます。

zcat acpid-xxx.tar.gz | tar xvf - 

xxx はダウンロードしたパッケージのバージョンです。

同じディレクトリで、

./configure

と入力すると、パッケージの構成が行われます。

make

とするとビルドが行われ

make install

とするとインストールされます。既定のインストールディレクトリが /usr/local で あることに注意してください――ファイルをインストールする場所を他に選ぶなら、 パッケージの構成で次のようにする必要があります。

./configure --prefix=/new/place/to/put/them

(訳注:/new/place/to/put/them を好みの場所に置きかえて入力します。)

インストールされるプログラムは acpid と acpictl です。既定では、acpid は /usr/local/sbin に、acpictl は /usr/local/bin に置かれます。現時点で これらの man ページは入手できないので、それぞれのプログラムのクィックサマリを ここに記載します。

includes-AML-interpreter ドライバを使っているなら、この項を読んでください。

acpid は ACPI イベントを監視し、処理するデーモンです――ユーザの要求の監視と ドライバへの送信も行います。以下のオプションを受け付けます。

  -d または --debug    フォアグランドでデーモンを実行
  -v または --version  バージョン情報を出力

acpictl は acpid と通信するためのユーザクライアントです。以下のオプションを 受け付けます。

  -p または --pid           acpid のプロセス ID を出力
  -b または --battery       電池情報を出力――このオプションは新しいドライバ
                            でも未だ動作しません                        
  -i または --intermediary  他のプログラムと acpid との仲立ち

実のところ intermediary オプションは、現在何もしていません :-)

no-AML-interpreter ドライバを使っているなら、この項を読んでください。

acpid は ACPI イベントを監視し、処理するデーモンです――ユーザの要求の監視と ドライバへの送信も行います。以下のオプションを受け付けます。

  -d または --debug    フォアグランドでデーモンを実行
  -t または --trace    (かなり大きい) デバッグトレースの作成
  -v または --version  バージョン情報を出力

tty から引き離さず debug オプションを使用した acpid の実行は、対話式で 各種のコマンドを指定することをユーザに許します。コマンドのリストは debug モードにおいて 'help' コマンドを与えることで見ることができます。

acpictl は acpid と通信するためのユーザクライアントです。以下のオプションを 受け付けます。

  -p または --pid           acpid のプロセス ID を出力
  -b または --battery       電池情報を出力                      
  -i または --intermediary  他のプログラムと acpid との仲立ち

実のところ intermediary オプションは、現在何もしていません :-)

2.3 pmtools のコンパイルとインストール

pmtools パッケージ内のいくつかのユーティリティの実行には perl が必要です。

確実に一番新しい pmtools のバージョンをダウンロードしてください。パッケージを ビルドしたいディレクトリを作成します。cd でディレクトリの中に入り、 アーカイブを unpack するコマンドを与えます。

zcat pmtools-xxx.tar.gz | tar xvf - 

xxx はダウンロードしたパッケージのバージョンです。

同じディレクトリで、

make

と入力すると、パッケージのビルドが行われます。

ユーティリティをインストールする機能は未だ提供されていないので、手動で適切な 場所にユーティリティをコピーします。

cp acpianalyze/acpianalyze /usr/local/bin
cp acpidisasm/acpidisasm /usr/local/bin
cp acpidmp/acpidmp acpdmp/acpitbl acpidmp/acpxtract /usr/local/bin
cp pmtest/pmtest /usr/local/bin

または好みのディレクトリにインストールしてもいいです。

このパッケージも文書が提供されていないので、クィックサマリをここに記載します。

acpidmp は root か suid を設定して実行しなければなりません (マルチユーザ システムとして稼動しているなら、root で実行したほうがいいです。それにしても 何でマルチユーザシステムに開発カーネルをインストールしてるの?)。

acpidmp は ACPI BIOS によって提供されるテーブルを捜し、指定された標準出力 (stdout) にダンプします。テーブルは FACP, DSDT, RSDT と名づけられています。 これらのテーブルの内部を知りたいのなら、ACPI バージョン 1.0b の仕様を見て ください。名前を与えず acpidmp を実行した場合、テーブルのすべてを捜し、 標準出力にダンプします。この場合、コマンドラインでは応答しない RSDP も見ること ができます。

acpidmp は人間が読み取れる出力を作成しません。読めるようにするには、パイプで acpidisasm に渡す必要があります。著者の Sony VAIO F420 での例を示します。

acpidmp DSDT | acpidisasm 

作成された出力は

00000000: Scope _PR_ (\_PR_)
00000006:   Processor CPU0 (\_PR_.CPU0)
0000000d:     0x00
0000000e:     0x00008010
00000012:     0x06
00000013: Name _S0_ (\_S0_)
00000018:   Package
0000001a:     0x04
0000001b:     0x05
0000001d:     0x05
0000001f:     0x00
00000021:     0x00
00000023: Name _S1_ (\_S1_)
00000028:   Package
0000002a:     0x04
0000002b:     0x04
0000002d:     0x04
0000002f:     0x00
00000031:     0x00
00000033: Name _S3_ (\_S3_)
00000038:   Package
0000003a:     0x04
...

です (3800 行ぐらいの出力があるので、休憩してもいいですよ)。

上記は DSDT テーブルを検索した AML の実際の解読結果です。

no-AML-interpeter ドライバを使っているなら、AML 無しでテーブルのヘッダの参照と 登録のために acpitbl を使用できます――acpitbl は /proc エントリを参照します。 /proc エントリはカーネルで AML interpreter が有効になっていると利用でき ません。著者の laptop の例を示します。

acpitbl /proc/sys/acpi/dsdt 

とすれば、出力は

Signature:        DSDT
Length:           11841
Revision:         0x01
Checksum:         0x3c
OEMID:            SONY
OEM Table ID:     K1
OEM Revision:     0x20000203
Creator ID:       MSFT
Creator Revision: 0x01000007

となり、これは dsdt テーブルのヘッダです。

FACP テーブルも同じ方法で調べられます。

acpitbl /proc/sys/acpi/facp

著者の laptop では

Signature:        FACP
Length:           116
Revision:         0x01
Checksum:         0x12
OEMID:            SONY
OEM Table ID:     K1
OEM Revision:     0x20000203
Creator ID:       PTL
Creator Revision: 0x000f4240
FIRMWARE_CTRL:    0x03ffffc0
DSDT:             0x03ffc924
INT_MODEL:        0x00
SCI_INT:          9
SMI_CMD:          0x000000b2
ACPI_ENABLE:      0xf0
ACPI_DISABLE:     0xf1
S4BIOS_REQ:       0xf2
PM1a_EVT_BLK:     0x00008000
PM1b_EVT_BLK:     0x00000000
PM1a_CNT_BLK:     0x00008042
PM1b_CNT_BLK:     0x00000000
PM2_CNT_BLK:      0x00000022
PM_TMR_BLK:       0x00008008
GPE0_BLK:         0x0000800c
GPE1_BLK:         0x00000000
PM1_EVT_LEN:      4
PM1_CNT_LEN:      2
PM2_CNT_LEN:      1
PM_TM_LEN:        4
GPE0_BLK_LEN:     4
GPE1_BLK_LEN:     0
GPE1_BASE:        0
P_LVL2_LAT:       10
P_LVL3_LAT:       4097
FLUSH_SIZE:       0
FLUSH_STRIDE:     0
DUTY_OFFSET:      1
DUTY_WIDTH:       3
DAY_ALRM:         0x0d
MON_ALRM:         0x00
CENTURY:          0x32
Flags:            0x00000000

と見えます。あなたも同じエントリ名が見えるはずですが、値は異なるかも しれません。

もう一つの方法として、includes-AML-interpreter ドライバを使っているなら、/proc から読む代わりに、一番確かな /dev/mem からテーブルを読むことができます。それは

acpidmp FACP | acpitbl 

とすると、実際の値に非常に近い結果が得られます。CONFIG_ACPI_INTERPRETER に Y と答えた場合のみ利用できる方法です。

pmtest はデバイスドライバの作者用です。作者が作者のドライバに異なる スリープ状態のサポートを追加する時に使用します。

pmtest は /proc 内に以下のエントリをセットアップするカーネルモジュールです。

/proc/driver/pmtest/devices

このインターフェースを読むことで、どのデバイスが電源管理のために登録されて いるのか、そして、そのデバイスがどの状態にいるのか、調べることができます。 各々のデバイスについて、次の3つの項目を全部書き出しています。

devicetype deviceid state 

state は 0-3 で、D0-D3 のデバイスの状態に対応します。 devicetype は 0-5 で、/usr/include/linux/pm.h に列挙されたデバイスタイプに 対応します。 deviceid も /usr/include/linux/pm.h に記載された内の一つに対応します。

/proc/driver/pmtest/control

このファイルに書くことで、/proc/driver/pmtest/devices で一覧表示される デバイスの一つをサスペンド状態 (D0-D3 の一つ) に置くことができます。 /proc/driver/pmtest/devices を見た時と同じように、前述した次の3つの項目を 書かなければなりません。  

devicetype deviceid state 

今まで説明したカーネルモジュール pmtest を直接使用する代わりに、同じ ディレクトリ (既定では /usr/local/bin) にある perl スクリプトの pmtest を 使うべきです。なぜ?それは、簡単だし、便利だし、それから (ほとんどのコマンドで) デバイスの ID とタイプを数値に変換しなくてもいいから です。

insmod と rmmod があなたの path にあることを確認してください。スクリプトは root で実行してください。pmtest はモジュールをロードし、与えられたコマンドを 実行し、それからモジュールをアンロードする、とてもテストには便利なものです。

使用法: pmtest [OPTION] [TYPE] [ID]

  OPTION は次の一つです。
    -l                   デバイスの一覧表示 (既定値)
    -d0                  デバイスをリジューム (ACPI D0)
    -d1, -d2, -d3        デバイスをサスペンド (ACPI D1-D3)

  TYPE は次の一つです。
    unknown PCI USB SCSI ISA system

  ID は次の一つです。
    keyboard serial irda floppy vga pcmcia  
  あるいは /usr/include/linux/pm.h にあるデバイスの数値を指定します。

例として:
  pmtest -l PCI           PCI として登録されたデバイスの一覧表示
  pmtest -d0 VGA          コンソールをリジューム (見えるように)
  pmtest -d3 PCI 0x1234   ある PCI デバイスをサスペンド

(ACPI をオフにした) 著者の laptop を例にすると、以下のように見えます。

  [root@devel2 pmtest]# ./pmtest -l
    VGA (D0)
    PCMCIA (D0)
    keyboard (D0)
    PCI 0x0 (D0)

2.4 ドライバオプション

includes-AML-interpreter ドライバを使っているなら、実行時のオプションは ありません。

no-AML-interpreter ドライバを使っているなら、ACPI ドライバは (モジュールまたはカーネルブートでの) 実行時に以下のオプションを サポートします(訳注:既定値の説明は省略された場合、このオプションが セットされているのかオフなのかを意味します)。

on

初期化時、ドライバは ACPI 準拠デバイスを探し使えるようにしよう とします。(既定値はセット)

off

ドライバは ACPI 準拠デバイス を探さず、ACPI イベント処理を行いません。 /proc エントリも作成しません。このオプションは実行時に ACPI を無効にする ために使います。APM とともに ACPI をコンパイルしているなら、この オプションで ACPI をオフにし、APM で電源管理イベントを処理できます。 (既定値はオフ)

tables

ACPI BIOS はたくさんのテーブルを用意しています。これらのテーブルは、例えば、 能力、ステータスレジスタへのポインタ、スリープ状態に移行させるための レジスタへのポインタ、の情報を含んでいます。ACPI イベントを有効にし、引き 起こすために、ドライバはこれらのテーブルを使います。通常、特定の チップセットはいつも同じ能力とレジスタを持つはずですが、BIOS が用意する テーブルを使うのが確実と思うなら、このオプションをセットします。 (既定値はオフ)

chipset

前記のオプション tables と似たようなもので、このオプションは、既知の チップセットのリスト中のチップセットのためあらかじめ用意されたテーブルを 使うこと、をドライバに伝えます――あなたのデバイスがこのリストにあるもので、 BIOS が用意したテーブルを間違いではないかと思っている場合、 このオプションを使ってみてください。 現在このオプションでこのオプションでサポートされるチップセットのリストは PIIX4 と VIA です。(既定値はオフ)

no-errata

ACPI の実装社 (者) は root-level ACPI table header (RSDP) の変更を "公開" したかもしれません。理論的には、このオプションはこれらの 変更を無視するようドライバに伝えるはずです。実際には、現時点のドライバの バージョンで、このオプションは実装されていないようです。

copy-tables

このオプションがセットされていると、FACP と DSDT の ACPI のテーブルは、 それらが使われる前にメモリの新しい場所にコピーされます。いくつかの ACPI BIOS は、これを必要とします。これらの BIOS は memory map code によって まだ確保されていない low メモリにテーブルを置きます。コピーは、後で使うことが 可能なテーブルの十分なスナップショットを持つことを保証します。初期化時に /var/log/messages に "ACPI: unreserved memory @ 0xnn!" と書くなら、この BIOS はコピーの必要な BIOS であることがわかります。(既定値をセットにする BIOS はリストで決まっています。現在このリストに含まれているのは AMI だけ です。他の BIOS でのこのオプションの既定値はオフです。)

trust-tables

このオプションは通常、前記の copy-table オプションと一緒に使われます。BIOS が、memory map code によってまだ確保されていない low メモリに ACPI テーブル を公開する時に、このオプションを使います。ログに前記と同じメッセージが 書かれます。警告――このオプションを使い、テーブルが実際に存在しないなら、 カーネルパニックを起こします。 (既定値をセットにする BIOS はリストで決まって います。現在このリストに含まれているのは AMI だけです。他の BIOS でのこの オプションの既定値はオフです。)

no-sci

このオプションが有効なら、ACPI のために irq を使用せず、有効なイベントや 処理されるイベントはありません。詳しく言えば、pm1x_evt, gpe0, gpe1 レジスタに 対する変更を行いません。デバッグ目的のためにドライバに ACPI テーブルをロード したいが、いくつかのイベントの扱いはしたくない時に、このオプションを使うと いいでしょう。(既定値はオフ)

no-c2, no-c3

初期化前に、プロセッサの電源状態が C2 と C3 の状態に入ることができない ように、いくつかのグローバル変数をセットします。普通の初期化の間に、C2 (CPU アイドル) と C3 (キャッシュがスヌープを無視する CPU アイドル) の状態は 両方とも有効にされます。これらのオプションをセットすると、このステップは スキップされます。no-c2 オプションをセットすると、C2 状態に入れなくなります。 no-c3 オプションをセットすると、C3 状態に入れなくなります。(既定値はオフです)

no-s1, no-s5

これらのオプションがセットされると、S1 と S5 のスリープ状態に入りません。 no-s1 オプションをセットすると、S1 状態あるいはスリープモードに入れなく なります。no-s5 オプションをセットすると、S5(ソフトオフ) 状態に入れなく なります。(no-s5 の既定値はオフです。no-s1 の既定値は、 カーネルコンフィグレーション時に CONFIG_ACPI_S1_SLEEP を定義していないなら セット、定義したならオフです。)

2.5 システムリソースの設定

pci ドライバが ACPI デバイスの適切な割込みの pin を見つけることができないなら ブートオプションとして、カーネルに pci=biosirq を指定する必要があるかも しれません。通常カーネルは IRQ ルーティングテーブルのために確保された メモリ領域の中から PCI 割込みのためのテーブルを探します。しかし、テーブルが 見つからない場合、pci=biosirq オプションをセットすれば、カーネルは PCI BIOS から同じ情報を得ようとします。

まれなケースで ACPI 割込みが既にシステムに構成したいくつかの他のデバイスと 衝突してるかもしれません。衝突したデバイスを無効にするか、それを再構成するか してみてください。割込みの衝突をチェックするには

cat /proc/interrupts

とし、その出力を調べてください。ただし PCI デバイスだけは、ACPI デバイスと 割込みを共有することができます――他のすべてのデバイスは、いくつかの他の 割込みを使用しなければなりません。例として、著者のサンプル出力を記載します。

[ariel@devel2 kernel]$ cat /proc/interrupts
         CPU0
  0:  5416567  XT-PIC  timer
  1:    55261  XT-PIC  keyboard
  2:        0  XT-PIC  cascade
  3:   364126  XT-PIC  wvlan_cs
  8:        7  XT-PIC  rtc
  9:      134  XT-PIC  ACPI, Ricoh Co Ltd RL5c478, Ricoh Co Ltd RL5c478 (#2)
 12:   602159  XT-PIC  PS/2 Mouse
 13:        1  XT-PIC  fpu
 14:   129102  XT-PIC  ide0
 15:        9  XT-PIC  ide1
NMI:        0
ERR:        0

/proc/pci をちょっと調べると、2つの Ricoh デバイスが PCI バスの カードバスブリッジにあるのが見えています。このように PCI デバイスは気楽に同じ 割込みを共有できます。

あるユーザは IRQ 13 上に ACPI と fpu が見えていると報告してきました――これは 本物の衝突のケースで、デバイスを正常に機能させたいなら、衝突を解決しなければ なりません。


次のページ 前のページ 目次へ