C++ Crashkurs
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. | |
| 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 | |
| bool | set (uint16_t us) |
| Start timer. More... | |
| uint16_t | get (void) |
| Reads the current timer value. More... | |
| bool | isActive (void) |
| Check if the timer is running. More... | |
| bool | waitForTimeout (void) |
| (Active) waiting for timeout More... | |
| bool | delay (uint16_t us) |
| Set the timer and wait for timeout. More... | |
| void | pcspeaker (uint32_t freq) |
| Play a given frequency on the PC speaker. More... | |
| void | disable (void) |
| Deactivate the timer. | |
Constants | |
| const uint8_t | CHANNEL = 2 |
| const uint64_t | BASE_FREQUENCY = 1193182ULL |
Detailed Description
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.
- Note
- Interrupts should be disabled while configuring the timer.
Class Documentation
| struct PIT::Control.__unnamed49__ |
I/O-port bitmap for the NMI Status and Control Register.
- Note
- Over time, the meaning of the bits stored at I/O port 0x61 changed; don't get the structure confused with old documentation on the IBM PC XT platform.
- See also
- Intel® I/O Controller Hub 7 (ICH7) Family, page 415
Enumeration Type Documentation
| enum PIT::OperatingMode |
| enum PIT::Format |
Function Documentation
| bool PIT::set | ( | uint16_t | us | ) |
Start timer.
Sets the channel 2 timer to the provided value and starts counting.
- Note
- The maximum waiting time is approx. 55 000 us due to the timers being limited to 16 bit.
- Parameters
-
us Waiting time in us
- Returns
trueif the counter is running;falseif the waiting time exceeds the limits.
| uint16_t PIT::get | ( | void | ) |
Reads the current timer value.
- Returns
- Current timer value
| bool PIT::isActive | ( | void | ) |
Check if the timer is running.
- Returns
trueif running,falseotherwise
| bool PIT::waitForTimeout | ( | void | ) |
(Active) waiting for timeout
- Returns
truewhen timeout was successfully hit,falseif the timer was not active prior to calling.
| bool PIT::delay | ( | uint16_t | us | ) |
Set the timer and wait for timeout.
- Note
- The maximum waiting time is approx. 55 000 us due to the timers being limited to 16 bit.
- Parameters
-
us Waiting time in us
- Returns
truewhen waiting successfully terminated;falseon 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.
- Note
- Not every PC has an activated PC speaker
-
Qemu & KVM have to be launched with
-audiodevIf you still cannot hear anything, try to setQEMU_AUDIO_DRVtoalsa(by launching StuBS withQEMU_AUDIO_DRV=alsa make kvm)
- Parameters
-
freq Frequency (in Hz) of the sound to be played, or 0 to deactivate playback.