|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2024 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: //
8: // Goldfish (Qemu) RTC+Timer (の Timer のほう)
9: //
10:
11: #include "device.h"
12: #include "event.h"
13: #include "monitor.h"
14:
15: class GFRTCDevice;
16: class InterruptDevice;
17: class Syncer;
18:
19: class GFTimerDevice : public IODevice
20: {
21: using inherited = IODevice;
22:
23: public:
24: GFTimerDevice();
25: ~GFTimerDevice() override;
26:
27: bool Init() override;
28: void ResetHard(bool poweron) override;
29:
30: busdata Read32(uint32 addr) override;
31: busdata Write32(uint32 addr, uint32 data) override;
32: busdata Peek8(uint32 addr) override;
33:
34: private:
35: DECLARE_MONITOR_CALLBACK(MonitorUpdate);
36:
37: void CallbackVT(Event& ev);
38: void CallbackRT(Event& ev);
39: void ChangeInterrupt();
40:
41: // アラーム開始。
42: void StartAlarm();
43:
44: // 現在時刻取得
45: uint64 Now() const;
46:
47: // TIMER レジスタ読み出し値。(アラームの基準点としても使う)
48: uint64 elapsed {};
49:
50: // アラーム予定時刻 (0 ならアラームなし)
51: uint64 alarm {};
52:
53: // 先に書き込まれた上位側を一旦保持しておくところ。
54: uint64 alarm_high {};
55:
56: bool sync_rt {};
57:
58: // 実時間同期用
59: uint64 mtime_epoch {}; // 調整実時間軸の起点(仮想時刻)
60: uint64 mtime {}; // 自身の調整実時間
61:
62: bool intr_enable {}; // 割り込み許可
63: bool intr_assert {}; // 割り込み発生
64:
65: Event event { this };
66:
67: Monitor monitor { this };
68:
69: GFRTCDevice *gfrtc {};
70: InterruptDevice *interrupt {};
71: Syncer *syncer {};
72: };
73:
74: static inline GFTimerDevice *GetGFTimerDevice() {
75: return Object::GetObject<GFTimerDevice>(OBJ_GFTIMER);
76: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.