3

Linux ドライバーを作成しています。システムがスリープ状態になったときに呼び出されるコールバック関数を登録したいと考えています。これを行うためのAPIは何ですか?

ありがとう。

4

4 に答える 4

2

それはあなたが持っているドライバーの種類に依存します。たとえば、に登録されているドライバがある場合、platform_device_register()にはデバイスのサスペンドコールバックのメンバーがstruct platform_driver含まれます。.suspendPCIデバイスの場合、struct pci_driver渡す先pci_register_driver()には同様に.suspendメンバーが含まれます。

ほとんどのデバイスクラスは、同様のメカニズムを提供する必要があります。

于 2010-05-01T10:23:13.237 に答える
1

にある一般的なイベント( に含まれています) が必要acpi_install_fixed_event_handler()であると確信しています。acpi/acpi.hacpi/actypes.hacpi.h

の 2 番目の引数acpi_install_fixed_event()は、タイプ のハンドラーを必要u32とし、最後の引数はvoid *context. 私が見つけられなかったのは、*context の可能性のリストです。ただし、イベントに入力するだけのように見えます。これは、おそらくコンテキストを気にしないことを意味します. 完全なコールバックではありません、同じ結果です。

(たとえば、ACPI_EVENT_POWER_BUTTONまたはACPI_EVENT_SLEEP_BUTTON) の固定ハンドラーを登録する場合、ハンドラーはそれぞれのイベントで入力する必要があります。私はACPI_EVENT_SLEEP_BUTTONあなたが望んでいることを 100% 確信しているわけではありません。つまり、システムが自動的にスリープ状態になるのと同じイベントかどうかはわかりません。もちろん、テストとさらなる調査は、読者の演習です。

使用例は にありdrivers/rtc/rtc-cmos.cます。

acpi.h のコードをラップするように注意してください

#ifdef  CONFIG_ACPI
 ....

#endif /* CONFIG_ACPI */

ここでは完全に間違っている可能性があります。私が書いたドライバーのいずれに対しても、実際にはこれを行う必要はありませんでした。上記は2.6.32.8のソースを約 30 分間掘り下げた結果であり、使用しているカーネルとは完全に異なる可能性があります。

私がベースから外れている場合は、コメントを残してください:)これがあなたが探しているものだと思います。

追加

ライセンスに関しては、エクスポートされました:

drivers/acpi/acpica/evxface.c:ACPI_EXPORT_SYMBOL(acpi_install_fixed_event_handler)

いいえ

*_EXPORT_SYMBOL_GPL()

...だから、何をしていても、問題なく使用できるはずです。

最後に、これは完全に良い質問であり、おそらくLinux Kernel メーリング リストで好意的に受け止められるでしょう。疑問がある場合は、そこで質問してください。これが「うまくいく」場合でも、それを確認することをお勧めします。

于 2010-05-01T05:15:55.703 に答える
1

私が解決した解決策は、通知チェーンを使用することでした。カーネルのそれ以降のバージョンでは、 register_pm_notifier で登録できます。カーネルがその API をサポートしていない場合は、CPU ホットプラグ イベントに通知機能を使用できます(これは KVM が使用しているようです)。サスペンドに出入りする途中で、cpu hotplug 通知チェーンが起動します。

于 2010-07-08T20:41:43.087 に答える
0

ACPI Howtoは、おそらく有利なスタートを切るでしょう...

于 2010-05-01T00:17:58.883 に答える