Enable the PIC and add a timer.
This causes a GP fault after the timer runs for some time.
This commit is contained in:
parent
80d2bf1aaa
commit
629dca278b
6 changed files with 76 additions and 0 deletions
41
zion/interrupt/timer.cpp
Normal file
41
zion/interrupt/timer.cpp
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
#include "interrupt/timer.h"
|
||||
|
||||
#include "common/port.h"
|
||||
|
||||
namespace {
|
||||
|
||||
// IO Ports
|
||||
constexpr uint8_t kPit0Ctl = 0x40;
|
||||
constexpr uint8_t kPit1Ctl = 0x41;
|
||||
constexpr uint8_t kPit2Ctl = 0x42;
|
||||
constexpr uint8_t kPitCmd = 0x43;
|
||||
|
||||
// Command Register
|
||||
// Mode
|
||||
constexpr uint8_t kPitMode0 = 0x00;
|
||||
constexpr uint8_t kPitMode1 = 0x02;
|
||||
constexpr uint8_t kPitMode2 = 0x04;
|
||||
constexpr uint8_t kPitMode3 = 0x06;
|
||||
constexpr uint8_t kPitMode4 = 0x08;
|
||||
constexpr uint8_t kPitMode5 = 0x0A;
|
||||
// R/W
|
||||
constexpr uint8_t kCmdLatch = 0x00;
|
||||
constexpr uint8_t kCmdRwLow = 0x10;
|
||||
constexpr uint8_t kCmdRwHi = 0x20;
|
||||
constexpr uint8_t kCmdRwBoth = 0x30;
|
||||
// PIT Select
|
||||
constexpr uint8_t kSelect0 = 0x00;
|
||||
constexpr uint8_t kSelect1 = 0x40;
|
||||
constexpr uint8_t kSelect2 = 0x80;
|
||||
constexpr uint8_t kReadback = 0xC0;
|
||||
|
||||
constexpr uint32_t kPitFrequency = 1193182;
|
||||
|
||||
} // namespace
|
||||
|
||||
void SetFrequency(uint64_t hertz) {
|
||||
uint16_t reload = kPitFrequency / hertz;
|
||||
outb(kPitCmd, kPitMode3 | kCmdRwBoth | kSelect0);
|
||||
outb(kPit0Ctl, reload & 0xFF);
|
||||
outb(kPit0Ctl, reload >> 8);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue