Skip to content

Commit 41cd026

Browse files
committed
Implement sleep-related registers and enter sleep on WFI when enabled
1 parent 6ed2a70 commit 41cd026

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

core/arm/armcpu.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -965,6 +965,10 @@ void arm_cpu_execute(arm_t *arm) {
965965
case 2: // Wait for Event hint
966966
break;
967967
case 3: // Wait for Interrupt hint
968+
if ((arm->mem.pm.SLEEP.bit.IDLE == PM_SLEEP_IDLE_APB_Val) &&
969+
(arm->cpu.scb.scr & SCB_SCR_SLEEPDEEP_Msk)) {
970+
sync_sleep(&arm->sync);
971+
}
968972
break;
969973
case 4: // Send Event hint
970974
break;

core/arm/armmem.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,8 @@ static uint32_t arm_mem_load_any(arm_t *arm, uint32_t addr) {
350350
case ID_PM: {
351351
PM_Type *pm = &arm->mem.pm;
352352
switch (offset) {
353+
case PM_SLEEP_OFFSET >> 2:
354+
return pm->SLEEP.reg << 8;
353355
case (PM_CPUSEL_OFFSET |
354356
PM_APBASEL_OFFSET |
355357
PM_APBBSEL_OFFSET |
@@ -792,6 +794,8 @@ uint32_t arm_mem_load_word(arm_t *arm, uint32_t addr) {
792794
return scb->vtor;
793795
case 0x00C: // AIRCR
794796
return 0;
797+
case 0x010: // SCR
798+
return scb->scr;
795799
case 0x014: // CCR
796800
return SCB_CCR_STKALIGN_Msk |
797801
SCB_CCR_UNALIGN_TRP_Msk;
@@ -850,6 +854,10 @@ static void arm_mem_store_any(arm_t *arm, uint32_t val, uint32_t mask, uint32_t
850854
case ID_PM: {
851855
PM_Type *pm = &arm->mem.pm;
852856
switch (offset) {
857+
case PM_SLEEP_OFFSET >> 2:
858+
pm->SLEEP.reg =
859+
((pm->SLEEP.reg & mask >> 8) | val >> 8) & PM_SLEEP_MASK;
860+
return;
853861
case (PM_CPUSEL_OFFSET |
854862
PM_APBASEL_OFFSET |
855863
PM_APBBSEL_OFFSET |
@@ -891,7 +899,7 @@ static void arm_mem_store_any(arm_t *arm, uint32_t val, uint32_t mask, uint32_t
891899
case SYSCTRL_INTENSET_OFFSET >> 2:
892900
break;
893901
case SYSCTRL_INTFLAG_OFFSET >> 2:
894-
break;
902+
return;
895903
case SYSCTRL_PCLKSR_OFFSET >> 2:
896904
return;
897905
case SYSCTRL_XOSC_OFFSET >> 2:
@@ -1478,6 +1486,9 @@ void arm_mem_store_word(arm_t *arm, uint32_t val, uint32_t addr) {
14781486
}
14791487
}
14801488
return;
1489+
case 0x010: // SCR
1490+
scb->scr = val & (SCB_SCR_SEVONPEND_Msk | SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk);
1491+
return;
14811492
case 0x01C: // SHP[0]
14821493
scb->shp[0] = val & UINT32_C(0xC0000000);
14831494
return;

0 commit comments

Comments
 (0)