pc80/i8254: Add speaker beep function

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 <michal.zygowski@3mdeb.com>
Change-Id: I8189b3462bb5140af352fa786db3a6a2a45076f2
Reviewed-on: https://review.coreboot.org/c/coreboot/+/68100
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Krystian Hebel <krystian.hebel@3mdeb.com>
This commit is contained in:
Michał Żygowski 2022-10-04 11:31:12 +02:00 committed by Felix Held
parent 53ee1bba72
commit 23b7948355
2 changed files with 23 additions and 0 deletions

View File

@ -3,6 +3,7 @@
#include <arch/io.h>
#include <commonlib/helpers.h>
#include <cpu/x86/tsc.h>
#include <delay.h>
#include <pc80/i8254.h>
/* 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);
}

View File

@ -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 */