|
|
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: struct RP5C15 ! 12: { ! 13: // レジスタ 13, 14, 15 は Bank0/Bank1 どちらも同じものが見える。 ! 14: // これらのレジスタは Bank1 だったら Bank0 を見せる。 ! 15: // ! 16: // RTC の未使用ビットは、RTC への書き込み時に未使用ビットを ! 17: // mask[] で '0' にマスクしてから変数に書き込むこと。 ! 18: union { ! 19: uint8 r[16 + 13]; ! 20: struct { ! 21: uint8 sec1; ! 22: uint8 sec10; ! 23: uint8 min1; ! 24: uint8 min10; ! 25: uint8 hour1; ! 26: uint8 hour10; ! 27: uint8 wday; ! 28: uint8 day1; ! 29: uint8 day10; ! 30: uint8 mon1; ! 31: uint8 mon10; ! 32: uint8 year1; ! 33: uint8 year10; ! 34: uint8 mode; ! 35: uint8 test; ! 36: uint8 reset; ! 37: ! 38: uint8 clksel; ! 39: uint8 adjust; ! 40: uint8 alarm_min1; ! 41: uint8 alarm_min10; ! 42: uint8 alarm_hour1; ! 43: uint8 alarm_hour10; ! 44: uint8 alarm_wday; ! 45: uint8 alarm_day1; ! 46: uint8 alarm_day10; ! 47: uint8 padding1; ! 48: uint8 sel24; ! 49: uint8 leap; ! 50: uint8 padding2; ! 51: } __packed; ! 52: }; ! 53: ! 54: // レジスタマスク (有効ビットを '1' としたもの) ! 55: static const uint8 mask[16 + 13]; ! 56: ! 57: // バンク0 ! 58: static const int SEC1 = 0x00; // $E8A001 ! 59: static const int SEC10 = 0x01; // $E8A003 ! 60: static const int MIN1 = 0x02; // $E8A005 ! 61: static const int MIN10 = 0x03; // $E8A007 ! 62: static const int HOUR1 = 0x04; // $E8A009 ! 63: static const int HOUR10 = 0x05; // $E8A00B ! 64: static const int WDAY = 0x06; // $E8A00D ! 65: static const int DAY1 = 0x07; // $E8A00F ! 66: static const int DAY10 = 0x08; // $E8A011 ! 67: static const int MON1 = 0x09; // $E8A013 ! 68: static const int MON10 = 0x0a; // $E8A015 ! 69: static const int YEAR1 = 0x0b; // $E8A017 ! 70: static const int YEAR10 = 0x0c; // $E8A019 ! 71: static const int MODE = 0x0d; // $E8A01B ! 72: static const int TEST = 0x0e; // $E8A01D ! 73: static const int RESET = 0x0f; // $E8A01F ! 74: // バンク1 ! 75: static const int CLKSEL = 0x10; // $E8A001 ! 76: static const int ADJUST = 0x11; // $E8A003 ! 77: static const int ALARM_MIN1 = 0x12; // $E8A005 ! 78: static const int ALARM_MIN10 = 0x13; // $E8A007 ! 79: static const int ALARM_HOUR1 = 0x14; // $E8A009 ! 80: static const int ALARM_HOUR10 = 0x15; // $E8A00B ! 81: static const int ALARM_WDAY = 0x16; // $E8A00D ! 82: static const int ALARM_DAY1 = 0x17; // $E8A00F ! 83: static const int ALARM_DAY10 = 0x18; // $E8A011 ! 84: static const int notused1 = 0x19; // $E8A013 ! 85: static const int SEL24 = 0x1a; // $E8A015 ! 86: static const int LEAP = 0x1b; // $E8A017 ! 87: static const int notused2 = 0x1c; // $E8A019 ! 88: // バンク1 の 13, 14, 15 はバンク0 と共通 ! 89: static const int MODE_BANK1 = 0x1d; // $E8A01B ! 90: static const int TEST_BANK1 = 0x1e; // $E8A01D ! 91: static const int RESET_BANK1 = 0x1f; // $E8A01F ! 92: ! 93: static const int MODE_TIMER_EN = 0x08; ! 94: static const int MODE_ALARM_EN = 0x04; ! 95: static const int MODE_BANK = 0x01; ! 96: ! 97: static const int RESET_1Hz = 0x08; ! 98: static const int RESET_16Hz = 0x04; ! 99: static const int RESET_TIMER = 0x02; ! 100: static const int RESET_ALARM = 0x01; ! 101: }; ! 102: ! 103: class RP5C15Device : public RTCDevice ! 104: { ! 105: typedef RTCDevice inherited; ! 106: public: ! 107: RP5C15Device(); ! 108: virtual ~RP5C15Device(); ! 109: ! 110: virtual bool InitRTC(); ! 111: ! 112: virtual uint64 Read8(uint32 addr); ! 113: virtual uint64 Read16(uint32 addr); ! 114: virtual uint64 Write8(uint32 addr, uint32 data); ! 115: virtual uint64 Write16(uint32 addr, uint32 data); ! 116: virtual uint64 Peek8(uint32 addr); ! 117: virtual bool MonitorUpdate(); ! 118: ! 119: // 32Hz クロック入力 ! 120: virtual void ClockIn(); ! 121: ! 122: private: ! 123: // レジスタを更新 ! 124: void UpdateReg(uint32); ! 125: ! 126: // レジスタ ! 127: RP5C15 reg {}; ! 128: ! 129: // 現在のバンク ! 130: // MODE レジスタの BANK ビットが変更された時にこの値も更新すること。 ! 131: int bank = 0; ! 132: ! 133: // CLKOUT 端子の状態 (true なら 'H') ! 134: bool clkout = false; ! 135: // ALARM 端子の状態 (true なら 'H') ! 136: bool alarmout = false; ! 137: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.