停止运行时如何closureslinux电源?

我已经成功地使用了pm_power_off函数指针,使我的自定义Linux电路板通过i2c调用其电源pipe理芯片(closures电源)。

我希望Linux halt命令也可以closures电源。

我怎样才能做到这一点?

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

弓/ ARM /内核/ 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(); } 

我可以显然只是hack machine_halt ,但是如果可能的话,我想这样做“正确”。

我错过了什么(可能在用户空间),这可能导致halt命令执行“关机”?


更新:感谢您的回答和您的所有意见,他们帮助我认识到实际问题是什么。

我的问题是:

我有一个input边缘,可用于定制电源pipe理单元。 把它看作一个开始button,没有停止或重置function。 我完全控制了PMU代码(这是一个作为i2c从站运行的ATMEGA)。

  1. 如果Linux内核正在运行,我希望边界被忽略。
  2. 如果CPU断电,我希望边缘能够启动CPU。
  3. 如果Linux内核暂停,我希望边缘重置CPU。

案例1很容易,无事可做。

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

情况3是问题 – 我正在寻找一个pm_halt来定义,发送一个pm_halt消息给PMU。

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

除非机器halt运行, 否则在内核中有一个地方可以用几Hz的i2c消息来激励PMU?

答案在: https : //unix.stackexchange.com/a/42576/17288上写着:

“*这些日子暂停是聪明的,如果启用ACPI自动调用关机,事实上,他们现在function相当。

也许有一些提供或挂钩ACPI的方法 – 我将不得不阅读它。

Solutions Collecting From Web of "停止运行时如何closureslinux电源?"

您应该使用poweroff命令或halt -p 。 按照人8停止 , halt命令(不带参数)不保证关闭你的机器。 原因在这里描述:

在ACPI之前halt使用(今天将关闭电源)*。 它会暂停系统,然后打印一条消息,以“现在可以关闭”。 当时有物理开/关开关,而不是现代计算机的组合ACPI控制的电源按钮。

*如果启用了ACPI,那么halt就足够智能地自动调用关机了。 事实上,他们现在在功能上是等同的。

halt工具源代码中可以看到,它使用cmd = RB_POWER_OFF = LINUX_REBOOT_CMD_POWER_OFF发出reboot()系统调用。

在内核中,这个系统调用是在这里实现的,在cmd = LINUX_REBOOT_CMD_POWER_OFF ,它调用:
– > kernel_power_off()
– > machine_power_off()
– > pm_power_off()