00001
00002
00003
00004
00005
00006
00007
00008 #ifndef __pc_rtc_h
00009 #define __pc_rtc_h
00010
00011 #include <rtc.h>
00012
00013 __BEGIN_SYS
00014
00015
00016
00017 class PC_RTC: public RTC_Common
00018 {
00019 private:
00020 typedef Traits<PC_RTC> _Traits;
00021
00022
00023
00024 enum {
00025 ADDR = 0x70,
00026 DATA = 0x71
00027 };
00028
00029
00030 enum {
00031 SECONDS = 0x00,
00032 ALARM_S = 0x01,
00033 MINUTES = 0x02,
00034 ALARM_M = 0x03,
00035 HOURS = 0x04,
00036 ALARM_H = 0x05,
00037 WEEKDAY = 0x06,
00038 DAY = 0x07,
00039 MONTH = 0x08,
00040 YEAR = 0x09,
00041 REG_A = 0x0a,
00042 REG_B = 0x0b,
00043 REG_C = 0x0c,
00044 REG_D = 0x0d,
00045 CMOS_DIAGNOSTIC = 0x0e,
00046 CMOS_POWER_DONW = 0x0f,
00047 CMOS_FLOPPY = 0x10,
00048 CMOS_DISK1 = 0x11,
00049 CMOS_DISK2 = 0x12,
00050
00051 CMOS_CONFIG = 0x14,
00052 CMOS_MEM_LSB = 0x15,
00053 CMOS_MEM_MSB = 0x16,
00054 CMOS_EX_MEM_LSB = 0x17,
00055 CMOS_EX_MEM_MSB = 0x18,
00056
00057
00058 CMOS_CHK_LSB = 0x2e,
00059 CMOS_CHK_MSB = 0x2f,
00060 CMOS_OT_MEM_LSB = 0x30,
00061 CMOS_OT_MEM_HSB = 0x31,
00062 CENTURY = 0x32
00063
00064
00065 };
00066
00067
00068 enum {
00069 INT_FREQ_MASK = 0x0f,
00070 TIME_FREQ_MASK = 0x70,
00071 UPDATED = 0x80,
00072 DEF_REG_A = 0x26
00073 };
00074
00075
00076 enum {
00077 DST = 0x01,
00078 HOUR_24 = 0x02,
00079 BINARY = 0x04,
00080 INT_MASK = 0x70,
00081 INT_SECOND = 0x10,
00082 INT_ALARM = 0x20,
00083 INT_FREQ = 0x40,
00084 ENABLE = 0x80,
00085 DEF_REG_B = (ENABLE | BINARY | HOUR_24)
00086 };
00087
00088
00089 enum {
00090 INT_STAT_MASK = 0x70,
00091 INT_STAT_SECOND = 0x10,
00092 INT_STAT_ALARM = 0x20,
00093 INT_STAT_FREQ = 0x40
00094 };
00095
00096
00097 enum {
00098 BATERY = 0x80
00099 };
00100
00101 public:
00102 PC_RTC() {}
00103 ~PC_RTC() {}
00104
00105 Seconds read();
00106 void write(const Seconds & time);
00107
00108 static int init(System_Info *si);
00109
00110 private:
00111 unsigned char reg(unsigned char a) {
00112 IA32::out8(ADDR, a);
00113 return IA32::in8(DATA);
00114 }
00115 void reg(unsigned char a, unsigned char v) {
00116 IA32::out8(ADDR, a);
00117 IA32::out8(DATA, v);
00118 }
00119 };
00120
00121 __END_SYS
00122
00123 #endif