diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-04-02 15:55:47 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-04-02 15:55:47 +0200 |
| commit | c5afb5c1ce1c084c840dbb58d73af6fe2b235ec7 (patch) | |
| tree | b9f097cbcf14e264a6818103a73c48a31830ffe4 /arch | |
| parent | 21489576381d827871e7cdf060929c5d7f3d4e9f (diff) | |
| download | teachos-c5afb5c1ce1c084c840dbb58d73af6fe2b235ec7.tar.xz teachos-c5afb5c1ce1c084c840dbb58d73af6fe2b235ec7.zip | |
x86_64: ensure PIT is not overwhelmed on config
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/x86_64/include/arch/device_io/port_io.hpp | 5 | ||||
| -rw-r--r-- | arch/x86_64/src/devices/legacy_pit.cpp | 13 |
2 files changed, 14 insertions, 4 deletions
diff --git a/arch/x86_64/include/arch/device_io/port_io.hpp b/arch/x86_64/include/arch/device_io/port_io.hpp index 70773dd..4c8d66a 100644 --- a/arch/x86_64/include/arch/device_io/port_io.hpp +++ b/arch/x86_64/include/arch/device_io/port_io.hpp @@ -102,6 +102,11 @@ namespace arch::io : std::string_view{"eax"}; }; + auto inline wait() -> void + { + port<0x80, std::uint8_t, port_write>::write<std::uint8_t>(0); + } + } // namespace arch::io #endif
\ No newline at end of file diff --git a/arch/x86_64/src/devices/legacy_pit.cpp b/arch/x86_64/src/devices/legacy_pit.cpp index 970f538..a8df3c3 100644 --- a/arch/x86_64/src/devices/legacy_pit.cpp +++ b/arch/x86_64/src/devices/legacy_pit.cpp @@ -18,6 +18,9 @@ namespace arch::devices using channel_0_port = io::port<0x40, std::uint8_t, io::port_write>; using channel_1_port = io::port<0x41, std::uint8_t, io::port_write>; using channel_2_port = io::port<0x42, std::uint8_t, io::port_write>; + + constexpr auto base_frequency = 1'193'182u; + constexpr auto square_wave_mode = 0x36; } // namespace legacy_pit::legacy_pit(std::size_t major, std::uint32_t frequency_in_hz) @@ -28,14 +31,16 @@ namespace arch::devices auto legacy_pit::init() -> bool { - constexpr auto base_frequency = 1'193'182u; auto divisor = static_cast<std::uint16_t>(base_frequency / m_frequency_in_hz); kapi::interrupts::register_handler(m_irq_number, *this); - command_port::write<std::uint8_t>(0x36); // NOLINT - channel_0_port::write<std::uint8_t>(divisor & 0xff); // NOLINT - channel_0_port::write<std::uint8_t>(divisor >> 8 & 0xff); // NOLINT + command_port::write<std::uint8_t>(square_wave_mode); + io::wait(); + channel_0_port::write<std::uint8_t>(divisor & 0xff); + io::wait(); + channel_0_port::write<std::uint8_t>(divisor >> 8 & 0xff); + io::wait(); return true; } |
