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 规则中给出的范围的上限相同或仅略高于该上限。

相关内容