|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2018 [email protected] ! 4: // ! 5: ! 6: #pragma once ! 7: ! 8: #include "device.h" ! 9: #include "rtc.h" ! 10: ! 11: // MK48T02 の時計部分のレジスタと内部状態 ! 12: struct MK48T02Clock ! 13: { ! 14: // コントロールレジスタは以下の3つを保持。 ! 15: uint8 ctrl; ! 16: static const uint8 WRITE = 0x80; // WRITE BIT ! 17: static const uint8 READ = 0x40; // READ BIT ! 18: static const uint8 SIGN = 0x20; // SIGN BIT (?) ! 19: ! 20: // 秒カウンタ(BCD) ! 21: uint8 sec; ! 22: // 秒カウンタの bit7 が STOP ビット ! 23: static const uint8 STOP = 0x80; ! 24: // STOP 状態を保持 ! 25: bool stop; ! 26: ! 27: // 分カウンタ(BCD) ! 28: uint8 min; ! 29: ! 30: // 時カウンタ(BCD) ! 31: uint8 hour; ! 32: // 時カウンタの bit7 が KICKSTART ビット ! 33: static const uint8 KICKSTART = 0x80; ! 34: // KICKSTART 状態を保持 ! 35: bool kickstart; ! 36: ! 37: // 曜日カウンタ ! 38: uint8 wday; ! 39: static const uint8 FREQTEST = 0x40; // Frequency Test (未実装) ! 40: ! 41: // 日カウンタ ! 42: uint8 mday; ! 43: // 月カウンタ ! 44: uint8 mon; ! 45: // 年カウンタ (0 が 1970年) ! 46: uint8 year; ! 47: static const int YEAR_EPOCH = 1970; ! 48: }; ! 49: ! 50: class MK48T02Device : public RTCDevice ! 51: { ! 52: typedef RTCDevice inherited; ! 53: public: ! 54: MK48T02Device(); ! 55: virtual ~MK48T02Device(); ! 56: ! 57: virtual bool Init(); ! 58: virtual bool InitRTC(); ! 59: ! 60: virtual uint64 Read8(uint32 addr); ! 61: virtual uint64 Read16(uint32 addr); ! 62: virtual uint64 Read32(uint32 addr); ! 63: virtual uint64 Write8(uint32 addr, uint32 data); ! 64: virtual uint64 Write16(uint32 addr, uint32 data); ! 65: virtual uint64 Write32(uint32 addr, uint32 data); ! 66: virtual uint64 Peek8(uint32 addr); ! 67: ! 68: virtual bool MonitorUpdate(); ! 69: ! 70: virtual void ClockIn(); ! 71: ! 72: private: ! 73: // バイナリ <-> BCD 変換 ! 74: static inline uint8 num2BCD(uint8); ! 75: static inline uint8 BCD2num(uint8); ! 76: ! 77: // コントロールレジスタへの書き込み ! 78: void WriteCtrl(uint32 data); ! 79: ! 80: std::string filename {}; ! 81: int fd = 0; ! 82: ! 83: // バイト順はファイルイメージそのままで、2040バイト。 ! 84: uint8 *mem = NULL; ! 85: ! 86: // mmap する長さ ! 87: int memlen = 0; ! 88: ! 89: // 時計 ! 90: MK48T02Clock reg {}; ! 91: ! 92: // レジスタとして読める値を定数にすることで、仮想マシン状態を ! 93: // 常に同じ状態にするためのパフォーマンス測定用フラグ。 ! 94: // なお NVRAM 部分は影響されない。 ! 95: bool force_fixed = false; ! 96: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.