From 707f66fe257bce98de3eaf8130cba942b24a850b Mon Sep 17 00:00:00 2001 From: nakasima Date: Fri, 19 Dec 2008 05:44:06 +0000 Subject: [PATCH] =?UTF-8?q?=E5=89=B2=E3=82=8A=E8=BE=BC=E3=81=BF=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=81=AE=E3=83=9E=E3=83=BC=E3=82=B8=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@128 b871894f-2f95-9b40-918c-086798483c85 --- .../build/libraries/os/ARM11/os_interrupt.c | 307 ------------ .../build/libraries/os/common/os_alarm.c | 19 +- .../build/libraries/os/common/os_interrupt.c | 472 ++++++++++++++---- .../build/libraries/os/common/os_tick.c | 14 +- .../bootrom/include/brom/os/ARM11/interrupt.h | 80 +++ .../include/brom/os/ARM11/interrupt_types.h | 11 +- .../bootrom/include/brom/os/ARM9/interrupt.h | 117 +++-- trunk/bootrom/include/brom/os/common/alarm.h | 11 + trunk/bootrom/include/brom/os/common/system.h | 22 +- trunk/bootrom/include/brom/os/common/tick.h | 11 + trunk/include/ctr/hw/ARM11/mmap_axi_wram.h | 10 +- trunk/include/ctr/types.h | 23 + 12 files changed, 633 insertions(+), 464 deletions(-) delete mode 100644 trunk/bootrom/build/libraries/os/ARM11/os_interrupt.c diff --git a/trunk/bootrom/build/libraries/os/ARM11/os_interrupt.c b/trunk/bootrom/build/libraries/os/ARM11/os_interrupt.c deleted file mode 100644 index 2d1dfa5..0000000 --- a/trunk/bootrom/build/libraries/os/ARM11/os_interrupt.c +++ /dev/null @@ -1,307 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: CtrBrom - libraries - OS - File: os_interrupt.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 - - -asm void i_osIrqVeneer( void ); - -/*---------------------------------------------------------------------------* - Name: osInitInterrupt - - Description: Initialize Interrupts - - Arguments: None - - Returns: None - *---------------------------------------------------------------------------*/ - -void osInitInterrupt( void ) -{ - static BOOL isInit; - - if ( isInit == FALSE ) - { - isInit = TRUE; - - (void)osDisableIrqAndFiq(); - - i_osInitInterruptTable(); - - ((u32*)HW_INTR_VENEER_BUF)[0] = ((u32*)i_osIrqVeneer)[0]; - ((u32*)HW_INTR_VENEER_BUF)[1] = ((u32*)i_osIrqVeneer)[1]; - - { - u32 num = OS_INTR_ID_NUM; - u32 conf = 0; - int i; - - for ( i=0; i - -asm void i_osIrqVeneer( void ) -{ - INASM_EXTERN( osIrqHandler ) - - ldr pc, =osIrqHandler - LTORG -} - -#include - -/*---------------------------------------------------------------------------* - Name: osEnableInterruptID - - Description: set Interrupt Set Enable Register - - Arguments: Interrupt Distributor ID - - Returns: TRUE if last state is enabled - *---------------------------------------------------------------------------*/ - -BOOL osEnableInterruptID( OSIntrID id ) -{ - u32 ofs = id/32; - u32 sft = id%32; - BOOL retval; - - retval = TRUE & (reg_OS_IDR_SET_IE[ofs] >> sft); - - reg_OS_IDR_SET_IE[ofs] = 1 << sft; - - return retval; -} - -/*---------------------------------------------------------------------------* - Name: osDisableInterruptID - - Description: set Interrupt Clear Enable Register - - Arguments: Interrupt Distributor ID - - Returns: TRUE if last state is enabled - *---------------------------------------------------------------------------*/ - -BOOL osDisableInterruptID( OSIntrID id ) -{ - u32 ofs = id/32; - u32 sft = id%32; - BOOL retval; - - retval = TRUE & (reg_OS_IDR_SET_IE[ofs] >> sft); - - reg_OS_IDR_CLR_IE[ofs] = 1 << sft; - - return retval; -} - -/*---------------------------------------------------------------------------* - Name: osRestoreInterruptID - - Description: set Interrupt Clear Enable Register - - Arguments: id : Interrupt Distributor ID - state : state whether interrupt is enabled - - Returns: TRUE if last state is enabled - *---------------------------------------------------------------------------*/ - -BOOL osRestoreInterruptID( OSIntrID id, BOOL state ) -{ - u32 ofs = id/32; - u32 sft = id%32; - BOOL retval; - - retval = TRUE & (reg_OS_IDR_SET_IE[ofs] >> sft); - - if ( state == TRUE ) - { - reg_OS_IDR_SET_IE[ofs] = 1 << sft; - } - else - { - reg_OS_IDR_CLR_IE[ofs] = 1 << sft; - } - - return retval; -} - -/*---------------------------------------------------------------------------* - Name: osSetInterruptPendingID - - Description: set Interrupt Set Pending Register - - Arguments: Interrupt Distributor ID - - Returns: TRUE if last state is pending - *---------------------------------------------------------------------------*/ - -BOOL osSetInterruptPendingID( OSIntrID id ) -{ - u32 ofs = id/32; - u32 sft = id%32; - BOOL retval; - - retval = TRUE & (reg_OS_IDR_SET_PND[ofs] >> sft); - - reg_OS_IDR_SET_PND[ofs] = 1 << sft; - - return retval; -} - -/*---------------------------------------------------------------------------* - Name: osClearInterruptPendingID - - Description: set Interrupt Clear Pending Register - - Arguments: Interrupt Distributor ID - - Returns: TRUE if last state is pending - *---------------------------------------------------------------------------*/ - -BOOL osClearInterruptPendingID( OSIntrID id ) -{ - u32 ofs = id/32; - u32 sft = id%32; - BOOL retval; - - retval = TRUE & (reg_OS_IDR_SET_PND[ofs] >> sft); - - reg_OS_IDR_CLR_PND[ofs] = 1 << sft; - - return retval; -} - -/*---------------------------------------------------------------------------* - Name: osRestoreInterruptPendingID - - Description: restore Interrupt Pending - - Arguments: id : Interrupt Distributor ID - state : state whether interrupt is enabled - - Returns: TRUE if last state is pending - *---------------------------------------------------------------------------*/ - -BOOL osRestoreInterruptPendingID( OSIntrID id, BOOL state ) -{ - u32 ofs = id/32; - u32 sft = id%32; - BOOL retval; - - retval = TRUE & (reg_OS_IDR_SET_PND[ofs] >> sft); - - if ( state == TRUE ) - { - reg_OS_IDR_SET_PND[ofs] = 1 << sft; - } - else - { - reg_OS_IDR_CLR_PND[ofs] = 1 << sft; - } - - return retval; -} - - -/*---------------------------------------------------------------------------* - Name: osSetEndOfInterruptRegister - - Description: set ID to End of Interrupt Register - - change state to Inactive. - - Arguments: Interrupt Distributor ID - - Returns: None - *---------------------------------------------------------------------------*/ - -void osSetEndOfInterruptRegister( OSIntrID id ) -{ - reg_OS_CPUI_EOI = id; -} - - -/*---------------------------------------------------------------------------* - Name: i_osReadHighestPendingInterruptRegister - - Description: read ID from Highest Pending Interrupt Register - - Arguments: None - - Returns: Interrupt Distributor ID - *---------------------------------------------------------------------------*/ - -OSIntrID i_osReadHighestPendingInterruptRegister( void ) -{ - return (OSIntrID)(reg_OS_CPUI_HI_PND & REG_OS_CPUI_HI_PND_ID_MASK); -} - -/*---------------------------------------------------------------------------* - Name: i_osReadInterruptAcknowledgeRegister - - Description: read ID from Interrupt Acknowledge Register - - get interrupt ID and change state to NotPending and Active. - - Arguments: None - - Returns: Interrupt Distributor ID - *---------------------------------------------------------------------------*/ - -OSIntrID i_osReadInterruptAcknowledgeRegister( void ) -{ - return (OSIntrID)(reg_OS_CPUI_ACK & REG_OS_CPUI_ACK_ID_MASK); -} - diff --git a/trunk/bootrom/build/libraries/os/common/os_alarm.c b/trunk/bootrom/build/libraries/os/common/os_alarm.c index 2fc7378..2e7e289 100644 --- a/trunk/bootrom/build/libraries/os/common/os_alarm.c +++ b/trunk/bootrom/build/libraries/os/common/os_alarm.c @@ -19,19 +19,9 @@ #define osPanic(...) ((void)0) //---------------------------------------------------------------------- -//---- timer number alarm uses -#define OSi_ALARM_TIMER OS_TIMER_1 - -#ifdef SDK_ARM11 -//---- timer interrupt ID -#define OSi_ALARM_IE_TIMER_ID OS_INTR_ID_WATCHDOG - -#else // SDK_ARM9 -//---- timer interrupt ID -#define OSi_ALARM_IE_TIMER_ID OS_INTR_ID_TIMER1 - +#ifdef SDK_ARM9 //---- timer interrupt mask (must be same number with OSi_ALARM_TIMER) -#define OSi_ALARM_IE_TIMER OS_IE_TIMER1 +#define OSi_ALARM_IE_TIMER (OS_IE_TIMER0 << OSi_ALARM_TIMER) //---- timer control setting for alarm #define OSi_ALARM_TIMERCONTROL ( REG_OS_TM0CNT_H_E_MASK | REG_OS_TM0CNT_H_I_MASK | OS_TIMER_PRESCALER_64 ) @@ -487,11 +477,8 @@ void i_osArrangeTimer(void) //---- let timer be disable osSetTimerControl(OSi_ALARM_TIMER, 0); -#ifdef SDK_ARM9 //---- set check flag timer interrupt -// osSetIrqCheckFlag(OSi_ALARM_IE_TIMER); - -#endif // SDK_ARM9 + osSetInterruptCheckID(OSi_ALARM_IE_TIMER_ID); tick = osGetTick(); alarm = i_osAlarmQueue.head; diff --git a/trunk/bootrom/build/libraries/os/common/os_interrupt.c b/trunk/bootrom/build/libraries/os/common/os_interrupt.c index 0ecf6c8..07ad519 100644 --- a/trunk/bootrom/build/libraries/os/common/os_interrupt.c +++ b/trunk/bootrom/build/libraries/os/common/os_interrupt.c @@ -44,10 +44,44 @@ void osInitInterrupt( void ) ((u32*)HW_INTR_VENEER_BUF)[0] = ((u32*)i_osIrqVeneer)[0]; ((u32*)HW_INTR_VENEER_BUF)[1] = ((u32*)i_osIrqVeneer)[1]; - reg_OS_IE = 0; +#ifdef SDK_ARM11 + { + u32 num = OS_INTR_ID_NUM; + u32 conf = 0; + int i; + for ( i=0; i> sft); + + reg_OS_IDR_SET_IE[ofs] = 1 << sft; +#else // SDK_ARM9 + OSIntrMask prep = reg_OS_IE; retval = TRUE & (BOOL)(prep >> id); reg_OS_IE = prep | (1 << id); -#else // MPCORE - u32 ofs = id/32; - u32 sft = id%32; - BOOL retval; - - retval = TRUE & (reg_OS_IDR_SET_ENABLE_WP[ofs] >> sft); - reg_OS_IDR_SET_ENABLE_WP[ofs] = 1 << sft; -#endif // MPCORE +#endif // SDK_ARM9 (void)osRestoreInterrupts( enabled ); return retval; @@ -197,21 +232,21 @@ BOOL osEnableInterruptID( OSIntrID id ) BOOL osDisableInterruptID( OSIntrID id ) { - OSIntrMode enabled = osDisableInterrupts(); -#ifdef SDK_ARM9 - OSIntrMask prep = reg_OS_IE; BOOL retval; + OSIntrMode enabled = osDisableInterrupts(); +#ifdef SDK_ARM11 + u32 ofs = id/32; + u32 sft = id%32; + + retval = TRUE & (reg_OS_IDR_SET_IE[ofs] >> sft); + + reg_OS_IDR_CLR_IE[ofs] = 1 << sft; +#else // SDK_ARM9 + OSIntrMask prep = reg_OS_IE; retval = TRUE & (BOOL)(prep >> id); reg_OS_IE = prep & ~(1 << id); -#else // MPCORE - u32 ofs = id/32; - u32 sft = id%32; - BOOL retval; - - retval = TRUE & (reg_OS_IDR_SET_ENABLE_WP[ofs] >> sft); - reg_OS_IDR_CLR_ENABLE_WP[ofs] = 1 << sft; -#endif // MPCORE +#endif // SDK_ARM9 (void)osRestoreInterrupts( enabled ); return retval; @@ -230,10 +265,24 @@ BOOL osDisableInterruptID( OSIntrID id ) BOOL osRestoreInterruptID( OSIntrID id, BOOL state ) { - OSIntrMode enabled = osDisableInterrupts(); -#ifdef SDK_ARM9 - OSIntrMask prep = reg_OS_IE; BOOL retval; + OSIntrMode enabled = osDisableInterrupts(); +#ifdef SDK_ARM11 + u32 ofs = id/32; + u32 sft = id%32; + + retval = TRUE & (reg_OS_IDR_SET_IE[ofs] >> sft); + + if ( state == TRUE ) + { + reg_OS_IDR_SET_IE[ofs] = 1 << sft; + } + else + { + reg_OS_IDR_CLR_IE[ofs] = 1 << sft; + } +#else // SDK_ARM9 + OSIntrMask prep = reg_OS_IE; retval = TRUE & (BOOL)(prep >> id); if ( state == TRUE ) @@ -244,22 +293,7 @@ BOOL osRestoreInterruptID( OSIntrID id, BOOL state ) { reg_OS_IE = prep & ~(state << id); } -#else // MPCORE - u32 ofs = id/32; - u32 sft = id%32; - BOOL retval; - - retval = TRUE & (reg_OS_IDR_SET_ENABLE_WP[ofs] >> sft); - - if ( state == TRUE ) - { - reg_OS_IDR_SET_ENABLE_WP[ofs] = 1 << sft; - } - else - { - reg_OS_IDR_CLR_ENABLE_WP[ofs] = 1 << sft; - } -#endif // MPCORE +#endif // SDK_ARM9 (void)osRestoreInterrupts( enabled ); return retval; @@ -282,13 +316,13 @@ BOOL osRestoreInterruptID( OSIntrID id, BOOL state ) OSIntrMask osClearInterruptPendingMask( OSIntrMask mask ) { OSIntrMode enabled = osDisableInterrupts(); -#ifdef SDK_ARM9 +#ifdef SDK_ARM11 + OSIntrMask prep = reg_OS_IDR_SET_PND_ALL; + reg_OS_IDR_CLR_PND_ALL = mask; +#else // SDK_ARM9 OSIntrMask prep = reg_OS_IF; reg_OS_IF = mask; -#else // MPCORE - OSIntrMask prep = reg_OS_IDR_SET_PENDING_ST; - reg_OS_IDR_CLR_PENDING_ST = mask; -#endif // MPCORE +#endif // SDK_ARM9 (void)osRestoreInterrupts( enabled ); return prep; @@ -307,30 +341,139 @@ OSIntrMask osClearInterruptPendingMask( OSIntrMask mask ) BOOL osClearInterruptPendingID( OSIntrID id ) { OSIntrMode enabled = osDisableInterrupts(); -#ifdef SDK_ARM9 - OSIntrMask prep = reg_OS_IF; BOOL retval; +#ifdef SDK_ARM11 + u32 ofs = id/32; + u32 sft = id%32; + + retval = TRUE & (reg_OS_IDR_SET_PND[ofs] >> sft); + + reg_OS_IDR_CLR_PND[ofs] = 1 << sft; +#else // SDK_ARM9 + OSIntrMask prep = reg_OS_IF; retval = TRUE & (BOOL)(prep >> id); reg_OS_IF = (u32)(1 << id); -#else // MPCORE - u32 ofs = id/32; - u32 sft = id%32; - BOOL retval; - - retval = TRUE & (reg_OS_IDR_SET_PENDING_WP[ofs] >> sft); - reg_OS_IDR_CLR_PENDING_WP[ofs] = 1 << sft; -#endif // MPCORE +#endif // SDK_ARM9 (void)osRestoreInterrupts( enabled ); return retval; } +#ifdef SDK_ARM11 + +/*---------------------------------------------------------------------------* + Name: osSetInterruptPendingID + + Description: set Interrupt Set Pending Register + + Arguments: Interrupt Distributor ID + + Returns: TRUE if last state is pending + *---------------------------------------------------------------------------*/ + +BOOL osSetInterruptPendingID( OSIntrID id ) +{ + u32 ofs = id/32; + u32 sft = id%32; + BOOL retval; + + retval = TRUE & (reg_OS_IDR_SET_PND[ofs] >> sft); + + reg_OS_IDR_SET_PND[ofs] = 1 << sft; + + return retval; +} + +/*---------------------------------------------------------------------------* + Name: osRestoreInterruptPendingID + + Description: restore Interrupt Pending + + Arguments: id : Interrupt Distributor ID + state : state whether interrupt is enabled + + Returns: TRUE if last state is pending + *---------------------------------------------------------------------------*/ + +BOOL osRestoreInterruptPendingID( OSIntrID id, BOOL state ) +{ + u32 ofs = id/32; + u32 sft = id%32; + BOOL retval; + + retval = TRUE & (reg_OS_IDR_SET_PND[ofs] >> sft); + + if ( state == TRUE ) + { + reg_OS_IDR_SET_PND[ofs] = 1 << sft; + } + else + { + reg_OS_IDR_CLR_PND[ofs] = 1 << sft; + } + + return retval; +} + +/*---------------------------------------------------------------------------* + Name: osSetEndOfInterruptRegister + + Description: set ID to End of Interrupt Register + + change state to Inactive. + + Arguments: Interrupt Distributor ID + + Returns: None + *---------------------------------------------------------------------------*/ + +void osSetEndOfInterruptRegister( OSIntrID id ) +{ + reg_OS_CPUI_EOI = id; +} + + +/*---------------------------------------------------------------------------* + Name: i_osReadHighestPendingInterruptRegister + + Description: read ID from Highest Pending Interrupt Register + + Arguments: None + + Returns: Interrupt Distributor ID + *---------------------------------------------------------------------------*/ + +OSIntrID i_osReadHighestPendingInterruptRegister( void ) +{ + return (OSIntrID)(reg_OS_CPUI_HI_PND & REG_OS_CPUI_HI_PND_ID_MASK); +} + +/*---------------------------------------------------------------------------* + Name: i_osReadInterruptAcknowledgeRegister + + Description: read ID from Interrupt Acknowledge Register + + get interrupt ID and change state to NotPending and Active. + + Arguments: None + + Returns: Interrupt Distributor ID + *---------------------------------------------------------------------------*/ + +OSIntrID i_osReadInterruptAcknowledgeRegister( void ) +{ + return (OSIntrID)(reg_OS_CPUI_ACK & REG_OS_CPUI_ACK_ID_MASK); +} + +#endif // SDK_ARM11 + + //================================================================================ // IRQ CHEKE BUFFER //================================================================================ /*---------------------------------------------------------------------------* - Name: osSetInterruptCheckFlag + Name: osSetInterruptCheckID Description: set irq flag to check being called @@ -338,15 +481,106 @@ BOOL osClearInterruptPendingID( OSIntrID id ) Returns: None *---------------------------------------------------------------------------*/ -void osSetInterruptCheckFlag( OSIntrMask mask ) +BOOL osSetInterruptCheckID( OSIntrID id ) +{ + BOOL retval; + OSIntrMode enabled = osDisableInterrupts(); +#ifdef SDK_ARM11 + u32 ofs = id/32; + u32 sft = id%32; + u32 *buf = &((OSIntrMask *)HW_INTR_CHECK0_BUF)->w[ofs]; +#else // SDK_ARM9 + u32 sft = id; + u32 *buf = (OSIntrMask *)HW_INTR_CHECK_BUF; +#endif // SDK_ARM9 + + retval = TRUE & (*buf >> sft); + *buf |= 1 << sft; + (void)osRestoreInterrupts( enabled ); + + return retval; +} + +/*---------------------------------------------------------------------------* + Name: osClearInterruptCheckID + + Description: clear irq flag stored in HW_INTR_CHECK_BUF + + Arguments: irq factors to be set + + Returns: None + *---------------------------------------------------------------------------*/ +BOOL osClearInterruptCheckID( OSIntrID id ) +{ + BOOL retval; + OSIntrMode enabled = osDisableInterrupts(); +#ifdef SDK_ARM11 + u32 ofs = id/32; + u32 sft = id%32; + u32 *buf = &((OSIntrMask *)HW_INTR_CHECK0_BUF)->w[ofs]; +#else // SDK_ARM9 + u32 sft = id; + u32 *buf = (OSIntrMask *)HW_INTR_CHECK_BUF; +#endif // SDK_ARM9 + + retval = TRUE & (*buf >> sft); + *buf &= ~(1 << sft); + (void)osRestoreInterrupts( enabled ); + + return retval; +} + +/*---------------------------------------------------------------------------* + Name: osIsInterruptCheckID + + Description: check irq flag stored in HW_INTR_CHECK_BUF + + Arguments: irq factors to be set + + Returns: None + *---------------------------------------------------------------------------*/ +BOOL osIsInterruptCheckID( OSIntrID id ) +{ + BOOL retval; +#ifdef SDK_ARM11 + u32 ofs = id/32; + u32 sft = id%32; + u32 *buf = &((OSIntrMask *)HW_INTR_CHECK0_BUF)->w[ofs]; +#else // SDK_ARM9 + u32 sft = id; + u32 *buf = (OSIntrMask *)HW_INTR_CHECK_BUF; +#endif // SDK_ARM9 + + retval = TRUE & (*buf >> sft); + + return retval; +} + +/*---------------------------------------------------------------------------* + Name: osSetInterruptCheckMask + + Description: set irq flag to check being called + + Arguments: irq factors to be set + + Returns: None + *---------------------------------------------------------------------------*/ +void osSetInterruptCheckMask( OSIntrMask mask ) { OSIntrMode enabled = osDisableInterrupts(); - *(vu32 *)HW_INTR_CHECK_BUF |= (u32)mask; +#ifdef SDK_ARM11 + ((OSIntrMask *)HW_INTR_CHECK0_BUF)->w[0] |= mask.w[0]; + ((OSIntrMask *)HW_INTR_CHECK0_BUF)->w[1] |= mask.w[1]; + ((OSIntrMask *)HW_INTR_CHECK0_BUF)->w[2] |= mask.w[2]; + ((OSIntrMask *)HW_INTR_CHECK0_BUF)->w[3] |= mask.w[3]; +#else // SDK_ARM9 + *(OSIntrMask *)HW_INTR_CHECK_BUF |= mask; +#endif // SDK_ARM9 (void)osRestoreInterrupts( enabled ); } /*---------------------------------------------------------------------------* - Name: osClearInterruptCheckFlag + Name: osClearInterruptCheckMask Description: clear irq flag stored in HW_INTR_CHECK_BUF @@ -354,18 +588,51 @@ void osSetInterruptCheckFlag( OSIntrMask mask ) Returns: None *---------------------------------------------------------------------------*/ -void osClearInterruptCheckFlag( OSIntrMask mask ) +void osClearInterruptCheckMask( OSIntrMask mask ) { OSIntrMode enabled = osDisableInterrupts(); - *(vu32 *)HW_INTR_CHECK_BUF &= (u32)~mask; +#ifdef SDK_ARM11 + ((OSIntrMask *)HW_INTR_CHECK0_BUF)->w[0] &= ~mask.w[0]; + ((OSIntrMask *)HW_INTR_CHECK0_BUF)->w[1] &= ~mask.w[1]; + ((OSIntrMask *)HW_INTR_CHECK0_BUF)->w[2] &= ~mask.w[2]; + ((OSIntrMask *)HW_INTR_CHECK0_BUF)->w[3] &= ~mask.w[3]; +#else // SDK_ARM9 + *(OSIntrMask *)HW_INTR_CHECK_BUF &= ~mask; +#endif // SDK_ARM9 (void)osRestoreInterrupts( enabled ); } +/*---------------------------------------------------------------------------* + Name: osIsInterruptCheckMask + + Description: check irq flag stored in HW_INTR_CHECK_BUF + + Arguments: irq factors to be cleared + + Returns: TRUE if irq flag exists + *---------------------------------------------------------------------------*/ +BOOL osIsInterruptCheckMask( OSIntrMask mask ) +{ + u32 tmp; +#ifdef SDK_ARM11 + OSIntrMode enabled = osDisableInterrupts(); + tmp = ((OSIntrMask *)HW_INTR_CHECK0_BUF)->w[0] & mask.w[0]; + tmp |= ((OSIntrMask *)HW_INTR_CHECK0_BUF)->w[1] & mask.w[1]; + tmp |= ((OSIntrMask *)HW_INTR_CHECK0_BUF)->w[2] & mask.w[2]; + tmp |= ((OSIntrMask *)HW_INTR_CHECK0_BUF)->w[3] & mask.w[3]; + (void)osRestoreInterrupts( enabled ); +#else // SDK_ARM9 + tmp = osGetInterruptCheckMask() & mask; +#endif // SDK_ARM9 + + return tmp ? TRUE : FALSE; +} + //============================================================================ // WAIT //============================================================================ /*---------------------------------------------------------------------------* - Name: osWaitInterrupt + Name: osWaitInterruptID Description: wait specifiled interrupt. OS_WaitInterrupt doesn't switch thread. @@ -377,23 +644,56 @@ void osClearInterruptCheckFlag( OSIntrMask mask ) Returns: None *---------------------------------------------------------------------------*/ -void osWaitInterrupt( BOOL clear, OSIntrMask irqFlags ) +void osWaitInterruptID( BOOL clear, OSIntrID id ) { OSIntrMode cpsrIrq = osDisableInterrupts(); if (clear) { - (void)osClearInterruptCheckFlag( irqFlags ); + (void)osClearInterruptCheckID( id ); } - while (!(osGetInterruptCheckFlag() & irqFlags)) + while (! osIsInterruptCheckID(id) ) { osHalt(); (void)osEnableInterrupts(); (void)osDisableInterrupts(); } - (void)osClearInterruptCheckFlag( irqFlags ); + (void)osClearInterruptCheckID( id ); + (void)osRestoreInterrupts( cpsrIrq ); +} + +/*---------------------------------------------------------------------------* + Name: osWaitInterruptMask + + Description: wait specifiled interrupt. + OS_WaitInterrupt doesn't switch thread. + OS_WaitInterrupt wait by using OS_Halt(). + + Arguments: clear TRUE if want to clear interrupt flag before wait. + FALSE if not. + irqFlags bit of interrupts to wait for + + Returns: None + *---------------------------------------------------------------------------*/ +void osWaitInterruptMask( BOOL clear, OSIntrMask irqFlags ) +{ + OSIntrMode cpsrIrq = osDisableInterrupts(); + + if (clear) + { + (void)osClearInterruptCheckMask( irqFlags ); + } + + while (! osIsInterruptCheckMask(irqFlags) ) + { + osHalt(); + (void)osEnableInterrupts(); + (void)osDisableInterrupts(); + } + + (void)osClearInterruptCheckMask( irqFlags ); (void)osRestoreInterrupts( cpsrIrq ); } diff --git a/trunk/bootrom/build/libraries/os/common/os_tick.c b/trunk/bootrom/build/libraries/os/common/os_tick.c index 9182310..599ca30 100644 --- a/trunk/bootrom/build/libraries/os/common/os_tick.c +++ b/trunk/bootrom/build/libraries/os/common/os_tick.c @@ -18,19 +18,9 @@ //---------------------------------------------------------------------- -//---- timer number tick uses -#define OSi_TICK_TIMER OS_TIMER_0 - -#ifdef SDK_ARM11 -//---- timer interrupt ID -#define OSi_TICK_IE_TIMER_ID OS_INTR_ID_TIMER - -#else // SDK_ARM9 -//---- timer interrupt ID -#define OSi_TICK_IE_TIMER_ID OS_INTR_ID_TIMER0 - +#ifdef SDK_ARM9 //---- timer interrupt mask (must be same number with OSi_TICK_TIMER) -#define OSi_TICK_IE_TIMER REG_OS_IF_T0_MASK +#define OSi_TICK_IE_TIMER (OS_IE_TIMER0 << OSi_TICK_TIMER) //---- timer control setting for tick #define OSi_TICK_TIMERCONTROL ( REG_OS_TM0CNT_H_E_MASK | REG_OS_TM0CNT_H_I_MASK | OS_TIMER_PRESCALER_64 ) diff --git a/trunk/bootrom/include/brom/os/ARM11/interrupt.h b/trunk/bootrom/include/brom/os/ARM11/interrupt.h index 38b625c..8e91a03 100644 --- a/trunk/bootrom/include/brom/os/ARM11/interrupt.h +++ b/trunk/bootrom/include/brom/os/ARM11/interrupt.h @@ -150,6 +150,86 @@ BOOL osRestoreInterruptPendingID( OSIntrID id, BOOL state ); *---------------------------------------------------------------------------*/ void osSetEndOfInterruptRegister( OSIntrID id ); +//================================================================================ +// WAIT FOR INTERRUPT +//================================================================================ +/*---------------------------------------------------------------------------* + Name: osWaitInterruptID + + Description: wait specifiled interrupt. + OS_WaitInterrupt doesn't switch thread. + OS_WaitInterrupt wait by using OS_Halt(). + + Arguments: clear TRUE if want to clear interrupt flag before wait. + FALSE if not. + irqFlags bit of interrupts to wait for + + Returns: None + *---------------------------------------------------------------------------*/ +void osWaitInterruptID( BOOL clear, OSIntrID id ); + +/*---------------------------------------------------------------------------* + Name: osWaitInterruptMask + + Description: wait specifiled interrupt. + OS_WaitInterrupt doesn't switch thread. + OS_WaitInterrupt wait by using OS_Halt(). + + Arguments: clear TRUE if want to clear interrupt flag before wait. + FALSE if not. + irqFlags bit of interrupts to wait for + + Returns: None + *---------------------------------------------------------------------------*/ +void osWaitInterruptMask( BOOL clear, OSIntrMask irqFlags ); + +//================================================================================ +// INTERRUPT FLAG (INCLUDING TO WAIT FOR INTERRUPT) +//================================================================================ +/*---------------------------------------------------------------------------* + Name: osSetInterruptCheckID + + Description: set irq flag to check being called + + Arguments: irq factors to be set + + Returns: None + *---------------------------------------------------------------------------*/ +BOOL osSetInterruptCheckID( OSIntrID id ); + +/*---------------------------------------------------------------------------* + Name: osClearInterruptCheckID + + Description: clear irq flag stored in HW_INTR_CHECK_BUF + + Arguments: irq factors to be set + + Returns: None + *---------------------------------------------------------------------------*/ +BOOL osClearInterruptCheckID( OSIntrID id ); + +/*---------------------------------------------------------------------------* + Name: osIsInterruptCheckID + + Description: check irq flag stored in HW_INTR_CHECK_BUF + + Arguments: irq factors to be set + + Returns: None + *---------------------------------------------------------------------------*/ +BOOL osIsInterruptCheckID( OSIntrID id ); + +/*---------------------------------------------------------------------------* + Name: osIsInterruptCheckMask + + Description: check irq flag stored in HW_INTR_CHECK_BUF + + Arguments: irq factors to be cleared + + Returns: TRUE if irq flag exists + *---------------------------------------------------------------------------*/ +BOOL osIsInterruptCheckMask( OSIntrMask mask ); + #ifdef __cplusplus } // extern "C" diff --git a/trunk/bootrom/include/brom/os/ARM11/interrupt_types.h b/trunk/bootrom/include/brom/os/ARM11/interrupt_types.h index c3502e3..cc60aed 100644 --- a/trunk/bootrom/include/brom/os/ARM11/interrupt_types.h +++ b/trunk/bootrom/include/brom/os/ARM11/interrupt_types.h @@ -25,9 +25,13 @@ extern "C" { #endif #define reg_OS_IDR_SET_IE (( REGType32v *) REG_IDR_SET_IE0_ADDR) +#define reg_OS_IDR_SET_IE_ALL (*( REGType128v *) REG_IDR_SET_IE0_ADDR) #define reg_OS_IDR_CLR_IE (( REGType32v *) REG_IDR_CLR_IE0_ADDR) +#define reg_OS_IDR_CLR_IE_ALL (*( REGType128v *) REG_IDR_CLR_IE0_ADDR) #define reg_OS_IDR_SET_PND (( REGType32v *) REG_IDR_SET_PND0_ADDR) +#define reg_OS_IDR_SET_PND_ALL (*( REGType128v *) REG_IDR_SET_PND0_ADDR) #define reg_OS_IDR_CLR_PND (( REGType32v *) REG_IDR_CLR_PND0_ADDR) +#define reg_OS_IDR_CLR_PND_ALL (*( REGType128v *) REG_IDR_CLR_PND0_ADDR) #define reg_OS_IDR_ACT (( REGType32v *) REG_IDR_ACT0_ADDR) #define reg_OS_IDR_TGT (( REGType8v *) REG_IDR_TGT0_ADDR) #define reg_OS_IDR_PRIO (( REGType8v *) REG_IDR_PRIO0_ADDR) @@ -50,11 +54,8 @@ extern "C" { #define HW_CPUIBP_CMP_PRIO_7 6 // Only bits [7] of priority are compared for pre-emption #define HW_CPUIBP_NO_PREEMPT 7 // No pre-emption is performed -typedef struct -{ - u32 w[6]; -} -OSIntrMask; + +typedef u128 OSIntrMask; typedef enum { diff --git a/trunk/bootrom/include/brom/os/ARM9/interrupt.h b/trunk/bootrom/include/brom/os/ARM9/interrupt.h index 0cea514..098c62f 100644 --- a/trunk/bootrom/include/brom/os/ARM9/interrupt.h +++ b/trunk/bootrom/include/brom/os/ARM9/interrupt.h @@ -236,7 +236,7 @@ OSIntrFunction osGetInterruptHandler( OSIntrID id ); // INTERRUPT CHECK //================================================================================ /*---------------------------------------------------------------------------* - Name: osSetInterruptCheckFlag + Name: osSetInterruptCheckID Description: set irq flag to check being called @@ -244,10 +244,43 @@ OSIntrFunction osGetInterruptHandler( OSIntrID id ); Returns: None *---------------------------------------------------------------------------*/ -void osSetInterruptCheckFlag( OSIntrMask intr ); +BOOL osSetInterruptCheckID( OSIntrID id ); /*---------------------------------------------------------------------------* - Name: osClearInterruptCheckFlag + Name: osClearInterruptCheckID + + Description: clear irq flag stored in HW_INTR_CHECK_BUF + + Arguments: irq factors to be set + + Returns: None + *---------------------------------------------------------------------------*/ +BOOL osClearInterruptCheckID( OSIntrID id ); + +/*---------------------------------------------------------------------------* + Name: osIsInterruptCheckID + + Description: check irq flag stored in HW_INTR_CHECK_BUF + + Arguments: irq factors to be set + + Returns: None + *---------------------------------------------------------------------------*/ +BOOL osIsInterruptCheckID( OSIntrID id ); + +/*---------------------------------------------------------------------------* + Name: osSetInterruptCheckMask + + Description: set irq flag to check being called + + Arguments: irq factors to be set + + Returns: None + *---------------------------------------------------------------------------*/ +void osSetInterruptCheckMask( OSIntrMask intr ); + +/*---------------------------------------------------------------------------* + Name: osClearInterruptCheckMask Description: clear irq flag stored in HW_INTR_CHECK_BUF @@ -255,10 +288,10 @@ void osSetInterruptCheckFlag( OSIntrMask intr ); Returns: None *---------------------------------------------------------------------------*/ -void osClearInterruptCheckFlag( OSIntrMask mask ); +void osClearInterruptCheckMask( OSIntrMask mask ); /*---------------------------------------------------------------------------* - Name: osGetInterruptCheckFlag + Name: osGetInterruptCheckMask Description: get irq factors stored in HW_INTR_CHECK_BUF @@ -266,7 +299,7 @@ void osClearInterruptCheckFlag( OSIntrMask mask ); Returns: irq flags factors in HW_INTR_CHECK_BUG *---------------------------------------------------------------------------*/ -static inline OSIntrMask osGetInterruptCheckFlag( void ) +static inline OSIntrMask osGetInterruptCheckMask( void ) { return *(OSIntrMask *)HW_INTR_CHECK_BUF; } @@ -275,7 +308,7 @@ static inline OSIntrMask osGetInterruptCheckFlag( void ) // WAIT FOR INTERRUPT //================================================================================ /*---------------------------------------------------------------------------* - Name: osWaitInterrupt + Name: osWaitInterruptID Description: wait specifiled interrupt. OS_WaitInterrupt doesn't switch thread. @@ -287,45 +320,69 @@ static inline OSIntrMask osGetInterruptCheckFlag( void ) Returns: None *---------------------------------------------------------------------------*/ -void osWaitInterrupt( BOOL clear, OSIntrMask irqFlags ); +void osWaitInterruptID( BOOL clear, OSIntrID id ); + +/*---------------------------------------------------------------------------* + Name: osWaitInterruptMask + + Description: wait specifiled interrupt. + OS_WaitInterrupt doesn't switch thread. + OS_WaitInterrupt wait by using OS_Halt(). + + Arguments: clear TRUE if want to clear interrupt flag before wait. + FALSE if not. + irqFlags bit of interrupts to wait for + + Returns: None + *---------------------------------------------------------------------------*/ +void osWaitInterruptMask( BOOL clear, OSIntrMask irqFlags ); //================================================================================ // INTERRUPT FLAG (INCLUDING TO WAIT FOR INTERRUPT) //================================================================================ /*---------------------------------------------------------------------------* - Name: osInitIntrFlag + Name: osSetInterruptCheckID - Description: Initialize eventflag and task for interrupts + Description: set irq flag to check being called - Arguments: None - - Returns: TRUE if success. - *---------------------------------------------------------------------------*/ -BOOL osInitIntrFlag( void ); - -/*---------------------------------------------------------------------------* - Name: osWaitInterruptID - - Description: wait specifiled interrupt. - - Arguments: id interrupt ID to wait + Arguments: irq factors to be set Returns: None *---------------------------------------------------------------------------*/ -BOOL osWaitInterruptID( int id ); +BOOL osSetInterruptCheckID( OSIntrID id ); /*---------------------------------------------------------------------------* - Name: osWaitInterruptMask + Name: osClearInterruptCheckID - Description: wait specifiled mask for interrupts. - supported only 0-31 + Description: clear irq flag stored in HW_INTR_CHECK_BUF - Arguments: mask interrupt mask to wait + Arguments: irq factors to be set - Returns: received interrupt mask, 0 if failed. - NOTE: non-waiting interrupt bits may set + Returns: None *---------------------------------------------------------------------------*/ -OSIntrMask osWaitInterruptMask( OSIntrMask mask ); +BOOL osClearInterruptCheckID( OSIntrID id ); + +/*---------------------------------------------------------------------------* + Name: osIsInterruptCheckID + + Description: check irq flag stored in HW_INTR_CHECK_BUF + + Arguments: irq factors to be set + + Returns: None + *---------------------------------------------------------------------------*/ +BOOL osIsInterruptCheckID( OSIntrID id ); + +/*---------------------------------------------------------------------------* + Name: osIsInterruptCheckMask + + Description: check irq flag stored in HW_INTR_CHECK_BUF + + Arguments: irq factors to be cleared + + Returns: TRUE if irq flag exists + *---------------------------------------------------------------------------*/ +BOOL osIsInterruptCheckMask( OSIntrMask mask ); #ifdef __cplusplus diff --git a/trunk/bootrom/include/brom/os/common/alarm.h b/trunk/bootrom/include/brom/os/common/alarm.h index 41e1967..4b6cacc 100644 --- a/trunk/bootrom/include/brom/os/common/alarm.h +++ b/trunk/bootrom/include/brom/os/common/alarm.h @@ -26,6 +26,17 @@ extern "C" { #endif +//---------------------------------------------------------------------- +//---- timer number alarm uses +#define OSi_ALARM_TIMER OS_TIMER_1 + +//---- timer interrupt ID +#ifdef SDK_ARM11 +#define OSi_ALARM_IE_TIMER_ID ((OSIntrID)(OS_INTR_ID_TIMER + OSi_ALARM_TIMER)) +#else // SDK_ARM9 +#define OSi_ALARM_IE_TIMER_ID ((OSIntrID)(OS_INTR_ID_TIMER0 + OSi_ALARM_TIMER)) +#endif // SDK_ARM9 + //-------------------------------------------------------------------------------- //---- Alarm Handler typedef void (*OSAlarmHandler) (void *); diff --git a/trunk/bootrom/include/brom/os/common/system.h b/trunk/bootrom/include/brom/os/common/system.h index 4a82695..c19ede2 100644 --- a/trunk/bootrom/include/brom/os/common/system.h +++ b/trunk/bootrom/include/brom/os/common/system.h @@ -162,7 +162,7 @@ void i_osWaitCpuCycles( OSCpuCycle cycle ); Returns: None *---------------------------------------------------------------------------*/ -extern void osTerminate(void); +void osTerminate(void); /*---------------------------------------------------------------------------* Name: osHalt @@ -173,7 +173,23 @@ extern void osTerminate(void); Returns: None *---------------------------------------------------------------------------*/ -extern void osHalt(void); +void osHalt(void); + +#ifdef SDK_ARM11 + +/*---------------------------------------------------------------------------* + Name: osHaltUntilEvent + + Description: Halt CPU Core until Event + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ + +void osHaltUntilEvent( void ); + +#endif // SDK_ARM11 /*---------------------------------------------------------------------------* Name: osExit @@ -185,7 +201,7 @@ extern void osHalt(void); Returns: -- (Never return) *---------------------------------------------------------------------------*/ -extern void osExit(int status); +void osExit(int status); #endif /* SDK_ASM */ diff --git a/trunk/bootrom/include/brom/os/common/tick.h b/trunk/bootrom/include/brom/os/common/tick.h index 81f2f99..fa1747f 100644 --- a/trunk/bootrom/include/brom/os/common/tick.h +++ b/trunk/bootrom/include/brom/os/common/tick.h @@ -38,6 +38,17 @@ extern u64 osGetTick( void ); extern void i_osSetTick( u64 ); +//---------------------------------------------------------------------- +//---- timer number tick uses +#define OSi_TICK_TIMER OS_TIMER_0 + +//---- timer interrupt ID +#ifdef SDK_ARM11 +#define OSi_TICK_IE_TIMER_ID ((OSIntrID)(OS_INTR_ID_TIMER + OSi_TICK_TIMER)) +#else // SDK_ARM9 +#define OSi_TICK_IE_TIMER_ID ((OSIntrID)(OS_INTR_ID_TIMER0 + OSi_TICK_TIMER)) +#endif // SDK_ARM9 + //---- conversion tick count <-> real time count #ifdef SDK_ARM11 #define OS_TICK_CLOCK HW_CPU_CLOCK diff --git a/trunk/include/ctr/hw/ARM11/mmap_axi_wram.h b/trunk/include/ctr/hw/ARM11/mmap_axi_wram.h index d08ef47..8ad19c9 100644 --- a/trunk/include/ctr/hw/ARM11/mmap_axi_wram.h +++ b/trunk/include/ctr/hw/ARM11/mmap_axi_wram.h @@ -36,9 +36,9 @@ extern "C" { #define HW_AXI_WRAM_SYSRV_OFS_UDEF_VENEER 0x18 #define HW_AXI_WRAM_SYSRV_OFS_IABT_VENEER 0x20 #define HW_AXI_WRAM_SYSRV_OFS_DABT_VENEER 0x28 -#define HW_AXI_WRAM_SYSRV_OFS_START_VECTOR1 0x54 -#define HW_AXI_WRAM_SYSRV_OFS_INTR_CHECK0 0x58 -#define HW_AXI_WRAM_SYSRV_OFS_INTR_CHECK1 0x5c +#define HW_AXI_WRAM_SYSRV_OFS_START_VECTOR1 0x3c +#define HW_AXI_WRAM_SYSRV_OFS_INTR_CHECK1 0x40 +#define HW_AXI_WRAM_SYSRV_OFS_INTR_CHECK0 0x50 //---- system reserved area #define HW_INTR_VENEER_BUF (HW_AXI_WRAM_SYSRV + HW_AXI_WRAM_SYSRV_OFS_INTR_VENEER) @@ -48,8 +48,8 @@ extern "C" { #define HW_DABT_VENEER_BUF (HW_AXI_WRAM_SYSRV + HW_AXI_WRAM_SYSRV_OFS_DABT_VENEER) #define HW_UDEF_VENEER_BUF (HW_AXI_WRAM_SYSRV + HW_AXI_WRAM_SYSRV_OFS_UDEF_VENEER) #define HW_START_VECTOR1_BUF (HW_AXI_WRAM_SYSRV + HW_AXI_WRAM_SYSRV_OFS_START_VECTOR1) -#define HW_INTR_CHECK0_PTR (HW_AXI_WRAM_SYSRV + HW_AXI_WRAM_SYSRV_OFS_INTR_CHECK0) -#define HW_INTR_CHECK1_PTR (HW_AXI_WRAM_SYSRV + HW_AXI_WRAM_SYSRV_OFS_INTR_CHECK1) +#define HW_INTR_CHECK0_BUF (HW_AXI_WRAM_SYSRV + HW_AXI_WRAM_SYSRV_OFS_INTR_CHECK0) +#define HW_INTR_CHECK1_BUF (HW_AXI_WRAM_SYSRV + HW_AXI_WRAM_SYSRV_OFS_INTR_CHECK1) #ifdef __cplusplus diff --git a/trunk/include/ctr/types.h b/trunk/include/ctr/types.h index 3f081d7..7dbf02b 100644 --- a/trunk/include/ctr/types.h +++ b/trunk/include/ctr/types.h @@ -67,6 +67,25 @@ typedef volatile s64 vs64; typedef float f32; typedef volatile f32 vf32; +typedef struct +{ + u32 w[3]; +} +u96; + +typedef struct +{ + u32 w[4]; +} +u128; + +typedef volatile u96 vu96; +typedef volatile u128 vu128; + +/* + io_register_list_XX.hで使用するマクロと型 + */ + /* io_register_list_XX.hで使用するマクロと型 */ @@ -75,11 +94,15 @@ typedef u8 REGType8; typedef u16 REGType16; typedef u32 REGType32; typedef u64 REGType64; +typedef u96 REGType96; +typedef u128 REGType128; typedef vu8 REGType8v; typedef vu16 REGType16v; typedef vu32 REGType32v; typedef vu64 REGType64v; +typedef vu96 REGType96v; +typedef vu128 REGType128v; #ifndef SDK_BOOL_ALREADY_DEFINED_