From 23b79483554f0a5bbd5e7212a21c8d780a158d3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20=C5=BBygowski?= Date: Tue, 4 Oct 2022 11:31:12 +0200 Subject: [PATCH] pc80/i8254: Add speaker beep function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some platforms have an onboard speaker which could be used as an indicator of successful boot or critical error, e.g. in die_notify function. The function assumes that SPKR GPIO is properly configured by the platform code. Signed-off-by: Michał Żygowski Change-Id: I8189b3462bb5140af352fa786db3a6a2a45076f2 Reviewed-on: https://review.coreboot.org/c/coreboot/+/68100 Tested-by: build bot (Jenkins) Reviewed-by: Krystian Hebel --- src/drivers/pc80/pc/i8254.c | 22 ++++++++++++++++++++++ src/include/pc80/i8254.h | 1 + 2 files changed, 23 insertions(+) diff --git a/src/drivers/pc80/pc/i8254.c b/src/drivers/pc80/pc/i8254.c index 914c9aed9c..e83f00e00f 100644 --- a/src/drivers/pc80/pc/i8254.c +++ b/src/drivers/pc80/pc/i8254.c @@ -3,6 +3,7 @@ #include #include #include +#include #include /* Initialize i8254 timers */ @@ -110,3 +111,24 @@ unsigned long tsc_freq_mhz(void) return timer_tsc; } #endif + +void beep(unsigned int frequency_hz, unsigned int duration_msec) +{ + unsigned int count = CLOCK_TICK_RATE / frequency_hz; + + /* Set command for counter 2, 2 byte write, mode 3 */ + outb(TIMER2_SEL | WORD_ACCESS | MODE3, TIMER_MODE_PORT); + + /* Select desired Hz */ + outb(count & 0xff, TIMER2_PORT); + outb((count >> 8) & 0xff, TIMER2_PORT); + + /* Switch on the speaker */ + outb(inb(PPC_PORTB) | (PPCB_T2GATE | PPCB_SPKR), PPC_PORTB); + + /* Block for specified milliseconds */ + mdelay(duration_msec); + + /* Switch off the speaker */ + outb(inb(PPC_PORTB) & ~(PPCB_T2GATE | PPCB_SPKR), PPC_PORTB); +} diff --git a/src/include/pc80/i8254.h b/src/include/pc80/i8254.h index a9c0baee4f..b1edf686df 100644 --- a/src/include/pc80/i8254.h +++ b/src/include/pc80/i8254.h @@ -43,5 +43,6 @@ void setup_i8254(void); unsigned long calibrate_tsc_with_pit(void); +void beep(unsigned int frequency_hz, unsigned int duration_msec); #endif /* PC80_I8254_H */