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:
parent
53ee1bba72
commit
23b7948355
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue