Linux ドライバーを作成しています。システムがスリープ状態になったときに呼び出されるコールバック関数を登録したいと考えています。これを行うためのAPIは何ですか?
ありがとう。
Linux ドライバーを作成しています。システムがスリープ状態になったときに呼び出されるコールバック関数を登録したいと考えています。これを行うためのAPIは何ですか?
ありがとう。
それはあなたが持っているドライバーの種類に依存します。たとえば、に登録されているドライバがある場合、platform_device_register()
にはデバイスのサスペンドコールバックのメンバーがstruct platform_driver
含まれます。.suspend
PCIデバイスの場合、struct pci_driver
渡す先pci_register_driver()
には同様に.suspend
メンバーが含まれます。
ほとんどのデバイスクラスは、同様のメカニズムを提供する必要があります。
にある一般的なイベント( に含まれています) が必要acpi_install_fixed_event_handler()
であると確信しています。acpi/acpi.h
acpi/actypes.h
acpi.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 メーリング リストで好意的に受け止められるでしょう。疑問がある場合は、そこで質問してください。これが「うまくいく」場合でも、それを確認することをお勧めします。
私が解決した解決策は、通知チェーンを使用することでした。カーネルのそれ以降のバージョンでは、 register_pm_notifier で登録できます。カーネルがその API をサポートしていない場合は、CPU ホットプラグ イベントに通知機能を使用できます(これは KVM が使用しているようです)。サスペンドに出入りする途中で、cpu hotplug 通知チェーンが起動します。
ACPI Howtoは、おそらく有利なスタートを切るでしょう...