我已经成功使用pm_power_off
函数指针通过i2c调用自定义Linux板的电源管理芯片(关闭电源)。
我希望Linux的halt
命令也可以关闭电源。
我该如何实现这个功能?
machine_halt
的(ARM架构)代码没有像pm_power_off
的pm_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从设备运行)。
- 如果Linux内核正在运行,我希望忽略这个边缘。
- 如果CPU已关闭电源,我希望这个边缘可以开启CPU电源。
- 如果Linux内核已停止,我希望这个边缘可以重置CPU。
情况1很容易,无需做任何事情。
情况2很容易,在我的驱动程序中定义pm_power_off
,向PMU发送一条i2c消息。幸运的是,在调用pm_power_off
时,i2c子系统仍处于工作状态。
情况3是问题所在-我正在寻找一个pm_halt
进行定义,向PMU发送一条i2c消息。
也许有另一种方法,正如0andriy的评论那样?
在内核中是否有一个位置,可以以几个赫兹的频率不断地向PMU发送i2c消息,除非机器已停止halt
?
答案在这里:https://unix.stackexchange.com/a/42576/17288 :
"* 现在的halt足够聪明,如果启用了ACPI,会自动调用poweroff。实际上,它们现在在功能上是等价的。"
也许有一些方法可以提供或连接到ACPI-我将需要研究一下它。