mirror of
https://github.com/rvtr/ctr_firmware.git
synced 2025-10-31 07:51:08 -04:00
os_interrupt_common.cをos_interrupt.cへマージ。
ARM11のosHalt修正。 git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@134 b871894f-2f95-9b40-918c-086798483c85
This commit is contained in:
parent
bf0f695510
commit
a458bc04a7
@ -36,7 +36,6 @@ SRCS = \
|
||||
os_alarm.c \
|
||||
os_irqHandler.c \
|
||||
os_interrupt.c \
|
||||
os_interrupt_common.c \
|
||||
os_thread.c \
|
||||
os_context.c \
|
||||
|
||||
|
||||
@ -39,7 +39,6 @@ SRCS = \
|
||||
os_alarm.c \
|
||||
os_irqHandler.c \
|
||||
os_interrupt.c \
|
||||
os_interrupt_common.c \
|
||||
os_thread.c \
|
||||
os_context.c \
|
||||
|
||||
|
||||
@ -17,6 +17,13 @@
|
||||
#include <brom/os.h>
|
||||
|
||||
|
||||
#ifdef SDK_ARM11
|
||||
OSIntrFunction osIntrTable[OS_INTR_ID_NUM];
|
||||
#else // SDK_ARM9
|
||||
OSIntrFunction osIntrTable[OS_INTR_ID_NUM] ATTRIBUTE_SECTION(.dtcm);
|
||||
#endif // SDK_ARM9
|
||||
|
||||
|
||||
asm void i_osIrqVeneer( void );
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
@ -28,7 +35,6 @@ asm void i_osIrqVeneer( void );
|
||||
|
||||
Returns: None
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
void osInitInterrupt( void )
|
||||
{
|
||||
static BOOL isInit;
|
||||
@ -96,7 +102,6 @@ void osInitInterrupt( void )
|
||||
Returns: None
|
||||
*---------------------------------------------------------------------------*/
|
||||
#include <brom/code32.h>
|
||||
|
||||
asm void i_osIrqVeneer( void )
|
||||
{
|
||||
INASM_EXTERN( osIrqHandler )
|
||||
@ -107,6 +112,308 @@ asm void i_osIrqVeneer( void )
|
||||
|
||||
#include <brom/codereset.h>
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: i_osInitInterruptTable
|
||||
|
||||
Description: Initialize InterruptTable
|
||||
|
||||
Arguments: None
|
||||
|
||||
Returns: None
|
||||
*---------------------------------------------------------------------------*/
|
||||
void i_osInitInterruptTable( void )
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0; i<OS_INTR_ID_NUM; i++)
|
||||
{
|
||||
osIntrTable[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osSetInterruptHandler
|
||||
|
||||
Description: Set interrupt handler
|
||||
|
||||
Arguments: interrupt ID
|
||||
interrupt handler
|
||||
|
||||
Returns: None
|
||||
*---------------------------------------------------------------------------*/
|
||||
void osSetInterruptHandler( OSIntrID id, OSIntrFunction handler )
|
||||
{
|
||||
osIntrTable[id] = handler;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osGetInterruptHandler
|
||||
|
||||
Description: Get interrupt handler
|
||||
|
||||
Arguments: interrupt ID
|
||||
interrupt handler
|
||||
|
||||
Returns: None
|
||||
*---------------------------------------------------------------------------*/
|
||||
OSIntrFunction osGetInterruptHandler( OSIntrID id )
|
||||
{
|
||||
return osIntrTable[id];
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
// Control the master of all interrupts
|
||||
//============================================================================
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osEnableInterrupts
|
||||
|
||||
Description: Set CPSR to enable irq and fiq interrupts
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
OSIntrMode osEnableInterrupts( void )
|
||||
{
|
||||
return osEnableIrq();
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osDisableInterrupts
|
||||
|
||||
Description: Set CPSR to disable irq and fiq interrupts
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
OSIntrMode osDisableInterrupts( void )
|
||||
{
|
||||
return osDisableIrq();
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osRestoreInterrupts
|
||||
|
||||
Description: Restore CPSR irq and fiq interrupts
|
||||
|
||||
Arguments: state of irq interrupt bit
|
||||
|
||||
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
OSIntrMode osRestoreInterrupts( OSIntrMode state )
|
||||
{
|
||||
return osRestoreIrq( state );
|
||||
}
|
||||
|
||||
|
||||
#include <brom/code32.h>
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osEnableIrq
|
||||
|
||||
Description: Set CPSR to enable irq interrupt
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: last state of HW_PSR_IRQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
ASM OSIntrMode osEnableIrq( void )
|
||||
{
|
||||
mrs r0, cpsr
|
||||
|
||||
#ifdef SDK_USE_MPCORE_EXTEND_OP
|
||||
cpsie i
|
||||
#else
|
||||
bic r1, r0, #HW_PSR_IRQ_DISABLE
|
||||
msr cpsr_c, r1
|
||||
#endif
|
||||
and r0, r0, #HW_PSR_IRQ_DISABLE
|
||||
bx lr
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osDisableIrq
|
||||
|
||||
Description: Set CPSR to disable irq interrupt
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: last state of HW_PSR_IRQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
ASM OSIntrMode osDisableIrq( void )
|
||||
{
|
||||
mrs r0, cpsr
|
||||
|
||||
#ifdef SDK_USE_MPCORE_EXTEND_OP
|
||||
cpsid i
|
||||
#else
|
||||
orr r1, r0, #HW_PSR_IRQ_DISABLE
|
||||
msr cpsr_c, r1
|
||||
#endif
|
||||
and r0, r0, #HW_PSR_IRQ_DISABLE
|
||||
|
||||
bx lr
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osRestoreIrq
|
||||
|
||||
Description: Restore CPSR irq interrupt
|
||||
|
||||
Arguments: state of irq and fiq interrupt bit
|
||||
|
||||
Returns: last state of HW_PSR_IRQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
ASM OSIntrMode osRestoreIrq( OSIntrMode state )
|
||||
{
|
||||
mrs r1, cpsr
|
||||
bic r2, r1, #HW_PSR_IRQ_DISABLE
|
||||
orr r2, r2, r0
|
||||
msr cpsr_c, r2
|
||||
and r0, r1, #HW_PSR_IRQ_DISABLE
|
||||
|
||||
bx lr
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osEnableFiq
|
||||
|
||||
Description: Set CPSR to enable fiq interrupt
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: last state of HW_PSR_FIQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
ASM OSIntrMode osEnableFiq( void )
|
||||
{
|
||||
mrs r0, cpsr
|
||||
|
||||
#ifdef SDK_USE_MPCORE_EXTEND_OP
|
||||
cpsie f
|
||||
#else
|
||||
bic r1, r0, #HW_PSR_FIQ_DISABLE
|
||||
msr cpsr_c, r1
|
||||
#endif
|
||||
and r0, r0, #HW_PSR_FIQ_DISABLE
|
||||
|
||||
bx lr
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osDisableFiq
|
||||
|
||||
Description: Set CPSR to disable fiq interrupt
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: last state of HW_PSR_FIQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
ASM OSIntrMode osDisableFiq( void )
|
||||
{
|
||||
mrs r0, cpsr
|
||||
|
||||
#ifdef SDK_USE_MPCORE_EXTEND_OP
|
||||
cpsid f
|
||||
#else
|
||||
orr r1, r0, #HW_PSR_FIQ_DISABLE
|
||||
msr cpsr_c, r1
|
||||
#endif
|
||||
and r0, r0, #HW_PSR_FIQ_DISABLE
|
||||
|
||||
bx lr
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osRestoreFiq
|
||||
|
||||
Description: Restore CPSR fiq interrupt
|
||||
|
||||
Arguments: state of fiq interrupt bit
|
||||
|
||||
Returns: last state of HW_PSR_FIQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
ASM OSIntrMode osRestoreFiq( OSIntrMode state )
|
||||
{
|
||||
mrs r1, cpsr
|
||||
bic r2, r1, #HW_PSR_FIQ_DISABLE
|
||||
orr r2, r2, r0
|
||||
msr cpsr_c, r2
|
||||
and r0, r1, #HW_PSR_FIQ_DISABLE
|
||||
|
||||
bx lr
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osEnableIrqAndFiq
|
||||
|
||||
Description: Set CPSR to enable irq and fiq interrupts
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
ASM OSIntrMode osEnableIrqAndFiq( void )
|
||||
{
|
||||
mrs r0, cpsr
|
||||
|
||||
#ifdef SDK_USE_MPCORE_EXTEND_OP
|
||||
cpsie if
|
||||
#else
|
||||
bic r1, r0, #HW_PSR_IRQ_FIQ_DISABLE
|
||||
msr cpsr_c, r1
|
||||
#endif
|
||||
and r0, r0, #HW_PSR_IRQ_FIQ_DISABLE
|
||||
|
||||
bx lr
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osDisableIrqAndFiq
|
||||
|
||||
Description: Set CPSR to disable irq and fiq interrupts
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
ASM OSIntrMode osDisableIrqAndFiq( void )
|
||||
{
|
||||
mrs r0, cpsr
|
||||
|
||||
#ifdef SDK_USE_MPCORE_EXTEND_OP
|
||||
cpsid if
|
||||
#else
|
||||
orr r1, r0, #HW_PSR_IRQ_FIQ_DISABLE
|
||||
msr cpsr_c, r1
|
||||
#endif
|
||||
and r0, r0, #HW_PSR_IRQ_FIQ_DISABLE
|
||||
|
||||
bx lr
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osRestoreIrqAndFiq
|
||||
|
||||
Description: Restore CPSR irq and fiq interrupts
|
||||
|
||||
Arguments: state of irq and fiq interrupt bit
|
||||
|
||||
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
ASM OSIntrMode osRestoreIrqAndFiq( OSIntrMode state )
|
||||
{
|
||||
mrs r1, cpsr
|
||||
bic r2, r1, #HW_PSR_IRQ_FIQ_DISABLE
|
||||
orr r2, r2, r0
|
||||
msr cpsr_c, r2
|
||||
and r0, r1, #HW_PSR_IRQ_FIQ_DISABLE
|
||||
|
||||
bx lr
|
||||
}
|
||||
|
||||
#include <brom/codereset.h>
|
||||
|
||||
//================================================================================
|
||||
// InterruptMask
|
||||
//================================================================================
|
||||
@ -119,7 +426,6 @@ asm void i_osIrqVeneer( void )
|
||||
|
||||
Returns: TRUE if last state is enabled
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
BOOL osEnableInterruptID( OSIntrID id )
|
||||
{
|
||||
BOOL retval;
|
||||
@ -151,7 +457,6 @@ BOOL osEnableInterruptID( OSIntrID id )
|
||||
|
||||
Returns: previous factors
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
OSIntrMask osEnableInterruptMask( OSIntrMask mask )
|
||||
{
|
||||
OSIntrMode enabled = osDisableInterrupts();
|
||||
@ -176,7 +481,6 @@ OSIntrMask osEnableInterruptMask( OSIntrMask mask )
|
||||
|
||||
Returns: TRUE if last state is enabled
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
BOOL osDisableInterruptID( OSIntrID id )
|
||||
{
|
||||
BOOL retval;
|
||||
@ -208,7 +512,6 @@ BOOL osDisableInterruptID( OSIntrID id )
|
||||
|
||||
Returns: previous factors
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
OSIntrMask osDisableInterruptMask( OSIntrMask mask )
|
||||
{
|
||||
OSIntrMode enabled = osDisableInterrupts();
|
||||
@ -234,7 +537,6 @@ OSIntrMask osDisableInterruptMask( OSIntrMask mask )
|
||||
|
||||
Returns: TRUE if last state is enabled
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
BOOL osRestoreInterruptID( OSIntrID id, BOOL state )
|
||||
{
|
||||
BOOL retval;
|
||||
@ -311,7 +613,6 @@ OSIntrMask osSetInterruptMask( OSIntrMask mask )
|
||||
|
||||
Returns: TRUE if last state is pending
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
BOOL osClearInterruptPendingID( OSIntrID id )
|
||||
{
|
||||
OSIntrMode enabled = osDisableInterrupts();
|
||||
@ -344,7 +645,6 @@ BOOL osClearInterruptPendingID( OSIntrID id )
|
||||
|
||||
Returns: previous factors
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
OSIntrMask osClearInterruptPendingMask( OSIntrMask mask )
|
||||
{
|
||||
OSIntrMode enabled = osDisableInterrupts();
|
||||
@ -371,7 +671,6 @@ OSIntrMask osClearInterruptPendingMask( OSIntrMask mask )
|
||||
|
||||
Returns: TRUE if last state is pending
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
BOOL osSetInterruptPendingID( OSIntrID id )
|
||||
{
|
||||
u32 ofs = id/32;
|
||||
@ -395,7 +694,6 @@ BOOL osSetInterruptPendingID( OSIntrID id )
|
||||
|
||||
Returns: TRUE if last state is pending
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
BOOL osRestoreInterruptPendingID( OSIntrID id, BOOL state )
|
||||
{
|
||||
u32 ofs = id/32;
|
||||
@ -427,13 +725,11 @@ BOOL osRestoreInterruptPendingID( OSIntrID id, BOOL state )
|
||||
|
||||
Returns: None
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
void osSetEndOfInterruptRegister( OSIntrID id )
|
||||
{
|
||||
reg_OS_CPUI_EOI = id;
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: i_osReadHighestPendingInterruptRegister
|
||||
|
||||
@ -443,7 +739,6 @@ void osSetEndOfInterruptRegister( OSIntrID id )
|
||||
|
||||
Returns: Interrupt Distributor ID
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
OSIntrID i_osReadHighestPendingInterruptRegister( void )
|
||||
{
|
||||
return (OSIntrID)(reg_OS_CPUI_HI_PND & REG_OS_CPUI_HI_PND_ID_MASK);
|
||||
@ -460,7 +755,6 @@ OSIntrID i_osReadHighestPendingInterruptRegister( void )
|
||||
|
||||
Returns: Interrupt Distributor ID
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
OSIntrID i_osReadInterruptAcknowledgeRegister( void )
|
||||
{
|
||||
return (OSIntrID)(reg_OS_CPUI_ACK & REG_OS_CPUI_ACK_ID_MASK);
|
||||
|
||||
@ -1,400 +0,0 @@
|
||||
/*---------------------------------------------------------------------------*
|
||||
Project: CtrBrom - libraries - OS
|
||||
File: os_interrupt_common.c
|
||||
|
||||
Copyright 2008 Nintendo. All rights reserved.
|
||||
|
||||
These coded instructions, statements, and computer programs contain
|
||||
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||
Company Ltd., and are protected by Federal copyright law. They may
|
||||
not be disclosed to third parties or copied or duplicated in any form,
|
||||
in whole or in part, without the prior written consent of Nintendo.
|
||||
|
||||
$Date:: $
|
||||
$Rev$
|
||||
$Author$
|
||||
*---------------------------------------------------------------------------*/
|
||||
#include <brom/os.h>
|
||||
|
||||
|
||||
#ifdef SDK_ARM11
|
||||
OSIntrFunction osIntrTable[OS_INTR_ID_NUM];
|
||||
#else // SDK_ARM9
|
||||
OSIntrFunction osIntrTable[OS_INTR_ID_NUM] ATTRIBUTE_SECTION(.dtcm);
|
||||
#endif // SDK_ARM9
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: i_osInitInterruptTable
|
||||
|
||||
Description: Initialize InterruptTable
|
||||
|
||||
Arguments: None
|
||||
|
||||
Returns: None
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
void i_osInitInterruptTable( void )
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=0; i<OS_INTR_ID_NUM; i++)
|
||||
{
|
||||
osIntrTable[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osSetInterruptHandler
|
||||
|
||||
Description: Set interrupt handler
|
||||
|
||||
Arguments: interrupt ID
|
||||
interrupt handler
|
||||
|
||||
Returns: None
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
void osSetInterruptHandler( OSIntrID id, OSIntrFunction handler )
|
||||
{
|
||||
osIntrTable[id] = handler;
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osGetInterruptHandler
|
||||
|
||||
Description: Get interrupt handler
|
||||
|
||||
Arguments: interrupt ID
|
||||
interrupt handler
|
||||
|
||||
Returns: None
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
OSIntrFunction osGetInterruptHandler( OSIntrID id )
|
||||
{
|
||||
return osIntrTable[id];
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osEnableInterrupts
|
||||
|
||||
Description: Set CPSR to enable irq and fiq interrupts
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
OSIntrMode osEnableInterrupts( void )
|
||||
{
|
||||
return osEnableIrq();
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osDisableInterrupts
|
||||
|
||||
Description: Set CPSR to disable irq and fiq interrupts
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
OSIntrMode osDisableInterrupts( void )
|
||||
{
|
||||
return osDisableIrq();
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osRestoreInterrupts
|
||||
|
||||
Description: Restore CPSR irq and fiq interrupts
|
||||
|
||||
Arguments: state of irq interrupt bit
|
||||
|
||||
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
OSIntrMode osRestoreInterrupts( OSIntrMode state )
|
||||
{
|
||||
return osRestoreIrq( state );
|
||||
}
|
||||
|
||||
#include <brom/code32.h>
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osHaltUntilInterrupt
|
||||
|
||||
Description: Halt CPU Core until Interrupt
|
||||
|
||||
Arguments: None
|
||||
|
||||
Returns: None
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
ASM void osHaltUntilInterrupt( void )
|
||||
{
|
||||
PRESERVE8
|
||||
|
||||
mov r0, #0
|
||||
mcr p15, 0, r0, c7, c0, 4
|
||||
bx lr
|
||||
}
|
||||
|
||||
|
||||
#ifdef SDK_ARM11
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osHaltUntilEvent
|
||||
|
||||
Description: Halt CPU Core until Event
|
||||
|
||||
Arguments: None
|
||||
|
||||
Returns: None
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
ASM void osHaltUntilEvent( void )
|
||||
{
|
||||
wfe
|
||||
bx lr
|
||||
}
|
||||
|
||||
#endif // SDK_ARM11
|
||||
|
||||
|
||||
//============================================================================
|
||||
// Control the master of all interrupts
|
||||
//============================================================================
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osEnableIrq
|
||||
|
||||
Description: Set CPSR to enable irq interrupt
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: last state of HW_PSR_IRQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
ASM OSIntrMode osEnableIrq( void )
|
||||
{
|
||||
mrs r0, cpsr
|
||||
|
||||
#ifdef SDK_USE_MPCORE_EXTEND_OP
|
||||
cpsie i
|
||||
#else
|
||||
bic r1, r0, #HW_PSR_IRQ_DISABLE
|
||||
msr cpsr_c, r1
|
||||
#endif
|
||||
|
||||
and r0, r0, #HW_PSR_IRQ_DISABLE
|
||||
|
||||
bx lr
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osDisableIrq
|
||||
|
||||
Description: Set CPSR to disable irq interrupt
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: last state of HW_PSR_IRQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
ASM OSIntrMode osDisableIrq( void )
|
||||
{
|
||||
mrs r0, cpsr
|
||||
|
||||
#ifdef SDK_USE_MPCORE_EXTEND_OP
|
||||
cpsid i
|
||||
#else
|
||||
orr r1, r0, #HW_PSR_IRQ_DISABLE
|
||||
msr cpsr_c, r1
|
||||
#endif
|
||||
|
||||
and r0, r0, #HW_PSR_IRQ_DISABLE
|
||||
|
||||
bx lr
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osRestoreIrq
|
||||
|
||||
Description: Restore CPSR irq interrupt
|
||||
|
||||
Arguments: state of irq and fiq interrupt bit
|
||||
|
||||
Returns: last state of HW_PSR_IRQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
ASM OSIntrMode osRestoreIrq( OSIntrMode state )
|
||||
{
|
||||
mrs r1, cpsr
|
||||
bic r2, r1, #HW_PSR_IRQ_DISABLE
|
||||
orr r2, r2, r0
|
||||
msr cpsr_c, r2
|
||||
and r0, r1, #HW_PSR_IRQ_DISABLE
|
||||
|
||||
bx lr
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osEnableFiq
|
||||
|
||||
Description: Set CPSR to enable fiq interrupt
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: last state of HW_PSR_FIQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
ASM OSIntrMode osEnableFiq( void )
|
||||
{
|
||||
mrs r0, cpsr
|
||||
|
||||
#ifdef SDK_USE_MPCORE_EXTEND_OP
|
||||
cpsie f
|
||||
#else
|
||||
bic r1, r0, #HW_PSR_FIQ_DISABLE
|
||||
msr cpsr_c, r1
|
||||
#endif
|
||||
|
||||
and r0, r0, #HW_PSR_FIQ_DISABLE
|
||||
|
||||
bx lr
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osDisableFiq
|
||||
|
||||
Description: Set CPSR to disable fiq interrupt
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: last state of HW_PSR_FIQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
ASM OSIntrMode osDisableFiq( void )
|
||||
{
|
||||
mrs r0, cpsr
|
||||
|
||||
#ifdef SDK_USE_MPCORE_EXTEND_OP
|
||||
cpsid f
|
||||
#else
|
||||
orr r1, r0, #HW_PSR_FIQ_DISABLE
|
||||
msr cpsr_c, r1
|
||||
#endif
|
||||
|
||||
and r0, r0, #HW_PSR_FIQ_DISABLE
|
||||
|
||||
bx lr
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osRestoreFiq
|
||||
|
||||
Description: Restore CPSR fiq interrupt
|
||||
|
||||
Arguments: state of fiq interrupt bit
|
||||
|
||||
Returns: last state of HW_PSR_FIQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
ASM OSIntrMode osRestoreFiq( OSIntrMode state )
|
||||
{
|
||||
mrs r1, cpsr
|
||||
bic r2, r1, #HW_PSR_FIQ_DISABLE
|
||||
orr r2, r2, r0
|
||||
msr cpsr_c, r2
|
||||
and r0, r1, #HW_PSR_FIQ_DISABLE
|
||||
|
||||
bx lr
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osEnableIrqAndFiq
|
||||
|
||||
Description: Set CPSR to enable irq and fiq interrupts
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
ASM OSIntrMode osEnableIrqAndFiq( void )
|
||||
{
|
||||
mrs r0, cpsr
|
||||
|
||||
#ifdef SDK_USE_MPCORE_EXTEND_OP
|
||||
cpsie if
|
||||
#else
|
||||
bic r1, r0, #HW_PSR_IRQ_FIQ_DISABLE
|
||||
msr cpsr_c, r1
|
||||
#endif
|
||||
|
||||
and r0, r0, #HW_PSR_IRQ_FIQ_DISABLE
|
||||
|
||||
bx lr
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osDisableIrqAndFiq
|
||||
|
||||
Description: Set CPSR to disable irq and fiq interrupts
|
||||
|
||||
Arguments: None.
|
||||
|
||||
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
ASM OSIntrMode osDisableIrqAndFiq( void )
|
||||
{
|
||||
mrs r0, cpsr
|
||||
|
||||
#ifdef SDK_USE_MPCORE_EXTEND_OP
|
||||
cpsid if
|
||||
#else
|
||||
orr r1, r0, #HW_PSR_IRQ_FIQ_DISABLE
|
||||
msr cpsr_c, r1
|
||||
#endif
|
||||
|
||||
and r0, r0, #HW_PSR_IRQ_FIQ_DISABLE
|
||||
|
||||
bx lr
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osRestoreIrqAndFiq
|
||||
|
||||
Description: Restore CPSR irq and fiq interrupts
|
||||
|
||||
Arguments: state of irq and fiq interrupt bit
|
||||
|
||||
Returns: last state of HW_PSR_IRQ_DISABLE & HW_PSR_FIQ_DISABLE
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
ASM OSIntrMode osRestoreIrqAndFiq( OSIntrMode state )
|
||||
{
|
||||
mrs r1, cpsr
|
||||
bic r2, r1, #HW_PSR_IRQ_FIQ_DISABLE
|
||||
orr r2, r2, r0
|
||||
msr cpsr_c, r2
|
||||
and r0, r1, #HW_PSR_IRQ_FIQ_DISABLE
|
||||
|
||||
bx lr
|
||||
}
|
||||
|
||||
#include <brom/codereset.h>
|
||||
|
||||
@ -85,6 +85,8 @@ void osTerminate(void)
|
||||
}
|
||||
}
|
||||
|
||||
#include <brom/code32.h>
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osHalt
|
||||
|
||||
@ -94,13 +96,37 @@ void osTerminate(void)
|
||||
|
||||
Returns: None
|
||||
*---------------------------------------------------------------------------*/
|
||||
#include <brom/code32.h>
|
||||
ASM void osHalt( void )
|
||||
{
|
||||
#ifdef SDK_ARM11
|
||||
wfi
|
||||
#else // SDK_ARM9
|
||||
mov r0, #0
|
||||
mcr p15, 0, r0, c7, c0, 4
|
||||
#endif // SDK_ARM9
|
||||
bx lr
|
||||
}
|
||||
|
||||
#ifdef SDK_ARM11
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
Name: osHaltUntilEvent
|
||||
|
||||
Description: Halt CPU Core until Event
|
||||
|
||||
Arguments: None
|
||||
|
||||
Returns: None
|
||||
*---------------------------------------------------------------------------*/
|
||||
|
||||
ASM void osHaltUntilEvent( void )
|
||||
{
|
||||
wfe
|
||||
bx lr
|
||||
}
|
||||
|
||||
#endif // SDK_ARM11
|
||||
|
||||
#include <brom/codereset.h>
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
|
||||
Loading…
Reference in New Issue
Block a user