
Hi Simon,
On Tue, Jan 22, 2019 at 9:14 AM Simon Glass sjg@chromium.org wrote:
Adjust the code to allow beeping at different frequencies, using a calculated value for timer 2.
Signed-off-by: Simon Glass sjg@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
What does PPC mean? According to https://wiki.osdev.org/Non_Maskable_Interrupt, it is System Control Port.
+#define PORTB_BEEP_ENABLE 0x3 +#define PIT_HZ 1193180L
There is PIT_TICK_RATE in i8254.h already.
+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);
+}
Regards, Bin