[U-Boot] [PATCH 24/33] sound: x86: Add beeping support in i8254
Simon Glass
sjg at chromium.org
Tue Jan 22 01:13:01 UTC 2019
Adjust the code to allow beeping at different frequencies, using a
calculated value for timer 2.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
arch/x86/include/asm/i8254.h | 18 ++++++++++++++++++
arch/x86/lib/i8254.c | 36 ++++++++++++++++++++++++++++++++----
2 files changed, 50 insertions(+), 4 deletions(-)
diff --git a/arch/x86/include/asm/i8254.h b/arch/x86/include/asm/i8254.h
index 65c97614d3..d769daf85d 100644
--- a/arch/x86/include/asm/i8254.h
+++ b/arch/x86/include/asm/i8254.h
@@ -35,4 +35,22 @@
/* The clock frequency of the i8253/i8254 PIT */
#define PIT_TICK_RATE 1193182
+/**
+ * i8254_enable_beep() - Start a beep using the PCAT timer
+ *
+ * This starts beeping using the legacy i8254 timer. The beep may be silenced
+ * after a delay with i8254_disable_beep().
+ *
+ * @frequency_hz: Frequency of beep in Hz
+ * @return 0 if OK, -EINVAL if frequency_hz is 0
+ */
+int i8254_enable_beep(uint frequency_hz);
+
+/**
+ * i8254_disable_beep() - Disable the bepper
+ *
+ * This stops any existing beep
+ */
+void i8254_disable_beep(void);
+
#endif /* _ASMI386_I8954_H_ */
diff --git a/arch/x86/lib/i8254.c b/arch/x86/lib/i8254.c
index 1f1012488c..dac81101f0 100644
--- a/arch/x86/lib/i8254.c
+++ b/arch/x86/lib/i8254.c
@@ -8,8 +8,21 @@
#include <asm/io.h>
#include <asm/i8254.h>
-#define TIMER1_VALUE 18 /* 15.6us */
-#define TIMER2_VALUE 0x0a8e /* 440Hz */
+#define TIMER1_VALUE 18 /* 15.6us */
+#define BEEP_FREQUENCY_HZ 440
+#define PPC_PORTB 0x61
+#define PORTB_BEEP_ENABLE 0x3
+#define PIT_HZ 1193180L
+
+static void i8254_set_beep_freq(uint frequency_hz)
+{
+ uint countdown;
+
+ countdown = PIT_HZ / frequency_hz;
+
+ outb(countdown & 0xff, PIT_BASE + PIT_T2);
+ outb((countdown >> 8) & 0xff, PIT_BASE + PIT_T2);
+}
int i8254_init(void)
{
@@ -29,8 +42,23 @@ int i8254_init(void)
*/
outb(PIT_CMD_CTR2 | PIT_CMD_BOTH | PIT_CMD_MODE3,
PIT_BASE + PIT_COMMAND);
- outb(TIMER2_VALUE & 0xff, PIT_BASE + PIT_T2);
- outb(TIMER2_VALUE >> 8, PIT_BASE + PIT_T2);
+ i8254_set_beep_freq(BEEP_FREQUENCY_HZ);
+
+ return 0;
+}
+
+int i8254_enable_beep(uint frequency_hz)
+{
+ if (!frequency_hz)
+ return -EINVAL;
+
+ i8254_set_beep_freq(frequency_hz);
+ setio_8(PPC_PORTB, PORTB_BEEP_ENABLE);
return 0;
}
+
+void i8254_disable_beep(void)
+{
+ clrio_8(PPC_PORTB, PORTB_BEEP_ENABLE);
+}
--
2.20.1.321.g9e740568ce-goog
More information about the U-Boot
mailing list