2010-05-01 17 views
2

我正在寫一個linux驅動程序,我想註冊一個回調函數,當系統進入睡眠狀態時被調用。什麼是這樣做?如何在Linux驅動程序中掛起回叫?

謝謝。

+0

您正在使用哪個版本的內核? – 2010-05-01 03:27:29

+0

我正在使用內核2.6及更高版本。 – lucas 2010-05-03 18:39:32

+0

這是一個chardev,PCI設備...? – 2010-05-03 19:18:56

回答

0

我解決的解決方案是使用通知鏈。在更高版本的內核上,您可以註冊register_pm_notifier。如果您的內核不支持該API,您可以使用通知程序cpu hot-plug events(這似乎是KVM使用的)。在進入和退出的過程中,CPU熱插拔通知器鏈會觸發。

0

ACPI Howto可能會給你一個很好的領先地位......

+0

不是很有幫助。他正在尋找他可以在他的模塊中使用的導出的FP符號,以便通知特定的事件。這實際上是一個非常好的問題,特別是對於可能無意中使用BKL for ioctl的模塊。 – 2010-05-01 03:26:51

+0

@Tim Post;感謝您的更正。 – 2010-05-01 05:05:41

1

我敢肯定你想acpi_install_fixed_event_handler(),在acpi/acpi.h發現,在acpi/actypes.h發現的一般事件(從acpi.h包括在內)。

acpi_install_fixed_event()的第二個參數需要u32類型的處理程序,最後一個參數是void *context。我找不到的是上下文可能存在的可能性列表。然而,看起來你只是在事件上輸入的內容,這意味着你可能不關心上下文。不是相當於回調,但結果相同。

如果您註冊固定處理程序(例如ACPI_EVENT_POWER_BUTTONACPI_EVENT_SLEEP_BUTTON),則應在相應事件中輸入您的處理程序。我不是100%肯定ACPI_EVENT_SLEEP_BUTTON是你想要的,也就是說我不能確定它是否與系統自己睡覺的事件相同。當然,測試和進一步調查是讀者的練習。

使用它的一個例子可以在drivers/rtc/rtc-cmos.c找到。

請小心包裹從acpi.h任何代碼

#ifdef CONFIG_ACPI 
.... 

#endif /* CONFIG_ACPI */ 

我可能是完全錯誤的在這裏,我還沒有實際需要爲任何我寫的司機做到這一點。以上是大約30分鐘通過2.6.32.8來源挖掘的結果,這可能與您正在使用的內核完全不同。

請留下評論,如果我遠離基地:)我認爲這是你在找什麼。

附加

至於許可,其出口:

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

*_EXPORT_SYMBOL_GPL() 

...所以你應該使用它沒有任何問題,無論你恰巧是這樣做。

最後,這是一個非常好的問題,可能會在Linux Kernel郵件列表中得到很好的接收。如果有疑問,請在那裏詢問。即使這個「正常工作」,確認它也是一個好主意。

+0

感謝您的迴應。不幸的是,測試顯示這個回調只在實際按鈕按下時調用。 – lucas 2010-05-03 18:40:08

+0

@lucas - 它是一種什麼樣的設備? Chardev,PCI,...? – 2010-05-03 19:20:07

2

這取決於你有什麼樣的驅動程序。例如,如果您有一個驅動程序註冊了platform_device_register(),則struct platform_driver包含一個.suspend成員用於設備的暫停回調。對於PCI設備,您傳遞給pci_register_driver()struct pci_driver同樣包含.suspend成員。

大多數設備類應提供類似的機制。