Где ACPI подключается к последовательности выключения в Linux для мягкого выключения ПК?

Где я могу подключиться к Linux, чтобы добавить пользовательское программное отключение?

Вот в чем вопрос. Вот почему мне нужно знать:

Я пытаюсь сделать мягкое отключение rapsberry pi. Точнее, я хочу, чтобы пи был выключен (отключен источник питания) при переводе на уровень запуска 0 (он же sudo poweroff).

Я знаю, что у Pi нет аппаратного обеспечения для этого, поэтому я собираюсь создать специальную электронику, которая будет переключать питание на Pi. Я собираюсь использовать контакт GPIO, который позволит программному обеспечению на пи сигнализировать о моей электронике и переключать (выключать) и иметь кнопку, чтобы снова включить его.

Все идет нормально.

Моя проблема заключается в том, ГДЕ мне разместить код для отправки сигнала через GPIO?

На ум приходят две вещи:

  • Может быть, мне следует написать программу и обернуть ее в скрипт в /etc/init для использования systemd.
  • Может быть, мне нужно написать модуль ядра. Но если да, то где/как мне подключиться к последовательности выключения?

Я не могу просто предположить. Если я ошибусь, PI отключится слишком рано и не завершит работу с Linux. Но я провел часы в Google и не нашел документации для этого.

Я знаю, что это возможно, потому что именно это происходит с ACPI. Когда ПК / ноутбук выключается, материнская плата подает сигнал блоку питания, чтобы отключить [большую часть] питания. Что-то в операционной системе (linux) должно вызывать это. Итак, где программа ACPI отключается от последовательности завершения работы в Linux?


person Philip Couling    schedule 16.07.2017    source источник
comment
Прежде всего, какую именно плату Raspberry Pi вы используете? Не могли бы вы найти его схемы и скинуть сюда? Насколько я понимаю, питание нужно отключить от ядра (по линии GPIO). Но детали могут зависеть от того, как это делается/будет сделано на физическом уровне, поэтому сначала следует изучить схемы и придумать, как именно отключать питание. Кроме того, вы должны знать, что платы ARM обычно не используют ACPI, вместо этого используют дерево устройств, которое на самом деле не поможет вам выполнить эту задачу (кроме описания в нем линии GPIO).   -  person Sam Protsenko    schedule 16.07.2017
comment
Что касается последовательности отключения питания в ядре: см. этот вопрос. Вы можете искать последнюю выполняющуюся функцию там, и это должно быть место, где должно происходить отключение питания. pm_power_off() похоже на место, которое вы ищете.   -  person Sam Protsenko    schedule 16.07.2017
comment
См. также этот вопрос.   -  person Sam Protsenko    schedule 16.07.2017
comment
Взгляните на драйверы/ power/reset/gpio-poweroff.c, возможно, вы сможете повторно использовать его для своей задачи. Документация для этого драйвера находится здесь: Документация/devicetree/bindings/power/reset/gpio-poweroff.txt. Вы можете попытаться описать этот gpio-poweroff в вашем файле дерева устройств (или в оверлее дерева устройств) после пайки этого GPIO для сброса контакта PM IC, и этого может быть достаточно.   -  person Sam Protsenko    schedule 16.07.2017
comment
@SamProtsenko для ясности, Raspberry Pi не может самостоятельно отключаться. Насколько мне известно, это факт для всех моделей Raspberry pi (на момент написания). Моя плата оказалась Model 3B. Я ссылаюсь только на ACPI, потому что это механизм, который был подключен к ядру Linux в том же месте, где мне нужно подключить свой код. Мой план состоит в том, чтобы поместить некоторую электронику между зарядным устройством USB для телефона и пи, чтобы вырезать (или поставить) власть. Я могу легко настроить его так, чтобы переключение одного вывода GPIO с низкого уровня на высокий снижало мощность.   -  person Philip Couling    schedule 17.07.2017
comment
@SamProtsenko Спасибо, я думаю, вы указали мне на то, что мне нужно. Похоже, я могу написать модуль ядра для этого. Модуль зарегистрирует свой код настройки GPIO как указатель функции pm_power_off. Ядро вызовет последнюю вещь, которую оно сделает.   -  person Philip Couling    schedule 17.07.2017
comment
Будущие читатели могут обратиться к unix.stackexchange.com/questions/122557/   -  person Philip Couling    schedule 13.07.2018