diff options
author | Revo <projectrevotpp@hotmail.com> | 2020-06-12 14:07:11 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-12 14:07:11 -0400 |
commit | c4263506fa96acc210d1cf356023a3ffde805a0b (patch) | |
tree | b39057449acad0ae7866534e5bdbad99091bd9f7 /arm7/lib/src | |
parent | 45f97db651b38ea41d33402efea293e50a31725a (diff) | |
parent | a2dc5cb0cf5db3b4d8103ab5abc6e67faae2e3d3 (diff) |
Merge pull request #160 from red031000/master
arm7 OS_reset
Diffstat (limited to 'arm7/lib/src')
-rw-r--r-- | arm7/lib/src/OS_init.c | 1 | ||||
-rw-r--r-- | arm7/lib/src/OS_reset.c | 59 |
2 files changed, 59 insertions, 1 deletions
diff --git a/arm7/lib/src/OS_init.c b/arm7/lib/src/OS_init.c index f4972638..583bb75e 100644 --- a/arm7/lib/src/OS_init.c +++ b/arm7/lib/src/OS_init.c @@ -7,7 +7,6 @@ extern void OS_InitIrqTable(void); extern void OS_InitTick(void); extern void OS_InitAlarm(void); extern void OS_InitThread(void); -extern void OS_InitReset(void); extern void CTRDG_Init(void); ARM_FUNC void OS_Init(void) diff --git a/arm7/lib/src/OS_reset.c b/arm7/lib/src/OS_reset.c new file mode 100644 index 00000000..c40fcff3 --- /dev/null +++ b/arm7/lib/src/OS_reset.c @@ -0,0 +1,59 @@ +#include "function_target.h" +#include "OS_reset.h" +#include "OS_interrupt.h" + +static u16 OSi_IsInitReset = 0; +vu16 OSi_IsResetOccurred = 0; + +extern void MI_StopDma(u32 dma); +extern OSIrqMask OS_SetIrqMask(OSIrqMask mask); +extern OSIrqMask OS_ResetRequestIrqMask(OSIrqMask mask); +extern void SND_Shutdown(void); +extern void PXI_SetFifoRecvCallback(u32 param1, void* callback); +extern void OS_Terminate(void); +extern u32 PXI_SendWordByFifo(u32 param1, u32 data, u32 param2); +extern void FUN_038073EC(void); //OSi_DoResetSystem, in wram + +ARM_FUNC void OS_InitReset(void) +{ + if (OSi_IsInitReset) + return; + OSi_IsInitReset = TRUE; + + PXI_SetFifoRecvCallback(PXI_FIFO_TAG_OS, OSi_CommonCallback); +} + +ARM_FUNC BOOL OS_IsResetOccurred(void) +{ + return OSi_IsResetOccurred; +} + +ARM_FUNC static void OSi_CommonCallback(PXIFifoTag tag, u32 data, BOOL err) +{ +#pragma unused(tag, err) + u16 command = (u16)((data & OS_PXI_COMMAND_MASK) >> OS_PXI_COMMAND_SHIFT); + if (command == OS_PXI_COMMAND_RESET) + { + OSi_IsResetOccurred = TRUE; + return; + } + OS_Terminate(); +} + +ARM_FUNC static void OSi_SendToPxi(u16 data) +{ + while (PXI_SendWordByFifo(PXI_FIFO_TAG_OS, (u32) data << 0x8, FALSE)) {} +} + +ARM_FUNC void OS_ResetSystem(void) { + MI_StopDma(0); + MI_StopDma(1); + MI_StopDma(2); + MI_StopDma(3); + + (void)OS_SetIrqMask(0x40000); + (void)OS_ResetRequestIrqMask((u32)~0); + SND_Shutdown(); + OSi_SendToPxi(OS_PXI_COMMAND_RESET); + FUN_038073EC(); //OSi_DoResetSystem, in wram +} |