ACPIは、休止状態のために一時停止中にバッテリ不足のウェイクアップをトリガします。

ACPIは、休止状態のために一時停止中にバッテリ不足のウェイクアップをトリガします。

バッテリーが足りなくなったら休止状態に切り替えたいです。

SUBSYSTEM=="power_supply", \
    ATTR{status}=="Discharging", \
    ATTR{capacity}=="[0-5]", \
    RUN+="/usr/bin/systemctl hibernate", \

この方法は、システムが起きている場合にうまく機能します。ところが止まっていると、目が覚めるまで眠れず、その後はすぐにロックを解除できず、代わりに眠りにつく。

一時停止中にこのイベントが機能するようにしたり、キャップを開かずにスリープモード解除(およびスリープモード)を実行するにはどうすればよいですか。


私は以下を追加してみました:

    ATTR{power/wakeup}="enabled"

成功しませんでした。実際wakeup、現在では何もありません/sys/class/power_supply/BAT1/power/。事実は/sys/class/power_supply/BAT1/device/power/wakeup存在し、今も存在していますenabled

一時停止中にudevルールを実行できないようです。バッテリーが足りなくなったときに個別に起動するようにトリガーする必要があります(udevルールが実行され、スリープ状態になる可能性があります)。

これが実装されていると思います。drivers/acpi/battery.c:

    /*
     * Wakeup the system if battery is critical low
     * or lower than the alarm level
     */
    if ((battery->state & ACPI_BATTERY_STATE_CRITICAL) ||
        (test_bit(ACPI_BATTERY_ALARM_PRESENT, &battery->flags) &&
         (battery->capacity_now <= battery->alarm)))
        acpi_pm_wakeup_event(&battery->device->dev);

しかし、それは私には効果がありません。 「しきい値が低い」が別のテキスト容量レベルであるかどうかはわかりません。低から「低」までしか表示されませんが、それ以下です/sys/class/power_supply/BAT1/alarm


注:わかりましたhybrid-sleep。しかし、それは私が望むものではありません。まずは保存したいからです。一部suspend-then-hibernateバッテリーが足りない場合は、休止状態で使用できます。または時間遅延。

ベストアンサー1

これが実際にすぐに機能することがわかりました。 (バッテリーのサポートは異なる場合があります。)

/sys/class/power_supply/BATn/charge_now以下の場合、ACPIドライバはスリープモードで起動します/sys/class/power_supply/BATn/alarm

私の元の質問のudevルールは実行(および休止状態)が可能です。

alarmただし、これは、値(%charge_full)がudevルールで指定された範囲の上限と等しいか少し高いかどうかを確認したい場合があります。

おすすめ記事