Hi Simon, On Tue, Jan 22, 2019 at 9:14 AM Simon Glass <s...@chromium.org> wrote: > > Adjust the code to allow beeping at different frequencies, using a > calculated value for timer 2. > > Signed-off-by: Simon Glass <s...@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 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot