[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