|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2017 [email protected]
4: //
5:
6: #pragma once
7:
8: #include "device.h"
9:
10: struct RTC
11: {
12: // 内部カウンタ
13: //
14: // 1/32秒ごとに増加する内部カウンタ。これが 32 になると1秒ということ。
15: // ただしタイマー停止中でも1秒の繰り上がり1回は記憶できるそうなので、
16: // 実際にはこれを 6ビットのカウンタ (63まで) として使用し、
17: // 32 になったら秒繰り上がりではなく、タイマー動作状態で 32 以上だったら
18: // 32 を引いてから秒繰り上がり処理になると思う。
19: uint cnt;
20:
21: int sec; // 秒(0-59)
22: int min; // 分(0-59)
23: int hour; // 時(0-23)
24: int wday; // 曜日(0-6; 0が日曜)
25: int mday; // 日(1-31)
26: int mon; // 月(1-12)
27: int year; // 年(西暦)
28:
29: bool enable_sec; // 秒へのカウントアップを行うなら true
30: };
31:
32: // 汎用のリアルタイムクロック
33: // RP5C15 と MK48T02 の共通部分。
34: // 本来、これは IODevice である必要はないけど、C++ の制約というか多重継承は
35: // あまりやりたくないので、これを IODevice 派生クラスとしておく。
36: class RTCDevice : public IODevice
37: {
38: typedef IODevice inherited;
39:
40: public:
41: RTCDevice();
42: virtual ~RTCDevice();
43:
44: // 初期化
45: // VM の RTC に仮想時刻(の初期値)をセットする。
46: virtual bool InitRTC() = 0;
47:
48: // 32Hz クロック入力。
49: //
50: // 32Hz ごとに呼ばれて、これが RTC の時計を進める処理をするところ。
51: // RTC を実時間に同期して進めるモードなら実時間を計るスケジューラから、
52: // RTC を仮想時間に同期して進めるモードなら VM スケジューラから呼ばれる。
53: // 派生クラス側で用意。
54: virtual void ClockIn() = 0;
55:
56: protected:
57: // ホストの現在時刻を rtc に取得
58: void LoadHostRTC(bool use_localtime);
59:
60: // どの位が更新されたか(繰り上がったか)を示すフラグ。
61: static const uint32 UPDATE_SEC = (1U << 0);
62: static const uint32 UPDATE_MIN = (1U << 1);
63: static const uint32 UPDATE_HOUR = (1U << 2);
64: static const uint32 UPDATE_DAY = (1U << 3);
65: static const uint32 UPDATE_MON = (1U << 4);
66: static const uint32 UPDATE_YEAR = (1U << 5);
67:
68: static const uint32 UPDATE_ALL = 0xffffffffU;
69:
70: uint32 CountUp(); // 1/32 秒カウンタの更新
71: uint32 CarrySec(uint32); // 秒への繰り上がり
72: uint32 CarryMin(uint32); // 分への繰り上がり
73: uint32 CarryHour(uint32); // 時への繰り上がり
74: uint32 CarryDay(uint32); // 日への繰り上がり
75: uint32 CarryMon(uint32); // 月への繰り上がり
76: uint32 CarryYear(uint32); // 年への繰り上がり
77: bool IsLeapMon() const; // 閏月かどうか
78:
79: RTC rtc {}; // 内部状態
80:
81: static const char * const wdays[7]; // 曜日文字列 (0 = "Sun", ...)
82: };
83:
1.1.1.2 ! root 84: extern std::unique_ptr<RTCDevice> gRTC;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.