mirror of
https://github.com/rvtr/ctr_firmware.git
synced 2025-10-31 07:51:08 -04:00
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@105 b871894f-2f95-9b40-918c-086798483c85
326 lines
8.7 KiB
C
326 lines
8.7 KiB
C
/*---------------------------------------------------------------------------*
|
||
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;
|
||
|
||
osStopTimer();
|
||
osStopWatchDog();
|
||
}
|
||
}
|
||
|
||
|
||
/*---------------------------------------------------------------------------*
|
||
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 ======*/
|