Timer: Fill out the periodic modes a little.
This commit is contained in:
parent
4f9a0402f6
commit
da7f512067
2 changed files with 23 additions and 6 deletions
|
@ -147,13 +147,16 @@ Intel8254Timer::Counter::write(const uint8_t data)
|
|||
|
||||
case MSB:
|
||||
count = (count & 0x00FF) | (data << 8);
|
||||
// In the RateGen or SquareWave modes, the timer wraps around and
|
||||
// triggers on a value of 1, not 0.
|
||||
if (mode == RateGen || mode == SquareWave)
|
||||
period = count - 1;
|
||||
else
|
||||
period = count;
|
||||
|
||||
if (period > 0) {
|
||||
DPRINTF(Intel8254Timer, "Timer set to curTick + %d\n",
|
||||
count * event.interval);
|
||||
event.schedule(curTick + count * event.interval);
|
||||
}
|
||||
if (period > 0)
|
||||
event.setTo(period);
|
||||
|
||||
write_byte = LSB;
|
||||
break;
|
||||
}
|
||||
|
@ -240,14 +243,26 @@ Intel8254Timer::Counter::CounterEvent::process()
|
|||
switch (counter->mode) {
|
||||
case InitTc:
|
||||
counter->output_high = true;
|
||||
break;
|
||||
case RateGen:
|
||||
case SquareWave:
|
||||
setTo(counter->period);
|
||||
break;
|
||||
default:
|
||||
panic("Unimplemented PITimer mode.\n");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Intel8254Timer::Counter::CounterEvent::setTo(int clocks)
|
||||
{
|
||||
if (clocks == 0)
|
||||
panic("Timer can't be set to go off instantly.\n");
|
||||
DPRINTF(Intel8254Timer, "Timer set to curTick + %d\n",
|
||||
clocks * interval);
|
||||
schedule(curTick + clocks * interval);
|
||||
}
|
||||
|
||||
const char *
|
||||
Intel8254Timer::Counter::CounterEvent::description() const
|
||||
{
|
||||
|
|
|
@ -95,6 +95,8 @@ class Intel8254Timer
|
|||
virtual const char *description() const;
|
||||
|
||||
friend class Counter;
|
||||
|
||||
void setTo(int clocks);
|
||||
};
|
||||
|
||||
private:
|
||||
|
|
Loading…
Reference in a new issue