gpt4 book ai didi

linux - 如何让linux在halt运行时断电?

转载 作者:行者123 更新时间:2023-12-03 03:49:16 26 4
gpt4 key购买 nike

我已成功使用 pm_power_off 函数指针让我的自定义 Linux 板通过 i2c 调用其电源管理芯片(以关闭电源)。

我也想要 Linux halt 命令来关闭电源。

我怎样才能实现这个目标?

machine_halt 的 (ARM) 代码没有类似于 machine_power_offpm_power_off 的指针。

arch/arm/kernel/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 内核停止,我希望 Edge 重置 CPU。

情况 1 很简单,无需执行任何操作。

情况 2 很简单,在我的驱动程序中定义 pm_power_off 以向 PMU 发送 i2c 消息。幸运的是,当调用 pm_power_off 时,i2c 子系统仍处于工作状态。

情况 3 是问题所在 - 我正在寻找一个 pm_halt 来定义,以将 i2c 消息发送到 PMU。

也许还有另一种方式,如 0andriy 评论?

内核中是否有一个地方可以以几赫兹的频率持续用 i2c 消息刺激 PMU,除非机器停止

答案为:https://unix.stackexchange.com/a/42576/17288内容如下:

“* 如今,如果启用了 ACPI,halt 就足够智能,可以自动调用关闭电源。事实上,它们现在在功能上是等效的。”

也许有某种方法可以提供或连接到 ACPI - 我将不得不阅读它。

最佳答案

您应该使用poweroff命令或halt -p。根据man 8 halt , halt 命令(不带参数)不能保证关闭您的计算机。原因描述here :

halt was used before ACPI (which today will turn off the power for you)*. It would halt the system and then print a message to the effect of "it's ok to power off now". Back then there were physical on/off switches, rather than the combo ACPI controlled power button of modern computers.

*These days halt is smart enough to automatically call poweroff if ACPI is enabled. In fact, they are functionally equivalent now.

正如您从 halt 工具源代码中看到的,它发出 reboot()系统调用 cmd = RB_POWER_OFF = LINUX_REBOOT_CMD_POWER_OFF

在内核中,该系统调用被实现 here ,并且在 cmd = LINUX_REBOOT_CMD_POWER_OFF 上,它调用:
-> kernel_power_off()
-> machine_power_off()
-> pm_power_off()

关于linux - 如何让linux在halt运行时断电?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41596661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com