libElysianVMU 1.6.0
Full-featured, accurate, cross-platform library emulating the Dreamcast's Visual Memory Unit
Loading...
Searching...
No Matches
evmu_clock.h
Go to the documentation of this file.
1/*! \file
2 * \brief EvmuClock peripheral modeling oscillators and timing
3 * \ingroup peripherals
4 *
5 * \author 2023 Falco Girgis
6 * \copyright MIT License
7 */
8
9#ifndef EVMU_CLOCK_H
10#define EVMU_CLOCK_H
11
12#include "../types/evmu_peripheral.h"
13#include "evmu_wave.h"
14
15/*! \name Type System
16 * \brief Type UUID and cast operators
17 * @{
18 */
19#define EVMU_CLOCK_TYPE (GBL_TYPEID(EvmuClock)) //!< Type UUID for EvmuClock
20#define EVMU_CLOCK(self) (GBL_CAST(EvmuClock, self)) //!< Function-style GblInstance cast to EvmuClock
21#define EVMU_CLOCK_CLASS(klass) (GBL_CLASS_CAST(EvmuClock, klass)) //!< Function-style GblClass cast to EvmuClockClass
22#define EVMU_CLOCK_GET_CLASS(self) (GBL_CLASSOF(EvmuClock, self)) //!< Get an EvmuClockClass from a GblInstance
23//! @}
24
25#define EVMU_CLOCK_NAME "clock"
26
27#define EVMU_CLOCK_OSC_QUARTZ_FREQ 32768 //hz
28#define EVMU_CLOCK_OSC_RC_FREQ 879236 //hz
29#define EVMU_CLOCK_OSC_CF_FREQ 6000000 //hz
30
31#define EVMU_CLOCK_OSC_QUARTZ_TCYC_1_12 366210 //ns per cycle
32#define EVMU_CLOCK_OSC_QUARTZ_TCYC_1_6 183105 //ns per cycle
33
34#define EVMU_CLOCK_OSC_RC_TCYC_1_12 12568 //ns per cycle
35#define EVMU_CLOCK_OSC_RC_TCYC_1_6 6824 //ns per cycle (INVALID, ALWAYS REBOOTS VMU)
36
37#define EVMU_CLOCK_OSC_CF_TCYC_1_12 2000
38#define EVMU_CLOCK_OSC_CF_TCYC_1_6 1000
39
40#define EVMU_CLOCK_OSC_QUARTZ_CURRENT 2600 //uA
41#define EVMU_CLOCK_OSC_RC_CURRENT 610 //uA
42
43#define GBL_SELF_TYPE EvmuClock
44
45GBL_DECLS_BEGIN
46
47GBL_DECLARE_ENUM(EVMU_OSCILLATOR) {
48 EVMU_OSCILLATOR_QUARTZ,
49 EVMU_OSCILLATOR_RC, //REBOOTS VMU WITH 1/6
50 EVMU_OSCILLATOR_CF,
51 EVMU_OSCILLATOR_COUNT
52};
53
54GBL_DECLARE_ENUM(EVMU_CLOCK_SIGNAL) {
55// EVMU_CLOCK_SIGNAL_OSCILLATOR_QUARTZ,
56// EVMU_CLOCK_SIGNAL_OSCILLATOR_RC,
57// EVMU_CLOCK_SIGNAL_OSCILLATOR_CF,
58 EVMU_CLOCK_SIGNAL_CYCLE,
59 EVMU_CLOCK_SIGNAL_SYSTEM_1 = EVMU_CLOCK_SIGNAL_CYCLE,
60 EVMU_CLOCK_SIGNAL_SYSTEM_2,
61 EVMU_CLOCK_SIGNAL_COUNT
62};
63
64GBL_DECLARE_ENUM(EVMU_CLOCK_SYSTEM_STATE) {
65 EVMU_CLOCK_SYSTEM_STATE_UNKNOWN,
66 EVMU_CLOCK_SYSTEM_STATE_RUNNING,
67 EVMU_CLOCK_SYSTEM_STATE_HALT,
68 EVMU_CLOCK_SYSTEM_STATE_HOLD,
69 EVMU_CLOCK_SYSTEM_STATE_COUNT
70};
71
72GBL_DECLARE_ENUM(EVMU_CLOCK_DIVIDER) {
73 EVMU_CLOCK_DIVIDER_1,
74 EVMU_CLOCK_DIVIDER_12,
75 EVMU_CLOCK_DIVIDER_6, //REBOOTS VMU FOR RC CLOCK
76 EVMU_CLOCK_DIVIDER_COUNT
77};
78
79//! Contains technical specifications for a particular oscillator
80typedef struct EvmuOscillatorSpecs {
81 EvmuCycles hzReference;
82 EvmuCycles hzToleranceLow;
83 EvmuCycles hzToleranceHigh;
84 EvmuCycles stabilizationTicks;
85 unsigned currentMicroAmps;
86} EvmuOscillatorSpecs;
87
88//! Contains information on the current satte of a particular clock
89typedef struct EvmuClockStats {
90 GblBool stable;
91 EvmuTicks cycleTime;
92 EvmuTicks cycleFrequency;
93} EvmuClockStats;
94
95/*! \struct EvmuClockClass
96 * \extends EvmuPeripheralClass
97 * \brief GblClass structure for EvmuClock
98 *
99 * No public methods.
100 */
101GBL_CLASS_DERIVE_EMPTY (EvmuClock, EvmuPeripheral)
102
103/*! \struct EvmuClock
104 * \extends EvmuPeripheral
105 * \ingroup peripherals
106 * \brief API for oscillators, clock sources, and timing
107 *
108 * No public members.
109 */
110GBL_INSTANCE_DERIVE_EMPTY(EvmuClock, EvmuPeripheral)
111
112GBL_PROPERTIES(EvmuClock,
113 (quartzState, GBL_GENERIC, (READ), GBL_ENUM_TYPE),
114 (quartzStable, GBL_GENERIC, (READ), GBL_BOOL_TYPE),
115 (rcState, GBL_GENERIC, (READ), GBL_ENUM_TYPE),
116 (rcStable, GBL_GENERIC, (READ), GBL_BOOL_TYPE),
117 (cfState, GBL_GENERIC, (READ), GBL_ENUM_TYPE),
118 (cfStable, GBL_GENERIC, (READ), GBL_BOOL_TYPE),
119 (cycleState, GBL_GENERIC, (READ, WRITE, LOAD, SAVE), GBL_ENUM_TYPE),
120 (cycleOscillator, GBL_GENERIC, (READ, WRITE, LOAD, SAVE), GBL_ENUM_TYPE),
121 (cycleFrequency, GBL_GENERIC, (READ), GBL_UINT32_TYPE),
122 (system2State, GBL_GENERIC, (READ, WRITE, LOAD, SAVE), GBL_ENUM_TYPE),
123 (system2Oscillator, GBL_GENERIC, (READ, WRITE, LOAD, SAVE), GBL_ENUM_TYPE),
124 (system2Frequency, GBL_GENERIC, (READ), GBL_UINT32_TYPE)
125)
126
127EVMU_EXPORT GblType EvmuClock_type (void) GBL_NOEXCEPT;
128
129EVMU_EXPORT EVMU_RESULT EvmuClock_oscillatorSpecs (GBL_CSELF, EVMU_OSCILLATOR oscillator, EvmuOscillatorSpecs* pSpecs) GBL_NOEXCEPT;
130EVMU_EXPORT GblBool EvmuClock_oscillatorActive (GBL_CSELF, EVMU_OSCILLATOR oscillator) GBL_NOEXCEPT;
131EVMU_EXPORT EVMU_RESULT EvmuClock_setOscillatorActive (GBL_CSELF, EVMU_OSCILLATOR oscillator, GblBool active) GBL_NOEXCEPT;
132
133EVMU_EXPORT EVMU_CLOCK_SYSTEM_STATE
134 EvmuClock_systemState (GBL_CSELF) GBL_NOEXCEPT;
135EVMU_EXPORT EVMU_RESULT EvmuClock_setSystemState (GBL_CSELF, EVMU_CLOCK_SYSTEM_STATE state) GBL_NOEXCEPT;
136EVMU_EXPORT EVMU_RESULT EvmuClock_systemConfig (GBL_CSELF, EVMU_OSCILLATOR* pSource, EVMU_CLOCK_DIVIDER* pDivider) GBL_NOEXCEPT;
137EVMU_EXPORT EVMU_RESULT EvmuClock_setSystemConfig (GBL_CSELF, EVMU_OSCILLATOR source, EVMU_CLOCK_DIVIDER divider) GBL_NOEXCEPT;
138
139EVMU_EXPORT EVMU_RESULT EvmuClock_signalStats (GBL_CSELF, EVMU_CLOCK_SIGNAL signal, EvmuClockStats* pStatus) GBL_NOEXCEPT;
140EVMU_EXPORT EvmuWave EvmuClock_signalWave (GBL_CSELF, EVMU_CLOCK_SIGNAL signal) GBL_NOEXCEPT;
141EVMU_EXPORT EvmuCycles EvmuClock_signalTicksToCycles (GBL_CSELF, EVMU_CLOCK_SIGNAL signal, EvmuTicks ticks) GBL_NOEXCEPT;
142EVMU_EXPORT EvmuTicks EvmuClock_signalCyclesToTicks (GBL_CSELF, EVMU_CLOCK_SIGNAL signal, EvmuCycles cycles) GBL_NOEXCEPT;
143
144EVMU_EXPORT uint64_t EvmuClock_systemCyclesPerSec (GBL_CSELF) GBL_NOEXCEPT;
145EVMU_EXPORT double EvmuClock_systemSecsPerCycle (GBL_CSELF) GBL_NOEXCEPT;
146
147EVMU_EXPORT EvmuTicks EvmuClock_systemTicksPerCycle (GBL_CSELF) GBL_NOEXCEPT;
148
149GBL_DECLS_END
150
151#undef GBL_SELF_TYPE
152
153#endif // EVMU_CLOCK_H
#define EVMU_EXPORT
Define used for adding attributes to export public symbols.
Definition evmu_api.h:18
uint64_t EvmuTicks
Represents a delta time in milliseconds.
uint64_t EvmuCycles
Represent a delta time in cycles.
#define GBL_ENUM_TYPE
#define GBL_BOOL_TYPE
#define GBL_UINT32_TYPE
#define GBL_PROPERTIES(object,...)
uint8_t GblBool
uintptr_t GblType
API for oscillators, clock sources, and timing.
Definition evmu_clock.h:110
Contains information on the current satte of a particular clock.
Definition evmu_clock.h:89
Contains technical specifications for a particular oscillator.
Definition evmu_clock.h:80
#define GBL_CLASS_CAST(cType, klass)
#define GBL_CLASSOF(cType, self)
#define GBL_CAST(cType, self)