Я почти уверен, что вы хотите 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. Если есть сомнения, спросите там. Даже если это «просто работает», хорошая идея это подтвердить.