ctr_firmware/trunk/bootrom/build/libraries/os/ARM11/os_timer.c
nakasima d58a354198 タイマーレジスタの二重定義を整理。
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@104 b871894f-2f95-9b40-918c-086798483c85
2008-12-12 08:43:31 +00:00

329 lines
8.8 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>
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;
osTimerClock = OS_TIMER_CLOCK_DEFAULT;
osDisableTimerAndWatchdog();
osStopTimer();
osStopWatchDog();
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_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 )
{
reg_OS_WD_DIS = TRUE;
}
#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 ======*/