/*---------------------------------------------------------------------------* 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 #include #include #ifdef SDK_ARM11 #include #else // SDK_ARM9 #include #endif // SDK_ARM9 //---- unit of tick typedef u64 OSTick; typedef u32 OSTick32; //---- tick APIs extern void osInitTick( void ); extern u64 osGetTick( void ); extern void i_osSetTick( u64 ); //---- conversion tick count <-> real time count #ifdef SDK_ARM11 #define OS_SYSTEM_CLOCK HW_CPU_CLOCK #define OS_TICK_HI_SHIFT 24 // 2の累乗単位でチック管理するのであれば32は指定できない(ロード値0では割り込みが発生しないため) #define OS_TICK_HI_LSB (1ULL<>1)) #define OS_TICK_LO_LIMIT OS_TICK_HI_LSB #else // SDK_ARM9 #define OS_SYSTEM_CLOCK HW_SYSTEM_CLOCK #define OS_TICK_HI_SHIFT 16 // ロード値0でも割り込み発生 #define OS_TICK_HI_LSB (1ULL<>1)) #define OS_TICK_LO_LIMIT OS_TICK_HI_LSB #endif // SDK_ARM9 //---- sec to tick #define OSi_SEC_TO_TICK( sec, prescale ) ((OSTick)( (OS_SYSTEM_CLOCK * (u64)(sec)) / (prescale) )) #define OSi_SEC_TO_TICK32( sec, prescale ) ((OSTick32)( (OS_SYSTEM_CLOCK * (u32)(sec)) / (prescale) )) #define OSi_MSEC_TO_TICK( msec, prescale ) ((OSTick)( ((OS_SYSTEM_CLOCK/1000) * (u64)(msec)) / (prescale) )) #define OSi_MSEC_TO_TICK32( msec, prescale ) ((OSTick32)( ((OS_SYSTEM_CLOCK/1000) * (u32)(msec)) / (prescale) )) #define OSi_USEC_TO_TICK( usec, prescale ) ((OSTick)( ((OS_SYSTEM_CLOCK/1000) * (u64)(usec)) / ((prescale) * 1000) )) #define OSi_USEC_TO_TICK32( usec, prescale ) ((OSTick32)( ((OS_SYSTEM_CLOCK/1000) * (u32)(usec)) / ((prescale) * 1000) )) #define OS_SEC_TO_TICK( sec ) OSi_SEC_TO_TICK( sec, 64 ) #define OS_SEC_TO_TICK32( sec ) OSi_SEC_TO_TICK32( sec, 64 ) #define OS_MSEC_TO_TICK( msec ) OSi_MSEC_TO_TICK( msec, 64 ) #define OS_MSEC_TO_TICK32( msec ) OSi_MSEC_TO_TICK32( msec, 64 ) #define OS_USEC_TO_TICK( usec ) OSi_USEC_TO_TICK( usec, 64 ) #define OS_USEC_TO_TICK32( usec ) OSi_USEC_TO_TICK32( usec, 64 ) //---- tick to sec #define OSi_TICK_TO_SEC( tick, prescale ) ( ((u64)(tick) * (prescale)) / OS_SYSTEM_CLOCK ) #define OSi_TICK_TO_SEC32( tick, prescale ) ( ((u32)(tick) * (prescale)) / OS_SYSTEM_CLOCK ) #define OSi_TICK_TO_MSEC( tick, prescale ) ( ((u64)(tick) * (prescale)) / (OS_SYSTEM_CLOCK/1000) ) #define OSi_TICK_TO_MSEC32( tick, prescale ) ( ((u32)(tick) * (prescale)) / (OS_SYSTEM_CLOCK/1000) ) #define OSi_TICK_TO_USEC( tick, prescale ) ( ((u64)(tick) * (prescale) * 1000) / (OS_SYSTEM_CLOCK/1000) ) #define OSi_TICK_TO_USEC32( tick, prescale ) ( ((u32)(tick) * (prescale) * 1000) / (OS_SYSTEM_CLOCK/1000) ) #define OS_TICK_TO_SEC( tick ) OSi_TICK_TO_SEC( tick, 64 ) #define OS_TICK_TO_SEC32( tick ) OSi_TICK_TO_SEC32( tick, 64 ) #define OS_TICK_TO_MSEC( tick ) OSi_TICK_TO_MSEC( tick, 64 ) #define OS_TICK_TO_MSEC32( tick ) OSi_TICK_TO_MSEC32( tick, 64 ) #define OS_TICK_TO_USEC( tick ) OSi_TICK_TO_USEC( tick, 64 ) #define OS_TICK_TO_USEC32( tick ) OSi_TICK_TO_USEC32( tick, 64 ) static inline OSTick i_osSecToTick( u64 sec ) { return OS_SEC_TO_TICK( sec ); } static inline OSTick32 i_osSecToTick32( u32 sec ) { return OS_SEC_TO_TICK32( sec ); } static inline OSTick i_osMSecToTick( u64 msec ) { return OS_MSEC_TO_TICK( msec ); } static inline OSTick32 i_osMSecToTick32( u32 msec ) { return OS_MSEC_TO_TICK32( msec ); } static inline OSTick i_osUSecToTick( u64 usec ) { return OS_USEC_TO_TICK( usec ); } static inline OSTick32 i_osUSecToTick32( u32 usec ) { return OS_USEC_TO_TICK32( usec ); } static inline u64 i_osTickToSec( OSTick tick ) { return OS_TICK_TO_SEC( tick ); } static inline u32 i_osTickToSec32( OSTick32 tick ) { return OS_TICK_TO_SEC32( tick ); } static inline u64 i_osTickToMSec( OSTick tick ) { return OS_TICK_TO_MSEC( tick ); } static inline u32 i_osTickToMSec32( OSTick32 tick ) { return OS_TICK_TO_MSEC32( tick ); } static inline u64 i_osTickToUSec( OSTick tick ) { return OS_TICK_TO_USEC( tick ); } static inline u32 i_osTickToUSec32( OSTick32 tick ) { return OS_TICK_TO_USEC32( tick ); } #ifdef __cplusplus } /* extern "C" */ #endif /* BROM_OS_TICK_H_ */ #endif