[U-Boot] [PATCH 24/33] sound: x86: Add beeping support in i8254
Bin Meng
bmeng.cn at gmail.com
Wed Feb 13 09:39:25 UTC 2019
Hi Simon,
On Tue, Jan 22, 2019 at 9:14 AM Simon Glass <sjg at 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 at 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
More information about the U-Boot
mailing list