diff options
Diffstat (limited to '')
-rw-r--r-- | include/grub/speaker.h | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/include/grub/speaker.h b/include/grub/speaker.h new file mode 100644 index 0000000..a076fcf --- /dev/null +++ b/include/grub/speaker.h @@ -0,0 +1,47 @@ +#ifndef GRUB_SPEAKER_HEADER +#define GRUB_SPEAKER_HEADER 1 + +#include <grub/cpu/io.h> +#include <grub/i386/pit.h> + +/* The frequency of the PIT clock. */ +#define GRUB_SPEAKER_PIT_FREQUENCY 0x1234dd + +static inline void +grub_speaker_beep_off (void) +{ + unsigned char status; + + status = grub_inb (GRUB_PIT_SPEAKER_PORT); + grub_outb (status & ~(GRUB_PIT_SPK_TMR2 | GRUB_PIT_SPK_DATA), + GRUB_PIT_SPEAKER_PORT); +} + +static inline void +grub_speaker_beep_on (grub_uint16_t pitch) +{ + unsigned char status; + unsigned int counter; + + if (pitch < 20) + pitch = 20; + else if (pitch > 20000) + pitch = 20000; + + counter = GRUB_SPEAKER_PIT_FREQUENCY / pitch; + + /* Program timer 2. */ + grub_outb (GRUB_PIT_CTRL_SELECT_2 + | GRUB_PIT_CTRL_READLOAD_WORD + | GRUB_PIT_CTRL_SQUAREWAVE_GEN + | GRUB_PIT_CTRL_COUNT_BINARY, GRUB_PIT_CTRL); + grub_outb (counter & 0xff, GRUB_PIT_COUNTER_2); /* LSB */ + grub_outb ((counter >> 8) & 0xff, GRUB_PIT_COUNTER_2); /* MSB */ + + /* Start speaker. */ + status = grub_inb (GRUB_PIT_SPEAKER_PORT); + grub_outb (status | GRUB_PIT_SPK_TMR2 | GRUB_PIT_SPK_DATA, + GRUB_PIT_SPEAKER_PORT); +} + +#endif |