irq: Support sleeping when mcu is idle
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
@@ -46,12 +46,24 @@ irq_restore(irqstatus_t flag)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
irq_wait(void)
|
||||
{
|
||||
asm("slp 1");
|
||||
}
|
||||
|
||||
static void
|
||||
timer_set(uint32_t value)
|
||||
{
|
||||
CT_IEP.TMR_CMP0 = value;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
timer_get_next(void)
|
||||
{
|
||||
return CT_IEP.TMR_CMP0;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
timer_read_time(void)
|
||||
{
|
||||
|
||||
@@ -135,8 +135,7 @@ static void
|
||||
process_io(void)
|
||||
{
|
||||
for (;;) {
|
||||
if (!(read_r31() & (1 << (WAKE_PRU0_IRQ + R31_IRQ_OFFSET))))
|
||||
continue;
|
||||
asm("slp 1");
|
||||
CT_INTC.SECR0 = (1 << KICK_PRU0_FROM_ARM_EVENT) | (1 << KICK_PRU0_EVENT);
|
||||
check_can_send();
|
||||
check_can_read();
|
||||
@@ -327,6 +326,10 @@ main(void)
|
||||
, CHAN_DESC, CHAN_PORT) != PRU_RPMSG_SUCCESS)
|
||||
;
|
||||
|
||||
// Allow PRU0 and PRU1 to wake from sleep
|
||||
PRU0_CTRL.WAKEUP_EN = 1 << (WAKE_PRU0_IRQ + R31_IRQ_OFFSET);
|
||||
PRU1_CTRL.WAKEUP_EN = 1 << (WAKE_PRU1_IRQ + R31_IRQ_OFFSET);
|
||||
|
||||
// Wait for PRU1 to be ready
|
||||
memset(SHARED_MEM, 0, sizeof(*SHARED_MEM));
|
||||
writel(&SHARED_MEM->signal, SIGNAL_PRU0_WAITING);
|
||||
|
||||
Reference in New Issue
Block a user