ctr_firmware/trunk/bootrom/include/brom/os/common/tick.h
nakasima 63c9a50447 ARM9のチックタイマーを32bitへ拡張(アラームの32bit化はタイマーの仕様から除算が頻繁に入りそう)。
git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-09-30%20-%20paladin.7z/paladin/ctr_firmware@173 b871894f-2f95-9b40-918c-086798483c85
2009-01-14 11:50:51 +00:00

134 lines
5.5 KiB
C
Raw Blame History

/*---------------------------------------------------------------------------*
Project: CtrBrom - OS - include
File: tick.h
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$
*---------------------------------------------------------------------------*/
#ifndef BROM_OS_TICK_H_
#define BROM_OS_TICK_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <brom/misc.h>
#include <brom/types.h>
#include <ctr/ioreg.h>
#include <brom/os/common/timer.h>
//---- unit of tick
typedef u64 OSTick;
typedef u32 OSTick32;
//---- tick APIs
extern void osInitTick( void );
extern u64 osGetTick( void );
extern void i_osSetTick( u64 );
//----------------------------------------------------------------------
//---- ARM9 use 2 timers
#ifdef SDK_ARM9
#define OS_TICK_USE_2TIMERS
#endif // SDK_ARM9
//---- timer number tick uses
#define OSi_TICK_TIMER OS_TIMER_0
#ifdef OS_TICK_USE_2TIMERS
#define OSi_TICK_TIMER_H ((OSTimer)(OSi_TICK_TIMER + 1))
#endif // OS_TICK_USE_2TIMERS
//---- timer interrupt ID
#ifdef SDK_ARM11
#define OSi_TICK_IE_TIMER_ID ((OSIntrID)(OS_INTR_ID_TIMER + OSi_TICK_TIMER))
#else // SDK_ARM9
#ifndef OS_TICK_USE_2TIMERS
#define OSi_TICK_IE_TIMER_ID ((OSIntrID)(OS_INTR_ID_TIMER0 + OSi_TICK_TIMER))
#else // OS_TICK_USE_2TIMERS
#define OSi_TICK_IE_TIMER_ID ((OSIntrID)(OS_INTR_ID_TIMER0 + OSi_TICK_TIMER_H))
#endif // OS_TICK_USE_2TIMERS
#endif // SDK_ARM9
//---- conversion tick count <-> real time count
#ifdef SDK_ARM11
#define OS_TICK_CLOCK HW_CPU_CLOCK
#define OS_TICK_PRESCALE 1
#define OS_TICK_HI_SHIFT 28 // 2<>̗ݏ<CC97><DD8F>P<EFBFBD>ʂŃ`<60>b<EFBFBD>N<EFBFBD>Ǘ<EFBFBD><C797><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂ł<CC82><C582><EFBFBD><EFBFBD><EFBFBD>32<33>͎w<CD8E><77><EFBFBD>ł<EFBFBD><C582>Ȃ<EFBFBD><C882>i<EFBFBD><69><EFBFBD><EFBFBD><EFBFBD>l0<6C>ł͊<C582><CD8A><EFBFBD>݂<EFBFBD><DD82><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882><EFBFBD><EFBFBD>߁A<DF81>ő<EFBFBD>31<33>j
#define OS_TICK_LO_MASK ((u32)(OS_TICK_HI_LSB-1))
#define OS_TICK_LO_MSB ((u32)(OS_TICK_HI_LSB>>1))
#define OS_TICK_HI_LSB (1ULL<<OS_TICK_HI_SHIFT)
#define OS_TICK_LO_LIMIT OS_TICK_HI_LSB
#else // SDK_ARM9
#define OS_TICK_CLOCK HW_SYSTEM_CLOCK
#define OS_TICK_PRESCALE 64
#ifndef OS_TICK_USE_2TIMERS
#define OS_TICK_HI_SHIFT 16 // <20><><EFBFBD><EFBFBD><EFBFBD>l0<6C>ł<EFBFBD><C582><EFBFBD><EFBFBD><EFBFBD>ݔ<EFBFBD><DD94><EFBFBD>
#define OS_TICK_LO_MASK ((u16)(OS_TICK_HI_LSB-1))
#define OS_TICK_LO_MSB ((u16)(OS_TICK_HI_LSB>>1))
#else // OS_TICK_USE_2TIMERS
#define OS_TICK_HI_SHIFT 32 // <20><><EFBFBD><EFBFBD><EFBFBD>l0<6C>ł<EFBFBD><C582><EFBFBD><EFBFBD><EFBFBD>ݔ<EFBFBD><DD94><EFBFBD>
#define OS_TICK_LO_MASK ((u32)(OS_TICK_HI_LSB-1))
#define OS_TICK_LO_MSB ((u32)(OS_TICK_HI_LSB>>1))
#endif // OS_TICK_USE_2TIMERS
#define OS_TICK_HI_LSB (1ULL<<OS_TICK_HI_SHIFT)
#define OS_TICK_LO_LIMIT OS_TICK_HI_LSB
#endif // SDK_ARM9
//---- sec to tick
#define OS_SEC_TO_TICK( sec ) OSi_SEC_TO_TICK( sec, OS_TICK_PRESCALE )
#define OS_SEC_TO_TICK32( sec ) OSi_SEC_TO_TICK32( sec, OS_TICK_PRESCALE )
#define OS_MSEC_TO_TICK( msec ) OSi_MSEC_TO_TICK( msec, OS_TICK_PRESCALE )
#define OS_MSEC_TO_TICK32( msec ) OSi_MSEC_TO_TICK32( msec, OS_TICK_PRESCALE )
#define OS_USEC_TO_TICK( usec ) OSi_USEC_TO_TICK( usec, OS_TICK_PRESCALE )
#define OS_USEC_TO_TICK32( usec ) OSi_USEC_TO_TICK32( usec, OS_TICK_PRESCALE )
#define OSi_SEC_TO_TICK( sec, prescale ) ((OSTick)( (OS_TICK_CLOCK * (u64)(sec)) / (prescale) ))
#define OSi_SEC_TO_TICK32( sec, prescale ) ((OSTick32)( (OS_TICK_CLOCK * (u32)(sec)) / (prescale) ))
#define OSi_MSEC_TO_TICK( msec, prescale ) ((OSTick)( ((OS_TICK_CLOCK/1000) * (u64)(msec)) / (prescale) ))
#define OSi_MSEC_TO_TICK32( msec, prescale ) ((OSTick32)( ((OS_TICK_CLOCK/1000) * (u32)(msec)) / (prescale) ))
#define OSi_USEC_TO_TICK( usec, prescale ) ((OSTick)( ((OS_TICK_CLOCK/1000) * (u64)(usec)) / ((prescale) * 1000) ))
#define OSi_USEC_TO_TICK32( usec, prescale ) ((OSTick32)( ((OS_TICK_CLOCK/1000) * (u32)(usec)) / ((prescale) * 1000) ))
//---- tick to sec
#define OS_TICK_TO_SEC( tick ) OSi_TICK_TO_SEC( tick, OS_TICK_PRESCALE )
#define OS_TICK_TO_SEC32( tick ) OSi_TICK_TO_SEC32( tick, OS_TICK_PRESCALE )
#define OS_TICK_TO_MSEC( tick ) OSi_TICK_TO_MSEC( tick, OS_TICK_PRESCALE )
#define OS_TICK_TO_MSEC32( tick ) OSi_TICK_TO_MSEC32( tick, OS_TICK_PRESCALE )
#define OS_TICK_TO_USEC( tick ) OSi_TICK_TO_USEC( tick, OS_TICK_PRESCALE )
#define OS_TICK_TO_USEC32( tick ) OSi_TICK_TO_USEC32( tick, OS_TICK_PRESCALE )
#define OSi_TICK_TO_SEC( tick, prescale ) ( ((u64)(tick) * (prescale)) / OS_TICK_CLOCK )
#define OSi_TICK_TO_SEC32( tick, prescale ) ( ((u32)(tick) * (prescale)) / OS_TICK_CLOCK )
#define OSi_TICK_TO_MSEC( tick, prescale ) ( ((u64)(tick) * (prescale)) / (OS_TICK_CLOCK/1000) )
#define OSi_TICK_TO_MSEC32( tick, prescale ) ( ((u32)(tick) * (prescale)) / (OS_TICK_CLOCK/1000) )
#define OSi_TICK_TO_USEC( tick, prescale ) ( ((u64)(tick) * (prescale) * 1000) / (OS_TICK_CLOCK/1000) )
#define OSi_TICK_TO_USEC32( tick, prescale ) ( ((u32)(tick) * (prescale) * 1000) / (OS_TICK_CLOCK/1000) )
#ifdef __cplusplus
} /* extern "C" */
#endif
/* BROM_OS_TICK_H_ */
#endif