関数ポインターを使用して、カスタム Linux ボードに i2c 経由で電源管理チップを呼び出させることに成功しpm_power_off
ました (電源をオフにするため)。
Linuxhalt
コマンドで電源もオフにしたいです。
どうすればこれを達成できますか?
の (ARM) コードには、のmachine_halt
に似たポインタがありません。machine_power_off
pm_power_off
アーチ/アーム/カーネル/reboot.c:
/*
* Halting simply requires that the secondary CPUs stop performing any
* activity (executing tasks, handling interrupts). smp_send_stop()
* achieves this.
*/
void machine_halt(void)
{
local_irq_disable();
smp_send_stop();
local_irq_disable();
while (1);
}
/*
* Power-off simply requires that the secondary CPUs stop performing any
* activity (executing tasks, handling interrupts). smp_send_stop()
* achieves this. When the system power is turned off, it will take all CPUs
* with it.
*/
void machine_power_off(void)
{
local_irq_disable();
smp_send_stop();
if (pm_power_off)
pm_power_off();
}
明らかにハックすることもできmachine_halt
ますが、可能であれば、これを「適切に」実行したいと考えています。
halt
コマンドが「電源オフ」を実行する原因となる何か(おそらくユーザー空間で)を見逃しましたか?
更新:回答とすべてのコメントに感謝します。実際の問題が何であるかを理解するのに役立ちました。
私の問題は次のとおりです。
カスタム電源管理ユニットで使用できる入力エッジがあります。停止またはリセット機能のないスタート ボタンと考えてください。私は PMU コードを完全に制御できます (i2c スレーブとして動作する ATMEGA です)。
- Linux カーネルが実行されている場合は、エッジを無視する必要があります。
- CPU の電源がオフの場合、エッジで CPU の電源をオンにします。
- Linux カーネルが停止した場合、エッジで CPU をリセットする必要があります。
ケース 1 は簡単で、何もする必要はありません。
ケース 2 は簡単pm_power_off
で、ドライバーで i2c メッセージを PMU に送信するように定義します。幸いなことに、i2c サブシステムは、呼び出されたときにまだ動作状態にpm_power_off
あります。
pm_halt
ケース 3 が問題です。i2c メッセージを PMU に送信するために、定義する を探していました。
0andriyがコメントしているように、おそらく別の方法がありますか?
カーネル内に、マシンが編集されていない限り、数 Hz で i2c メッセージを PMU に送り続ける場所はありますhalt
か?
https://unix.stackexchange.com/a/42576/17288の回答:
「*最近の停止は、ACPIが有効になっている場合、自動的に電源オフを呼び出すほどスマートです。実際、現在、それらは機能的に同等です。」
おそらく、ACPI を提供またはフックする何らかの方法があるでしょう - 私はそれを読む必要があります。