Как я могу зарегистрировать обратный вызов в режиме ожидания в драйвере Linux? - PullRequest
2 голосов
/ 01 мая 2010

Я пишу драйвер для Linux и хочу зарегистрировать функцию обратного вызова, которая будет вызываться, когда система переходит в спящий режим. Что такое API для этого?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 01 мая 2010

Это зависит от того, какой у вас драйвер. Например, если у вас есть драйвер, зарегистрированный с platform_device_register(), то struct platform_driver включает элемент .suspend для обратного вызова устройства. В случае устройств PCI, struct pci_driver, который вы передаете pci_register_driver(), также включает .suspend член.

Большинство классов устройств должны обеспечивать аналогичный механизм.

1 голос
/ 01 мая 2010

Я почти уверен, что вы хотите 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_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)
*

Не * 1040

*_EXPORT_SYMBOL_GPL()

... Так что у вас не должно быть проблем с его использованием, что бы вы ни делали.

Наконец, это очень хороший вопрос, который , вероятно, встретит хороший прием в списке рассылки ядра Linux. Если есть сомнения, спросите там. Даже если это «просто работает», хорошая идея это подтвердить.

0 голосов
/ 09 июля 2010

Решением, на котором я остановился, было использование цепочек уведомлений.В более поздних версиях ядра вы можете зарегистрироваться с помощью register_pm_notifier .Если ваше ядро ​​не поддерживает этот API, вы можете использовать уведомитель для событий горячей замены процессора (похоже, это то, что использует KVM).При входе и выходе из строя срабатывает цепочка уведомлений «горячего подключения» процессора.

0 голосов
/ 01 мая 2010

ACPI Howto , вероятно, даст вам хороший старт ...

...