diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-05-15 21:40:41 +0200 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-05-15 21:40:41 +0200 |
commit | 3cba2a8a7872794516488ac5dfe240e946b1288d (patch) | |
tree | abf359c90dbee15228f34669c7d5613d111e77f0 /Kernel/Devices | |
parent | dcf490ecab4fea2eb2cb80508ae68d77c328739d (diff) | |
download | serenity-3cba2a8a7872794516488ac5dfe240e946b1288d.zip |
Kernel: Add a beep() syscall that beeps the PC speaker.
Hook this up in Terminal so that the '\a' character generates a beep.
Finally emit an '\a' character in the shell line editing code when
backspacing at the start of the line.
Diffstat (limited to 'Kernel/Devices')
-rw-r--r-- | Kernel/Devices/PCSpeaker.cpp | 20 | ||||
-rw-r--r-- | Kernel/Devices/PCSpeaker.h | 7 |
2 files changed, 27 insertions, 0 deletions
diff --git a/Kernel/Devices/PCSpeaker.cpp b/Kernel/Devices/PCSpeaker.cpp new file mode 100644 index 0000000000..347dd33b62 --- /dev/null +++ b/Kernel/Devices/PCSpeaker.cpp @@ -0,0 +1,20 @@ +#include <Kernel/Devices/PCSpeaker.h> +#include <Kernel/i8253.h> +#include <Kernel/IO.h> +#include <Kernel/i386.h> + +void PCSpeaker::tone_on(int frequency) +{ + IO::out8(PIT_CTL, TIMER2_SELECT | WRITE_WORD | MODE_SQUARE_WAVE); + word timer_reload = BASE_FREQUENCY / frequency; + + IO::out8(TIMER2_CTL, LSB(timer_reload)); + IO::out8(TIMER2_CTL, MSB(timer_reload)); + + IO::out8(0x61, IO::in8(0x61) | 3); +} + +void PCSpeaker::tone_off() +{ + IO::out8(0x61, IO::in8(0x61) & ~3); +} diff --git a/Kernel/Devices/PCSpeaker.h b/Kernel/Devices/PCSpeaker.h new file mode 100644 index 0000000000..9791feb94e --- /dev/null +++ b/Kernel/Devices/PCSpeaker.h @@ -0,0 +1,7 @@ +#pragma once + +class PCSpeaker { +public: + static void tone_on(int frequency); + static void tone_off(); +}; |