summaryrefslogtreecommitdiff
path: root/Kernel/Devices
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-05-15 21:40:41 +0200
committerAndreas Kling <awesomekling@gmail.com>2019-05-15 21:40:41 +0200
commit3cba2a8a7872794516488ac5dfe240e946b1288d (patch)
treeabf359c90dbee15228f34669c7d5613d111e77f0 /Kernel/Devices
parentdcf490ecab4fea2eb2cb80508ae68d77c328739d (diff)
downloadserenity-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.cpp20
-rw-r--r--Kernel/Devices/PCSpeaker.h7
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();
+};