5

関数ポインターを使用して、カスタム Linux ボードに i2c 経由で電源管理チップを呼び出させることに成功しpm_power_offました (電源をオフにするため)。

Linuxhaltコマンドで電源もオフにしたいです。

どうすればこれを達成できますか?

の (ARM) コードには、のmachine_haltに似たポインタがありません。machine_power_offpm_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 です)。

  1. Linux カーネルが実行されている場合は、エッジを無視する必要があります。
  2. CPU の電源がオフの場合、エッジで CPU の電源をオンにします。
  3. 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 を提供またはフックする何らかの方法があるでしょう - 私はそれを読む必要があります。

4

2 に答える 2