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_alarm.c \
|
||||||
os_irqHandler.c \
|
os_irqHandler.c \
|
||||||
os_interrupt.c \
|
os_interrupt.c \
|
||||||
os_interrupt_common.c \
|
|
||||||
os_thread.c \
|
os_thread.c \
|
||||||
os_context.c \
|
os_context.c \
|
||||||
|
|
||||||
|
|||||||
@ -39,7 +39,6 @@ SRCS = \
|
|||||||
os_alarm.c \
|
os_alarm.c \
|
||||||
os_irqHandler.c \
|
os_irqHandler.c \
|
||||||
os_interrupt.c \
|
os_interrupt.c \
|
||||||
os_interrupt_common.c \
|
|
||||||
os_thread.c \
|
os_thread.c \
|
||||||
os_context.c \
|
os_context.c \
|
||||||
|
|
||||||
|
|||||||
@ -17,6 +17,13 @@
|
|||||||
#include <brom/os.h>
|
#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 );
|
asm void i_osIrqVeneer( void );
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
@ -28,7 +35,6 @@ asm void i_osIrqVeneer( void );
|
|||||||
|
|
||||||
Returns: None
|
Returns: None
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void osInitInterrupt( void )
|
void osInitInterrupt( void )
|
||||||
{
|
{
|
||||||
static BOOL isInit;
|
static BOOL isInit;
|
||||||
@ -96,7 +102,6 @@ void osInitInterrupt( void )
|
|||||||
Returns: None
|
Returns: None
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
#include <brom/code32.h>
|
#include <brom/code32.h>
|
||||||
|
|
||||||
asm void i_osIrqVeneer( void )
|
asm void i_osIrqVeneer( void )
|
||||||
{
|
{
|
||||||
INASM_EXTERN( osIrqHandler )
|
INASM_EXTERN( osIrqHandler )
|
||||||
@ -107,6 +112,308 @@ asm void i_osIrqVeneer( void )
|
|||||||
|
|
||||||
#include <brom/codereset.h>
|
#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
|
// InterruptMask
|
||||||
//================================================================================
|
//================================================================================
|
||||||
@ -119,7 +426,6 @@ asm void i_osIrqVeneer( void )
|
|||||||
|
|
||||||
Returns: TRUE if last state is enabled
|
Returns: TRUE if last state is enabled
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
BOOL osEnableInterruptID( OSIntrID id )
|
BOOL osEnableInterruptID( OSIntrID id )
|
||||||
{
|
{
|
||||||
BOOL retval;
|
BOOL retval;
|
||||||
@ -151,7 +457,6 @@ BOOL osEnableInterruptID( OSIntrID id )
|
|||||||
|
|
||||||
Returns: previous factors
|
Returns: previous factors
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
OSIntrMask osEnableInterruptMask( OSIntrMask mask )
|
OSIntrMask osEnableInterruptMask( OSIntrMask mask )
|
||||||
{
|
{
|
||||||
OSIntrMode enabled = osDisableInterrupts();
|
OSIntrMode enabled = osDisableInterrupts();
|
||||||
@ -176,7 +481,6 @@ OSIntrMask osEnableInterruptMask( OSIntrMask mask )
|
|||||||
|
|
||||||
Returns: TRUE if last state is enabled
|
Returns: TRUE if last state is enabled
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
BOOL osDisableInterruptID( OSIntrID id )
|
BOOL osDisableInterruptID( OSIntrID id )
|
||||||
{
|
{
|
||||||
BOOL retval;
|
BOOL retval;
|
||||||
@ -208,7 +512,6 @@ BOOL osDisableInterruptID( OSIntrID id )
|
|||||||
|
|
||||||
Returns: previous factors
|
Returns: previous factors
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
OSIntrMask osDisableInterruptMask( OSIntrMask mask )
|
OSIntrMask osDisableInterruptMask( OSIntrMask mask )
|
||||||
{
|
{
|
||||||
OSIntrMode enabled = osDisableInterrupts();
|
OSIntrMode enabled = osDisableInterrupts();
|
||||||
@ -234,7 +537,6 @@ OSIntrMask osDisableInterruptMask( OSIntrMask mask )
|
|||||||
|
|
||||||
Returns: TRUE if last state is enabled
|
Returns: TRUE if last state is enabled
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
BOOL osRestoreInterruptID( OSIntrID id, BOOL state )
|
BOOL osRestoreInterruptID( OSIntrID id, BOOL state )
|
||||||
{
|
{
|
||||||
BOOL retval;
|
BOOL retval;
|
||||||
@ -311,7 +613,6 @@ OSIntrMask osSetInterruptMask( OSIntrMask mask )
|
|||||||
|
|
||||||
Returns: TRUE if last state is pending
|
Returns: TRUE if last state is pending
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
BOOL osClearInterruptPendingID( OSIntrID id )
|
BOOL osClearInterruptPendingID( OSIntrID id )
|
||||||
{
|
{
|
||||||
OSIntrMode enabled = osDisableInterrupts();
|
OSIntrMode enabled = osDisableInterrupts();
|
||||||
@ -344,7 +645,6 @@ BOOL osClearInterruptPendingID( OSIntrID id )
|
|||||||
|
|
||||||
Returns: previous factors
|
Returns: previous factors
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
OSIntrMask osClearInterruptPendingMask( OSIntrMask mask )
|
OSIntrMask osClearInterruptPendingMask( OSIntrMask mask )
|
||||||
{
|
{
|
||||||
OSIntrMode enabled = osDisableInterrupts();
|
OSIntrMode enabled = osDisableInterrupts();
|
||||||
@ -371,7 +671,6 @@ OSIntrMask osClearInterruptPendingMask( OSIntrMask mask )
|
|||||||
|
|
||||||
Returns: TRUE if last state is pending
|
Returns: TRUE if last state is pending
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
BOOL osSetInterruptPendingID( OSIntrID id )
|
BOOL osSetInterruptPendingID( OSIntrID id )
|
||||||
{
|
{
|
||||||
u32 ofs = id/32;
|
u32 ofs = id/32;
|
||||||
@ -395,7 +694,6 @@ BOOL osSetInterruptPendingID( OSIntrID id )
|
|||||||
|
|
||||||
Returns: TRUE if last state is pending
|
Returns: TRUE if last state is pending
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
BOOL osRestoreInterruptPendingID( OSIntrID id, BOOL state )
|
BOOL osRestoreInterruptPendingID( OSIntrID id, BOOL state )
|
||||||
{
|
{
|
||||||
u32 ofs = id/32;
|
u32 ofs = id/32;
|
||||||
@ -427,13 +725,11 @@ BOOL osRestoreInterruptPendingID( OSIntrID id, BOOL state )
|
|||||||
|
|
||||||
Returns: None
|
Returns: None
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void osSetEndOfInterruptRegister( OSIntrID id )
|
void osSetEndOfInterruptRegister( OSIntrID id )
|
||||||
{
|
{
|
||||||
reg_OS_CPUI_EOI = id;
|
reg_OS_CPUI_EOI = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
Name: i_osReadHighestPendingInterruptRegister
|
Name: i_osReadHighestPendingInterruptRegister
|
||||||
|
|
||||||
@ -443,7 +739,6 @@ void osSetEndOfInterruptRegister( OSIntrID id )
|
|||||||
|
|
||||||
Returns: Interrupt Distributor ID
|
Returns: Interrupt Distributor ID
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
OSIntrID i_osReadHighestPendingInterruptRegister( void )
|
OSIntrID i_osReadHighestPendingInterruptRegister( void )
|
||||||
{
|
{
|
||||||
return (OSIntrID)(reg_OS_CPUI_HI_PND & REG_OS_CPUI_HI_PND_ID_MASK);
|
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
|
Returns: Interrupt Distributor ID
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
OSIntrID i_osReadInterruptAcknowledgeRegister( void )
|
OSIntrID i_osReadInterruptAcknowledgeRegister( void )
|
||||||
{
|
{
|
||||||
return (OSIntrID)(reg_OS_CPUI_ACK & REG_OS_CPUI_ACK_ID_MASK);
|
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
|
Name: osHalt
|
||||||
|
|
||||||
@ -94,13 +96,37 @@ void osTerminate(void)
|
|||||||
|
|
||||||
Returns: None
|
Returns: None
|
||||||
*---------------------------------------------------------------------------*/
|
*---------------------------------------------------------------------------*/
|
||||||
#include <brom/code32.h>
|
|
||||||
ASM void osHalt( void )
|
ASM void osHalt( void )
|
||||||
{
|
{
|
||||||
|
#ifdef SDK_ARM11
|
||||||
|
wfi
|
||||||
|
#else // SDK_ARM9
|
||||||
mov r0, #0
|
mov r0, #0
|
||||||
mcr p15, 0, r0, c7, c0, 4
|
mcr p15, 0, r0, c7, c0, 4
|
||||||
|
#endif // SDK_ARM9
|
||||||
bx lr
|
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>
|
#include <brom/codereset.h>
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*
|
/*---------------------------------------------------------------------------*
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user