3

我正在编写一个 linux 驱动程序,我想注册一个回调函数,以便在系统进入睡眠状态时调用。执行此操作的 api 是什么?

谢谢。

4

4 回答 4

2

这取决于你有什么样的驱动程序。例如,如果您有一个注册了 的驱动程序,platform_device_register()struct platform_driver包括.suspend设备挂起回调的成员。对于 PCI 设备,struct pci_driver您传递给的pci_register_driver()类似地包括一个.suspend成员。

大多数设备类应该提供类似的机制。

于 2010-05-01T10:23:13.237 回答
1

我很确定您想要acpi_install_fixed_event_handler()在 中找到acpi/acpi.h的通用事件acpi/actypes.h(包含在 中acpi.h)。

的第二个参数acpi_install_fixed_event()想要一个类型的处理程序,u32最后一个参数是一个void *context。我找不到的是 *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 */

我在这里可能完全错了,我实际上不需要为我编写的任何驱动程序执行此操作。以上是挖掘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 回答