StuBS
|
Abstraction of the historical Programmable Interval Timer (PIT). More...
Classes | |
struct | Control.__unnamed49__ |
I/O-port bitmap for the NMI Status and Control Register. More... | |
Enumerations | |
enum | AccessMode { LATCH_COUNT_VALUE = 0 , LOW_BYTE_ONLY = 1 , HIGH_BYTE_ONLY = 2 , LOW_AND_HIGH_BYTE = 3 } |
Access mode. More... | |
enum | OperatingMode { INTERRUPT_ON_TERMINAL_COUNT = 0 , PROGRAMMABLE_ONE_SHOT = 1 , RATE_GENERATOR = 2 , SQUARE_WAVE_GENERATOR = 3 , SOFTWARE_TRIGGERED_STROBE = 4 , HARDWARE_TRIGGERED_STROBE = 5 } |
Operating Mode. More... | |
enum | Format { BINARY = 0 , BCD = 1 } |
data format More... | |
Functions | |
static IOPort | data (0x40+CHANNEL) |
bool | set (uint16_t us) |
Start timer. | |
uint16_t | get (void) |
Reads the current timer value. | |
bool | isActive (void) |
Check if the timer is running. | |
bool | waitForTimeout (void) |
(Active) waiting for timeout | |
bool | delay (uint16_t us) |
Set the timer and wait for timeout. | |
void | pcspeaker (uint32_t freq) |
Play a given frequency on the PC speaker. | |
void | disable (void) |
Deactivate the timer. | |
Constants | |
const uint8_t | CHANNEL = 2 |
static IOPort | mode_register (0x43) |
static IOPort | controlRegister (0x61) |
const uint64_t | BASE_FREQUENCY = 1193182ULL |
Abstraction of the historical Programmable Interval Timer (PIT).
Historically, PCs had a Timer component of type 8253 or 8254, modern systems come with a compatible chip. Each of these chips provides three 16-bit wide counters ("channel"), each running at a frequency of 1.19318 MHz. The timer's counting speed is thereby independent from the CPU frequency.
Traditionally, the first counter (channel 0) was used for triggering interrupts, the second one (channel 1) controlled the memory refresh, and the third counter (channel 2) was assigned to the PC speaker.
As the PIT's frequency is fixed to a constant value of 1.19318 MHz, the PIT can be used for calibration. For this purpose, we use channel 2 only.
struct PIT::Control.__unnamed49__ |
I/O-port bitmap for the NMI Status and Control Register.
Class Members | ||
---|---|---|
uint8_t | enable_timer_counter2: 1 | If enabled, the interrupt state will be visible at status_timer_counter2. |
uint8_t | enable_speaker_data: 1 | If set, speaker output is equal to status_timer_counter2. |
uint8_t | enable_pci_serr: 1 | not important, do not modify |
uint8_t | enable_nmi_iochk: 1 | not important, do not modify |
uint8_t | refresh_cycle_toggle: 1 | not important, must be 0 on write |
uint8_t | status_timer_counter2: 1 | will be set on timer expiration; must be 0 on write |
uint8_t | status_iochk_nmi_source: 1 | not important, must be 0 on write |
uint8_t | status_serr_nmi_source: 1 | not important, must be 0 on write |
enum PIT::AccessMode |
enum PIT::OperatingMode |
enum PIT::Format |
|
static |
bool PIT::set | ( | uint16_t | us | ) |
Start timer.
Sets the channel 2 timer to the provided value and starts counting.
us | Waiting time in us |
true
if the counter is running; false
if the waiting time exceeds the limits. uint16_t PIT::get | ( | void | ) |
Reads the current timer value.
bool PIT::isActive | ( | void | ) |
Check if the timer is running.
true
if running, false
otherwise bool PIT::waitForTimeout | ( | void | ) |
(Active) waiting for timeout
true
when timeout was successfully hit, false
if the timer was not active prior to calling. bool PIT::delay | ( | uint16_t | us | ) |
Set the timer and wait for timeout.
us | Waiting time in us |
true
when waiting successfully terminated; false
on error (e.g., waiting time exceeds its limits) void PIT::pcspeaker | ( | uint32_t | freq | ) |
Play a given frequency on the PC speaker.
As the PC speaker is connected to PIT channel 2, the PIT can be used to play an acoustic signal. Playing sounds occupies the PIT, so it cannot be used for other purposes while playback.
-audiodev
If you still cannot hear anything, try to set QEMU_AUDIO_DRV
to alsa
(by launching StuBS with QEMU_AUDIO_DRV=alsa make kvm
) freq | Frequency (in Hz) of the sound to be played, or 0 to deactivate playback. |
void PIT::disable | ( | void | ) |
Deactivate the timer.
const uint8_t PIT::CHANNEL = 2 |
|
static |
|
static |
const uint64_t PIT::BASE_FREQUENCY = 1193182ULL |