diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2017-07-12 22:16:16 -0400 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2017-07-17 15:02:43 -0400 |
commit | 118fd21cb815d1c27e7e5bd6b394369bdf095919 (patch) | |
tree | 78ceda354491dfb66419f0a7e892017a05319a73 /src/pru | |
parent | 969485c754731183f357e6fef23c6180f59d4cb6 (diff) | |
download | kutter-118fd21cb815d1c27e7e5bd6b394369bdf095919.tar.gz kutter-118fd21cb815d1c27e7e5bd6b394369bdf095919.tar.xz kutter-118fd21cb815d1c27e7e5bd6b394369bdf095919.zip |
irq: Support sleeping when mcu is idle
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'src/pru')
-rw-r--r-- | src/pru/main.c | 12 | ||||
-rw-r--r-- | src/pru/pru0.c | 7 |
2 files changed, 17 insertions, 2 deletions
diff --git a/src/pru/main.c b/src/pru/main.c index 3ead0bde..021bee3f 100644 --- a/src/pru/main.c +++ b/src/pru/main.c @@ -46,6 +46,12 @@ irq_restore(irqstatus_t flag) { } +void +irq_wait(void) +{ + asm("slp 1"); +} + static void timer_set(uint32_t value) { @@ -53,6 +59,12 @@ timer_set(uint32_t value) } uint32_t +timer_get_next(void) +{ + return CT_IEP.TMR_CMP0; +} + +uint32_t timer_read_time(void) { return CT_IEP.TMR_CNT; diff --git a/src/pru/pru0.c b/src/pru/pru0.c index 3a8fd421..c6a63cb9 100644 --- a/src/pru/pru0.c +++ b/src/pru/pru0.c @@ -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); |