2 * Copyright (c) 2004, 2005
3 * The Regents of The University of Michigan
6 * This code is part of the M5 simulator.
8 * Permission is granted to use, copy, create derivative works and
9 * redistribute this software and such derivative works for any
10 * purpose, so long as the copyright notice above, this grant of
11 * permission, and the disclaimer below appear in all copies made; and
12 * so long as the name of The University of Michigan is not used in
13 * any advertising or publicity pertaining to the use or distribution
14 * of this software without specific, written prior authorization.
16 * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE
17 * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND
18 * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER
19 * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE
22 * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT,
23 * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM
24 * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN
25 * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH
28 * Authors: Ali G. Saidi
33 #ifndef __DEV_8254_HH__
34 #define __DEV_8254_HH__
39 #include "base/bitunion.hh"
40 #include "base/types.hh"
41 #include "base/trace.hh"
42 #include "debug/Intel8254Timer.hh"
43 #include "sim/eventq_impl.hh"
44 #include "sim/serialize.hh"
46 /** Programmable Interval Timer (Intel 8254) */
47 class Intel8254Timer : public EventManager
80 /** Counter element for PIT */
83 /** Event for counter interrupt */
84 class CounterEvent : public Event
87 /** Pointer back to Counter */
92 CounterEvent(Counter*);
97 /** Event description */
98 virtual const char *description() const;
100 friend class Counter;
102 void setTo(int clocks);
109 const std::string &name() const { return _name; }
115 /** Initial count value */
116 uint16_t initial_count;
119 uint16_t latched_count;
121 /** Interrupt period */
124 /** Current mode of operation */
127 /** Output goes high when the counter reaches zero */
130 /** State of the count latch */
133 /** Set of values for read_byte and write_byte */
136 /** Determine which byte of a 16-bit count value to read/write */
137 uint8_t read_byte, write_byte;
139 /** Pointer to container */
140 Intel8254Timer *parent;
143 Counter(Intel8254Timer *p, const std::string &name, unsigned int num);
145 /** Latch the current count (if one is not already latched) */
148 /** Get the current count for this counter */
151 /** Set the read/write mode */
152 void setRW(int rw_val);
154 /** Set operational mode */
155 void setMode(int mode_val);
157 /** Set count encoding */
158 void setBCD(int bcd_val);
160 /** Read a count byte */
163 /** Write a count byte */
164 void write(const uint8_t data);
166 /** Is the output high? */
170 * Serialize this object to the given output stream.
171 * @param base The base name of the counter object.
172 * @param os The stream to serialize to.
174 void serialize(const std::string &base, std::ostream &os);
177 * Reconstruct the state of this object from a checkpoint.
178 * @param base The base name of the counter object.
179 * @param cp The checkpoint use.
180 * @param section The section name of this object
182 void unserialize(const std::string &base, Checkpoint *cp,
183 const std::string §ion);
188 const std::string &name() const { return _name; }
190 /** PIT has three seperate counters */
194 counterInterrupt(unsigned int num)
196 DPRINTF(Intel8254Timer, "Timer interrupt from counter %d.\n", num);
205 Intel8254Timer(EventManager *em, const std::string &name,
206 Counter *counter0, Counter *counter1, Counter *counter2);
208 Intel8254Timer(EventManager *em, const std::string &name);
210 /** Write control word */
211 void writeControl(const CtrlReg data);
214 readCounter(unsigned int num)
217 return counter[num]->read();
221 writeCounter(unsigned int num, const uint8_t data)
224 counter[num]->write(data);
228 outputHigh(unsigned int num)
231 return counter[num]->outputHigh();
235 * Serialize this object to the given output stream.
236 * @param base The base name of the counter object.
237 * @param os The stream to serialize to.
239 void serialize(const std::string &base, std::ostream &os);
242 * Reconstruct the state of this object from a checkpoint.
243 * @param base The base name of the counter object.
244 * @param cp The checkpoint use.
245 * @param section The section name of this object
247 void unserialize(const std::string &base, Checkpoint *cp,
248 const std::string §ion);
251 #endif // __DEV_8254_HH__