ボタンを押すと、低電力の「ディープスリープ」機能を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();
}
残念ながら、ホットスピニングが使用されているかどうかに関係なく、消費電力はまったく変化しません (消費電力の測定値がチップに関連付けられています)。さらに、Wait-For-Interrupt CP15 命令を使用すると、起動しません。ボタンは、GPIO の 1 つに接続されています。プラットフォームは Marvell Kirkwood ARM9EJ-S ベースです。
CONFIG_IRQ_*
私はいくつかを手動で有効にし、arch_init_irq()
同様に の実装を作成しましdo_irq()
た。私の問題があると思います。
CP15命令ドキュメントによると、割り込みがトリガーされるだけで十分なはずです(マスクされているかどうかに関係なく!)。
私が間違っていること、または上記のコード以外に何をする必要があるかを誰か教えてもらえますか?
よろしくお願いします!