ctr_firmware/trunk/bootrom/build/libraries/os/ARM11/os_timer.c
nakasima ee2e31dfb8 スキャッタロードを有効時にmainから戻って例外が起こらないように修正。
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@110 b871894f-2f95-9b40-918c-086798483c85
2008-12-17 01:13:35 +00:00

333 lines
9.1 KiB
C
Raw Blame History

/*---------------------------------------------------------------------------*
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 <brom/os.h>
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 )
{
OSIntrMode intr = osDisableInterrupts();
isInit = TRUE;
osTimerClock = OS_TIMER_CLOCK_DEFAULT;
osStopTimer();
osStopWatchdog();
osResetWatchdog();
osDisableWatchdog();
osRestoreInterrupts( intr );
}
}
/*---------------------------------------------------------------------------*
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: osStartWatchdogWithUSec
Description: Start Watchdog
Arguments: micro second
Returns: None
*---------------------------------------------------------------------------*/
void osStartWatchdogWithUSec( u32 usec, u8 preScale, OSWatchdogMode watchdogMode )
{
u32 count = ((usec) * (osTimerClock / 1000)) / (preScale+1) / 1000;
i_osStartWatchdog( count, preScale, OS_TM_SINGLE_SHOT, OS_TM_INTR_REQ_ENABLE, watchdogMode );
}
/*---------------------------------------------------------------------------*
Name: osStartWatchdogWithMSec
Description: Start Watchdog
Arguments: milli second
Returns: None
*---------------------------------------------------------------------------*/
void osStartWatchdogWithMSec( u32 msec, u8 preScale, OSWatchdogMode watchdogMode )
{
u32 count = (((msec) * osTimerClock / 1000)) / (preScale+1);
i_osStartWatchdog( count, preScale, OS_TM_SINGLE_SHOT, OS_TM_INTR_REQ_ENABLE, watchdogMode );
}
/*---------------------------------------------------------------------------*
Name: osStartWatchdog
Description: Start Watchdog
Arguments: interval
watchdogMode
Returns: None
*---------------------------------------------------------------------------*/
void osStartWatchdog( u32 count, u8 preScale, OSWatchdogMode watchdogMode )
{
i_osStartWatchdog( count, preScale, OS_TM_SINGLE_SHOT, 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 <<REG_OS_TM_CNT_PS_SHIFT) & REG_OS_TM_CNT_PS_MASK);
osRestoreInterrupts( intr );
}
/*---------------------------------------------------------------------------*
Name: i_osStartWatchdog
Description: Start Watchdog
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
static void i_osStartWatchdog( u32 count, u8 preScale, OSTimerRepeat repeat, OSTimerIntrReq ireq,
OSWatchdogMode watchdogMode )
{
reg_OS_WD_CNT = 0;
reg_OS_WD_LD = count;
reg_OS_WD_CNT = REG_OS_WD_CNT_E_MASK | repeat | ireq
| ((preScale <<REG_OS_WD_CNT_PS_SHIFT) & REG_OS_WD_CNT_PS_MASK)
| watchdogMode;
}
/*---------------------------------------------------------------------------*
Name: osStopTimer
Description: Stop Timer
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void osStopTimer( void )
{
reg_OS_TM_CNT = 0;
reg_OS_TM_IF = REG_OS_TM_IF_IF_MASK;
}
/*---------------------------------------------------------------------------*
Name: osStopWatchdog
Description: Stop Watchdog
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void osStopWatchdog( void )
{
reg_OS_WD_CNT = 0;
reg_OS_WD_IF = REG_OS_WD_IF_IF_MASK;
}
/*---------------------------------------------------------------------------*
Name: osResetWatchdog
Description: Reset Watchdog
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void osResetWatchdog( void )
{
reg_OS_WD_RST = TRUE;
}
/*---------------------------------------------------------------------------*
Name: osDisableWatchdog
Description: Disable Watchdog
Arguments: None
Returns: None
*---------------------------------------------------------------------------*/
void osDisableWatchdog( void )
{
OSIntrMode intr = osDisableInterrupts();
reg_OS_WD_DIS = OSi_WATCHDOG_DISABLE_CODE_0;
reg_OS_WD_DIS = OSi_WATCHDOG_DISABLE_CODE_1;
osRestoreInterrupts( intr );
}
#include <brom/code32.h>
/*---------------------------------------------------------------------------*
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
// <20><><EFBFBD><EFBFBD> r0 <20><> osDisableInterrupts <20>̕Ԃ<CC95><D482>l
bl __cpp(osRestoreInterrupts)
mov r0, r4
// 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
// <20><><EFBFBD><EFBFBD> r0 <20><> osDisableInterrupts <20>̕Ԃ<CC95><D482>l
bl __cpp(osRestoreInterrupts)
mov r0, r4
// and r0, r4, #HW_CPUTM_ENABLE // retuen value
ldmfd sp!, {r4, pc} // stack requires 8byte alignment
}
#include <brom/codereset.h>
/*====== End of main.c ======*/