如何在linux驱动程序中挂起回调注册?

时间:2010-05-01 00:00:20

标签: linux linux-kernel linux-device-driver

我正在编写一个linux驱动程序,我想注册一个在系统进入休眠状态时调用的回调函数。 api是做什么的?

感谢。

4 个答案:

答案 0 :(得分:2)

这取决于你拥有什么样的司机。例如,如果您有一个注册了platform_device_register()的驱动程序,那么struct platform_driver包含一个.suspend成员,用于设备的暂停回调。对于PCI设备,您传递给struct pci_driver的{​​{1}}同样包含pci_register_driver()成员。

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

答案 1 :(得分:1)

我非常确定您希望在acpi_install_fixed_event_handler()中找到acpi/acpi.h acpi/actypes.h中的acpi.h中包含的一般事件(包含在acpi_install_fixed_event()中)。

u32的第二个参数需要类型为void *context的处理程序,最后一个参数为ACPI_EVENT_POWER_BUTTON。我找不到的是*上下文可能的列表。但是,看起来您只需要在事件中输入内容,这意味着您可能不关心上下文。不是完全回调,但结果相同。

如果您为(例如ACPI_EVENT_SLEEP_BUTTONACPI_EVENT_SLEEP_BUTTON)注册固定处理程序,则应在相应事件上输入您的处理程序。我不是100%肯定drivers/rtc/rtc-cmos.c是你想要的,也就是我无法确定它是否与系统自身睡眠相同。当然,测试和进一步调查是为读者进行的。

可以在#ifdef CONFIG_ACPI .... #endif /* CONFIG_ACPI */ 中找到使用它的示例。

请注意在

中包装来自acpi.h的任何代码
drivers/acpi/acpica/evxface.c:ACPI_EXPORT_SYMBOL(acpi_install_fixed_event_handler)

我在这里可能完全错了,我实际上并不需要为我编写的任何驱动程序执行此操作。以上是挖掘 2.6.32.8 源约30分钟的结果,这可能与您正在使用的内核完全不同。

如果我离开基地,请发表评论:)我认为这就是你要找的。

其他

至于许可,其出口:

*_EXPORT_SYMBOL_GPL()

{{1}}

...所以无论你碰巧在做什么,你都应该没有问题。

最后,这是一个非常好的问题,可能会在Linux内核邮件列表中获得良好的接收。如果有疑问,请问那里。即使这只是“正常”,但最好确认一下。

答案 2 :(得分:0)

ACPI Howto可能会给你一个良好的开端......

答案 3 :(得分:0)

我解决的解决方案是使用通知链。在更高版本的内核中,您可以注册register_pm_notifier。如果您的内核不支持该API,您可以使用cpu hot-plug events的通知程序(这似乎是KVM使用的)。在进出暂停cpu hotplug通知程序链的方式上。