我尝试在按下按钮时在 uboot 中实现低功耗“深度睡眠”功能。按钮按下由 linux 处理,并设置了一个魔术代码以使 u-boot 意识到保持睡眠不要重新启动"
printf ("\nDisable interrupts to restore them later\n");
rupts = disable_interrupts();
printf ("\nEnable interrupts to enable magic wakeup later\n");
enable_interrupts();
printf ("\nSuspending. Press button to restart\n");
while(probe_button()/*gpio probe*/){
#if 1
//FIXME recheck if that one actually needs an unmasked interrupt or any is ok
__asm__ __volatile__(
"mcr p15, 0, %0, c7, c0, 4\n" /* read cp15 */
"mov %0, %0"
: "=r" (tmp)
:
: "memory"
);
#else
udelay (10000);
#endif
}
if (rupts) {
printf ("\nRe-Enabling interrupts\n");
enable_interrupts();
}
不幸的是,无论是否使用热旋转,功耗都不会改变(将功耗测量与芯片相关联)。除此之外,如果我使用等待中断 CP15 指令,它永远不会唤醒。该按钮连接到其中一个 GPIO。该平台基于 Marvell Kirkwood ARM9EJ-S。
我手动启用了一些,并为以及CONFIG_IRQ_*
创建实现,我认为这是我的问题。arch_init_irq()
do_irq()
根据CP15指令文档,触发中断就足够了(无论是否被屏蔽!)。
谁能告诉我我做错了什么或者除了上面的代码还需要做什么?
提前非常感谢!