Embedded 在u-boot内进入低功耗模式,中断时唤醒

Embedded 在u-boot内进入低功耗模式,中断时唤醒,embedded,arm,interrupt,u-boot,arm9,Embedded,Arm,Interrupt,U Boot,Arm9,我尝试在按下按钮时在uboot中实现低功耗的“深度睡眠”功能。按钮按下由linux处理,并且设置了一个魔术代码,使u-boot知道“保持睡眠,不要重新启动” 不幸的是,无论是否使用热插针,功耗根本没有变化(将功耗测量与芯片绑定)。除此之外,如果使用等待中断CP15指令,它永远不会唤醒。按钮连接到一个GPIO上。平台基于Marvell Kirkwood ARM9EJ-S 我手动启用了一些CONFIG\u IRQ.*,并为arch\u init\u IRQ()以及do\u IRQ()创建了实现,我认

我尝试在按下按钮时在uboot中实现低功耗的“深度睡眠”功能。按钮按下由linux处理,并且设置了一个魔术代码,使u-boot知道“保持睡眠,不要重新启动”

不幸的是,无论是否使用热插针,功耗根本没有变化(将功耗测量与芯片绑定)。除此之外,如果使用等待中断CP15指令,它永远不会唤醒。按钮连接到一个GPIO上。平台基于Marvell Kirkwood ARM9EJ-S

我手动启用了一些
CONFIG\u IRQ.*
,并为
arch\u init\u IRQ()
以及
do\u IRQ()
创建了实现,我认为这是我的问题

根据CP15指令文档,触发中断(无论是否被屏蔽!)就足够了

有人能告诉我我做错了什么,或者除了上面的代码之外还需要做什么吗


提前非常感谢!

我不确定这是否是您的aproach不致力于节能的唯一原因,但您的内联程序集不正确。根据这一点,您需要执行:

MOV R0, #0
MCR p15, 0, r0, c7, c0, 4
但是您的内联程序集

        __asm__ __volatile__(
                        "mcr p15, 0, %0, c7, c0, 4\n" /* read cp15 */
                        "mov %0, %0"
                        : "=r" (tmp)
                        :
                        : "memory"
        );
产生

   0:   ee073f90    mcr 15, 0, r3, cr7, cr0, {4}
   4:   e1a03003    mov r3, r3
   8:   e12fff1e    bx  lr
我不知道你的意图是什么,但是
movr3,r3
没有ẗ 有任何影响。因此,您正在使用随机值进行协处理器调用。您还需要在
mcr
call之前设置r3(mcr的ARM源寄存器)。顺便说一句,当您将“内存”放入clobber列表中时

…将导致GCC不将内存值缓存在汇编指令的寄存器中,也不优化存储或加载到该内存

试试这句话

asm("MOV R0, #0\n MCR p15, 0, r0, c7, c0, 4" : : : "r0");
它产生

   c:   e3a00000    mov r0, #0  ; 0x0
  10:   ee070f90    mcr 15, 0, r0, cr7, cr0, {4}
一般来说,为了省电,我会在ARM的网站上推荐

奖金部分:
您关于协处理器提供的WFI向后兼容性的说法的一个小回答:

ARMv7处理器(包括Cortex-A8、Cortex-A9、Cortex-R4和Cortex-M3)都执行WFI指令进入“等待中断”“模式在这些处理器上,早期处理器上使用的协处理器写操作将始终作为NOP执行。因此,可以通过执行MCR和WFI指令来编写可跨ARMv6K、ARMv6T2和ARMv7的所有配置文件工作的代码,但在ARM11MPCore上这将导致“等待中断”模式输入两次。要编写进入“等待中断”模式的完全可移植代码,必须在运行时读取CPUID寄存器,以确定“等待中断”是否可用以及输入它所需的指令


我认为这类问题太具体了,因为它是很多低层次的硬件,并且局限于特定的处理器,而内联汇编看起来并不正确。(“MOV R0,#0\n MCR p15,0,R0,c7,c0,4):::“R0”)@AlvinWong毕竟值得一试——有很多基于kirkwood的设备,具有很高的“黑客性”价值(guruplug,sheeva,…),而且最新的Cortex a芯片中仍然使用该指令来让内核休息(毕竟ARM具有相当好的向后兼容性)@我看不出有什么不同。我只是通过“内存”告诉gcc寄存器可能会被阻塞,允许gcc根据gcc的喜好为tmp选择寄存器。我看不出有什么不同,除了内联对r0的约束之外。如果我错了或者遗漏了什么,请纠正我。@AlvinWong WFI并不是那么低级的硬件产品,也不局限于某个特定的处理器品牌,这个想法得到了多个版本的ARM架构的支持。这不是解决方案,但我想这是我的问题所能解决的最好办法。当前的疑点是中断配置(如果不使用VIC,则实际上是wierd,您必须通过相应地设置cspr_c来停用IRQ)
   c:   e3a00000    mov r0, #0  ; 0x0
  10:   ee070f90    mcr 15, 0, r0, cr7, cr0, {4}