sdk-core v2026.11.05
PS2 SDK - core tier (build-critical EE/IOP modules)
Loading...
Searching...
No Matches
timer.h
Go to the documentation of this file.
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright 2001-2004, ps2dev - http://www.ps2dev.org
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
16
17#ifndef __TIMER_H__
18#define __TIMER_H__
19
20#include <tamtypes.h>
21
22// EE Timers
23#define T0_COUNT ((volatile unsigned int *)0x10000000)
24#define T0_MODE ((volatile unsigned int *)0x10000010)
25#define T0_COMP ((volatile unsigned int *)0x10000020)
26#define T0_HOLD ((volatile unsigned int *)0x10000030)
27
28#define T1_COUNT ((volatile unsigned int *)0x10000800)
29#define T1_MODE ((volatile unsigned int *)0x10000810)
30#define T1_COMP ((volatile unsigned int *)0x10000820)
31#define T1_HOLD ((volatile unsigned int *)0x10000830)
32
33// Note! T2 and T3 don't have a Tn_HOLD register!
34// ----------------------------------------------
35#define T2_COUNT ((volatile unsigned int *)0x10001000)
36#define T2_MODE ((volatile unsigned int *)0x10001010)
37#define T2_COMP ((volatile unsigned int *)0x10001020)
38
39#define T3_COUNT ((volatile unsigned int *)0x10001800)
40#define T3_MODE ((volatile unsigned int *)0x10001810)
41#define T3_COMP ((volatile unsigned int *)0x10001820)
42
43// Pointers to the kernel segment (uncached)
44#define K_T2_COUNT ((volatile unsigned int *)0xB0001000)
45#define K_T2_MODE ((volatile unsigned int *)0xB0001010)
46#define K_T2_COMP ((volatile unsigned int *)0xB0001020)
47
48#define Tn_MODE(CLKS, GATE, GATS, GATM, ZRET, CUE, CMPE, OVFE, EQUF, OVFF) \
49 (u32)((u32)(CLKS) | ((u32)(GATE) << 2) | \
50 ((u32)(GATS) << 3) | ((u32)(GATM) << 4) | \
51 ((u32)(ZRET) << 6) | ((u32)(CUE) << 7) | \
52 ((u32)(CMPE) << 8) | ((u32)(OVFE) << 9) | \
53 ((u32)(EQUF) << 10) | ((u32)(OVFF) << 11))
54
55// Available rates
56#define kBUSCLK (147456000)
57#define kBUSCLKBY16 (kBUSCLK / 16)
58#define kBUSCLKBY256 (kBUSCLK / 256)
59#define kHBLNK_NTSC (15734)
60#define kHBLNK_PAL (15625)
61#define kHBLNK_DTV480p (31469)
62#define kHBLNK_DTV1080i (33750)
63
64typedef u64 (*timer_alarm_handler_t)(s32 id, u64 scheduled_time, u64 actual_time, void *arg, void *pc_value);
65
66#ifdef __cplusplus
67extern "C" {
68#endif
69
70extern void _ps2sdk_init_timer_impl(void);
71extern void _ps2sdk_init_timer(void);
72extern void _ps2sdk_deinit_timer_impl(void);
73extern void _ps2sdk_deinit_timer(void);
74
75extern s32 InitTimer(s32 in_mode);
76extern s32 EndTimer(void);
77extern s32 GetTimerPreScaleFactor(void);
78extern s32 StartTimerSystemTime(void);
79extern s32 StopTimerSystemTime(void);
80extern void SetNextComp(u64 time);
81extern u64 iGetTimerSystemTime(void);
82extern u64 GetTimerSystemTime(void);
83extern s32 iAllocTimerCounter(void);
84extern s32 AllocTimerCounter(void);
85extern s32 iFreeTimerCounter(s32 id);
86extern s32 FreeTimerCounter(s32 id);
87extern s32 iGetTimerUsedUnusedCounters(u32 *used_counters, u32 *unused_counters);
88extern s32 GetTimerUsedUnusedCounters(u32 *used_counters, u32 *unused_counters);
89extern s32 iStartTimerCounter(s32 id);
90extern s32 StartTimerCounter(s32 id);
91extern s32 iStopTimerCounter(s32 id);
92extern s32 StopTimerCounter(s32 id);
93extern u64 SetTimerCount(s32 id, u64 timer_count);
94extern u64 iGetTimerBaseTime(s32 id);
95extern u64 GetTimerBaseTime(s32 id);
96extern u64 iGetTimerCount(s32 id);
97extern u64 GetTimerCount(s32 id);
98extern s32 iSetTimerHandler(s32 id, u64 scheduled_time, timer_alarm_handler_t callback_handler, void *arg);
99extern s32 SetTimerHandler(s32 id, u64 scheduled_time, timer_alarm_handler_t callback_handler, void *arg);
100extern void TimerBusClock2USec(u64 clocks, u32 *seconds_result, u32 *microseconds_result);
101extern u64 TimerUSec2BusClock(u32 seconds, u32 microseconds);
102extern float TimerBusClock2Freq(s64 clocks);
103extern u64 TimerFreq2BusClock(float timer_frequency);
104extern u32 cpu_ticks(void);
105
106// Additional conversion functions, from time to bus cycles
107static inline u64 NSec2TimerBusClock(u64 usec) {
108 // Approximate, avoid 64 bit division
109 return ((((kBUSCLK / 1000) * 65536ULL) / 1000000) * usec) >> 16;
110}
111
112static inline u64 USec2TimerBusClock(u64 usec) {
113 // Approximate, avoid 64 bit division
114 return ((((kBUSCLK / 1000) * 1024) / 1000) * usec) >> 10;
115}
116
117static inline u64 MSec2TimerBusClock(u64 msec) {
118 return (kBUSCLK / 1000) * msec;
119}
120
121static inline u64 Sec2TimerBusClock(u64 sec) {
122 return kBUSCLK * sec;
123}
124
125#ifdef __cplusplus
126}
127#endif
128
129#endif /* __TIMER_H__ */
u64 iGetTimerSystemTime(void)
Definition timer.c:448
u64 GetTimerSystemTime(void)
Definition timer.c:487