tsunami_io.cc (3943:68e673d2db04) tsunami_io.cc (4762:c94e103c83ad)
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;

--- 26 unchanged lines hidden (view full) ---

35 */
36
37#include <sys/time.h>
38
39#include <deque>
40#include <string>
41#include <vector>
42
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;

--- 26 unchanged lines hidden (view full) ---

35 */
36
37#include <sys/time.h>
38
39#include <deque>
40#include <string>
41#include <vector>
42
43#include "base/time.hh"
43#include "base/trace.hh"
44#include "dev/pitreg.h"
45#include "dev/rtcreg.h"
46#include "dev/alpha/tsunami_cchip.hh"
47#include "dev/alpha/tsunami.hh"
48#include "dev/alpha/tsunami_io.hh"
49#include "dev/alpha/tsunamireg.h"
50#include "mem/packet.hh"
51#include "mem/packet_access.hh"
52#include "mem/port.hh"
44#include "base/trace.hh"
45#include "dev/pitreg.h"
46#include "dev/rtcreg.h"
47#include "dev/alpha/tsunami_cchip.hh"
48#include "dev/alpha/tsunami.hh"
49#include "dev/alpha/tsunami_io.hh"
50#include "dev/alpha/tsunamireg.h"
51#include "mem/packet.hh"
52#include "mem/packet_access.hh"
53#include "mem/port.hh"
53#include "sim/builder.hh"
54#include "sim/system.hh"
55
56using namespace std;
57//Should this be AlphaISA?
58using namespace TheISA;
59
54#include "sim/system.hh"
55
56using namespace std;
57//Should this be AlphaISA?
58using namespace TheISA;
59
60TsunamiIO::RTC::RTC(const string &n, Tsunami* tsunami, const vector<int> &t,
61 bool bcd, Tick i)
62 : _name(n), event(tsunami, i), addr(0), year_is_bcd(bcd)
60TsunamiIO::RTC::RTC(const string &n, Tsunami* tsunami,
61 const TsunamiIO::Params *p)
62 : _name(n), event(tsunami, p->frequency), addr(0)
63{
64 memset(clock_data, 0, sizeof(clock_data));
65 stat_regA = RTCA_32768HZ | RTCA_1024HZ;
66 stat_regB = RTCB_PRDC_IE |RTCB_BIN | RTCB_24HR;
67
63{
64 memset(clock_data, 0, sizeof(clock_data));
65 stat_regA = RTCA_32768HZ | RTCA_1024HZ;
66 stat_regB = RTCB_PRDC_IE |RTCB_BIN | RTCB_24HR;
67
68 struct tm tm;
69 parseTime(t, &tm);
68 year = p->time.tm_year;
70
69
71 year = tm.tm_year;
72
73 if (year_is_bcd) {
70 if (p->year_is_bcd) {
74 // The datasheet says that the year field can be either BCD or
75 // years since 1900. Linux seems to be happy with years since
76 // 1900.
77 year = year % 100;
78 int tens = year / 10;
79 int ones = year % 10;
80 year = (tens << 4) + ones;
81 }
82
83 // Unix is 0-11 for month, data seet says start at 1
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 = year % 100;
75 int tens = year / 10;
76 int ones = year % 10;
77 year = (tens << 4) + ones;
78 }
79
80 // Unix is 0-11 for month, data seet says start at 1
84 mon = tm.tm_mon + 1;
85 mday = tm.tm_mday;
86 hour = tm.tm_hour;
87 min = tm.tm_min;
88 sec = tm.tm_sec;
81 mon = p->time.tm_mon + 1;
82 mday = p->time.tm_mday;
83 hour = p->time.tm_hour;
84 min = p->time.tm_min;
85 sec = p->time.tm_sec;
89
90 // Datasheet says 1 is sunday
86
87 // Datasheet says 1 is sunday
91 wday = tm.tm_wday + 1;
88 wday = p->time.tm_wday + 1;
92
89
93 DPRINTFN("Real-time clock set to %s", asctime(&tm));
90 DPRINTFN("Real-time clock set to %s", asctime(&p->time));
94}
95
96void
97TsunamiIO::RTC::writeAddr(const uint8_t data)
98{
99 if (data <= RTC_STAT_REGD)
100 addr = data;
101 else

--- 330 unchanged lines hidden (view full) ---

432}
433
434const char *
435TsunamiIO::PITimer::Counter::CounterEvent::description()
436{
437 return "tsunami 8254 Interval timer";
438}
439
91}
92
93void
94TsunamiIO::RTC::writeAddr(const uint8_t data)
95{
96 if (data <= RTC_STAT_REGD)
97 addr = data;
98 else

--- 330 unchanged lines hidden (view full) ---

429}
430
431const char *
432TsunamiIO::PITimer::Counter::CounterEvent::description()
433{
434 return "tsunami 8254 Interval timer";
435}
436
440TsunamiIO::TsunamiIO(Params *p)
437TsunamiIO::TsunamiIO(const Params *p)
441 : BasicPioDevice(p), tsunami(p->tsunami), pitimer(p->name + "pitimer"),
438 : BasicPioDevice(p), tsunami(p->tsunami), pitimer(p->name + "pitimer"),
442 rtc(p->name + ".rtc", p->tsunami, p->init_time, p->year_is_bcd,
443 p->frequency)
439 rtc(p->name + ".rtc", p->tsunami, p)
444{
445 pioSize = 0x100;
446
447 // set the back pointer from tsunami to myself
448 tsunami->io = this;
449
450 timerData = 0;
451 picr = 0;

--- 201 unchanged lines hidden (view full) ---

653 UNSERIALIZE_SCALAR(picr);
654 UNSERIALIZE_SCALAR(picInterrupting);
655
656 // Unserialize the timers
657 pitimer.unserialize("pitimer", cp, section);
658 rtc.unserialize("rtc", cp, section);
659}
660
440{
441 pioSize = 0x100;
442
443 // set the back pointer from tsunami to myself
444 tsunami->io = this;
445
446 timerData = 0;
447 picr = 0;

--- 201 unchanged lines hidden (view full) ---

649 UNSERIALIZE_SCALAR(picr);
650 UNSERIALIZE_SCALAR(picInterrupting);
651
652 // Unserialize the timers
653 pitimer.unserialize("pitimer", cp, section);
654 rtc.unserialize("rtc", cp, section);
655}
656
661BEGIN_DECLARE_SIM_OBJECT_PARAMS(TsunamiIO)
662
663 Param<Addr> pio_addr;
664 Param<Tick> pio_latency;
665 Param<Tick> frequency;
666 SimObjectParam<Platform *> platform;
667 SimObjectParam<System *> system;
668 VectorParam<int> time;
669 Param<bool> year_is_bcd;
670 SimObjectParam<Tsunami *> tsunami;
671
672END_DECLARE_SIM_OBJECT_PARAMS(TsunamiIO)
673
674BEGIN_INIT_SIM_OBJECT_PARAMS(TsunamiIO)
675
676 INIT_PARAM(pio_addr, "Device Address"),
677 INIT_PARAM(pio_latency, "Programmed IO latency"),
678 INIT_PARAM(frequency, "clock interrupt frequency"),
679 INIT_PARAM(platform, "platform"),
680 INIT_PARAM(system, "system object"),
681 INIT_PARAM(time, "System time to use (0 for actual time"),
682 INIT_PARAM(year_is_bcd, ""),
683 INIT_PARAM(tsunami, "Tsunami")
684
685END_INIT_SIM_OBJECT_PARAMS(TsunamiIO)
686
687CREATE_SIM_OBJECT(TsunamiIO)
657TsunamiIO *
658TsunamiIOParams::create()
688{
659{
689 TsunamiIO::Params *p = new TsunamiIO::Params;
690 p->frequency = frequency;
691 p->name = getInstanceName();
692 p->pio_addr = pio_addr;
693 p->pio_delay = pio_latency;
694 p->platform = platform;
695 p->system = system;
696 p->init_time = time;
697 p->year_is_bcd = year_is_bcd;
698 p->tsunami = tsunami;
699 return new TsunamiIO(p);
660 return new TsunamiIO(this);
700}
661}
701
702REGISTER_SIM_OBJECT("TsunamiIO", TsunamiIO)