我正在编写一个 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)。
的第二个参数acpi_install_fixed_event()想要一个类型的处理程序,u32最后一个参数是一个void *context。我找不到的是 *context 可能的可能性列表。但是,看起来您只是要在事件中输入一些内容,这意味着您可能不关心上下文。不完全是回调,但结果相同。
如果您为(比如说,ACPI_EVENT_POWER_BUTTON或ACPI_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 邮件列表上得到很好的回应。如有疑问,请在那里询问。即使这“有效”,确认它也是一个好主意。
ACPI Howto可能会给您一个良好的开端...