From 63c169ea3c370a4031cd590111bcb5566d8f6226 Mon Sep 17 00:00:00 2001 From: nakasima Date: Tue, 9 Dec 2008 00:51:05 +0000 Subject: [PATCH] =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=9E=E3=83=BC=E3=83=A9?= =?UTF-8?q?=E3=82=A4=E3=83=96=E3=83=A9=E3=83=AA=E8=BF=BD=E5=8A=A0=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@87 b871894f-2f95-9b40-918c-086798483c85 --- .../bootrom/build/libraries/os/ARM11/Makefile | 46 +++ .../build/libraries/os/ARM11/os_timer.c | 334 ++++++++++++++++++ .../bootrom/build/libraries/os/ARM9/Makefile | 55 +++ .../bootrom/build/libraries/os/ARM9/os_tick.c | 201 +++++++++++ .../build/libraries/os/ARM9/os_timer.c | 274 ++++++++++++++ trunk/bootrom/build/libraries/os/Makefile | 34 ++ trunk/bootrom/include/brom/os/ARM11/timer.h | 16 + 7 files changed, 960 insertions(+) create mode 100644 trunk/bootrom/build/libraries/os/ARM11/Makefile create mode 100644 trunk/bootrom/build/libraries/os/ARM11/os_timer.c create mode 100644 trunk/bootrom/build/libraries/os/ARM9/Makefile create mode 100644 trunk/bootrom/build/libraries/os/ARM9/os_tick.c create mode 100644 trunk/bootrom/build/libraries/os/ARM9/os_timer.c create mode 100644 trunk/bootrom/build/libraries/os/Makefile diff --git a/trunk/bootrom/build/libraries/os/ARM11/Makefile b/trunk/bootrom/build/libraries/os/ARM11/Makefile new file mode 100644 index 0000000..33bedae --- /dev/null +++ b/trunk/bootrom/build/libraries/os/ARM11/Makefile @@ -0,0 +1,46 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrBrom - libraries - os +# File: Makefile +# +# 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$ +#---------------------------------------------------------------------------- + +SUBDIRS = +SUBMAKES = + + +#---------------------------------------------------------------------------- + +# build ARM & THUMB libraries +BROM_CODEGEN_ALL ?= TRUE + +SRCDIR = . ../common + +SRCS = \ + os_timer.c \ + +TARGET_LIB = libos$(BROM_LIBSUFFIX).a + +include $(CTRBROM_ROOT)/build/buildtools/commondefs + +INSTALL_TARGETS = $(TARGETS) +INSTALL_DIR = $(BROM_INSTALL_LIBDIR) + +#---------------------------------------------------------------------------- + +do-build: $(TARGETS) + +include $(CTRBROM_ROOT)/build/buildtools/modulerules + +#===== End of Makefile ===== diff --git a/trunk/bootrom/build/libraries/os/ARM11/os_timer.c b/trunk/bootrom/build/libraries/os/ARM11/os_timer.c new file mode 100644 index 0000000..a70f779 --- /dev/null +++ b/trunk/bootrom/build/libraries/os/ARM11/os_timer.c @@ -0,0 +1,334 @@ +/*---------------------------------------------------------------------------* + Project: CtrBrom - libraries - OS + File: os_timer.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 +#include + +void timer_handler(void); + +#if 0 // miya +static void i_osTimerInterruptHandler(void); +static void i_osWatchdogInterruptHandler( void ); +#endif +static void i_osStartTimer( u32 count, u8 preScale, OSTimerRepeat repeat, OSTimerIntrReq ireq ); +static void i_osStartWatchDog( u32 count, u8 preScale, OSTimerRepeat repeat, OSTimerIntrReq ireq, + OSWatchdogMode watchdogMode ); + +static u32 osTimerClock = OS_TIMER_CLOCK_DEFAULT; + + +/*---------------------------------------------------------------------------* + Name: osInitTimer + + Description: Initialize Timers + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ + +void osInitTimer( void ) +{ + static BOOL isInit; + + if ( isInit == FALSE ) + { + isInit = TRUE; + + osInitInterrupt(); + + osTimerClock = OS_TIMER_CLOCK_DEFAULT; + + osDisableTimerAndWatchdog(); + osStopTimer(); + osStopWatchDog(); + + osSetInterruptHandler( OS_INTR_ID_TIMER, timer_handler ); + //osSetInterruptHandler( OS_INTR_ID_TIMER, timer_handler ); + //osSetInterruptHandler( OS_INTR_ID_WATCHDOG, i_osWatchdogInterruptHandler ); + + reg_OS_IDR_SET_IE0 = REG_OS_IDR_SET_IE0_TM_MASK; + + osEnableTimerAndWatchdog(); + + } +} + + +/*---------------------------------------------------------------------------* + Name: i_osTimerInterruptHandler + + Description: Timer interrupt handler + + Arguments: None. + + Returns: None. + *---------------------------------------------------------------------------*/ +#if 0 // miya +static void i_osTimerInterruptHandler( void ) +{ + reg_OS_CPUTM_EVT = HW_CPUTM_EVT_FLAG; +} + +/*---------------------------------------------------------------------------* + Name: i_osWatchdogInterruptHandler + + Description: Watchdog interrupt handler + + Arguments: None. + + Returns: None. + *---------------------------------------------------------------------------*/ + + +static void i_osWatchdogInterruptHandler( void ) +{ + reg_OS_CPUWD_EVT = HW_CPUWD_EVT_FLAG; +} +#endif + + +/*---------------------------------------------------------------------------* + Name: osStartTimerWithUSec + + Description: Start Timer + + Arguments: micro second + + Returns: None + *---------------------------------------------------------------------------*/ + +void osStartTimerWithUSec( u32 usec, u8 preScale ) +{ + u32 count = ((usec) * (osTimerClock / 1000)) / (preScale+1) / 1000; + + i_osStartTimer( count, preScale, OS_TM_AUTO_RELOAD, OS_TM_INTR_REQ_ENABLE ); +} + +/*---------------------------------------------------------------------------* + Name: osStartTimerWithMSec + + Description: Start Timer + + Arguments: milli second + + Returns: None + *---------------------------------------------------------------------------*/ + +void osStartTimerWithMSec( u32 msec, u8 preScale ) +{ + u32 count = (((msec) * osTimerClock / 1000)) / (preScale+1); + + i_osStartTimer( count, preScale, OS_TM_AUTO_RELOAD, OS_TM_INTR_REQ_ENABLE ); +} + +/*---------------------------------------------------------------------------* + Name: osStartTimer + + Description: Start Timer + + Arguments: interval + + Returns: None + *---------------------------------------------------------------------------*/ + +void osStartTimer( u32 count, u8 preScale ) +{ + i_osStartTimer( count, preScale, OS_TM_AUTO_RELOAD, OS_TM_INTR_REQ_ENABLE ); +} + +/*---------------------------------------------------------------------------* + Name: osStartWatchdog + + Description: Start Watchdog + + Arguments: interval + watchdogMode + + Returns: None + *---------------------------------------------------------------------------*/ + +void osStartWatchDog( u32 count, u8 preScale, OSWatchdogMode watchdogMode ) +{ + i_osStartWatchDog( count, preScale, OS_TM_AUTO_RELOAD, OS_TM_INTR_REQ_DISABLE, watchdogMode ); +} + +/*---------------------------------------------------------------------------* + Name: i_osStartTimer + + Description: Start Timer + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ + +static void i_osStartTimer( u32 count, u8 preScale, OSTimerRepeat repeat, OSTimerIntrReq ireq ) +{ + OSIntrMode intr = osDisableInterrupts(); + + reg_OS_TM_CNT = 0; + reg_OS_TM_LD = count; + reg_OS_TM_CNT = REG_OS_TM_CNT_E_MASK | repeat | ireq + | ((preScale < + +/*---------------------------------------------------------------------------* + Name: osEnableTimerAndWatchdog + + Description: Enable Timer & Watchdog + + Arguments: None + + Returns: previous status + *---------------------------------------------------------------------------*/ + +ASM BOOL osEnableTimerAndWatchdog( void ) +{ + stmfd sp!, {r4, lr} // stack requires 8byte alignment + + bl __cpp(osDisableInterrupts) + + mrc p15, 0, r4, c15, c12, 0 + orr r1, r4, #HW_C15_COUNT_ENABLE + mcr p15, 0, r1, c15, c12, 0 + + // 引数 r0 は osDisableInterrupts の返り値 + bl __cpp(osRestoreInterrupts) + + and r0, r4, #HW_CPUTM_ENABLE // retuen value + ldmfd sp!, {r4, pc} // stack requires 8byte alignment +} + + +/*---------------------------------------------------------------------------* + Name: osDisableTimerAndWatchdog + + Description: Enable Timer & Watchdog + + Arguments: None + + Returns: previous status + *---------------------------------------------------------------------------*/ + +ASM BOOL osDisableTimerAndWatchdog( void ) +{ + stmfd sp!, {r4, lr} // stack requires 8byte alignment + + bl __cpp(osDisableInterrupts) + + mrc p15, 0, r4, c15, c12, 0 + bic r1, r4, #HW_C15_COUNT_ENABLE + mcr p15, 0, r1, c15, c12, 0 + + // 引数 r0 は osDisableInterrupts の返り値 + bl __cpp(osRestoreInterrupts) + + and r0, r4, #HW_CPUTM_ENABLE // retuen value + ldmfd sp!, {r4, pc} // stack requires 8byte alignment +} + +#include + +/*====== End of main.c ======*/ diff --git a/trunk/bootrom/build/libraries/os/ARM9/Makefile b/trunk/bootrom/build/libraries/os/ARM9/Makefile new file mode 100644 index 0000000..fc3b58d --- /dev/null +++ b/trunk/bootrom/build/libraries/os/ARM9/Makefile @@ -0,0 +1,55 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: TwlBrom - libraries_sp - os +# File: Makefile +# +# 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$ +#---------------------------------------------------------------------------- + +SUBDIRS = +#SUBMAKES = Makefile.CALLTRACE \ +# Makefile.FUNCTIONCOST + +#---------------------------------------------------------------------------- + +# build ARM & THUMB libraries +BROM_CODEGEN_ALL ?= TRUE + +# Codegen for sub processer +BROM_PROC = ARM9 + +SRCDIR = . ../common + +SRCS = \ + os_tick.c \ + os_timer.c \ + +TARGET_LIB = libos_sp$(BROM_LIBSUFFIX).a + + +#---------------------------------------------------------------------------- + +include $(CTRBROM_ROOT)/build/buildtools/commondefs + +INSTALL_TARGETS = $(TARGETS) +INSTALL_DIR = $(BROM_INSTALL_LIBDIR) + + +#---------------------------------------------------------------------------- + +do-build: $(TARGETS) + +include $(CTRBROM_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== diff --git a/trunk/bootrom/build/libraries/os/ARM9/os_tick.c b/trunk/bootrom/build/libraries/os/ARM9/os_tick.c new file mode 100644 index 0000000..1bbfb36 --- /dev/null +++ b/trunk/bootrom/build/libraries/os/ARM9/os_tick.c @@ -0,0 +1,201 @@ +/*---------------------------------------------------------------------------* + Project: CtrBrom - libraries - OS + File: os_tick.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 +#include + + +//---------------------------------------------------------------------- +//---- 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 ) + +//---- timer number tick uses +#define OSi_TICK_TIMER OS_TIMER_3 + +//---- timer interrupt mask (must be same number with OSi_TICK_TIMER) +#define OSi_TICK_IE_TIMER REG_OS_IF_T3_MASK + +//---- timer interrupt ID +#define OSi_TICK_IE_TIMER_ID OS_INTR_ID_TIMER3 + +//---- flag for initialization tick +static u16 i_osUseTick = FALSE; + +//---- tick counter +vu64 i_osTickCounter; + +//---- flag for need to re-set timer +BOOL i_osNeedResetTimer = FALSE; + +extern u16 i_osIsTimerReserved(int timerNum); +extern void i_osSetTimerReserved(int timerNum); + +static void i_osCountUpTick(void); + +/*---------------------------------------------------------------------------* + Name: osInitTick + + Description: initialize 'tick system' + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +void osInitTick(void) +{ + if (!i_osUseTick) + { + i_osUseTick = TRUE; + + //---- OS reserves OSi_TICK_TIMER timer + SDK_ASSERT(!i_osIsTimerReserved(OSi_TICK_TIMER)); + i_osSetTimerReserved(OSi_TICK_TIMER); + + //---- setting timer + i_osTickCounter = 0; + i_osSetTimerControl(OSi_TICK_TIMER, 0); + i_osSetTimerCount((OSTimer)OSi_TICK_TIMER, (u16)0); + i_osSetTimerControl(OSi_TICK_TIMER, (u16)OSi_TICK_TIMERCONTROL); + + //---- set interrupt callback + osSetInterruptHandler( OS_INTR_ID_TIMER3, i_osCountUpTick ); + osSetMultiInterruptMask( OS_INTR_ID_TIMER3, (OSIntrMask)0xffffffff ); // ?, osInitTimerの真似 + + //---- enable timer interrupt + osEnableInterruptID(OSi_TICK_IE_TIMER_ID); + + //---- need to reset + i_osNeedResetTimer = FALSE; + } +} + +/*---------------------------------------------------------------------------* + Name: osIsTickAvailable + + Description: check tick system is available + + Arguments: None + + Returns: if available, TRUE. + *---------------------------------------------------------------------------*/ +BOOL osIsTickAvailable(void) +{ + return i_osUseTick; +} + + +/*---------------------------------------------------------------------------* + Name: i_osCountUpTick + + Description: timer interrupt handle. + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ +static void i_osCountUpTick(void) +{ + i_osTickCounter++; + + //---- setting for timer + if (i_osNeedResetTimer) + { + i_osSetTimerControl(OSi_TICK_TIMER, 0); + i_osSetTimerCount((OSTimer)OSi_TICK_TIMER, (u16)0); + i_osSetTimerControl(OSi_TICK_TIMER, (u16)OSi_TICK_TIMERCONTROL); + + i_osNeedResetTimer = FALSE; + } + +// これはやらなくても、毎回コールバックがかかるから問題ない? +// //---- reset callback +// OSi_EnterTimerCallback(OSi_TICK_TIMER, (void (*)(void *))i_osCountUpTick, 0); +} + +/*---------------------------------------------------------------------------* + Name: osGetTick + + Description: get tick value + + Arguments: None + + Returns: tick value + *---------------------------------------------------------------------------*/ +u64 osGetTick(void) +{ + vu16 countL; + vu64 countH; + + OSIntrMode prev = osDisableInterrupts(); + SDK_ASSERT(i_osUseTick); + + countL = *(REGType16 *)((u32)REG_TM0CNT_L_ADDR + OSi_TICK_TIMER * 4); + countH = i_osTickCounter & 0xffffffffffffULL; + + //---- check if timer interrupt bit is on + if (reg_OS_IF & OSi_TICK_IE_TIMER && !(countL & 0x8000)) + { + countH++; + } + + (void)osRestoreInterrupts(prev); + + return (countH << 16) | countL; +} + +/*---------------------------------------------------------------------------* + Name: osGetTickLo + + Description: get tick value (only u16 part) + + Arguments: None + + Returns: tick value (only u16 part) + *---------------------------------------------------------------------------*/ +u16 osGetTickLo(void) +{ + SDK_ASSERT(OSi_UseTick); + return *(REGType16 *)((u32)REG_TM0CNT_L_ADDR + OSi_TICK_TIMER * 4); +} + +/*---------------------------------------------------------------------------* + Name: osSetTick + + Description: set tick value + + Arguments: count value of tick to be set + + Returns: None + *---------------------------------------------------------------------------*/ +void osSetTick(u64 count) +{ + OSIntrMode prev; + + SDK_ASSERT(i_osUseTick); + prev = osDisableInterrupts(); + + reg_OS_IF = OSi_TICK_IE_TIMER; + + i_osNeedResetTimer = TRUE; + + i_osTickCounter = (u64)(count >> 16); + + i_osSetTimerControl(OSi_TICK_TIMER, 0); + i_osSetTimerCount((OSTimer)OSi_TICK_TIMER, (u16)(count & 0xffff)); + i_osSetTimerControl(OSi_TICK_TIMER, (u16)OSi_TICK_TIMERCONTROL); + + (void)osRestoreInterrupts(prev); +} diff --git a/trunk/bootrom/build/libraries/os/ARM9/os_timer.c b/trunk/bootrom/build/libraries/os/ARM9/os_timer.c new file mode 100644 index 0000000..ce9231a --- /dev/null +++ b/trunk/bootrom/build/libraries/os/ARM9/os_timer.c @@ -0,0 +1,274 @@ +/*---------------------------------------------------------------------------* + Project: CtrBrom - libraries - OS + File: os_timer.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 +#include + +void timer_handler(void); + +//---------------------------------------------------------------------- +#define REG_OS_TMCNT_H_E_MASK REG_OS_TM0CNT_H_E_MASK +#define REG_OS_TMCNT_H_I_MASK REG_OS_TM0CNT_H_I_MASK +#define REG_OS_TMCNT_H_CH_MASK REG_OS_TM1CNT_H_CH_MASK + +//---- if OS reserved each timer, bit=1 +static u8 i_osTimerReserved[OS_TIMER_NUM]; + +u8 i_osIsTimerReserved(int timerNum); +void i_osSetTimerReserved(int timerNum); +void i_osUnsetTimerReserved(int timerNum); + + +/*---------------------------------------------------------------------------* + Name: osInitTimer + + Description: Initialize Timers + + Arguments: None + + Returns: None + *---------------------------------------------------------------------------*/ + +void osInitTimer( void ) +{ + static BOOL isInit; + + if ( isInit == FALSE ) + { + isInit = TRUE; + + osInitInterrupt(); + + i_osStopTimer64(); + + { + OSIntrMask imask = 0xffffffff; + + osSetInterruptHandler( OS_INTR_ID_TIMER1, timer_handler ); + osSetMultiInterruptMask( OS_INTR_ID_TIMER1, imask ); + } + + osEnableInterruptID( OS_INTR_ID_TIMER1 ); + + i_osStartTimer32( OS_TIMER32_01, (u32)i_osMSecToTick32( 1 ), OS_TIMER_PRESCALER_64 ); + } +} + + +//================================================================================ +/*---------------------------------------------------------------------------* + Name: i_osIsTimerReserved + + Description: check if specified timer is reserved for OS + + Arguments: timerNum : timerNo (0-3) + + Returns: non-0 if reserved + *---------------------------------------------------------------------------*/ +u8 i_osIsTimerReserved( int timer_id ) +{ + return i_osTimerReserved[timer_id]; +} + +/*---------------------------------------------------------------------------* + Name: i_osSetTimerReserved + + Description: set specified timer to reserved for OS + + Arguments: timerNum : timerNo (0-3) + + Returns: None. + *---------------------------------------------------------------------------*/ +void i_osSetTimerReserved( int timer_id ) +{ + i_osTimerReserved[timer_id] = TRUE; +} + +/*---------------------------------------------------------------------------* + Name: i_osUnsetTimerReserved + + Description: unset specified timer to reserved for OS + + Arguments: timerNum : timerNo (0-3) + + Returns: None. + *---------------------------------------------------------------------------*/ +void i_osUnsetTimerReserved( int timer_id ) +{ + i_osTimerReserved[timer_id] = FALSE; +} + +//================================================================================ +/*---------------------------------------------------------------------------* + Name: i_osStartTimer + + Description: set timer(s) and start + + Arguments: id timerNo + count count value to be set to timer + preScale preScale + + Returns: None + *---------------------------------------------------------------------------*/ +// +// use 1 timer, 16bit counter, timer interrupt occurs by overflow +// +void i_osStartTimer( OSTimer id, u16 count, OSTimerPrescaler preScale ) +{ + SDK_ASSERT(OS_TIMER_0 <= id && id <= OS_TIMER_3); + SDK_ASSERT(OS_TIMER_PRESCALER_1 <= preScale && preScale <= OS_TIMER_PRESCALER_1024); + //---- check if system reserved + SDK_ASSERT(!i_osIsTimerReserved(id)); + + i_osSetTimerCount(id, (u16)~count); + i_osSetTimerControl(id, (u16)(REG_OS_TMCNT_H_E_MASK | REG_OS_TMCNT_H_I_MASK | preScale)); +} + +// +// use 2 timers, 32bit counter, timer interrupt occurs by overflow +// +void i_osStartTimer32( OSTimer32 id, u32 count, OSTimerPrescaler preScale ) +{ + SDK_ASSERT(OS_TIMER32_01 <= id && id <= OS_TIMER32_23); + SDK_ASSERT(OS_TIMER_PRESCALER_1 <= preScale && preScale <= OS_TIMER_PRESCALER_1024); + //---- check if system reserved + SDK_ASSERT(!i_osIsTimerReserved(id)); + SDK_ASSERT(!i_osIsTimerReserved(id + 1)); + + i_osSetTimerCount((OSTimer)((int)id + 1), (u16)((~count >> 16) & 0xffff)); + i_osSetTimerCount((OSTimer)id, (u16)(~count & 0xffff)); + + i_osSetTimerControl((OSTimer)((int)id + 1), + REG_OS_TMCNT_H_E_MASK | REG_OS_TMCNT_H_I_MASK | REG_OS_TMCNT_H_CH_MASK); + i_osSetTimerControl((OSTimer)id, (u16)(REG_OS_TMCNT_H_E_MASK | preScale)); +} + +// +// use 3 timers, 48bit counter, timer interrupt occurs by overflow +// +void i_osStartTimer48( OSTimer48 id, u64 count, OSTimerPrescaler preScale ) +{ + SDK_ASSERT(OS_TIMER48_012 <= id && id <= OS_TIMER48_123); + SDK_ASSERT(OS_TIMER_PRESCALER_1 <= preScale && preScale <= OS_TIMER_PRESCALER_1024); + //---- check if system reserved + SDK_ASSERT(!i_osIsTimerReserved(id)); + SDK_ASSERT(!i_osIsTimerReserved(id + 1)); + SDK_ASSERT(!i_osIsTimerReserved(id + 2)); + + i_osSetTimerCount((OSTimer)((int)id + 2), (u16)((~count >> 32) & 0xffff)); + i_osSetTimerCount((OSTimer)((int)id + 1), (u16)((~count >> 16) & 0xffff)); + i_osSetTimerCount((OSTimer)id, (u16)(~count & 0xffff)); + + i_osSetTimerControl((OSTimer)((int)id + 2), + REG_OS_TMCNT_H_E_MASK | REG_OS_TMCNT_H_I_MASK | REG_OS_TMCNT_H_CH_MASK); + i_osSetTimerControl((OSTimer)((int)id + 1), REG_OS_TMCNT_H_E_MASK | REG_OS_TMCNT_H_CH_MASK); + i_osSetTimerControl((OSTimer)id, (u16)(REG_OS_TMCNT_H_E_MASK | preScale)); +} + +// +// use all 4 timers, 64bit counter, timer3 interrupt occurs by overflow +// +void i_osStartTimer64( u64 count, OSTimerPrescaler preScale ) +{ + SDK_ASSERT(OS_TIMER_PRESCALER_1 <= preScale && preScale <= OS_TIMER_PRESCALER_1024); + //---- check if system reserved + SDK_ASSERT(!i_osIsTimerReserved(OS_TIMER_0)); + SDK_ASSERT(!i_osIsTimerReserved(OS_TIMER_1)); + SDK_ASSERT(!i_osIsTimerReserved(OS_TIMER_2)); + SDK_ASSERT(!i_osIsTimerReserved(OS_TIMER_3)); + + i_osSetTimerCount(OS_TIMER_3, (u16)((~count >> 48) & 0xffff)); + i_osSetTimerCount(OS_TIMER_2, (u16)((~count >> 32) & 0xffff)); + i_osSetTimerCount(OS_TIMER_1, (u16)((~count >> 16) & 0xffff)); + i_osSetTimerCount(OS_TIMER_0, (u16)(~count & 0xffff)); + + i_osSetTimerControl(OS_TIMER_3, + REG_OS_TMCNT_H_E_MASK | REG_OS_TMCNT_H_I_MASK | REG_OS_TMCNT_H_CH_MASK); + i_osSetTimerControl(OS_TIMER_2, REG_OS_TMCNT_H_E_MASK | REG_OS_TMCNT_H_CH_MASK); + i_osSetTimerControl(OS_TIMER_1, REG_OS_TMCNT_H_E_MASK | REG_OS_TMCNT_H_CH_MASK); + i_osSetTimerControl(OS_TIMER_0, (u16)(REG_OS_TMCNT_H_E_MASK | preScale)); +} + + +/*---------------------------------------------------------------------------* + Name: i_osStopTimer + + Description: stop timer(s) + + Arguments: id timerNo + + Returns: None + *---------------------------------------------------------------------------*/ +// +// stop a timer +// +void i_osStopTimer( OSTimer id ) +{ + SDK_ASSERT(OS_TIMER_0 <= id && id <= OS_TIMER_3); + //---- check if system reserved + SDK_ASSERT(!i_osIsTimerReserved(id)); + + i_osSetTimerControl(id, 0); +} + +// +// stop 2 timers +// +void i_osStopTimer32( OSTimer32 id ) +{ + SDK_ASSERT(OS_TIMER32_01 <= id && id <= OS_TIMER32_23); + //---- check if system reserved + SDK_ASSERT(!i_osIsTimerReserved(id)); + SDK_ASSERT(!i_osIsTimerReserved(id + 1)); + + i_osStopTimer((OSTimer)((int)id + 1)); + i_osStopTimer((OSTimer)id); +} + +// +// stop 3 timers +// +void i_osStopTimer48( OSTimer48 id ) +{ + SDK_ASSERT(OS_TIMER48_012 <= id && id <= OS_TIMER48_123); + //---- check if system reserved + SDK_ASSERT(!i_osIsTimerReserved(id)); + SDK_ASSERT(!i_osIsTimerReserved(id + 1)); + SDK_ASSERT(!i_osIsTimerReserved(id + 2)); + + i_osStopTimer((OSTimer)((int)id + 2)); + i_osStopTimer((OSTimer)((int)id + 1)); + i_osStopTimer((OSTimer)id); +} + +// +// stop all 4 timers +// +void i_osStopTimer64( void ) +{ + //---- check if system reserved + SDK_ASSERT(!i_osIsTimerReserved(OS_TIMER_0)); + SDK_ASSERT(!i_osIsTimerReserved(OS_TIMER_1)); + SDK_ASSERT(!i_osIsTimerReserved(OS_TIMER_2)); + SDK_ASSERT(!i_osIsTimerReserved(OS_TIMER_3)); + + i_osStopTimer(OS_TIMER_3); + i_osStopTimer(OS_TIMER_2); + i_osStopTimer(OS_TIMER_1); + i_osStopTimer(OS_TIMER_0); +} + + diff --git a/trunk/bootrom/build/libraries/os/Makefile b/trunk/bootrom/build/libraries/os/Makefile new file mode 100644 index 0000000..0c12e53 --- /dev/null +++ b/trunk/bootrom/build/libraries/os/Makefile @@ -0,0 +1,34 @@ +#! make -f +#---------------------------------------------------------------------------- +# Project: CtrBrom - libraries - os +# File: Makefile +# +# 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 $(CTRBROM_ROOT)/build/buildtools/commondefs + +#---------------------------------------------------------------------------- + +SUBDIRS = ARM11 + +#ifdef CTR_WITH_ARM9 +SUBDIRS += ARM9 +#endif + +#---------------------------------------------------------------------------- + +include $(CTRBROM_ROOT)/build/buildtools/modulerules + + +#===== End of Makefile ===== diff --git a/trunk/bootrom/include/brom/os/ARM11/timer.h b/trunk/bootrom/include/brom/os/ARM11/timer.h index 800c17a..c00957a 100644 --- a/trunk/bootrom/include/brom/os/ARM11/timer.h +++ b/trunk/bootrom/include/brom/os/ARM11/timer.h @@ -24,6 +24,8 @@ extern "C" { #endif +#define OS_TIMER_CLOCK_DEFAULT HW_CPU_CLOCK + //---------------------------------------------------------------------- //---- timer ID @@ -41,6 +43,20 @@ typedef enum } OSWatchdogMode; +typedef enum +{ + OS_TM_AUTO_RELOAD = HW_CPUTM_AUTO_RELOAD, + OS_TM_SINGLE_SHOT = HW_CPUTM_SINGLE_SHOT +} +OSTimerRepeat; + +typedef enum +{ + OS_TM_INTR_REQ_ENABLE = HW_CPUTM_INTR_ENABLE, + OS_TM_INTR_REQ_DISABLE = 0 +} +OSTimerIntrReq; + void osInitTimer( void );