1/* 2 * Copyright (c) 2004-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 29 unchanged lines hidden (view full) --- 38#include "base/bitfield.hh" 39#include "base/time.hh" 40#include "base/trace.hh" 41#include "dev/mc146818.hh" 42#include "dev/rtcreg.h" 43 44using namespace std; 45 |
46static uint8_t 47bcdize(uint8_t val) |
48{ |
49 uint8_t result; 50 result = val % 10; 51 result += (val / 10) << 4; 52 return result; 53} |
54 |
55void 56MC146818::setTime(const struct tm time) 57{ 58 curTime = time; |
59 year = time.tm_year; |
60 // Unix is 0-11 for month, data seet says start at 1 61 mon = time.tm_mon + 1; 62 mday = time.tm_mday; 63 hour = time.tm_hour; 64 min = time.tm_min; 65 sec = time.tm_sec; 66 67 // Datasheet says 1 is sunday 68 wday = time.tm_wday + 1; 69 |
70 if (!(stat_regB & RTCB_BIN)) { 71 // The datasheet says that the year field can be either BCD or 72 // years since 1900. Linux seems to be happy with years since 73 // 1900. 74 year = bcdize(year % 100); 75 mon = bcdize(mon); 76 mday = bcdize(mday); 77 hour = bcdize(hour); 78 min = bcdize(min); 79 sec = bcdize(sec); 80 } 81} 82 83MC146818::MC146818(EventManager *em, const string &n, const struct tm time, 84 bool bcd, Tick frequency) 85 : EventManager(em), _name(n), event(this, frequency), tickEvent(this) 86{ 87 memset(clock_data, 0, sizeof(clock_data)); 88 stat_regA = RTCA_32768HZ | RTCA_1024HZ; 89 stat_regB = RTCB_PRDC_IE | RTCB_24HR; 90 if (!bcd) 91 stat_regB |= RTCB_BIN; 92 93 setTime(time); |
94 DPRINTFN("Real-time clock set to %s", asctime(&time)); 95} 96 97MC146818::~MC146818() 98{ 99} 100 101void --- 50 unchanged lines hidden (view full) --- 152 return 0x00; 153 break; 154 default: 155 panic("Shouldn't be here"); 156 } 157 } 158} 159 |
160static time_t 161mkutctime(struct tm *time) 162{ 163 time_t ret; 164 char *tz; 165 166 tz = getenv("TZ"); 167 setenv("TZ", "", 1); 168 tzset(); 169 ret = mktime(time); 170 if (tz) 171 setenv("TZ", tz, 1); 172 else 173 unsetenv("TZ"); 174 tzset(); 175 return ret; 176} 177 |
178void |
179MC146818::tickClock() 180{ 181 if (stat_regB & RTCB_NO_UPDT) 182 return; 183 time_t calTime = mkutctime(&curTime); 184 calTime++; 185 setTime(*gmtime(&calTime)); 186} 187 188void |
189MC146818::serialize(const string &base, ostream &os) 190{ 191 arrayParamOut(os, base + ".clock_data", clock_data, sizeof(clock_data)); 192 paramOut(os, base + ".stat_regA", stat_regA); 193 paramOut(os, base + ".stat_regB", stat_regB); 194} 195 196void --- 32 unchanged lines hidden (view full) --- 229 parent->handleEvent(); 230} 231 232const char * 233MC146818::RTCEvent::description() const 234{ 235 return "RTC interrupt"; 236} |
237 238void 239MC146818::RTCTickEvent::process() 240{ 241 DPRINTF(MC146818, "RTC clock tick\n"); 242 parent->schedule(this, curTick + Clock::Int::s); 243 parent->tickClock(); 244} 245 246const char * 247MC146818::RTCTickEvent::description() const 248{ 249 return "RTC clock tick"; 250} |