我正在写一个Linux驱动程序,我想注册一个callback函数,当系统进入睡眠状态时被调用。 什么是这样做?
谢谢。
这取决于你有什么样的驱动程序。 例如,如果您有一个使用platform_device_register()
注册的驱动程序,那么struct platform_driver
包含一个用于设备暂停回调的.suspend
成员。 对于PCI设备,传递给pci_register_driver()
的struct pci_driver
同样包含一个.suspend
成员。
大多数设备类应提供类似的机制。
我很确定你想acpi_install_fixed_event_handler()
,在acpi/acpi.h
发现,在acpi/actypes.h
(它是从acpi.h
包含)中发现的通用事件。
acpi_install_fixed_event()
的第二个参数需要一个类型为acpi_install_fixed_event()
的处理程序,最后一个参数是void *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 coreel邮件列表上得到很好的回应。 如有疑问,请在那里询问。 即使这个“正常”,它是一个好主意,以确认它。
ACPI如何可能会给你一个良好的开端…
我解决的解决方案是使用通知链。 在更高版本的内核上,您可以使用register_pm_notifier进行注册 。 如果您的内核不支持该API,则可以使用通知程序进行CPU热插拔事件 (这似乎是KVM使用的)。 在进入和退出的CPU热插拔通知链触发。